Ejemplo n.º 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;
 }
Ejemplo n.º 2
0
 public bool DoTurn(Squad squad)
 {
     foreach (SpaceObject obj in Bot.Engine.PushableSpaceObjects.Transform(true, x => (Ascending ? x.OrderByDescending(y => Scorer(y)) : x.OrderBy(y => Scorer(y))).ToArray()))
     {
         PushMapping result = PushMapper(obj, squad.Where(x => x.CanPush(obj)).ToList());
         foreach (PirateShip p in result.attackers)
         {
             p.Push(obj, result.dest);
         }
     }
     return(false);
 }
Ejemplo n.º 3
0
        public bool DoTurn(Squad squad)
        {
            SquadPushPlugin pusher = new SquadPushPlugin(x => x.StickyBombs.Length > 0 ? 1 : 0, true,
                                                         (obj, attackers) => Bot.Engine.CanKill(attackers, obj)
                    ? PushMapping.ByDistance(attackers, obj.DistanceFromBorder(), obj.ClosestBorder())
                    : new PushMapping());

            bool res = pusher.DoTurn(squad);

            if (GameEngine.UNSAFE_SQUAD_PLUGINS)
            {
                return(false);
            }
            else
            {
                return(res);
            }
        }
Ejemplo n.º 4
0
 public PortalOptimizer(System.Func <Wormhole, Location> optimizer)
 {
     pusher = new SquadPushPlugin(x =>
     {
         if (x is Wormhole w)
         {
             return(1);
         }
         return(0);
     }, true, (obj, attackers) =>
     {
         if (obj is Wormhole w)
         {
             return(PushMapping.To(attackers, obj, optimizer(w)));
         }
         return(new PushMapping());
     });
 }
Ejemplo n.º 5
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());
        }