using System.Collections.Generic;
using ColdMint.scripts.debug;
namespace ColdMint.scripts.stateMachine;
///
/// State machine template
/// 状态机模板
///
public abstract class StateMachineTemplate : IStateMachine
{
private StateContext? _context;
private IStateProcessor? _activeStatusrocessor;
public StateContext? Context
{
get => _context;
set
{
if (value == null)
{
return;
}
if (_context != null)
{
_context.OnStateChange -= OnStateChange;
}
_context = value;
value.OnStateChange += OnStateChange;
}
}
private bool _isRunning;
private Dictionary? _processors;
public bool IsRunning => _isRunning;
///
/// When the state in the context changes
/// 当上下文内的状态改变时
///
///
///
private void OnStateChange(State oldState, State newState)
{
if (_context == null)
{
LogCat.LogError("state_machine_does_not_specify_context", label: LogCat.LogLabel.StateMachineTemplate);
return;
}
if (_processors == null)
{
LogCat.LogError("state_machine_does_not_specify_processor", label: LogCat.LogLabel.StateMachineTemplate);
return;
}
if (_processors.TryGetValue(oldState, out var processor))
{
processor.Exit(_context);
}
if (_processors.TryGetValue(newState, out processor))
{
processor.Enter(_context);
_activeStatusrocessor = processor;
}
else
{
LogCat.LogErrorWithFormat("state_processor_not_found", label: LogCat.LogLabel.StateMachineTemplate,
newState);
}
}
///
/// Registration status handler
/// 注册状态处理器
///
///
protected void RegisterProcessor(IStateProcessor processor)
{
_processors ??= new Dictionary();
if (!_processors.TryAdd(processor.State, processor))
{
LogCat.LogError("state_processor_already_registered", label: LogCat.LogLabel.StateMachineTemplate);
}
}
public void Start()
{
if (_isRunning)
{
LogCat.LogError("try_to_open_state_machine_that_is_on", label: LogCat.LogLabel.StateMachineTemplate);
return;
}
if (Context == null)
{
LogCat.LogError("state_machine_does_not_specify_context", label: LogCat.LogLabel.StateMachineTemplate);
return;
}
OnStart(Context);
_activeStatusrocessor = _processors?[Context.CurrentState];
_isRunning = true;
}
///
/// When the state machine is turned on
/// 在状态机开启时
///
///
///Register the status handler in this method.
///请在此方法内注册状态处理器。
///
protected abstract void OnStart(StateContext context);
///
/// When the state switch is off
/// 在状态机关闭时
///
protected virtual void OnStop()
{
}
public void Stop()
{
if (!_isRunning)
{
return;
}
_isRunning = false;
OnStop();
}
public void Execute()
{
if (!_isRunning)
{
return;
}
if (Context == null)
{
LogCat.LogError("state_machine_does_not_specify_context", label: LogCat.LogLabel.StateMachineTemplate);
return;
}
if (_activeStatusrocessor == null)
{
LogCat.LogError("state_machine_does_not_specify_active_processor",
label: LogCat.LogLabel.StateMachineTemplate);
return;
}
_activeStatusrocessor.Execute(Context);
}
}