feat: added basic state machine system & Engine.Systems class library
This commit is contained in:
52
Engine.Systems/StateMachine/State.cs
Normal file
52
Engine.Systems/StateMachine/State.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user