-
Notifications
You must be signed in to change notification settings - Fork 0
/
Omno.asl
190 lines (163 loc) · 5.64 KB
/
Omno.asl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
* MainMenu 8
* Ch1:Swamp 130
* Ch2:Dash 174 => 176
* Ch3:Surf 142 => 146
* Ch4:Teleport 312 / 318
* Ch5:Float 548 / 562 / 608 => 554 / 568 / 614
* EndCutscene 2
* Credits 58
* TimeTrial 20
*/
state ("Omno-Win64-Shipping", "Release") {
uint level : "Omno-Win64-Shipping.exe", 0x04549A40, 0x20, 0x78, 0x308, 0x46C; // 0x046BFC7C
byte paused : "Omno-Win64-Shipping.exe", 0x044196C0, 0x28, 0x210, 0xB8, 0x8A8;
}
startup {
settings.Add("split_chapters", true, "Split between chapters");
settings.SetToolTip("split_chapters", "Otherwise it will only split once at the end.");
settings.CurrentDefaultParent = "split_chapters";
settings.Add("split_chapter1", true, "Chapter 1 - The Light");
settings.Add("split_chapter2", true, "Chapter 2 - The Teaching");
settings.Add("split_chapter3", true, "Chapter 3 - The Rift");
settings.Add("split_chapter4", true, "Chapter 4 - The Gate");
settings.Add("split_chapter5", true, "Chapter 5 - The Pilgrimage");
settings.SetToolTip("split_chapter1", "Split between chapter 1 and 2.");
settings.SetToolTip("split_chapter2", "Split between chapter 2 and 3.");
settings.SetToolTip("split_chapter3", "Split between chapter 3 and 4.");
settings.SetToolTip("split_chapter4", "Split between chapter 4 and 5.");
settings.SetToolTip("split_chapter5", "Split at the end of chapter 5. If \"Split before Credits\" is disabled it splits regardless.");
settings.CurrentDefaultParent = null;
settings.Add("split_credits", false, "Split before Credits");
settings.SetToolTip("split_credits", "Use this, if you want to include the final cutscene into the time.");
settings.Add("pause", true, "Pause the timer");
settings.SetToolTip("pause", "Remember that you can also disable this by tracking real time instead of game time.");
settings.CurrentDefaultParent = "pause";
settings.Add("pause_main_menu", true, "in the main menu");
settings.Add("pause_paused", true, "while the game is paused");
settings.SetToolTip("pause_paused", "The game is paused when you loose the controller connection or when you go to the pause menu.");
settings.Add("pause_loading", false, "while the game is loading [experimental]");
settings.SetToolTip("pause_loading", "Currently this pauses the timer when this script doesn't recognize a level (this usually happens briefly during loading screens). It's likely that this will be broken by future game patches, resulting in the timer being paused during the game!");
settings.CurrentDefaultParent = null;
}
init {
vars.GetChapter = (Func<uint, int>) ((level) => {
switch (level) {
// Chapter 1: The Light (Jump)
case 130:
return 1;
// Chapter 2: The Teaching (Dash)
case 174:
case 176:
return 2;
// Chapter 3: The Rift (Surf)
case 142:
case 146:
return 3;
// Chapter 4: The Gate (Teleport)
case 312: case 318:
return 4;
// Chapter 5: The Pilgrimage (Float)
case 548: case 562: case 608:
case 554: case 568: case 614:
return 5;
// Final Cutscene
case 2:
return 6;
// Credits
case 58:
return (settings["split_credits"] ? 7 : 6);
}
return -1;
});
vars.KnownLevel = (Func<uint, bool>) ((level) => {
return (
(vars.GetChapter(level) != -1)
|| (level == 8)
|| (level == 20)
);
});
vars.paused = true;
vars.level = -1;
vars.stable = false;
vars.chapter = vars.GetChapter(current.level);
vars.last_chapter = (settings["split_credits"] ? 7 : 6);
print("[RCL] lvl " + current.level);
print("[RCL] ch " + vars.chapter);
}
update {
// Detect paused game
var paused = current.paused == 1;
if (vars.paused != paused) {
vars.paused = paused;
if (paused) { print("[RCL] pause"); }
else { print("[RCL] run"); }
}
// Detect level change
vars.stable = old.level == current.level;
if (! vars.stable) {
print("[RCL] lvl " + current.level);
}
// make sure that the main menu is always detected
else if (vars.level != 8 && current.level == 8) {
print("[RCL] menu");
vars.level = 8;
}
}
// pause the clock
isLoading {
return (
settings["pause"]
&& ( (vars.chapter >= vars.last_chapter)
|| (settings["pause_main_menu"] && current.level == 8)
|| (settings["pause_paused"] && vars.paused)
|| (settings["pause_loading"] && ! vars.KnownLevel(current.level))
)
);
}
reset {
// Going from the Main Menu to the first area resets the timer
// Consequence: Continue during the first chapter will not work
if ( settings.ResetEnabled
&& vars.stable
&& vars.level == 8
&& current.level == 130
) {
print("[RCL] <reset>");
return true;
}
return false;
}
// Start the run
start {
if ( vars.stable
&& vars.level == 8
&& current.level == 130
) {
if (settings.StartEnabled) {
print("[RCL] <start>");
}
vars.level = current.level;
vars.chapter = 1;
print("[RCL] ch 1");
return true;
}
return false;
}
// Progress the Chapter
split {
var chapter = vars.GetChapter(current.level);
if (vars.stable && vars.chapter < chapter) {
vars.level = current.level;
vars.chapter++;
print("[RCL] ch " + vars.chapter);
return (vars.chapter == vars.last_chapter || (settings["split_chapters"] && (
(vars.chapter == 2 && settings["split_chapter1"])
|| (vars.chapter == 3 && settings["split_chapter2"])
|| (vars.chapter == 4 && settings["split_chapter3"])
|| (vars.chapter == 5 && settings["split_chapter4"])
|| (vars.chapter == 6 && settings["split_chapter5"])
)));
}
return false;
}