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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
 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;
 }