using System.Collections.Generic; using System.Reflection; using Godot; using Godot.Collections; namespace Cirno.Scripts.Components.FSM; public abstract partial class BaseState : Node2D, IState where TKey : notnull where TType : Node { public virtual TKey StateId { get; } public IStateMachine StateMachine => _stateMachine; private IStateMachine _stateMachine; public TType MainObject => _stateMachine.MainObject; [Export] private Array _moduleNodes = []; private readonly List> _modules = []; public virtual void Init(IStateMachine machine) { _stateMachine = machine; foreach (var node in _moduleNodes) { if (node is IModule module) { _modules.Add(module); module.Init(_stateMachine); } } } public abstract void EnterState(); public abstract void ExitState(); public virtual void ProcessState(double delta) { _modules.ForEach(module => module.Process(delta)); } public virtual void PhysicsProcessState(double delta) { _modules.ForEach(module => module.PhysicsProcess(delta)); } }