예제 #1
0
 public void Deactivate(Squad owner)
 {
 }
예제 #2
0
 public void Activate(Squad owner)
 {
 }
예제 #3
0
 protected virtual bool ShouldFlee(Squad owner)
 {
     return(ShouldFlee(owner, enemies => !AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemies)));
 }
예제 #4
0
        protected static bool NearToPosSafely(Squad owner, WPos loc)
        {
            Actor a;

            return(NearToPosSafely(owner, loc, out a));
        }
예제 #5
0
 // 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));
 }
예제 #6
0
 public void Deactivate(Squad owner)
 {
     owner.Units.Clear();
 }
예제 #7
0
        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);
            }
        }