forked from mirror/Archipelago
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
2789 lines
80 KiB
Python
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
|