diff options
-rw-r--r-- | Manifold Garden.asl | 56 |
1 files changed, 26 insertions, 30 deletions
diff --git a/Manifold Garden.asl b/Manifold Garden.asl index 227656e..a7d7778 100644 --- a/Manifold Garden.asl +++ b/Manifold Garden.asl | |||
@@ -1,14 +1,9 @@ | |||
1 | // AutoSplit script for Manifold Garden 1.0.30.14704 | 1 | // AutoSplit script for Manifold Garden 1.0.30.14704 |
2 | // | 2 | // |
3 | // Written by hatkirby, with a lot of help from preshing and Gelly. | 3 | // Written by hatkirby, with help from preshing and Gelly. |
4 | // | 4 | // |
5 | // Automatically starts the timer ~2.4 seconds after starting a new game, and splits the timer | 5 | // Automatically starts the timer when a new game is started. You must still reset the timer |
6 | // when transitioning between game levels. You must still reset the timer manually between runs. | 6 | // manually between runs. |
7 | // If you accidentally backtrack through a portal, causing an unwanted split, you'll have | ||
8 | // to undo it manually (default NumPad8 in LiveSplit). | ||
9 | // | ||
10 | // To compensate for the late start, you should delay your start timer by 2.4 seconds in LiveSplit. | ||
11 | // (Right-click -> Edit Splits -> Start timer at:) | ||
12 | // | 7 | // |
13 | // A split is also triggered after being in one of the ending cutscenes for 1.1 seconds, | 8 | // A split is also triggered after being in one of the ending cutscenes for 1.1 seconds, |
14 | // since this is when the kaleidoscope appears. | 9 | // since this is when the kaleidoscope appears. |
@@ -25,23 +20,16 @@ | |||
25 | // https://technet.microsoft.com/en-us/Library/bb896647.aspx | 20 | // https://technet.microsoft.com/en-us/Library/bb896647.aspx |
26 | 21 | ||
27 | state("ManifoldGarden") { | 22 | state("ManifoldGarden") { |
28 | // This pointer path seems to work with Manifold Garden 1.1.0.14704 (2020-11-09): | 23 | // These pointer paths seem to work with Manifold Garden 1.1.0.14704 (2020-11-09): |
29 | int level: "UnityPlayer.dll", 0x01800AB8, 0x10, 0xB8, 0x10, 0x28, 0x18, 0x60, 0x7CC; | 24 | int level: "UnityPlayer.dll", 0x01800AB8, 0x10, 0xB8, 0x10, 0x28, 0x18, 0x60, 0x7CC; |
25 | bool transitionFadeHeld: "UnityPlayer.dll", 0x017945A8, 0x80, 0x10, 0x48, 0xA0, 0x10, 0xE40; | ||
26 | bool isLoadingGameFromUI: "UnityPlayer.dll", 0x017945A8, 0x90, 0x100, 0xC0, 0xC0, 0xC0, 0xC0, 0xDC1; | ||
30 | 27 | ||
31 | // This pointer path seems to work with Manifold Garden 1.0.30.13294 (2020-02-25): | 28 | // Older pointer paths: |
32 | //int level: "UnityPlayer.dll", 0x014BE300, 0x60, 0xA8, 0x38, 0x30, 0xB0, 0x118, 0x5C; | 29 | //int level: "UnityPlayer.dll", 0x014BE300, 0x60, 0xA8, 0x38, 0x30, 0xB0, 0x118, 0x5C; // 1.0.30.13294 (2020-02-25) |
33 | 30 | //int level: "UnityPlayer.dll", 0x01552858, 0x8, 0x0, 0xB8, 0x80, 0x80, 0x28, 0x5C; // 13294 | |
34 | // These ones also seem to work with version 13294, and can be tried as backups in case | 31 | //int level: "UnityPlayer.dll", 0x01552858, 0x28, 0x8, 0xB8, 0x80, 0x80, 0x28, 0x5C; // 13294 |
35 | // the one above stops working: | 32 | //int level: "UnityPlayer.dll", 0x01507BE0, 0x0, 0x928, 0x38, 0x30, 0xB0, 0x118, 0x5C; // 1.0.29.12904 (2020-02-??), 1.0.29.12830 (2019-12-18), 1.0.29.12781 (2019-12-11) |
36 | //int level: "UnityPlayer.dll", 0x01552858, 0x8, 0x0, 0xB8, 0x80, 0x80, 0x28, 0x5C; | ||
37 | //int level: "UnityPlayer.dll", 0x01552858, 0x28, 0x8, 0xB8, 0x80, 0x80, 0x28, 0x5C; | ||
38 | |||
39 | // This pointer path worked with Manifold Garden 1.0.29.12904 (2020-02-??) | ||
40 | // & Manifold Garden 1.0.29.12830 (2019-12-18) | ||
41 | // & Manifold Garden 1.0.29.12781 (2019-12-11): | ||
42 | //int level: "UnityPlayer.dll", 0x01507BE0, 0x0, 0x928, 0x38, 0x30, 0xB0, 0x118, 0x5C; | ||
43 | |||
44 | // This pointer path worked with older versions: | ||
45 | //int level: "UnityPlayer.dll", 0x01507C68, 0x8, 0x38, 0xA8, 0x58, 0x118, 0x5C; | 33 | //int level: "UnityPlayer.dll", 0x01507C68, 0x8, 0x38, 0xA8, 0x58, 0x118, 0x5C; |
46 | } | 34 | } |
47 | 35 | ||
@@ -54,7 +42,7 @@ startup { | |||
54 | vars.seqIndex = 0; | 42 | vars.seqIndex = 0; |
55 | vars.stopwatch = null; // Used for the final split | 43 | vars.stopwatch = null; // Used for the final split |
56 | vars.prev = new List<int>(); | 44 | vars.prev = new List<int>(); |
57 | vars.prev.Add(9); | 45 | vars.firstRoom = false; |
58 | } | 46 | } |
59 | 47 | ||
60 | init { | 48 | init { |
@@ -72,26 +60,31 @@ update { | |||
72 | } | 60 | } |
73 | 61 | ||
74 | start { | 62 | start { |
75 | if (old.level == -1 && current.level == 9) { | 63 | // Start the timer as soon as a game is being loaded (specifically the moment you click |
64 | // a save slot to start a new game in, although it will also start if you just load a file). | ||
65 | // This boolean is set to true during the studio logo when the game starts up, so we check | ||
66 | // for that as well. | ||
67 | if (current.transitionFadeHeld && current.isLoadingGameFromUI) { | ||
76 | print(String.Format("Level changed from {0} to {1}: START", old.level, current.level)); | 68 | print(String.Format("Level changed from {0} to {1}: START", old.level, current.level)); |
77 | if (settings["zero"]) { | 69 | if (settings["zero"]) { |
78 | vars.waypoints = new List<int>{106, 17, 110, 115, 111, 36, 44}; | 70 | vars.waypoints = new List<int>{106, 17, 110, 115, 111, 36, 44}; |
79 | } else { | 71 | } else { |
80 | vars.waypoints = null; | 72 | vars.waypoints = null; |
81 | } | 73 | } |
82 | vars.prevLevel = 9; | 74 | vars.prevLevel = current.level; |
83 | vars.seqIndex = 0; | 75 | vars.seqIndex = 0; |
84 | vars.stopwatch = Stopwatch.StartNew(); | 76 | vars.stopwatch = Stopwatch.StartNew(); |
85 | vars.prev.Clear(); | 77 | vars.prev.Clear(); |
86 | vars.prev.Add(current.level); | 78 | vars.firstRoom = false; |
87 | return true; | 79 | return true; |
88 | } | 80 | } |
89 | } | 81 | } |
90 | 82 | ||
91 | split { | 83 | split { |
92 | // Split when level index changes, but avoid splitting during a loading screen | 84 | // Split when level index changes. We don't split for the first room change in a run, |
93 | // or when the pointer path stops working: | 85 | // because that is always going to be changing from -1 to 9, and it happens a couple of |
94 | if (current.level != vars.prevLevel && current.level >= 0) { | 86 | // seconds after the timer starts. |
87 | if (vars.firstRoom && current.level != vars.prevLevel && current.level >= 0) { | ||
95 | string action = "NO SPLIT"; | 88 | string action = "NO SPLIT"; |
96 | 89 | ||
97 | // Ignore the split rules when script is reloaded mid-game: | 90 | // Ignore the split rules when script is reloaded mid-game: |
@@ -130,6 +123,9 @@ split { | |||
130 | vars.prevLevel = current.level; | 123 | vars.prevLevel = current.level; |
131 | vars.stopwatch = Stopwatch.StartNew(); | 124 | vars.stopwatch = Stopwatch.StartNew(); |
132 | return action.StartsWith("SPLIT"); | 125 | return action.StartsWith("SPLIT"); |
126 | } else if (!vars.firstRoom && current.level == 9) { | ||
127 | vars.firstRoom = true; | ||
128 | vars.prevLevel = current.level; | ||
133 | } | 129 | } |
134 | 130 | ||
135 | // Final split of the game: | 131 | // Final split of the game: |