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;
	}
}