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 transitions = []; private readonly Dictionary possibleTransitions = []; public string Name { get; set; } = "Default State Name"; public IReadOnlyList Transitions => transitions; public IReadOnlyDictionary 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; } }