53 lines
1.9 KiB
C#
53 lines
1.9 KiB
C#
namespace Syntriax.Engine.StateMachine;
|
|
|
|
public class State : IState
|
|
{
|
|
public event IState.StateUpdateEventHandler? OnStateUpdate = null;
|
|
public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null;
|
|
public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null;
|
|
public event IState.StateTransitionReadyEventHandler? OnStateTransitionReady = null;
|
|
|
|
private readonly List<StateTransition> transitions = [];
|
|
private readonly Dictionary<string, StateTransition> possibleTransitions = [];
|
|
|
|
public string Name { get; set; } = "Default State Name";
|
|
public IReadOnlyList<StateTransition> Transitions => transitions;
|
|
public IReadOnlyDictionary<string, StateTransition> PossibleTransitions => possibleTransitions;
|
|
|
|
public void RemoveTransition(string name)
|
|
{
|
|
if (!possibleTransitions.TryGetValue(name, out StateTransition stateTransition))
|
|
return;
|
|
|
|
transitions.Remove(stateTransition);
|
|
possibleTransitions.Remove(name);
|
|
}
|
|
|
|
public void AddTransition(string name, StateTransition stateTransition)
|
|
{
|
|
if (transitions.Contains(stateTransition))
|
|
return;
|
|
|
|
transitions.Add(stateTransition);
|
|
possibleTransitions.Add(name, stateTransition);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (GetNextState() is IState transitionState)
|
|
OnStateTransitionReady?.Invoke(this, transitionState);
|
|
OnStateUpdate?.Invoke(this);
|
|
}
|
|
|
|
public void TransitionTo(IState from) => OnStateTransitionedTo?.Invoke(this, from);
|
|
public void TransitionFrom(IState to) => OnStateTransitionedFrom?.Invoke(this, to);
|
|
|
|
public IState? GetNextState()
|
|
{
|
|
foreach (StateTransition stateTransition in transitions)
|
|
if (stateTransition.CanTransition)
|
|
return stateTransition.State;
|
|
return null;
|
|
}
|
|
}
|