예제 #1
0
 /// <summary>
 /// Constructs a simple squad push plugin
 /// </summary>
 /// <param name="OnlyWhenKill">Push only when killing is possible</param>
 /// <param name="OnlyCapsules">Push only capsule carrying pirates</param>
 /// <param name="CrystalEmergency">Ignore OnlyWhenKill if a capsule is about to be scored</param>
 /// <param name="PrioritizeCapsules">Prioiritize capsule carriers</param>
 public SquadPushPlugin(bool OnlyWhenKill = true, bool OnlyCapsules = false, bool CrystalEmergency = true, bool PrioritizeCapsules = true)
 {
     Scorer = obj =>
     {
         if (obj is Pirate && Bot.Engine.IsAliveAfterTurn((Pirate)obj, 0) && (!OnlyCapsules || ((Pirate)obj).HasCapsule()))
         {
             return(((Pirate)obj).HasCapsule() ? 2 : 1);
         }
         else
         {
             return(0);
         }
     };
     PushMapper = (obj, attackers) =>
     {
         if (!(obj is Pirate))
         {
             return(new PushMapping());
         }
         if (CrystalEmergency && !Bot.Engine.CanKill(attackers, obj))
         {
             return(PushMapping.ByNumPushes(attackers, (obj as Pirate).NumPushesForCapsuleLoss, obj.ClosestBorder()));
         }
         return(PushMapping.ByDistance(attackers, obj.DistanceFromBorder(), obj.ClosestBorder()));
     };
     this.Ascending = false;
 }
 /// <summary>
 /// Constructs a defense squad
 /// </summary>
 /// <param name="Camp">Camping location</param>
 /// <param name="ExtremeDangerDetailCount">Size of extreme danger minimal detail</param>
 /// <param name="PossibleDangers">A function to return possible dangers</param>
 /// <param name="ExtremeDangerFunction">A function that determines wether a danger is considered extreme</param>
 /// <param name="DangerFunction">A function that determines wether a possible danger poses a threat</param>
 public BasicDefenseSquad(Location Camp, int ExtremeDangerDetailCount, System.Func <T[]> PossibleDangers, Delegates.DefenseFunction <T> ExtremeDangerFunction, Delegates.DefenseFunction <T> DangerFunction)
 {
     this.Camp = Camp;
     this.ExtremeDangerDetailCount = ExtremeDangerDetailCount;
     this.PossibleDangers          = PossibleDangers;
     this.ExtremeDangerFunction    = ExtremeDangerFunction;
     this.DangerFunction           = DangerFunction;
     this.PushMapper = (x, y) => Bot.Engine.DefaultPush(x, y);
 }
예제 #3
0
 /// <summary>
 /// Constructs an advanced squad push plugin
 /// </summary>
 /// <param name="Scorer">A selector to score each pushable object (priority). a score beneath or equal to 0 is considered non threat</param>
 /// <param name="Ascending">Flag to set if objects are sorted from low to high</param>
 /// <param name="PushMapper">A function to describe the pushing tactic of the pirates</param>
 public SquadPushPlugin(Delegates.ScoringFunction <SpaceObject> Scorer, bool Ascending, Delegates.PushMapper PushMapper)
 {
     this.Scorer     = Scorer;
     this.PushMapper = (obj, attackers) =>
     {
         if (Scorer(obj) <= 0)
         {
             return(new PushMapping());
         }
         else
         {
             return(PushMapper(obj, attackers));
         }
     };
     this.Ascending = Ascending;
 }
