public void Deactivate(Squad owner) { }
public void Activate(Squad owner) { }
protected virtual bool ShouldFlee(Squad owner) { return(ShouldFlee(owner, enemies => !AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemies))); }
protected static bool NearToPosSafely(Squad owner, WPos loc) { Actor a; return(NearToPosSafely(owner, loc, out a)); }
// Checks the number of anti air enemies around units protected virtual bool ShouldFlee(Squad owner) { return(ShouldFlee(owner, enemies => CountAntiAirUnits(enemies) * MissileUnitMultiplier > owner.Units.Count)); }
public void Deactivate(Squad owner) { owner.Units.Clear(); }
public void Tick(Squad owner) { if (!owner.IsValid) { return; } if (!owner.IsTargetValid) { var closestEnemy = FindClosestEnemy(owner); if (closestEnemy != null) { owner.TargetActor = closestEnemy; } else { owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsFleeState(), true); return; } } var leader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); if (leader == null) { return; } var ownUnits = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.Units.Count) / 3) .Where(a => a.Owner == owner.Units.First().Owner&& owner.Units.Contains(a)).ToHashSet(); if (ownUnits.Count < owner.Units.Count) { // Since units have different movement speeds, they get separated while approaching the target. // Let them regroup into tighter formation. owner.Bot.QueueOrder(new Order("Stop", leader, false)); foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a))) { owner.Bot.QueueOrder(new Order("AttackMove", unit, Target.FromCell(owner.World, leader.Location), false)); } } else { var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)) .Where(owner.SquadManager.IsEnemyUnit); var target = enemies.ClosestTo(leader.CenterPosition); if (target != null) { owner.TargetActor = target; owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackState(), true); } else { foreach (var a in owner.Units) { owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false)); } } } if (ShouldFlee(owner)) { owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsFleeState(), true); } }