AI/ActionSystem/BehaviorTree/Nodes/DelayUntilNode.cs
using System;

namespace HC3;

/// <summary>
/// A node that delays execution until a specified condition is met or a timeout occurs.
/// </summary>
public class DelayUntilNode : Node
{
	private readonly Func<bool> _condition;
	private readonly float _timeout;
	private float _startTime;
	private bool _started;

	public DelayUntilNode( Func<bool> condition, float timeout = float.PositiveInfinity )
	{
		_condition = condition;
		_timeout = timeout;
	}

	public override Status Tick()
	{
		if ( !_started )
		{
			_startTime = Time.Now;
			_started = true;
		}

		if ( _condition() )
		{
			_started = false;
			return Status.Success;
		}

		if ( Time.Now - _startTime >= _timeout )
		{
			_started = false;
			return Status.Failure;
		}

		return Status.Running;
	}
}