state("Shirone the Dragon Girl") { } startup { // Load asl-help binary and instantiate it // Will inject code into the asl in the background Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity"); // Set the helper to load the scene manager, you probably want this // (the helper is set at vars.Helper automagically) // vars.Helper.LoadSceneManager = true; // Add settings settings.Add("Stage 1"); settings.Add("Stage 1_Savepoint 1-1", true, "Part 1", "Stage 1"); settings.Add("Stage 1_Savepoint 1-2", true, "Part 2", "Stage 1"); settings.Add("Stage 2"); settings.Add("Stage 2_Savepoint 2-1", true, "Part 1", "Stage 2"); settings.Add("Stage 2_Savepoint 2-2", true, "Part 2", "Stage 2"); settings.Add("Stage 2_Savepoint Hall-1", true, "Part 3", "Stage 2"); settings.Add("Stage 3"); settings.Add("Stage 3_Savepoint 1-1", true, "Part 1", "Stage 3"); settings.Add("Stage 3_Savepoint 1-2", true, "Part 2", "Stage 3"); settings.Add("Loop 2"); settings.Add("Stage Start_Savepoint Start-2", true, "Part 1", "Loop 2"); settings.Add("Stage 1_Savepoint 1-3", true, "Part 2", "Loop 2"); settings.Add("Stage 4"); settings.Add("Stage 4_Savepoint 4-1", true, "Part 1", "Stage 4"); settings.Add("Stage 4_Savepoint 4-2", true, "Part 2", "Stage 4"); settings.Add("Stage 4_Savepoint Hall-2", true, "Part 3", "Stage 4"); settings.Add("Stage 5"); settings.Add("Stage 5_Savepoint 5-1", true, "Part 1", "Stage 5"); settings.Add("Stage 5_Savepoint 5-2", true, "Part 2", "Stage 5"); settings.Add("Stage 5_Savepoint 5-3", true, "Part 3", "Stage 5"); settings.Add("Stage 5_Savepoint 5-4", true, "Part 4", "Stage 5"); settings.Add("Stage 6_Savepoint 6-1", true, "Stage 6"); settings.Add("Loop 3"); settings.Add("Stage Start_Savepoint Start-3", true, "Part 1", "Loop 3"); settings.Add("Stage 1_Savepoint 1-4", true, "Part 2", "Loop 3"); settings.Add("Stage Archives_Savepoint Archives-1", true, "Archives 1"); settings.Add("Stage 7"); settings.Add("Stage 7_Savepoint 7-1", true, "Part 1", "Stage 7"); settings.Add("Stage 7_Savepoint 7-2", true, "Part 2", "Stage 7"); settings.Add("Stage 7_Savepoint 7-3", true, "Part 3", "Stage 7"); settings.Add("Stage 7_Savepoint 7-4", true, "Part 4", "Stage 7"); settings.Add("Stage 8"); settings.Add("Stage 8_Savepoint 8-1", true, "Part 1", "Stage 8"); settings.Add("Stage 8_Savepoint 8-2", true, "Part 2", "Stage 8"); settings.Add("Stage 8_Savepoint 8-3", true, "Part 3", "Stage 8"); settings.Add("Stage 8_Savepoint 8-4", true, "Part 4", "Stage 8"); settings.Add("Stage 8_Savepoint 8-5", true, "Part 5", "Stage 8"); settings.Add("Stage 8_Savepoint Archives-3", true, "Archives 2"); settings.Add("Stage 9"); settings.Add("Stage 9_Savepoint 9-1", true, "Part 1", "Stage 9"); settings.Add("Stage 9_Savepoint 9-2", true, "Part 2", "Stage 9"); settings.Add("Stage 9_Savepoint 9-3", true, "Part 3", "Stage 9"); settings.Add("Stage 9_Savepoint 9-4", true, "Part 4", "Stage 9"); settings.Add("Stage 10"); settings.Add("Stage 10_Savepoint 10-1", true, "Part 1", "Stage 10"); settings.Add("Stage 10_Savepoint 10-2", true, "Part 2", "Stage 10"); settings.Add("Stage 10_Savepoint 10-3", true, "Part 3", "Stage 10"); settings.Add("Stage 10_Savepoint 10-4", true, "Part 4", "Stage 10"); settings.Add("Stage 11_Savepoint 11-1", true, "Stage 6"); settings.Add("Stage 12"); settings.Add("Stage 12_Savepoint 12-1", true, "Part 1", "Stage 12"); settings.Add("Stage 12_Savepoint 12-2", true, "Part 2", "Stage 12"); settings.Add("Stage 12_Savepoint 12-3", true, "Part 3", "Stage 12"); settings.Add("Stage 12_Savepoint 12-4", true, "Part 4", "Stage 12"); settings.Add("Stage 12_Savepoint Archives-2", true, "Archives 3"); settings.Add("Stage 13_Savepoint 13-1", true, "Stage 13"); settings.Add("Stage 14_Savepoint 14-1", true, "Stage 14"); settings.Add("Stage 15"); settings.Add("Stage 15_Savepoint 15-1", true, "Part 1", "Stage 15"); settings.Add("Stage 15_Savepoint 15-2", true, "Part 2", "Stage 15"); settings.Add("Stage 15_Savepoint 15-3", true, "Part 3", "Stage 15"); } init { // This is where we will load custom properties from the code, empty for now vars.Helper.TryLoad = (Func)(mono => { vars.Helper["stageName"] = mono.MakeString( "GameState", 1, "instance", "stageName" ); vars.Helper["checkpointName"] = mono.MakeString( "GameState", 1, "instance", "checkpointName" ); vars.Helper["currentChapter"] = mono.Make( "GameState", 1, "instance", "currentChapter" ); vars.Helper["isCutscenePlaying"] = mono.Make( "TimelineManager", 1, "instance", "isPlaying" ); vars.Helper["isTitleScreen"] = mono.Make( "GameManager", 1, "instance", "isTitle" ); vars.Helper["isLoadingScreen"] = mono.Make( "ScreenLoadScene", 1, "instance", "screen", 0x10, 0x57 ); return true; }); // Savepoints map vars.savepointsMap = new Dictionary, int> { // Start 1 // Stage 1 { Tuple.Create("Stage 1", "Savepoint 1-1"), 101 }, { Tuple.Create("Stage 1", "Savepoint 1-2"), 102 }, // Stage 2 { Tuple.Create("Stage 2", "Savepoint 2-1"), 201 }, { Tuple.Create("Stage 2", "Savepoint 2-2"), 202 }, { Tuple.Create("Stage 2", "Savepoint Hall-1"), 203 }, // Stage 3 { Tuple.Create("Stage 3", "Savepoint 1-1"), 301 }, { Tuple.Create("Stage 3", "Savepoint 1-2"), 302 }, // Start 2 { Tuple.Create("Stage Start", "Savepoint Start-2"), 401 }, // Stage 1 (again) { Tuple.Create("Stage 1", "Savepoint 1-3"), 501 }, // Stage 4 { Tuple.Create("Stage 4", "Savepoint 4-1"), 601 }, { Tuple.Create("Stage 4", "Savepoint 4-2"), 602 }, { Tuple.Create("Stage 4", "Savepoint Hall-2"), 603 }, // Stage 5 { Tuple.Create("Stage 5", "Savepoint 5-1"), 701 }, { Tuple.Create("Stage 5", "Savepoint 5-2"), 702 }, { Tuple.Create("Stage 5", "Savepoint 5-3"), 703 }, { Tuple.Create("Stage 5", "Savepoint 5-4"), 704 }, // Stage 6 { Tuple.Create("Stage 6", "Savepoint 6-1"), 801 }, // Start 3 { Tuple.Create("Stage Start", "Savepoint Start-3"), 901 }, // Stage 1 (again again) { Tuple.Create("Stage 1", "Savepoint 1-4"), 1001 }, // Archives 1 { Tuple.Create("Stage Archives", "Savepoint Archives-1"), 1101 }, // Stage 7 { Tuple.Create("Stage 7", "Savepoint 7-1"), 1201 }, { Tuple.Create("Stage 7", "Savepoint 7-2"), 1202 }, { Tuple.Create("Stage 7", "Savepoint 7-3"), 1203 }, { Tuple.Create("Stage 7", "Savepoint 7-4"), 1204 }, // Stage 8 { Tuple.Create("Stage 8", "Savepoint 8-1"), 1301 }, { Tuple.Create("Stage 8", "Savepoint 8-2"), 1302 }, { Tuple.Create("Stage 8", "Savepoint 8-3"), 1303 }, { Tuple.Create("Stage 8", "Savepoint 8-4"), 1304 }, { Tuple.Create("Stage 8", "Savepoint 8-5"), 1305 }, // Archives 3 { Tuple.Create("Stage 8", "Savepoint Archives-3"), 1401 }, // Stage 9 { Tuple.Create("Stage 9", "Savepoint 9-1"), 1501 }, { Tuple.Create("Stage 9", "Savepoint 9-2"), 1502 }, { Tuple.Create("Stage 9", "Savepoint 9-3"), 1503 }, { Tuple.Create("Stage 9", "Savepoint 9-4"), 1504 }, // Stage 10 { Tuple.Create("Stage 10", "Savepoint 10-1"), 1601 }, { Tuple.Create("Stage 10", "Savepoint 10-2"), 1602 }, { Tuple.Create("Stage 10", "Savepoint 10-3"), 1603 }, { Tuple.Create("Stage 10", "Savepoint 10-4"), 1604 }, // Stage 11 { Tuple.Create("Stage 11", "Savepoint 11-1"), 1701 }, // Stage 12 { Tuple.Create("Stage 12", "Savepoint 12-1"), 1801 }, { Tuple.Create("Stage 12", "Savepoint 12-2"), 1802 }, { Tuple.Create("Stage 12", "Savepoint 12-3"), 1803 }, { Tuple.Create("Stage 12", "Savepoint 12-4"), 1804 }, // Archives 2 { Tuple.Create("Stage 12", "Savepoint Archives-2"), 1901 }, // Stage 13 { Tuple.Create("Stage 13", "Savepoint 13-1"), 2001 }, // Stage 14 { Tuple.Create("Stage 14", "Savepoint 14-1"), 2101 }, // Stage 15 { Tuple.Create("Stage 15", "Savepoint 15-1"), 2201 }, { Tuple.Create("Stage 15", "Savepoint 15-2"), 2202 }, { Tuple.Create("Stage 15", "Savepoint 15-3"), 2203 }, }; // Logic variables vars.savepointIndex = 0; vars.startScene = false; vars.reachedEnd = false; } split { if (current.stageName != old.stageName || current.checkpointName != old.checkpointName) { int targetIndex; if (vars.savepointsMap.TryGetValue(Tuple.Create(current.stageName, current.checkpointName), out targetIndex)) { // Only split if player is progressing (does not count going backwards) // This logic also allow "skips" by skipping savepoints if (vars.savepointIndex < targetIndex) { vars.savepointIndex = targetIndex; // Split if corresponding setting is enabled if (settings[current.stageName + "_" + current.checkpointName]) { return true; } } } } // Last split if (!vars.reachedEnd && current.stageName == "Stage 15" && current.checkpointName == "Savepoint 15-3" && current.isCutscenePlaying) { vars.reachedEnd = true; return true; } } start { // Find new game start if (current.stageName != old.stageName || current.checkpointName != old.checkpointName) { if (current.stageName == "Stage Start" && current.checkpointName == "Savepoint Start-1") { vars.startScene = true; } } // Wait for first cutscene to end (goes from isCutscenePlaying True -> False) if (vars.startScene && (old.isCutscenePlaying && !current.isCutscenePlaying)) { return true; } } isLoading { return current.isLoadingScreen; } reset { if (current.isTitleScreen && !old.isTitleScreen) { return true; } } onStart { vars.savepointIndex = 0; vars.startScene = false; vars.reachedEnd = false; } onReset { vars.savepointIndex = 0; vars.startScene = false; vars.reachedEnd = false; }