protected override void PreSweep(ContextRing ring) { var teamMode = Robot.HookComputer.Hook.TeamMode; DangerousBullets = Robot.SensorBullets.VisibleBullets .Where(b => b.Group.Owner != Robot.FleetID) .Where(b => !teamMode || b.Group.Color != Robot.Color) .ToList(); Projections = DangerousBullets.Select(b => b.ProjectNew(Robot.GameTime + LookAheadMS).Position).ToList(); PhantomProjections = new List <Vector2>(); var muchFleets = Robot.SensorFleets.Others .Select(f => new { Fleet = f, Distance = Vector2.Distance(Robot.Position, f.Center) }) .Where(p => MathF.Abs(p.Fleet.Center.X - Robot.Position.X) <= ViewportCrop.X && MathF.Abs(p.Fleet.Center.Y - Robot.Position.Y) <= ViewportCrop.Y) .Where(p => !Robot.HookComputer.Hook.TeamMode || p.Fleet.Color != Robot.Color); foreach (var flet in muchFleets) { // Projections.Append(RoboMath.ProjectClosest( Robot.HookComputer,flet.Fleet.Center,Robot.Position,LookAheadMS,flet.Fleet.Ships.Count())); foreach (var ship in flet.Fleet.Ships) { PhantomProjections.Append(RoboMath.ProjectClosest(Robot.HookComputer, ship.Position, Robot.Position, LookAheadMS, flet.Fleet.Ships.Count())); } } ConsideredPoints = new List <Vector2>(); }
protected override float ScoreAngle(float angle, Vector2 position, Vector2 momentum) { var vectorToPoint = Robot.VectorToAbsolutePoint(TargetPoint); var angleToPoint = MathF.Atan2(vectorToPoint.Y, vectorToPoint.X); var difference = RoboMath.CalculateDifferenceBetweenAngles(angle, angleToPoint); return(-MathF.Abs(difference)); }
protected override float ScoreAngle(float angle, Vector2 position, Vector2 momentum) { if (Active && AverageAngle != null) { return(-Math.Abs(RoboMath.CalculateDifferenceBetweenAngles(AverageAngle.Value, angle))); } return(0); }
public ContextRing Behave(int steps) { if (this.Robot.GameTime > SleepUntil) { //Console.WriteLine("Processing"); var ring = new ContextRing(steps); this.PreSweep(ring); if (Robot?.SensorFleets?.MyFleet?.Ships != null) { for (var i = 0; i < steps; i++) { var momentum = Robot.SensorFleets.MyFleet.Momentum; var position = RoboMath.ShipThrustProjection(Robot.HookComputer, Robot.Position, ref momentum, Robot.SensorFleets.MyFleet.Ships.Count, ring.Angle(i), LookAheadMS ); var momentumBoost = momentum / momentum.Length() * Robot.HookComputer.Hook.BoostThrust; var positionBoost = RoboMath.ShipThrustProjection(Robot.HookComputer, position, ref momentumBoost, Robot.SensorFleets.MyFleet.Ships.Count, ring.Angle(i), Math.Min(Robot.HookComputer.Hook.BoostDuration, LookAheadMS) ); ring.Weights[i] = ScoreAngle(ring.Angle(i), position, momentum); ring.WeightsBoost[i] = ScoreAngle(ring.Angle(i), positionBoost, momentumBoost); } } ring.RingWeight = BehaviorWeight; this.PostSweep(ring); ring.Name = this.GetType().Name; LastRing = ring; if (Cycle > 0) { Sleep(Cycle); } return(ring); } else { //Console.WriteLine("Waiting"); return(new ContextRing(LastRing)); } }
protected float ScoreAngleByTargetPoint(Vector2 target, float angle, Vector2 position, Vector2 momentum) { if (Active) { var vectorToPoint = Robot.VectorToAbsolutePoint(target); var angleToPoint = MathF.Atan2(vectorToPoint.Y, vectorToPoint.X); var difference = RoboMath.CalculateDifferenceBetweenAngles(angle, angleToPoint); return(-MathF.Abs(difference)); } return(0); }
protected override float ScoreAngle(float angle, Vector2 position, Vector2 momentum) { var difference = RoboMath.CalculateDifferenceBetweenAngles(angle, TargetAngle); if (MaximumAngle > 0 && difference > MaximumAngle) { return(-10000000); } else { return(-MathF.Abs(difference) * Scale); } }
private float CalculateIntercept(Fleet fleet, Vector2 position, Vector2 momentum, int projectedIntoFutureMS = 0) { var myFleet = this.Robot.SensorFleets.MyFleet; var projectedFleetCenter = fleet.Center + fleet.Momentum * projectedIntoFutureMS; var interceptPoint = RoboMath.FiringIntercept(this.Robot.HookComputer, projectedFleetCenter, position, momentum, myFleet.Ships.Count); var toTarget = interceptPoint - fleet.Center; return(MathF.Atan2(toTarget.Y, toTarget.X)); }
protected override float ScoreAngle(float angle, Vector2 position, Vector2 momentum) { float accumulator = 0; if (FleetsOfConcern != null) { foreach (var fleet in FleetsOfConcern) { var original = FiringInterceptAngles[fleet]; var newAngle = CalculateIntercept(fleet, position, momentum, LookAheadMS); if (!float.IsNaN(original) && !float.IsNaN(newAngle)) { accumulator += MathF.Abs(RoboMath.CalculateDifferenceBetweenAngles(newAngle, original)); } } } return(accumulator); }