예제 #4
0
        public LogicedPirateSquad[] AssignSquads(PirateShip[] pirates)
        {
            // Private cases
            if (Bot.Engine.Enemy.BotName == "25767")
            {
                DefensePushMapper = (obj, attackers) => {
                    PushMapping pm = (obj is Pirate && ((Pirate)obj).HasCapsule()) ? Bot.Engine.DefaultPush(obj, attackers, true) : Bot.Engine.DefaultPush(obj, attackers);
                    return(new PushMapping(pm.attackers, new Location(Bot.Engine.Rows - pm.dest.Row, Bot.Engine.Cols - pm.dest.Col)));
                }
            }
            ;


            // Initialize BaseLogic
            AttackBaseLogic = new PirateLogic().AttachPlugin(new Week3Custom.EtgarimWeek3Plugin()).AttachPlugin(new AsteroidDodger((ast, p) =>
            {
                /*
                 * Location nm = Bot.Engine.MyMotherships.Nearest(p).Location;
                 * Line l = new Line(ast, nm);
                 * return l.IsProjectionOnLine(p) ? AsteroidDodger.TangentPush(ast, p) : nm;
                 */
                Squad PossibleTargets = Bot.Engine.EnemyLivingPirates.Filter(enemy =>
                {
                    Line l          = new Line(enemy, ast);
                    bool ShouldPush = !l.IsProjectionOnLine(p) || l.Distance(p) > ast.Size * 1.5;
                    return(ShouldPush);
                });
                if (!PossibleTargets.IsEmpty())
                {
                    return(PossibleTargets.FirstBy(x => x.Distance(ast)).Location);
                }
                else
                {
                    return(AsteroidDodger.TangentPush(ast, p));
                }
            }
                                                                                                                                   ))
                              .AttachPlugin(new EmergencyCapsulePusherPlugin()).AttachPlugin(new PortalOptimizer());
            DefenseBaseLogic = new PirateLogic().AttachPlugin(new Week3Custom.EtgarimWeek3Plugin()).AttachPlugin(new AsteroidDodger((ast, p) =>
            {
                Squad PossibleTargets = Bot.Engine.EnemyLivingPirates.Filter(enemy =>
                {
                    Line l          = new Line(enemy, ast);
                    bool ShouldPush = !l.IsProjectionOnLine(p) || l.Distance(p) > ast.Size * 1.5;
                    return(ShouldPush);
                });
                if (!PossibleTargets.IsEmpty())
                {
                    return(PossibleTargets.FirstBy(x => x.Distance(ast)).Location);
                }
                else
                {
                    return(AsteroidDodger.TangentPush(ast, p));
                }
            }))
                               .AttachPlugin(new EmergencyCapsulePusherPlugin());

            // Not good practice
            pirates = Bot.Engine.MyPirates.ToArray();

            Tuple <int, int> Sizes = AssignSizes();
            int AttackSize         = Sizes.arg0;
            int DefenseSize        = Sizes.arg1;

            Squad AttackSquad  = new Squad(pirates.Where(x => x.Id < AttackSize));
            Squad DefenseSquad = new Squad(pirates.Where(x => x.Id >= AttackSize));

            LogicedPirateSquad[] AttackerPirates = LogicAttackers(AttackSquad);
            LogicedPirateSquad[] DefenderPirates = LogicDefenders(DefenseSquad);

            Bot.Engine.Debug("Testing pirates...");
            // Not good practice
            return(AttackerPirates.Concat(DefenderPirates).Select(x =>
            {
                Bot.Engine.Debug(new Squad(x.LogicedPirates.Select(y => y.pirate)));
                return new LogicedPirateSquad(x.LogicedPirates.Where(y => y.pirate.Alive).ToArray(), x.Logic);
            }).ToArray());
        }
 /// <summary>
 /// Constructs a defense squad
 /// </summary>
 /// <param name="Camp">Camping location</param>
 /// <param name="ExtremeDangerDetailCount">Size of extreme danger minimal detail</param>
 /// <param name="PossibleDangers">A function to return possible dangers</param>
 /// <param name="ExtremeDangerFunction">A function that determines wether a danger is considered extreme</param>
 /// <param name="DangerFunction">A function that determines wether a possible danger poses a threat</param>
 /// <param name="PushMapper">A custom pushing function</param>
 public BasicDefenseSquad(Location Camp, int ExtremeDangerDetailCount, System.Func <T[]> PossibleDangers, Delegates.DefenseFunction <T> ExtremeDangerFunction, Delegates.DefenseFunction <T> DangerFunction, Delegates.PushMapper PushMapper)
     : this(Camp, ExtremeDangerDetailCount, PossibleDangers, ExtremeDangerFunction, DangerFunction)
 {
     this.PushMapper = PushMapper;
 }