2025-05-30 18:37:35 +03:00

51 lines
1.5 KiB
C#

using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.StateMachine;
public abstract class StateBehaviourBase : Behaviour, IState
{
public Event<IState> OnStateUpdate { get; init; } = new();
public Event<IState, IState.StateTransitionedFromArguments> OnStateTransitionedFrom { get; init; } = new();
public Event<IState, IState.StateTransitionedToArguments> OnStateTransitionedTo { get; init; } = new();
public Event<IState, IState.StateTransitionReadyArguments> OnStateTransitionReady { get; init; } = new();
public Event<INameable, INameable.NameChangedArguments> OnNameChanged { get; init; } = 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();
}