public LogicedPirateSquad[] LogicDefenders(Squad squad) { #region Distrbution if (squad.Count <= 0) { return(new LogicedPirateSquad[0]); } int EnemyMotherships = Bot.Engine.EnemyMotherships.Length; #endregion Distrbution PirateLogic BaseLogic = DefenseBaseLogic(); LogicedPirateSquad[] Squads = new LogicedPirateSquad[0]; for (int idx = 0; idx < EnemyMotherships; idx++) { Mothership Target = Bot.Engine.EnemyMotherships[idx]; Squad CurrentSquad = squad.Take(Deploy(Target)).ToList(); squad = squad.FilterOutBySquad(CurrentSquad); if (CurrentSquad.Count <= 0) { continue; } LogicedPirateSquad LogicedCurrentSquad = new LogicedPirateSquad(CurrentSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(), DefenseLogic(Target)); Squads = Squads.Concat(new LogicedPirateSquad[] { LogicedCurrentSquad }).ToArray(); } return(Squads); }
public LogicedPirateSquad[] LogicAttackers(Squad squad) { #region Distrbution if (squad.Count <= 0) { return(new LogicedPirateSquad[0]); } int Mines = Bot.Engine.MyCapsules.Length; //Mines = System.Math.Min(System.Math.Max(1, squad.Count / 2 + squad.Count % 2), Mines); Mines = System.Math.Min(Mines, squad.Count); Capsule[] Capsules = Bot.Engine.MyCapsules.OrderBy(x => x.InitialLocation.Distance(Bot.Engine.MyMotherships.Nearest(x))).ToArray(); int BaseSize = squad.Count / Mines; int Remainder = System.Math.Max((squad.Count - BaseSize * Mines) % Mines, 0); #endregion Distrbution LogicedPirateSquad[] Squads = new LogicedPirateSquad[0]; for (int idx = 0; idx < Mines; 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; } Location Middle = CurrentSquad.Select(x => x.InitialLocation).Middle(); Capsule Target = Capsules[idx]; SquadLogic CapsuleChasersLogic = new SquadLogic().AttachPlugin(new BoostedCapsuleSquadPlugin(Target, AVOIDING_DISTANCE, Bot.Engine.NumberOfPushesForHeavyCapsuleLoss, CAMPER_DURATION, IGNORE_DEEP_CAMPS, BACKWARD_MULTIPLIER)); SquadLogic CapsuleCampersLogic = new SquadLogic().AttachPlugin(new BasicDefenseSquad <Wormhole>(Target.InitialLocation, 0, () => Bot.Engine.AllWormholes, x => new DefenseStats(0, 0), x => new DefenseStats(x.Distance(Target.InitialLocation), WormholeDeployer(x)), (obj, attackers) => Bot.Engine.DefaultPush(obj, attackers, false))) .AttachPlugin(new SquadCamperPlugin(Target.InitialLocation)); LogicedPirateSquad[] LogicedCurrentSquads; if (Target.IsHeld() && CurrentSquad.ContainsPirate(Target.Holder) && CurrentSquad.LivingPirates().Count > 2) { Squad CapsuleChasers = new Squad(CurrentSquad.LivingPirates().FilterOutById(Target.Holder.Id).OrderBy(x => System.Math.Max(x.PushReloadTurns, x.TurnsToReach(Target))).Take(Target.Holder.NumPushesForCapsuleLoss - 1)).AddPirates((PirateShip)Target.Holder); Squad CapsuleCampers = CurrentSquad.FilterOutBySquad(CapsuleChasers); LogicedCurrentSquads = new LogicedPirateSquad[] { new LogicedPirateSquad(CapsuleCampers.Select(x => x.LogicPirate(AttackBaseLogic)).ToArray(), CapsuleCampersLogic), new LogicedPirateSquad(CapsuleChasers.Select(x => x.LogicPirate(AttackBaseLogic)).ToArray(), CapsuleChasersLogic) }; } else { LogicedCurrentSquads = new LogicedPirateSquad[] { new LogicedPirateSquad(CurrentSquad.Select(x => x.LogicPirate(AttackBaseLogic)).ToArray(), CapsuleChasersLogic) }; } Squads = Squads.Concat(LogicedCurrentSquads).ToArray(); } return(Squads); }
public LogicedPirateSquad[] LogicAttackers(Squad squad) { #region Distrbution if (squad.Count <= 0) { return(new LogicedPirateSquad[0]); } int Mines = Bot.Engine.MyCapsules.Length; #endregion Distrbution PirateLogic BaseLogic = AttackBaseLogic(); LogicedPirateSquad[] Squads = new LogicedPirateSquad[0]; for (int idx = 0; idx < Mines; idx++) { Capsule Target = Bot.Engine.MyCapsules[idx]; Squad CurrentSquad = squad.Take(Deploy(Target)).ToList(); squad = squad.FilterOutBySquad(CurrentSquad); if (CurrentSquad.Count <= 0) { continue; } SquadLogic ChaserLogic = CapsuleChaserLogic(Target); SquadLogic CamperLogic = CapsuleCamperLogic(Target); LogicedPirateSquad[] LogicedCurrentSquads; if (Target.IsHeld() && CurrentSquad.ContainsPirate(Target.Holder) && CurrentSquad.LivingPirates().Count > 2) { Squad CapsuleChasers = new Squad(CurrentSquad.LivingPirates().FilterOutById(Target.Holder.Id).OrderBy(x => System.Math.Max(x.PushReloadTurns, x.TurnsToReach(Target))).Take(Target.Holder.NumPushesForCapsuleLoss - 1)).AddPirates((PirateShip)Target.Holder); Squad CapsuleCampers = CurrentSquad.FilterOutBySquad(CapsuleChasers); LogicedCurrentSquads = new LogicedPirateSquad[] { new LogicedPirateSquad(CapsuleCampers.Select(x => x.LogicPirate(BaseLogic)).ToArray(), CamperLogic), new LogicedPirateSquad(CapsuleChasers.Select(x => x.LogicPirate(BaseLogic)).ToArray(), ChaserLogic) }; } else { LogicedCurrentSquads = new LogicedPirateSquad[] { new LogicedPirateSquad(CurrentSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(), ChaserLogic) }; } Squads = Squads.Concat(LogicedCurrentSquads).ToArray(); } return(Squads); }
public LogicedPirateSquad[] AssignSquads(PirateShip[] pirates) { int Count = Bot.Engine.MyPirates.Count; int AttackSize = Count / 2 + Count % 2; Squad AttackSquad = new Squad(pirates).Filter(x => x.Id < Count); Squad DefenseSquad = new Squad(pirates).Filter(x => x.Id >= Count); PirateLogic BaseLogic = this.BaseLogic(); SquadLogic AttackLogic = this.AttackLogic(); SquadLogic DefenseLogic = this.DefenseLogic(); LogicedPirateSquad LogicedAttackSquad = new LogicedPirateSquad(AttackSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(), AttackLogic); LogicedPirateSquad LogicedDefenseSquad = new LogicedPirateSquad(AttackSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(), DefenseLogic); return(new LogicedPirateSquad[] { LogicedAttackSquad, LogicedDefenseSquad }); }
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); }