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()); } }; }