state("CATO") { } startup { Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity"); vars.Helper.GameName = "CATO"; vars.Helper.LoadSceneManager = true; vars.Helper.AlertLoadless(); settings.Add("run_mode", true, "Category Type"); settings.Add("full_game", true, "Full Game Categories", "run_mode"); settings.Add("world_runs", false, "Individual World Categories", "run_mode"); settings.Add("IL_runs", false, "Individual Level Runs", "run_mode"); settings.SetToolTip("run_mode", "Only select one"); } init { vars.Helper.TryLoad = (Func)(mono => { var gp = mono["GameProgress"]; vars.Helper["lastLevel"] = gp.MakeString("lastLevelName"); var lt = mono["LevelTimer"]; vars.Helper["worldKey"] = lt.MakeString("WorldKey"); vars.Helper["levelTimer"] = lt.Make("LevelPastTime"); vars.Helper["worldTimer"] = lt.Make("WorldPastTime"); vars.Helper["speedrunTimer"] = lt.Make("SpeedRunPastTime"); vars.Helper["speedrunOn"] = lt.Make("IsSpeedRunOn"); return true; }); old.activeScene = current.activeScene = ""; old.loadingScene = current.loadingScene = ""; old.lastLevel = current.lastLevel = ""; old.worldKey = current.worldKey = ""; old.levelTimer = current.levelTimer = 0.0f; old.speedrunOn = current.speedrunOn = false; vars.IGT = 0.0f; vars.finalCutscene = false; vars.levelTimerPaused = false; vars.gameDone = false; } update { current.activeScene = vars.Helper.Scenes.Active.Name ?? old.activeScene; current.loadingScene = vars.Helper.Scenes.Loaded[0].Name ?? old.loadingScene; if (settings["full_game"]) { vars.IGT = current.speedrunTimer; }else if (settings["world_runs"]) { vars.IGT = current.worldTimer; }else if (settings["IL_runs"]) { vars.IGT = current.levelTimer; } // Check for final cutscene by watching for the level timer to pause for at least two updates if (vars.levelTimerPaused && current.activeScene == "L28" && current.worldKey == "W05") { vars.finalCutscene = true; } else { vars.finalCutscene = false; } // track if the timer is paused if (old.levelTimer.Equals(current.levelTimer)) { vars.levelTimerPaused = true; } else { vars.levelTimerPaused = false; vars.finalCutscene = false; } // Log Statements if(current.activeScene != old.activeScene || current.loadingScene != old.loadingScene) { vars.Log("Old to Current Active: " + old.activeScene + " -> " + current.activeScene); vars.Log("Old to Current Loading: " + old.loadingScene + " -> " + current.loadingScene); } if (current.lastLevel != old.lastLevel) { vars.Log("Old to Current Last Level: " + old.lastLevel + " -> " + current.lastLevel); } if (current.worldKey != old.worldKey) { vars.Log("Old to Current World Key: " + old.worldKey + " -> " + current.worldKey); } } start { return vars.IGT >= 0.1 && vars.IGT < 0.2 && current.speedrunOn; } reset { return vars.IGT < 0.1; } onStart { vars.finalCutscene = false; vars.levelTimerPaused = false; vars.gameDone = false; } split { // Split on after clearing world 1 through 4 final map if (((current.worldKey == "W01" && current.lastLevel == "L23") || (current.worldKey == "W02" && current.lastLevel == "L37") || (current.worldKey == "W03" && current.lastLevel == "L26") || (current.worldKey == "W04" && current.lastLevel == "L27")) && old.activeScene == "Cato Loading Screen" && current.activeScene == "World Base") { return true; } // Split when the final cutscene starts if (vars.finalCutscene && !vars.gameDone) { vars.gameDone = true; return true; } // Otherwise, split when a new level starts return (current.lastLevel != old.lastLevel && old.lastLevel != ""); } isLoading { return true; } gameTime { return TimeSpan.FromSeconds(vars.IGT); }