private void InputManager_Update(On.InputManager.orig_Update orig, InputManager self) { // Do the recording, pausing, resetting, and playing here. // Updates the state UpdateState(); // Performs an action depending on the state if (SingletonManager.Get <Dungeon>(false) == null) { // We don't have a Dungeon to work with yet! // This should be removed soon and instead of having levels, have time stamps or something else. // That would allow for TAS in menus (without a Dungeon) orig(self); return; } int level = SingletonManager.Get <Dungeon>(false).Level; if (HasFlag(State.Pausing)) { // Need to find some way of doing standard processing except for actually updating the game } if (HasFlag(State.Playing) && !HasFlag(State.Pausing)) { // Read Inputs from file/RAM and perform them if (TASInput.HasNext(level)) { TASInputPlayer.Update(TASInput.GetNext(level)); mod.Log("Playing input: " + TASInputPlayer.Current); } else { mod.Log("Completed input playback!"); ToggleState(State.Playing); } } if (HasFlag(State.Recording)) { // Read Inputs from real action into file/RAM // Assumes the current level exists. TASInput.CreateAndAdd(level); // Also make sure that the seed is correctly set mod.Log("Recording input: " + TASInput.inputs[level][TASInput.inputs[level].Count - 1].ToString()); // TODO: REMOVE LINE BELOW ToggleState(State.Recording); } if (HasFlag(State.Saving)) { // Save the current floor as a start point (somehow) // Probably just save the SeedData and do a "generateForLevel" or something SaveKey = GameSave.GenerateSaveKey(); SingletonManager.Get <Dungeon>(false).SaveGameData(SaveKey); mod.Log("Saved Key: " + SaveKey + " saved successfully!"); ToggleState(State.Saving); } if (HasFlag(State.SavingToFile)) { // Assume the Dungeon exists, use it to determine the level to write the TAS for. mod.Log("Writing files with *" + tasFileExtensionWrapper.Value); TASIO.WriteTAS(TASInput.inputs, tasFileExtensionWrapper.Value); ToggleState(State.SavingToFile); } if (HasFlag(State.ReadingFromFiles)) { // Don't assume that the Dungeon exists, but read the many information things from the TAS file. // The trick with this is that the seed also needs to be read. TASInput.Clear(); mod.Log("Reading from *" + tasFileExtensionWrapper.Value + " files..."); foreach (string file in System.IO.Directory.GetFiles(".", "*" + tasFileExtensionWrapper.Value)) { // Let's just load all of the info into the TASInput RAM mod.Log("Reading file: " + file); TASIO.ReadTAS(file); } ToggleState(State.ReadingFromFiles); } if (HasFlag(State.Resetting)) { // Reset to the current save point (whatever floor it is) // Probably just do a "generateForLevel" or something (make the game think the data was saved in a certain way) mod.Log("Attempting to load SaveKey: " + SaveKey); if (SaveKey.Length > 0) { // Only now can we load valid data. mod.Log("Preparing Dungeon for SaveKey!"); Dungeon.PrepareForSavedGame(SaveKey, false); } ToggleState(State.Resetting); } if (HasFlag(State.Clearing)) { // Clear the data for this level TASInput.ClearForLevel(level); mod.Log("Cleared all TAS data for level: " + level); ToggleState(State.Clearing); } orig(self); }