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