BehaviorTree/Decorator/Condition.cs
using System;

namespace NPBehave
{
    public class Condition : ObservingDecorator
    {
        private Func<bool> _condition;
        private float _checkInterval;
        private float _checkVariance;

        public Condition(Func<bool> condition, Node decoratee) : base("Condition", Stops.None, decoratee)
        {
            _condition = condition;
            _checkInterval = 0.0f;
            _checkVariance = 0.0f;
        }

        public Condition(Func<bool> condition, Stops stopsOnChange, Node decoratee) : base("Condition", stopsOnChange, decoratee)
        {
            _condition = condition;
            _checkInterval = 0.0f;
            _checkVariance = 0.0f;
        }

        public Condition(Func<bool> condition, Stops stopsOnChange, float checkInterval, float randomVariance, Node decoratee) : base("Condition", stopsOnChange, decoratee)
        {
            _condition = condition;
            _checkInterval = checkInterval;
            _checkVariance = randomVariance;
        }

        protected override void StartObserving()
        {
            RootNode.Clock.AddTimer(_checkInterval, _checkVariance, -1, Evaluate);
        }

        protected override void StopObserving()
        {
            RootNode.Clock.RemoveTimer(Evaluate);
        }

        protected override bool IsConditionMet()
        {
            return _condition();
        }
    }
}