private static void Load()
        {
            Manager.controller.AdvanceFrame(true);
            if (savedController != null &&
                savedController.SavedChecksum == Manager.controller.Checksum(savedController.CurrentFrame))
            {
                //Fastforward to breakpoint if one exists
                var fastForwards = Manager.controller.fastForwards;
                if (fastForwards.Count > 0 && fastForwards[fastForwards.Count - 1].Line > savedController.Current.Line)
                {
                    Manager.state     &= ~State.FrameStep;
                    Manager.nextState &= ~State.FrameStep;
                }
                else
                {
                    //InputRecord ff = new InputRecord(0, "***");
                    //savedController.fastForwards.Insert(0, ff);
                    //savedController.inputs.Insert(savedController.inputs.IndexOf(savedController.Current) + 1, ff);
                }

                Engine.Scene.OnEndOfFrame += () => {
                    if (!StateManager.Instance.LoadState())
                    {
                        return;
                    }
                    if (!Manager.Running)
                    {
                        Manager.EnableExternal();
                    }
                    savedController.inputs = Manager.controller.inputs;
                    Manager.controller     = savedController.Clone();
                    routine = new Coroutine(LoadStateRoutine());
                };
                return;
            }
            //If savestate load failed just playback normally
            Manager.DisableExternal();
            Manager.EnableExternal();
        }
        private static void LoadStateRoutine()
        {
            Controller = savedController.Clone();
            Controller.RefreshInputs(false);
            // Some fields were reset by RefreshInputs(false), so we need restore it.
            Controller.FfIndex = savedController.FfIndex;
            for (int i = 0; i < savedController.FastForwards.Count && i < Controller.FastForwards.Count; i++)
            {
                if (savedController.FastForwards[i].HasSavedState)
                {
                    Controller.FastForwards[i].HasSavedState = true;
                    break;
                }
            }

            SetTasState();
            AnalogHelper.AnalogModeChange(savedAnalogueMode, savedAnalogueLimit);
            PlayerStatus        = savedPlayerStatus;
            LastPos             = savedLastPos;
            LastPlayerSeekerPos = savedLastPlayerSeekerPos;
            UpdateStudio();
        }
        private static void Save()
        {
            InputController temp = Manager.controller.Clone();

            //+1 speedrun tool, -5 buffered inputs
            temp.ReverseFrames(4);
            Engine.Scene.OnEndOfFrame += () => {
                if (StateManager.Instance.SaveState())
                {
                    savedController    = temp;
                    Manager.controller = savedController.Clone();

                    /*
                     * List<VirtualInput> inputs = (List<VirtualInput>)
                     *      typeof(MInput).GetField("VirtualInputs", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
                     * foreach (VirtualInput input in inputs) {
                     *      if (input is VirtualButton)
                     *              savedBuffers.Add((float)input.GetPrivateField("bufferCounter"));
                     * }
                     */
                    routine = new Coroutine(LoadStateRoutine());
                }
            };
        }