Esempio n. 1
0
 public bool DoTurn(PirateShip ship)
 {
     Delegates.ScoringFunction <SpaceObject> scorer = x =>
                                                      x.UniqueId == ship.UniqueId ? selfBombingScorer((PirateShip)((Pirate)x)) : bombingScorer(x);
     if (ship.StickyBombs.Length > 0)
     {
         /*
          * int remaining = ship.StickyBombs.Select(x => x.Countdown + 1).Min();
          * ship.Sail(MaximalScore(ship, ship.MaxSpeed * remaining).arg0);
          */
         Location direction = Bot.Engine.MyLivingPirates.Where(x => x.StickyBombs.Length <= 0).Select(x => x.Location.Subtract(ship.Location).Multiply(-1)).Concat(
             Bot.Engine.EnemyLivingPirates.Where(x => x.StickyBombs.Length <= 0).Select(x => x.Location.Subtract(ship.Location))).Middle();
         ship.Sail(ship.Location.Add(direction));
         return(true);
     }
     else
     {
         SpaceObject[] bombable = Bot.Engine.PushableSpaceObjects.Concat(new SpaceObject[] { ship })
                                  .Where(x => ship.CanStickBomb(x)).ToArray();
         SpaceObject max = bombable.FirstBy(x => - scorer(x));
         if (scorer(max) > 0 && Bot.Engine.CanStickBomb)
         {
             ship.StickBomb(max);
             return(true);
         }
         return(false);
     }
 }
Esempio n. 2
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;
 }
Esempio n. 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;
 }
Esempio n. 4
0
 public Bomber()
 {
     this.bombingScorer     = x => 0;
     this.selfBombingScorer = x => 0;
 }
Esempio n. 5
0
 public Bomber(Delegates.ScoringFunction <SpaceObject> bombingScorer,
               Delegates.ScoringFunction <PirateShip> selfBombingScorer)
 {
     this.bombingScorer     = bombingScorer;
     this.selfBombingScorer = selfBombingScorer;
 }