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); } }
/// <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 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; }
public Bomber() { this.bombingScorer = x => 0; this.selfBombingScorer = x => 0; }
public Bomber(Delegates.ScoringFunction <SpaceObject> bombingScorer, Delegates.ScoringFunction <PirateShip> selfBombingScorer) { this.bombingScorer = bombingScorer; this.selfBombingScorer = selfBombingScorer; }