示例#1
0
        private void ProcessState(StateTimeline state, bool onInterrupt = false, bool autoIncrement = false, bool autoLoop = false)
        {
            while (true)
            {
                int realFrame = onInterrupt ? state.totalFrames + 1 : Mathf.Clamp(CurrentStateFrame, 0, state.totalFrames);
                foreach (var d in state.data)
                {
                    ProcessStateVariables(state, d, realFrame);
                }

                if (!state.useBaseState)
                {
                    break;
                }
                state = (StateTimeline)state.baseState;
            }

            if (onInterrupt != false || !autoIncrement)
            {
                return;
            }
            IncrementFrame(1);
            if (autoLoop && CurrentStateFrame > state.totalFrames)
            {
                SetFrame(1);
            }
        }
示例#2
0
        private void ProcessStateVariables(StateTimeline timeline, IStateVariables d, int realFrame)
        {
            var valid = true;

            for (int j = 0; j < d.FrameRanges.Length; j++)
            {
                if (!(realFrame < d.FrameRanges[j].x) &&
                    !(realFrame > d.FrameRanges[j].y))
                {
                    continue;
                }
                valid = false;
                break;
            }

            if (!valid)
            {
                return;
            }
            var varType = d.GetType();

            if (!conditionMapperBase.TryCondition(varType, fighterManager, d.Condition, timeline, realFrame))
            {
                return;
            }
            functionMapperBase.functions[varType](fighterManager, d, timeline, realFrame);

            foreach (var t in d.Children)
            {
                ProcessStateVariables(timeline, t, realFrame);
            }
        }
示例#3
0
        public bool ChangeState(int state, int moveset = -1, int stateFrame = 0, bool callOnInterrupt = true)
        {
            markedForStateChange = false;

            if (callOnInterrupt && CurrentState != (int)FighterStateEnum.NULL)
            {
                StateTimeline currentStateTimeline = GetState();
                SetFrame(currentStateTimeline.totalFrames + 1);
                ProcessState(currentStateTimeline, true);
            }

            CurrentStateFrame   = stateFrame;
            CurrentStateMoveset = moveset == -1 ? CurrentStateMoveset : moveset;
            CurrentState        = state;
            if (CurrentStateFrame == 0)
            {
                SetFrame(0);
                ProcessState(GetState());
                SetFrame(1);
            }

            return(true);
        }