public Location SmartSail(Pirate pirate, MapObject destination) { List <Location> candidates = new List <Location>(); var bestOption = pirate.GetLocation(); const int steps = 50; Location PirateLocation = pirate.GetLocation(); if ((pirate.Location.Distance(destination)) - bestOption.Distance(destination) >= (pirate.MaxSpeed / 2) && pirate.HasCapsule()) { var LocationOfPush = TryPushMyCapsule(pirate); if (PirateLocation != null) { PirateLocation = LocationOfPush; } } for (int i = 0; i < steps; i++) { double angle = System.Math.PI * 2 * i / steps; double deltaX = pirate.MaxSpeed * System.Math.Cos(angle); double deltaY = pirate.MaxSpeed * System.Math.Sin(angle); Location option = new Location((int)(PirateLocation.Row - deltaY), (int)(PirateLocation.Col + deltaX)); if (!IsInDanger(option, destination.GetLocation(), pirate) && option.InMap()) { candidates.Add(option); } } if (candidates.Any()) { bestOption = candidates.OrderBy(option => option.Distance(destination)).First(); } return(bestOption); }
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); }
/* Execute a series of steps */ public void GoTo(PirateGame game, LinkedList <Location> locationList) { if (_traveling) { /* SPirate is currently traveling */ if (_pirate.GetLocation() == _currentMapTarget.Value) { //Pirate reached destination if (_currentMapTarget.Next == null) { _traveling = false; } else { _currentMapTarget = _currentMapTarget.Next; } } else { //Traveling but still hasn't reached destination if (_pirate.IsAlive()) { game.SetSail(_pirate, game.GetSailOptions(_pirate, _currentMapTarget.Value)[0]); } } } else { //Not traveling, insert new list _mapTargetBuffer = locationList; } }
/// <summary> /// The method gets a pirate, and asteroid, and trying to avoid it /// </summary> /// <param name="pirate"></param> /// <param name="asteroid"></param> /// <returns></returns> public Location AvoidAsteroid(Pirate pirate, Asteroid asteroid) { int turnsToArrive = fieldAnalyzer.TurnsForAsteroidToArriveToALocation(asteroid, pirate.GetLocation()); if (turnsToArrive > pirate.PushReloadTurns) // Will I be able to push while he arrives? { return(null); } else if (turnsToArrive + 1 > turnsToPassBy) { GameSettings.Game.Debug("GOOOOO"); return(pirate.GetLocation().Add(fieldAnalyzer.DirectionOfAsteroid(asteroid))); } return(null); }
public override Pirate Protect() { List <Pirate> enemyCarriers = new List <Pirate>(); foreach (Pirate enemy in GameSettings.Game.GetEnemyLivingPirates()) { if (enemy.HasCapsule()) { enemyCarriers.Add(enemy); } } if (enemyCarriers.Count < 2) { List <Pirate> enemiesByDistanceFromEnemyBase = GameSettings.Game.GetEnemyLivingPirates().ToList(); enemiesByDistanceFromEnemyBase.OrderBy(Pirate => Pirate.Location.Distance(GameSettings.Game.GetEnemyMotherships()[0].Location)); int scale = Pirate.PushDistance * 4; foreach (Pirate pirate in enemiesByDistanceFromEnemyBase) { //Checks if the any of the pirates has capsule in the distance //of the mothership has a capsule if (pirate.Distance(GameSettings.Game.GetEnemyMotherships()[0]) < scale && pirate.Capsule != null) { return(pirate); } } } else if (enemyCarriers.Count > 2) { Mothership closestMothership = FieldAnalyzer.GetClosestEnemyMothership(pirate); enemyCarriers.OrderBy(Pirate => Pirate.GetLocation().Distance(closestMothership)); return(enemyCarriers[1]); } return(null); }
/// <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 (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()))); }
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))); }
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); }
/// <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); }