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);
        }
Пример #2
0
        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 });
        }
Пример #5
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);
        }