AI/ActionSystem/BehaviorTree/ParallelNode.cs
namespace HC3;
/// <summary>
/// A node that executes all child nodes in parallel.
/// </summary>
public class ParallelNode : Node
{
private readonly List<Node> _children;
private readonly bool _requireAllSuccess;
private readonly bool _requireAllFailure;
public ParallelNode( List<Node> children, bool requireAllSuccess = true, bool requireAllFailure = false )
{
_children = children;
_requireAllSuccess = requireAllSuccess;
_requireAllFailure = requireAllFailure;
}
public override Status Tick()
{
var anyRunning = false;
var successCount = 0;
var failureCount = 0;
foreach ( var child in _children )
{
var result = child.TickInternal();
switch ( result )
{
case Status.Running:
anyRunning = true;
break;
case Status.Success:
successCount++;
break;
case Status.Failure:
failureCount++;
break;
}
}
if ( _requireAllSuccess && successCount < _children.Count )
return anyRunning ? Status.Running : Status.Failure;
if ( !_requireAllSuccess && successCount > 0 )
return Status.Success;
if ( _requireAllFailure && failureCount == _children.Count )
return Status.Failure;
return anyRunning ? Status.Running : Status.Success;
}
}