示例#1
0
        public static void moveToward(Unit unit, double x, double y, double range = 0, bool doDash = false)
        {
            if (unit.IsBusy || (unit.Moves == 0 && !doDash))
            {
                return;
            }

            if (sunCollision(unit, x, y))
            {
                var availableRoutePoints = AI.ROUTE_POINTS.Where(v => !sunCollision(unit, v.x, v.y)).ToArray();
                if (availableRoutePoints.Length == 0)
                {
                    Console.WriteLine("No available route points {0}", new Vector(unit.X, unit.Y));
                    return;
                }

                var bestRoutePoint = availableRoutePoints.MinByValue(v => Solver.distanceSquared(x - v.x, y - v.y));

                moveToward(unit, bestRoutePoint.x, bestRoutePoint.y, 0, doDash);
                if (hasMovesE2(unit))
                {
                    moveToward(unit, x, y, range, doDash);
                }
                return;
            }

            var dx       = x - unit.X;
            var dy       = y - unit.Y;
            var distance = Solver.distance(dx, dy);

            if (inRangeE2(distance, range))
            {
                return;
            }

            var netDistance = distance - range + ERROR2;

            if (unit.Moves > 0)
            {
                var magnitude = Math.Min(unit.Moves - ERROR, netDistance);
                unit.Move(unit.X + (dx / distance) * magnitude, unit.Y + (dy / distance) * magnitude);
            }

            if (doDash)
            {
                dx       = x - unit.X;
                dy       = y - unit.Y;
                distance = Solver.distance(dx, dy);
                if (inRangeE2(distance, range))
                {
                    return;
                }

                netDistance = distance - range + ERROR2;
                if (unit.canDash(netDistance))
                {
                    unit.Dash(unit.X + (dx / distance) * netDistance, unit.Y + (dy / distance) * netDistance);
                }
            }
        }
示例#2
0
 public void EvasiveMineuvers()
 {
     foreach (var unit in AI.PLAYER.Units)
     {
         if (AI.OPPONENT.Units.Any(u => u.Job.Damage > 0 && u.distance(unit) < 100) || AI.OPPONENT.Projectiles.Any(p => Solver.distance(p.X - unit.X, p.Y - unit.Y) < 100))
         {
             var randV = new Vector(rand.NextDouble() * AI.GAME.SizeX, rand.NextDouble() * AI.GAME.SizeY);
             Solver.moveToward(unit, randV.x, randV.y);
         }
     }
 }
示例#3
0
 public static int dashCost(this Unit unit, double x, double y)
 {
     return(unit.dashCost(Solver.distance(x - unit.X, y - unit.Y)));
 }
示例#4
0
        public static bool canMoveAndDash(this Unit unit, double x, double y)
        {
            var distance = Solver.distance(x - unit.X, y - unit.Y);

            return(unit.Energy > unit.dashCost(distance - unit.Moves - Solver.ERROR2));
        }
示例#5
0
 public static double distance(this Body body, Unit unit)
 {
     return(Solver.distance(body.X - unit.X, body.Y - unit.Y));
 }
示例#6
0
 public static double distance(this Body body, Body body2)
 {
     return(Solver.distance(body.X - body2.X, body.Y - body2.Y));
 }
示例#7
0
 public static double distance(this Unit unit, Unit unit2)
 {
     return(Solver.distance(unit.X - unit2.X, unit.Y - unit2.Y));
 }
示例#8
0
 public static double distance(this Unit unit, Body body)
 {
     return(Solver.distance(unit.X - body.X, unit.Y - body.Y));
 }
示例#9
0
 public double length()
 {
     return(Solver.distance(x, y));
 }