/*
文件名:StateMachineClass.nut
路径:User/Object/StateMachine/StateMachineClass.nut
创建日期:2024-11-29	23:14
文件用途:状态机
*/
class FiniteStateMachineClass {

    //状态
    State = -1;
    //状态时间
    StateTime = 0;

    //状态注册组
    StateFuncArr = null;
    //条件注册组
    ConditionStateArr = null;

    constructor() {
        //初始化
        StateFuncArr = {};
        //初始化
        ConditionStateArr = {};
    }

    //状态检查
    function OnCheck(gState) {
        if ("OnCheck" in StateFuncArr[gState]) {
            local Flag = StateFuncArr[gState].OnCheck();
            if (Flag) return Flag;
            else return false;
        } else return true;
    }

    //状态进入
    function OnStart() {
        if ("OnStart" in StateFuncArr[State]) StateFuncArr[State].OnStart();
    }

    //状态退出
    function OnEnd() {
        if ("OnEnd" in StateFuncArr[State]) StateFuncArr[State].OnEnd();
    }

    //状态中全帧
    function OnProc(dt) {
        if ("OnProc" in StateFuncArr[State]) StateFuncArr[State].OnProc(dt, StateTime);
    }

    //状态中144
    function OnProcFrom144(MillisecondsDuration) {
        if ("OnProcCon" in StateFuncArr[State]) StateFuncArr[State].OnProcCon(MillisecondsDuration);
        foreach(Key, Func in ConditionStateArr) {
            if (Func()) ChangeState(Key);
        }
    }

    //注册普通状态
    function RegisterStaticState(StateIndex, T) {
        StateFuncArr.rawset(StateIndex, T);
    }

    //注册条件状态
    function RegisterConditionState(StateIndex, Func) {
        ConditionStateArr.rawset(StateIndex, Func);
    }

    //更改状态
    function ChangeState(StateIndex) {
        //判断有这个状态才执行
        if (StateIndex in StateFuncArr) {
            //如果有检查 先调用检查
            local Flag = OnCheck(StateIndex);
            //如果Flag成立
            if (Flag) {
                //如果自身状态不等于-1
                if (State != -1) {
                    //调用状态退出
                    OnEnd();
                }
                //更新状态
                State = StateIndex;
                //重置状态时间
                StateTime = 0;

                //调用状态进入
                OnStart();
                return true;
            } else return false;
        } else return false;
    }

    //Ani播放KeyFlag
    function ChangeAniKeyFlag(Index) {
        if ("OnAniKeyFlag" in StateFuncArr[State]) StateFuncArr[State].OnAniKeyFlag(Index);
    }

    //Ani播放完成回调
    function ChangeAniEndFlag() {
        if ("OnAniEndFlag" in StateFuncArr[State]) StateFuncArr[State].OnAniEndFlag();
    }

    //攻击到目标的回调
    function ChangeOnAttack(Damager) {
        if ("OnAttack" in StateFuncArr[State]) StateFuncArr[State].OnAttack(Damager);
    }

    //状态机持续执行函数 144帧
    function OnUpdateFrom144(MillisecondsDuration) {
        //如果自身状态不等于-1
        if (State != -1) {
            //状态中144
            OnProcFrom144(MillisecondsDuration);
        }
    }

    //状态机持续执行函数
    function OnUpdate(dt) {
        StateTime += dt;
        //如果自身状态不等于-1
        if (State != -1) {
            //状态中
            OnProc(dt);
        }
    }
}