using Engine.Core; namespace Engine.Systems.StateMachine; public abstract class StateBehaviourBase : Behaviour, IState { public Event OnStateUpdate { get; } = new(); public Event OnStateTransitionedFrom { get; } = new(); public Event OnStateTransitionedTo { get; } = new(); public Event OnStateTransitionReady { get; } = new(); public Event OnNameChanged { get; } = new(); public string Name { get; set { if (field.CompareTo(value) == 0) return; string previousName = field; field = value; OnNameChanged?.Invoke(this, new(previousName)); } } = string.Empty; protected virtual void OnUpdateState() { } public void Update() { OnUpdateState(); OnStateUpdate?.Invoke(this); } protected virtual void OnTransitionedToState(IState from) { } public void TransitionTo(IState from) { OnTransitionedToState(from); OnStateTransitionedTo?.Invoke(this, new(from)); } protected virtual void OnTransitionedFromState(IState to) { } public void TransitionFrom(IState to) { OnTransitionedFromState(to); OnStateTransitionedFrom?.Invoke(this, new(to)); } public abstract IState? GetNextState(); }