Files
dockipelago/worlds/apeescape/Locations.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

759 lines
28 KiB
Python

from typing import Optional, Dict, Set
from BaseClasses import Location
from worlds.apeescape.Strings import AELocation, AEDoor
base_location_id = 128000000
class ApeEscapeLocation(Location):
game: str = "Ape Escape"
GROUPED_LOCATIONS: Dict[str, Set[str]] = {}
location_table = {
# 1-1 Fossil Field
AELocation.W1L1Noonan.value: 1,
AELocation.W1L1Jorjy.value: 2,
AELocation.W1L1Nati.value: 3,
AELocation.W1L1TrayC.value: 4,
# 1-2 Primordial Ooze
AELocation.W1L2Shay.value: 5,
AELocation.W1L2DrMonk.value: 6,
AELocation.W1L2Grunt.value: 7,
AELocation.W1L2Ahchoo.value: 8,
AELocation.W1L2Gornif.value: 9,
AELocation.W1L2Tyrone.value: 10,
# 1-3 Molten Lava
AELocation.W1L3Scotty.value: 11,
AELocation.W1L3Coco.value: 12,
AELocation.W1L3JThomas.value: 13,
AELocation.W1L3Mattie.value: 14,
AELocation.W1L3Barney.value: 15,
AELocation.W1L3Rocky.value: 16,
AELocation.W1L3Moggan.value: 17,
# 2-1 Thick Jungle
AELocation.W2L1Marquez.value: 18,
AELocation.W2L1Livinston.value: 19,
AELocation.W2L1George.value: 20,
AELocation.W2L1Maki.value: 21,
AELocation.W2L1Herb.value: 22,
AELocation.W2L1Dilweed.value: 23,
AELocation.W2L1Mitong.value: 24,
AELocation.W2L1Stoddy.value: 25,
AELocation.W2L1Nasus.value: 26,
AELocation.W2L1Selur.value: 27,
AELocation.W2L1Elehcim.value: 28,
AELocation.W2L1Gonzo.value: 29,
AELocation.W2L1Alphonse.value: 30,
AELocation.W2L1Zanzibar.value: 31,
# 2-2 Dark Ruins
AELocation.W2L2Mooshy.value: 32,
AELocation.W2L2Kyle.value: 33,
AELocation.W2L2Cratman.value: 34,
AELocation.W2L2Nuzzy.value: 35,
AELocation.W2L2Mav.value: 36,
AELocation.W2L2Stan.value: 37,
AELocation.W2L2Bernt.value: 38,
AELocation.W2L2Runt.value: 39,
AELocation.W2L2Hoolah.value: 40,
AELocation.W2L2Papou.value: 41,
AELocation.W2L2Kenny.value: 42,
AELocation.W2L2Trance.value: 43,
AELocation.W2L2Chino.value: 44,
# 2-3 Cryptic Relics
AELocation.W2L3Troopa.value: 45,
AELocation.W2L3Spanky.value: 46,
AELocation.W2L3Stymie.value: 47,
AELocation.W2L3Pally.value: 48,
AELocation.W2L3Freeto.value: 49,
AELocation.W2L3Jesta.value: 50,
AELocation.W2L3Bazzle.value: 51,
AELocation.W2L3Crash.value: 52,
# 4-1 Crabby Beach
AELocation.W4L1CoolBlue.value: 53,
AELocation.W4L1Sandy.value: 54,
AELocation.W4L1ShellE.value: 55,
AELocation.W4L1Gidget.value: 56,
AELocation.W4L1Shaka.value: 57,
AELocation.W4L1MaxMahalo.value: 58,
AELocation.W4L1Moko.value: 59,
AELocation.W4L1Puka.value: 60,
# 4-2 Coral Cave
AELocation.W4L2Chip.value: 61,
AELocation.W4L2Oreo.value: 62,
AELocation.W4L2Puddles.value: 63,
AELocation.W4L2Kalama.value: 64,
AELocation.W4L2Iz.value: 65,
AELocation.W4L2Jux.value: 66,
AELocation.W4L2BongBong.value: 67,
AELocation.W4L2Pickles.value: 68,
# 4-3 Dexter's Island
AELocation.W4L3Stuw.value: 69,
AELocation.W4L3TonTon.value: 70,
AELocation.W4L3Murky.value: 71,
AELocation.W4L3Howeerd.value: 72,
AELocation.W4L3Robbin.value: 73,
AELocation.W4L3Jakkee.value: 74,
AELocation.W4L3Frederic.value: 75,
AELocation.W4L3Baba.value: 76,
AELocation.W4L3Mars.value: 77,
AELocation.W4L3Horke.value: 78,
AELocation.W4L3Quirck.value: 79,
# 5-1 Snowy Mammoth
AELocation.W5L1Popcicle.value: 80,
AELocation.W5L1Iced.value: 81,
AELocation.W5L1Denggoy.value: 82,
AELocation.W5L1Skeens.value: 83,
AELocation.W5L1Rickets.value: 84,
AELocation.W5L1Chilly.value: 85,
# 5-2 Frosty Retreat
AELocation.W5L2Storm.value: 86,
AELocation.W5L2Qube.value: 87,
AELocation.W5L2Gash.value: 88,
AELocation.W5L2Kundra.value: 89,
AELocation.W5L2Shadow.value: 90,
AELocation.W5L2Ranix.value: 91,
AELocation.W5L2Sticky.value: 92,
AELocation.W5L2Sharpe.value: 93,
AELocation.W5L2Droog.value: 94,
# 5-3 Hot Springs
AELocation.W5L3Punky.value: 95,
AELocation.W5L3Ameego.value: 96,
AELocation.W5L3Roti.value: 97,
AELocation.W5L3Dissa.value: 98,
AELocation.W5L3Yoky.value: 99,
AELocation.W5L3Jory.value: 100,
AELocation.W5L3Crank.value: 101,
AELocation.W5L3Claxter.value: 102,
AELocation.W5L3Looza.value: 103,
# 7-1 Sushi Temple
AELocation.W7L1Taku.value: 104,
AELocation.W7L1Rocka.value: 105,
AELocation.W7L1Maralea.value: 106,
AELocation.W7L1Wog.value: 107,
AELocation.W7L1Long.value: 108,
AELocation.W7L1Mayi.value: 109,
AELocation.W7L1Owyang.value: 110,
AELocation.W7L1QuelTin.value: 111,
AELocation.W7L1Phaldo.value: 112,
AELocation.W7L1Voti.value: 113,
AELocation.W7L1Elly.value: 114,
AELocation.W7L1Chunky.value: 115,
# 7-2 Wabi Sabi Wall
AELocation.W7L2Minky.value: 116,
AELocation.W7L2Zobbro.value: 117,
AELocation.W7L2Xeeto.value: 118,
AELocation.W7L2Moops.value: 119,
AELocation.W7L2Zanabi.value: 120,
AELocation.W7L2Buddha.value: 121,
AELocation.W7L2Fooey.value: 122,
AELocation.W7L2Doxs.value: 123,
AELocation.W7L2Kong.value: 124,
AELocation.W7L2Phool.value: 125,
# 7-3 Crumbling Castle
AELocation.W7L3Naners.value: 126,
AELocation.W7L3Robart.value: 127,
AELocation.W7L3Neeners.value: 128,
AELocation.W7L3Gustav.value: 129,
AELocation.W7L3Wilhelm.value: 130,
AELocation.W7L3Emmanuel.value: 131,
AELocation.W7L3SirCutty.value: 132,
AELocation.W7L3Calligan.value: 133,
AELocation.W7L3Castalist.value: 134,
AELocation.W7L3Deveneom.value: 135,
AELocation.W7L3Igor.value: 136,
AELocation.W7L3Charles.value: 137,
AELocation.W7L3Astur.value: 138,
AELocation.W7L3Kilserack.value: 139,
AELocation.W7L3Ringo.value: 140,
AELocation.W7L3Densil.value: 141,
AELocation.W7L3Figero.value: 142,
AELocation.W7L3Fej.value: 143,
AELocation.W7L3Joey.value: 144,
AELocation.W7L3Donqui.value: 145,
# 8-1 City Park
AELocation.W8L1Kaine.value: 146,
AELocation.W8L1Jaxx.value: 147,
AELocation.W8L1Gehry.value: 148,
AELocation.W8L1Alcatraz.value: 149,
AELocation.W8L1Tino.value: 150,
AELocation.W8L1QBee.value: 151,
AELocation.W8L1McManic.value: 152,
AELocation.W8L1Dywan.value: 153,
AELocation.W8L1CKHutch.value: 154,
AELocation.W8L1Winky.value: 155,
AELocation.W8L1BLuv.value: 156,
AELocation.W8L1Camper.value: 157,
AELocation.W8L1Huener.value: 158,
# 8-2 Specter's Factory
AELocation.W8L2BigShow.value: 159,
AELocation.W8L2Dreos.value: 160,
AELocation.W8L2Reznor.value: 161,
AELocation.W8L2Urkel.value: 162,
AELocation.W8L2VanillaS.value: 163,
AELocation.W8L2Radd.value: 164,
AELocation.W8L2Shimbo.value: 165,
AELocation.W8L2Hurt.value: 166,
AELocation.W8L2String.value: 167,
AELocation.W8L2Khamo.value: 168,
# 8-3 TV Tower
AELocation.W8L3Fredo.value: 169,
AELocation.W8L3Charlee.value: 170,
AELocation.W8L3Mach3.value: 171,
AELocation.W8L3Tortuss.value: 172,
AELocation.W8L3Manic.value: 173,
AELocation.W8L3Ruptdis.value: 174,
AELocation.W8L3Eighty7.value: 175,
AELocation.W8L3Danio.value: 176,
AELocation.W8L3Roosta.value: 177,
AELocation.W8L3Tellis.value: 178,
AELocation.W8L3Whack.value: 179,
AELocation.W8L3Frostee.value: 180,
# 9-1 Monkey Madness
AELocation.W9L1Goopo.value: 181,
AELocation.W9L1Porto.value: 182,
AELocation.W9L1Slam.value: 183,
AELocation.W9L1Junk.value: 184,
AELocation.W9L1Crib.value: 185,
AELocation.W9L1Nak.value: 186,
AELocation.W9L1Cloy.value: 187,
AELocation.W9L1Shaw.value: 188,
AELocation.W9L1Flea.value: 189,
AELocation.W9L1Schafette.value: 190,
AELocation.W9L1Donovan.value: 191,
AELocation.W9L1Laura.value: 192,
AELocation.W9L1Uribe.value: 193,
AELocation.W9L1Gordo.value: 194,
AELocation.W9L1Raeski.value: 195,
AELocation.W9L1Poopie.value: 196,
AELocation.W9L1Teacup.value: 197,
AELocation.W9L1Shine.value: 198,
AELocation.W9L1Wrench.value: 199,
AELocation.W9L1Bronson.value: 200,
AELocation.W9L1Bungee.value: 201,
AELocation.W9L1Carro.value: 202,
AELocation.W9L1Carlito.value: 203,
AELocation.W9L1BG.value: 204,
AELocation.Specter.value: 205,
# 9-2 Peak Point Matrix
AELocation.Specter2.value: 206,
# Coins
AELocation.Coin1.value: 301,
AELocation.Coin2.value: 302,
AELocation.Coin3.value: 303,
AELocation.Coin6.value: 306,
AELocation.Coin7.value: 307,
AELocation.Coin8.value: 308,
AELocation.Coin9.value: 309,
AELocation.Coin11.value: 311,
AELocation.Coin12.value: 312,
AELocation.Coin13.value: 313,
AELocation.Coin14.value: 314,
AELocation.Coin17.value: 317,
AELocation.Coin19A.value: 295,
AELocation.Coin19B.value: 296,
AELocation.Coin19C.value: 297,
AELocation.Coin19D.value: 298,
AELocation.Coin19E.value: 299,
AELocation.Coin21.value: 321,
AELocation.Coin23.value: 323,
AELocation.Coin24.value: 324,
AELocation.Coin25.value: 325,
AELocation.Coin28.value: 328,
AELocation.Coin29.value: 329,
AELocation.Coin30.value: 330,
AELocation.Coin31.value: 331,
AELocation.Coin32.value: 332,
AELocation.Coin34.value: 334,
AELocation.Coin35.value: 335,
AELocation.Coin36A.value: 290,
AELocation.Coin36B.value: 291,
AELocation.Coin36C.value: 292,
AELocation.Coin36D.value: 293,
AELocation.Coin36E.value: 294,
AELocation.Coin37.value: 337,
AELocation.Coin38.value: 338,
AELocation.Coin39.value: 339,
AELocation.Coin40.value: 340,
AELocation.Coin41.value: 341,
AELocation.Coin44.value: 344,
AELocation.Coin45.value: 345,
AELocation.Coin46.value: 346,
AELocation.Coin49.value: 349,
AELocation.Coin50.value: 350,
AELocation.Coin53.value: 353,
AELocation.Coin54.value: 354,
AELocation.Coin55.value: 355,
AELocation.Coin58.value: 358,
AELocation.Coin59.value: 359,
AELocation.Coin64.value: 364,
AELocation.Coin66.value: 366,
AELocation.Coin73.value: 373,
AELocation.Coin74.value: 374,
AELocation.Coin75.value: 375,
AELocation.Coin77.value: 377,
AELocation.Coin78.value: 378,
AELocation.Coin79.value: 379,
AELocation.Coin80.value: 380,
AELocation.Coin85.value: 385,
AELocation.Coin84.value: 384,
AELocation.Coin82.value: 382,
# Mailboxes
AELocation.Mailbox1.value: 401,
AELocation.Mailbox2.value: 402,
AELocation.Mailbox3.value: 403,
AELocation.Mailbox4.value: 404,
AELocation.Mailbox5.value: 405,
AELocation.Mailbox6.value: 406,
AELocation.Mailbox7.value: 407,
AELocation.Mailbox8.value: 408,
AELocation.Mailbox9.value: 409,
AELocation.Mailbox10.value: 410,
AELocation.Mailbox11.value: 411,
AELocation.Mailbox12.value: 412,
AELocation.Mailbox13.value: 413,
AELocation.Mailbox14.value: 414,
AELocation.Mailbox15.value: 415,
AELocation.Mailbox16.value: 416,
AELocation.Mailbox17.value: 417,
AELocation.Mailbox18.value: 418,
AELocation.Mailbox19.value: 419,
AELocation.Mailbox20.value: 420,
AELocation.Mailbox21.value: 421,
AELocation.Mailbox22.value: 422,
AELocation.Mailbox23.value: 423,
AELocation.Mailbox24.value: 424,
AELocation.Mailbox25.value: 425,
AELocation.Mailbox26.value: 426,
AELocation.Mailbox27.value: 427,
AELocation.Mailbox28.value: 428,
AELocation.Mailbox29.value: 429,
AELocation.Mailbox30.value: 430,
AELocation.Mailbox31.value: 431,
AELocation.Mailbox32.value: 432,
AELocation.Mailbox33.value: 433,
AELocation.Mailbox34.value: 434,
AELocation.Mailbox35.value: 435,
AELocation.Mailbox36.value: 436,
AELocation.Mailbox37.value: 437,
AELocation.Mailbox38.value: 438,
AELocation.Mailbox39.value: 439,
AELocation.Mailbox40.value: 440,
AELocation.Mailbox41.value: 441,
AELocation.Mailbox42.value: 442,
AELocation.Mailbox43.value: 443,
AELocation.Mailbox44.value: 444,
AELocation.Mailbox45.value: 445,
AELocation.Mailbox46.value: 446,
AELocation.Mailbox47.value: 447,
AELocation.Mailbox48.value: 448,
AELocation.Mailbox49.value: 449,
AELocation.Mailbox50.value: 450,
AELocation.Mailbox51.value: 451,
AELocation.Mailbox52.value: 452,
AELocation.Mailbox53.value: 453,
AELocation.Mailbox54.value: 454,
AELocation.Mailbox55.value: 455,
AELocation.Mailbox56.value: 456,
AELocation.Mailbox57.value: 457,
AELocation.Mailbox58.value: 458,
AELocation.Mailbox59.value: 459,
AELocation.Mailbox60.value: 460,
AELocation.Mailbox61.value: 461,
AELocation.Mailbox62.value: 462,
AELocation.Mailbox63.value: 463,
# Bosses
AELocation.Boss73.value: 500,
AELocation.Boss83.value: 501,
AELocation.W9L1Professor.value: 502,
AELocation.W9L1Jake.value: 503
}
#Where RAM.levels[address] : Total monkeys count
hundoMonkeysCount = {
0x01: 4, # Fossil
0x02: 6, # Primordial
0x03: 7, # Molten
0x04: 14, # Thick
0x05: 13, # Dark
0x06: 8, # Cryptic
0x07: 0, # Stadium
0x08: 8, # Crabby
0x09: 8, # Coral
0x0A: 11, # Dexter
0x0B: 6, # Snowy
0x0C: 9, # Frosty
0x0D: 9, # Hot
0x0E: 0, # Gladiator
0x0F: 12, # Sushi
0x10: 10, # Wabi
0x11: 20, # Crumbling
0x14: 13, # City
0x15: 10, # Factory
0x16: 12, # TV
0x18: 24 # Specter
#0x1E: 0 # Specter2
}
hundoCoinsCount = {
0x01: 1, # Fossil
0x02: 1, # Primordial
0x03: 1, # Molten
0x04: 4, # Thick
0x05: 4, # Dark
0x06: 1, # Cryptic
0x07: 5, # Stadium
0x08: 1, # Crabby
0x09: 1, # Coral
0x0A: 3, # Dexter
0x0B: 1, # Snowy
0x0C: 3, # Frosty
0x0D: 2, # Hot
0x0E: 5, # Gladiator
0x0F: 3, # Sushi
0x10: 3, # Wabi
0x11: 4, # Crumbling
0x14: 3, # City
0x15: 2, # Factory
0x16: 2, # TV
0x18: 10 # Specter
#0x1E: 0 # Specter2
}
cointable = {
301,
302,
303,
306,
307,
308,
309,
311,
312,
313,
314,
317,
295,
296,
297,
298,
299,
321,
323,
324,
325,
328,
329,
330,
331,
332,
334,
335,
290,
291,
292,
293,
294,
337,
338,
339,
340,
341,
344,
345,
346,
349,
350,
353,
354,
355,
358,
359,
364,
366,
373,
374,
375,
377,
378,
379,
380,
385,
384,
382,
374,
375,
377,
378,
379,
380,
385,
384,
382,
}
# These values are the room ID of the room, and the door ID the room is entered through. To get these, stand near the transition that leads to that entrance. As an example, {45, 5} will spawn Spike at the top of the Bell Tower, as though he entered from outside.
# Array order: {TargetRoom, TargetDoor, Transition ID}
# -- TargetRoom : (Exit) If you want to warp to this Room, set the Entering door's TargetRoomAddress value to this
# -- TargetDoor : (Exit) If you want to warp to this Room, set the Entering door's TargetDoorAddress value to this
# -- Transition ID : (Enter) Transition ID to use with RAM.transitionAddresses.You should modify the addresses referred by this ID to what you want the target room to be
# Transition ID should be 0 if this is a transition that has no door related to it (Like a level spawn or inaccessible transition)
doorTransitions = {
AEDoor.FF_ENTRY.value: [1, 0, 0],
AEDoor.PO_ENTRY.value: [2, 0, 0],
AEDoor.ML_ENTRY.value: [3, 0, 0],
AEDoor.ML_ENTRY_VOLCANO.value: [3, 2, 1],
AEDoor.ML_ENTRY_TRICERATOPS.value: [3, 3,2],
AEDoor.ML_VOLCANO_ENTRY.value: [4, 0, 1],
AEDoor.ML_TRICERATOPS_ENTRY.value: [5, 0, 1],
AEDoor.TJ_ENTRY.value: [6, 0, 0],
AEDoor.TJ_ENTRY_MUSHROOM.value: [6, 2, 1],
AEDoor.TJ_ENTRY_FISH.value: [6, 3, 2],
AEDoor.TJ_ENTRY_BOULDER.value: [6, 4, 3],
AEDoor.TJ_MUSHROOM_ENTRY.value: [7, 0, 1],
AEDoor.TJ_FISH_ENTRY.value: [8, 0, 1],
AEDoor.TJ_FISH_TENT.value: [8, 2, 2],
AEDoor.TJ_TENT_FISH.value: [9, 0, 1],
AEDoor.TJ_TENT_BOULDER.value: [9, 2, 2],
AEDoor.TJ_BOULDER_ENTRY.value: [10, 2, 2],
AEDoor.TJ_BOULDER_TENT.value: [10, 0, 1],
AEDoor.DR_ENTRY.value: [11, 0, 0],
AEDoor.DR_OUTSIDE_FENCE.value: [11, 2, 1],
AEDoor.DR_OUTSIDE_HOLE.value: [11, 3, 2],
AEDoor.DR_OUTSIDE_OBELISK_BOTTOM.value: [11, 4, 3],
AEDoor.DR_OUTSIDE_OBELISK_TOP.value: [11, 5, 4],
AEDoor.DR_OUTSIDE_WATER_BUTTON.value: [11, 6, 5],
AEDoor.DR_OUTSIDE_WATER_LEDGE.value: [11, 7, 6],
AEDoor.DR_FAN_OUTSIDE_FENCE.value: [12, 2, 2],
AEDoor.DR_FAN_OUTSIDE_HOLE.value: [12, 0, 1],
AEDoor.DR_OBELISK_BOTTOM.value: [13, 0, 1],
AEDoor.DR_OBELISK_TOP.value: [13, 2, 2],
AEDoor.DR_WATER_SIDE.value: [14, 0, 1],
AEDoor.DR_WATER_LEDGE.value: [14, 2, 2],
AEDoor.CR_ENTRY.value: [15, 0, 0],
AEDoor.CR_ENTRY_SIDE_ROOM.value: [15, 2, 1],
AEDoor.CR_ENTRY_MAIN_RUINS.value: [15, 3, 2],
AEDoor.CR_SIDE_ROOM_ENTRY.value: [16, 0, 1],
AEDoor.CR_MAIN_RUINS_ENTRY.value: [17, 0, 1],
AEDoor.CR_MAIN_RUINS_PILLAR_ROOM.value: [17, 2, 2],
AEDoor.CR_PILLAR_ROOM_MAIN_RUINS.value: [18, 0, 1],
AEDoor.SA_ENTRY.value: [19, 0, 0],
AEDoor.CB_ENTRY.value: [20, 0, 0],
AEDoor.CB_ENTRY_SECOND_ROOM.value: [20, 2, 1],
AEDoor.CB_SECOND_ROOM_ENTRY.value: [21, 0, 1],
AEDoor.CCAVE_ENTRY.value: [22, 0, 0],
AEDoor.CCAVE_ENTRY_SECOND_ROOM.value: [22, 2, 1],
AEDoor.CCAVE_SECOND_ROOM_ENTRY.value: [23, 0, 1],
AEDoor.DI_ENTRY.value: [24, 0, 0],
AEDoor.DI_ENTRY_STOMACH.value: [24, 2, 1],
AEDoor.DI_STOMACH_ENTRY.value: [25, 0, 1],
AEDoor.DI_STOMACH_SLIDE_ROOM.value: [25, 2, 2],
AEDoor.DI_GALLERY_SLIDE_ELEVATOR.value: [26, 0, 1],
AEDoor.DI_GALLERY_TENTACLE.value: [26, 2, 2],
AEDoor.DI_GALLERY_SLIDE_ROOM_TOP.value: [26, 3, 3],
AEDoor.DI_TENTACLE.value: [27, 0, 1],
AEDoor.DI_SLIDE_ROOM_STOMACH.value: [28, 0, 1],
AEDoor.DI_SLIDE_ROOM_GALLERY.value: [28, 2, 2],
AEDoor.DI_SLIDE_ROOM_GALLERY_WATER.value: [28, 3, 3],
AEDoor.SM_ENTRY.value: [29, 0, 0],
AEDoor.FR_ENTRY.value: [30, 0, 0],
AEDoor.FR_ENTRY_CAVERNS.value: [30, 2, 1],
AEDoor.FR_WATER_CAVERNS.value: [31, 0, 1],
AEDoor.FR_CAVERNS_ENTRY.value: [32, 0, 1],
AEDoor.FR_CAVERNS_WATER.value: [32, 2, 2],
AEDoor.HS_ENTRY.value: [33, 0, 0],
AEDoor.HS_ENTRY_HOT_SPRING.value: [33, 2, 1],
AEDoor.HS_ENTRY_POLAR_BEAR_CAVE.value: [33, 3, 2],
AEDoor.HS_HOT_SPRING.value: [34, 0, 1],
AEDoor.HS_POLAR_BEAR_CAVE.value: [35, 0, 1],
AEDoor.GA_ENTRY.value: [36, 0, 0],
AEDoor.ST_ENTRY.value: [37, 0, 0],
AEDoor.ST_ENTRY_TEMPLE.value: [37, 2, 1],
AEDoor.ST_ENTRY_WELL.value: [37, 3, 2],
AEDoor.ST_TEMPLE.value: [38, 0, 1],
AEDoor.ST_WELL.value: [39, 0, 1],
AEDoor.WSW_ENTRY.value: [40, 0, 0],
AEDoor.WSW_ENTRY_GONG.value: [40, 2, 1],
AEDoor.WSW_GONG_ENTRY.value: [41, 0, 1],
AEDoor.WSW_GONG_MIDDLE.value: [41, 2, 2],
AEDoor.WSW_MIDDLE_GONG.value: [42, 0, 2],
AEDoor.WSW_MIDDLE_OBSTACLE.value: [42, 2, 1],
AEDoor.WSW_OBSTACLE_MIDDLE.value: [43, 0, 2],
AEDoor.WSW_OBSTACLE_BARREL.value: [43, 2, 1],
AEDoor.WSW_BARREL_OBSTACLE.value: [44, 0, 1],
AEDoor.CC_ENTRY.value: [45, 0, 0],
AEDoor.CC_ENTRY_BASEMENT.value: [45, 4, 1],
AEDoor.CC_ENTRY_CASTLE.value: [45, 2, 2],
AEDoor.CC_ENTRY_BELL.value: [45, 5, 3],
AEDoor.CC_ENTRY_BOSS.value: [45, 6, 4],
AEDoor.CC_CASTLEMAIN_ENTRY.value: [46, 0, 1],
AEDoor.CC_CASTLEMAIN_BELL.value: [46, 2, 2],
AEDoor.CC_CASTLEMAIN_ELEVATOR.value: [46, 3, 3],
AEDoor.CC_BASEMENT_ENTRY.value: [47, 0, 1],
AEDoor.CC_BASEMENT_BUTTON_DOWN.value: [47, 2, 4],
AEDoor.CC_BASEMENT_BUTTON_UP.value: [47, 3, 2],
AEDoor.CC_BASEMENT_ELEVATOR.value: [47, 4, 3],
AEDoor.CC_BOSS_ROOM.value: [48, 0, 1],
AEDoor.CC_BUTTON_BASEMENT_WATER.value: [49, 0, 1],
AEDoor.CC_BUTTON_BASEMENT_LEDGE.value: [49, 2, 2],
AEDoor.CC_ELEVATOR_CASTLEMAIN.value: [50, 0, 1],
AEDoor.CC_ELEVATOR_BASEMENT.value: [50, 2, 2],
AEDoor.CC_BELL_CASTLE.value: [51, 0, 1],
AEDoor.CC_BELL_ENTRY.value: [51, 2, 2],
AEDoor.CP_ENTRY.value: [53, 0, 0],
AEDoor.CP_OUTSIDE_SEWERS_FRONT.value: [53, 2, 1],
AEDoor.CP_OUTSIDE_BARREL.value: [53, 3, 2],
AEDoor.CP_SEWERSFRONT_OUTSIDE.value: [54, 0, 1],
AEDoor.CP_SEWERSFRONT_BARREL.value: [54, 2, 2],
AEDoor.CP_BARREL_SEWERS_FRONT.value: [55, 0, 1],
AEDoor.CP_BARREL_OUTSIDE.value: [55, 2, 2],
AEDoor.SF_ENTRY.value: [56, 0, 0],
AEDoor.SF_OUTSIDE_FACTORY.value: [56, 2, 1],
AEDoor.SF_FACTORY_RC_CAR.value: [57, 2 , 1],
AEDoor.SF_FACTORY_WHEEL_BOTTOM.value: [57, 3, 2],
AEDoor.SF_FACTORY_WHEEL_TOP.value: [57, 4, 3],
AEDoor.SF_FACTORY_MECH.value: [57, 5, 4],
AEDoor.SF_FACTORY_OUTSIDE.value: [57, 0, 5],
AEDoor.SF_RC_CAR_FACTORY.value: [58, 0, 1],
AEDoor.SF_LAVA_MECH.value: [59, 0, 1],
AEDoor.SF_LAVA_CONVEYOR.value: [59, 2, 2],
AEDoor.SF_WHEEL_FACTORY_BOTTOM.value: [60, 0, 1],
AEDoor.SF_WHEEL_FACTORY_TOP.value: [60, 2, 2],
AEDoor.SF_CONVEYOR_LAVA.value: [61, 0, 1],
AEDoor.SF_CONVEYOR1_ENTRY.value: [61, 7, 8],
AEDoor.SF_CONVEYOR2_ENTRY.value: [61, 7, 7],
AEDoor.SF_CONVEYOR3_ENTRY.value: [61, 6, 6],
AEDoor.SF_CONVEYOR4_ENTRY.value: [61, 5, 5],
AEDoor.SF_CONVEYOR5_ENTRY.value: [61, 4, 4],
AEDoor.SF_CONVEYOR6_ENTRY.value: [61, 3, 3],
AEDoor.SF_CONVEYOR7_ENTRY.value: [61, 2, 2],
AEDoor.SF_MECH_FACTORY.value: [62, 0, 1],
AEDoor.SF_MECH_LAVA.value: [62, 2, 2],
AEDoor.TVT_ENTRY.value: [63, 0, 0],
AEDoor.TVT_OUTSIDE_LOBBY.value: [63, 2, 1],
AEDoor.TVT_WATER_LOBBY.value: [64, 0, 1],
AEDoor.TVT_LOBBY_OUTSIDE.value: [65, 0, 1],
AEDoor.TVT_LOBBY_WATER.value: [65, 2, 2],
AEDoor.TVT_LOBBY_TANK.value: [65, 3, 3],
AEDoor.TVT_TANK_LOBBY.value: [66, 0, 1],
AEDoor.TVT_TANK_BOSS.value: [66, 2, 2],
AEDoor.TVT_TANK_FAN.value: [66, 3, 3],
AEDoor.TVT_FAN_TANK.value: [67, 0, 1],
AEDoor.TVT_BOSS_TANK.value: [68, 0, 1],
AEDoor.MM_SL_HUB.value: [69, 0, 0],
AEDoor.MM_SL_HUB_COASTER.value: [69, 2, 1],
AEDoor.MM_SL_HUB_CIRCUS.value: [69, 3, 2],
AEDoor.MM_SL_HUB_WESTERN.value: [69, 4, 3],
AEDoor.MM_SL_HUB_GO_KARZ.value: [69, 5, 4],
AEDoor.MM_SL_HUB_CRATER.value: [69, 6, 5],
AEDoor.MM_GO_KARZ_SL_HUB.value: [70, 0, 1],
AEDoor.MM_CIRCUS_SL_HUB.value: [71, 0, 1],
AEDoor.MM_COASTER_ENTRY_SL_HUB.value: [72, 0, 1],
AEDoor.MM_COASTER_ENTRY_COASTER1.value: [72, 2, 2], # IHNN note - Entrance only door, normally inaccessible. Equivalent to 72, 3.
AEDoor.MM_COASTER_ENTRY_DISEMBARK.value: [72, 3, 0],
AEDoor.MM_COASTER1_ENTRY.value: [73, 0, 0],
AEDoor.MM_COASTER1_COASTER2.value: [73, 2, 1], # IHNN note - Entrance only door, normally inaccessible. Equivalent to 73, 0.
AEDoor.MM_COASTER2_ENTRY.value: [74, 0, 0],
AEDoor.MM_COASTER2_HAUNTED_HOUSE.value: [74, 2, 1], # IHNN note - Entrance only door, normally inaccessible. Equivalent to 74, 0.
AEDoor.MM_HAUNTED_HOUSE_DISEMBARK.value: [75, 0, 0],
AEDoor.MM_HAUNTED_HOUSE_COFFIN.value: [75, 3, 1],
AEDoor.MM_COFFIN_HAUNTED_HOUSE.value: [76, 0, 1],
AEDoor.MM_COFFIN_COASTER_ENTRY.value: [76, 2, 2], # IHNN note - Entrance only door, normally inaccessible. Spawns Spike in the center of the coffins.
AEDoor.MM_WESTERN_SL_HUB.value: [77, 0, 1],
AEDoor.MM_CRATER_SL_HUB.value: [78, 0, 1],
AEDoor.MM_CRATER_OUTSIDE_CASTLE.value: [78, 2, 2],
AEDoor.MM_OUTSIDE_CASTLE_CASTLE_MAIN.value: [79, 2, 1],
AEDoor.MM_OUTSIDE_CASTLE_SIDE_ENTRY.value: [79, 3, 2],
AEDoor.MM_OUTSIDE_CASTLE_CRATER.value: [79, 0, 3],
AEDoor.MM_CASTLE_MAIN_OUTSIDE_CASTLE.value: [80, 0, 1],
AEDoor.MM_CASTLE_MAIN_MONKEY_HEAD.value: [80, 2, 2],
AEDoor.MM_CASTLE_MAIN_INSIDE_CLIMB.value: [80, 3, 3],
AEDoor.MM_CASTLE_MAIN_FROM_OUTSIDE.value: [80, 4, 0],
AEDoor.MM_CASTLE_MAIN_SPECTER1.value: [80, 5, 4], # IHNN note - Invalid connection.
# Thedragon005 note - The connection exists, but it is oneway only (Correspond to entering the transition to specter)
# The invalid connection here would be AEDoor.MM_SPECTER1_ROOM_CASTLE_MAIN since you cannot exit the Specter fight once in the room
AEDoor.MM_INSIDE_CLIMB_OUTSIDE_CLIMB.value: [81, 2, 1],
AEDoor.MM_INSIDE_CLIMB_CASTLE_MAIN.value: [81, 0, 2],
AEDoor.MM_OUTSIDE_CLIMB_INSIDE_CLIMB.value: [82, 0, 1],
AEDoor.MM_OUTSIDE_CLIMB_CASTLE_MAIN.value: [82, 2, 2], # IHNN note - Entrance only door, normally inaccessible. Spawns Spike at the top, by the mech.
AEDoor.MM_SPECTER1_ROOM.value: [83, 0, 0],
AEDoor.MM_MONKEY_HEAD_CASTLE_MAIN.value: [84, 0, 1],
AEDoor.MM_SIDE_ENTRY_OUTSIDE_CASTLE.value: [85, 0, 1],
AEDoor.PPM_ENTRY.value: [87, 0, 0], # IHNN note - noticed this was missing, have not validated the room.
AEDoor.TIME_ENTRY.value: [88, 0, 0],
AEDoor.TIME_MAIN_TRAINING.value: [88, 3, 1],
AEDoor.TIME_MAIN_MINIGAME.value: [88, 2, 2],
AEDoor.TIME_MINIGAME_MAIN.value: [91, 1, 1],
AEDoor.TIME_TRAINING_MAIN.value: [90, 0, 1],
AEDoor.TIME_TRAINING_WATERNET.value: [90, 1, 2],
AEDoor.TIME_TRAINING_RADAR.value: [90, 2, 3],
AEDoor.TIME_TRAINING_SLING.value: [90, 3, 4],
AEDoor.TIME_TRAINING_HOOP.value: [90, 4, 5],
AEDoor.TIME_TRAINING_FLYER.value: [90, 5, 6],
AEDoor.TIME_TRAINING_CAR.value: [90, 6, 7],
AEDoor.TIME_TRAINING_PUNCH.value: [90, 7, 8],
}
def createLocationGroups():
# Iterate through all locations
for x in range (0, len(location_table)):
locname = list(location_table.keys())[x]
# Add to location group for each level
if "1-1" in locname:
GROUPED_LOCATIONS.setdefault("Fossil Field", []).append(locname)
elif "1-2" in locname:
GROUPED_LOCATIONS.setdefault("Primordial Ooze", []).append(locname)
elif "1-3" in locname:
GROUPED_LOCATIONS.setdefault("Molten Lava", []).append(locname)
elif "2-1" in locname:
GROUPED_LOCATIONS.setdefault("Thick Jungle", []).append(locname)
elif "2-2" in locname:
GROUPED_LOCATIONS.setdefault("Dark Ruins", []).append(locname)
elif "2-3" in locname:
GROUPED_LOCATIONS.setdefault("Cryptic Relics", []).append(locname)
elif "3-1" in locname:
GROUPED_LOCATIONS.setdefault("Stadium Attack", []).append(locname)
GROUPED_LOCATIONS.setdefault("Races", []).append(locname)
elif "4-1" in locname:
GROUPED_LOCATIONS.setdefault("Crabby Beach", []).append(locname)
elif "4-2" in locname:
GROUPED_LOCATIONS.setdefault("Coral Cave", []).append(locname)
elif "4-3" in locname:
GROUPED_LOCATIONS.setdefault("Dexters Island", []).append(locname)
elif "5-1" in locname:
GROUPED_LOCATIONS.setdefault("Snowy Mammoth", []).append(locname)
elif "5-2" in locname:
GROUPED_LOCATIONS.setdefault("Frosty Retreat", []).append(locname)
elif "5-3" in locname:
GROUPED_LOCATIONS.setdefault("Hot Springs", []).append(locname)
elif "6-1" in locname:
GROUPED_LOCATIONS.setdefault("Gladiator Attack", []).append(locname)
GROUPED_LOCATIONS.setdefault("Races", []).append(locname)
elif "7-1" in locname:
GROUPED_LOCATIONS.setdefault("Sushi Temple", []).append(locname)
elif "7-2" in locname:
GROUPED_LOCATIONS.setdefault("Wabi Sabi Wall", []).append(locname)
elif "7-3" in locname:
GROUPED_LOCATIONS.setdefault("Crumbling Castle", []).append(locname)
elif "8-1" in locname:
GROUPED_LOCATIONS.setdefault("City Park", []).append(locname)
elif "8-2" in locname:
GROUPED_LOCATIONS.setdefault("Specters Factory", []).append(locname)
elif "8-3" in locname:
GROUPED_LOCATIONS.setdefault("TV Tower", []).append(locname)
elif "9-1" in locname:
GROUPED_LOCATIONS.setdefault("Monkey Madness", []).append(locname)
elif "Time Station" in locname:
GROUPED_LOCATIONS.setdefault("Time Station", []).append(locname)
if "Mailbox" in locname:
GROUPED_LOCATIONS.setdefault("Mailboxes", []).append(locname)
elif "Coin" in locname:
GROUPED_LOCATIONS.setdefault("Specter Coins", []).append(locname)
elif ("Specter" in locname and "Factory" not in locname) or "Boss" in locname or "Jake" in locname or "Professor" in locname:
GROUPED_LOCATIONS.setdefault("Bosses", []).append(locname)
elif ("Monkey" in locname and "Monkey Madness" not in locname) or ("Monkey Madness Monkey" in locname):
GROUPED_LOCATIONS.setdefault("Monkeys", []).append(locname)
createLocationGroups()