public SquadLogic DefenseLogic() { Mothership MS = Bot.Engine.EnemyMotherships[0]; int SCORE_EXTREME_DANGER_TIME = 7; int SCORE_DANGER_TIME = 12; int EXTREME_DANGER_DETAIL_COUNT = 2; Delegates.FilterFunction <Pirate> EnemyHasPush = x => Bot.Engine.GetEnemyPiratesInRange(x.GetLocation(), Bot.Engine.PushRange).Count > 1; Delegates.DefenseFunction <Pirate> ExtremeDangerFunction = p => { bool CapsuleInGame = Bot.Engine.EnemyLivingCapsules.Any(y => y.IsHeld()); return(new DefenseStats((p.HasCapsule() || !CapsuleInGame) && ((PirateShip)p).TurnsToReach(MS) <= SCORE_EXTREME_DANGER_TIME ? p.Distance(MS) : 0, p.NumPushesForCapsuleLoss)); }; Delegates.DefenseFunction <Pirate> DangerFunction = p => { bool CapsuleInGame = Bot.Engine.EnemyLivingCapsules.Any(y => y.IsHeld()); return(new DefenseStats((p.HasCapsule() || !CapsuleInGame) && EnemyHasPush(p) && (p.Distance(MS) - (EnemyHasPush(p) ? p.PushDistance : 0)) / p.MaxSpeed <= SCORE_DANGER_TIME ? p.Distance(MS) : 0, p.NumPushesForCapsuleLoss)); }; BasicDefenseSquad <Pirate> DefensePlugin = new BasicDefenseSquad <Pirate>(MS.Location, EXTREME_DANGER_DETAIL_COUNT, () => Bot.Engine.EnemyLivingPirates.Select(x => (Pirate)x).ToArray(), ExtremeDangerFunction, DangerFunction); SquadLogic logic = new SquadLogic(DefensePlugin); return(logic); }
public override SquadLogic DefenseLogic(Mothership MS) { #region Scoring Functions Delegates.FilterFunction <MapObject> EnemyHasPush = x => Bot.Engine.GetEnemyPiratesInRange(x.GetLocation(), Bot.Engine.PushRange).Count > 1; Delegates.DefenseFunction <SpaceObject> ExtremeDangerFunction = x => { bool CapsuleInGame = Bot.Engine.EnemyLivingCapsules.Any(y => y.IsHeld()); if (x is Pirate p) { return(new DefenseStats((p.HasCapsule() || !CapsuleInGame) && ((PirateShip)p).TurnsToReach(MS) <= SCORE_EXTREME_DANGER_TIME ? p.Distance(MS) : 0, PirateDeployer((PirateShip)p))); } else if (x is Wormhole w) { return(new DefenseStats(w.Distance(MS) / Bot.Engine.MaxPirateSpeed <= SCORE_EXTREME_DANGER_TIME ? w.Distance(MS) + Bot.Engine.MaxPirateSpeed * SCORE_EXTREME_DANGER_TIME : 0, WormholeDeployer(w))); } else { return(new DefenseStats(0, 0)); } }; Delegates.DefenseFunction <SpaceObject> DangerFunction = x => { bool CapsuleInGame = Bot.Engine.EnemyLivingCapsules.Any(y => y.IsHeld()); if (x is Pirate p) { return(new DefenseStats((p.HasCapsule() || !CapsuleInGame) && EnemyHasPush(p) && (p.Distance(MS) - (EnemyHasPush(p) ? p.PushDistance : 0)) / p.MaxSpeed <= SCORE_DANGER_TIME ? p.Distance(MS) : 0, PirateDeployer((PirateShip)p))); } else if (x is Wormhole w) { return(new DefenseStats(w.Distance(MS) / Bot.Engine.MaxPirateSpeed <= SCORE_DANGER_TIME ? w.Distance(MS) + Bot.Engine.MaxPirateSpeed * SCORE_DANGER_TIME : 0, WormholeDeployer(w))); } else { return(new DefenseStats(0, 0)); } }; #endregion Scoring Functions BasicDefenseSquad <SpaceObject> DefensePlugin = new BasicDefenseSquad <SpaceObject>(MS.Location, EXTREME_DANGER_DETAIL_COUNT, () => Bot.Engine.EnemyLivingPirates.Select(x => (SpaceObject)((Pirate)x)).Concat(Bot.Engine.AllWormholes).ToArray(), ExtremeDangerFunction, DangerFunction, DefensePushMapper); SquadCamperPlugin camper = new SquadCamperPlugin(MS); return(new SquadLogic(DefensePlugin, camper)); }
public LogicedPirateSquad[] LogicDefenders(Squad squad) { #region Distrbution if (squad.Count <= 0) { return(new LogicedPirateSquad[0]); } int EnemyMotherships = Bot.Engine.EnemyMotherships.Length; if (EnemyMotherships <= 0) { return(new LogicedPirateSquad[0]); } EnemyMotherships = System.Math.Min(System.Math.Max(1, squad.Count / 2), EnemyMotherships); Mothership[] Motherships = Bot.Engine.EnemyMotherships.OrderBy(x => x.Distance(Bot.Engine.EnemyCapsules.Select(y => y.InitialLocation).Nearest(x))).ToArray(); int BaseSize = squad.Count / EnemyMotherships; int Remainder = System.Math.Max((squad.Count - BaseSize * EnemyMotherships) % EnemyMotherships, 0); #endregion Distrbution LogicedPirateSquad[] Squads = new LogicedPirateSquad[0]; for (int idx = 0; idx < EnemyMotherships; idx++) { Squad CurrentSquad = new Squad(squad.Skip(BaseSize * idx + System.Math.Min(idx, Remainder)).Take(BaseSize + (idx < Remainder ? 1 : 0))); if (CurrentSquad.Count <= 0) { continue; } Mothership MS = Bot.Engine.EnemyMotherships[idx]; #region Scoring Functions Delegates.FilterFunction <MapObject> EnemyHasPush = x => Bot.Engine.GetEnemyPiratesInRange(x.GetLocation(), Bot.Engine.PushRange).Count > 1; Delegates.DefenseFunction <SpaceObject> ExtremeDangerFunction = x => { bool CapsuleInGame = Bot.Engine.EnemyLivingCapsules.Any(y => y.IsHeld()); if (x is Pirate p) { return(new DefenseStats((p.HasCapsule() || !CapsuleInGame) && ((PirateShip)p).TurnsToReach(MS) <= SCORE_EXTREME_DANGER_TIME ? p.Distance(MS) : 0, PirateDeployer((PirateShip)p))); } else if (x is Wormhole w) { return(new DefenseStats(w.Distance(MS) / Bot.Engine.MaxPirateSpeed <= SCORE_EXTREME_DANGER_TIME ? w.Distance(MS) + Bot.Engine.MaxPirateSpeed * SCORE_EXTREME_DANGER_TIME : 0, WormholeDeployer(w))); } else { return(new DefenseStats(0, 0)); } }; Delegates.DefenseFunction <SpaceObject> DangerFunction = x => { bool CapsuleInGame = Bot.Engine.EnemyLivingCapsules.Any(y => y.IsHeld()); if (x is Pirate p) { return(new DefenseStats((p.HasCapsule() || !CapsuleInGame) && EnemyHasPush(p) && (p.Distance(MS) - (EnemyHasPush(p) ? p.PushDistance : 0)) / p.MaxSpeed <= SCORE_DANGER_TIME ? p.Distance(MS) : 0, PirateDeployer((PirateShip)p))); } else if (x is Wormhole w) { return(new DefenseStats(w.Distance(MS) / Bot.Engine.MaxPirateSpeed <= SCORE_DANGER_TIME ? w.Distance(MS) + Bot.Engine.MaxPirateSpeed * SCORE_DANGER_TIME : 0, WormholeDeployer(w))); } else { return(new DefenseStats(0, 0)); } }; #endregion Scoring Functions SquadPlugin DefensePlugin = new BasicDefenseSquad <SpaceObject>(MS.Location, EXTREME_DANGER_DETAIL_COUNT, () => Bot.Engine.EnemyLivingPirates.Select(x => (SpaceObject)((Pirate)x)).Concat(Bot.Engine.AllWormholes).ToArray(), ExtremeDangerFunction, DangerFunction, DefensePushMapper); LogicedPirateSquad LogicedCurrentSquad = new LogicedPirateSquad(CurrentSquad.Select(x => x.LogicPirate(DefenseBaseLogic)).ToArray(), new SquadLogic(DefensePlugin, new SquadCamperPlugin(MS))); Squads = Squads.Concat(new LogicedPirateSquad[] { LogicedCurrentSquad }).ToArray(); } return(Squads); }
public AsteroidDodger(System.Func <Asteroid, PirateShip, Location> PushLocator, Delegates.FilterFunction <Asteroid> Filter, int DangerRange = 3, int HaltingRange = 1) : this(PushLocator, DangerRange, HaltingRange) { this.Filter = Filter; }