public override void ExecuteCommand() { Pirate protectFrom = Protect(); //GameSettings.Game.Debug("protectFrom = "+protectFrom); GameSettings.Game.Debug("PushRange in Backup: " + Pirate.PushRange); if (!Push()) { if (protectFrom != null) { if (protectFrom.Distance(pirate) > 1300 || (GameSettings.Game.GetMyMotherships().Length == 0 && GameSettings.Game.GetMyCapsules().Length == 0 && GameSettings.Game.GetAllMyPirates().Length == 1 && GameSettings.Game.GetAllEnemyPirates().Length == 2)) { Pirate.Sail(DefendAt().GetLocation()); } else if (protectFrom.Distance(pirate) < 1300) { GameSettings.Game.Debug("Backup Sail Towards Pirate ==> " + protectFrom); Pirate.Sail(protectFrom); //Pirate.Sail(DefendAt().GetLocation()); } } else { Pirate.Sail(DefendAt().GetLocation()); } } }
private bool CanCatchUpAndPush(Pirate pirate, Pirate destinationPirate, Location destination) { Location intercept = Interception(destinationPirate.Location, destination, pirate.Location); int steps = pirate.Distance(intercept) / pirate.MaxSpeed; return((steps < pirate.PushReloadTurns && pirate.Distance(intercept) < pirate.Distance(destination)) || pirate.CanPush(destinationPirate)); }
public bool WillISurviveIfAstroidGetsPushedThere(Pirate pusher, Asteroid asteroid, Location there) { Location AstroidLocationAtEndOfPush = asteroid.Location.Towards(there, pusher.PushRange); GameSettings.Game.Debug("distance of pusher from asteroid ==> " + pusher.Distance(AstroidLocationAtEndOfPush) + " Asteroid size ==> " + asteroid.Size); if (pusher.Distance(AstroidLocationAtEndOfPush) <= asteroid.Size) { return(false); } return(true); }
public Aircraft FindClosestEnemy(bool prioritizeLowestHP = false, bool prioritizeShips = false) { Aircraft closest = null; int minDistance = 100000; foreach (Aircraft craft in _game.GetEnemyLivingAircrafts()) { int dis = _pirate.Distance(craft); if (minDistance > dis) { closest = craft; minDistance = dis; } else if (minDistance == dis) { if (closest != null) { if (prioritizeShips && craft.GetType() == typeof(Pirate)) { // Prioritize this craft } else if (closest.CurrentHealth > craft.CurrentHealth && prioritizeLowestHP) { } } } } return(closest); }
public bool TryPushMyCapsule(Pirate myPirateWithCapsule, Pirate pusherPirate) { if (!pusherPirate.CanPush(myPirateWithCapsule) || myPiratesWithCapsulePushes[myPirateWithCapsule] == myPirateWithCapsule.NumPushesForCapsuleLoss - 1) { return(false); } var destination = GetMyBestMothershipThroughWormholes(myPirateWithCapsule); var bestWormhole = GetBestWormhole(myPirateWithCapsule, destination.Location); Location locationOfPush = null; if (bestWormhole != null) { var distance = DistanceThroughWormhole(myPirateWithCapsule.Location, destination, bestWormhole, game.GetActiveWormholes().Where(wormhole => wormhole != bestWormhole), 0, myPirateWithCapsule.MaxSpeed); locationOfPush = (distance > myPirateWithCapsule.Distance(destination)) ? destination.Location : bestWormhole.Location; } else { locationOfPush = destination.Location; } if (!IsWorthPushing(myPirateWithCapsule, pusherPirate)) { return(false); } availablePirates.Remove(pusherPirate); myPiratesWithCapsulePushes[myPirateWithCapsule]++; pusherPirate.Push( myPirateWithCapsule, game.GetMyMotherships().OrderBy(mothership => mothership.Distance(myPirateWithCapsule)) .FirstOrDefault()); return(true); }
public bool TryPushInterceptedEnemyCapsule(Pirate pirate, Pirate capsuleHolder) { var bestMothership = game.GetEnemyMotherships().OrderBy(mothership => mothership.Distance(capsuleHolder)).FirstOrDefault(); if (pirate.CanPush(capsuleHolder)) { // Check how much other pirates can push it. var numOfPushers = NumOfPushesAvailable(capsuleHolder); // Check if we can either make the pirate lose his capsule or get pushed outside the border. var pushesToBorder = capsuleHolder.Distance(GetClosestToBorder(capsuleHolder.Location)) / pirate.PushDistance; if ((numOfPushers >= pushesToBorder && enemyCapsulesPushes[capsuleHolder.Capsule] < pushesToBorder) || (numOfPushers >= capsuleHolder.NumPushesForCapsuleLoss && enemyCapsulesPushes[capsuleHolder.Capsule] < capsuleHolder.NumPushesForCapsuleLoss)) { // Push the pirate towards the border! pirate.Push(capsuleHolder, GetClosestToBorder(capsuleHolder.Location)); enemyCapsulesPushes[capsuleHolder.Capsule]++; return(true); } } else if (capsuleHolder.InRange(pirate, pirate.PushRange * 2) && pirate.InRange(bestMothership, (int)(game.PushDistance * 2))) { // Send the pirate towards the capsule where it can push. if (pirateDestinations.ContainsKey(pirate)) { pirateDestinations[pirate] = capsuleHolder.Location.Towards(pirate, (int)(pirate.PushRange * 0.9)); } else { pirateDestinations.Add(pirate, capsuleHolder.Location.Towards(pirate, (int)(pirate.PushRange * 0.9))); } return(true); } return(false); }
public Mothership GetBestMothershipThroughWormholes(Pirate pirate) { var mothershipWormholes = new Dictionary <Mothership, int>(); Mothership bestMothership = null; int distance = int.MaxValue; foreach (var mothership in game.GetEnemyMotherships()) { var distances = new List <int>(); foreach (var wormhole in game.GetAllWormholes().Where(wormhole => wormhole.TurnsToReactivate < pirate.Steps(mothership) / 4)) { var distanceThroughCurrent = DistanceThroughWormhole(pirate.Location, mothership.Location, wormhole, game.GetAllWormholes().Where(hole => hole.TurnsToReactivate < pirate.Steps(mothership) / 4)); distances.Add(distanceThroughCurrent); } var normalDistance = pirate.Distance(mothership); if (distances.Any() && distances.Min() < distance) { bestMothership = mothership; distance = distances.Min(); } if (distances.Any() && normalDistance < distance) { bestMothership = mothership; distance = normalDistance; } } if (bestMothership == null) { bestMothership = game.GetEnemyMotherships().OrderBy(mothership => pirate.Steps(mothership) / (int)((double)mothership.ValueMultiplier).Sqrt()).FirstOrDefault(); } return(bestMothership); }
public MapObject GetBestSailOption(Pirate pirate, MapObject destination) { MapObject best = pirate; int col = 0, row = 0; for (row = pirate.GetLocation().Row - pirate.MaxSpeed; row < pirate.GetLocation().Row + pirate.MaxSpeed; row += 5) { for (col = pirate.GetLocation().Col - pirate.MaxSpeed; col < pirate.GetLocation().Col + pirate.MaxSpeed; col += 5) { Location current = new Location(row, col); if (!current.InMap()) { continue; } if (current.Distance(destination) < pirate.Distance(destination) && current.Distance(destination) >= pirate.Distance(destination) - pirate.MaxSpeed && !IsInRange(current) && !IsHittingAsteroid(current)) { if ((best != destination && best.Distance(destination) > current.Distance(destination)) || (best == destination)) { best = current; } } } } var ClosestPiratesToDestination = game.GetEnemyLivingPirates().Concat(game.GetMyLivingPirates()).OrderBy(allpirate => allpirate.Distance(destination)).ToList(); int count = 0; foreach (Pirate ClosestPirate in ClosestPiratesToDestination) { count++; } return(best); }
/// <summary> /// Checks if the enemy pirate is close enough to the border to kill him. /// Returns the location that if you push it towards it, the pirate will die or null if you can't kill it. /// </summary> /// <param name="enemyPirate">The enemy pirate to be checked.</param> /// <param name="range">The range that will be checked if you can throw it</param> /// <returns>Returns the location that if you push it towards it, the pirate will die or null if you can't kill it.</returns> public static Location GetCloseEnoughToBorder(Pirate enemyPirate, int range) { GameSettings.game.Debug("Range is: " + range); Location up = new Location(0, enemyPirate.Location.Col); Location right = new Location(enemyPirate.Location.Row, GameSettings.game.Cols); Location left = new Location(enemyPirate.Location.Row, 0); Location down = new Location(GameSettings.game.Rows, enemyPirate.Location.Col); int upDistance = enemyPirate.Distance(up); int rightDistance = enemyPirate.Distance(right); int leftDistance = enemyPirate.Distance(left); int downDistance = enemyPirate.Distance(down); GameSettings.game.Debug("Up Distance = " + upDistance + ", right distance = " + rightDistance + ", left distance = " + leftDistance + ", down distance " + downDistance); if (upDistance < rightDistance && upDistance < leftDistance && upDistance < downDistance) { if (upDistance < range) { return(up); } } else if (rightDistance < upDistance && rightDistance < leftDistance && rightDistance < downDistance) { if (rightDistance < range) { return(right); } } else if (leftDistance < upDistance && leftDistance < rightDistance && leftDistance < downDistance) { if (leftDistance < range) { return(down); } } else if (downDistance < upDistance && downDistance < rightDistance && downDistance < leftDistance) { if (downDistance < range) { return(left); } } //Returns null if not close enough to a border return(null); }
public bool IsWorthPushing(Pirate pirate, Location locationOfPush, Location destination) { int count = game.GetEnemyLivingPirates() .Where(enemy => enemy.HasCapsule() && pirate.Distance(destination) < enemy.Distance( game.GetEnemyMotherships().OrderBy(mothership => mothership.Distance(enemy)).FirstOrDefault())).ToList().Count; if (count < (game.GetEnemyLivingPirates() .Where(enemy => enemy.HasCapsule() && locationOfPush.Distance(destination) < enemy.Distance( game.GetEnemyMotherships().OrderBy(mothership => mothership.Distance(enemy)).FirstOrDefault())).ToList().Count)) { return(true); } return(false); }
public bool TryPushEnemyCapsuleDefensively(Pirate pirate, Pirate capsuleHolder) { var bestMothership = game.GetEnemyMotherships().OrderBy(mothership => mothership.Distance(capsuleHolder)).FirstOrDefault();; if (pirate.CanPush(capsuleHolder)) { // Check how much other pirates can push it. var numOfPushers = NumOfPushesAvailable(capsuleHolder); // Check if we can either make the pirate lose his capsule or get pushed outside the border. var pushesToBorder = capsuleHolder.Distance(GetClosestToBorder(capsuleHolder.Location)) / pirate.PushDistance; if ((numOfPushers >= pushesToBorder && enemyCapsulesPushes[capsuleHolder.Capsule] < pushesToBorder) || (numOfPushers >= capsuleHolder.NumPushesForCapsuleLoss && enemyCapsulesPushes[capsuleHolder.Capsule] < capsuleHolder.NumPushesForCapsuleLoss)) { // Push the pirate towards the border! pirate.Push(capsuleHolder, capsuleHolder.Location.Towards(capsuleHolder.Capsule.InitialLocation, -numOfPushers * pirate.PushDistance)); enemyCapsulesPushes[capsuleHolder.Capsule]++; return(true); } } return(false); }
public void PopulateEnemyTargets(List <Pirate> enemys, List <BaseAttacker> participants) { List <BodyGuard> guardians = participants.OfType <BodyGuard>().ToList(); GameSettings.Game.Debug("BodyGuards are ==> " + guardians.Count); Carrier c = participants.OfType <Carrier>().ToList()[0]; GameSettings.Game.Debug("Carrier is ==> " + c); enemys = enemys.OrderBy(Pirate => Pirate.Distance(c.Pirate)).ToList(); foreach (BodyGuard BG in guardians) { if (BG.TargetEnemy == null) { if (enemys.Count > 0) { BG.TargetEnemy = enemys[0]; enemys.RemoveAt(0); } } } }
/// <summary> Tries to either avoid or push the asteroid </summary> /// <returns> A tuple with bool and the action string </returns> protected static Tuple <bool, string> InteractWithAsteroid(Pirate pirate, Location to) { var asteroids = Utils.AsteroidsByDistance(pirate.Location).Where(ass => ass.Direction.Add(ass.Location).Distance(pirate) <= game.PushDistance + pirate.MaxSpeed + ass.Size).ToList(); foreach (Asteroid asteroid in asteroids) { if (pirate.CanPush(asteroid) && !Main.asteroidsPushed.Contains(asteroid)) { var pushTuple = Utils.OptimalAsteroidPushLocation(pirate.PushDistance, asteroid); if (pirate.InRange(asteroid.Location.Add(asteroid.Direction), asteroid.Size + pirate.MaxSpeed)) { pirate.Push(asteroid, pushTuple.Item1); return(new Tuple <bool, string>(true, "Pushed asteroid in an emergency")); } if (pushTuple.Item2 > 0) { pirate.Push(asteroid, pushTuple.Item1); Main.asteroidsPushed.Add(asteroid); Main.didTurn.Add(pirate.Id); return(new Tuple <bool, string>(true, "Pushed asteroid to best location")); } } bool shouldAvoid = pirate.Distance(asteroid) < game.PushDistance + asteroid.Size; shouldAvoid = shouldAvoid && game.GetEnemyLivingPirates().Any(p => p.InRange(asteroid, p.PushDistance + p.MaxSpeed)); if (Utils.AsteroidIsMoving(asteroid) && (shouldAvoid || pirate.Location == to)) { pirate.Sail(SafestCloestLocation(pirate.Location, to, pirate)); Main.didTurn.Add(pirate.Id); return(new Tuple <bool, string>(true, "Avoiding asteroid")); } } return(new Tuple <bool, string>(false, "Did not run")); }
public void Assign(Pirate pirate, List <Mission> list) { return; if (!pirate.HasPaintball) { return; } var city = Globals.Game.GetNeutralCities().First(); int count = Globals.Game.GetEnemyLivingDrones().Count(x => x.InRange(city, 15)); if (count < 3) { return; } Resources a = new Resources(); a.AddPirate(pirate.Id); list.Add(new Mission(pirate.Id, (int)((200 - pirate.Distance(city)) / 200.0 * 800 * System.Math.Sqrt(count)), a, new MoveCommand(pirate, city.Location))); }
// Returns the best wormhole for the pirate to get to the destination through, or null if there are no good wormholes. private Wormhole GetBestWormhole(Pirate pirate, Location destination) { var wormholeDistances = new Dictionary <Wormhole, int>(); var wormholes = GetViableWormholes(pirate); foreach (var wormhole in wormholes) { // Assign the closest distance for the wormhole wormholeDistances.Add(wormhole, DistanceThroughWormhole(pirate.Location, destination, wormhole, wormholes, 0, pirate.MaxSpeed)); } // Get the minimum var bestWormhole = wormholeDistances.OrderBy(map => map.Value).FirstOrDefault(); if (bestWormhole.Key != null) { // Check the regular distance. var normalDistance = pirate.Distance(destination); if (bestWormhole.Value < normalDistance) { return(bestWormhole.Key); } } return(null); }
// public bool CapsuleHolderInDanger(Pirate pirate) // { // if (!pirate.HasCapsule()) return false; // var bestMothership = game.GetMyMotherships() // .OrderBy(mothership => mothership.Distance(pirate) / mothership.ValueMultiplier) // .FirstOrDefault(); // if (bestMothership != null) // { // if (game.GetEnemyLivingPirates() // .Where(enemy => enemy.InPushRange(pirate.Location.Towards(bestMothership, game.PirateMaxSpeed)) || enemy.InPushRange(pirate.Location.Towards(bestMothership, game.PirateMaxSpeed * 2))) // .Count() >= game.NumPushesForCapsuleLoss) // return true; // } // return false; // } public Wormhole GetBestWormhole(Location destination, Pirate pirate) { var wormholeDistances = new Dictionary <Wormhole, int>(); var wormholes = game.GetAllWormholes().Where(wormhole => wormhole.TurnsToReactivate < pirate.Steps(destination) / 4); foreach (var wormhole in wormholes) { // Assign the closest distance for the wormhole wormholeDistances.Add(wormhole, DistanceThroughWormhole(pirate.Location, destination, wormhole, wormholes)); } // Get the minimum var bestWormhole = wormholeDistances.OrderBy(map => map.Value).FirstOrDefault(); if (bestWormhole.Key != null) { // Check the regular distance. var normalDistance = pirate.Distance(destination); if (bestWormhole.Value < normalDistance) { return(bestWormhole.Key); } } return(null); }
override public int Cost(Chunk chunk) { var holesInChunk = Main.game.GetAllWormholes().Any(w => chunk.Distance(w) <= w.WormholeRange && pirate.Distance(w) / pirate.MaxSpeed + 2 <= w.TurnsToReactivate); if (holesInChunk) { if (pirate.HasCapsule() && Utils.PiratesWithTask(TaskType.BOOSTER).Any()) { return(100000); } if (chunk.Distance(goal) == Utils.DistanceWithWormhole(chunk.GetLocation(), goal, pirate.MaxSpeed)) { return(100000); } } return(0); }
/// <summary> /// Checks if the enemy pirate is close enough to the border to kill him. /// Returns the location that if you push it towards it, the pirate will die or null if you can't kill it. /// </summary> /// <param name="enemyPirate">The enemy pirate to be checked.</param> /// <param name="range">The range that will be checked if you can throw it</param> /// <returns>Returns the location that if you push it towards it, the pirate will die or null if you can't kill it.</returns> public static Location GetCloseEnoughToBorder(Pirate enemyPirate, int range) { Location up = new Location(0, enemyPirate.Location.Col); Location right = new Location(enemyPirate.Location.Row, GameSettings.game.Cols); Location left = new Location(enemyPirate.Location.Row, 0); Location down = new Location(GameSettings.game.Rows, enemyPirate.Location.Col); int upDistance = enemyPirate.Distance(up); int rightDistance = enemyPirate.Distance(right); int leftDistance = enemyPirate.Distance(left); int downDistance = enemyPirate.Distance(down); if (upDistance < rightDistance && upDistance < leftDistance && upDistance < downDistance) { if (upDistance < range) { return(up); } else if (rightDistance < upDistance && rightDistance < leftDistance && rightDistance < downDistance) { if (rightDistance < range) { return(right); } else if (leftDistance < upDistance && leftDistance < rightDistance && leftDistance < downDistance) { if (leftDistance < range) { return(down); } else if (downDistance < upDistance && downDistance < rightDistance && downDistance < leftDistance) { if (downDistance < range) { return(left); } } } } } //Returns null if not close enough to a border return(null); // Location center = new Location(game.Rows / 2, game.Cols / 2); // if (center.Col > enemyPirate.Location.Col && center.Row > enemyPirate.Location.Row) // { // int colDistance = enemyPirate.Distance(new Location(0, enemyPirate.Location.Col)); // int rowDistance = enemyPirate.Distance(new Location(enemyPirate.Location.Row, game.Cols)); // if (colDistance > rowDistance) // if (rowDistance <= range) // return new Location(0, enemyPirate.Location.Col); // else if (colDistance < range) // return new Location(enemyPirate.Location.Row, game.Cols); // return null; // } // else if (center.Col > enemyPirate.Location.Col && center.Row < enemyPirate.Location.Row) // { // int colDistance = enemyPirate.Distance(new Location(game.Cols, enemyPirate.Location.Row)); // int rowDistance = enemyPirate.Distance(new Location(enemyPirate.Location.Col, game.Rows)); // if (colDistance > rowDistance) // if (rowDistance <= range) // return new Location(game.Cols, enemyPirate.Location.Row); // else if (colDistance < range) // return new Location(enemyPirate.Location.Col, game.Rows); // return null; // } // else if (center.Col < enemyPirate.Location.Col && center.Row < enemyPirate.Location.Row) // { // int colDistance = enemyPirate.Distance(new Location(0, enemyPirate.Location.Col)); // int rowDistance = enemyPirate.Distance(new Location(enemyPirate.Location.Row, 0)); // if (colDistance > rowDistance) // if (rowDistance <= range) // return new Location(0, enemyPirate.Location.Col); // else if (colDistance < range) // return new Location(enemyPirate.Location.Row, 0); // return null; // } // else if (center.Col < enemyPirate.Location.Col && center.Row > enemyPirate.Location.Row) // { // int colDistance = enemyPirate.Distance(new Location(enemyPirate.Location.Row, 0)); // int rowDistance = enemyPirate.Distance(new Location(game.Rows, enemyPirate.Location.Col)); // if (colDistance > rowDistance) // if (rowDistance <= range) // return new Location(enemyPirate.Location.Row, 0); // else if (colDistance < range) // return new Location(game.Rows, enemyPirate.Location.Col); // return null; // } // return null; }
public override Location DefendAt() { Pirate enemyCarrier = null; if (GameSettings.Game.GetMyMotherships().Length == 0 && GameSettings.Game.GetMyCapsules().Length == 0 && GameSettings.Game.GetAllMyPirates().Length == 1 && GameSettings.Game.GetAllEnemyPirates().Length == 2) { Location loc = GameSettings.Game.GetEnemyMotherships()[0].GetLocation(); loc.Row -= 100; return(loc); } // GameSettings.Game.Debug("WhereToDefend " + WhereToDefend); if (WhereToDefend != null) { return(WhereToDefend); } //GameSettings.Game.Debug("Debugging DefendAt()"); Location guardLocation; List <Pirate> enemyCarriers = new List <Pirate>(); foreach (Pirate enemy in GameSettings.Game.GetEnemyLivingPirates()) { if (enemy.HasCapsule()) { enemyCarriers.Add(enemy); } } //Take care of a few citys or Ben will punch me! int scale = (int)(500 * 1.5); if (GameSettings.Game.GetEnemyMotherships().Length > 0) { enemyCarriers.OrderBy(pirate => Pirate.GetLocation().Distance(GameSettings.Game.GetEnemyMotherships()[0])); if (enemyCarriers.Count > 0) { enemyCarrier = enemyCarriers[0]; } if (enemyCarrier != null) { GameSettings.Game.Debug("enemyCarrier to face to: " + enemyCarrier); //guardLocation = GameSettings.Game.GetEnemyMotherships()[0].Location.Towards(enemyCarrier, scale - 450)scale - 650; guardLocation = GameSettings.Game.GetEnemyMotherships()[0].Location.Towards(enemyCarrier, scale - 650); GameSettings.Game.Debug("guardLocation Towards enemyCarrier" + guardLocation); return(guardLocation); } guardLocation = GameSettings.Game.GetEnemyMotherships()[0].Location.Towards(GameSettings.Game.GetEnemyCapsules()[0], scale - 600); //GameSettings.Game.Debug("Location from ProtectFromCarrier" + guardLocation); return(guardLocation); } bool canPushWormhole = true; foreach (Wormhole wormhole in GameSettings.Game.GetAllWormholes()) { if (wormhole.Distance(pirate) < 750) { if (GameSettings.Game.GetEnemyMotherships().Length > 0) { Mothership mothership = FieldAnalyzer.FindClosestMotherShip(pirate); enemyCarrier = FieldAnalyzer.GetMostThreatningEnemyCarrier(mothership); if (enemyCarrier != null) { //Checks if the enemyPirate can come in more then 5 turns if (enemyCarrier.Distance(Pirate) > enemyCarrier.MaxSpeed * 8) { canPushWormhole = false; } if (canPushWormhole) { guardLocation = wormhole.GetLocation().Towards(this.Pirate, wormhole.WormholeRange); // guardLocation.Col += wormhole.WormholeRange; //GameSettings.Game.Debug("wormhole guardLocation = " + guardLocation); return(guardLocation); } } } } } return(WhereToDefend); }
override public string Preform() { if (!Utils.GetMyHolders().Any() || !game.GetMyCapsules().Any() || !game.GetAllMotherships().Any()) { if (Main.mines.Count > 0 && game.GetMyMotherships().Any()) { var sailLocation = Utils.GetMyHolders().OrderBy(h => h.Distance(pirate)).First().Location; return(Utils.GetPirateStatus(pirate, "Sailing to rendezvous point, " + Sailing.SafeSail(pirate, sailLocation))); } return(Utils.GetPirateStatus(pirate, "Is idle.")); } var holders = Utils.GetMyHolders().OrderBy(h => h.Distance(pirate)); var cloestHolder = holders.First(); foreach (Pirate holder in Utils.GetMyHolders().OrderBy(h => h.Distance(pirate))) { var nearestShip = Utils.OrderByDistance(game.GetMyMotherships().ToList(), holder.Location).First(); if (!pirate.CanPush(holder)) { var sailLocation = Utils.GetMyHolders().OrderBy(h => h.Distance(pirate)).First().Location; return(Utils.GetPirateStatus(pirate, "Sailing towards holder, " + Sailing.SafeSail(pirate, sailLocation))); } var threats = game.GetEnemyLivingPirates().Where(t => t.PushReloadTurns > 2 && t.Distance(nearestShip) < pirate.Distance(nearestShip) * 1.5).OrderBy(nearestShip.Distance); // Checks if the holder can be pushed directly onto the ship bool caseI = holder.Distance(nearestShip) - game.MothershipUnloadRange <= pirate.PushDistance + holder.MaxSpeed; bool caseII = false; if (threats.Any() && threats.First().Distance(nearestShip) > holder.Distance(nearestShip)) { caseII = holder.Distance(nearestShip) - threats.First().Distance(nearestShip) < pirate.PushRange; } var holderLocAfterPush = holder.GetLocation().Towards(nearestShip, pirate.PushDistance + holder.MaxSpeed / 2); bool caseIII_PI = threats.Any() && threats.First().Distance(nearestShip) < holder.Distance(nearestShip); bool caseIII_PII = threats.Any() && threats.First().PushRange < holderLocAfterPush.Distance(threats.First()); bool ImminentDeath = game.GetEnemyLivingPirates().Count(t => holder.InRange(t, holder.MaxSpeed + t.PushRange) && t.PushReloadTurns <= 1) >= holder.NumPushesForCapsuleLoss; if (ImminentDeath && !caseI && holder.MaxSpeed * 10 < holder.Distance(nearestShip)) { var safest = Sailing.SafestCloestLocation(holder.Location, nearestShip.Location, 2, true, pirate); pirate.Push(holder, safest); Main.piratesPushed.Add(holder); Main.didTurn.Add(pirate.Id); if (!Main.didTurn.Contains(holder.Id)) { holder.Push(pirate, safest); Main.piratesPushed.Add(pirate); Main.didTurn.Add(holder.Id); } return(Utils.GetPirateStatus(pirate, "Moved away from danger zone")); } bool caseIII = threats.Any() && caseIII_PI && caseIII_PII && ImminentDeath; game.Debug(caseI + " || " + caseII + " || " + caseIII + " +| IMD: " + ImminentDeath); if (caseI || caseIII) { if (Utils.GetMyHolders().Count() > 1) { var secondHolder = Utils.GetMyHolders().First(h => h.Id != holder.Id); if (!Main.didTurn.Contains(holder.Id) && holder.CanPush(secondHolder) && !Main.piratesPushed.Contains(secondHolder) && secondHolder.Distance(nearestShip) - nearestShip.UnloadRange < pirate.PushDistance + secondHolder.MaxSpeed) { holder.Push(secondHolder, nearestShip); Main.piratesPushed.Add(secondHolder); pirate.Push(holder, nearestShip); Main.piratesPushed.Add(holder); if (!Main.didTurn.Contains(secondHolder.Id) && holder.NumPushesForCapsuleLoss > 2 && secondHolder.CanPush(holder)) { secondHolder.Push(holder, nearestShip); Main.piratesPushed.Add(holder); } Main.didTurn.Add(holder.Id); Main.didTurn.Add(pirate.Id); return(Utils.GetPirateStatus(pirate, "Pushed holder to the motherShip while the holder boosted another holder")); } } if (!Main.didTurn.Contains(holder.Id)) { holder.Sail(nearestShip); Main.didTurn.Add(holder.Id); } pirate.Push(holder, nearestShip); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(holder); return(Utils.GetPirateStatus(pirate, "Pushed holder directly to ship")); } Main.holdersPaired.Add(holder); return(Utils.GetPirateStatus(pirate, "Sailing towards paired holder, " + Sailing.SafeSail(pirate, holder.Location))); } return("Did nothing"); }
public bool IsMostOptimalPath(Location location, Pirate pirate, Location destination) { return(pirate.Distance(location) > pirate.Distance(destination)); }
public override List <Pirate> PiratesPrioritization(List <Pirate> pirates) { List <Pirate> orderedPirates = pirates.OrderBy(Pirate => Pirate.Distance(GameSettings.Game.GetMyCapsules()[0].Location)).ToList(); return(orderedPirates); }
/// <summary> Tries to interact with a Wormhole. </summary> /// <returns> A tuple with a bool and the action string </returns> protected static Tuple <bool, string> InteractWithWormHole(Pirate pirate, Location goal) { if (!game.GetAllWormholes().Any() || !game.GetMyMotherships().Any() || !Main.mines.Any() || !game.GetEnemyMotherships().Any() || pirate.PushReloadTurns > 0) { return(new Tuple <bool, string>(false, "Did not interact with a wormhole")); } foreach (Wormhole wormhole in game.GetAllWormholes().Where(w => w.InRange(pirate, pirate.PushRange + pirate.MaxSpeed))) { if (Utils.DistanceWithWormhole(pirate.Location, goal, pirate.MaxSpeed) != pirate.Distance(goal)) { return(new Tuple <bool, string>(false, "Sailing into hole is faster")); } var cloestFriendlyMum = game.GetMyMotherships().OrderBy(wormhole.Distance).First(); var cloestFriendlyMine = Main.mines.OrderBy(wormhole.Distance).First(); bool closerToMum = wormhole.Distance(cloestFriendlyMum) < wormhole.Partner.Distance(cloestFriendlyMum); bool closerToMine = wormhole.Distance(cloestFriendlyMine) < wormhole.Partner.Distance(Main.mines.OrderBy(wormhole.Partner.Distance).First()); var pushLocation = cloestFriendlyMum.Location; if (closerToMine) { pushLocation = cloestFriendlyMine; } if (closerToMum || closerToMine) { if (pirate.CanPush(wormhole)) { pirate.Push(wormhole, pushLocation); Main.wormsPushed.Add(wormhole); } else { pirate.Sail(wormhole); } Main.didTurn.Add(pirate.Id); return(new Tuple <bool, string>(true, "Interacted with Wormhole")); } } return(new Tuple <bool, string>(false, "Did not interact with a wormhole")); }
public static int Steps(this Pirate pirate, MapObject mapObject) { return(pirate.Distance(mapObject) / pirate.MaxSpeed + 1); }
/// <summary> Sails to goal safely </summary> /// <returns> A tuple with bool and the action string </returns> public static string SafeSail(Pirate pirate, Location to) { if (Main.didTurn.Contains(pirate.Id)) { return("Already did turn"); } if (Utils.HasEnemyBomb(pirate)) { var bomb = game.__stickyBombs.Where(b => b.Owner == game.GetEnemy()).OrderBy(pirate.Distance).First(); if (bomb.Countdown < 2) { foreach (Pirate enemy in game.GetEnemyLivingPirates().Where(pirate.CanPush).SkipWhile(Main.piratesPushed.Contains).OrderBy(pirate.Distance)) { pirate.Push(enemy, pirate); Main.didTurn.Add(pirate.Id); return("Hugged an enemy to death"); } } foreach (Pirate enemy in game.GetEnemyLivingPirates().OrderBy(pirate.Distance)) { double turnsToArrive = pirate.Distance(enemy) / pirate.MaxSpeed; var shouldSail = (game.GetMyLivingPirates().Count(p => p.InRange(pirate, bomb.ExplosionRange)) - game.GetEnemyLivingPirates().Count(e => e.InRange(pirate, bomb.ExplosionRange))) <= 0; if (shouldSail) { pirate.Sail(enemy); Main.didTurn.Add(pirate.Id); return("Sailing to bomb enemy"); } } Main.didTurn.Add(pirate.Id); return("Stop!"); } var dangerPirates = game.GetMyLivingPirates().ToList(); dangerPirates.AddRange(game.GetEnemyLivingPirates().ToList()); dangerPirates = dangerPirates.Where(p => (Utils.HasEnemyBomb(p) || Utils.HasMyBomb(p)) && p.StickyBombs.First().Countdown <= 2 && pirate.CanPush(p)).ToList(); foreach (Pirate prt in dangerPirates) { pirate.Push(prt, Utils.OptimalBomberPushLocation(pirate, prt)); Main.didTurn.Add(pirate.Id); return("Pushed bomber away"); } var interactWithAsteroid = InteractWithAsteroid(pirate, to); if (interactWithAsteroid.Item1) { return(interactWithAsteroid.Item2); } if (!Utils.PiratesWithTask(TaskType.MOLE).Contains(pirate)) { var killEnemy = TryKill(pirate); if (killEnemy.Item1) { return(killEnemy.Item2); } } var enemys = game.GetEnemyLivingPirates().OrderBy(p => p.Distance(pirate)).ToList(); if (enemys.Any() && pirate.InStickBombRange(enemys.First()) && game.GetMyself().TurnsToStickyBomb == 0) { //pirate.StickBomb(enemys.First()); //Main.didTurn.Add(pirate.Id); //return "Stick bombed enemy holder"; } var interactWithWormHole = InteractWithWormHole(pirate, to); if (interactWithWormHole.Item1) { return(interactWithWormHole.Item2); } var objects = new List <MapObject>(); objects.AddRange(Utils.AsteroidsByDistance(pirate.Location).Where(ass => ass.Direction.Add(ass.Location).Distance(pirate) <= 4 * pirate.MaxSpeed + ass.Size)); objects.AddRange(game.GetActiveWormholes().Where(hole => hole.Distance(pirate.GetLocation()) <= 4 * Chunk.size)); objects.AddRange(game.GetAllStickyBombs().Where(bomb => bomb.Distance(pirate) < 1.5 * bomb.ExplosionRange + pirate.MaxSpeed)); objects = objects.OrderBy(obj => obj.Distance(pirate)).ToList(); if (!objects.Any()) { pirate.Sail(to); Main.didTurn.Add(pirate.Id); return("Sailing safely directly to goal i.e. " + Chunk.GetChunk(to)); } var traits = new List <Trait>() { new TraitRateByLazyAsteroid(game.HeavyPushDistance), new TraitRateByMovingAsteroid(game.HeavyPushDistance / 2 + game.PirateMaxSpeed * 3), new TraitWormhole(to, pirate), new TraitRateByStickyBomb() }; Path path = new Path(pirate.Location, to, traits); if (path.GetSailLocations().Count > 1) { pirate.Sail(path.Pop()); Main.didTurn.Add(pirate.Id); return(Chunk.GetChunk(to).ToString()); } pirate.Sail(to); Main.didTurn.Add(pirate.Id); return(Chunk.GetChunk(to).ToString()); }
override public string Preform() { if (game.GetEnemyCapsules().Count() == 0 || game.GetEnemyMotherships().Count() == 0) { return(Utils.GetPirateStatus(pirate, "No enemy capsules or ships")); } var nearestCapsule = Utils.OrderByDistance(game.GetEnemyCapsules().ToList(), pirate.Location).First(); var nearestShip = Utils.OrderByDistance(game.GetEnemyMotherships().ToList(), nearestCapsule.Location).First(); if (Main.didTurn.Contains(pirate.Id)) { return(Utils.GetPirateStatus(pirate, "Already did turn")); } if (Utils.HasEnemyBomb(pirate)) { return(Utils.GetPirateStatus(pirate, Sailing.SafeSail(pirate, new Location(0, 0)))); } var sortedEnemyHolders = Utils.EnemyHoldersByDistance(pirate.GetLocation()).Where(enemy => !Main.piratesPushed.Contains(enemy) && pirate.CanPush(enemy)); bool shouldGo = !sortedEnemyHolders.Any() || pirate.MaxSpeed * 4 + pirate.Distance(nearestShip) < sortedEnemyHolders.First().Distance(nearestShip); if (shouldGo) { foreach (Wormhole hole in game.GetAllWormholes().Where(h => h.Distance(nearestShip) < pirate.MaxSpeed * 10 && !Main.wormsPushed.Contains(h))) { var molesByDistance = Utils.PiratesWithTask(TaskType.MOLE).OrderBy(hole.Distance); bool closest = molesByDistance.First().Id == pirate.Id || (molesByDistance.Count() > 1 && molesByDistance.Take(2).Contains(pirate)); var eholdersbydistance = Utils.EnemyHoldersByDistance(nearestShip.GetLocation()); if (!pirate.CanPush(hole) && pirate.PushRange < pirate.Distance(hole) && closest) { var wormLoc = pirate.Location.Towards(hole, pirate.Distance(hole) - hole.WormholeRange); var assDanger = game.__livingAsteroids.Any(a => a.Location.Add(a.Direction).Distance(pirate) <= a.Size + pirate.MaxSpeed * 2); var bombDanger = game.__stickyBombs.Any(b => b.Distance(pirate) < b.ExplosionRange + pirate.MaxSpeed * 2); var wormPushLocation = pirate.Location.Towards(hole, pirate.Distance(hole) - pirate.PushRange); var caseI = pirate.Distance(wormPushLocation) / pirate.MaxSpeed >= pirate.PushReloadTurns; var caseII = true; if (eholdersbydistance.Any()) { caseII = hole.Distance(nearestShip) + pirate.MaxSpeed * 4 < eholdersbydistance.First().Distance(nearestShip); } if (!assDanger && !bombDanger && caseI && caseII) { pirate.Sail(wormLoc); Main.didTurn.Add(pirate.Id); return(Utils.GetPirateStatus(pirate, "Sailing out to worm hole ")); } if (caseI && caseII) { return(Utils.GetPirateStatus(pirate, "Safely sailing out to worm hole " + Sailing.SafeSail(pirate, wormLoc))); } } var enemyHolders = Utils.EnemyHoldersByDistance(pirate.GetLocation()).SkipWhile(Main.piratesPushed.Contains).OrderBy(hole.Distance); if (pirate.CanPush(hole) && hole.IsActive && enemyHolders.Any() && hole.Distance(nearestShip) < hole.Partner.Distance(nearestShip)) { foreach (Pirate enemyHolder in enemyHolders) { int cost = enemyHolder.Distance(hole) + enemyHolder.MaxSpeed / 2; if (cost < pirate.PushDistance) { pirate.Push(hole, pirate.Location.Towards(enemyHolder.Location, cost)); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(enemyHolder); Main.wormsPushed.Add(hole); return(Utils.GetPirateStatus(pirate, "Pushed hole on enemy")); } } } if (pirate.CanPush(hole) && Main.mines.Any()) { pirate.Push(hole, Main.mines.OrderBy(nearestShip.Distance).First()); Main.didTurn.Add(pirate.Id); Main.wormsPushed.Add(hole); return(Utils.GetPirateStatus(pirate, "Pushed hole away")); } } } foreach (Pirate enemyHolder in sortedEnemyHolders) { game.Debug("pirate can push holder: " + pirate.CanPush(enemyHolder)); var killLocation = Utils.NearestKillLocation(enemyHolder.Location); double maxDistance = ((double)killLocation.Item1 + enemyHolder.MaxSpeed / 2); var canKillAlone = maxDistance / pirate.PushDistance <= 1; if (canKillAlone) { pirate.Push(enemyHolder, killLocation.Item2); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(enemyHolder); return(Utils.GetPirateStatus(pirate, "Killed enemy holder")); } // Initialize variables var pushHelpers = game.GetMyLivingPirates().Where(h => h.CanPush(enemyHolder) && !Main.didTurn.Contains(h.Id)).OrderBy(h => h.PushDistance); var killHelpers = pushHelpers.Where(h => h.Id != pirate.Id && ((double)killLocation.Item1 + enemyHolder.MaxSpeed / 2) / ((double)h.PushDistance + pirate.PushDistance) <= 1); // If they can kill him if (killHelpers.Any()) { var partner = killHelpers.OrderByDescending(h => maxDistance / ((double)h.PushDistance + pirate.PushDistance) <= 1).First(); pirate.Push(enemyHolder, killLocation.Item2); partner.Push(enemyHolder, killLocation.Item2); Main.didTurn.AddRange(new List <int> { pirate.Id, partner.Id }); Main.piratesPushed.Add(enemyHolder); return(Utils.GetPirateStatus(pirate, "Couple killed enemy holder")); } // If they can make him drop his capsule but not kill him if (pushHelpers.Count() >= enemyHolder.NumPushesForCapsuleLoss) { var pushers = pushHelpers.Take(enemyHolder.NumPushesForCapsuleLoss).ToList(); var pushLocation = Utils.NearestKillLocation(enemyHolder.GetLocation()).Item2; if (Utils.NearestKillLocation(enemyHolder.GetLocation()).Item2.Distance(nearestCapsule) < nearestShip.Distance(nearestCapsule)) { pushLocation = nearestShip.GetLocation(); } pushers.ForEach(m => m.Push(enemyHolder, pushLocation)); Main.didTurn.AddRange(from p in pushers select p.Id); Main.piratesPushed.Add(enemyHolder); return(Utils.GetPirateStatus(pirate, enemyHolder.NumPushesForCapsuleLoss + " pirates droped the enemy capsule")); } // Boost enemy to closest dropers couple var myMoles = Utils.PiratesWithTask(TaskType.MOLE).ToList().Where(p => p.Id != pirate.Id && p.PushReloadTurns <= 1).OrderBy(p => p.Distance(nearestShip)).ToList(); var regularEnemyPirates = game.GetEnemyLivingPirates().Where(prt => !prt.HasCapsule()).ToList(); bool shouldUseBuddies = myMoles.Any() && pirate.PushRange + pirate.MaxSpeed / 2 < myMoles.OrderBy(pirate.Distance).First().Distance(pirate); bool enemyIsTerr = Utils.HasMyBomb(enemyHolder); if (regularEnemyPirates.Any() && myMoles.Count() >= 2 && shouldUseBuddies && !enemyIsTerr) { foreach (Pirate A in myMoles) { foreach (Pirate B in myMoles.Where(m => m.Id != A.Id)) { if (A.Distance(pirate) < A.PushRange * 1.5) { continue; } var centerLoc = Utils.Center(A.Location, B.Location); var pushLocation = pirate.GetLocation().Towards(centerLoc, pirate.PushDistance - enemyHolder.MaxSpeed / 2); bool checkI = pushLocation.Distance(A) <= A.PushRange && pushLocation.Distance(B) <= B.PushRange; bool checkII = enemyHolder.StateName == "normal"; // TODO add check if there is a booster close to the enemy pirate if (checkI && checkII) { pirate.Push(enemyHolder, centerLoc); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(enemyHolder); return(Utils.GetPirateStatus(pirate, "Pushed pirates towards buddies!")); } } } } } int radius = (game.PushRange + game.HeavyPushDistance) / 3; int coupleIndex = Utils.PiratesWithTask(TaskType.MOLE).OrderBy(nearestShip.Distance).ToList().IndexOf(pirate) / 2; if (coupleIndex > 0) { radius += game.HeavyPushDistance; } var loc = nearestShip.GetLocation().Towards(nearestCapsule, radius); foreach (Pirate enemyHolder in sortedEnemyHolders) { var CheckI = enemyHolder.Distance(nearestShip) < 2 * pirate.PushRange + pirate.Distance(nearestShip); var CheckII = pirate.PushReloadTurns <= (enemyHolder.Distance(nearestShip) - pirate.Distance(nearestShip)) / (2 * enemyHolder.MaxSpeed); var CheckIII = pirate.Distance(loc) < 2 * pirate.MaxSpeed; var CheckIV = game.GetMyLivingPirates().Count(p => p.Id != pirate.Id && p.GetLocation().Col == pirate.Location.Col && p.GetLocation().Row == pirate.Location.Row) >= 1; //var CheckV = Utils.PiratesWithTask(TaskType.MOLE).OrderBy(enemyHolder.Distance).First().Id == pirate.Id; //game.Debug(CheckI + " || " + CheckII + " || " + CheckIII + " || " + CheckIV + " || "/*+ CheckV + " || "*/); if (CheckI && CheckII && CheckIII && CheckIV /* && CheckV*/) { return(Utils.GetPirateStatus(pirate, "Sailing out to enemy holder " + Sailing.SafeSail(pirate, enemyHolder.GetLocation()))); } } return(Utils.GetPirateStatus(pirate, "Is sailing to position, " + Sailing.SafeSail(pirate, loc))); }
override public string Preform() { if (Main.didTurn.Contains(pirate.Id) || !game.GetMyMotherships().Any()) { return(Utils.GetPirateStatus(pirate, "Already did turn")); } if (!pirate.HasCapsule()) { turnCounter = 0; if (Main.capsulesTargetted.ContainsKey(pirate)) { var sailLocation = Main.capsulesTargetted[pirate].Location; return(Utils.GetPirateStatus(pirate, "Sailing to capsule " + Sailing.SafeSail(pirate, sailLocation))); } return(Utils.GetPirateStatus(pirate, "Is idle... ")); } var nearestShip = Utils.OrderByDistance(game.GetMyMotherships().ToList(), pirate.Location).First(); var threats = game.GetEnemyLivingPirates().ToList().Where(e => e.PushReloadTurns < 3 && e.Distance(nearestShip) < pirate.Distance(nearestShip)).OrderBy(nearestShip.Distance).ToList(); if (Utils.HasEnemyBomb(pirate)) { var suicideObj = Utils.NearestKillLocation(pirate.GetLocation()).Item2; var bomb = game.__stickyBombs.OrderBy(pirate.Distance).First(); bool canReachMum = pirate.Distance(nearestShip) / pirate.MaxSpeed + pirate.MaxSpeed < bomb.Countdown; if (!canReachMum) { return(Utils.GetPirateStatus(pirate, Sailing.SafeSail(pirate, new Location(0, 0)))); } } turnCounter++; if (turnCounter == 0) { maxTurnsToArrive = ((double)pirate.Distance(nearestShip) / pirate.MaxSpeed) * 2.5; } if (Utils.GetMyHolders().Count() > 1) { var secondHolder = Utils.GetMyHolders().Where(h => h.Id != pirate.Id).First(); var nearestShipToSecondHolder = Utils.OrderByDistance(game.GetMyMotherships().ToList(), secondHolder.Location).First(); var secondThreats = game.GetEnemyLivingPirates().ToList().Where(e => e.CanPush(secondHolder) && e.Distance(nearestShip) < secondHolder.Distance(nearestShip)); secondThreats = secondThreats.OrderBy(treath => treath.Distance(secondHolder)).ToList(); bool caseVI = secondHolder.Distance(nearestShip) < pirate.Distance(nearestShip); bool caseVII = secondHolder.Distance(nearestShip) < pirate.PushDistance + secondHolder.MaxSpeed + game.MothershipUnloadRange; if (pirate.CanPush(secondHolder) && caseVI && caseVII && !Main.piratesPushed.Contains(secondHolder)) { pirate.Push(secondHolder, nearestShipToSecondHolder); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(secondHolder); return(Utils.GetPirateStatus(pirate, "Boosted second holder")); } } var traits = new List <Trait>() { new TraitRateByLazyAsteroid(game.PushDistance + game.AsteroidSize), new TraitRateByMovingAsteroid(game.HeavyPushDistance / 2 + game.PirateMaxSpeed * 3), new TraitRateByEdges(750, 4), new TraitRateByStickyBomb(), new TraitRateByEnemy(150, 3, -1), new TraitAttractedToGoal(500, nearestShip.Location), new TraitWormhole(nearestShip.Location, pirate) }; if (threats.Any() && maxTurnsToArrive < turnCounter && Utils.GetNumOfEnemyPiratesOnPoint(threats.First().Location) >= 4) { pirate.Sail(nearestShip); Main.didTurn.Add(pirate.Id); return(Utils.GetPirateStatus(pirate, "Kamikazad on ship")); } int abstainRadius = 8 * pirate.MaxSpeed; if (Utils.GetMyHolders().Count() > 1) { var secondHolder = Utils.GetMyHolders().First(h => h.Id != pirate.Id); abstainRadius = 3 * (pirate.MaxSpeed + secondHolder.MaxSpeed); if (abstainRadius / 2 < pirate.Distance(nearestShip)) { traits.Add(new TraitRateByEnemy(abstainRadius, 100, secondHolder.UniqueId)); } } var path = new Path(pirate.GetLocation(), nearestShip.Location, traits); bool nearWormHole = game.__wormholes.Any() && game.__wormholes.Any(w => w.TurnsToReactivate <= 2 && pirate.Distance(w) < w.WormholeRange + pirate.MaxSpeed); bool safe = (threats.Any() && game.PushDistance + game.AsteroidSize <= threats.OrderBy(pirate.Distance).First().Distance(pirate)) && !game.GetLivingAsteroids().Any(a => a.Distance(pirate) <= a.Size + pirate.MaxSpeed * 2); if (!nearWormHole && safe && (!threats.Any() && pirate.Distance(nearestShip) < abstainRadius || pirate.Distance(nearestShip) <= Chunk.size || path.GetSailLocations().Count <= 1)) { pirate.Sail(nearestShip); Main.didTurn.Add(pirate.Id); return(Utils.GetPirateStatus(pirate, "Sailing directly to ship")); } Location pathPopLocation = path.Pop(); Location nextSailLocation = pathPopLocation; if (Utils.GetMyHolders().Count() > 1 && safe && threats.Count() >= pirate.NumPushesForCapsuleLoss) { var otherMiner = Utils.GetMyHolders().First(h => h.Id != pirate.Id); bool sameTargetShip = Utils.OrderByDistance(game.GetMyMotherships().ToList(), otherMiner.Location).First() == nearestShip; bool checkI = pirate.Distance(nearestShip) < otherMiner.Distance(nearestShip); bool checkII = Chunk.size * 4 < otherMiner.Distance(nearestShip) - pirate.Distance(nearestShip); if (sameTargetShip && checkI && checkII) { nextSailLocation = pirate.Location.Towards(pathPopLocation, pirate.MaxSpeed / 2); } } if (Utils.PiratesWithTask(TaskType.BOOSTER).Any() && safe) { var closestBooster = Utils.OrderByDistance(Utils.PiratesWithTask(TaskType.BOOSTER), pirate.Location).First(); bool cloestToBooster = Utils.OrderByDistance(Utils.GetMyHolders(), closestBooster.Location).First().Id == pirate.Id; bool checkI = threats.Any() && threats.First().MaxSpeed * 2 <= threats.First().Distance(pirate); if (cloestToBooster && game.PushRange < pirate.Distance(closestBooster) && checkI) { nextSailLocation = pirate.Location.Towards(pathPopLocation, closestBooster.MaxSpeed / 2); } } return(Utils.GetPirateStatus(pirate, "Sailing to goal, " + Sailing.SafeSail(pirate, nextSailLocation.GetLocation()))); }
/// <summary> /// Makes the defender try to push an enemy pirate. Returns true if it did. /// If can be pushed out of the map, else push againts the motherboard. /// </summary> /// <returns> true if the pirate pushed.</returns> public override bool Push() { foreach (Asteroid asteroid in GameSettings.Game.GetLivingAsteroids()) { if (pirate.CanPush(asteroid)) { GameSettings.Game.Debug("Pirate in Backup = " + pirate); GameSettings.Game.Debug("Location in Backup = " + asteroidHandler.FindBestLocationToPushTo(this.Pirate)); pirate.Push(asteroid, asteroidHandler.FindBestLocationToPushTo(this.Pirate)); return(true); } } if (PirateToPush != null && WhereToPush != null) { if (pirate.CanPush(PirateToPush)) { pirate.Push(PirateToPush, WhereToPush); return(true); } } Pirate enemyToPush = Protect(); if (enemyToPush != null) { if (pirate.CanPush(enemyToPush)) { //Sorry about those location numbers :\ //#Onemanarmy if (GameSettings.Game.GetMyMotherships().Length == 0 && GameSettings.Game.GetMyCapsules().Length == 0) { pirate.Push(enemyToPush, new Location(3097, 1557)); return(true); } Location pushTowardsOutOfMap = FieldAnalyzer.GetCloseEnoughToBorder(enemyToPush, Pirate.PushDistance); if (pushTowardsOutOfMap != null) { pirate.Push(enemyToPush, pushTowardsOutOfMap); return(true); } else { if (GameSettings.Game.GetEnemyMotherships().Length > 0) { Location oppositeSide = enemyToPush.GetLocation().Subtract(GameSettings.Game.GetEnemyMotherships()[0].GetLocation()); //Vector: the distance (x,y) you need to go through to go from the mothership to the enemy oppositeSide = enemyToPush.GetLocation().Towards(enemyToPush.GetLocation().Add(oppositeSide), 600); Pirate.Push(enemyToPush, oppositeSide); //Print a message. //GameSettings.Game.Debug("defender " + Pirate + " pushes " + enemyToPush + " towards " + enemyToPush.InitialLocation); //Did push. return(true); } else { Location oppositeSide = enemyToPush.GetLocation().Subtract(new Location(0, 0)); //Vector: the distance (x,y) you need to go through to go from the mothership to the enemy oppositeSide = enemyToPush.GetLocation().Towards(enemyToPush.GetLocation().Add(oppositeSide), 600); Pirate.Push(enemyToPush, oppositeSide); } return(true); } } } GameSettings.Game.Debug("Push distance = " + pirate.PushDistance); GameSettings.Game.Debug("Reached Wormhole zone"); bool canPushWormhole = true; foreach (Wormhole wormhole in GameSettings.Game.GetAllWormholes()) { GameSettings.Game.Debug("wormhole foreach"); if (pirate.CanPush(wormhole)) { //GameSettings.Game.Debug("pirate.PushRange ==> " + pirate.PushRange); //GameSettings.Game.Debug("pirate.MaxSpeed ==> " + pirate.MaxSpeed); GameSettings.Game.Debug("wormhole.Distance(pirate)" + wormhole.Distance(pirate)); if (GameSettings.Game.GetEnemyMotherships().Length > 0) { Mothership mothership = FieldAnalyzer.FindClosestMotherShip(pirate); Pirate enemyCarrier = FieldAnalyzer.GetMostThreatningEnemyCarrier(mothership); if (enemyCarrier != null) { //Checks if the enemyPirate can come in more then 5 turns GameSettings.Game.Debug("pirate.CanPush(wormhole) = " + pirate.CanPush(wormhole)); //Checks if the enemyPirate can come in more then 8 turns if (enemyCarrier.Distance(pirate) < enemyCarrier.MaxSpeed * 8) { canPushWormhole = false; } if (canPushWormhole) { int cols = GameSettings.Game.Cols; int rows = GameSettings.Game.Rows; //Push to the center for now pirate.Push(wormhole, new Location(rows / 2, cols / 2)); GameSettings.Game.Debug("Pirate pushed wormhole"); return(true); } } } } } return(false); }
private int ScaledDistance(Pirate pirate) { int maxDistance = (int)((game.Cols.Power(2) + game.Rows.Power(2)).Sqrt()); return((int)(((double)pirate.Distance(Location) / (double)maxDistance) * MAX_PRIORITY)); }