using Syntriax.Engine.Core; namespace Syntriax.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(); private string _name = string.Empty; public string Name { get => _name; set { if (_name.CompareTo(value) == 0) return; string previousName = _name; _name = value; OnNameChanged?.Invoke(this, new(previousName)); } } 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(); }