private static Vehicle GetNukeGunner(this IVehicleFormation formation, Unit target, IEnumerable <Vehicle> myVehicles, World world, Game game) { return(myVehicles .Where(v => formation.VehicleRegistry.GetVision(v.Id, world, game) >= v.GetDistanceTo(target)) .OrderByDescending(v => v.Durability) .FirstOrDefault()); }
public static bool TryNuke(this IVehicleFormation formation, VehiclesGroup myArmy, IReadOnlyCollection <Vehicle> myVehicles, IReadOnlyList <Vehicle> enemyVehicles, Player me, Game game, World world, IList <Command> commands) { if (me.RemainingNuclearStrikeCooldownTicks != 0) { return(false); } if (!enemyVehicles.Any()) { return(false); } if (myArmy.Center.GetDistanceTo(enemyVehicles.GetCenterPoint()) > 4 * game.TacticalNuclearStrikeRadius) { return(false); } var nukeTarget = GetNukeTarget(enemyVehicles, myVehicles, game); if (nukeTarget == null) { return(false); } var nukeGunner = formation.GetNukeGunner(nukeTarget, myVehicles, world, game); if (nukeGunner == null) { return(false); } myArmy .Nuke(nukeGunner.Id, nukeTarget); commands.Add(formation.CommandManager.PeekLastCommand(formation.Id)); myArmy .Select(formation.Id) .Stop(); return(true); }
public static void PreventNuke(this IVehicleFormation formation, VehiclesGroup myArmy, World world, Game game, IList <Command> commands) { var opponentPlayer = world.GetOpponentPlayer(); myArmy .Select(formation.Id) .Stop() .SelectArea( opponentPlayer.NextNuclearStrikeX - game.TacticalNuclearStrikeRadius, opponentPlayer.NextNuclearStrikeY - game.TacticalNuclearStrikeRadius, opponentPlayer.NextNuclearStrikeX + game.TacticalNuclearStrikeRadius, opponentPlayer.NextNuclearStrikeY + game.TacticalNuclearStrikeRadius, true ) .Scale( opponentPlayer.NextNuclearStrikeX, opponentPlayer.NextNuclearStrikeY, 10.0, tick => tick - world.TickIndex > game.TacticalNuclearStrikeDelay) .Scale(opponentPlayer.NextNuclearStrikeX, opponentPlayer.NextNuclearStrikeY, 0.1); commands.Add(formation.CommandManager.PeekLastCommand(formation.Id)); }