Пример #1
0
        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>();
        }
Пример #2
0
        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));
        }
Пример #3
0
        protected override float ScoreAngle(float angle, Vector2 position, Vector2 momentum)
        {
            if (Active && AverageAngle != null)
            {
                return(-Math.Abs(RoboMath.CalculateDifferenceBetweenAngles(AverageAngle.Value, angle)));
            }

            return(0);
        }
Пример #4
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));
            }
        }
Пример #5
0
        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);
        }
Пример #6
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);
            }
        }
Пример #7
0
        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));
        }
Пример #8
0
        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);
        }