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); } } }
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); } } }
public static int dashCost(this Unit unit, double x, double y) { return(unit.dashCost(Solver.distance(x - unit.X, y - unit.Y))); }
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)); }
public static double distance(this Body body, Unit unit) { return(Solver.distance(body.X - unit.X, body.Y - unit.Y)); }
public static double distance(this Body body, Body body2) { return(Solver.distance(body.X - body2.X, body.Y - body2.Y)); }
public static double distance(this Unit unit, Unit unit2) { return(Solver.distance(unit.X - unit2.X, unit.Y - unit2.Y)); }
public static double distance(this Unit unit, Body body) { return(Solver.distance(unit.X - body.X, unit.Y - body.Y)); }
public double length() { return(Solver.distance(x, y)); }