about summary refs log tree commit diff stats
path: root/Manifold Garden.asl
diff options
context:
space:
mode:
Diffstat (limited to 'Manifold Garden.asl')
-rw-r--r--Manifold Garden.asl56
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
27state("ManifoldGarden") { 22state("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
60init { 48init {
@@ -72,26 +60,31 @@ update {
72} 60}
73 61
74start { 62start {
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
91split { 83split {
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: