Files
dockipelago/worlds/apeescape/RAMAddress.py
Jonathan Tinney 7971961166
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

2789 lines
80 KiB
Python

from .Strings import AEDoor
class RAM:
# ===================== Locations/Checks =====================
monkeyListGlobal = {
# FF
1: 0x0DF828,
2: 0x0DF829,
3: 0x0DF82A,
4: 0x0DF82B,
# PO
5: 0x0DF830,
6: 0x0DF831,
8: 0x0DF832,
7: 0x0DF833,
10: 0x0DF834,
9: 0x0DF835,
# ML
11: 0x0DF838,
12: 0x0DF839,
13: 0x0DF83A,
17: 0x0DF83B,
15: 0x0DF840,
14: 0x0DF841,
16: 0x0DF848,
# TJ
18: 0x0DF850,
19: 0x0DF851,
20: 0x0DF852,
29: 0x0DF858,
31: 0x0DF859,
30: 0x0DF85A,
21: 0x0DF860,
22: 0x0DF861,
23: 0x0DF862,
25: 0x0DF868,
24: 0x0DF869,
26: 0x0DF86A,
28: 0x0DF870,
27: 0x0DF871,
# DR
33: 0x0DF878,
37: 0x0DF879,
42: 0x0DF87A,
34: 0x0DF87B,
32: 0x0DF87C,
35: 0x0DF880,
36: 0x0DF881,
41: 0x0DF888,
43: 0x0DF889,
38: 0x0DF88A,
39: 0x0DF890,
40: 0x0DF891,
44: 0x0DF892,
# CR
51: 0x0DF898,
49: 0x0DF899,
45: 0x0DF8A0,
47: 0x0DF8A8,
46: 0x0DF8A9,
50: 0x0DF8AA,
48: 0x0DF8B0,
52: 0x0DF8B1,
# CB
53: 0x0DF8C0,
54: 0x0DF8C1,
55: 0x0DF8C2,
56: 0x0DF8C3,
57: 0x0DF8C8,
60: 0x0DF8C9,
58: 0x0DF8CA,
59: 0x0DF8CB,
# CC
61: 0x0DF8D0,
62: 0x0DF8D1,
63: 0x0DF8D2,
64: 0x0DF8D3,
65: 0x0DF8D8,
67: 0x0DF8D9,
66: 0x0DF8DA,
68: 0x0DF8DB,
# DI
70: 0x0DF8E0,
69: 0x0DF8E1,
77: 0x0DF8E8,
71: 0x0DF8E9,
78: 0x0DF8EA,
72: 0x0DF8F0,
73: 0x0DF8F1,
74: 0x0DF8F2,
75: 0x0DF8F3,
76: 0x0DF8F4,
79: 0x0DF8F8,
# SM
80: 0x0DF908,
81: 0x0DF909,
84: 0x0DF90A,
82: 0x0DF90B,
83: 0x0DF90C,
85: 0x0DF90D,
# FR
86: 0x0DF910,
87: 0x0DF911,
91: 0x0DF918,
93: 0x0DF919,
92: 0x0DF91A,
94: 0x0DF91B,
88: 0x0DF920,
89: 0x0DF921,
90: 0x0DF922,
# HS
95: 0x0DF928,
96: 0x0DF929,
99: 0x0DF92A,
100: 0x0DF92B,
101: 0x0DF930,
102: 0x0DF931,
103: 0x0DF932,
97: 0x0DF938,
98: 0x0DF939,
# ST
104: 0x0DF948,
105: 0x0DF949,
106: 0x0DF94A,
107: 0x0DF94B,
109: 0x0DF950,
110: 0x0DF951,
108: 0x0DF952,
114: 0x0DF953,
115: 0x0DF954,
113: 0x0DF958,
111: 0x0DF959,
112: 0x0DF95A,
# WSW
116: 0x0DF960,
117: 0x0DF961,
118: 0x0DF968,
119: 0x0DF969,
120: 0x0DF96A,
123: 0x0DF970,
121: 0x0DF978,
122: 0x0DF979,
124: 0x0DF980,
125: 0x0DF981,
# CrC
127: 0x0DF988,
136: 0x0DF989,
126: 0x0DF98A,
128: 0x0DF98B,
137: 0x0DF98C,
129: 0x0DF990,
132: 0x0DF993,
130: 0x0DF991,
131: 0x0DF992,
133: 0x0DF998,
134: 0x0DF999,
135: 0x0DF99A,
138: 0x0DF9A8,
139: 0x0DF9A9,
140: 0x0DF9B0,
141: 0x0DF9B1,
142: 0x0DF9B2,
143: 0x0DF9B8,
144: 0x0DF9B9,
145: 0x0DF9BA,
# CP
146: 0x0DF9C8,
147: 0x0DF9C9,
148: 0x0DF9CA,
149: 0x0DF9CB,
150: 0x0DF9D0,
151: 0x0DF9D1,
152: 0x0DF9D2,
153: 0x0DF9D8,
154: 0x0DF9D9,
155: 0x0DF9DA,
156: 0x0DF9DB,
157: 0x0DF9DC,
158: 0x0DF9DD,
# SF
159: 0x0DF9E0,
160: 0x0DF9E1,
161: 0x0DF9E8,
162: 0x0DF9F0,
163: 0x0DF9F8,
164: 0x0DF9F9,
165: 0x0DF9FA,
166: 0x0DFA08,
167: 0x0DFA09,
168: 0x0DFA10,
# TVT
169: 0x0DFA18,
170: 0x0DFA20,
171: 0x0DFA21,
172: 0x0DFA28,
173: 0x0DFA29,
174: 0x0DFA30,
175: 0x0DFA31,
176: 0x0DFA32,
177: 0x0DFA38,
178: 0x0DFA39,
179: 0x0DFA3A,
180: 0x0DFA3B,
# MM
181: 0x0DFA60,
182: 0x0DFA78,
183: 0x0DFA80,
184: 0x0DFA81,
185: 0x0DFA82,
186: 0x0DFA88,
187: 0x0DFA89,
188: 0x0DFA8A,
189: 0x0DFA8B,
190: 0x0DFA90,
191: 0x0DFA98,
192: 0x0DFA99,
193: 0x0DFAA0,
194: 0x0DFAA1,
196: 0x0DFAA3,
195: 0x0DFAA2,
197: 0x0DFAA8,
198: 0x0DFAA9,
199: 0x0DFAB0,
200: 0x0DFAB1,
201: 0x0DFAC0,
202: 0x0DFAC1,
203: 0x0DFAC2,
204: 0x0DFAC8,
}
monkeyListLocal = {
1: { # 1-1
1: 0x0E557A,
3: 0x0E5A1A,
2: 0x0E57CA,
4: 0x0E5C6A
},
2: { # 1-2
5: 0x0E557A,
6: 0x0E57CA,
7: 0x0E5C6A,
10: 0x0E5EBA,
9: 0x0E610A,
8: 0x0E5A1A
},
3: { # 1-3
11: 0x0E557A,
12: 0x0E57CA,
17: 0x0E5C6A,
13: 0x0E5A1A
},
4: { # volcano
14: 0x0E57CA,
15: 0x0E557A
},
5: { # triceratops
16: 0x0E557A
},
6: { # 2-1
18: 0x0E557A,
19: 0x0E57CA,
20: 0x0E5A1A
},
7: { # mushroom area
29: 0x0E557A,
30: 0x0E5A1A,
31: 0x0E57CA
},
8: { # fish room
23: 0x0E5A1A,
21: 0x0E557A,
22: 0x0E57CA
},
9: { # tent/vine room
24: 0x0E57CA,
25: 0x0E557A,
26: 0x0E5A1A
},
10: { # boulder room
27: 0x0E57CA,
28: 0x0E557A
},
11: { # 2-2
32: 0x0E5EBA,
33: 0x0E557A,
34: 0x0E5C6A,
37: 0x0E57CA,
42: 0x0E5A1A
},
12: { # fan basement
35: 0x0E557A,
36: 0x0E57CA
},
13: { # obelisk inside
38: 0x0E5A1A,
41: 0x0E557A,
43: 0x0E57CA
},
14: { # water basement
39: 0x0E557A,
40: 0x0E57CA,
44: 0x0E5A1A
},
15: { # 2-3
49: 0x0E57CA,
51: 0x0E557A
},
16: { # side room
45: 0x0E557A
},
17: { # main ruins
47: 0x0E557A,
50: 0x0E5A1A,
46: 0x0E57CA
},
18: { # pillar room
48: 0x0E557A,
52: 0x0E57CA
},
19: { # 3-1
},
20: { # 4-1
53: 0x0E557A,
54: 0x0E57CA,
55: 0x0E5A1A,
56: 0x0E5C6A
},
21: { # second room
57: 0x0E557A,
58: 0x0E5A1A,
59: 0x0E5C6A,
60: 0x0E57CA
},
22: { # 4-2
61: 0x0E557A,
62: 0x0E57CA,
63: 0x0E5A1A,
64: 0x0E5C6A
},
23: { # second room
65: 0x0E557A,
67: 0x0E57CA,
68: 0x0E5C6A,
66: 0x0E5A1A
},
24: { # 4-3
69: 0x0E57CA,
70: 0x0E557A
},
25: { # stomach
71: 0x0E57CA,
77: 0x0E557A,
78: 0x0E5A1A
},
26: { # gallery/boulder
72: 0x0E557A,
73: 0x0E57CA,
74: 0x0E5A1A,
75: 0x0E5C6A,
76: 0x0E5EBA
},
27: { # tentacle room
79: 0x0E557A
},
28: { # slide room
},
29: { # 5-1
80: 0x0E557A,
81: 0x0E57CA,
84: 0x0E5A1A,
83: 0x0E5C6A,
85: 0x0E610A,
82: 0x0E5EBA
},
30: { # 5-2
86: 0x0E557A,
87: 0x0E57CA
},
31: { # water room
91: 0x0E557A,
92: 0x0E5A1A,
93: 0x0E57CA,
94: 0x0E5C6A
},
32: { # caverns
88: 0x0E557A,
90: 0x0E5A1A,
89: 0x0E57CA
},
33: { # 5-3
95: 0x0E557A,
96: 0x0E57CA,
99: 0x0E5A1A,
100: 0x0E5C6A
},
34: { # hot spring
101: 0x0E557A,
102: 0x0E57CA,
103: 0x0E5A1A
},
35: { # polar bear cave
98: 0x0E57CA,
97: 0x0E557A
},
36: { # 6-1
},
37: { # 7-1
104: 0x0E557A,
105: 0x0E57CA,
106: 0x0E5A1A,
107: 0x0E5C6A
},
38: { # temple
108: 0x0E5A1A,
110: 0x0E57CA,
109: 0x0E557A,
114: 0x0E5C6A,
115: 0x0E5EBA
},
39: { # well
111: 0x0E57CA,
112: 0x0E5A1A,
113: 0x0E557A
},
40: { # 7-2
116: 0x0E557A,
117: 0x0E57CA
},
41: { # gong room
118: 0x0E557A,
119: 0x0E57CA,
120: 0x0E5A1A
},
42: { # middle room
123: 0x0E557A
},
43: { # obstacle course
122: 0x0E57CA,
121: 0x0E557A,
},
44: { # barrel room
124: 0x0E557A,
125: 0x0E57CA
},
45: { # 7-3
126: 0x0E5A1A,
127: 0x0E557A,
128: 0x0E5C6A,
137: 0x0E5EBA,
136: 0x0E57CA
},
46: { # castle main
129: 0x0E557A,
131: 0x0E5A1A,
130: 0x0E57CA,
132: 0x0E5C6A
},
47: { # flooded basement
133: 0x0E557A,
134: 0x0E57CA,
135: 0x0E5A1A
},
49: { # button room
139: 0x0E57CA,
138: 0x0E557A
},
50: { # elevator room
140: 0x0E557A,
141: 0x0E57CA,
142: 0x0E5A1A
},
51: { # bell tower
145: 0x0E5A1A,
144: 0x0E57CA,
143: 0x0E557A
},
52: {
},
53: { # 8-1
146: 0x0E557A,
149: 0x0E5C6A,
147: 0x0E57CA,
148: 0x0E5A1A
},
54: { # sewers front
151: 0x0E57CA,
152: 0x0E5A1A,
150: 0x0E557A
},
55: { # barrel room
155: 0x0E5A1A,
153: 0x0E557A,
156: 0x0E5C6A,
157: 0x0E5EBA,
154: 0x0E57CA,
158: 0x0E610A
},
56: { # 8-2
159: 0x0E557A,
160: 0x0E57CA
},
57: { # main factory
161: 0x0E557A
},
58: { # rc car room
162: 0x0E557A
},
59: { # lava room
163: 0x0E557A,
164: 0x0E57CA,
165: 0x0E5A1A
},
60: {
},
61: { # conveyor room
166: 0x0E557A,
167: 0x0E57CA
},
62: { # mech room
168: 0x0E557A
},
63: { # 8-3
169: 0x0E557A
},
64: { # water basement
171: 0x0E57CA,
170: 0x0E557A
},
65: { # lobby
172: 0x0E557A,
173: 0x0E57CA
},
66: { # tank room
174: 0x0E557A,
175: 0x0E57CA,
176: 0x0E5A1A
},
67: { # fan room
177: 0x0E557A,
179: 0x0E5A1A,
180: 0x0E5C6A,
178: 0x0E57CA
},
68: {
},
69: { # MM Lobby
},
71: {
},
72: { # coaster entry
181: 0x0E557A
},
73: { # coaster 1
},
74: { # coaster 2
},
75: { # haunted house
182: 0x0E557A
},
76: { # coffin room
183: 0x0E557A,
184: 0x0E57CA,
185: 0x0E5A1A
},
77: { # western land
187: 0x0E57CA,
186: 0x0E557A,
188: 0x0E5A1A,
189: 0x0E5C6A
},
78: { # crater
190: 0x0E557A
},
79: { # outside castle
192: 0x0E557A,
191: 0X0E57CA
},
80: { # castle main
194: 0x0E57CA,
195: 0x0E5A1A,
196: 0x0E5C6A,
193: 0x0E557A
},
81: { # inside climb
197: 0x0E557A,
198: 0x0E57CA
},
82: { # outside climb
199: 0x0E557A,
200: 0x0E57CA
},
84: { # Monkey head
201: 0x0E557A,
202: 0x0E57CA,
203: 0x0E5A1A
},
85: { # side entry
204: 0x0E557A
}
}
# List of temporary table that monkeys caught status get saved while traversing level.
# Get's written when going into a transition
# When exiting the level,it save them into global values
monkeyListTempLocal = {
1: { # 1-1
1: 0x0DFE00,
3: 0x0DFE01,
2: 0x0DFE02,
4: 0x0DFE03
},
2: { # 1-2
5: 0x0DFE00,
6: 0x0DFE01,
7: 0x0DFE03,
10: 0x0DFE04,
9: 0x0DFE05,
8: 0x0DFE02
},
3: { # 1-3
11: 0x0DFE00,
12: 0x0DFE01,
17: 0x0DFE03,
13: 0x0DFE02
},
4: { # volcano
14: 0x0DFE19,
15: 0x0DFE18
},
5: { # triceratops
16: 0x0DFE30
},
6: { # 2-1
18: 0x0DFE00,
19: 0x0DFE01,
20: 0x0DFE02
},
7: { # mushroom area
29: 0x0DFE18,
30: 0x0DFE1A,
31: 0x0DFE19
},
8: { # fish room
23: 0x0DFE32,
21: 0x0DFE30,
22: 0x0DFE31
},
9: { # tent/vine room
24: 0x0DFE49,
25: 0x0DFE48,
26: 0x0DFE4A
},
10: { # boulder room
27: 0x0DFE61,
28: 0x0DFE60
},
11: { # 2-2
32: 0x0DFE04,
33: 0x0DFE00,
34: 0x0DFE03,
37: 0x0DFE01,
42: 0x0DFE02
},
12: { # fan basement
35: 0x0DFE18,
36: 0x0DFE19
},
13: { # obelisk inside
38: 0x0DFE32,
41: 0x0DFE30,
43: 0x0DFE31
},
14: { # water basement
39: 0x0DFE48,
40: 0x0DFE49,
44: 0x0DFE4A
},
15: { # 2-3
49: 0x0DFE01,
51: 0x0DFE00
},
16: { # side room
45: 0x0DFE18
},
17: { # main ruins
47: 0x0DFE30,
50: 0x0DFE32,
46: 0x0DFE31
},
18: { # pillar room
48: 0x0DFE48,
52: 0x0DFE49
},
19: { # 3-1
},
20: { # 4-1
53: 0x0DFE00,
54: 0x0DFE01,
55: 0x0DFE02,
56: 0x0DFE03
},
21: { # second room
57: 0x0DFE18,
58: 0x0DFE1A,
59: 0x0DFE1B,
60: 0x0DFE19
},
22: { # 4-2
61: 0x0DFE00,
62: 0x0DFE01,
63: 0x0DFE02,
64: 0x0DFE03
},
23: { # second room
65: 0x0DFE18,
67: 0x0DFE19,
68: 0x0DFE1B,
66: 0x0DFE1A
},
24: { # 4-3
69: 0x0DFE01,
70: 0x0DFE00
},
25: { # stomach
71: 0x0DFE19,
77: 0x0DFE18,
78: 0x0DFE1A
},
26: { # gallery/boulder
72: 0x0DFE30,
73: 0x0DFE31,
74: 0x0DFE32,
75: 0x0DFE33,
76: 0x0DFE34
},
27: { # tentacle room
79: 0x0DFE48
},
28: { # slide room
},
29: { # 5-1
80: 0x0DFE00,
81: 0x0DFE01,
84: 0x0DFE02,
83: 0x0DFE04,
85: 0x0DFE05,
82: 0x0DFE03
},
30: { # 5-2
86: 0x0DFE00,
87: 0x0DFE01
},
31: { # water room
91: 0x0DFE18,
92: 0x0DFE1A,
93: 0x0DFE19,
94: 0x0DFE1B
},
32: { # caverns
88: 0x0DFE30,
90: 0x0DFE32,
89: 0x0DFE31
},
33: { # 5-3
95: 0x0DFE00,
96: 0x0DFE01,
99: 0x0DFE02,
100: 0x0DFE03
},
34: { # hot spring
101: 0x0DFE18,
102: 0x0DFE19,
103: 0x0DFE1A
},
35: { # polar bear cave
98: 0x0DFE31,
97: 0x0DFE30
},
36: { # 6-1
},
37: { # 7-1
104: 0x0DFE00,
105: 0x0DFE01,
106: 0x0DFE02,
107: 0x0DFE03
},
38: { # temple
108: 0x0DFE1A,
110: 0x0DFE19,
109: 0x0DFE18,
114: 0x0DFE1B,
115: 0x0DFE1C
},
39: { # well
111: 0x0DFE31,
112: 0x0DFE32,
113: 0x0DFE30
},
40: { # 7-2
116: 0x0DFE00,
117: 0x0DFE01
},
41: { # gong room
118: 0x0DFE18,
119: 0x0DFE19,
120: 0x0DFE1A
},
42: { # middle room
123: 0x0DFE30
},
43: { # obstacle course
122: 0x0DFE49,
121: 0x0DFE48,
},
44: { # barrel room
124: 0x0DFE60,
125: 0x0DFE61
},
45: { # 7-3
126: 0x0DFE02,
127: 0x0DFE00,
128: 0x0DFE03,
137: 0x0DFE04,
136: 0x0DFE01
},
46: { # castle main
129: 0x0DFE18,
131: 0x0DFE1A,
130: 0x0DFE19,
132: 0x0DFE1B
},
47: { # flooded basement
133: 0x0DFE30,
134: 0x0DFE31,
135: 0x0DFE32
},
49: { # button room
139: 0x0DFE61,
138: 0x0DFE60
},
50: { # elevator room
140: 0x0DFE78,
141: 0x0DFE79,
142: 0x0DFE7A
},
51: { # bell tower
145: 0x0DFE92,
144: 0x0DFE91,
143: 0x0DFE90
},
52: {
},
53: { # 8-1
146: 0x0DFE00,
149: 0x0DFE03,
147: 0x0DFE01,
148: 0x0DFE02
},
54: { # sewers front
151: 0x0DFE19,
152: 0x0E5A1A,
150: 0x0DFE18
},
55: { # barrel room
155: 0x0DFE32,
153: 0x0DFE30,
156: 0x0DFE33,
157: 0x0DFE34,
154: 0x0DFE31,
158: 0x0DFE35
},
56: { # 8-2
159: 0x0DFE00,
160: 0x0DFE01
},
57: { # main factory
161: 0x0DFE18
},
58: { # rc car room
162: 0x0DFE30
},
59: { # lava room
163: 0x0DFE48,
164: 0x0DFE49,
165: 0x0DFE4A
},
60: {
},
61: { # conveyor room
166: 0x0DFE78,
167: 0x0DFE79
},
62: { # mech room
168: 0x0DFE90
},
63: { # 8-3
169: 0x0DFE00
},
64: { # water basement
171: 0x0DFE19,
170: 0x0DFE18
},
65: { # lobby
172: 0x0DFE30,
173: 0x0DFE31
},
66: { # tank room
174: 0x0DFE48,
175: 0x0DFE49,
176: 0x0DFE4A
},
67: { # fan room
177: 0x0DFE60,
179: 0x0DFE62,
180: 0x0DFE63,
178: 0x0DFE61
},
68: {
},
69: { # MM Lobby
},
71: {
},
72: { # coaster entry
181: 0x0DFE00
},
73: { # coaster 1
},
74: { # coaster 2
},
75: { # haunted house
182: 0x0DFE48
},
76: { # coffin room
183: 0x0DFE60,
184: 0x0DFE61,
185: 0x0DFE62
},
77: { # western land
187: 0x0DFE01,
186: 0x0DFE00,
188: 0x0DFE02,
189: 0x0DFE03
},
78: { # crater
190: 0x0DFE00
},
79: { # outside castle
192: 0x0DFE19,
191: 0x0DFE18
},
80: { # castle main
194: 0x0DFE31,
195: 0x0DFE32,
196: 0x0DFE33,
193: 0x0DFE30
},
81: { # inside climb
197: 0x0DFE48,
198: 0x0DFE49
},
82: { # outside climb
199: 0x0DFE60,
200: 0x0DFE61
},
84: { # Monkey head
201: 0x0DFE90,
202: 0x0DFE91,
203: 0x0DFE92
},
85: { # side entry
204: 0x0DFEA8
}
}
localMonkeyHitbox = {
#Array order -> LocalMonkeyAddress : HitboxAddress
0x0E557A : 0x0E5525,
0x0E57CA : 0x0E5775,
0x0E5A1A : 0x0E59C5,
0x0E5C6A : 0x0E5C15,
0x0E5EBA : 0x0E5E65,
0x0E610A : 0x0E60B5
}
localmonkeyCatchHitbox = {
# FF
1: 0x0DF828,
2: 0x0DF829,
3: 0x0DF82A,
4: 0x0DF82B,
# PO
5: 0x0DF830,
6: 0x0DF831,
8: 0x0DF832,
7: 0x0DF833,
10: 0x0DF834,
9: 0x0DF835,
# ML
11: 0x0DF838,
12: 0x0DF839,
13: 0x0DF83A,
17: 0x0DF83B,
15: 0x0DF840,
14: 0x0DF841,
16: 0x0DF848,
# TJ
18: 0x0DF850,
19: 0x0DF851,
20: 0x0DF852,
29: 0x0DF858,
31: 0x0DF859,
30: 0x0DF85A,
21: 0x0DF860,
22: 0x0DF861,
23: 0x0DF862,
25: 0x0DF868,
24: 0x0DF869,
26: 0x0DF86A,
28: 0x0DF870,
27: 0x0DF871,
# DR
33: 0x0DF878,
37: 0x0DF879,
42: 0x0DF87A,
34: 0x0DF87B,
32: 0x0DF87C,
35: 0x0DF880,
36: 0x0DF881,
41: 0x0DF888,
43: 0x0DF889,
38: 0x0DF88A,
39: 0x0DF890,
40: 0x0DF891,
44: 0x0DF892,
# CR
51: 0x0DF898,
49: 0x0DF899,
45: 0x0DF8A0,
47: 0x0DF8A8,
46: 0x0DF8A9,
50: 0x0DF8AA,
48: 0x0DF8B0,
52: 0x0DF8B1,
# CB
53: 0x0DF8C0,
54: 0x0DF8C1,
55: 0x0DF8C2,
56: 0x0DF8C3,
57: 0x0DF8C8,
60: 0x0DF8C9,
58: 0x0DF8CA,
59: 0x0DF8CB,
# CC
61: 0x0DF8D0,
62: 0x0DF8D1,
63: 0x0DF8D2,
64: 0x0DF8D3,
65: 0x0DF8D8,
67: 0x0DF8D9,
66: 0x0DF8DA,
68: 0x0DF8DB,
# DI
70: 0x0DF8E0,
69: 0x0DF8E1,
77: 0x0DF8E8,
71: 0x0DF8E9,
78: 0x0DF8EA,
72: 0x0DF8F0,
73: 0x0DF8F1,
74: 0x0DF8F2,
75: 0x0DF8F3,
76: 0x0DF8F4,
79: 0x0DF8F8,
# SM
80: 0x0DF908,
81: 0x0DF909,
84: 0x0DF90A,
82: 0x0DF90B,
83: 0x0DF90C,
85: 0x0DF90D,
# FR
86: 0x0DF910,
87: 0x0DF911,
91: 0x0DF918,
93: 0x0DF919,
92: 0x0DF91A,
94: 0x0DF91B,
88: 0x0DF920,
89: 0x0DF921,
90: 0x0DF922,
# HS
95: 0x0DF928,
96: 0x0DF929,
99: 0x0DF92A,
100: 0x0DF92B,
101: 0x0DF930,
102: 0x0DF931,
103: 0x0DF932,
97: 0x0DF938,
98: 0x0DF939,
# ST
104: 0x0DF948,
105: 0x0DF949,
106: 0x0DF94A,
107: 0x0DF94B,
109: 0x0DF950,
110: 0x0DF951,
108: 0x0DF952,
114: 0x0DF953,
115: 0x0DF954,
113: 0x0DF958,
111: 0x0DF959,
112: 0x0DF95A,
# WSW
116: 0x0DF960,
117: 0x0DF961,
118: 0x0DF968,
119: 0x0DF969,
120: 0x0DF96A,
123: 0x0DF970,
121: 0x0DF978,
122: 0x0DF979,
124: 0x0DF980,
125: 0x0DF981,
# CrC
127: 0x0DF988,
136: 0x0DF989,
126: 0x0DF98A,
128: 0x0DF98B,
137: 0x0DF98C,
129: 0x0DF990,
132: 0x0DF993,
130: 0x0DF991,
131: 0x0DF992,
133: 0x0DF998,
134: 0x0DF999,
135: 0x0DF99A,
138: 0x0DF9A8,
139: 0x0DF9A9,
140: 0x0DF9B0,
141: 0x0DF9B1,
142: 0x0DF9B2,
143: 0x0DF9B8,
144: 0x0DF9B9,
145: 0x0DF9BA,
# CP
146: 0x0DF9C8,
147: 0x0DF9C9,
148: 0x0DF9CA,
149: 0x0DF9CB,
150: 0x0DF9D0,
151: 0x0DF9D1,
152: 0x0DF9D2,
153: 0x0DF9D8,
154: 0x0DF9D9,
155: 0x0DF9DA,
156: 0x0DF9DB,
157: 0x0DF9DC,
158: 0x0DF9DD,
# SF
159: 0x0DF9E0,
160: 0x0DF9E1,
161: 0x0DF9E8,
162: 0x0DF9F0,
163: 0x0DF9F8,
164: 0x0DF9F9,
165: 0x0DF9FA,
166: 0x0DFA08,
167: 0x0DFA09,
168: 0x0DFA10,
# TVT
169: 0x0DFA18,
170: 0x0DFA20,
171: 0x0DFA21,
172: 0x0DFA28,
173: 0x0DFA29,
174: 0x0DFA30,
175: 0x0DFA31,
176: 0x0DFA32,
177: 0x0DFA38,
178: 0x0DFA39,
179: 0x0DFA3A,
180: 0x0DFA3B,
# MM
181: 0x0DFA60,
182: 0x0DFA78,
183: 0x0DFA80,
184: 0x0DFA81,
185: 0x0DFA82,
186: 0x0DFA88,
187: 0x0DFA89,
188: 0x0DFA8A,
189: 0x0DFA8B,
190: 0x0DFA90,
191: 0x0DFA98,
192: 0x0DFA99,
193: 0x0DFAA0,
194: 0x0DFAA1,
196: 0x0DFAA3,
195: 0x0DFAA2,
197: 0x0DFAA8,
198: 0x0DFAA9,
199: 0x0DFAB0,
200: 0x0DFAB1,
201: 0x0DFAC0,
202: 0x0DFAC1,
203: 0x0DFAC2,
204: 0x0DFAC8,
}
coinsListLocal = {
#Array Order:
# CoinNumber : [CoinVisualSprite,CoinHitBoxPosition]
# CoinVisualSprite : 4 = Coin Sprite(Not collected),0 = Collected
1 : [0x0BF03A,0x0BF03E], # This is the ONLY coin that has an audio bug for w/e reason
2 : [0x0BF1D2,0x0BF1D6],
3 : [0x0BF15A,0x0BF15E],
6 : [0x0BF0CA,0x0BF0CE],
7 : [0x0BF1BA,0x0BF1BE],
8 : [0x0BF1A2,0x0BF1A6],
9 : [0x0BF1EA,0x0BF1EE],
11 : [0x0BF172,0x0BF176],
12 : [0x0BF09A,0X0BF09E],
13 : [0x0BF142,0x0BF146],
14 : [0x0BF1A2,0x0BF1A6],
17 : [0x0BF142,0x0BF146],
21 : [0x0BF15A,0x0BF15E],
23 : [0x0BF1A2,0x0BF1A6],
24 : [0x0BF052,0x0BF056],
25 : [0x0BF142,0x0BF146],
28 : [0x0BF0B2,0x0BF0B6],
29 : [0x0BF142,0x0BF146],
30 : [0x0BF142,0x0BF146],
31 : [0x0BF172,0x0BF176],
32 : [0x0BF18A,0x0BF18E],
34 : [0x0BF112,0x0BF116],
35 : [0x0BF232,0x0BF236],
37 : [0x0BF0B2,0x0BF0B6],
38 : [0x0BF0E2,0x0BF0E6],
39 : [0x0BF1EA,0x0BF1EE],
40 : [0x0BF15A,0x0BF15E],
41 : [0x0BF00A,0x0BF00E],
44 : [0x0BF1A2,0x0BF1A6],
45 : [0x0BF172,0x0BF176],
46 : [0x0BF1BA,0x0BF1BE],
49 : [0x0BF142,0x0BF146],
50 : [0x0BF1EA,0x0BF1EE],
53 : [0x0BF18A,0x0BF18E],
54 : [0x0BF1A2,0x0BF1A6],
55 : [0x0BF24A,0x0BF24E],
58 : [0x0BF082,0x0BF086],
59 : [0x0BF18A,0x0BF18E],
64 : [0x0BF1EA,0x0BF1EE],
66 : [0x0BEFAA,0x0BEFAE],
73 : [0x0BF18A,0x0BF18E],
74 : [0x0BF09A,0x0BF09E],
75 : [0x0BF0E2,0x0BF0E6],
77 : [0x0BF12A,0x0BF12E],
78 : [0x0BF18A,0x0BF18E],
79 : [0x0BF21A,0x0BF21E],
80 : [0X0BF142,0X0BF146],
82 : [0X0BF1BA,0X0BF1BE],
84 : [0x0BF21A,0x0BF21E],
85 : [0x0BF0FA,0x0BF0FE],
}
CoinHitBoxPositionOff = 0xFFB0
localMonkeyHitbox1 = 0x0BBDF4
localMonkeyCatchHitBox1 = 0x0BBDF0 # ? Seems to be indicative of Monkeys Hitboxes FOR THE NET
caughtStatus = {
"Unloaded": 0x00,
"OutOfRender": 0x01,
"Uncaught": 0x04,
"Caught": 0x03,
"PrevCaught": 0x02
}
# Indexes all monkeys per levelID
monkeysperlevel = {
1: {
1, 3, 2, 4
},
2: {
5, 6, 7, 10, 9, 8
},
3: {
11, 12, 17, 13, 14, 15, 16
},
4: {
18, 19, 20, 29, 30, 31, 23, 21, 22, 24, 25, 26, 27, 28
},
5: {
32, 33, 34, 37, 42, 35, 36, 38, 41, 43, 39, 40, 44
},
6: {
49, 51, 45, 47, 50, 46,48, 52
},
7: {
},
8: {
53, 54, 55, 56, 57, 58, 59, 60
},
9: {
61, 62, 63, 64, 65, 67, 68, 66
},
10: {
69, 70, 71, 77, 78, 72, 73, 74, 75, 76, 79
},
11: {
80, 81, 84, 83, 85, 82
},
12: {
86, 87, 91, 92, 93, 94, 88, 90, 89
},
13: {
95, 96, 99, 100, 101, 102, 103, 98, 97
},
14: {
},
15: {
104, 105, 106, 107, 108, 110, 109, 114, 115, 111, 112, 113
},
16: {
116, 117, 118, 119, 120, 123, 122, 121, 124, 125
},
17: {
126, 127, 128, 137, 136, 129, 131, 130, 132, 133, 134, 135, 139, 138, 140, 141, 142, 145, 144, 143
},
20: {
146, 149, 147, 148, 151, 152, 150, 155, 153, 156, 157, 154, 158
},
21: {
159, 160, 161, 162, 163, 164, 165, 166, 167, 168
},
22: {
169, 171, 170, 172, 173, 174, 175, 176, 177, 179, 180, 178
},
24: {
181, 182, 183, 184, 185, 187, 186, 188, 189, 190, 192, 191,
194, 195, 196, 193, 197, 198, 199, 200, 201, 202, 203, 204
}
}
timeStationMailboxStart = 0x0C1798
gotMailAddress = 0x0BBD99
# Seems to be shared with other variables,
# Detect when gotMailAddress = 2 then check what mailbox it is
mailboxIDAddress = 0x0A6CD2
# Associate by room just to be sure, since some of them have the same ID (Ex.: Thick Jungle have 2 IDs = 71)
mailboxListLocal = {
1: { # 1-1: Entry
401: 65,
402: 66,
403: 19
},
2: { # 1-2: Entry
404: 68,
405: 69,
406: 70,
407: 67
},
3: { # 1-3: Entry
408: 103,
409: 21
},
4: { # 1-3: volcano
410: 100
},
5: { # 1-3: triceratops
411: {101, 116},
412: 41
},
6: { # 2-1: Entry
413: 72,
414: 71
},
7: { # 2-1: mushroom area
415: {38, 99},
416: 24
},
8: { # 2-1: fish room
417: 73,
418: 71,
419: 104
},
9: { # 2-1: tent/vine room
420: 48
},
10: { # 2-1: boulder room
421: 23
},
11: { # 2-2: Entry
422: 105,
423: {49, 103},
424: 22,
425: 81,
},
12: { # 2-2: fan basement
426: 80,
427: {70, 97}
},
13: { # 2-2: obelisk inside
428: {52, 97}
},
15: { # 2-3: Entry
429: 50,
430: 112
},
17: { # 2-3: main ruins
431: 33,
432: 37
},
18: { # 2-3: pillar room
433: 67
},
20: { # 4-1: Entry
434: 25,
435: {22, 82}
},
21: { # 4-1: second room
436: 72
},
23: { # 4-2: second room
437: 53,
438: 54
},
24: { # 4-3: Entry
439: 39,
440: 55
},
26: { # 4-3: gallery/boulder
442: {32, 72}
},
28: { # 4-3: slide room
441: 40
},
29: { # 5-1: Entry
443: 86,
444: 18,
445: 87
},
32: { # 5-2: caverns
446: 35
},
33: { # 5-3: Entry
447: 20
},
34: { # 5-3: hot spring
448: 51
},
35: { # 5-3: polar bear cave
449: 85
},
38: { # 7-1: temple
450: 57,
451: 65
},
39: { # 7-1: well
452: 68
},
41: { # 7-2: gong room
453: {25, 56}
},
42: { # 7-2: middle room
454: 34,
455: 36
},
43: { # 7-2: obstacle course
456: 64
},
45: { # 7-3: Entry
457: 69
},
56: { # 8-2: Entry
458: 83
},
72: { # MM - coaster entry
459: 84
},
88: { # Time station - Hub
460: 113,
461: 114
},
91: { # Time station - Mini-game Corner
462: 116
},
90: { # Time station - Training Space
463: 115
}
}
# To check if red mailboxes are already checked in the current room
redMailboxes = {
1: { # 1-1: Entry
401: 0x16076E,
402: 0x160786,
},
2: { # 1-2: Entry
404: 0x175BD6,
405: 0x175BA6,
406: 0x175BBE,
407: 0x175B8E
},
3: { # 1-3: Entry
408: 0x181592
},
4: { # 1-3: volcano
410: 0x167D3A
},
5: { # 1-3: triceratops
411: 0x165C5A
},
6: { # 2-1: Entry
413: 0x17A65A,
414: 0x17A672
},
8: { # 2-1: fish room
417: 0x18031E,
419: 0x180336
},
11: { # 2-2: Entry
422: 0x184612,
425: 0x1845FA
},
12: { # 2-2: fan basement
426: 0x16A386,
},
15: { # 2-3: Entry
430: 0x176092
},
20: { # 4-1: Entry
435: 0x1798EA
},
29: { # 5-1: Entry
443: 0x17566A,
445: 0x175682
},
35: { # 5-3: polar bear cave
449: 0x176E22
},
56: { # 8-2: Entry
458: 0x178E02
},
72: { # MM - coaster entry
459: 0x17389A
},
88: { # Time station - Hub
460: 0x1608BE,
461: 0x1608A6
},
91: { # Time station - Mini-game Corner
462: 0x15FE3A
},
90: { # Time station - Training Space
463: 0x16721A
}
}
bossListLocal = {
48: { # CrC boss room
500: 0x0E69E1
},
68: { # TVT boss room
501: 0x143E1F
},
70: { # MM_Jake
503: 0x1422E6
},
71: { # Circus (Professor)
502: 0x0E6BA9
},
# Victory conditions calculated separately, no values there
83: { # Specter 1 Phase 1
},
86: { # Specter 1 Phase 2
},
87: { # Specter 2
}
}
jakeVictoryAddress = 0x0F447A
unlockedLevelAddress = 0x0DFC70
requiredApesAddress = 0x0F44D8
currentApesAddress = 0x0F44B6
hundoApesAddress = 0x0F44D6
hundoCoinsAddress = 0x0F44DA
localApeStartAddress = 0x0DFE00
startingCoinAddress = 0x0DFB70
endingCoinAddress = 0x0DFBD2 # Not used,could be used for a loop if current coin system is buggy
totalCoinsAddress = 0x0F44BA
SA_CompletedAddress = 0x0DFDD0 # Completed = 0x19, not completed = 00
GA_CompletedAddress = 0x0DFDD1 # Completed = 0x19, not completed = 00
# Custom write/read addresses
# Current game values: 0DFBEC - On load, gets replaced by SAVED address
tempLastReceivedArchipelagoID = 0x0DFBD8 # 4 bytes
tempKeyCountFromServer = 0x0DFBDC
# Unused 0DFBDD to 0DFBDF
tempGadgetStateFromServer = 0x0DFBE0 # 2 bytes - 0DFBE1
tempWaterNetAddress = 0x0DFBE2
tempWaterCatchAddress = 0x0DFBE3
tempCB_LampAddress = 0x0DFBE4
tempDI_LampAddress = 0x0DFBE5
tempCrC_LampAddress = 0x0DFBE6
tempCP_LampAddress = 0x0DFBE7
tempSF_LampAddress = 0x0DFBE8
tempTVT_Lobby_LampAddress = 0x0DFBE9
tempTVT_Tank_LampAddress = 0x0DFBEA
tempMM_LampAddress = 0x0DFBEB
tempTokenCountFromServer = 0x0DFBEC
temp_startingCoinAddress = 0x0DFBF0 # Copy all 64 bytes of coin here while entering Level Select
levelselect_coinlock_Address = 0x0DFC60 # To tell the client if we are changing the coin table
blank_coinTable = 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF
blank_coinTable2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
temp_SA_CompletedAddress = 0x0DFC56
temp_GA_CompletedAddress = 0x0DFC57
temp_MMLobbyDoorAddress = 0x0DFC58
temp_MM_Jake_DefeatedAddress = 0x0DFC5A
temp_MM_Professor_RescuedAddress = 0x0DFC5C
temp_MM_Natalie_RescuedAddress = 0x0DFC5E
# hex 510 <-> dec 1296 difference
# SAVED values: 0E00FC - Data that gets included when saving
lastReceivedArchipelagoID = 0x0E00E8 # 4 bytes - to 0E00EB
keyCountFromServer = 0x0E00EC
# Unused 0E00ED to 0E00EF
gadgetStateFromServer = 0x0E00F0 # 2 bytes - 0E00F1
WaterNetAddress = 0x0E00F2
WaterCatchAddress = 0x0E00F3
CB_LampAddress = 0x0E00F4
DI_LampAddress = 0x0E00F5
CrC_LampAddress = 0x0E00F6
CP_LampAddress = 0x0E00F7
SF_LampAddress = 0x0E00F8
TVT_Lobby_LampAddress = 0x0E00F9
TVT_Tank_LampAddress = 0x0E00FA
MM_LampAddress = 0x0E00FB
tokenCountFromServer = 0x0E00FC
# ===================== Items =====================
items = {
"Club": 0x1,
"Net": 0x2,
"Radar": 0x4,
"Sling": 0x8,
"Hoop": 0x10,
"Punch": 0x20,
"Flyer": 0x40,
"Car": 0x80,
"Key": 0x100,
"Victory": 0x200,
"WaterNet": 0x400,
"ProgWaterNet": 0x401,
"WaterCatch": 0x402,
"CB_Lamp": 0x150,
"DI_Lamp": 0x151,
"CrC_Lamp": 0x152,
"CP_Lamp": 0x153,
"SF_Lamp": 0x154,
"TVT_Lobby_Lamp": 0x155,
"TVT_Tank_Lamp": 0x156,
"MM_Lamp": 0x157,
"MM_DoubleDoorKey": 0x403,
"Token": 0x300,
"Nothing": 0x0,
"Shirt": 0x210,
"Triangle": 0x211,
"BigTriangle": 0x212,
"Cookie": 0x213,
"Flash": 0x214,
"Rocket": 0x215,
"BiggerTriangle": 0x216,
"FiveCookies": 0x217,
"ThreeFlash": 0x218,
"ThreeRocket": 0x219,
"BananaPeelTrap": 0x250,
"GadgetShuffleTrap": 0x251,
"MonkeyMashTrap": 0x252,
"IcyHotPantsTrap": 0x253,
"StunTrap": 0x254,
"CameraRotateTrap": 0x255,
"RainbowCookie": 0x270,
"FAKE_OOL_ITEM": 0x999,
}
# Junk addresses
energyChipsAddress = 0x0F44B8
cookieAddress = 0x0EC2C8
instakillAddress = 0x0EC2C9
tankLife = 0x0BF826
livesAddress = 0x0F448C
flashAddress = 0x0F51C1
rocketAddress = 0x0F51C2
# ===================== Levels, Level Unlocks and ER =====================
levelStatus = {
"Locked": 0x00,
"Complete": 0x01,
"Hundo": 0x02,
"Open": 0x03
}
levels = {
"Fossil": 0x01,
"Primordial": 0x02,
"Molten": 0x03,
"Thick": 0x04,
"Dark": 0x05,
"Cryptic": 0x06,
"Stadium": 0x07,
"Crabby": 0x08,
"Coral": 0x09,
"Dexter": 0x0A,
"Snowy": 0x0B,
"Frosty": 0x0C,
"Hot": 0x0D,
"Gladiator": 0x0E,
"Sushi": 0x0F,
"Wabi": 0x10,
"Crumbling": 0x11,
"City": 0x14,
"Factory": 0x15,
"TV": 0x16,
"Specter": 0x18,
"S_Jake": 0x19,
"S_Circus": 0x1A,
"S_Coaster": 0x1B,
"S_Western Land": 0x1C,
"S_Castle": 0x1D,
"Peak": 0x1E,
"Time": 0x1F,
"Training": 0x20
}
MM_SubLevels_Rooms_Spawns = {
#Should spawn you in these rooms,depending on RSR
#Take the possible room and warps you to the base Sub-Level Room
# "Specter": 0x18,
69 : 69,
# "S_Jake": 0x19,
70 : 70,
# "S_Circus": 0x1A,
71 : 71,
# "S_Coaster": 0x1B,
72: 72,
73: 72,
74: 72,
75: 72,
76 : 72,
# "S_Western Land": 0x1C,
77 : 77,
# "S_Castle": 0x1D,
78 : 78,
79 : 78,
80 : 78,
81 : 78,
82 : 78,
84 : 78,
85 : 78,
}
levelAddresses = {
11: 0xdfc71,
12: 0xdfc72,
13: 0xdfc73,
21: 0xdfc74,
22: 0xdfc75,
23: 0xdfc76,
31: 0xdfc77,
41: 0xdfc78,
42: 0xdfc79,
43: 0xdfc7A,
51: 0xdfc7B,
52: 0xdfc7C,
53: 0xdfc7D,
61: 0xdfc7E,
71: 0xdfc7F,
72: 0xdfc80,
73: 0xdfc81,
81: 0xdfc84,
82: 0xdfc85,
83: 0xdfc86,
91: 0xdfc88,
92: 0xdfc8e
}
levelMonkeyCount = {
11: 0xdfc99,
12: 0xdfc9a,
13: 0xdfc9b,
21: 0xdfc9c,
22: 0xdfc9d,
23: 0xdfc9e,
31: 0xdfc9f, # Stadium Attack - unused
41: 0xdfca0,
42: 0xdfca1,
43: 0xdfca2,
51: 0xdfca3,
52: 0xdfca4,
53: 0xdfca5,
61: 0xdfca6, # Gladiator Attack - unused
71: 0xdfca7,
72: 0xdfca8,
73: 0xdfca9,
81: 0xdfcac,
82: 0xdfcad,
83: 0xdfcae,
91: 0xdfcb0
}
baselevelids = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11,
0x14, 0x15, 0x16, 0x18, 0x1E]
firstroomids = [0x01, 0x02, 0x03, 0x06, 0x0B, 0x0F, 0x13, 0x14, 0x16, 0x18, 0x1D, 0x1E, 0x21, 0x24, 0x25, 0x28, 0x2D,
0x35, 0x38, 0x3F, 0x45, 0x57]
roomsperlevel = {
1: {
1
},
2: {
2
},
3: {
3, 4, 5
},
4: {
6, 7, 8, 9, 10
},
5: {
11, 12, 13, 14
},
6: {
15, 16, 17, 18
},
7: {
19
},
8: {
20, 21
},
9: {
22, 23
},
10: {
24, 25, 26, 27, 28
},
11: {
29
},
12: {
30, 31, 32
},
13: {
33, 34, 35
},
14: {
36
},
15: {
37, 38, 39
},
16: {
40, 41, 42, 43, 44
},
17: {
45, 46, 47, 49, 50, 51 # Removed boss room
},
20: {
53, 54, 55
},
21: {
56, 57, 58, 59, 60, 61, 62
},
22: {
63, 64, 65, 66, 67 # Removed boss room
},
24: {
69, 72, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85 # Removed boss rooms and coaster spawns
},
30: {
87
}
}
MM_roomspersublevel = {
24: {
},
25: {
},
26: {
},
27: {
72, 75, 76
},
28: {
77
},
29: {
78, 79, 80, 81, 82, 84, 85
},
}
roomstostring = {
1: AEDoor.FF_ENTRY.value,
2: AEDoor.PO_ENTRY.value,
3: AEDoor.ML_ENTRY.value,
4: AEDoor.ML_VOLCANO_ENTRY.value,
5: AEDoor.ML_TRICERATOPS_ENTRY.value,
6: AEDoor.TJ_ENTRY.value,
7: AEDoor.TJ_MUSHROOM_ENTRY.value,
8: AEDoor.TJ_FISH_ENTRY.value,
9: AEDoor.TJ_TENT_FISH.value,
10: AEDoor.TJ_BOULDER_ENTRY.value,
11: AEDoor.DR_ENTRY.value,
12: AEDoor.DR_FAN_OUTSIDE_HOLE.value,
13: AEDoor.DR_OBELISK_BOTTOM.value,
14: AEDoor.DR_WATER_SIDE.value,
15: AEDoor.CR_ENTRY.value,
16: AEDoor.CR_SIDE_ROOM_ENTRY.value,
17: AEDoor.CR_MAIN_RUINS_ENTRY.value,
18: AEDoor.CR_PILLAR_ROOM_MAIN_RUINS.value,
19: AEDoor.SA_ENTRY.value,
20: AEDoor.CB_ENTRY.value,
21: AEDoor.CB_SECOND_ROOM_ENTRY.value,
22: AEDoor.CCAVE_ENTRY.value,
23: AEDoor.CCAVE_SECOND_ROOM_ENTRY.value,
24: AEDoor.DI_ENTRY.value,
25: AEDoor.DI_STOMACH_ENTRY.value,
26: AEDoor.DI_GALLERY_SLIDE_ELEVATOR.value,
27: AEDoor.DI_TENTACLE.value, # Invalid starting room when lamps and doors are not shuffled
28: AEDoor.DI_SLIDE_ROOM_STOMACH.value,
29: AEDoor.SM_ENTRY.value,
30: AEDoor.FR_ENTRY.value,
31: AEDoor.FR_WATER_CAVERNS.value,
32: AEDoor.FR_CAVERNS_ENTRY.value,
33: AEDoor.HS_ENTRY.value,
34: AEDoor.HS_HOT_SPRING.value,
35: AEDoor.HS_POLAR_BEAR_CAVE.value,
36: AEDoor.GA_ENTRY.value,
37: AEDoor.ST_ENTRY.value,
38: AEDoor.ST_TEMPLE.value,
39: AEDoor.ST_WELL.value,
40: AEDoor.WSW_ENTRY.value,
41: AEDoor.WSW_GONG_ENTRY.value,
42: AEDoor.WSW_MIDDLE_GONG.value,
43: AEDoor.WSW_OBSTACLE_MIDDLE.value,
44: AEDoor.WSW_BARREL_OBSTACLE.value,
45: AEDoor.CC_ENTRY.value,
46: AEDoor.CC_CASTLEMAIN_ENTRY.value,
47: AEDoor.CC_BASEMENT_ENTRY.value,
49: AEDoor.CC_BUTTON_BASEMENT_WATER.value,
50: AEDoor.CC_ELEVATOR_CASTLEMAIN.value,
51: AEDoor.CC_BELL_CASTLE.value,
53: AEDoor.CP_ENTRY.value,
54: AEDoor.CP_SEWERSFRONT_OUTSIDE.value,
55: AEDoor.CP_BARREL_SEWERS_FRONT.value,
56: AEDoor.SF_ENTRY.value,
57: AEDoor.SF_FACTORY_OUTSIDE.value,
58: AEDoor.SF_RC_CAR_FACTORY.value,
59: AEDoor.SF_LAVA_MECH.value,
60: AEDoor.SF_WHEEL_FACTORY_BOTTOM.value,
61: AEDoor.SF_CONVEYOR_LAVA.value,
62: AEDoor.SF_MECH_FACTORY.value,
63: AEDoor.TVT_ENTRY.value,
64: AEDoor.TVT_WATER_LOBBY.value,
65: AEDoor.TVT_LOBBY_OUTSIDE.value,
66: AEDoor.TVT_TANK_LOBBY.value,
67: AEDoor.TVT_FAN_TANK.value,
69: AEDoor.MM_SL_HUB.value,
72: AEDoor.MM_COASTER_ENTRY_SL_HUB.value,
73: AEDoor.MM_COASTER1_ENTRY.value,
74: AEDoor.MM_COASTER2_ENTRY.value,
75: AEDoor.MM_HAUNTED_HOUSE_DISEMBARK.value,
76: AEDoor.MM_COFFIN_HAUNTED_HOUSE.value,
77: AEDoor.MM_WESTERN_SL_HUB.value,
78: AEDoor.MM_CRATER_SL_HUB.value,
79: AEDoor.MM_OUTSIDE_CASTLE_CRATER.value,
80: AEDoor.MM_CASTLE_MAIN_OUTSIDE_CASTLE.value,
81: AEDoor.MM_INSIDE_CLIMB_CASTLE_MAIN.value,
82: AEDoor.MM_OUTSIDE_CLIMB_INSIDE_CLIMB.value,
84: AEDoor.MM_MONKEY_HEAD_CASTLE_MAIN.value,
85: AEDoor.MM_SIDE_ENTRY_OUTSIDE_CASTLE.value,
87: AEDoor.PPM_ENTRY.value
}
PPMShowCoins = 0x139966 # 0 = no coin icon, 2 = Have coin
Event_Load_Block = 0x0967E8 # Stops loading some base level's data (Monkey/coins count,events,etc.) if Start room != Vanilla start room
Event_Load_Block_On = 0x1697015C
Event_Load_Block_Off = 0x00000000
# 0x1697015C = Will branch off and ignore loading some base level's data if Start room != Vanilla start room
# 0x00000000 = Ignore the branch off and load all of the level's meta data (Monkey/coins count,events,etc.) even if Start room != Vanilla start room
# ========================= Lamps / Doors =========================
lockCamera = 0x162057 # Lock Camera (WsW Gong Room) Locked = 0x80, Free = 0x60
WSW_RoomState = 0x161F9E # Set to 1 to allow for the last caught monkey event to trigger the Stairs/Doors
# Array order: bytesToWrite, OpenValue, ClosedValue
doors_addresses = {
41: { # WSW_GongRoom
0x0BFCCB: [1, 0xF7, 0xFB], # WSW_Gong_BackDoorVisual1
0x0BFCCE: [1, 0x00, 0xFF], # WSW_Gong_CoinDoorVisual1
0x0BFCCF: [1, 0x00, 0xFF], # WSW_Gong_CoinDoorVisual2
0x0BFCEB: [1, 0xF7, 0xFB], # WSW_Gong_CoinDoorVisual3
0x0BFBCE: [1, 0xFF, 0x00], # WSW_Gong_StairVisual1
0x0BFBCF: [1, 0xFF, 0x00], # WSW_Gong_StairVisual2
0x0BFBEE: [1, 0xFF, 0x00], # WSW_Gong_StairVisual3
0x0BFBEF: [1, 0xFF, 0x00], # WSW_Gong_StairVisual4
0x15F7DB: [1, 0xF7, 0xFB], # WSW_Gong_BackDoorHitBox
0x15FAEB: [1, 0xF7, 0xFB], # WSW_Gong_CoinDoorHitBox
0x15FC7B: [1, 0x02, 0x00], # WSW_Gong_Stair1HitBox
0x15FCB3: [1, 0x01, 0x00], # WSW_Gong_Stair2HitBox
},
44: { # WSW_BarrelRoom
0x0C040A: [2, 0xE5E9, 0xE200], # WSW_Barrel_DoorVisual
0x170FCA: [2, 0xE5E9, 0xE200], # WSW_Barrel_DoorHitbox
},
67: { # TVT_FanRoom
0x0C028A: [2, 0xF3F2, 0xF000], # TVT_FanDoorVisual
0x1648C6: [2, 0xF3F2, 0xF000], # TVT_FanDoorHitBox
# 0x0BFFAE: [2, 0xFFFF, 0x0000], # TVT_GlassDoorVisual1
# 0x0BFFCE: [2, 0xFFFF, 0x0000], # TVT_GlassDoorVisual2
},
69: { # MM_DoubleDoor
0x0E7901: [1, 0x00, 0x10], # MM_DoubleDoorVisualL1
0x0E7905: [1, 0x10, 0x00], # MM_DoubleDoorVisualL2
0x0E790D: [1, 0xF0, 0x00], # MM_DoubleDoorVisualL3
0x0E7911: [1, 0x00, 0x10], # MM_DoubleDoorVisualL4
0x0E7921: [1, 0x00, 0x10], # MM_DoubleDoorVisualR1
0x0E7925: [1, 0xF0, 0x00], # MM_DoubleDoorVisualR2
0x0E792D: [1, 0x10, 0x00], # MM_DoubleDoorVisualR3
0x0E7931: [1, 0x00, 0x10], # MM_DoubleDoorVisualR4
0x170B34: [2, 0xFC50, 0xFE00], # MM_DoubleDoorHitboxL1
0x170B38: [2, 0x1680, 0x18D0], # MM_DoubleDoorHitboxL2
0x170B3A: [2, 0x0050, 0x0200], # MM_DoubleDoorHitboxL3
0x170B3E: [2, 0x0200, 0x0050], # MM_DoubleDoorHitboxL4
0x170B6C: [2, 0x03B0, 0x0200], # MM_DoubleDoorHitboxR1
0x170B70: [2, 0x1680, 0x18D0], # MM_DoubleDoorHitboxR2
0x170B72: [2, 0x0050, 0x0200], # MM_DoubleDoorHitboxR3
0x170B76: [2, 0x0200, 0x0050], # MM_DoubleDoorHitboxR4
},
75: { # Haunted Mansion
# Nothing to activate there
},
76: {
# Nothing, event is triggering even after the monkeys are manually set
}
}
#Old values, not used but let them here just in case
#localLamp_localUpdate = 0x097474 # Default: 9062007A. Set this to 0 to disable
#globalLamp_localUpdate = 0x097574 # Default: 9082007A. Set this to 0 to disable
#globalLamp_globalUpdate = 0x097568 # 0x097568 Default: 1444000F. Set this to 0 to disable
# More precise addresses for local monkeys/events
localLamp_MonkeyDetect = 0x097464
globalLamp_MonkeyDetect1 = 0x097564
globalLamp_MonkeyDetect2 = 0x097560
lampDoors_update = {
'localLamp_MonkeyDetect_ON':0x3C02800E,
'localLamp_MonkeyDetect_OFF': 0x00000000,
'globalLamp_MonkeyDetect1_ON': 0x02712021,
'globalLamp_MonkeyDetect1_OFF': 0x00000000,
'globalLamp_MonkeyDetect2_ON': 0x96420126,
'globalLamp_MonkeyDetect2_OFF': 0x00000000,
}
lampDoors_toggles = {
# CBLamp
# Array order: bytesToWrite, OpenValue, ClosedValue
20: { # CB_LampDoor
0x0C01AB: [1,0xF4,0xF8], #CB_LampDoor_Visual1 Open = F4
0x0C01AF: [1,0x00,0x80], #CB_LampDoor_Visual2 Open = 00
0x177B77: [1,0xF4,0xF8], #CB_LampDoor_Hitbox Open = F4
},
53: { # CP_Lamp
0x0E7901:[1,0x00,0x10], # CP_LampDoor_Visual1 Open = 00
0x0E7903:[1,0x10,0x00], # CP_LampDoor_Visual2 Open = 10
0x0E7907:[1,0xF0,0x00], # CP_LampDoor_Visual3 Open = F0
0x0E7909:[1,0x00,0x10], # CP_LampDoor_Visual4 Open = 00
0x17ABA0:[2,0xE0C0,0xE200], # CP_LampDoor_Hitbox1 Open = E0C0
0x17ABA6:[2,0x0040,0x0180], # CP_LampDoor_Hitbox2 Open = 0040
0x17ABA9:[2,0x8003,0x8000], # CP_LampDoor_Hitbox3 Open = 8003
},
79: { # MM_Lamp
0x0E79D1:[1,0x00,0x10], # MM_LampDoorL_Visual1 Open = 00
0x0E79C1:[1,0x00,0x10], # MM_LampDoorL_Visual2 Open = 00
0x0E79C5:[1,0xF0,0x00], # MM_LampDoorL_Visual3 Open = F0
0x0E79CD:[1,0x10,0x00], # MM_LampDoorL_Visual4 Open = 10
0x0E79E1:[1,0x00,0x10], # MM_LampDoorR_Visual1 Open = 00
0x0E79E5:[1,0x10,0x00], # MM_LampDoorR_Visual2 Open = 10
0x0E79ED:[1,0xF0,0x00], # MM_LampDoorR_Visual3 Open = F0
0x0E79F1:[1,0x00,0x10], # MM_LampDoorR_Visual4 Open = 00
0x173C08:[2,0xFD40,0xFE80], # MM_LampDoorL_Hitbox1 Open = FD40
0x173C0C:[4,0x00400B80,0x018009C0], # MM_LampDoorL_Hitbox2 Open = 00400B80
0x173C12:[2,0x0180,0x0040], # MM_LampDoorL_Hitbox3 Open = 0180
0x173CB0:[2,0x02C0,0x0180], # MM_LampDoorR_Hitbox1 Open = 02C0
0x173CB4:[4,0x00400B80,0x018009C0], # MM_LampDoorR_Hitbox2 Open = 00400B80
0x173CBA:[2,0x0180,0x0040] # MM_LampDoorR_Hitbox3 Open = 0180
},
26: { # DI_Lamp
0x0BFDAB:[1,0xF2,0xF6], # DI_LampDoor_Visual1 Open = F2 | Closed = F6
0x0BFDAF:[1,0x00,0x80], # DI_LampDoor_Visual2 Open = 00 | Closed = 80
0x169653:[1,0xF2,0xF6], # DI_LampDoor_Hitbox Open = F2 | Closed = F6
},
46: { # CrC_Lamp
0x0E7981:[1,0x00,0x10], # CrC_LampDoorL_Visual1 Open = 00
0x0E7985:[1,0xF0,0x00], # CrC_LampDoorL_Visual2 Open = F0
0x0E798D:[1,0x10,0x00], # CrC_LampDoorL_Visual3 Open = 10
0x0E7991:[1,0x00,0x10], # CrC_LampDoorL_Visual4 Open = 00
0x0E79A1:[1,0x00,0x10], # CrC_LampDoorR_Visual1 Open = 00
0x0E79A5:[1,0x10,0x00], # CrC_LampDoorR_Visual2 Open = 10
0x0E79AD:[1,0xF0,0x00], # CrC_LampDoorR_Visual3 Open = F0
0x0E79B1:[1,0x00,0x10], # CrC_LampDoorR_Visual4 Open = 00
0x1710C0:[2,0x0040,0x0100], # CrC_LampDoorL_Hitbox1 Open = 0040
0x1710C4:[4,0x00400400,0x010002C0], # CrC_LampDoorL_Hitbox2 Open = 00400400
0x1710CA:[2,0x0100,0x0040], # CrC_LampDoorL_Hitbox3 Open = 0100
0x1710F8:[2,0x03C0,0x0300], # CrC_LampDoorR_Hitbox1 Open = 03C0
0x1710FC:[4,0x00400400,0x010002C0], # CrC_LampDoorR_Hitbox2 Open = 00400400
0x171102:[2,0x0100,0x0040], # CrC_LampDoorR_Hitbox3 Open = 0100
},
57: { # SF_Lamp
0x0C04AD:[1,0x0B,0x0D], # SF_LampDoor_Visual1 Open = 0B
0x0C04AF:[1,0x00,0x80], # SF_LampDoor_Visual2 Open = 00
0x0C056D:[1,0x11,0x0F], # SF_LampDoor_Visual3 Open = 11
0x0C056F:[1,0x00,0x80], # SF_LampDoor_Visual4 Open = 00
0x16A499:[1,0x0B,0x0D], # SF_LampDoor_Hitbox1 Open = 0B
0x16A461:[1,0x11,0x0F], # SF_LampDoor_Hitbox2 Open = 11
},
65: { # TVT_LobbyLamp
0x0C042D:[1,0xFF,0xFD], # TvtL_LampDoorL_Visual1 Open = FF
0x0C042F:[1,0x00,0x80], # TvtL_LampDoorL_Visual2 Open = 00
0x0C046D:[1,0xF9,0xFB], # TvtL_LampDoorR_Visual1 Open = F9
0x0C046F:[1,0x00,0x80], # TvtL_LampDoorR_Visual2 Open = 00
0x170C51:[1,0xFF,0xFD], # TvtL_LampDoorL_Hitbox1 Open = FF
0x170C65:[1,0x80,0x00], # TvtL_LampDoorL_Hitbox2 Open = 80
0x170C89:[1,0xF9,0xFB], # TvtL_LampDoorR_Hitbox1 Open = F9
0x170C9D:[1,0x80,0x00], # TvtL_LampDoorR_Hitbox2 Open = 80
},
66: { # TVT_TankLamp
0x0C05AC:[4,0x00000DC0,0x80000F40], # TvtTR_LampDoorL_Visual Open = 00000DC0
0x0C056C:[4,0x00001240,0x800010C0], # TvtTR_LampDoorR_Visual Open = 00001240
0x16C294:[2,0x0DC0,0x0F40], # TvtTR_LampDoorL_Hitbox1 Open = 0DC0
0x16C2A9:[1,0x80,0x00], # TvtTR_LampDoorL_Hitbox2 Open = 80
0x16C2CC:[2,0x1240,0x10C0], # TvtTR_LampDoorR_Hitbox1 Open = 1240
0x16C2E1:[1,0x80,0x00], # TvtTR_LampDoorR_Hitbox2 Open = 80
},
}
DR_Block_Pushed = 0x18459A # Address is more of "Entry is open", but same result at the end
DI_Button_Pressed = 0x1693A6 # Activated = 0x01
CrC_Basement_ButtonPressed = 0x184D46 # Pressed = 0x01
CrC_Water_ButtonPressed = 0x173242 # 1 byte: While in room 49 -> Pressed = 0x01, Unpressed = 0x00 -> Send event object
MM_Painting_Button = 0x17EACE # Active 0x01 ROOM = 82
MM_MonkeyHead_Button = 0x174ECE # Active 0x01 ROOM = 84
TVT_Lobby_Button = 0x1710E6 # Active 0x01 ROOM = 65
buttonDoors_toggles = {
# Array order: bytesToWrite, OpenValue, ClosedValue
"DI_Button": {
0x1693A6: [1, 0x01, 0x00], # DI_Button_Pressed
0x0BFC8F: [1, 0x00, 0x80], # DI_Button_DoorVisual
0x1676F7: [1, 0xDC, 0xE0], # DI_Button_DoorHitBox
0x0BFCB8: [4, 0x80162250, 0x80161C34], # DI_Button_Visual1
0x0BFCBC: [4, 0x80162268, 0x80161C4C], # DI_Button_Visual2
0x0BFCC0: [4, 0x80162390, 0x80161D74], # DI_Button_Visual3
0x0BFCC4: [4, 0x80162288, 0x80161C6C], # DI_Button_Visual4
},
"CrCBasementButton": {
0x184D46: [1, 0x01, 0x00], # CrC_Basement_ButtonPressed
0x1810A8: [4, 0xF200F808, 0xF200F900], # CrC_Basement_DoorHitBox1
0x1810AC: [4, 0x0008FB00, 0x0100FC08], # CrC_Basement_DoorHitBox2
0x1810B0: [4, 0x01000400, 0x00080400], # CrC_Basement_DoorHitBox3
0x0E7AC1: [1, 0x00, 0x10], # CrC_Basement_DoorVisual1
0x0E7ACD: [1, 0xF0, 0x00], # CrC_Basement_DoorVisual2
0x0C1518: [4, 0x80178ADC, 0x80178534], # CrC_Basement_ButtonVisual1
0x0C151C: [4, 0x80178AF4, 0x8017854C], # CrC_Basement_ButtonVisual2
0x0C1520: [4, 0x80178C14, 0x80178670], # CrC_Basement_ButtonVisual3
0x0C1524: [4, 0x80178B0C, 0x80178568], # CrC_Basement_ButtonVisual4
},
"CrCWaterButton": {
0x0C05AB: [1, 0xDC, 0xE0], # CrC_Water_DoorVisual
0x1542BC: [1, 0x00, 0x03], # TR4_TransitionEnabled
},
"TVT_Lobby_Button": {
0x170EFF: [1, 0x00, 0x01], # TVT_Lobby_Water_HitBox
0x170E5D: [1, 0x80, 0x00], # TVT_Lobby_Water_DoorHitbox1
0x170E25: [1, 0x80, 0x00], # TVT_Lobby_Water_DoorHitbox2
0x0C04CF: [1, 0x00, 0x80], # TVT_Lobby_Water_DoorVisualP1
0x0C04EF: [1, 0x00, 0x80], # TVT_Lobby_Water_DoorVisualP2
0x0C0698: [2, 0xAC78, 0x8DAC], # TVT_Lobby_Water_BackColor1
0x0C069C: [2, 0xAC90, 0x8DC4], # TVT_Lobby_Water_BackColor2
0x0C06A0: [2, 0xAE14, 0x8F50], # TVT_Lobby_Water_BackColor3
0x0C06A4: [2, 0xAC9C, 0x8DD8], # TVT_Lobby_Water_BackColor4
0x0C06B8: [2, 0xB1B8, 0x92F4], # TVT_Lobby_Water_BackColor5
0x0C06BC: [2, 0xB1D0, 0x930C], # TVT_Lobby_Water_ColorS1P1
0x0C06C0: [2, 0xB2EC, 0x942C], # TVT_Lobby_Water_ColorS1P2
0x0C06C4: [2, 0xB1E4, 0x9324], # TVT_Lobby_Water_TunnelColorS1P1
0x0C07B8: [2, 0xB9A0, 0xA41C], # TVT_Lobby_Water_TunnelColorS1P2
0x0C07BC: [2, 0xB9B8, 0xA434], # TVT_Lobby_Water_TunnelColorS2P1
0x0C07C0: [2, 0xBB44, 0xA5C4], # TVT_Lobby_Water_TunnelColorS2P2
0x0C07C4: [2, 0xB9C4, 0xA444], # TVT_Lobby_Water_TunnelColorS2P3
0x0C07EA: [2, 0xF70C, 0xF100], # TVT_Lobby_WaterVisual1
0x0C07EF: [1, 0x00, 0x80], # TVT_Lobby_WaterVisual2
0x0C080A: [2, 0xF70C, 0xF100], # TVT_Lobby_WaterVisual3
0x0C080F: [1, 0x00, 0x80] # TVT_Lobby_WaterVisual4
},
"MM_MonkeyHead_Button": {
0x0AFA22: [1, 0x01, 0x00], # MM_MonkeyHead_Door
},
"MM_Painting_Button": {
0x0C1569: [1, 0x06, 0x02], # MM_Painting_Visual
0x18CF31: [1, 0x06, 0x02], # MM_Painting_HitBox
0x0C0EAE: [1, 0x03, 0x00], # MM_Painting_VisualStair1
0x0C0ECE: [1, 0x03, 0x00], # MM_Painting_VisualStair2
0x0C0EEE: [1, 0x03, 0x00], # MM_Painting_VisualStair3
0x18CEA1: [1, 0x00, 0x80], # MM_Painting_HitBoxStair1
0x18CED9: [1, 0x00, 0x80], # MM_Painting_HitBoxStair2
0x18CF11: [1, 0x00, 0x80], # MM_Painting_HitBoxStair3
0x0C0F4E: [1, 0x00, 0x01], # MM_Painting_VisualFence
0x18CF81: [1, 0x80, 0x00], # MM_Painting_HitBoxFence
},
}
MM_Professor_RescuedAddress = 0x0DFDDC # Not Rescued = 0, Rescued = 5
MM_Clown_State = 0x174072
MM_Natalie_RescuedAddress = 0x0DFDDD # Not Rescued = 0, Rescued = 5
MM_Natalie_CutsceneState = 0x0DFDDE # play cutscene = 0x00, cutscene played = 0x0D
MM_Natalie_Rescued_Local = 0x16F34E # When in Room 76: Natalie rescued = 0x01
MM_Jake_DefeatedAddress = 0x0DFDE0 # Not defeated = 0, Defeated = 5
MM_Lobby_DoubleDoor_OpenAddress = 0x174F5E # Set to 3 for electric fence. If JakeDefeated = 5 it will open the door
MM_Lobby_JakeDoor_HitboxAddress = 0x1711DD # Set to 128 to remove the hitbox
MM_Lobby_JakeDoorFenceAddress = 0x174FA6 # Maybe not used
MM_Lobby_DoorDetection = 0x0963C8 # 4b: Default to 8C820000. 8C800000 Prevent the door detection code from kicking in
MM_NatalieDoor_Visual1 = 0x0BFCEF # Open 0x00
MM_NatalieDoor_Visual2 = 0x0BFE0F # Open 0x00
MM_NatalieDoor_Hitbox = 0x167965 # Open 0x80
MM_AlertRoom_ButtonPressed = 0x172832 # Not pressed = 0x00, Pressed = 0x01
MM_AlertRoom_CutsceneTrigger1 = 0x1728C2 # 0x00 Cutscene pending, 0x02 Cutscene Triggered
MM_AlertRoom_BGCanPushButton = 0x1728DA # 0x03 BG cannot push the button, 0x00 BG can push it
# ===================== Input Related =====================
BUTTON_BYTE_ADDR_HIGH = 0x0B87A3 # Triggers and Face Buttons (contains bits 8-15 of the 16-bit word)
BUTTON_BYTE_ADDR_LOW = 0x0B87A2 # D-Pad, Start/Select, L3/R3 (contains bits 0-7 of the 16-bit word)
# Joystick Analog Axes (8-bit values, 0x80 is center)
# These 4 addresses are consecutive and will be written as a single 4-byte block starting at ANALOG_START_ADDR
ANALOG_START_ADDR = 0x0B87A4 # Start of analog joystick data (RY, RX, LY, LX)
# --- Button Mappings to Bit Positions within a conceptual 16-bit controller word ---
# This dictionary maps the button name (e.g., "P1 X") to its bit position (0-15)
# within the combined 16-bit digital input word.
BUTTON_BIT_MAP = {
#"P1 Select": 0, # Bit 0 (low byte)
"P1 L3": 1, # Bit 1 (low byte)
"P1 R3": 2, # Bit 2 (low byte)
#"P1 Start": 3, # Bit 3 (low byte)
#"P1 Up": 4, # Bit 4 (low byte)
#"P1 Right": 5, # Bit 5 (low byte)
#"P1 Down": 6, # Bit 6 (low byte)
#"P1 Left": 7, # Bit 7 (low byte)
"P1 L2": 8, # Bit 0 (high byte)
"P1 R2": 9, # Bit 1 (high byte)
"P1 L1": 10, # Bit 2 (high byte)
"P1 R1": 11, # Bit 3 (high byte)
"P1 Triangle": 12, # Bit 4 (high byte)
"P1 Circle": 13, # Bit 5 (high byte)
"P1 X": 14, # Bit 6 (high byte)
"P1 Square": 15, # Bit 7 (high byte)
}
#ANALOG_STICK_ORDER = ["P1 R_Y", "P1 R_X", "P1 L_Y", "P1 L_X"]
InputListener = 0x0A9A38
# When in Nathalie's Intro, will be at 2 when the player pressed something
# Not sure yet, but this value seems to react to inputs depending of actions.
ANALOG_STICK_ORDER = ["P1 R_Y", "P1 R_X"]
ANALOG_CENTER_VALUE = 0x80 # Default center value for 8-bit analog sticks (128 decimal)
RIGHT_JOYSTICK_PSEUDO_INPUT = "Right Joystick"
ControlsUpdate_DPAD_STARTSELECT_L3R3 = 0x02CA00 # Enabled : A0720000 Disabled : 00000000
Controls_DPAD_STARTSELECT_L3R3 = 0x0B87A2
Controls_TriggersShapes = 0x0B87A3
#===================== Gadget Related =====================
# A bit is 1 if the gadget is unlocked. First bit is club, second is net, etc.
unlockedGadgetsAddress = 0x0F51C4
# the gadgets on triangle, square, circle, X on successive bytes
# club = 0, net = 1, radar = 2, sling = 3, hoop = 4, punch = 5, flyer = 6, car = 7, empty = 255
triangleGadgetAddress = 0x0F51A8
squareGadgetAddress = 0x0F51A9
circleGadgetAddress = 0x0F51AA
crossGadgetAddress = 0x0F51AB
# which gadget is currently selected for use
heldGadgetAddress = 0x0EC2D2
GadgetValues = 0x0F5124 #32 bytes
GadgetValues2 = 0x0F5154 #32 bytes
# Notes:
# Club : GadgetValues can be anything,it's fine
# Net : GadgetValues can be the last value,it's fine
# Radar :
#
gadgetValue1 = 0x0F5124
# Radar: ALWAYS equal to Spike_X_Orientation
# Hoop :
# Off = 0x0000, On = 0x0001
# Punch :
# Punch extension 1: (Default) 0x0400
gadgetValue2 = 0x0F5126
# Radar: 0x0000 (Not used)
# Hoop :
# hoop_activated : standby = 0x0001, moving = 0x0000
# Punch :
# Punch extension 2: (Default) 0x0400
gadgetValue3 = 0x0F5128
# Radar: ALWAYS equal to Spike_Z_Orientation
# Hoop:
# Continuous spin timer (If the joystick spin is fast enough,this value goes up)
# Punch:
# PunchState : (Default) 0x0000
RadarValues = {
#0x0F5124 : 0x0000, #Radar_Orientation1 **Goes with Spike_X_Orientation
0x0F5126 : 0x0000, #Radar_Orientation2 **Not used,maybe Spike_Y_Orientation
#0x0F5128 : 0x0000, #Radar_Orientation3 **Goes with Spike_Z_Orientation
0x0F512A : 0x0001, #Radar_Orientation4
0x0F5134 : 0xFFFF, #Radar_SoundChannel1
0x0F5136 : 0xFFFF, #Radar_SoundChannel2
0x0F5138 : 0xE5A3, #Radar_SoundVariant
0x0F513A : 0x0000, #Radar_Scanned?
0x0F513C : 0x0000, #Radar_R2Flashing
}
# When sling is selected, string position is stored in these:
SlingValues = {
0x0F5124 : 0xFF9B, #SlingRope1_1
0x0F5126 : 0xFF55, #SlingRope1_2
0x0F5128 : 0xE5B9, #SlingRope1_3
0x0F512C : 0xFF5C, #SlingRope2_1
0x0F512E : 0xFF6B, #SlingRope2_2
0x0F5130 : 0xE595, #SlingRope2_3
0x0F5134 : 0xFF7B, #SlingRope3_1
0x0F5136 : 0xFF7F, #SlingRope3_2
0x0F5138 : 0xE5A3, #SlingRope3_3
}
HoopValues = {
0x0F5124: 0x0000, # Hoop_Activated
0x0F5126: 0x0000, # Hoop_Standby
0x0F5128: 0x0000, # Hoop_SpinProgress
0x0F512A: 0x0000, # Hoop_AnimationReset
0x0F512C: 0x00000000, # Hoop_AnimationState1
0x0F5130: 0x00000000, # Hoop_AnimationState2
0x0F5134: 0x00000000, # Hoop_AnimationState3
0x0F5138: 0x00000000, # Hoop_Orientation_X (Relative)
0x0F513C: 0x00000000, # Hoop_Orientation_Z (Relative)
0x0F5140: 0xFFFFFFFF, # Hoop_SoundChannel (Might need to reset it to last value)
}
PunchValues = {
0x0F5124: 0x04000400, # Punch_GlovePosition? (Relative)
0x0F5128: 0x0000, # Punch_ExtensionState
0x0F5134: 0x0000000, # Punch_Extend2
0x0F5138: 0x00000000, # Hoop_AnimationReset
}
gadgetUseStateAddress = 0x0B20CC
CatchingState = 0x0F44A0 # 0x00 Not catching , 0x08 Catching a Monkey
# 1 = "Net down"
# 8 = "Net down + can catch"
trainingRoomProgressAddress = 0x0DFDCC
GadgetTrainingsUnlockAddress = 0x0978E8 # 4 Bytes -> Prevent the checkup for activating Training Rooms Gadget Trainings (Default: 8C63FDCC, Disable: 0x00000000)
punchVisualAddress = 0x0E78C0
#===================== WaterNet related =====================
isUnderwater = 0x0F4DCA
canDiveAddress = 0x061970 #08018664 - default value (4 bytes)
canWaterCatchAddress = 0x063C35 # 04 - default value
swim_oxygenLevelAddress = 0x0F4DC8 # 0x258 = 20 seconds, 0x64 = 3 seconds
swim_oxygenReplenishSoundAddress = 0x06140C # Default: 0C021DFE, disable: 00000000 4 bytes
swim_ReplenishOxygenUWAddress = 0x06141C # Default: A4500018, Disable: 00000000 4 bytes
swim_replenishOxygenOnEntryAddress = 0x0665E8 # Default: A4434DC8, Disable: 00000000 4 bytes
swim_surfaceDetectionAddress = 0x061420 # Default: 0801853A, disable: 0
swim_oxygenLowLevelSoundAddress = 0x061458 # Default: 3C02800F, disable: 3C028004 4 bytes
swim_oxygenMidLevelSoundAddress = 0x061490 # Default: 3C02800F, disable: 3C028004 4 bytes
# ==================== Transition Related ====================
Nearby_RoomIDAddress = 0x0E38B4
Nearby_DoorIDAddress = 0x0E38A4
Warp_State = 0x0F4480 #0x01 Spawning, 0x02 = Warping back to Hub, 0x03 ??, 0x04 Exiting Transition
Transition_Screen_Progress = 0x0F4482 #0x18 = Full black screen, 0x00 is normal
TransitionFlag = 0x0E3893 # Different stage of processing the transitions
Screen_Fading = 0x0E0930
LoadingState = 0x0E38B0
# To translate Transition ID from doorTransitions Table to which address we need to change for the room
transitionAddresses = {
# --Array content--
# TR_ID: {TargetRoomAddress,TargetDoorAddress}
1: [0x154264, 0x154268],
2: [0x15428C, 0x154290],
3: [0x1542B4, 0x1542B8],
4: [0x1542DC, 0x1542E0],
5: [0x154304, 0x154308],
6: [0x15432C, 0x154330],
7: [0x154354, 0x154358],
8: [0x15437C, 0x154380],
}
TR4_TransitionEnabled = 0x1542BC # For CrC_Boss_Door -> Blocked value: 0x03, Opened Value: 0x00
transitionPhaseAddress = 0x0F447C # TheDragon Note: If you set Nearby_RoomIDAddress and Nearby_DoorIDAddress
transitionPhase ={
"Spawning" : 0x01, # 0x01 = ?? Maybe spawning
"DeathScreen": 0x02, # 0x02 = Black screen fading out
"Playing" : 0x03, # 0x03 = in level, not near a transition
"Nearby" : 0x04, # 0x04 or 0x05 = near a transition
"Loaded" : 0x05,
"InTransition" : 0x06, # 0x06 = Starting transition
"NotSpawned" : 0x07, # 0x07 = When in LevelSelect or not spawned?
"InitialSpawn" : 0x19 # 0x19 = Spawning in air
}
Transition1_X = 0x154248 #4 bytes
Transition1_Y = 0x15424C #4 bytes
Transition1_Z = 0x154250 #4 bytes
# ==================== Game States + Menu/Level Select ====================
gameStateAddress = 0x0F4470
gameState = {
"Sony": 0x0,
"Menu": 0x3,
"Cutscene": 0x8,
"LevelSelect": 0x9,
"LevelIntro": 0xA,
"InLevel": 0xB,
"Cleared": 0xC,
"TimeStation": 0xD,
"Save/Load": 0xE,
"GameOver": 0xF,
"NewGadget": 0x11,
"LevelIntroTT": 0x12,
"InLevelTT": 0x13,
"ClearedTT": 0x14,
"Memory": 0x15,
"JakeIntro": 0x17,
"Jake": 0x18,
"JakeCleared": 0x19,
"Cutscene2": 0x1A,
"Book": 0x1C,
"Credits1": 0x1D,
"Credits2": 0x1E,
"PostCredits": 0x23,
"Demo": 0x24
}
currentRoomIdAddress = 0x0F4476
currentLevelAddress = 0x0F4474
gameRunningAddress = 0x0B01C0
newGameAddress = 0x137734
loadGameAddress = 0x137734
currentLoadedSave = 0x0E0034 # Not used for now, but could be used somehow
menuStateAddress = 0x0A9A1B
menuState2Address = 0x0A9A23
# LevelSelection addresses (Number -1)
selectedWorldAddress = 0x139BC4
selectedLevelAddress = 0x139BCC
selectedSaveLoadMenuEntry = 0x13AF52
preventRoomOverride = 0x1380DC #False = 0xA6420126, True = 0
worldIsScrollingRight = 0x139BD9 # 2 bytes: 0xFFFF = you are changing to the next world
worldScrollToRightDPAD = 0x1381D4 # 2 bytes: Enabled = 0009, Disabled = 0000
worldScrollToRightR1 = 0x138270 # 2 bytes: Enabled = 0009, Disabled = 0000
enteredWorldAddress = 0x0F461C
enteredLevelAddress = 0x0F461D
startOfLevelNames = 0x1399E8
startOfEraNames = 0x139B20
levelselectFonts = 0x139CF6 # 0x36 = Classic One 0x26 = Current One
time_attack_Times = 0x0DFD44
coinsperlevel = {
1: {
1
},
2: {
2
},
3: {
3
},
4: {
6, 7, 8, 9
},
5: {
11, 12, 13, 14
},
6: {
17
},
7: { #Stadium Attack
95,96,97,98,99
},
8: {
21
},
9: {
23
},
10: {
24,25,28
},
11: {
29
},
12: {
30, 31, 32
},
13: {
34, 35
},
14: { # Gladiator Attack
90,91,92,93,94
},
15: {
37, 38, 39
},
16: {
40, 41, 44
},
17: {
45, 46, 49, 50
},
20: {
53, 54, 55
},
21: {
58, 59
},
22: {
64, 66
},
24: {
73, 74, 75, 77, 78, 79, 80, 82, 84, 85
},
30: { #PPM
}
}
# ==================== Kickout Prevention ====================
localLevelState = 0x0F447E # Same as level state, but can be changed to impact some behaviors (Like Kickout Prevention)
kickoutofLevelAddress = 0x097B98 # 4 bytes: Default 84830188, Disable kickout = 00000000 (050E67EC)
kickoutofLevelAddress2 = 0x097B70 # BETTER 4 bytes: Default 24020001, Disable kickout = 00000000
CrC_BossPhaseAddress = 0x17475E
CrC_BossLife = 0x0E69E1
# 0 :not started
# 1 and 2: In cinematic
# 3: In fight
# 4: Opening door
# 5: Victory
TVT_BossPhase = 0x17C5A2
TVT_BossLife = 0x143E1F
# 1 In cinematic for boss
# 2 Boss in waiting
# 3 Boss in progress
CrC_DoorVisual = 0x0C062B
CrC_DoorHitBox = 0x164FFB
CrC_kickoutofLevelAddress = 0x097B20 # 4 bytes: Default 86020166, Disable kickout = 00000000
CrC_kickoutofLevelAddress2 = 0x097B24 # 4 bytes: Default 84830188, Disable kickout = 00000000
TVT_kickoutofLevelAddress = 0x097B00 # 4 bytes: Default 84830188, Disable kickout = 00000000
# ==================== Spike Addresses ====================
spikeStateAddress = 0x0EC250
spikeState2Address = 0x0EC23E
spikeIdleTimer = 0x0EC328 # Put this to 0x0000 to wake up
spikeGroundStateAddress = 0x0EC23D
spikeHittableAddress = 0x0EC227
spikeSuperFlyerUseState = 0x0EC2E0 # 0x00 = SuperFlyer activated
# This value is also shared with the Spawn/Return to hub animations, but we don't have a use for that in the rando
spikeSkinPalette = 0x0EC1E5
spikeColor = 0x0EC2D4
#spikeColor2 = 0x0EC1E6
spike_RedColorUpdate = 0x063AEC
spike_GreenColorUpdate = 0x063B00
spike_BlueColorUpdate = 0x063B04
spike_LavaOrIceTimer = 0x0EC2D0 # 0100 means Spike is being launched in the air
Spike_X_PosAddress = 0x0EC204 #4 bytes
Spike_Y_PosAddress = 0x0EC208 #4 bytes
Spike_Z_PosAddress = 0x0EC20C #4 bytes
Spike_X_Orientation = 0x0EC240 #4 bytes
Spike_Z_Orientation = 0x0EC244 #4 bytes
Spike_Y_Velocity_Value = 0x0EC214 # 1 byte : Max Speed -> Up : 0x01, Down : 0x80
Spike_Y_Velocity_BitFlag = 0x0EC215 # 3 bytes : 0xFFFFFF = Up | 0x000000 = Down
# Velocity Update addresses
# These addresses are responsible for updating velocity
# Setting them to 0 prevents velocity from changing.
# *It will still stay at the value it was BEFORE setting these addresses to 0*
Spike_VelocityUpdates = {
0x063424: [4, 0xAE0A0030, 0x00000000], # SpikeX_VelocityUpdate
0x06343C: [4, 0xAE090034, 0x00000000], # SpikeY_VelocityUpdate
0x063480: [4, 0xAE040038, 0x00000000], # SpikeZ_VelocityUpdate
}
#Postion Update addresses
#These addresses lock the ability for the game to update the XYZ values of Spike
# When set to 0 Spike cannot move
Spike_PosUpdates = {
0x0728A8 : [4,0xAE030000,0x00000000], # SpikeX_PosLock1
0x0734D4 : [4,0xAE620000,0x00000000], # SpikeX_PosLock2
0x0738B0 : [4,0xAE620000,0x00000000], # SpikeX_PosLock3
0x072E80 : [4,0xAE020004,0x00000000], # SpikeY_PosLock1
0x072E8C : [4,0xAE020004,0x00000000], # SpikeY_PosLock2
0x0728E4 : [4,0xAE030008,0x00000000], # SpikeZ_PosLock1
0x0734CC : [4,0xAE630008,0x00000000], # SpikeZ_PosLock2
0x0738C8 : [4,0xAE620008,0x00000000], # SpikeZ_PosLock3
}
Spike_CanMove = 0x0F4450 # 0x00 means can move, 0x01 means cannot move (And every odd bit like 0x03)
SpecialRoom_CameraMode = 0x0C0798 #0x00 = Fixed, 0x01 = Overhead, 0x02 = StrictFollowCam
SpecialRoom_CameraRotateLeft = 0x0C07C4 #0x00 = Not tilted, 0xFF = Tilted
SpecialRoom_CameraRotateRight = 0x0C07C5 #0x00 = Not tilted, 0xFF = Tilted
Inside_CameraMode = 0x0C0F98 #0x00 = Fixed, 0x01 = Overhead, 0x02 = StrictFollowCam
Inside_CameraRotateLeft = 0x0C0FC4 #0x00 = Not tilted, 0xFF = Tilted
Inside_CameraRotateRight = 0x0C0FC5 #0x00 = Not tilted, 0xFF = Tilted
Boss_CameraMode = 0x0C1798 #0x00 = Fixed, 0x01 = Overhead, 0x02 = StrictFollowCam
Boss_CameraRotateLeft = 0x0C17C4 #0x00 = Not tilted, 0xFF = Tilted
Boss_CameraRotateRight = 0x0C17C5 #0x00 = Not tilted, 0xFF = Tilted
Outside_CameraMode = 0x0C1F98 #0x00 = Fixed, 0x01 = Overhead, 0x02 = StrictFollowCam
Outside_CameraRotateLeft = 0x0C1FC4 #0x00 = Not tilted, 0xFF = Tilted
Outside_CameraRotateRight = 0x0C1FC5 #0x00 = Not tilted, 0xFF = Tilted
SPIKE_INVINCIBILITY_ADDR = 0x05E748 # Address for Spike's invincibility flag/state
SPIKE_GOLDEN_FORM_ADDR = 0x0EC2E2 # Address for Spike's golden visual state flag/model ID
# Values to write to these addresses to enable/disable effects.
INVINCIBLE_ON_VALUE = 0xA46200E0 # Value to write to SPIKE_INVINCIBILITY_ADDR to make Spike invincible
INVINCIBLE_OFF_VALUE = 0xA46200E8 # Value to write to SPIKE_INVINCIBILITY_ADDR to make Spike vulnerable
GOLDEN_ON_VALUE = 0x01 # Value to write to SPIKE_GOLDEN_FORM_ADDR to activate golden form
GOLDEN_OFF_VALUE = 0x00 # Value to write to SPIKE_GOLDEN_FORM_ADDR to revert form
colortable = {
"vanilla": 0, #This value is not important as the value is overwritten in the client
"dark": 0x000000,
"white": 0xFFFFFF,
"red": 0x0000FF,
"green": 0x00FF00,
"blue": 0xFF0000,
"yellow": 0x00FFFF,
"cyan": 0xFFFF00,
"magenta": 0xFF00FF
}
skinpallettable = {
"vanilla": 0x1030,
#"white": 0x7617,
"white": 0x101F, # Pallet seems consistent in all levels, used as base for spikecolor
"grey": 0x5E03,
"purple": 0x1000,
"orange": 0x2F2F,
"green": 0x35F6,
"red": 0x2F00,
"yellow": 0x1065,
"darkblue": 0x2600, #6F65
"voidwhite": 0x2E05,
"voidpurple": 0x4DFA,
"voidorange": 0x0007,
#"voidred": 0x372E, #More like voidbrown sometimes
"neonpink": 0x3BFF,
"neongreen": 0x2EF6,
"greenskin": 0x0131,
"blueskin": 0x75D8,
"purpleskin": 0x75D7,
"alien": 0x3300,
"alien2": 0x350C,
"metal": 0x3674,
"rave": 0x1D2F
}
# ==================== Specter Related ====================
# Specter bosses values
S1_P1_Life = 0x1408FB
S1_P2_State = 0x144A04
S1_P2_Life = 0x144A06
S1_P1_FightTrigger = 0x16A5B2 # 1 byte. Put to 0x0D to prevent the fight, 0x00 to allow the fight
S1_Cutscene_Redirection = 0x137C28 # 4 bytes. When GameState is 0A, change the last 2 bytes to redirect another gamestate after the cutscene (Redirect to time station = 2403000D)
S2_isCaptured = 0x142328
S2_Cutscene_Redirection = 0x05C5F0 # 4 bytes. Change the last 2 bytes to redirect another gamestate after the cutscene (Redirect to time station = 2403000D)
S2_CutsceneState = 0x163272
S2_GlobalCutsceneState = 0x0DFDE4 # 0x05 means you beat Specter previously
# S1_LArm_Life = 0x14474E
# S1_RArm_Life = 0x1446B6
tempSpecter2CompleteAddress = 0x0DFBEE
tempSpecter1CompleteAddress = 0x0DFBEF
Specter2CompleteAddress = 0x0E00FE
Specter1CompleteAddress = 0x0E00FF