/// <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); }
/// <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 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; }