The StateMachine offered a feature to remember the previous state and allow reverting to it. However this feature is unused. Remove it to allow the previous states to be reclaimed by the GC earlier.
81 lines
2.1 KiB
C#
81 lines
2.1 KiB
C#
#region Copyright & License Information
|
|
/*
|
|
* Copyright (c) The OpenRA Developers and Contributors
|
|
* This file is part of OpenRA, which is free software. It is made
|
|
* available to you under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation, either version 3 of
|
|
* the License, or (at your option) any later version. For more
|
|
* information, see COPYING.
|
|
*/
|
|
#endregion
|
|
|
|
using System.Linq;
|
|
|
|
namespace OpenRA.Mods.Common.Traits.BotModules.Squads
|
|
{
|
|
sealed class UnitsForProtectionIdleState : GroundStateBase, IState
|
|
{
|
|
public void Activate(Squad owner) { }
|
|
public void Tick(Squad owner) { owner.FuzzyStateMachine.ChangeState(owner, new UnitsForProtectionAttackState()); }
|
|
public void Deactivate(Squad owner) { }
|
|
}
|
|
|
|
sealed class UnitsForProtectionAttackState : GroundStateBase, IState
|
|
{
|
|
public const int BackoffTicks = 4;
|
|
internal int Backoff = BackoffTicks;
|
|
|
|
public void Activate(Squad owner) { }
|
|
|
|
public void Tick(Squad owner)
|
|
{
|
|
if (!owner.IsValid)
|
|
return;
|
|
|
|
var leader = Leader(owner);
|
|
if (!owner.IsTargetValid(leader))
|
|
{
|
|
var target = owner.SquadManager.FindClosestEnemy(leader, WDist.FromCells(owner.SquadManager.Info.ProtectionScanRadius));
|
|
owner.SetActorToTarget(target);
|
|
if (target.Actor == null)
|
|
{
|
|
owner.FuzzyStateMachine.ChangeState(owner, new UnitsForProtectionFleeState());
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!owner.IsTargetVisible)
|
|
{
|
|
if (Backoff < 0)
|
|
{
|
|
owner.FuzzyStateMachine.ChangeState(owner, new UnitsForProtectionFleeState());
|
|
Backoff = BackoffTicks;
|
|
return;
|
|
}
|
|
|
|
Backoff--;
|
|
}
|
|
else
|
|
owner.Bot.QueueOrder(new Order("AttackMove", null, owner.Target, false, groupedActors: owner.Units.ToArray()));
|
|
}
|
|
|
|
public void Deactivate(Squad owner) { }
|
|
}
|
|
|
|
sealed class UnitsForProtectionFleeState : GroundStateBase, IState
|
|
{
|
|
public void Activate(Squad owner) { }
|
|
|
|
public void Tick(Squad owner)
|
|
{
|
|
if (!owner.IsValid)
|
|
return;
|
|
|
|
GoToRandomOwnBuilding(owner);
|
|
owner.FuzzyStateMachine.ChangeState(owner, new UnitsForProtectionIdleState());
|
|
}
|
|
|
|
public void Deactivate(Squad owner) { owner.SquadManager.UnregisterSquad(owner); }
|
|
}
|
|
}
|