public static void Update(TASInput next) { Last = Current; Current = next; if (Last == null) { Last = TASInput.Empty; } }
private IEnumerator DungeonGenerator2_GenerateDungeonCoroutine(On.DungeonGenerator2.orig_GenerateDungeonCoroutine orig, DungeonGenerator2 self, int level, Amplitude.StaticString shipName) { SeedData seeds = TASInput.seeds.GetSeedForShipLevel(shipName, level); if (seeds != null) { // Then we need to set the seed accordingly! seeds.SetSeedData(); mod.Log("Set seed to: " + seeds + " for level: " + level); } else { // Add the seed! SeedData data = new SeedData(); mod.Log("Creating new SeedData for level: " + level + " with data: " + data); TASInput.AddSeed(level, data); } yield return(orig(self, level, shipName)); }
public static void ReadTAS(string path) { string[] lines = System.IO.File.ReadAllLines(path); int level = -1; foreach (string s in lines) { if (s.StartsWith("#")) { continue; } if (s.StartsWith(":")) { string[] spl = s.Split(':'); level = Convert.ToInt32(spl[1]); TASInput.AddSeed(level, new SeedData(spl[2])); continue; } TASInput i = new TASInput(level, s); } }
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); }