using System;
namespace TEngine
{
///
/// 流程管理器。
///
internal sealed class ProcedureModule : Module, IProcedureModule
{
private IFsmModule _fsmModule;
private IFsm _procedureFsm;
///
/// 初始化流程管理器的新实例。
///
public ProcedureModule()
{
_fsmModule = null;
_procedureFsm = null;
}
///
/// 获取游戏框架模块优先级。
///
/// 优先级较高的模块会优先轮询,并且关闭操作会后进行。
public override int Priority => -2;
///
/// 获取当前流程。
///
public ProcedureBase CurrentProcedure
{
get
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
return (ProcedureBase)_procedureFsm.CurrentState;
}
}
///
/// 获取当前流程持续时间。
///
public float CurrentProcedureTime
{
get
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
return _procedureFsm.CurrentStateTime;
}
}
public override void OnInit()
{
}
///
/// 关闭并清理流程管理器。
///
public override void Shutdown()
{
if (_fsmModule != null)
{
if (_procedureFsm != null)
{
_fsmModule.DestroyFsm(_procedureFsm);
_procedureFsm = null;
}
_fsmModule = null;
}
}
///
/// 初始化流程管理器。
///
/// 有限状态机管理器。
/// 流程管理器包含的流程。
public void Initialize(IFsmModule fsmModule, params ProcedureBase[] procedures)
{
if (fsmModule == null)
{
throw new GameFrameworkException("FSM manager is invalid.");
}
_fsmModule = fsmModule;
_procedureFsm = _fsmModule.CreateFsm(this, procedures);
}
///
/// 开始流程。
///
/// 要开始的流程类型。
public void StartProcedure() where T : ProcedureBase
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
_procedureFsm.Start();
}
///
/// 开始流程。
///
/// 要开始的流程类型。
public void StartProcedure(Type procedureType)
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
_procedureFsm.Start(procedureType);
}
///
/// 是否存在流程。
///
/// 要检查的流程类型。
/// 是否存在流程。
public bool HasProcedure() where T : ProcedureBase
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
return _procedureFsm.HasState();
}
///
/// 是否存在流程。
///
/// 要检查的流程类型。
/// 是否存在流程。
public bool HasProcedure(Type procedureType)
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
return _procedureFsm.HasState(procedureType);
}
///
/// 获取流程。
///
/// 要获取的流程类型。
/// 要获取的流程。
public ProcedureBase GetProcedure() where T : ProcedureBase
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
return _procedureFsm.GetState();
}
///
/// 获取流程。
///
/// 要获取的流程类型。
/// 要获取的流程。
public ProcedureBase GetProcedure(Type procedureType)
{
if (_procedureFsm == null)
{
throw new GameFrameworkException("You must initialize procedure first.");
}
return (ProcedureBase)_procedureFsm.GetState(procedureType);
}
///
/// 重启流程。
/// 默认使用第一个流程作为启动流程。
///
/// 新的的流程。
/// 是否重启成功。
/// 重启异常。
public bool RestartProcedure(params ProcedureBase[] procedures)
{
if (procedures == null || procedures.Length <= 0)
{
throw new GameFrameworkException("RestartProcedure Failed procedures is invalid.");
}
if (!_fsmModule.DestroyFsm())
{
return false;
}
Initialize(_fsmModule, procedures);
StartProcedure(procedures[0].GetType());
return true;
}
}
}