feat: serialized state machine & states

This commit is contained in:
Syntriax 2025-04-30 19:20:45 +03:00
parent d2ca85568f
commit bd5eb432b7
4 changed files with 36 additions and 6 deletions

View File

@ -1,14 +1,14 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.StateMachine;
public interface IState
public interface IState : IEntity, INameable
{
event StateUpdateEventHandler? OnStateUpdate;
event StateTransitionedFromEventHandler? OnStateTransitionedFrom;
event StateTransitionedToEventHandler? OnStateTransitionedTo;
event StateTransitionReadyEventHandler? OnStateTransitionReady;
string Name { get; }
IState? GetNextState();
void Update();

View File

@ -2,19 +2,33 @@ using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.StateMachine;
public class State : IState
public class State : BaseEntity, 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;
public event INameable.NameChangedEventHandler? OnNameChanged = null;
private readonly List<StateTransition> transitions = [];
private readonly Dictionary<string, StateTransition> possibleTransitions = [];
private string _name = "Default State Name";
public string Name { get; set; } = "Default State Name";
public IReadOnlyList<StateTransition> Transitions => transitions;
public IReadOnlyDictionary<string, StateTransition> PossibleTransitions => possibleTransitions;
public string Name
{
get => _name;
set
{
if (_name.CompareTo(value) == 0)
return;
string previousName = _name;
_name = value;
OnNameChanged?.Invoke(this, previousName);
}
}
public void RemoveTransition(string name)
{

View File

@ -7,10 +7,24 @@ public abstract class StateBehaviourBase : Behaviour, IState
public event IState.StateUpdateEventHandler? OnStateUpdate = null;
public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null;
public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null;
public event INameable.NameChangedEventHandler? OnNameChanged = null;
public abstract event IState.StateTransitionReadyEventHandler? OnStateTransitionReady;
public abstract string Name { get; }
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, previousName);
}
}
protected virtual void OnUpdateState() { }
public void Update()

View File

@ -1,4 +1,5 @@
using Syntriax.Engine.Core;
using Syntriax.Engine.Core.Serialization;
namespace Syntriax.Engine.Systems.StateMachine;
@ -7,6 +8,7 @@ public class StateMachine : Behaviour
public event StateChangedEventHandler? OnStateChanged = null;
private IState _state = new State();
[Serialize]
public IState State
{
get => _state;