diff --git a/BaseClasses.py b/BaseClasses.py index 7e18ba60..d2a886a6 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -681,7 +681,33 @@ class CollectionState(object): or (self.has('Cane of Byrna', player) and (enemies < 6 or self.can_extend_magic(player))) or self.can_shoot_arrows(player) or self.has('Fire Rod', player) - ) + ) + + # In the future, this can be used to check if the player starts without bombs + def can_use_bombs(self, player): + StartingBombs = True + return StartingBombs or self.has('Bomb Upgrade (+10)', player) + + def can_hit_crystal(self, player): + return (self.can_use_bombs(player) + or self.can_shoot_arrows(player) + or self.has_blunt_weapon(player) + or self.has('Blue Boomerang', player) + or self.has('Red Boomerang', player) + or self.has('Hookshot', player) + or self.has('Fire Rod', player) + or self.has('Ice Rod', player) + or self.has('Cane of Somaria', player) + or self.has('Cane of Byrna', player)) + + def can_hit_crystal_through_barrier(self, player): + return (self.can_use_bombs(player) + or self.can_shoot_arrows(player) + or self.has('Blue Boomerang', player) + or self.has('Red Boomerang', player) + or self.has('Fire Rod', player) + or self.has('Ice Rod', player) + or self.has('Cane of Somaria', player)) def can_shoot_arrows(self, player): if self.world.retro[player]: @@ -1329,6 +1355,11 @@ class Door(object): self.edge_width = width return self + def kind(self, world): + if self.roomIndex != -1 and self.doorListPos != -1: + return world.get_room(self.roomIndex, self.player).kind(self) + return None + def small_key(self): self.smallKey = True return self diff --git a/Bosses.py b/Bosses.py index de04cbef..c1f311ef 100644 --- a/Bosses.py +++ b/Bosses.py @@ -39,8 +39,7 @@ def MoldormDefeatRule(state, player): return state.has_blunt_weapon(player) def HelmasaurKingDefeatRule(state, player): - # TODO: technically possible with the hammer - return state.has_sword(player) or state.can_shoot_arrows(player) + return (state.has('Hammer', player) or state.can_use_bombs(player)) and (state.has_sword(player) or state.can_shoot_arrows(player)) def ArrghusDefeatRule(state, player): if not state.has('Hookshot', player): diff --git a/DoorShuffle.py b/DoorShuffle.py index 4e4d4d3b..1b505377 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -1957,6 +1957,7 @@ def determine_init_crystal(initial, state, start_regions): return CrystalBarrier.Orange else: raise Exception(f'Can\'t get to {start_region.name} from initial state') +# raise Exception(f'Can\'t get to {start_region.name} from initial state\n{state.dungeon}\n{state.found_locations}') def explore_state(state, world, player): @@ -2034,27 +2035,83 @@ logical_connections = [ ('Desert Main Lobby Right Path', 'Desert Right Alcove'), ('Desert Left Alcove Path', 'Desert Main Lobby'), ('Desert Right Alcove Path', 'Desert Main Lobby'), + + ('Hera Lobby to Front Barrier - Blue', 'Hera Front'), + ('Hera Front to Lobby Barrier - Blue', 'Hera Lobby'), + ('Hera Lobby to Crystal', 'Hera Lobby - Crystal'), + ('Hera Lobby Crystal Exit', 'Hera Lobby'), + ('Hera Front to Crystal', 'Hera Front - Crystal'), + ('Hera Front to Back Bypass', 'Hera Back'), + ('Hera Front Crystal Exit', 'Hera Front'), + ('Hera Front to Down Stairs Barrier - Blue', 'Hera Down Stairs Landing'), + ('Hera Front to Up Stairs Barrier - Orange', 'Hera Up Stairs Landing'), + ('Hera Front to Back Barrier - Orange', 'Hera Back'), + ('Hera Down Stairs to Front Barrier - Blue', 'Hera Front'), + ('Hera Down Stairs Landing to Ranged Crystal', 'Hera Down Stairs Landing - Ranged Crystal'), + ('Hera Down Stairs Landing Ranged Crystal Exit', 'Hera Down Stairs Landing'), + ('Hera Up Stairs to Front Barrier - Orange', 'Hera Front'), + ('Hera Up Stairs Landing to Ranged Crystal', 'Hera Up Stairs Landing - Ranged Crystal'), + ('Hera Up Stairs Landing Ranged Crystal Exit', 'Hera Up Stairs Landing'), + ('Hera Back to Front Barrier - Orange', 'Hera Front'), + ('Hera Back to Ranged Crystal', 'Hera Back - Ranged Crystal'), + ('Hera Back Ranged Crystal Exit', 'Hera Back'), + ('Hera Basement Cage to Crystal', 'Hera Basement Cage - Crystal'), + ('Hera Basement Cage Crystal Exit', 'Hera Basement Cage'), + ('Hera Tridorm to Crystal', 'Hera Tridorm - Crystal'), + ('Hera Tridorm Crystal Exit', 'Hera Tridorm'), + ('Hera Startile Wide to Crystal', 'Hera Startile Wide - Crystal'), + ('Hera Startile Wide Crystal Exit', 'Hera Startile Wide'), ('Hera Big Chest Hook Path', 'Hera Big Chest Landing'), ('Hera Big Chest Landing Exit', 'Hera 4F'), + ('PoD Pit Room Block Path N', 'PoD Pit Room Blocked'), ('PoD Pit Room Block Path S', 'PoD Pit Room'), - ('PoD Arena Bonk Path', 'PoD Arena Bridge'), - ('PoD Arena Main Crystal Path', 'PoD Arena Crystal'), - ('PoD Arena Crystal Path', 'PoD Arena Main'), - ('PoD Arena Main Orange Barrier', 'PoD Arena North'), + ('PoD Arena Landing Bonk Path', 'PoD Arena Bridge'), ('PoD Arena North Drop Down', 'PoD Arena Main'), ('PoD Arena Bridge Drop Down', 'PoD Arena Main'), + ('PoD Arena North to Landing Barrier - Orange', 'PoD Arena Landing'), + ('PoD Arena Main to Ranged Crystal', 'PoD Arena Main - Ranged Crystal'), + ('PoD Arena Main to Landing Barrier - Blue', 'PoD Arena Landing'), + ('PoD Arena Main to Landing Bypass', 'PoD Arena Landing'), + ('PoD Arena Main to Right Bypass', 'PoD Arena Right'), + ('PoD Arena Main Ranged Crystal Exit', 'PoD Arena Main'), + ('PoD Arena Bridge to Ranged Crystal', 'PoD Arena Bridge - Ranged Crystal'), + ('PoD Arena Bridge Ranged Crystal Exit', 'PoD Arena Bridge'), + ('PoD Arena Landing to Main Barrier - Blue', 'PoD Arena Main'), + ('PoD Arena Landing to Right Barrier - Blue', 'PoD Arena Right'), + ('PoD Arena Landing to North Barrier - Orange', 'PoD Arena North'), + ('PoD Arena Right to Landing Barrier - Blue', 'PoD Arena Landing'), + ('PoD Arena Right to Ranged Crystal', 'PoD Arena Right - Ranged Crystal'), + ('PoD Arena Right Ranged Crystal Exit', 'PoD Arena Right'), + ('PoD Arena Ledge to Ranged Crystal', 'PoD Arena Ledge - Ranged Crystal'), + ('PoD Arena Ledge Ranged Crystal Exit', 'PoD Arena Ledge'), ('PoD Map Balcony Drop Down', 'PoD Sexy Statue'), + ('PoD Map Balcony to Ranged Crystal', 'PoD Map Balcony - Ranged Crystal'), + ('PoD Map Balcony Ranged Crystal Exit', 'PoD Map Balcony'), ('PoD Basement Ledge Drop Down', 'PoD Stalfos Basement'), ('PoD Falling Bridge Path N', 'PoD Falling Bridge Ledge'), ('PoD Falling Bridge Path S', 'PoD Falling Bridge'), - ('PoD Bow Statue Crystal Path', 'PoD Bow Statue Moving Wall'), - ('PoD Bow Statue Moving Wall Path', 'PoD Bow Statue'), - ('PoD Bow Statue Moving Wall Cane Path', 'PoD Bow Statue'), - ('PoD Dark Pegs Hammer Path', 'PoD Dark Pegs Ladder'), - ('PoD Dark Pegs Ladder Hammer Path', 'PoD Dark Pegs'), - ('PoD Dark Pegs Ladder Cane Path', 'PoD Dark Pegs Switch'), - ('PoD Dark Pegs Switch Path', 'PoD Dark Pegs Ladder'), + ('PoD Bow Statue Left to Right Barrier - Orange', 'PoD Bow Statue Right'), + ('PoD Bow Statue Left to Right Bypass', 'PoD Bow Statue Right'), + ('PoD Bow Statue Left to Crystal', 'PoD Bow Statue Left - Crystal'), + ('PoD Bow Statue Left Crystal Exit', 'PoD Bow Statue Left'), + ('PoD Bow Statue Right to Left Barrier - Orange', 'PoD Bow Statue Left'), + ('PoD Bow Statue Right to Ranged Crystal', 'PoD Bow Statue Right - Ranged Crystal'), + ('PoD Bow Statue Ranged Crystal Exit', 'PoD Bow Statue Right'), + ('PoD Dark Pegs Landing to Right', 'PoD Dark Pegs Right'), + ('PoD Dark Pegs Landing to Ranged Crystal', 'PoD Dark Pegs Landing - Ranged Crystal'), + ('PoD Dark Pegs Right to Landing', 'PoD Dark Pegs Landing'), + ('PoD Dark Pegs Right to Middle Barrier - Orange', 'PoD Dark Pegs Middle'), + ('PoD Dark Pegs Right to Middle Bypass', 'PoD Dark Pegs Middle'), + ('PoD Dark Pegs Middle to Right Barrier - Orange', 'PoD Dark Pegs Right'), + ('PoD Dark Pegs Middle to Left Barrier - Blue', 'PoD Dark Pegs Left'), + ('PoD Dark Pegs Middle to Ranged Crystal', 'PoD Dark Pegs Middle - Ranged Crystal'), + ('PoD Dark Pegs Left to Middle Barrier - Blue', 'PoD Dark Pegs Middle'), + ('PoD Dark Pegs Left to Ranged Crystal', 'PoD Dark Pegs Left - Ranged Crystal'), + ('PoD Dark Pegs Landing Ranged Crystal Exit', 'PoD Dark Pegs Landing'), + ('PoD Dark Pegs Middle Ranged Crystal Exit', 'PoD Dark Pegs Middle'), + ('PoD Dark Pegs Middle to Left Bypass', 'PoD Dark Pegs Left'), + ('PoD Dark Pegs Left Ranged Crystal Exit', 'PoD Dark Pegs Left'), ('Swamp Lobby Moat', 'Swamp Entrance'), ('Swamp Entrance Moat', 'Swamp Lobby'), ('Swamp Trench 1 Approach Dry', 'Swamp Trench 1 Nexus'), @@ -2070,6 +2127,14 @@ logical_connections = [ ('Swamp Trench 1 Departure Key', 'Swamp Trench 1 Key Ledge'), ('Swamp Hub Hook Path', 'Swamp Hub North Ledge'), ('Swamp Hub North Ledge Drop Down', 'Swamp Hub'), + ('Swamp Crystal Switch Outer to Inner Barrier - Blue', 'Swamp Crystal Switch Inner'), + ('Swamp Crystal Switch Outer to Ranged Crystal', 'Swamp Crystal Switch Outer - Ranged Crystal'), + ('Swamp Crystal Switch Outer to Inner Bypass', 'Swamp Crystal Switch Inner'), + ('Swamp Crystal Switch Outer Ranged Crystal Exit', 'Swamp Crystal Switch Outer'), + ('Swamp Crystal Switch Inner to Outer Barrier - Blue', 'Swamp Crystal Switch Outer'), + ('Swamp Crystal Switch Inner to Outer Bypass', 'Swamp Crystal Switch Outer'), + ('Swamp Crystal Switch Inner to Crystal', 'Swamp Crystal Switch Inner - Crystal'), + ('Swamp Crystal Switch Inner Crystal Exit', 'Swamp Crystal Switch Inner'), ('Swamp Compass Donut Push Block', 'Swamp Donut Top'), ('Swamp Shortcut Blue Barrier', 'Swamp Trench 2 Pots'), ('Swamp Trench 2 Pots Blue Barrier', 'Swamp Shortcut'), @@ -2088,6 +2153,7 @@ logical_connections = [ ('Swamp Drain Right Switch', 'Swamp Drain Left'), ('Swamp Flooded Spot Ladder', 'Swamp Flooded Room'), ('Swamp Flooded Room Ladder', 'Swamp Flooded Spot'), + ('Skull Pot Circle Star Path', 'Skull Map Room'), ('Skull Big Chest Hookpath', 'Skull 1 Lobby'), ('Skull Back Drop Star Path', 'Skull Small Hall'), @@ -2104,8 +2170,12 @@ logical_connections = [ ('Thieves Conveyor Block Path', 'Thieves Conveyor Bridge'), ("Thieves Blind's Cell Door", "Thieves Blind's Cell Interior"), ("Thieves Blind's Cell Exit", "Thieves Blind's Cell"), + ('Ice Cross Bottom Push Block Left', 'Ice Floor Switch'), ('Ice Cross Right Push Block Top', 'Ice Bomb Drop'), + ('Ice Cross Top Push Block Bottom', 'Ice Compass Room'), + ('Ice Conveyor to Crystal', 'Ice Conveyor - Crystal'), + ('Ice Conveyor Crystal Exit', 'Ice Conveyor'), ('Ice Big Key Push Block', 'Ice Dead End'), ('Ice Bomb Jump Ledge Orange Barrier', 'Ice Bomb Jump Catwalk'), ('Ice Bomb Jump Catwalk Orange Barrier', 'Ice Bomb Jump Ledge'), @@ -2116,6 +2186,9 @@ logical_connections = [ ('Ice Crystal Left Blue Barrier', 'Ice Crystal Block'), ('Ice Crystal Block Exit', 'Ice Crystal Left'), ('Ice Big Chest Landing Push Blocks', 'Ice Big Chest View'), + ('Ice Refill to Crystal', 'Ice Refill - Crystal'), + ('Ice Refill Crystal Exit', 'Ice Refill'), + ('Mire Lobby Gap', 'Mire Post-Gap'), ('Mire Post-Gap Gap', 'Mire Lobby'), ('Mire Hub Upper Blue Barrier', 'Mire Hub Switch'), @@ -2131,7 +2204,11 @@ logical_connections = [ ('Mire Crystal Dead End Right Barrier', 'Mire Map Spike Side'), ('Mire Hidden Shooters Block Path S', 'Mire Hidden Shooters'), ('Mire Hidden Shooters Block Path N', 'Mire Hidden Shooters Blocked'), + ('Mire Conveyor to Crystal', 'Mire Conveyor - Crystal'), + ('Mire Conveyor Crystal Exit', 'Mire Conveyor Crystal'), ('Mire Left Bridge Hook Path', 'Mire Right Bridge'), + ('Mire Tall Dark and Roomy to Ranged Crystal', 'Mire Tall Dark and Roomy - Ranged Crystal'), + ('Mire Tall Dark and Roomy Ranged Crystal Exit', 'Mire Tall Dark and Roomy'), ('Mire Crystal Right Orange Barrier', 'Mire Crystal Mid'), ('Mire Crystal Mid Orange Barrier', 'Mire Crystal Right'), ('Mire Crystal Mid Blue Barrier', 'Mire Crystal Left'), @@ -2142,14 +2219,49 @@ logical_connections = [ ('Mire Compass Chest Exit', 'Mire Compass Room'), ('Mire South Fish Blue Barrier', 'Mire Fishbone'), ('Mire Fishbone Blue Barrier', 'Mire South Fish'), + ('Mire Fishbone Blue Barrier Bypass', 'Mire South Fish'), + ('TR Main Lobby Gap', 'TR Lobby Ledge'), ('TR Lobby Ledge Gap', 'TR Main Lobby'), ('TR Pipe Ledge Drop Down', 'TR Pipe Pit'), ('TR Big Chest Gap', 'TR Big Chest Entrance'), ('TR Big Chest Entrance Gap', 'TR Big Chest'), - ('TR Crystal Maze Forwards Path', 'TR Crystal Maze End'), - ('TR Crystal Maze Blue Path', 'TR Crystal Maze'), - ('TR Crystal Maze Cane Path', 'TR Crystal Maze'), + ('TR Chain Chomps Top to Bottom Barrier - Orange', 'TR Chain Chomps Bottom'), + ('TR Chain Chomps Top to Crystal', 'TR Chain Chomps Top - Crystal'), + ('TR Chain Chomps Top Crystal Exit', 'TR Chain Chomps Top'), + ('TR Chain Chomps Bottom to Top Barrier - Orange', 'TR Chain Chomps Top'), + ('TR Chain Chomps Bottom to Ranged Crystal', 'TR Chain Chomps Bottom - Ranged Crystal'), + ('TR Chain Chomps Bottom Ranged Crystal Exit', 'TR Chain Chomps Bottom'), + ('TR Pokey 2 Top to Bottom Barrier - Blue', 'TR Pokey 2 Bottom'), + ('TR Pokey 2 Top to Crystal', 'TR Pokey 2 Top - Crystal'), + ('TR Pokey 2 Top Crystal Exit', 'TR Pokey 2 Top'), + ('TR Pokey 2 Bottom to Top Barrier - Blue', 'TR Pokey 2 Top'), + ('TR Pokey 2 Bottom to Ranged Crystal', 'TR Pokey 2 Bottom - Ranged Crystal'), + ('TR Pokey 2 Bottom Ranged Crystal Exit', 'TR Pokey 2 Bottom'), + ('TR Crystaroller Bottom to Middle Barrier - Orange', 'TR Crystaroller Middle'), + ('TR Crystaroller Bottom to Ranged Crystal', 'TR Crystaroller Bottom - Ranged Crystal'), + ('TR Crystaroller Middle to Bottom Barrier - Orange', 'TR Crystaroller Bottom'), + ('TR Crystaroller Middle to Bottom Bypass', 'TR Crystaroller Bottom'), + ('TR Crystaroller Middle to Chest Barrier - Blue', 'TR Crystaroller Chest'), + ('TR Crystaroller Middle to Top Barrier - Orange', 'TR Crystaroller Top'), + ('TR Crystaroller Middle to Ranged Crystal', 'TR Crystaroller Middle - Ranged Crystal'), + ('TR Crystaroller Top to Middle Barrier - Orange', 'TR Crystaroller Middle'), + ('TR Crystaroller Top to Crystal', 'TR Crystaroller Top - Crystal'), + ('TR Crystaroller Top Crystal Exit', 'TR Crystaroller Top'), + ('TR Crystaroller Chest to Middle Barrier - Blue', 'TR Crystaroller Middle'), + ('TR Crystaroller Middle Ranged Crystal Exit', 'TR Crystaroller Middle'), + ('TR Crystaroller Bottom Ranged Crystal Exit', 'TR Crystaroller Bottom'), + ('TR Crystal Maze Start to Interior Barrier - Blue', 'TR Crystal Maze Interior'), + ('TR Crystal Maze Start to Crystal', 'TR Crystal Maze Start - Crystal'), + ('TR Crystal Maze Start Crystal Exit', 'TR Crystal Maze Start'), + ('TR Crystal Maze Interior to End Barrier - Blue', 'TR Crystal Maze End'), + ('TR Crystal Maze Interior to Start Barrier - Blue', 'TR Crystal Maze Start'), + ('TR Crystal Maze Interior to End Bypass', 'TR Crystal Maze End'), + ('TR Crystal Maze Interior to Start Bypass', 'TR Crystal Maze Start'), + ('TR Crystal Maze End to Interior Barrier - Blue', 'TR Crystal Maze Interior'), + ('TR Crystal Maze End to Ranged Crystal', 'TR Crystal Maze End - Ranged Crystal'), + ('TR Crystal Maze End Ranged Crystal Exit', 'TR Crystal Maze End'), + ('GT Blocked Stairs Block Path', 'GT Big Chest'), ('GT Speed Torch South Path', 'GT Speed Torch'), ('GT Speed Torch North Path', 'GT Speed Torch Upper'), @@ -2160,21 +2272,46 @@ logical_connections = [ ('GT Hookshot South-East Path', 'GT Hookshot East Platform'), ('GT Hookshot South-North Path', 'GT Hookshot North Platform'), ('GT Hookshot Platform Blue Barrier', 'GT Hookshot South Entry'), + ('GT Hookshot Platform Barrier Bypass', 'GT Hookshot South Entry'), ('GT Hookshot Entry Blue Barrier', 'GT Hookshot South Platform'), - ('GT Hookshot Entry Boomerang Path', 'GT Hookshot South Platform'), - ('GT Double Switch Orange Barrier', 'GT Double Switch Switches'), - ('GT Double Switch Orange Barrier 2', 'GT Double Switch Key Spot'), - ('GT Double Switch Transition Blue', 'GT Double Switch Exit'), - ('GT Double Switch Blue Path', 'GT Double Switch Transition'), - ('GT Double Switch Orange Path', 'GT Double Switch Entry'), - ('GT Double Switch Key Blue Path', 'GT Double Switch Exit'), - ('GT Double Switch Key Orange Path', 'GT Double Switch Entry'), - ('GT Double Switch Blue Barrier', 'GT Double Switch Key Spot'), + ('GT Hookshot South Entry to Ranged Crystal', 'GT Hookshot South Entry - Ranged Crystal'), + ('GT HookShot South Entry Ranged Crystal Exit', 'GT Hookshot South Entry'), + ('GT Double Switch Entry to Pot Corners Barrier - Orange', 'GT Double Switch Pot Corners'), + ('GT Double Switch Entry to Left Barrier - Orange', 'GT Double Switch Left'), + ('GT Double Switch Entry to Ranged Switches', 'GT Double Switch Entry - Ranged Switches'), + ('GT Double Switch Entry Ranged Switches Exit', 'GT Double Switch Entry'), + ('GT Double Switch Left to Entry Barrier - Orange', 'GT Double Switch Entry'), + ('GT Double Switch Left to Entry Bypass', 'GT Double Switch Entry'), + ('GT Double Switch Left to Pot Corners Bypass', 'GT Double Switch Pot Corners'), + ('GT Double Switch Left to Exit Bypass', 'GT Double Switch Exit'), + ('GT Double Switch Pot Corners to Entry Barrier - Orange', 'GT Double Switch Entry'), + ('GT Double Switch Pot Corners to Exit Barrier - Blue', 'GT Double Switch Exit'), + ('GT Double Switch Pot Corners to Ranged Switches', 'GT Double Switch Pot Corners - Ranged Switches'), + ('GT Double Switch Pot Corners Ranged Switches Exit', 'GT Double Switch Pot Corners'), + ('GT Double Switch Exit to Blue Barrier', 'GT Double Switch Pot Corners'), + ('GT Spike Crystal Left to Right Barrier - Orange', 'GT Spike Crystal Right'), + ('GT Spike Crystal Right to Left Barrier - Orange', 'GT Spike Crystal Left'), + ('GT Spike Crystal Left to Right Bypass', 'GT Spike Crystal Right'), ('GT Warp Maze - Pit Section Warp Spot', 'GT Warp Maze - Pit Exit Warp Spot'), ('GT Warp Maze Exit Section Warp Spot', 'GT Warp Maze - Pit Exit Warp Spot'), ('GT Firesnake Room Hook Path', 'GT Firesnake Room Ledge'), + + ('GT Crystal Conveyor to Corner Barrier - Blue', 'GT Crystal Conveyor Corner'), + ('GT Crystal Conveyor to Ranged Crystal', 'GT Crystal Conveyor - Ranged Crystal'), + ('GT Crystal Conveyor Corner to Left Bypass', 'GT Crystal Conveyor Left'), + ('GT Crystal Conveyor Corner to Barrier - Blue', 'GT Crystal Conveyor Left'), + ('GT Crystal Conveyor Corner to Barrier - Orange', 'GT Crystal Conveyor'), + ('GT Crystal Conveyor Corner to Ranged Crystal', 'GT Crystal Conveyor Corner - Ranged Crystal'), + ('GT Crystal Conveyor Left to Corner Barrier - Orange', 'GT Crystal Conveyor Corner'), + ('GT Crystal Conveyor Ranged Crystal Exit', 'GT Crystal Conveyor'), + ('GT Crystal Conveyor Corner Ranged Crystal Exit', 'GT Crystal Conveyor Corner'), + ('GT Left Moldorm Ledge Drop Down', 'GT Moldorm'), ('GT Right Moldorm Ledge Drop Down', 'GT Moldorm'), + ('GT Crystal Circles Barrier - Orange', 'GT Crystal Inner Circle'), + ('GT Crystal Circles to Ranged Crystal', 'GT Crystal Circles - Ranged Crystal'), + ('GT Crystal Inner Circle Barrier - Orange', 'GT Crystal Circles'), + ('GT Crystal Circles Ranged Crystal Exit', 'GT Crystal Circles'), ('GT Moldorm Gap', 'GT Validation'), ('GT Validation Block Path', 'GT Validation Door') ] @@ -2272,10 +2409,12 @@ open_edges = [ falldown_pits = [ ('Eastern Courtyard Potholes', 'Eastern Fairies'), - ('Hera Beetles Holes', 'Hera Lobby'), - ('Hera Startile Corner Holes', 'Hera Lobby'), - ('Hera Startile Wide Holes', 'Hera Lobby'), - ('Hera 4F Holes', 'Hera Lobby'), # failed bomb jump + ('Hera Beetles Holes Front', 'Hera Front'), + ('Hera Beetles Holes Landing', 'Hera Up Stairs Landing'), + ('Hera Startile Corner Holes Front', 'Hera Front'), + ('Hera Startile Corner Holes Landing', 'Hera Down Stairs Landing'), + ('Hera Startile Wide Holes', 'Hera Back'), + ('Hera 4F Holes', 'Hera Back'), # failed bomb jump ('Hera Big Chest Landing Holes', 'Hera Startile Wide'), # the other holes near big chest ('Hera 5F Star Hole', 'Hera Big Chest Landing'), ('Hera 5F Pothole Chain', 'Hera Fairies'), @@ -2369,11 +2508,11 @@ interior_doors = [ ('Desert Sandworm Corner NE', 'Desert Bonk Torch SE'), ('Desert Sandworm Corner WS', 'Desert Circle of Pots ES'), ('Desert Circle of Pots NW', 'Desert Big Chest SW'), - ('Desert West Wing WS', 'Desert West Lobby ES',), + ('Desert West Wing WS', 'Desert West Lobby ES'), ('Desert Fairy Fountain SW', 'Desert West Lobby NW'), ('Desert Back Lobby NW', 'Desert Tiles 1 SW'), ('Desert Bridge SW', 'Desert Four Statues NW'), - ('Desert Four Statues ES', 'Desert Beamos Hall WS',), + ('Desert Four Statues ES', 'Desert Beamos Hall WS'), ('Desert Tiles 2 NE', 'Desert Wall Slide SE'), ('Hera Tile Room EN', 'Hera Tridorm WN'), ('Hera Tridorm SE', 'Hera Torches NE'), @@ -2732,8 +2871,8 @@ default_door_connections = [ ('TR Torches NW', 'TR Roller Room SW'), ('TR Pipe Pit WN', 'TR Lava Dual Pipes EN'), ('TR Lava Island ES', 'TR Pipe Ledge WS'), - ('TR Lava Dual Pipes WN', 'TR Pokey 2 EN'), ('TR Lava Dual Pipes SW', 'TR Twin Pokeys NW'), + ('TR Lava Dual Pipes WN', 'TR Pokey 2 EN'), ('TR Pokey 2 ES', 'TR Lava Island WS'), ('TR Dodgers NE', 'TR Lava Escape SE'), ('TR Lava Escape NW', 'TR Dash Room SW'), diff --git a/Doors.py b/Doors.py index 73806dd3..5f20d285 100644 --- a/Doors.py +++ b/Doors.py @@ -252,25 +252,52 @@ def create_doors(world, player): # Hera create_door(player, 'Hera Lobby S', Nrml).dir(So, 0x77, Mid, Low).pos(0).portal(Z, 0x22, 1), + create_door(player, 'Hera Lobby to Front Barrier - Blue', Lgcl), + create_door(player, 'Hera Lobby to Crystal', Lgcl), + create_door(player, 'Hera Lobby Crystal Exit', Lgcl), + create_door(player, 'Hera Front to Lobby Barrier - Blue', Lgcl), + create_door(player, 'Hera Front to Crystal', Lgcl), + create_door(player, 'Hera Front Crystal Exit', Lgcl), + create_door(player, 'Hera Front to Down Stairs Barrier - Blue', Lgcl), + create_door(player, 'Hera Down Stairs to Front Barrier - Blue', Lgcl), + create_door(player, 'Hera Down Stairs Landing to Ranged Crystal', Lgcl), + create_door(player, 'Hera Down Stairs Landing Ranged Crystal Exit', Lgcl), + create_door(player, 'Hera Front to Up Stairs Barrier - Orange', Lgcl), + create_door(player, 'Hera Up Stairs to Front Barrier - Orange', Lgcl), + create_door(player, 'Hera Up Stairs Landing to Ranged Crystal', Lgcl), + create_door(player, 'Hera Up Stairs Landing Ranged Crystal Exit', Lgcl), + create_door(player, 'Hera Front to Back Barrier - Orange', Lgcl), + create_door(player, 'Hera Front to Back Bypass', Lgcl), + create_door(player, 'Hera Back to Front Barrier - Orange', Lgcl), + create_door(player, 'Hera Back to Ranged Crystal', Lgcl), + create_door(player, 'Hera Back Ranged Crystal Exit', Lgcl), create_door(player, 'Hera Lobby Down Stairs', Sprl).dir(Dn, 0x77, 3, HTL).ss(Z, 0x21, 0x90, False, True), create_door(player, 'Hera Lobby Key Stairs', Sprl).dir(Dn, 0x77, 1, HTL).ss(A, 0x12, 0x80).small_key().pos(1), create_door(player, 'Hera Lobby Up Stairs', Sprl).dir(Up, 0x77, 2, HTL).ss(X, 0x2b, 0x5c, False, True), create_door(player, 'Hera Basement Cage Up Stairs', Sprl).dir(Up, 0x87, 3, LTH).ss(Z, 0x42, 0x7c, True, True), + create_door(player, 'Hera Basement Cage to Crystal', Lgcl), + create_door(player, 'Hera Basement Cage Crystal Exit', Lgcl), create_door(player, 'Hera Tile Room Up Stairs', Sprl).dir(Up, 0x87, 1, LTH).ss(A, 0x32, 0x6c, True, True), create_door(player, 'Hera Tile Room EN', Intr).dir(Ea, 0x87, Top, High).pos(0), create_door(player, 'Hera Tridorm WN', Intr).dir(We, 0x87, Top, High).pos(0), + create_door(player, 'Hera Tridorm to Crystal', Lgcl), + create_door(player, 'Hera Tridorm Crystal Exit', Lgcl), create_door(player, 'Hera Tridorm SE', Intr).dir(So, 0x87, Right, High).pos(1), create_door(player, 'Hera Torches NE', Intr).dir(No, 0x87, Right, High).pos(1), create_door(player, 'Hera Beetles Down Stairs', Sprl).dir(Dn, 0x31, 2, LTH).ss(X, 0x3a, 0x70, True, True), create_door(player, 'Hera Beetles WS', Intr).dir(We, 0x31, Bot, High).pos(1), - create_door(player, 'Hera Beetles Holes', Hole), + create_door(player, 'Hera Beetles Holes Front', Hole), + create_door(player, 'Hera Beetles Holes Landing', Hole), create_door(player, 'Hera Startile Corner ES', Intr).dir(Ea, 0x31, Bot, High).pos(1), create_door(player, 'Hera Startile Corner NW', Intr).dir(No, 0x31, Left, High).big_key().pos(0), - create_door(player, 'Hera Startile Corner Holes', Hole), + create_door(player, 'Hera Startile Corner Holes Front', Hole), + create_door(player, 'Hera Startile Corner Holes Landing', Hole), # technically ugly but causes lots of failures in basic create_door(player, 'Hera Startile Wide SW', Intr).dir(So, 0x31, Left, High).pos(0), create_door(player, 'Hera Startile Wide Up Stairs', Sprl).dir(Up, 0x31, 0, HTH).ss(S, 0x6b, 0xac, False, True), create_door(player, 'Hera Startile Wide Holes', Hole), + create_door(player, 'Hera Startile Wide to Crystal', Lgcl), + create_door(player, 'Hera Startile Wide Crystal Exit', Lgcl), create_door(player, 'Hera 4F Down Stairs', Sprl).dir(Dn, 0x27, 0, HTH).ss(S, 0x62, 0xc0), create_door(player, 'Hera 4F Up Stairs', Sprl).dir(Up, 0x27, 1, HTH).ss(A, 0x6b, 0x2c), create_door(player, 'Hera 4F Holes', Hole), @@ -354,17 +381,32 @@ def create_doors(world, player): create_door(player, 'PoD Arena Bridge SE', Nrml).dir(So, 0x2a, Right, High).pos(5).portal(X, 0x22), create_door(player, 'PoD Arena Main NW', Nrml).dir(No, 0x2a, Left, High).small_key().pos(1), create_door(player, 'PoD Arena Main NE', Nrml).dir(No, 0x2a, Right, High).no_exit().trap(0x4).pos(0), - create_door(player, 'PoD Arena Main Crystal Path', Lgcl), - create_door(player, 'PoD Arena Main Orange Barrier', Lgcl), - create_door(player, 'PoD Arena North Drop Down', Lgcl), - create_door(player, 'PoD Arena Bonk Path', Lgcl), create_door(player, 'PoD Arena Crystals E', Nrml).dir(Ea, 0x2a, Mid, High).pos(3), - create_door(player, 'PoD Arena Crystal Path', Lgcl), + create_door(player, 'PoD Arena Landing Bonk Path', Lgcl), + create_door(player, 'PoD Arena North Drop Down', Lgcl), create_door(player, 'PoD Arena Bridge Drop Down', Lgcl), + create_door(player, 'PoD Arena North to Landing Barrier - Orange', Lgcl), + create_door(player, 'PoD Arena Main to Ranged Crystal', Lgcl), + create_door(player, 'PoD Arena Main to Landing Barrier - Blue', Lgcl), + create_door(player, 'PoD Arena Main to Landing Bypass', Lgcl), + create_door(player, 'PoD Arena Main to Right Bypass', Lgcl), + create_door(player, 'PoD Arena Main Ranged Crystal Exit', Lgcl), + create_door(player, 'PoD Arena Bridge to Ranged Crystal', Lgcl), + create_door(player, 'PoD Arena Bridge Ranged Crystal Exit', Lgcl), + create_door(player, 'PoD Arena Landing to Main Barrier - Blue', Lgcl), + create_door(player, 'PoD Arena Landing to Right Barrier - Blue', Lgcl), + create_door(player, 'PoD Arena Landing to North Barrier - Orange', Lgcl), + create_door(player, 'PoD Arena Right to Landing Barrier - Blue', Lgcl), + create_door(player, 'PoD Arena Right to Ranged Crystal', Lgcl), + create_door(player, 'PoD Arena Right Ranged Crystal Exit', Lgcl), + create_door(player, 'PoD Arena Ledge to Ranged Crystal', Lgcl), + create_door(player, 'PoD Arena Ledge Ranged Crystal Exit', Lgcl), create_door(player, 'PoD Arena Ledge ES', Nrml).dir(Ea, 0x2a, Bot, High).pos(2), create_door(player, 'PoD Sexy Statue W', Nrml).dir(We, 0x2b, Mid, High).pos(3), create_door(player, 'PoD Sexy Statue NW', Nrml).dir(No, 0x2b, Left, High).trap(0x1).pos(2), create_door(player, 'PoD Map Balcony Drop Down', Lgcl), + create_door(player, 'PoD Map Balcony to Ranged Crystal', Lgcl), + create_door(player, 'PoD Map Balcony Ranged Crystal Exit', Lgcl), create_door(player, 'PoD Map Balcony WS', Nrml).dir(We, 0x2b, Bot, High).pos(1), create_door(player, 'PoD Map Balcony South Stairs', StrS).dir(So, 0x2b, Left, High), create_door(player, 'PoD Conveyor North Stairs', StrS).dir(No, 0x3b, Left, High), @@ -395,15 +437,29 @@ def create_doors(world, player): create_door(player, 'PoD Mimics 2 SW', Nrml).dir(So, 0x1b, Left, High).pos(1).kill().portal(Z, 0x00), create_door(player, 'PoD Mimics 2 NW', Intr).dir(No, 0x1b, Left, High).pos(0), create_door(player, 'PoD Bow Statue SW', Intr).dir(So, 0x1b, Left, High).pos(0), - create_door(player, 'PoD Bow Statue Crystal Path', Lgcl), - create_door(player, 'PoD Bow Statue Moving Wall Path', Lgcl), - create_door(player, 'PoD Bow Statue Moving Wall Cane Path', Lgcl), + create_door(player, 'PoD Bow Statue Left to Right Barrier - Orange', Lgcl), + create_door(player, 'PoD Bow Statue Left to Right Bypass', Lgcl), + create_door(player, 'PoD Bow Statue Left to Crystal', Lgcl), + create_door(player, 'PoD Bow Statue Left Crystal Exit', Lgcl), + create_door(player, 'PoD Bow Statue Right to Left Barrier - Orange', Lgcl), + create_door(player, 'PoD Bow Statue Right to Ranged Crystal', Lgcl), + create_door(player, 'PoD Bow Statue Ranged Crystal Exit', Lgcl), create_door(player, 'PoD Bow Statue Down Ladder', Lddr).dir(So, 0x1b, 1, High).no_entrance(), create_door(player, 'PoD Dark Pegs Up Ladder', Lddr).dir(No, 0x0b, 0, High), - create_door(player, 'PoD Dark Pegs Hammer Path', Lgcl), - create_door(player, 'PoD Dark Pegs Ladder Hammer Path', Lgcl), - create_door(player, 'PoD Dark Pegs Ladder Cane Path', Lgcl), - create_door(player, 'PoD Dark Pegs Switch Path', Lgcl), + create_door(player, 'PoD Dark Pegs Landing to Right', Lgcl), + create_door(player, 'PoD Dark Pegs Landing to Ranged Crystal', Lgcl), + create_door(player, 'PoD Dark Pegs Right to Landing', Lgcl), + create_door(player, 'PoD Dark Pegs Right to Middle Barrier - Orange', Lgcl), + create_door(player, 'PoD Dark Pegs Right to Middle Bypass', Lgcl), + create_door(player, 'PoD Dark Pegs Middle to Right Barrier - Orange', Lgcl), + create_door(player, 'PoD Dark Pegs Middle to Left Barrier - Blue', Lgcl), + create_door(player, 'PoD Dark Pegs Middle to Ranged Crystal', Lgcl), + create_door(player, 'PoD Dark Pegs Middle to Left Bypass', Lgcl), + create_door(player, 'PoD Dark Pegs Left to Middle Barrier - Blue', Lgcl), + create_door(player, 'PoD Dark Pegs Left to Ranged Crystal', Lgcl), + create_door(player, 'PoD Dark Pegs Landing Ranged Crystal Exit', Lgcl), + create_door(player, 'PoD Dark Pegs Middle Ranged Crystal Exit', Lgcl), + create_door(player, 'PoD Dark Pegs Left Ranged Crystal Exit', Lgcl), create_door(player, 'PoD Dark Pegs WN', Intr).dir(We, 0x0b, Mid, High).small_key().pos(2), create_door(player, 'PoD Lonely Turtle SW', Intr).dir(So, 0x0b, Mid, High).pos(0), create_door(player, 'PoD Lonely Turtle EN', Intr).dir(Ea, 0x0b, Mid, High).small_key().pos(2), @@ -455,6 +511,14 @@ def create_doors(world, player): create_door(player, 'Swamp Compass Donut Push Block', Lgcl), create_door(player, 'Swamp Crystal Switch EN', Nrml).dir(Ea, 0x35, Top, High).small_key().pos(0), create_door(player, 'Swamp Crystal Switch SE', Intr).dir(So, 0x35, Right, High).pos(3), + create_door(player, 'Swamp Crystal Switch Outer to Inner Barrier - Blue', Lgcl), + create_door(player, 'Swamp Crystal Switch Outer to Ranged Crystal', Lgcl), + create_door(player, 'Swamp Crystal Switch Outer to Inner Bypass', Lgcl), + create_door(player, 'Swamp Crystal Switch Outer Ranged Crystal Exit', Lgcl), + create_door(player, 'Swamp Crystal Switch Inner to Outer Barrier - Blue', Lgcl), + create_door(player, 'Swamp Crystal Switch Inner to Outer Bypass', Lgcl), + create_door(player, 'Swamp Crystal Switch Inner to Crystal', Lgcl), + create_door(player, 'Swamp Crystal Switch Inner Crystal Exit', Lgcl), create_door(player, 'Swamp Shortcut NE', Intr).dir(No, 0x35, Right, High).pos(3), create_door(player, 'Swamp Shortcut Blue Barrier', Lgcl), create_door(player, 'Swamp Trench 2 Pots ES', Nrml).dir(Ea, 0x35, Bot, High).pos(4), @@ -673,6 +737,8 @@ def create_doors(world, player): create_door(player, 'Ice Big Key Down Ladder', Lddr).dir(So, 0x1f, 3, High), create_door(player, 'Ice Stalfos Hint SE', Intr).dir(So, 0x3e, Right, High).pos(0), create_door(player, 'Ice Conveyor NE', Intr).dir(No, 0x3e, Right, High).no_exit().pos(0), + create_door(player, 'Ice Conveyor to Crystal', Lgcl), + create_door(player, 'Ice Conveyor Crystal Exit', Lgcl), create_door(player, 'Ice Conveyor SW', Nrml).dir(So, 0x3e, Left, High).small_key().pos(1).portal(Z, 0x20), create_door(player, 'Ice Bomb Jump NW', Nrml).dir(No, 0x4e, Left, High).small_key().pos(1), create_door(player, 'Ice Bomb Jump Ledge Orange Barrier', Lgcl), @@ -739,6 +805,9 @@ def create_doors(world, player): create_door(player, 'Ice Switch Room ES', Nrml).dir(Ea, 0xbe, Bot, High).small_key().pos(1), create_door(player, 'Ice Switch Room SE', Nrml).dir(So, 0xbe, Right, High).trap(0x4).pos(0).portal(X, 0x00), create_door(player, 'Ice Refill WS', Nrml).dir(We, 0xbf, Bot, High).small_key().pos(0), + create_door(player, 'Ice Refill to Crystal', Lgcl), + create_door(player, 'Ice Refill Crystal Exit', Lgcl), + create_door(player, 'Ice Fairy Warp', Warp), create_door(player, 'Ice Antechamber NE', Nrml).dir(No, 0xce, Right, High).trap(0x4).pos(0), create_door(player, 'Ice Antechamber Hole', Hole), @@ -806,6 +875,7 @@ def create_doors(world, player): create_door(player, 'Mire Left Bridge Down Stairs', Sprl).dir(Dn, 0xa2, 0, HTL).ss(A, 0x12, 0x00), create_door(player, 'Mire Fishbone E', Nrml).dir(Ea, 0xa1, Mid, High).pos(1), create_door(player, 'Mire Fishbone Blue Barrier', Lgcl), + create_door(player, 'Mire Fishbone Blue Barrier Bypass', Lgcl), create_door(player, 'Mire South Fish Blue Barrier', Lgcl), create_door(player, 'Mire Fishbone SE', Nrml).dir(So, 0xa1, Right, High).small_key().pos(0), create_door(player, 'Mire Spike Barrier NE', Nrml).dir(No, 0xb1, Right, High).small_key().pos(1), @@ -820,6 +890,8 @@ def create_doors(world, player): create_door(player, 'Mire Conveyor Crystal ES', Nrml).dir(Ea, 0xc1, Bot, High).small_key().pos(1), create_door(player, 'Mire Conveyor Crystal SE', Nrml).dir(So, 0xc1, Right, High).pos(7).portal(X, 0x00), create_door(player, 'Mire Conveyor Crystal WS', Intr).dir(We, 0xc1, Bot, High).small_key().pos(0), + create_door(player, 'Mire Conveyor to Crystal', Lgcl), + create_door(player, 'Mire Conveyor Crystal Exit', Lgcl), create_door(player, 'Mire Tile Room ES', Intr).dir(Ea, 0xc1, Bot, High).small_key().pos(0), create_door(player, 'Mire Tile Room SW', Nrml).dir(So, 0xc1, Left, High).pos(4).portal(Z, 0x00), create_door(player, 'Mire Tile Room NW', Intr).dir(No, 0xc1, Left, High).pos(3), @@ -854,6 +926,8 @@ def create_doors(world, player): create_door(player, 'Mire Tall Dark and Roomy WN', Intr).dir(We, 0x92, Top, High).pos(0), create_door(player, 'Mire Shooter Rupees EN', Intr).dir(Ea, 0x92, Top, High).pos(0), create_door(player, 'Mire Tall Dark and Roomy WS', Intr).dir(We, 0x92, Bot, High).pos(3), + create_door(player, 'Mire Tall Dark and Roomy to Ranged Crystal', Lgcl), + create_door(player, 'Mire Tall Dark and Roomy Ranged Crystal Exit', Lgcl), create_door(player, 'Mire Crystal Right ES', Intr).dir(Ea, 0x92, Bot, High).pos(3), create_door(player, 'Mire Crystal Mid NW', Intr).dir(No, 0x92, Left, High).pos(1), create_door(player, 'Mire Crystal Top SW', Intr).dir(So, 0x92, Left, High).pos(1), @@ -891,6 +965,12 @@ def create_doors(world, player): create_door(player, 'TR Refill SE', Intr).dir(So, 0xb6, Right, High).pos(1), create_door(player, 'TR Pokey 1 NW', Intr).dir(No, 0xb6, Left, High).small_key().pos(3), create_door(player, 'TR Chain Chomps SW', Intr).dir(So, 0xb6, Left, High).small_key().pos(3), + create_door(player, 'TR Chain Chomps Top to Bottom Barrier - Orange', Lgcl), + create_door(player, 'TR Chain Chomps Top to Crystal', Lgcl), + create_door(player, 'TR Chain Chomps Top Crystal Exit', Lgcl), + create_door(player, 'TR Chain Chomps Bottom to Top Barrier - Orange', Lgcl), + create_door(player, 'TR Chain Chomps Bottom to Ranged Crystal', Lgcl), + create_door(player, 'TR Chain Chomps Bottom Ranged Crystal Exit', Lgcl), create_door(player, 'TR Chain Chomps Down Stairs', Sprl).dir(Dn, 0xb6, 0, HTH).ss(A, 0x12, 0x80, True, True).small_key().pos(0), create_door(player, 'TR Pipe Pit Up Stairs', Sprl).dir(Up, 0x15, 0, HTH).ss(A, 0x1b, 0x6c), create_door(player, 'TR Pipe Pit WN', Nrml).dir(We, 0x15, Top, High).pos(1), @@ -904,6 +984,12 @@ def create_doors(world, player): create_door(player, 'TR Lava Escape SE', Nrml).dir(So, 0x14, Right, High).small_key().pos(0), create_door(player, 'TR Lava Escape NW', Nrml).dir(No, 0x14, Left, High).pos(2), create_door(player, 'TR Pokey 2 EN', Nrml).dir(Ea, 0x13, Top, High).pos(1), + create_door(player, 'TR Pokey 2 Top to Bottom Barrier - Blue', Lgcl), + create_door(player, 'TR Pokey 2 Top to Crystal', Lgcl), + create_door(player, 'TR Pokey 2 Top Crystal Exit', Lgcl), + create_door(player, 'TR Pokey 2 Bottom to Top Barrier - Blue', Lgcl), + create_door(player, 'TR Pokey 2 Bottom to Ranged Crystal', Lgcl), + create_door(player, 'TR Pokey 2 Bottom Ranged Crystal Exit', Lgcl), create_door(player, 'TR Pokey 2 ES', Nrml).dir(Ea, 0x13, Bot, High).small_key().pos(0), create_door(player, 'TR Twin Pokeys NW', Nrml).dir(No, 0x24, Left, High).pos(5), create_door(player, 'TR Twin Pokeys SW', Intr).dir(So, 0x24, Left, High).pos(2), @@ -928,6 +1014,19 @@ def create_doors(world, player): create_door(player, 'TR Rupees SE', Intr).dir(So, 0x04, Right, High).pos(3), create_door(player, 'TR Dash Room NW', Intr).dir(No, 0x04, Left, High).pos(1), create_door(player, 'TR Crystaroller SW', Intr).dir(So, 0x04, Left, High).pos(1), + create_door(player, 'TR Crystaroller Bottom to Middle Barrier - Orange', Lgcl), + create_door(player, 'TR Crystaroller Bottom to Ranged Crystal', Lgcl), + create_door(player, 'TR Crystaroller Middle to Bottom Barrier - Orange', Lgcl), + create_door(player, 'TR Crystaroller Middle to Bottom Bypass', Lgcl), + create_door(player, 'TR Crystaroller Middle to Chest Barrier - Blue', Lgcl), + create_door(player, 'TR Crystaroller Middle to Top Barrier - Orange', Lgcl), + create_door(player, 'TR Crystaroller Middle to Ranged Crystal', Lgcl), + create_door(player, 'TR Crystaroller Top to Middle Barrier - Orange', Lgcl), + create_door(player, 'TR Crystaroller Top to Crystal', Lgcl), + create_door(player, 'TR Crystaroller Top Crystal Exit', Lgcl), + create_door(player, 'TR Crystaroller Chest to Middle Barrier - Blue', Lgcl), + create_door(player, 'TR Crystaroller Middle Ranged Crystal Exit', Lgcl), + create_door(player, 'TR Crystaroller Bottom Ranged Crystal Exit', Lgcl), create_door(player, 'TR Crystaroller Down Stairs', Sprl).dir(Dn, 0x04, 0, HTH).ss(A, 0x12, 0x80, True, True).small_key().pos(0), create_door(player, 'TR Dark Ride Up Stairs', Sprl).dir(Up, 0xb5, 0, HTH).ss(A, 0x1b, 0x6c), create_door(player, 'TR Dark Ride SW', Nrml).dir(So, 0xb5, Left, High).trap(0x4).pos(0).portal(Z, 0x22), @@ -937,9 +1036,16 @@ def create_doors(world, player): create_door(player, 'TR Eye Bridge NW', Nrml).dir(No, 0xd5, Left, High).pos(1), create_door(player, 'TR Eye Bridge SW', Nrml).dir(So, 0xd5, Left, High).pos(0).portal(Z, 0x02), create_door(player, 'TR Crystal Maze ES', Nrml).dir(Ea, 0xc4, Bot, High).small_key().pos(0), - create_door(player, 'TR Crystal Maze Forwards Path', Lgcl), - create_door(player, 'TR Crystal Maze Blue Path', Lgcl), - create_door(player, 'TR Crystal Maze Cane Path', Lgcl), + create_door(player, 'TR Crystal Maze Start to Interior Barrier - Blue', Lgcl), + create_door(player, 'TR Crystal Maze Start to Crystal', Lgcl), + create_door(player, 'TR Crystal Maze Start Crystal Exit', Lgcl), + create_door(player, 'TR Crystal Maze Interior to Start Barrier - Blue', Lgcl), + create_door(player, 'TR Crystal Maze Interior to End Barrier - Blue', Lgcl), + create_door(player, 'TR Crystal Maze Interior to End Bypass', Lgcl), + create_door(player, 'TR Crystal Maze Interior to Start Bypass', Lgcl), + create_door(player, 'TR Crystal Maze End to Interior Barrier - Blue', Lgcl), + create_door(player, 'TR Crystal Maze End to Ranged Crystal', Lgcl), + create_door(player, 'TR Crystal Maze End Ranged Crystal Exit', Lgcl), create_door(player, 'TR Crystal Maze North Stairs', StrS).dir(No, 0xc4, Mid, High), create_door(player, 'TR Final Abyss South Stairs', StrS).dir(So, 0xb4, Mid, High), create_door(player, 'TR Final Abyss NW', Nrml).dir(No, 0xb4, Left, High).big_key().pos(0), @@ -972,6 +1078,15 @@ def create_doors(world, player): create_door(player, 'GT Pots n Blocks ES', Intr).dir(Ea, 0x8d, Bot, High).pos(4), create_door(player, 'GT Speed Torch SE', Nrml).dir(So, 0x8d, Right, High).trap(0x4).pos(0).portal(X, 0x02), create_door(player, 'GT Crystal Conveyor NE', Nrml).dir(No, 0x9d, Right, High).pos(0).kill(), + create_door(player, 'GT Crystal Conveyor to Corner Barrier - Blue', Lgcl), + create_door(player, 'GT Crystal Conveyor to Ranged Crystal', Lgcl), + create_door(player, 'GT Crystal Conveyor Corner to Left Bypass', Lgcl), + create_door(player, 'GT Crystal Conveyor Corner to Barrier - Blue', Lgcl), + create_door(player, 'GT Crystal Conveyor Corner to Barrier - Orange', Lgcl), + create_door(player, 'GT Crystal Conveyor Corner to Ranged Crystal', Lgcl), + create_door(player, 'GT Crystal Conveyor Left to Corner Barrier - Orange', Lgcl), + create_door(player, 'GT Crystal Conveyor Ranged Crystal Exit', Lgcl), + create_door(player, 'GT Crystal Conveyor Corner Ranged Crystal Exit', Lgcl), create_door(player, 'GT Crystal Conveyor WN', Intr).dir(We, 0x9d, Top, High).pos(2), create_door(player, 'GT Compass Room EN', Intr).dir(Ea, 0x9d, Top, High).pos(2), create_door(player, 'GT Compass Room Warp', Warp), @@ -991,22 +1106,32 @@ def create_doors(world, player): create_door(player, 'GT Hookshot South-North Path', Lgcl), create_door(player, 'GT Hookshot Platform Blue Barrier', Lgcl), create_door(player, 'GT Hookshot Entry Blue Barrier', Lgcl), - create_door(player, 'GT Hookshot Entry Boomerang Path', Lgcl), + create_door(player, 'GT Hookshot Platform Barrier Bypass', Lgcl), + create_door(player, 'GT Hookshot South Entry to Ranged Crystal', Lgcl), + create_door(player, 'GT HookShot South Entry Ranged Crystal Exit', Lgcl), create_door(player, 'GT Hookshot NW', Nrml).dir(No, 0x8b, Left, High).pos(4), create_door(player, 'GT Hookshot ES', Intr).dir(Ea, 0x8b, Bot, High).small_key().pos(1), create_door(player, 'GT Map Room WS', Intr).dir(We, 0x8b, Bot, High).small_key().pos(1), create_door(player, 'GT Hookshot SW', Nrml).dir(So, 0x8b, Left, High).pos(3).portal(Z, 0x02), create_door(player, 'GT Double Switch NW', Nrml).dir(No, 0x9b, Left, High).pos(1).kill(), - create_door(player, 'GT Double Switch Orange Barrier', Lgcl), - create_door(player, 'GT Double Switch Orange Barrier 2', Lgcl), - create_door(player, 'GT Double Switch Blue Path', Lgcl), - create_door(player, 'GT Double Switch Orange Path', Lgcl), - create_door(player, 'GT Double Switch Key Blue Path', Lgcl), - create_door(player, 'GT Double Switch Key Orange Path', Lgcl), - create_door(player, 'GT Double Switch Blue Barrier', Lgcl), - create_door(player, 'GT Double Switch Transition Blue', Lgcl), + create_door(player, 'GT Double Switch Entry to Pot Corners Barrier - Orange', Lgcl), + create_door(player, 'GT Double Switch Entry to Left Barrier - Orange', Lgcl), + create_door(player, 'GT Double Switch Entry to Ranged Switches', Lgcl), + create_door(player, 'GT Double Switch Entry Ranged Switches Exit', Lgcl), + create_door(player, 'GT Double Switch Left to Entry Barrier - Orange', Lgcl), + create_door(player, 'GT Double Switch Left to Pot Corners Bypass', Lgcl), + create_door(player, 'GT Double Switch Left to Entry Bypass', Lgcl), + create_door(player, 'GT Double Switch Left to Exit Bypass', Lgcl), + create_door(player, 'GT Double Switch Pot Corners to Entry Barrier - Orange', Lgcl), + create_door(player, 'GT Double Switch Pot Corners to Exit Barrier - Blue', Lgcl), + create_door(player, 'GT Double Switch Pot Corners to Ranged Switches', Lgcl), + create_door(player, 'GT Double Switch Pot Corners Ranged Switches Exit', Lgcl), + create_door(player, 'GT Double Switch Exit to Blue Barrier', Lgcl), create_door(player, 'GT Double Switch EN', Intr).dir(Ea, 0x9b, Top, High).small_key().pos(0), create_door(player, 'GT Spike Crystals WN', Intr).dir(We, 0x9b, Top, High).small_key().pos(0), + create_door(player, 'GT Spike Crystal Left to Right Barrier - Orange', Lgcl), + create_door(player, 'GT Spike Crystal Right to Left Barrier - Orange', Lgcl), + create_door(player, 'GT Spike Crystal Left to Right Bypass', Lgcl), create_door(player, 'GT Spike Crystals Warp', Warp), create_door(player, 'GT Warp Maze - Left Section Warp', Warp), create_door(player, 'GT Warp Maze - Mid Section Left Warp', Warp), @@ -1094,6 +1219,10 @@ def create_doors(world, player): create_door(player, 'GT Bomb Conveyor EN', Intr).dir(Ea, 0x3d, Top, High).small_key().pos(1), create_door(player, 'GT Bomb Conveyor SW', Intr).dir(So, 0x3d, Left, High).pos(3), create_door(player, 'GT Crystal Circles NW', Intr).dir(No, 0x3d, Left, High).pos(3), + create_door(player, 'GT Crystal Circles Barrier - Orange', Lgcl), + create_door(player, 'GT Crystal Inner Circle Barrier - Orange', Lgcl), + create_door(player, 'GT Crystal Circles to Ranged Crystal', Lgcl), + create_door(player, 'GT Crystal Circles Ranged Crystal Exit', Lgcl), create_door(player, 'GT Crystal Circles SW', Nrml).dir(So, 0x3d, Left, High).small_key().pos(2).portal(Z, 0x00), create_door(player, 'GT Left Moldorm Ledge NW', Nrml).dir(No, 0x4d, Left, High).small_key().pos(0).kill(), create_door(player, 'GT Left Moldorm Ledge Drop Down', Lgcl), @@ -1135,42 +1264,69 @@ def create_doors(world, player): world.get_door('Hyrule Castle Tapestry Backwards', player).event('Zelda Pickup') # crystal switches and barriers - world.get_door('Hera Lobby Down Stairs', player).c_switch() - world.get_door('Hera Lobby Key Stairs', player).c_switch() - world.get_door('Hera Lobby Up Stairs', player).c_switch() - world.get_door('Hera Basement Cage Up Stairs', player).c_switch() + world.get_door('Hera Lobby Crystal Exit', player).c_switch() + world.get_door('Hera Lobby to Front Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Front to Lobby Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Front Crystal Exit', player).c_switch() + world.get_door('Hera Front to Down Stairs Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Down Stairs to Front Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Down Stairs Landing Ranged Crystal Exit', player).c_switch() + world.get_door('Hera Front to Up Stairs Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('Hera Up Stairs to Front Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('Hera Up Stairs Landing Ranged Crystal Exit', player).c_switch() + world.get_door('Hera Front to Back Bypass', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Front to Back Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('Hera Back to Front Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('Hera Back Ranged Crystal Exit', player).c_switch() + world.get_door('Hera Basement Cage Crystal Exit', player).c_switch() world.get_door('Hera Tile Room Up Stairs', player).c_switch() - world.get_door('Hera Tile Room EN', player).c_switch() - world.get_door('Hera Tridorm WN', player).c_switch() - world.get_door('Hera Tridorm SE', player).c_switch() + world.get_door('Hera Tile Room EN', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Tridorm WN', player).barrier(CrystalBarrier.Blue) + world.get_door('Hera Tridorm Crystal Exit', player).c_switch() + world.get_door('Hera Tridorm SE', player).barrier(CrystalBarrier.Orange) world.get_door('Hera Beetles Down Stairs', player).c_switch() world.get_door('Hera Beetles WS', player).c_switch() - world.get_door('Hera Beetles Holes', player).c_switch() - world.get_door('Hera Startile Wide SW', player).c_switch() - world.get_door('Hera Startile Wide Up Stairs', player).c_switch() - world.get_door('Hera Startile Wide Holes', player).c_switch() + world.get_door('Hera Beetles Holes Front', player).c_switch() + world.get_door('Hera Beetles Holes Landing', player).c_switch() + world.get_door('Hera Startile Wide Crystal Exit', player).c_switch() + + world.get_door('PoD Arena North to Landing Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Arena Main to Landing Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Arena Main to Landing Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Arena Main to Right Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Arena Main Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Arena Bridge Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Arena Landing to Main Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Arena Landing to Right Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Arena Landing to North Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Arena Right to Landing Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Arena Right Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Arena Ledge Ranged Crystal Exit', player).c_switch() - world.get_door('PoD Arena Main SW', player).c_switch() - world.get_door('PoD Arena Bonk Path', player).c_switch() - world.get_door('PoD Arena Bridge SE', player).c_switch() - world.get_door('PoD Arena Bridge Drop Down', player).c_switch() - world.get_door('PoD Arena Main Orange Barrier', player).barrier(CrystalBarrier.Orange) - # maybe you can cross this way with blue up?? - world.get_door('PoD Arena Main Crystal Path', player).barrier(CrystalBarrier.Blue) - world.get_door('PoD Arena Crystal Path', player).barrier(CrystalBarrier.Blue) world.get_door('PoD Sexy Statue W', player).c_switch() world.get_door('PoD Sexy Statue NW', player).c_switch() - world.get_door('PoD Map Balcony WS', player).c_switch() - world.get_door('PoD Map Balcony South Stairs', player).c_switch() - world.get_door('PoD Bow Statue SW', player).c_switch() - world.get_door('PoD Bow Statue Moving Wall Path', player).barrier(CrystalBarrier.Orange) - world.get_door('PoD Bow Statue Crystal Path', player).c_switch() - world.get_door('PoD Dark Pegs WN', player).c_switch() - world.get_door('PoD Dark Pegs Switch Path', player).c_switch() - world.get_door('PoD Dark Pegs Hammer Path', player).c_switch() + world.get_door('PoD Map Balcony Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Bow Statue Left Crystal Exit', player).c_switch() + world.get_door('PoD Bow Statue Left to Right Bypass', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Bow Statue Left to Right Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Bow Statue Right to Left Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Bow Statue Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Dark Pegs Right to Middle Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Dark Pegs Right to Middle Bypass', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Dark Pegs Middle to Right Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Dark Pegs Middle to Left Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Dark Pegs Middle to Left Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('PoD Dark Pegs Left to Middle Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('PoD Dark Pegs Landing Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Dark Pegs Middle Ranged Crystal Exit', player).c_switch() + world.get_door('PoD Dark Pegs Left Ranged Crystal Exit', player).c_switch() - world.get_door('Swamp Crystal Switch EN', player).c_switch() - world.get_door('Swamp Crystal Switch SE', player).c_switch() + world.get_door('Swamp Crystal Switch Outer to Inner Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('Swamp Crystal Switch Outer to Inner Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('Swamp Crystal Switch Inner to Outer Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('Swamp Crystal Switch Inner to Outer Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('Swamp Crystal Switch Inner Crystal Exit', player).c_switch() + world.get_door('Swamp Crystal Switch Outer Ranged Crystal Exit', player).c_switch() world.get_door('Swamp Shortcut Blue Barrier', player).barrier(CrystalBarrier.Blue) world.get_door('Swamp Trench 2 Pots Blue Barrier', player).barrier(CrystalBarrier.Blue) world.get_door('Swamp Barrier Ledge - Orange', player).barrier(CrystalBarrier.Orange) @@ -1186,13 +1342,12 @@ def create_doors(world, player): world.get_door('Thieves Triple Bypass EN', player).barrier(CrystalBarrier.Blue) world.get_door('Thieves Hellway Orange Barrier', player).barrier(CrystalBarrier.Orange) world.get_door('Thieves Hellway Crystal Orange Barrier', player).barrier(CrystalBarrier.Orange) - world.get_door('Thieves Hellway Crystal Orange Barrier', player).barrier(CrystalBarrier.Orange) world.get_door('Thieves Attic Orange Barrier', player).barrier(CrystalBarrier.Orange) world.get_door('Thieves Attic Hint Orange Barrier', player).barrier(CrystalBarrier.Orange) world.get_door('Ice Bomb Drop SE', player).c_switch() - world.get_door('Ice Conveyor SW', player).c_switch() - world.get_door('Ice Refill WS', player).c_switch() + world.get_door('Ice Conveyor Crystal Exit', player).c_switch() + world.get_door('Ice Refill Crystal Exit', player).c_switch() world.get_door('Ice Bomb Drop Hole', player).barrier(CrystalBarrier.Orange) # not required to hit switch w/ bomb world.get_door('Ice Bomb Jump Ledge Orange Barrier', player).barrier(CrystalBarrier.Orange) world.get_door('Ice Bomb Jump Catwalk Orange Barrier', player).barrier(CrystalBarrier.Orange) @@ -1203,12 +1358,8 @@ def create_doors(world, player): world.get_door('Ice Backwards Room Hole', player).barrier(CrystalBarrier.Blue) world.get_door('Mire Fishbone E', player).c_switch() - world.get_door('Mire Conveyor Crystal ES', player).c_switch() - world.get_door('Mire Conveyor Crystal SE', player).c_switch() - world.get_door('Mire Conveyor Crystal WS', player).c_switch() - world.get_door('Mire Tall Dark and Roomy ES', player).c_switch() - world.get_door('Mire Tall Dark and Roomy WN', player).c_switch() - world.get_door('Mire Tall Dark and Roomy WS', player).c_switch() + world.get_door('Mire Conveyor Crystal Exit', player).c_switch() + world.get_door('Mire Tall Dark and Roomy Ranged Crystal Exit', player).c_switch() world.get_door('Mire Crystal Top SW', player).c_switch() world.get_door('Mire Falling Foes ES', player).c_switch() world.get_door('Mire Falling Foes Up Stairs', player).c_switch() @@ -1223,6 +1374,8 @@ def create_doors(world, player): world.get_door('Mire Crystal Dead End Left Barrier', player).barrier(CrystalBarrier.Blue) world.get_door('Mire Crystal Dead End Right Barrier', player).barrier(CrystalBarrier.Blue) world.get_door('Mire Fishbone Blue Barrier', player).barrier(CrystalBarrier.Blue) + world.get_door('Mire Fishbone Blue Barrier Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('Mire South Fish Blue Barrier', player).barrier(CrystalBarrier.Blue) world.get_door('Mire Compass Blue Barrier', player).barrier(CrystalBarrier.Blue) world.get_door('Mire Crystal Mid Blue Barrier', player).barrier(CrystalBarrier.Blue) @@ -1232,42 +1385,70 @@ def create_doors(world, player): world.get_door('Mire Firesnake Skip Orange Barrier', player).barrier(CrystalBarrier.Orange) world.get_door('Mire Antechamber Orange Barrier', player).barrier(CrystalBarrier.Orange) - world.get_door('TR Chain Chomps SW', player).c_switch() - world.get_door('TR Chain Chomps Down Stairs', player).c_switch() - world.get_door('TR Pokey 2 EN', player).c_switch() - world.get_door('TR Pokey 2 ES', player).c_switch() - world.get_door('TR Crystaroller SW', player).c_switch() - world.get_door('TR Crystaroller Down Stairs', player).c_switch() - world.get_door('TR Crystal Maze ES', player).c_switch() - world.get_door('TR Crystal Maze Forwards Path', player).c_switch() - world.get_door('TR Crystal Maze Cane Path', player).c_switch() - world.get_door('TR Crystal Maze Blue Path', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Chain Chomps Top Crystal Exit', player).c_switch() + world.get_door('TR Chain Chomps Top to Bottom Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Chain Chomps Bottom to Top Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Chain Chomps Bottom Ranged Crystal Exit', player).c_switch() + world.get_door('TR Pokey 2 Top Crystal Exit', player).c_switch() + world.get_door('TR Pokey 2 Top to Bottom Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Pokey 2 Bottom to Top Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Pokey 2 Bottom Ranged Crystal Exit', player).c_switch() + world.get_door('TR Crystaroller Bottom to Middle Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Crystaroller Middle to Bottom Bypass', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystaroller Middle to Bottom Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Crystaroller Middle to Chest Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystaroller Chest to Middle Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystaroller Middle to Top Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Crystaroller Top to Middle Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Crystaroller Middle Ranged Crystal Exit', player).c_switch() + world.get_door('TR Crystaroller Bottom Ranged Crystal Exit', player).c_switch() + world.get_door('TR Crystaroller Top Crystal Exit', player).c_switch() + world.get_door('TR Crystal Maze Start Crystal Exit', player).c_switch() + world.get_door('TR Crystal Maze Start to Interior Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystal Maze Interior to Start Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystal Maze Interior to End Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystal Maze Interior to End Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Crystal Maze Interior to Start Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('TR Crystal Maze End to Interior Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('TR Crystal Maze End Ranged Crystal Exit', player).c_switch() - world.get_door('GT Crystal Conveyor NE', player).c_switch() - world.get_door('GT Crystal Conveyor WN', player).c_switch() + world.get_door('GT Crystal Conveyor to Corner Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Crystal Conveyor Corner to Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Crystal Conveyor Corner to Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Crystal Conveyor Left to Corner Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Crystal Conveyor Ranged Crystal Exit', player).c_switch() + world.get_door('GT Crystal Conveyor Corner Ranged Crystal Exit', player).c_switch() + world.get_door('GT Crystal Conveyor Corner to Left Bypass', player).barrier(CrystalBarrier.Blue) world.get_door('GT Hookshot South-North Path', player).c_switch() world.get_door('GT Hookshot South-East Path', player).c_switch() world.get_door('GT Hookshot ES', player).c_switch() - world.get_door('GT Hookshot Platform Blue Barrier', player).c_switch() - world.get_door('GT Hookshot Entry Boomerang Path', player).c_switch() - world.get_door('GT Double Switch Orange Path', player).c_switch() - world.get_door('GT Double Switch Blue Path', player).c_switch() + world.get_door('GT Hookshot Platform Barrier Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Hookshot Platform Blue Barrier', player).barrier(CrystalBarrier.Blue) + world.get_door('GT HookShot South Entry Ranged Crystal Exit', player).c_switch() world.get_door('GT Spike Crystals WN', player).c_switch() world.get_door('GT Spike Crystals Warp', player).c_switch() world.get_door('GT Crystal Paths Down Stairs', player).c_switch() world.get_door('GT Crystal Paths SW', player).c_switch() world.get_door('GT Hidden Spikes SE', player).c_switch() world.get_door('GT Hidden Spikes EN', player).c_switch() - world.get_door('GT Crystal Circles NW', player).c_switch() - world.get_door('GT Crystal Circles SW', player).c_switch() + world.get_door('GT Crystal Circles Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Crystal Inner Circle Barrier - Orange', player).c_switch() + world.get_door('GT Crystal Circles Ranged Crystal Exit', player).c_switch() world.get_door('GT Hookshot Entry Blue Barrier', player).barrier(CrystalBarrier.Blue) - world.get_door('GT Double Switch Orange Barrier', player).barrier(CrystalBarrier.Orange) - world.get_door('GT Double Switch Orange Barrier 2', player).barrier(CrystalBarrier.Orange) - world.get_door('GT Double Switch Orange Path', player).barrier(CrystalBarrier.Orange) - world.get_door('GT Double Switch Key Orange Path', player).barrier(CrystalBarrier.Orange) - world.get_door('GT Double Switch Key Blue Path', player).barrier(CrystalBarrier.Blue) - world.get_door('GT Double Switch Blue Barrier', player).barrier(CrystalBarrier.Blue) - world.get_door('GT Double Switch Transition Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Double Switch Entry to Pot Corners Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Double Switch Entry to Left Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Double Switch Entry Ranged Switches Exit', player).c_switch() + world.get_door('GT Double Switch Left to Entry Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Double Switch Left to Entry Bypass', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Double Switch Left to Pot Corners Bypass', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Double Switch Left to Exit Bypass', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Double Switch Pot Corners to Entry Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Double Switch Pot Corners to Exit Barrier - Blue', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Double Switch Pot Corners Ranged Switches Exit', player).c_switch() + world.get_door('GT Double Switch Exit to Blue Barrier', player).barrier(CrystalBarrier.Blue) + world.get_door('GT Spike Crystal Left to Right Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Spike Crystal Right to Left Barrier - Orange', player).barrier(CrystalBarrier.Orange) + world.get_door('GT Spike Crystal Left to Right Bypass', player).barrier(CrystalBarrier.Blue) # nifty dynamic logical doors: south_controller = world.get_door('Ice Cross Bottom SE', player) diff --git a/Dungeons.py b/Dungeons.py index 9229140c..0acf7852 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -195,8 +195,11 @@ desert_regions = [ ] hera_regions = [ - 'Hera Lobby', 'Hera Basement Cage', 'Hera Tile Room', 'Hera Tridorm', 'Hera Torches', 'Hera Beetles', - 'Hera Startile Corner', 'Hera Startile Wide', 'Hera 4F', 'Hera Big Chest Landing', 'Hera 5F', + 'Hera Lobby', 'Hera Lobby - Crystal', 'Hera Front', 'Hera Back', 'Hera Front - Crystal', 'Hera Down Stairs Landing', + 'Hera Down Stairs Landing - Ranged Crystal', 'Hera Up Stairs Landing', 'Hera Up Stairs Landing - Ranged Crystal', + 'Hera Back - Ranged Crystal', 'Hera Basement Cage', 'Hera Basement Cage - Crystal', 'Hera Tile Room', + 'Hera Tridorm', 'Hera Tridorm - Crystal', 'Hera Torches', 'Hera Beetles', 'Hera Startile Corner', + 'Hera Startile Wide', 'Hera Startile Wide - Crystal', 'Hera 4F', 'Hera Big Chest Landing', 'Hera 5F', 'Hera Fairies', 'Hera Boss', 'Hera Portal' ] @@ -209,19 +212,23 @@ tower_regions = [ pod_regions = [ 'PoD Lobby', 'PoD Left Cage', 'PoD Middle Cage', 'PoD Shooter Room', 'PoD Pit Room', 'PoD Pit Room Blocked', - 'PoD Arena Main', 'PoD Arena North', 'PoD Arena Crystal', 'PoD Arena Bridge', 'PoD Arena Ledge', 'PoD Sexy Statue', - 'PoD Map Balcony', 'PoD Conveyor', 'PoD Mimics 1', 'PoD Jelly Hall', 'PoD Warp Hint', 'PoD Warp Room', + 'PoD Arena Main', 'PoD Arena Main - Ranged Crystal', 'PoD Arena North', 'PoD Arena Bridge', 'PoD Arena Bridge - Ranged Crystal', + 'PoD Arena Landing', 'PoD Arena Right', 'PoD Arena Right - Ranged Crystal', 'PoD Arena Ledge', 'PoD Arena Ledge - Ranged Crystal', 'PoD Sexy Statue', + 'PoD Map Balcony', 'PoD Map Balcony - Ranged Crystal', 'PoD Conveyor', 'PoD Mimics 1', 'PoD Jelly Hall', 'PoD Warp Hint', 'PoD Warp Room', 'PoD Stalfos Basement', 'PoD Basement Ledge', 'PoD Big Key Landing', 'PoD Falling Bridge', 'PoD Falling Bridge Ledge', 'PoD Dark Maze', 'PoD Big Chest Balcony', 'PoD Compass Room', 'PoD Dark Basement', - 'PoD Harmless Hellway', 'PoD Mimics 2', 'PoD Bow Statue', 'PoD Bow Statue Moving Wall', 'PoD Dark Pegs', 'PoD Dark Pegs Ladder', 'PoD Dark Pegs Switch', - 'PoD Lonely Turtle', 'PoD Turtle Party', 'PoD Dark Alley', 'PoD Callback', 'PoD Boss', 'Palace of Darkness Portal' + 'PoD Harmless Hellway', 'PoD Mimics 2', 'PoD Bow Statue Left', 'PoD Bow Statue Left - Crystal', 'PoD Bow Statue Right', 'PoD Bow Statue Right - Ranged Crystal', + 'PoD Dark Pegs Landing', 'PoD Dark Pegs Right', 'PoD Dark Pegs Middle', 'PoD Dark Pegs Left', 'PoD Dark Pegs Landing - Ranged Crystal', + 'PoD Dark Pegs Middle - Ranged Crystal', 'PoD Dark Pegs Left - Ranged Crystal', 'PoD Lonely Turtle', 'PoD Turtle Party', + 'PoD Dark Alley', 'PoD Callback', 'PoD Boss', 'Palace of Darkness Portal' ] swamp_regions = [ 'Swamp Lobby', 'Swamp Entrance', 'Swamp Pot Row', 'Swamp Map Ledge', 'Swamp Trench 1 Approach', 'Swamp Trench 1 Nexus', 'Swamp Trench 1 Alcove', 'Swamp Trench 1 Key Ledge', 'Swamp Trench 1 Departure', 'Swamp Hammer Switch', 'Swamp Hub', 'Swamp Hub Dead Ledge', 'Swamp Hub North Ledge', 'Swamp Donut Top', - 'Swamp Donut Bottom', 'Swamp Compass Donut', 'Swamp Crystal Switch', 'Swamp Shortcut', 'Swamp Trench 2 Pots', + 'Swamp Donut Bottom', 'Swamp Compass Donut', 'Swamp Crystal Switch Outer', 'Swamp Crystal Switch Outer - Ranged Crystal', + 'Swamp Crystal Switch Inner', 'Swamp Crystal Switch Inner - Crystal', 'Swamp Shortcut', 'Swamp Trench 2 Pots', 'Swamp Trench 2 Blocks', 'Swamp Trench 2 Alcove', 'Swamp Trench 2 Departure', 'Swamp Big Key Ledge', 'Swamp West Shallows', 'Swamp West Block Path', 'Swamp West Ledge', 'Swamp Barrier Ledge', 'Swamp Barrier', 'Swamp Attic', 'Swamp Push Statue', 'Swamp Shooters', 'Swamp Left Elbow', 'Swamp Right Elbow', 'Swamp Drain Left', @@ -253,13 +260,13 @@ thieves_regions = [ ice_regions = [ 'Ice Lobby', 'Ice Jelly Key', 'Ice Floor Switch', 'Ice Cross Left', 'Ice Cross Bottom', 'Ice Cross Right', 'Ice Cross Top', 'Ice Compass Room', 'Ice Pengator Switch', 'Ice Dead End', 'Ice Big Key', 'Ice Bomb Drop', - 'Ice Stalfos Hint', 'Ice Conveyor', 'Ice Bomb Jump Ledge', 'Ice Bomb Jump Catwalk', 'Ice Narrow Corridor', + 'Ice Stalfos Hint', 'Ice Conveyor', 'Ice Conveyor - Crystal', 'Ice Bomb Jump Ledge', 'Ice Bomb Jump Catwalk', 'Ice Narrow Corridor', 'Ice Pengator Trap', 'Ice Spike Cross', 'Ice Firebar', 'Ice Falling Square', 'Ice Spike Room', 'Ice Hammer Block', 'Ice Tongue Pull', 'Ice Freezors', 'Ice Freezors Ledge', 'Ice Tall Hint', 'Ice Hookshot Ledge', 'Ice Hookshot Balcony', 'Ice Spikeball', 'Ice Lonely Freezor', 'Iced T', 'Ice Catwalk', 'Ice Many Pots', 'Ice Crystal Right', 'Ice Crystal Left', 'Ice Crystal Block', 'Ice Big Chest View', 'Ice Big Chest Landing', - 'Ice Backwards Room', 'Ice Anti-Fairy', 'Ice Switch Room', 'Ice Refill', 'Ice Fairy', 'Ice Antechamber', 'Ice Boss', - 'Ice Portal' + 'Ice Backwards Room', 'Ice Anti-Fairy', 'Ice Switch Room', 'Ice Refill', 'Ice Refill - Crystal', + 'Ice Fairy', 'Ice Antechamber', 'Ice Boss', 'Ice Portal' ] mire_regions = [ @@ -268,31 +275,38 @@ mire_regions = [ 'Mire Crystal Dead End', 'Mire Hidden Shooters', 'Mire Hidden Shooters Blocked', 'Mire Cross', 'Mire Minibridge', 'Mire BK Door Room', 'Mire Spikes', 'Mire Ledgehop', 'Mire Bent Bridge', 'Mire Over Bridge', 'Mire Right Bridge', 'Mire Left Bridge', 'Mire Fishbone', 'Mire South Fish', 'Mire Spike Barrier', 'Mire Square Rail', 'Mire Lone Warp', - 'Mire Wizzrobe Bypass', 'Mire Conveyor Crystal', 'Mire Tile Room', 'Mire Compass Room', 'Mire Compass Chest', + 'Mire Wizzrobe Bypass', 'Mire Conveyor Crystal', 'Mire Conveyor - Crystal', 'Mire Tile Room', 'Mire Compass Room', 'Mire Compass Chest', 'Mire Neglected Room', 'Mire Chest View', 'Mire Conveyor Barrier', 'Mire BK Chest Ledge', 'Mire Warping Pool', 'Mire Torches Top', 'Mire Torches Bottom', 'Mire Attic Hint', 'Mire Dark Shooters', 'Mire Key Rupees', - 'Mire Block X', 'Mire Tall Dark and Roomy', 'Mire Crystal Right', 'Mire Crystal Mid', 'Mire Crystal Left', + 'Mire Block X', 'Mire Tall Dark and Roomy', 'Mire Tall Dark and Roomy - Ranged Crystal', 'Mire Crystal Right', 'Mire Crystal Mid', 'Mire Crystal Left', 'Mire Crystal Top', 'Mire Shooter Rupees', 'Mire Falling Foes', 'Mire Firesnake Skip', 'Mire Antechamber', 'Mire Boss', 'Mire Portal' ] tr_regions = [ 'TR Main Lobby', 'TR Lobby Ledge', 'TR Compass Room', 'TR Hub', 'TR Torches Ledge', 'TR Torches', 'TR Roller Room', - 'TR Tile Room', 'TR Refill', 'TR Pokey 1', 'TR Chain Chomps', 'TR Pipe Pit', 'TR Pipe Ledge', 'TR Lava Dual Pipes', - 'TR Lava Island', 'TR Lava Escape', 'TR Pokey 2', 'TR Twin Pokeys', 'TR Hallway', 'TR Dodgers', 'TR Big View', - 'TR Big Chest', 'TR Big Chest Entrance', 'TR Lazy Eyes', 'TR Dash Room', 'TR Tongue Pull', 'TR Rupees', - 'TR Crystaroller', 'TR Dark Ride', 'TR Dash Bridge', 'TR Eye Bridge', 'TR Crystal Maze', 'TR Crystal Maze End', - 'TR Final Abyss', 'TR Boss', 'Turtle Rock Main Portal', 'Turtle Rock Lazy Eyes Portal', 'Turtle Rock Chest Portal', - 'Turtle Rock Eye Bridge Portal' + 'TR Tile Room', 'TR Refill', 'TR Pokey 1', 'TR Chain Chomps Top', 'TR Chain Chomps Top - Crystal', + 'TR Chain Chomps Bottom', 'TR Chain Chomps Bottom - Ranged Crystal', 'TR Pipe Pit', 'TR Pipe Ledge', 'TR Lava Dual Pipes', + 'TR Lava Island', 'TR Lava Escape', 'TR Pokey 2 Top', 'TR Pokey 2 Top - Crystal', 'TR Pokey 2 Bottom', 'TR Pokey 2 Bottom - Ranged Crystal', + 'TR Twin Pokeys', 'TR Hallway', 'TR Dodgers', 'TR Big View','TR Big Chest', 'TR Big Chest Entrance', + 'TR Lazy Eyes', 'TR Dash Room', 'TR Tongue Pull', 'TR Rupees', 'TR Crystaroller Bottom', + 'TR Crystaroller Middle', 'TR Crystaroller Top', 'TR Crystaroller Top - Crystal', 'TR Crystaroller Chest', + 'TR Crystaroller Middle - Ranged Crystal', 'TR Crystaroller Bottom - Ranged Crystal', 'TR Dark Ride', 'TR Dash Bridge', 'TR Eye Bridge', + 'TR Crystal Maze Start', 'TR Crystal Maze Start - Crystal', 'TR Crystal Maze Interior', 'TR Crystal Maze End', + 'TR Crystal Maze End - Ranged Crystal', 'TR Final Abyss', 'TR Boss', 'Turtle Rock Main Portal', + 'Turtle Rock Lazy Eyes Portal', 'Turtle Rock Chest Portal', 'Turtle Rock Eye Bridge Portal' ] gt_regions = [ 'GT Lobby', 'GT Bob\'s Torch', 'GT Hope Room', 'GT Big Chest', 'GT Blocked Stairs', 'GT Bob\'s Room', 'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor', + 'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal', + 'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk', 'GT Conveyor Cross', 'GT Hookshot East Platform', - 'GT Hookshot North Platform', 'GT Hookshot South Platform', 'GT Hookshot South Entry', 'GT Map Room', - 'GT Double Switch Entry', 'GT Double Switch Switches', 'GT Double Switch Transition', 'GT Double Switch Key Spot', - 'GT Double Switch Exit', 'GT Spike Crystals', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section', + 'GT Hookshot North Platform', 'GT Hookshot South Platform', 'GT Hookshot South Entry', 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', + 'GT Double Switch Entry', 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', 'GT Double Switch Left', + 'GT Double Switch Entry - Ranged Switches', 'GT Double Switch Exit', 'GT Spike Crystal Left', + 'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section', 'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot', 'GT Warp Maze Exit Section', 'GT Firesnake Room', 'GT Firesnake Room Ledge', 'GT Warp Maze - Rail Choice', 'GT Warp Maze - Rando Rail', 'GT Warp Maze - Main Rails', 'GT Warp Maze - Pot Rail', 'GT Petting Zoo', @@ -301,9 +315,9 @@ gt_regions = [ 'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2', 'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1', 'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches', - 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Left Moldorm Ledge', - 'GT Right Moldorm Ledge', 'GT Moldorm', 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', 'GT Frozen Over', - 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal' + 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', 'GT Crystal Circles - Ranged Crystal', + 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', + 'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal' ] diff --git a/PotShuffle.py b/PotShuffle.py index 5fb99a86..0f4ca4d8 100644 --- a/PotShuffle.py +++ b/PotShuffle.py @@ -24,7 +24,7 @@ vanilla_pots = { 9: [Pot(12, 4, PotItem.OneRupee, 'PoD Shooter Room'), Pot(48, 4, PotItem.Heart, 'PoD Shooter Room'), Pot(12, 12, PotItem.Switch, 'PoD Shooter Room')], 10: [Pot(96, 8, PotItem.Heart, 'PoD Stalfos Basement'), Pot(104, 8, PotItem.Heart, 'PoD Stalfos Basement'), Pot(204, 11, PotItem.Switch, 'PoD Stalfos Basement'), Pot(100, 9, PotItem.Nothing, 'PoD Stalfos Basement'), Pot(156, 17, PotItem.Bomb, 'PoD Basement Ledge', PotFlags.SwitchLogicChange), Pot(160, 17, PotItem.FiveArrows, 'PoD Basement Ledge', PotFlags.SwitchLogicChange)], - 11: [Pot(202, 3, PotItem.Bomb, 'PoD Dark Pegs'), Pot(202, 12, PotItem.Bomb, 'PoD Dark Pegs')], + 11: [Pot(202, 3, PotItem.Bomb, 'PoD Dark Pegs Left'), Pot(202, 12, PotItem.Bomb, 'PoD Dark Pegs Left')], 17: [Pot(152, 19, PotItem.Nothing, 'Sewers Secret Room'), Pot(152, 15, PotItem.Nothing, 'Sewers Secret Room'), Pot(144, 15, PotItem.Heart, 'Sewers Secret Room'), Pot(160, 15, PotItem.Heart, 'Sewers Secret Room'), Pot(144, 19, PotItem.Heart, 'Sewers Secret Room'), Pot(160, 19, PotItem.Heart, 'Sewers Secret Room')], 21: [Pot(96, 4, PotItem.Bomb, 'TR Pipe Pit'), Pot(100, 4, PotItem.SmallMagic, 'TR Pipe Pit'), Pot(104, 4, PotItem.Heart, 'TR Pipe Pit'), Pot(108, 4, PotItem.SmallMagic, 'TR Pipe Pit'), Pot(112, 4, PotItem.FiveArrows, 'TR Pipe Pit'), @@ -68,8 +68,8 @@ vanilla_pots = { 57: [Pot(12, 20, PotItem.Heart, 'Skull Spike Corner'), Pot(48, 28, PotItem.FiveArrows, 'Skull Spike Corner'), Pot(100, 22, PotItem.SmallMagic, 'Skull Final Drop'), Pot(100, 26, PotItem.FiveArrows, 'Skull Final Drop')], 60: [Pot(24, 8, PotItem.SmallMagic, 'Hookshot Cave'), Pot(64, 12, PotItem.FiveRupees, 'Hookshot Cave'), Pot(20, 14, PotItem.OneRupee, 'Hookshot Cave'), Pot(20, 19, PotItem.Nothing, 'Hookshot Cave'), Pot(68, 18, PotItem.FiveRupees, 'Hookshot Cave'), Pot(96, 19, PotItem.Heart, 'Hookshot Cave'), Pot(64, 20, PotItem.FiveRupees, 'Hookshot Cave'), Pot(64, 26, PotItem.FiveRupees, 'Hookshot Cave')], - 61: [Pot(76, 12, PotItem.Bomb, 'GT Mini Helmasaur Room'), Pot(112, 12, PotItem.Bomb, 'GT Mini Helmasaur Room'), Pot(24, 22, PotItem.Heart, 'GT Crystal Circles'), Pot(40, 22, PotItem.FiveArrows, 'GT Crystal Circles'), - Pot(32, 24, PotItem.Heart, 'GT Crystal Circles'), Pot(20, 26, PotItem.FiveRupees, 'GT Crystal Circles'), Pot(36, 26, PotItem.BigMagic, 'GT Crystal Circles')], + 61: [Pot(76, 12, PotItem.Bomb, 'GT Mini Helmasaur Room'), Pot(112, 12, PotItem.Bomb, 'GT Mini Helmasaur Room'), Pot(24, 22, PotItem.Heart, 'GT Crystal Inner Circle'), Pot(40, 22, PotItem.FiveArrows, 'GT Crystal Inner Circle'), + Pot(32, 24, PotItem.Heart, 'GT Crystal Inner Circle'), Pot(20, 26, PotItem.FiveRupees, 'GT Crystal Inner Circle'), Pot(36, 26, PotItem.BigMagic, 'GT Crystal Inner Circle')], 62: [Pot(96, 6, PotItem.Bomb, 'Ice Stalfos Hint'), Pot(100, 6, PotItem.SmallMagic, 'Ice Stalfos Hint'), Pot(88, 10, PotItem.Heart, 'Ice Stalfos Hint'), Pot(92, 10, PotItem.SmallMagic, 'Ice Stalfos Hint')], 63: [Pot(12, 25, PotItem.OneRupee, 'Ice Hammer Block'), Pot(20, 25, PotItem.OneRupee, 'Ice Hammer Block'), Pot(12, 26, PotItem.Bomb, 'Ice Hammer Block'), Pot(20, 26, PotItem.Bomb, 'Ice Hammer Block'), Pot(12, 27, PotItem.Switch, 'Ice Hammer Block'), Pot(20, 27, PotItem.Heart, 'Ice Hammer Block'), Pot(28, 23, PotItem.Key, 'Ice Hammer Block')], @@ -166,9 +166,9 @@ vanilla_pots = { 150: [Pot(14, 18, PotItem.Nothing, 'GT Torch Cross'), Pot(32, 5, PotItem.Nothing, 'GT Torch Cross'), Pot(32, 17, PotItem.SmallMagic, 'GT Torch Cross'), Pot(32, 24, PotItem.SmallMagic, 'GT Torch Cross'), Pot(14, 24, PotItem.Nothing, 'GT Torch Cross'), Pot(76, 21, PotItem.Heart, 'GT Staredown'), Pot(112, 21, PotItem.BigMagic, 'GT Staredown')], 153: [Pot(40, 20, PotItem.SmallMagic, 'Eastern Darkness'), Pot(84, 20, PotItem.Heart, 'Eastern Darkness')], - 155: [Pot(48, 4, PotItem.SmallMagic, 'GT Double Switch Key Spot'), Pot(48, 12, PotItem.Key, 'GT Double Switch Key Spot'), Pot(28, 24, PotItem.Nothing, 'GT Warp Maze - Mid Section'), Pot(32, 24, PotItem.Nothing, 'GT Warp Maze - Mid Section')], + 155: [Pot(48, 4, PotItem.SmallMagic, 'GT Double Switch Pot Corners'), Pot(48, 12, PotItem.Key, 'GT Double Switch Pot Corners'), Pot(28, 24, PotItem.Nothing, 'GT Warp Maze - Mid Section'), Pot(32, 24, PotItem.Nothing, 'GT Warp Maze - Mid Section')], 156: [Pot(56, 8, PotItem.SmallMagic, 'GT Invisible Catwalk'), Pot(56, 9, PotItem.FiveArrows, 'GT Invisible Catwalk')], - 157: [Pot(76, 4, PotItem.Bomb, 'GT Crystal Conveyor'), Pot(84, 4, PotItem.SmallMagic, 'GT Crystal Conveyor'), Pot(32, 7, PotItem.Nothing, 'GT Compass Room'), Pot(40, 9, PotItem.Nothing, 'GT Compass Room')], + 157: [Pot(76, 4, PotItem.Bomb, 'GT Crystal Conveyor Left'), Pot(84, 4, PotItem.SmallMagic, 'GT Crystal Conveyor Left'), Pot(32, 7, PotItem.Nothing, 'GT Compass Room'), Pot(40, 9, PotItem.Nothing, 'GT Compass Room')], 159: [Pot(138, 20, PotItem.Nothing, 'Ice Many Pots'), Pot(138, 19, PotItem.Heart, 'Ice Many Pots'), Pot(178, 19, PotItem.Heart, 'Ice Many Pots'), Pot(40, 21, PotItem.Switch, 'Ice Many Pots'), Pot(138, 21, PotItem.Key, 'Ice Many Pots'), Pot(20, 27, PotItem.Heart, 'Ice Many Pots'), Pot(138, 27, PotItem.Heart, 'Ice Many Pots'), Pot(178, 28, PotItem.Heart, 'Ice Many Pots'), Pot(178, 21, PotItem.Nothing, 'Ice Many Pots'), Pot(178, 20, PotItem.Nothing, 'Ice Many Pots'), Pot(40, 27, PotItem.Nothing, 'Ice Many Pots'), Pot(178, 27, PotItem.Nothing, 'Ice Many Pots'), Pot(178, 26, PotItem.Nothing, 'Ice Many Pots'), Pot(138, 28, PotItem.Nothing, 'Ice Many Pots'), Pot(138, 26, PotItem.Nothing, 'Ice Many Pots'), @@ -211,8 +211,8 @@ vanilla_pots = { Pot(48, 28, PotItem.SmallMagic, 'Ice Refill')], 192: [Pot(48, 10, PotItem.Bomb, 'Tower Dark Pits'), Pot(12, 14, PotItem.FiveRupees, 'Tower Dark Pits'), Pot(12, 26, PotItem.Heart, 'Tower Dark Pits'), Pot(28, 27, PotItem.OneRupee, 'Tower Dark Pits')], 194: [Pot(180, 7, PotItem.Switch, 'Mire Hub Switch'), Pot(100, 46, PotItem.SmallMagic, 'Mire Hub Right'), Pot(68, 48, PotItem.OneRupee, 'Mire Hub'), Pot(64, 52, PotItem.FiveArrows, 'Mire Hub')], - 196: [Pot(84, 9, PotItem.Bomb, 'TR Crystal Maze'), Pot(24, 14, PotItem.Heart, 'TR Crystal Maze'), Pot(56, 17, PotItem.FiveRupees, 'TR Crystal Maze'), Pot(84, 17, PotItem.Bomb, 'TR Crystal Maze'), - Pot(12, 21, PotItem.FiveArrows, 'TR Crystal Maze'), Pot(76, 23, PotItem.OneRupee, 'TR Crystal Maze'), Pot(48, 25, PotItem.SmallMagic, 'TR Crystal Maze'), Pot(12, 26, PotItem.Heart, 'TR Crystal Maze')], + 196: [Pot(84, 9, PotItem.Bomb, 'TR Crystal Maze Interior'), Pot(24, 14, PotItem.Heart, 'TR Crystal Maze Interior'), Pot(56, 17, PotItem.FiveRupees, 'TR Crystal Maze Interior'), Pot(84, 17, PotItem.Bomb, 'TR Crystal Maze Interior'), + Pot(12, 21, PotItem.FiveArrows, 'TR Crystal Maze Interior'), Pot(76, 23, PotItem.OneRupee, 'TR Crystal Maze Interior'), Pot(48, 25, PotItem.SmallMagic, 'TR Crystal Maze Interior'), Pot(12, 26, PotItem.Heart, 'TR Crystal Maze Interior')], 198: [Pot(12, 7, PotItem.BigMagic, 'TR Hub'), Pot(12, 25, PotItem.Heart, 'TR Hub')], 199: [Pot(12, 10, PotItem.Heart, 'TR Torches'), Pot(12, 11, PotItem.BigMagic, 'TR Torches'), Pot(12, 22, PotItem.SmallMagic, 'TR Torches Ledge'), Pot(12, 28, PotItem.FiveArrows, 'TR Torches Ledge')], 201: [Pot(30, 22, PotItem.OneRupee, 'Eastern Lobby'), Pot(94, 22, PotItem.OneRupee, 'Eastern Lobby'), Pot(60, 22, PotItem.Switch, 'Eastern Lobby')], diff --git a/Regions.py b/Regions.py index cbbc8cb1..2f9a43e8 100644 --- a/Regions.py +++ b/Regions.py @@ -338,14 +338,26 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Desert Boss', 'Desert Palace', ['Desert Palace - Boss', 'Desert Palace - Prize'], ['Desert Boss SW']), # Hera - create_dungeon_region(player, 'Hera Lobby', 'Tower of Hera', ['Tower of Hera - Map Chest'], ['Hera Lobby Down Stairs', 'Hera Lobby Key Stairs', 'Hera Lobby Up Stairs', 'Hera Lobby S']), - create_dungeon_region(player, 'Hera Basement Cage', 'Tower of Hera', ['Tower of Hera - Basement Cage'], ['Hera Basement Cage Up Stairs']), + create_dungeon_region(player, 'Hera Lobby', 'Tower of Hera', None, ['Hera Lobby S', 'Hera Lobby to Crystal', 'Hera Lobby to Front Barrier - Blue']), + create_dungeon_region(player, 'Hera Lobby - Crystal', 'Tower of Hera', None, ['Hera Lobby Crystal Exit']), + create_dungeon_region(player, 'Hera Front', 'Tower of Hera', None, ['Hera Front to Crystal', 'Hera Front to Lobby Barrier - Blue', 'Hera Front to Down Stairs Barrier - Blue', 'Hera Front to Up Stairs Barrier - Orange', 'Hera Front to Back Barrier - Orange', 'Hera Front to Back Bypass']), + create_dungeon_region(player, 'Hera Front - Crystal', 'Tower of Hera', None, ['Hera Front Crystal Exit']), + create_dungeon_region(player, 'Hera Down Stairs Landing', 'Tower of Hera', None, ['Hera Lobby Down Stairs', 'Hera Down Stairs to Front Barrier - Blue', 'Hera Down Stairs Landing to Ranged Crystal']), + create_dungeon_region(player, 'Hera Down Stairs Landing - Ranged Crystal', 'Tower of Hera', None, ['Hera Down Stairs Landing Ranged Crystal Exit']), + create_dungeon_region(player, 'Hera Up Stairs Landing', 'Tower of Hera', None, ['Hera Up Stairs to Front Barrier - Orange', 'Hera Lobby Up Stairs', 'Hera Up Stairs Landing to Ranged Crystal']), + create_dungeon_region(player, 'Hera Up Stairs Landing - Ranged Crystal', 'Tower of Hera', None, ['Hera Up Stairs Landing Ranged Crystal Exit']), + create_dungeon_region(player, 'Hera Back', 'Tower of Hera', ['Tower of Hera - Map Chest'], ['Hera Back to Front Barrier - Orange', 'Hera Lobby Key Stairs', 'Hera Back to Ranged Crystal']), + create_dungeon_region(player, 'Hera Back - Ranged Crystal', 'Tower of Hera', None, ['Hera Back Ranged Crystal Exit']), + create_dungeon_region(player, 'Hera Basement Cage', 'Tower of Hera', ['Tower of Hera - Basement Cage'], ['Hera Basement Cage to Crystal', 'Hera Basement Cage Up Stairs']), + create_dungeon_region(player, 'Hera Basement Cage - Crystal', 'Tower of Hera', None, ['Hera Basement Cage Crystal Exit']), create_dungeon_region(player, 'Hera Tile Room', 'Tower of Hera', None, ['Hera Tile Room Up Stairs', 'Hera Tile Room EN']), - create_dungeon_region(player, 'Hera Tridorm', 'Tower of Hera', None, ['Hera Tridorm WN', 'Hera Tridorm SE']), + create_dungeon_region(player, 'Hera Tridorm', 'Tower of Hera', None, ['Hera Tridorm WN', 'Hera Tridorm SE', 'Hera Tridorm to Crystal']), + create_dungeon_region(player, 'Hera Tridorm - Crystal', 'Tower of Hera', None, ['Hera Tridorm Crystal Exit']), create_dungeon_region(player, 'Hera Torches', 'Tower of Hera', ['Tower of Hera - Big Key Chest'], ['Hera Torches NE']), - create_dungeon_region(player, 'Hera Beetles', 'Tower of Hera', None, ['Hera Beetles Down Stairs', 'Hera Beetles WS', 'Hera Beetles Holes']), - create_dungeon_region(player, 'Hera Startile Corner', 'Tower of Hera', None, ['Hera Startile Corner ES', 'Hera Startile Corner NW', 'Hera Startile Corner Holes']), - create_dungeon_region(player, 'Hera Startile Wide', 'Tower of Hera', None, ['Hera Startile Wide SW', 'Hera Startile Wide Up Stairs', 'Hera Startile Wide Holes']), + create_dungeon_region(player, 'Hera Beetles', 'Tower of Hera', None, ['Hera Beetles Down Stairs', 'Hera Beetles WS', 'Hera Beetles Holes Front', 'Hera Beetles Holes Landing']), + create_dungeon_region(player, 'Hera Startile Corner', 'Tower of Hera', None, ['Hera Startile Corner ES', 'Hera Startile Corner NW', 'Hera Startile Corner Holes Front', 'Hera Startile Corner Holes Landing']), + create_dungeon_region(player, 'Hera Startile Wide', 'Tower of Hera', None, ['Hera Startile Wide SW', 'Hera Startile Wide Up Stairs', 'Hera Startile Wide Holes', 'Hera Startile Wide to Crystal']), + create_dungeon_region(player, 'Hera Startile Wide - Crystal', 'Tower of Hera', None, ['Hera Startile Wide Crystal Exit']), create_dungeon_region(player, 'Hera 4F', 'Tower of Hera', ['Tower of Hera - Compass Chest'], ['Hera 4F Down Stairs', 'Hera 4F Up Stairs', 'Hera Big Chest Hook Path', 'Hera 4F Holes']), create_dungeon_region(player, 'Hera Big Chest Landing', 'Tower of Hera', ['Tower of Hera - Big Chest'], ['Hera Big Chest Landing Exit', 'Hera Big Chest Landing Holes']), create_dungeon_region(player, 'Hera 5F', 'Tower of Hera', None, ['Hera 5F Down Stairs', 'Hera 5F Up Stairs', 'Hera 5F Star Hole', 'Hera 5F Pothole Chain', 'Hera 5F Normal Holes']), @@ -379,13 +391,19 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'PoD Shooter Room', 'Palace of Darkness', ['Palace of Darkness - Shooter Room'], ['PoD Shooter Room Up Stairs']), create_dungeon_region(player, 'PoD Pit Room', 'Palace of Darkness', None, ['PoD Pit Room S', 'PoD Pit Room NW', 'PoD Pit Room Bomb Hole', 'PoD Pit Room Block Path N']), create_dungeon_region(player, 'PoD Pit Room Blocked', 'Palace of Darkness', None, ['PoD Pit Room NE', 'PoD Pit Room Freefall', 'PoD Pit Room Block Path S']), - create_dungeon_region(player, 'PoD Arena Main', 'Palace of Darkness', None, ['PoD Arena Main SW', 'PoD Arena Main Crystal Path', 'PoD Arena Main Orange Barrier', 'PoD Arena Bonk Path']), - create_dungeon_region(player, 'PoD Arena North', 'Palace of Darkness', None, ['PoD Arena Main NW', 'PoD Arena Main NE', 'PoD Arena North Drop Down']), - create_dungeon_region(player, 'PoD Arena Crystal', 'Palace of Darkness', None, ['PoD Arena Crystals E', 'PoD Arena Crystal Path']), - create_dungeon_region(player, 'PoD Arena Bridge', 'Palace of Darkness', ['Palace of Darkness - The Arena - Bridge'], ['PoD Arena Bridge SE', 'PoD Arena Bridge Drop Down']), - create_dungeon_region(player, 'PoD Arena Ledge', 'Palace of Darkness', ['Palace of Darkness - The Arena - Ledge'], ['PoD Arena Ledge ES']), + create_dungeon_region(player, 'PoD Arena Main', 'Palace of Darkness', None, ['PoD Arena Main SW', 'PoD Arena Main to Ranged Crystal', 'PoD Arena Main to Landing Barrier - Blue', 'PoD Arena Main to Landing Bypass', 'PoD Arena Main to Right Bypass']), + create_dungeon_region(player, 'PoD Arena Main - Ranged Crystal', 'Palace of Darkness', None, ['PoD Arena Main Ranged Crystal Exit']), + create_dungeon_region(player, 'PoD Arena North', 'Palace of Darkness', None, ['PoD Arena Main NW', 'PoD Arena Main NE', 'PoD Arena North Drop Down', 'PoD Arena North to Landing Barrier - Orange']), + create_dungeon_region(player, 'PoD Arena Bridge', 'Palace of Darkness', ['Palace of Darkness - The Arena - Bridge'], ['PoD Arena Bridge SE', 'PoD Arena Bridge Drop Down', 'PoD Arena Bridge to Ranged Crystal']), + create_dungeon_region(player, 'PoD Arena Bridge - Ranged Crystal', 'Palace of Darkness', None, ['PoD Arena Bridge Ranged Crystal Exit']), + create_dungeon_region(player, 'PoD Arena Landing', 'Palace of Darkness', None, ['PoD Arena Landing to Main Barrier - Blue', 'PoD Arena Landing to Right Barrier - Blue', 'PoD Arena Landing to North Barrier - Orange', 'PoD Arena Landing Bonk Path']), + create_dungeon_region(player, 'PoD Arena Right', 'Palace of Darkness', None, ['PoD Arena Crystals E', 'PoD Arena Right to Landing Barrier - Blue', 'PoD Arena Right to Ranged Crystal']), + create_dungeon_region(player, 'PoD Arena Right - Ranged Crystal', 'Palace of Darkness', None, ['PoD Arena Right Ranged Crystal Exit']), + create_dungeon_region(player, 'PoD Arena Ledge', 'Palace of Darkness', ['Palace of Darkness - The Arena - Ledge'], ['PoD Arena Ledge ES', 'PoD Arena Ledge to Ranged Crystal']), + create_dungeon_region(player, 'PoD Arena Ledge - Ranged Crystal', 'Palace of Darkness', None, ['PoD Arena Ledge Ranged Crystal Exit']), create_dungeon_region(player, 'PoD Sexy Statue', 'Palace of Darkness', None, ['PoD Sexy Statue W', 'PoD Sexy Statue NW']), - create_dungeon_region(player, 'PoD Map Balcony', 'Palace of Darkness', ['Palace of Darkness - Map Chest'], ['PoD Map Balcony WS', 'PoD Map Balcony South Stairs', 'PoD Map Balcony Drop Down']), + create_dungeon_region(player, 'PoD Map Balcony', 'Palace of Darkness', ['Palace of Darkness - Map Chest'], ['PoD Map Balcony to Ranged Crystal', 'PoD Map Balcony WS', 'PoD Map Balcony South Stairs', 'PoD Map Balcony Drop Down']), + create_dungeon_region(player, 'PoD Map Balcony - Ranged Crystal', 'Palace of Darkness', None, ['PoD Map Balcony Ranged Crystal Exit']), create_dungeon_region(player, 'PoD Conveyor', 'Palace of Darkness', None, ['PoD Conveyor North Stairs', 'PoD Conveyor SW']), create_dungeon_region(player, 'PoD Mimics 1', 'Palace of Darkness', None, ['PoD Mimics 1 NW', 'PoD Mimics 1 SW']), create_dungeon_region(player, 'PoD Jelly Hall', 'Palace of Darkness', None, ['PoD Jelly Hall NW', 'PoD Jelly Hall NE']), @@ -402,11 +420,17 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'PoD Dark Basement', 'Palace of Darkness', ['Palace of Darkness - Dark Basement - Left', 'Palace of Darkness - Dark Basement - Right'], ['PoD Dark Basement W Up Stairs', 'PoD Dark Basement E Up Stairs']), create_dungeon_region(player, 'PoD Harmless Hellway', 'Palace of Darkness', ['Palace of Darkness - Harmless Hellway'], ['PoD Harmless Hellway NE', 'PoD Harmless Hellway SE']), create_dungeon_region(player, 'PoD Mimics 2', 'Palace of Darkness', None, ['PoD Mimics 2 SW', 'PoD Mimics 2 NW']), - create_dungeon_region(player, 'PoD Bow Statue', 'Palace of Darkness', None, ['PoD Bow Statue SW', 'PoD Bow Statue Crystal Path']), - create_dungeon_region(player, 'PoD Bow Statue Moving Wall', 'Palace of Darkness', None, ['PoD Bow Statue Moving Wall Path', 'PoD Bow Statue Down Ladder', 'PoD Bow Statue Moving Wall Cane Path']), - create_dungeon_region(player, 'PoD Dark Pegs', 'Palace of Darkness', None, ['PoD Dark Pegs Hammer Path', 'PoD Dark Pegs WN']), - create_dungeon_region(player, 'PoD Dark Pegs Ladder', 'Palace of Darkness', None, ['PoD Dark Pegs Up Ladder', 'PoD Dark Pegs Ladder Hammer Path', 'PoD Dark Pegs Ladder Cane Path']), - create_dungeon_region(player, 'PoD Dark Pegs Switch', 'Palace of Darkness', None, ['PoD Dark Pegs Switch Path']), + create_dungeon_region(player, 'PoD Bow Statue Left', 'Palace of Darkness', None, ['PoD Bow Statue SW', 'PoD Bow Statue Left to Right Barrier - Orange', 'PoD Bow Statue Left to Right Bypass', 'PoD Bow Statue Left to Crystal']), + create_dungeon_region(player, 'PoD Bow Statue Left - Crystal', 'Palace of Darkness', None, ['PoD Bow Statue Left Crystal Exit']), + create_dungeon_region(player, 'PoD Bow Statue Right', 'Palace of Darkness', None, ['PoD Bow Statue Right to Left Barrier - Orange', 'PoD Bow Statue Right to Ranged Crystal', 'PoD Bow Statue Down Ladder']), + create_dungeon_region(player, 'PoD Bow Statue Right - Ranged Crystal', 'Palace of Darkness', None, ['PoD Bow Statue Ranged Crystal Exit']), + create_dungeon_region(player, 'PoD Dark Pegs Landing', 'Palace of Darkness', None, ['PoD Dark Pegs Up Ladder', 'PoD Dark Pegs Landing to Right', 'PoD Dark Pegs Landing to Ranged Crystal']), + create_dungeon_region(player, 'PoD Dark Pegs Right', 'Palace of Darkness', None, ['PoD Dark Pegs Right to Landing', 'PoD Dark Pegs Right to Middle Barrier - Orange', 'PoD Dark Pegs Right to Middle Bypass']), + create_dungeon_region(player, 'PoD Dark Pegs Middle', 'Palace of Darkness', None, ['PoD Dark Pegs Middle to Right Barrier - Orange', 'PoD Dark Pegs Middle to Left Barrier - Blue', 'PoD Dark Pegs Middle to Ranged Crystal', 'PoD Dark Pegs Middle to Left Bypass']), + create_dungeon_region(player, 'PoD Dark Pegs Left', 'Palace of Darkness', None, ['PoD Dark Pegs WN', 'PoD Dark Pegs Left to Middle Barrier - Blue', 'PoD Dark Pegs Left to Ranged Crystal']), + create_dungeon_region(player, 'PoD Dark Pegs Landing - Ranged Crystal', 'Palace of Darkness', None, ['PoD Dark Pegs Landing Ranged Crystal Exit']), + create_dungeon_region(player, 'PoD Dark Pegs Middle - Ranged Crystal', 'Palace of Darkness', None, ['PoD Dark Pegs Middle Ranged Crystal Exit']), + create_dungeon_region(player, 'PoD Dark Pegs Left - Ranged Crystal', 'Palace of Darkness', None, ['PoD Dark Pegs Left Ranged Crystal Exit']), create_dungeon_region(player, 'PoD Lonely Turtle', 'Palace of Darkness', None, ['PoD Lonely Turtle SW', 'PoD Lonely Turtle EN']), create_dungeon_region(player, 'PoD Turtle Party', 'Palace of Darkness', None, ['PoD Turtle Party ES', 'PoD Turtle Party NW']), create_dungeon_region(player, 'PoD Dark Alley', 'Palace of Darkness', None, ['PoD Dark Alley NE']), @@ -430,7 +454,10 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Swamp Donut Top', 'Swamp Palace', None, ['Swamp Donut Top N', 'Swamp Donut Top SE']), create_dungeon_region(player, 'Swamp Donut Bottom', 'Swamp Palace', None, ['Swamp Donut Bottom NE', 'Swamp Donut Bottom NW']), create_dungeon_region(player, 'Swamp Compass Donut', 'Swamp Palace', ['Swamp Palace - Compass Chest'], ['Swamp Compass Donut SW', 'Swamp Compass Donut Push Block']), - create_dungeon_region(player, 'Swamp Crystal Switch', 'Swamp Palace', ['Trench 2 Switch'], ['Swamp Crystal Switch EN', 'Swamp Crystal Switch SE']), + create_dungeon_region(player, 'Swamp Crystal Switch Outer', 'Swamp Palace', None, ['Swamp Crystal Switch EN', 'Swamp Crystal Switch SE', 'Swamp Crystal Switch Outer to Inner Barrier - Blue', 'Swamp Crystal Switch Outer to Ranged Crystal', 'Swamp Crystal Switch Outer to Inner Bypass']), + create_dungeon_region(player, 'Swamp Crystal Switch Outer - Ranged Crystal', 'Swamp Palace', None, ['Swamp Crystal Switch Outer Ranged Crystal Exit']), + create_dungeon_region(player, 'Swamp Crystal Switch Inner', 'Swamp Palace', ['Trench 2 Switch'], ['Swamp Crystal Switch Inner to Crystal', 'Swamp Crystal Switch Inner to Outer Bypass', 'Swamp Crystal Switch Inner to Outer Barrier - Blue']), + create_dungeon_region(player, 'Swamp Crystal Switch Inner - Crystal', 'Swamp Palace', None, ['Swamp Crystal Switch Inner Crystal Exit']), create_dungeon_region(player, 'Swamp Shortcut', 'Swamp Palace', None, ['Swamp Shortcut NE', 'Swamp Shortcut Blue Barrier']), create_dungeon_region(player, 'Swamp Trench 2 Pots', 'Swamp Palace', None, ['Swamp Trench 2 Pots ES', 'Swamp Trench 2 Pots Blue Barrier', 'Swamp Trench 2 Pots Dry', 'Swamp Trench 2 Pots Wet']), create_dungeon_region(player, 'Swamp Trench 2 Blocks', 'Swamp Palace', None, ['Swamp Trench 2 Blocks Pots', 'Swamp Trench 2 Blocks N']), @@ -476,7 +503,7 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Skull Big Key', 'Skull Woods', ['Skull Woods - Big Key Chest'], ['Skull Big Key SW', 'Skull Big Key EN']), create_dungeon_region(player, 'Skull Lone Pot', 'Skull Woods', None, ['Skull Lone Pot WN']), create_dungeon_region(player, 'Skull Small Hall', 'Skull Woods', None, ['Skull Small Hall ES', 'Skull Small Hall WS']), - create_dungeon_region(player, 'Skull Back Drop', 'Skull Woods', None, ['Skull Back Drop Star Path', ]), + create_dungeon_region(player, 'Skull Back Drop', 'Skull Woods', None, ['Skull Back Drop Star Path']), create_dungeon_region(player, 'Skull 2 West Lobby', 'Skull Woods', ['Skull Woods - West Lobby Pot Key'], ['Skull 2 West Lobby ES', 'Skull 2 West Lobby NW', 'Skull 2 West Lobby S']), create_dungeon_region(player, 'Skull X Room', 'Skull Woods', None, ['Skull X Room SW']), create_dungeon_region(player, 'Skull 3 Lobby', 'Skull Woods', None, ['Skull 3 Lobby NW', 'Skull 3 Lobby EN', 'Skull 3 Lobby SW']), @@ -537,7 +564,8 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Ice Big Key', 'Ice Palace', ['Ice Palace - Big Key Chest'], ['Ice Big Key Push Block', 'Ice Big Key Down Ladder']), create_dungeon_region(player, 'Ice Bomb Drop', 'Ice Palace', None, ['Ice Bomb Drop SE', 'Ice Bomb Drop Hole']), create_dungeon_region(player, 'Ice Stalfos Hint', 'Ice Palace', None, ['Ice Stalfos Hint SE']), - create_dungeon_region(player, 'Ice Conveyor', 'Ice Palace', ['Ice Palace - Conveyor Key Drop'], ['Ice Conveyor NE', 'Ice Conveyor SW']), + create_dungeon_region(player, 'Ice Conveyor', 'Ice Palace', ['Ice Palace - Conveyor Key Drop'], ['Ice Conveyor NE', 'Ice Conveyor to Crystal', 'Ice Conveyor SW']), + create_dungeon_region(player, 'Ice Conveyor - Crystal', 'Ice Palace', None, ['Ice Conveyor Crystal Exit']), create_dungeon_region(player, 'Ice Bomb Jump Ledge', 'Ice Palace', None, ['Ice Bomb Jump NW', 'Ice Bomb Jump Ledge Orange Barrier']), create_dungeon_region(player, 'Ice Bomb Jump Catwalk', 'Ice Palace', None, ['Ice Bomb Jump Catwalk Orange Barrier', 'Ice Bomb Jump EN']), create_dungeon_region(player, 'Ice Narrow Corridor', 'Ice Palace', None, ['Ice Narrow Corridor WN', 'Ice Narrow Corridor Down Stairs']), @@ -566,7 +594,8 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Ice Backwards Room', 'Ice Palace', None, ['Ice Backwards Room SE', 'Ice Backwards Room Down Stairs', 'Ice Backwards Room Hole']), create_dungeon_region(player, 'Ice Anti-Fairy', 'Ice Palace', None, ['Ice Anti-Fairy Up Stairs', 'Ice Anti-Fairy SE']), create_dungeon_region(player, 'Ice Switch Room', 'Ice Palace', None, ['Ice Switch Room NE', 'Ice Switch Room ES', 'Ice Switch Room SE']), - create_dungeon_region(player, 'Ice Refill', 'Ice Palace', None, ['Ice Refill WS']), + create_dungeon_region(player, 'Ice Refill', 'Ice Palace', None, ['Ice Refill WS', 'Ice Refill to Crystal']), + create_dungeon_region(player, 'Ice Refill - Crystal', 'Ice Palace', None, ['Ice Refill Crystal Exit']), create_dungeon_region(player, 'Ice Fairy', 'Ice Palace', None, ['Ice Fairy Warp']), create_dungeon_region(player, 'Ice Antechamber', 'Ice Palace', None, ['Ice Antechamber NE', 'Ice Antechamber Hole']), create_dungeon_region(player, 'Ice Boss', 'Ice Palace', ['Ice Palace - Boss', 'Ice Palace - Prize']), @@ -596,13 +625,14 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Mire Over Bridge', 'Misery Mire', None, ['Mire Over Bridge E', 'Mire Over Bridge W']), create_dungeon_region(player, 'Mire Right Bridge', 'Misery Mire', ['Misery Mire - Bridge Chest'], ['Mire Right Bridge SE']), create_dungeon_region(player, 'Mire Left Bridge', 'Misery Mire', None, ['Mire Left Bridge S', 'Mire Left Bridge Down Stairs', 'Mire Left Bridge Hook Path']), - create_dungeon_region(player, 'Mire Fishbone', 'Misery Mire', ['Misery Mire - Fishbone Pot Key'], ['Mire Fishbone E', 'Mire Fishbone Blue Barrier']), + create_dungeon_region(player, 'Mire Fishbone', 'Misery Mire', ['Misery Mire - Fishbone Pot Key'], ['Mire Fishbone E', 'Mire Fishbone Blue Barrier', 'Mire Fishbone Blue Barrier Bypass']), create_dungeon_region(player, 'Mire South Fish', 'Misery Mire', None, ['Mire South Fish Blue Barrier', 'Mire Fishbone SE']), create_dungeon_region(player, 'Mire Spike Barrier', 'Misery Mire', None, ['Mire Spike Barrier NE', 'Mire Spike Barrier SE', 'Mire Spike Barrier ES']), create_dungeon_region(player, 'Mire Square Rail', 'Misery Mire', None, ['Mire Square Rail WS', 'Mire Square Rail NW']), create_dungeon_region(player, 'Mire Lone Warp', 'Misery Mire', None, ['Mire Lone Warp SW', 'Mire Lone Warp Warp']), create_dungeon_region(player, 'Mire Wizzrobe Bypass', 'Misery Mire', None, ['Mire Wizzrobe Bypass WN', 'Mire Wizzrobe Bypass EN', 'Mire Wizzrobe Bypass NE']), - create_dungeon_region(player, 'Mire Conveyor Crystal', 'Misery Mire', ['Misery Mire - Conveyor Crystal Key Drop'], ['Mire Conveyor Crystal WS', 'Mire Conveyor Crystal ES', 'Mire Conveyor Crystal SE']), + create_dungeon_region(player, 'Mire Conveyor Crystal', 'Misery Mire', ['Misery Mire - Conveyor Crystal Key Drop'], ['Mire Conveyor to Crystal', 'Mire Conveyor Crystal WS', 'Mire Conveyor Crystal ES', 'Mire Conveyor Crystal SE']), + create_dungeon_region(player, 'Mire Conveyor - Crystal', 'Misery Mire', None, ['Mire Conveyor Crystal Exit']), create_dungeon_region(player, 'Mire Tile Room', 'Misery Mire', None, ['Mire Tile Room ES', 'Mire Tile Room NW', 'Mire Tile Room SW']), create_dungeon_region(player, 'Mire Compass Room', 'Misery Mire', None, ['Mire Compass Room SW', 'Mire Compass Room EN', 'Mire Compass Blue Barrier']), create_dungeon_region(player, 'Mire Compass Chest', 'Misery Mire', ['Misery Mire - Compass Chest'], ['Mire Compass Chest Exit']), @@ -617,7 +647,8 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Mire Dark Shooters', 'Misery Mire', None, ['Mire Dark Shooters Up Stairs', 'Mire Dark Shooters SW', 'Mire Dark Shooters SE']), create_dungeon_region(player, 'Mire Key Rupees', 'Misery Mire', None, ['Mire Key Rupees NE']), create_dungeon_region(player, 'Mire Block X', 'Misery Mire', None, ['Mire Block X NW', 'Mire Block X WS']), - create_dungeon_region(player, 'Mire Tall Dark and Roomy', 'Misery Mire', None, ['Mire Tall Dark and Roomy ES', 'Mire Tall Dark and Roomy WS', 'Mire Tall Dark and Roomy WN']), + create_dungeon_region(player, 'Mire Tall Dark and Roomy', 'Misery Mire', None, ['Mire Tall Dark and Roomy ES', 'Mire Tall Dark and Roomy WS', 'Mire Tall Dark and Roomy WN', 'Mire Tall Dark and Roomy to Ranged Crystal']), + create_dungeon_region(player, 'Mire Tall Dark and Roomy - Ranged Crystal', 'Misery Mire', None, ['Mire Tall Dark and Roomy Ranged Crystal Exit']), create_dungeon_region(player, 'Mire Crystal Right', 'Misery Mire', None, ['Mire Crystal Right ES', 'Mire Crystal Right Orange Barrier']), create_dungeon_region(player, 'Mire Crystal Mid', 'Misery Mire', None, ['Mire Crystal Mid Orange Barrier', 'Mire Crystal Mid Blue Barrier', 'Mire Crystal Mid NW']), create_dungeon_region(player, 'Mire Crystal Left', 'Misery Mire', None, ['Mire Crystal Left Blue Barrier', 'Mire Crystal Left WS']), @@ -639,13 +670,19 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'TR Tile Room', 'Turtle Rock', None, ['TR Tile Room SE', 'TR Tile Room NE']), create_dungeon_region(player, 'TR Refill', 'Turtle Rock', None, ['TR Refill SE']), create_dungeon_region(player, 'TR Pokey 1', 'Turtle Rock', ['Turtle Rock - Pokey 1 Key Drop'], ['TR Pokey 1 SW', 'TR Pokey 1 NW']), - create_dungeon_region(player, 'TR Chain Chomps', 'Turtle Rock', ['Turtle Rock - Chain Chomps'], ['TR Chain Chomps SW', 'TR Chain Chomps Down Stairs']), + create_dungeon_region(player, 'TR Chain Chomps Top', 'Turtle Rock', ['Turtle Rock - Chain Chomps'], ['TR Chain Chomps Top to Crystal', 'TR Chain Chomps Down Stairs', 'TR Chain Chomps Top to Bottom Barrier - Orange']), + create_dungeon_region(player, 'TR Chain Chomps Top - Crystal', 'Turtle Rock', None, ['TR Chain Chomps Top Crystal Exit']), + create_dungeon_region(player, 'TR Chain Chomps Bottom', 'Turtle Rock', None, ['TR Chain Chomps SW', 'TR Chain Chomps Bottom to Top Barrier - Orange', 'TR Chain Chomps Bottom to Ranged Crystal']), + create_dungeon_region(player, 'TR Chain Chomps Bottom - Ranged Crystal', 'Turtle Rock', None, ['TR Chain Chomps Bottom Ranged Crystal Exit']), create_dungeon_region(player, 'TR Pipe Pit', 'Turtle Rock', None, ['TR Pipe Pit Up Stairs', 'TR Pipe Pit WN']), create_dungeon_region(player, 'TR Pipe Ledge', 'Turtle Rock', None, ['TR Pipe Ledge WS', 'TR Pipe Ledge Drop Down']), create_dungeon_region(player, 'TR Lava Dual Pipes', 'Turtle Rock', None, ['TR Lava Dual Pipes EN', 'TR Lava Dual Pipes WN', 'TR Lava Dual Pipes SW']), create_dungeon_region(player, 'TR Lava Island', 'Turtle Rock', ['Turtle Rock - Big Key Chest'], ['TR Lava Island WS', 'TR Lava Island ES']), create_dungeon_region(player, 'TR Lava Escape', 'Turtle Rock', None, ['TR Lava Escape SE', 'TR Lava Escape NW']), - create_dungeon_region(player, 'TR Pokey 2', 'Turtle Rock', ['Turtle Rock - Pokey 2 Key Drop'], ['TR Pokey 2 EN', 'TR Pokey 2 ES']), + create_dungeon_region(player, 'TR Pokey 2 Top', 'Turtle Rock', None, ['TR Pokey 2 EN', 'TR Pokey 2 Top to Bottom Barrier - Blue', 'TR Pokey 2 Top to Crystal']), + create_dungeon_region(player, 'TR Pokey 2 Top - Crystal', 'Turtle Rock', None, ['TR Pokey 2 Top Crystal Exit']), + create_dungeon_region(player, 'TR Pokey 2 Bottom', 'Turtle Rock', ['Turtle Rock - Pokey 2 Key Drop'], ['TR Pokey 2 ES', 'TR Pokey 2 Bottom to Top Barrier - Blue', 'TR Pokey 2 Bottom to Ranged Crystal']), + create_dungeon_region(player, 'TR Pokey 2 Bottom - Ranged Crystal', 'Turtle Rock', None, ['TR Pokey 2 Bottom Ranged Crystal Exit']), create_dungeon_region(player, 'TR Twin Pokeys', 'Turtle Rock', None, ['TR Twin Pokeys NW', 'TR Twin Pokeys EN', 'TR Twin Pokeys SW']), create_dungeon_region(player, 'TR Hallway', 'Turtle Rock', None, ['TR Hallway NW', 'TR Hallway ES', 'TR Hallway WS']), create_dungeon_region(player, 'TR Dodgers', 'Turtle Rock', None, ['TR Dodgers WN', 'TR Dodgers SE', 'TR Dodgers NE']), @@ -656,14 +693,23 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'TR Dash Room', 'Turtle Rock', None, ['TR Dash Room SW', 'TR Dash Room ES', 'TR Dash Room NW']), create_dungeon_region(player, 'TR Tongue Pull', 'Turtle Rock', None, ['TR Tongue Pull WS', 'TR Tongue Pull NE']), create_dungeon_region(player, 'TR Rupees', 'Turtle Rock', None, ['TR Rupees SE']), - create_dungeon_region(player, 'TR Crystaroller', 'Turtle Rock', ['Turtle Rock - Crystaroller Room'], ['TR Crystaroller SW', 'TR Crystaroller Down Stairs']), + create_dungeon_region(player, 'TR Crystaroller Bottom' , 'Turtle Rock', None, ['TR Crystaroller Bottom to Middle Barrier - Orange', 'TR Crystaroller Bottom to Ranged Crystal', 'TR Crystaroller SW']), + create_dungeon_region(player, 'TR Crystaroller Middle', 'Turtle Rock', None, ['TR Crystaroller Middle to Bottom Barrier - Orange', 'TR Crystaroller Middle to Chest Barrier - Blue', 'TR Crystaroller Middle to Top Barrier - Orange', 'TR Crystaroller Middle to Ranged Crystal', 'TR Crystaroller Middle to Bottom Bypass']), + create_dungeon_region(player, 'TR Crystaroller Top', 'Turtle Rock', None, ['TR Crystaroller Top to Middle Barrier - Orange', 'TR Crystaroller Down Stairs', 'TR Crystaroller Top to Crystal']), + create_dungeon_region(player, 'TR Crystaroller Top - Crystal', 'Turtle Rock', None, ['TR Crystaroller Top Crystal Exit']), + create_dungeon_region(player, 'TR Crystaroller Chest', 'Turtle Rock', ['Turtle Rock - Crystaroller Room'], ['TR Crystaroller Chest to Middle Barrier - Blue']), + create_dungeon_region(player, 'TR Crystaroller Middle - Ranged Crystal', 'Turtle Rock', None, ['TR Crystaroller Middle Ranged Crystal Exit']), + create_dungeon_region(player, 'TR Crystaroller Bottom - Ranged Crystal', 'Turtle Rock', None, ['TR Crystaroller Bottom Ranged Crystal Exit']), create_dungeon_region(player, 'TR Dark Ride', 'Turtle Rock', None, ['TR Dark Ride Up Stairs', 'TR Dark Ride SW']), create_dungeon_region(player, 'TR Dash Bridge', 'Turtle Rock', None, ['TR Dash Bridge NW', 'TR Dash Bridge SW', 'TR Dash Bridge WS']), create_dungeon_region(player, 'TR Eye Bridge', 'Turtle Rock', ['Turtle Rock - Eye Bridge - Bottom Left', 'Turtle Rock - Eye Bridge - Bottom Right', 'Turtle Rock - Eye Bridge - Top Left', 'Turtle Rock - Eye Bridge - Top Right'], - ['TR Eye Bridge SW', 'TR Eye Bridge NW']), - create_dungeon_region(player, 'TR Crystal Maze', 'Turtle Rock', None, ['TR Crystal Maze ES', 'TR Crystal Maze Forwards Path']), - create_dungeon_region(player, 'TR Crystal Maze End', 'Turtle Rock', None, ['TR Crystal Maze Blue Path', 'TR Crystal Maze Cane Path', 'TR Crystal Maze North Stairs']), + ['TR Eye Bridge SW', 'TR Eye Bridge NW']), + create_dungeon_region(player, 'TR Crystal Maze Start', 'Turtle Rock', None, ['TR Crystal Maze ES', 'TR Crystal Maze Start to Interior Barrier - Blue', 'TR Crystal Maze Start to Crystal']), + create_dungeon_region(player, 'TR Crystal Maze Start - Crystal', 'Turtle Rock', None, ['TR Crystal Maze Start Crystal Exit']), + create_dungeon_region(player, 'TR Crystal Maze Interior', 'Turtle Rock', None, ['TR Crystal Maze Interior to End Barrier - Blue', 'TR Crystal Maze Interior to Start Barrier - Blue', 'TR Crystal Maze Interior to Start Bypass', 'TR Crystal Maze Interior to End Bypass']), + create_dungeon_region(player, 'TR Crystal Maze End', 'Turtle Rock', None, ['TR Crystal Maze North Stairs', 'TR Crystal Maze End to Interior Barrier - Blue', 'TR Crystal Maze End to Ranged Crystal']), + create_dungeon_region(player, 'TR Crystal Maze End - Ranged Crystal', 'Turtle Rock', None, ['TR Crystal Maze End Ranged Crystal Exit']), create_dungeon_region(player, 'TR Final Abyss', 'Turtle Rock', None, ['TR Final Abyss South Stairs', 'TR Final Abyss NW']), create_dungeon_region(player, 'TR Boss', 'Turtle Rock', ['Turtle Rock - Boss', 'Turtle Rock - Prize'], ['TR Boss SW']), @@ -678,7 +724,12 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'GT Speed Torch', 'Ganon\'s Tower', None, ['GT Speed Torch WS', 'GT Speed Torch SE', 'GT Speed Torch North Path']), create_dungeon_region(player, 'GT Speed Torch Upper', 'Ganon\'s Tower', None, ['GT Speed Torch WN', 'GT Speed Torch NE', 'GT Speed Torch South Path']), create_dungeon_region(player, 'GT Pots n Blocks', 'Ganon\'s Tower', None, ['GT Pots n Blocks ES']), - create_dungeon_region(player, 'GT Crystal Conveyor', 'Ganon\'s Tower', None, ['GT Crystal Conveyor NE', 'GT Crystal Conveyor WN']), + create_dungeon_region(player, 'GT Crystal Conveyor', 'Ganon\'s Tower', None, ['GT Crystal Conveyor NE', 'GT Crystal Conveyor to Corner Barrier - Blue', 'GT Crystal Conveyor to Ranged Crystal']), + create_dungeon_region(player, 'GT Crystal Conveyor Corner', 'Ganon\'s Tower', None, ['GT Crystal Conveyor Corner to Barrier - Blue', 'GT Crystal Conveyor Corner to Barrier - Orange', 'GT Crystal Conveyor Corner to Ranged Crystal', 'GT Crystal Conveyor Corner to Left Bypass']), + create_dungeon_region(player, 'GT Crystal Conveyor Left', 'Ganon\'s Tower', None, ['GT Crystal Conveyor WN', 'GT Crystal Conveyor Left to Corner Barrier - Orange']), + create_dungeon_region(player, 'GT Crystal Conveyor - Ranged Crystal', 'Ganon\'s Tower', None, ['GT Crystal Conveyor Ranged Crystal Exit']), + create_dungeon_region(player, 'GT Crystal Conveyor Corner - Ranged Crystal', 'Ganon\'s Tower', None, ['GT Crystal Conveyor Corner Ranged Crystal Exit']), + create_dungeon_region(player, 'GT Compass Room', 'Ganon\'s Tower', ['Ganons Tower - Compass Room - Top Left', 'Ganons Tower - Compass Room - Top Right', 'Ganons Tower - Compass Room - Bottom Left', 'Ganons Tower - Compass Room - Bottom Right'], ['GT Compass Room EN', 'GT Compass Room Warp']), create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']), @@ -686,15 +737,20 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross WN']), create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-North Path', 'GT Hookshot East-South Path']), create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-East Path', 'GT Hookshot North-South Path']), - create_dungeon_region(player, 'GT Hookshot South Platform', 'Ganon\'s Tower', None, ['GT Hookshot ES', 'GT Hookshot South-East Path', 'GT Hookshot South-North Path', 'GT Hookshot Platform Blue Barrier']), - create_dungeon_region(player, 'GT Hookshot South Entry', 'Ganon\'s Tower', None, ['GT Hookshot SW', 'GT Hookshot Entry Blue Barrier', 'GT Hookshot Entry Boomerang Path']), + create_dungeon_region(player, 'GT Hookshot South Platform', 'Ganon\'s Tower', None, ['GT Hookshot ES', 'GT Hookshot South-East Path', 'GT Hookshot South-North Path', 'GT Hookshot Platform Blue Barrier', 'GT Hookshot Platform Barrier Bypass']), + create_dungeon_region(player, 'GT Hookshot South Entry', 'Ganon\'s Tower', None, ['GT Hookshot SW', 'GT Hookshot Entry Blue Barrier', 'GT Hookshot South Entry to Ranged Crystal']), + create_dungeon_region(player, 'GT Hookshot South Entry - Ranged Crystal', 'Ganon\'s Tower', None, ['GT HookShot South Entry Ranged Crystal Exit']), create_dungeon_region(player, 'GT Map Room', 'Ganon\'s Tower', ['Ganons Tower - Map Chest'], ['GT Map Room WS']), - create_dungeon_region(player, 'GT Double Switch Entry', 'Ganon\'s Tower', None, ['GT Double Switch NW', 'GT Double Switch Orange Barrier', 'GT Double Switch Orange Barrier 2']), - create_dungeon_region(player, 'GT Double Switch Switches', 'Ganon\'s Tower', None, ['GT Double Switch Blue Path', 'GT Double Switch Orange Path']), - create_dungeon_region(player, 'GT Double Switch Transition', 'Ganon\'s Tower', None, ['GT Double Switch Transition Blue']), - create_dungeon_region(player, 'GT Double Switch Key Spot', 'Ganon\'s Tower', ['Ganons Tower - Double Switch Pot Key'], ['GT Double Switch Key Blue Path', 'GT Double Switch Key Orange Path']), - create_dungeon_region(player, 'GT Double Switch Exit', 'Ganon\'s Tower', None, ['GT Double Switch EN', 'GT Double Switch Blue Barrier']), - create_dungeon_region(player, 'GT Spike Crystals', 'Ganon\'s Tower', None, ['GT Spike Crystals WN', 'GT Spike Crystals Warp']), + + create_dungeon_region(player, 'GT Double Switch Entry', 'Ganon\'s Tower', None, ['GT Double Switch NW', 'GT Double Switch Entry to Left Barrier - Orange', 'GT Double Switch Entry to Pot Corners Barrier - Orange', 'GT Double Switch Entry to Ranged Switches']), + create_dungeon_region(player, 'GT Double Switch Entry - Ranged Switches', 'Ganon\'s Tower', None, ['GT Double Switch Entry Ranged Switches Exit']), + create_dungeon_region(player, 'GT Double Switch Left', 'Ganon\'s Tower', None, ['GT Double Switch Left to Entry Barrier - Orange', 'GT Double Switch Left to Entry Bypass', 'GT Double Switch Left to Pot Corners Bypass', 'GT Double Switch Left to Exit Bypass']), + create_dungeon_region(player, 'GT Double Switch Pot Corners', 'Ganon\'s Tower', ['Ganons Tower - Double Switch Pot Key'], ['GT Double Switch Pot Corners to Entry Barrier - Orange', 'GT Double Switch Pot Corners to Exit Barrier - Blue', 'GT Double Switch Pot Corners to Ranged Switches']), + create_dungeon_region(player, 'GT Double Switch Pot Corners - Ranged Switches', 'Ganon\'s Tower', None, ['GT Double Switch Pot Corners Ranged Switches Exit']), + create_dungeon_region(player, 'GT Double Switch Exit', 'Ganon\'s Tower', None, ['GT Double Switch EN', 'GT Double Switch Exit to Blue Barrier']), + + create_dungeon_region(player, 'GT Spike Crystal Left', 'Ganon\'s Tower', None, ['GT Spike Crystals WN', 'GT Spike Crystal Left to Right Barrier - Orange', 'GT Spike Crystal Left to Right Bypass']), + create_dungeon_region(player, 'GT Spike Crystal Right', 'Ganon\'s Tower', None, ['GT Spike Crystals Warp', 'GT Spike Crystal Right to Left Barrier - Orange']), create_dungeon_region(player, 'GT Warp Maze - Left Section', 'Ganon\'s Tower', None, ['GT Warp Maze - Left Section Warp']), create_dungeon_region(player, 'GT Warp Maze - Mid Section', 'Ganon\'s Tower', None, ['GT Warp Maze - Mid Section Left Warp', 'GT Warp Maze - Mid Section Right Warp']), create_dungeon_region(player, 'GT Warp Maze - Right Section', 'Ganon\'s Tower', None, ['GT Warp Maze - Right Section Warp']), @@ -745,7 +801,11 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'GT Mini Helmasaur Room', 'Ganon\'s Tower', ['Ganons Tower - Mini Helmasaur Room - Left', 'Ganons Tower - Mini Helmasaur Room - Right', 'Ganons Tower - Mini Helmasaur Key Drop'], ['GT Mini Helmasaur Room SE', 'GT Mini Helmasaur Room WN']), create_dungeon_region(player, 'GT Bomb Conveyor', 'Ganon\'s Tower', None, ['GT Bomb Conveyor EN', 'GT Bomb Conveyor SW']), - create_dungeon_region(player, 'GT Crystal Circles', 'Ganon\'s Tower', ['Ganons Tower - Pre-Moldorm Chest'], ['GT Crystal Circles NW', 'GT Crystal Circles SW']), + + create_dungeon_region(player, 'GT Crystal Circles', 'Ganon\'s Tower', None, ['GT Crystal Circles NW', 'GT Crystal Circles SW', 'GT Crystal Circles Barrier - Orange', 'GT Crystal Circles to Ranged Crystal']), + create_dungeon_region(player, 'GT Crystal Inner Circle', 'Ganon\'s Tower', ['Ganons Tower - Pre-Moldorm Chest'], ['GT Crystal Inner Circle Barrier - Orange']), + create_dungeon_region(player, 'GT Crystal Circles - Ranged Crystal', 'Ganon\'s Tower', None, ['GT Crystal Circles Ranged Crystal Exit']), + create_dungeon_region(player, 'GT Left Moldorm Ledge', 'Ganon\'s Tower', None, ['GT Left Moldorm Ledge Drop Down', 'GT Left Moldorm Ledge NW']), create_dungeon_region(player, 'GT Right Moldorm Ledge', 'Ganon\'s Tower', None, ['GT Right Moldorm Ledge Down Stairs', 'GT Right Moldorm Ledge Drop Down']), create_dungeon_region(player, 'GT Moldorm', 'Ganon\'s Tower', None, ['GT Moldorm Hole', 'GT Moldorm Gap']), @@ -758,40 +818,61 @@ def create_dungeon_regions(world, player): ] world.initialize_regions() - world.get_region('Hera Lobby', player).crystal_switch = True - world.get_region('Hera Basement Cage', player).crystal_switch = True + world.get_region('Hera Lobby - Crystal', player).crystal_switch = True + world.get_region('Hera Front - Crystal', player).crystal_switch = True + world.get_region('Hera Down Stairs Landing - Ranged Crystal', player).crystal_switch = True + world.get_region('Hera Up Stairs Landing - Ranged Crystal', player).crystal_switch = True + world.get_region('Hera Back - Ranged Crystal', player).crystal_switch = True + world.get_region('Hera Basement Cage - Crystal', player).crystal_switch = True world.get_region('Hera Tile Room', player).crystal_switch = True # INTERIOR not accessible (maybe with cane) - world.get_region('Hera Tridorm', player).crystal_switch = True - world.get_region('Hera Startile Wide', player).crystal_switch = True - world.get_region('PoD Arena Main', player).crystal_switch = True - world.get_region('PoD Arena Bridge', player).crystal_switch = True # RANGED Weapon Required + world.get_region('Hera Beetles', player).crystal_switch = True + world.get_region('Hera Tridorm - Crystal', player).crystal_switch = True + world.get_region('Hera Startile Wide - Crystal', player).crystal_switch = True + world.get_region('PoD Arena Main - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Arena Bridge - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Arena Right - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Arena Ledge - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Map Balcony - Ranged Crystal', player).crystal_switch = True world.get_region('PoD Sexy Statue', player).crystal_switch = True - world.get_region('PoD Bow Statue', player).crystal_switch = True - world.get_region('PoD Dark Pegs Switch', player).crystal_switch = True - world.get_region('PoD Dark Pegs', player).crystal_switch = True - world.get_region('Swamp Crystal Switch', player).crystal_switch = True + world.get_region('PoD Bow Statue Left - Crystal', player).crystal_switch = True + world.get_region('PoD Bow Statue Right - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Dark Pegs Landing - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Dark Pegs Right', player).crystal_switch = True + world.get_region('PoD Dark Pegs Middle - Ranged Crystal', player).crystal_switch = True + world.get_region('PoD Dark Pegs Left - Ranged Crystal', player).crystal_switch = True + world.get_region('Swamp Crystal Switch Inner - Crystal', player).crystal_switch = True + world.get_region('Swamp Crystal Switch Outer - Ranged Crystal', player).crystal_switch = True world.get_region('Thieves Spike Switch', player).crystal_switch = True world.get_region('Ice Bomb Drop', player).crystal_switch = True - world.get_region('Ice Conveyor', player).crystal_switch = True - world.get_region('Ice Refill', player).crystal_switch = True + world.get_region('Ice Conveyor - Crystal', player).crystal_switch = True + world.get_region('Ice Refill - Crystal', player).crystal_switch = True world.get_region('Mire Fishbone', player).crystal_switch = True - world.get_region('Mire Conveyor Crystal', player).crystal_switch = True - world.get_region('Mire Tall Dark and Roomy', player).crystal_switch = True + world.get_region('Mire Conveyor - Crystal', player).crystal_switch = True + world.get_region('Mire Tall Dark and Roomy - Ranged Crystal', player).crystal_switch = True world.get_region('Mire Crystal Top', player).crystal_switch = True world.get_region('Mire Falling Foes', player).crystal_switch = True - world.get_region('TR Chain Chomps', player).crystal_switch = True - world.get_region('TR Pokey 2', player).crystal_switch = True - world.get_region('TR Crystaroller', player).crystal_switch = True - world.get_region('TR Crystal Maze', player).crystal_switch = True - world.get_region('GT Crystal Conveyor', player).crystal_switch = True # INTERIOR not accessible + world.get_region('TR Chain Chomps Top - Crystal', player).crystal_switch = True + world.get_region('TR Chain Chomps Bottom - Ranged Crystal', player).crystal_switch = True + world.get_region('TR Pokey 2 Top - Crystal', player).crystal_switch = True + world.get_region('TR Pokey 2 Bottom - Ranged Crystal', player).crystal_switch = True + world.get_region('TR Crystaroller Top - Crystal', player).crystal_switch = True + world.get_region('TR Crystaroller Bottom - Ranged Crystal', player).crystal_switch = True + world.get_region('TR Crystaroller Middle - Ranged Crystal', player).crystal_switch = True + world.get_region('TR Crystal Maze Start - Crystal', player).crystal_switch = True + world.get_region('TR Crystal Maze Interior', player).crystal_switch = True + world.get_region('TR Crystal Maze End - Ranged Crystal', player).crystal_switch = True + world.get_region('GT Crystal Conveyor - Ranged Crystal', player).crystal_switch = True + world.get_region('GT Crystal Conveyor Corner - Ranged Crystal', player).crystal_switch = True world.get_region('GT Hookshot South Platform', player).crystal_switch = True - # Relevant to indicate north door can access c_switch - world.get_region('GT Double Switch Switches', player).crystal_switch = True - world.get_region('GT Spike Crystals', player).crystal_switch = True + world.get_region('GT Hookshot South Entry - Ranged Crystal', player).crystal_switch = True + world.get_region('GT Double Switch Left', player).crystal_switch = True + world.get_region('GT Double Switch Entry - Ranged Switches', player).crystal_switch = True + world.get_region('GT Double Switch Pot Corners - Ranged Switches', player).crystal_switch = True + world.get_region('GT Spike Crystal Left', player).crystal_switch = True world.get_region('GT Crystal Paths', player).crystal_switch = True world.get_region('GT Hidden Spikes', player).crystal_switch = True - world.get_region('GT Crystal Circles', player).crystal_switch = True - + world.get_region('GT Crystal Inner Circle', player).crystal_switch = True + world.get_region('GT Crystal Circles - Ranged Crystal', player).crystal_switch = True def create_menu_region(player, name, locations=None, exits=None): return _create_region(player, name, RegionType.Menu, 'Menu', locations, exits) diff --git a/Rom.py b/Rom.py index 63cdfb35..4d089aba 100644 --- a/Rom.py +++ b/Rom.py @@ -1138,8 +1138,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.write_byte(0x180171, 0x01 if world.ganon_at_pyramid[player] else 0x00) # Enable respawning on pyramid after ganon death rom.write_byte(0x180173, 0x01) # Bob is enabled rom.write_byte(0x180168, 0x08) # Spike Cave Damage - rom.write_bytes(0x18016B, [0x04, 0x02, 0x01]) #Set spike cave and MM spike room Cape usage - rom.write_bytes(0x18016E, [0x04, 0x08, 0x10]) #Set spike cave and MM spike room Cape usage + rom.write_bytes(0x18016B, [0x04, 0x02, 0x01]) # Set spike cave and MM spike room Byrna usage + rom.write_bytes(0x18016E, [0x04, 0x08, 0x10]) # Set spike cave and MM spike room Cape usage rom.write_bytes(0x50563, [0x3F, 0x14]) # disable below ganon chest rom.write_byte(0x50599, 0x00) # disable below ganon chest rom.write_bytes(0xE9A5, [0x7E, 0x00, 0x24]) # disable below ganon chest diff --git a/Rules.py b/Rules.py index 249d6c0d..97051457 100644 --- a/Rules.py +++ b/Rules.py @@ -28,6 +28,8 @@ def set_rules(world, player): else: raise NotImplementedError('Not implemented yet') + bomb_rules(world, player) + if world.logic[player] == 'noglitches': no_glitches_rules(world, player) elif world.logic[player] == 'minorglitches': @@ -177,15 +179,16 @@ def global_rules(world, player): set_rule(world.get_entrance('Tower Altar NW', player), lambda state: state.has_sword(player)) set_defeat_dungeon_boss_rule(world.get_location('Agahnim 1', player)) - set_rule(world.get_entrance('PoD Arena Bonk Path', player), lambda state: state.has_Boots(player)) + + set_rule(world.get_entrance('PoD Arena Landing Bonk Path', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('PoD Mimics 1 NW', player), lambda state: state.can_shoot_arrows(player)) set_rule(world.get_entrance('PoD Mimics 2 NW', player), lambda state: state.can_shoot_arrows(player)) set_rule(world.get_entrance('PoD Bow Statue Down Ladder', player), lambda state: state.can_shoot_arrows(player)) set_rule(world.get_entrance('PoD Map Balcony Drop Down', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('PoD Dark Pegs Hammer Path', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('PoD Dark Pegs Ladder Hammer Path', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('PoD Dark Pegs Ladder Cane Path', player), lambda state: state.has('Cane of Somaria', player)) - set_rule(world.get_entrance('PoD Bow Statue Moving Wall Cane Path', player), lambda state: state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('PoD Dark Pegs Landing to Right', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('PoD Dark Pegs Right to Landing', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('PoD Turtle Party NW', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('PoD Turtle Party ES', player), lambda state: state.has('Hammer', player)) set_defeat_dungeon_boss_rule(world.get_location('Palace of Darkness - Boss', player)) set_defeat_dungeon_boss_rule(world.get_location('Palace of Darkness - Prize', player)) @@ -232,6 +235,7 @@ def global_rules(world, player): set_defeat_dungeon_boss_rule(world.get_location('Skull Woods - Prize', player)) # blind can't have the small key? - not necessarily true anymore - but likely still + set_rule(world.get_location('Thieves\' Town - Big Chest', player), lambda state: state.has('Hammer', player)) for entrance in ['Thieves Basement Block Path', 'Thieves Blocked Entry Path', 'Thieves Conveyor Block Path', 'Thieves Conveyor Bridge Block Path']: set_rule(world.get_entrance(entrance, player), lambda state: state.can_lift_rocks(player)) @@ -271,6 +275,7 @@ def global_rules(world, player): set_rule(world.get_entrance('Mire Tile Room NW', player), lambda state: state.has_fire_source(player)) set_rule(world.get_entrance('Mire Attic Hint Hole', player), lambda state: state.has_fire_source(player)) set_rule(world.get_entrance('Mire Dark Shooters SW', player), lambda state: state.has('Cane of Somaria', player)) + set_defeat_dungeon_boss_rule(world.get_location('Misery Mire - Boss', player)) set_defeat_dungeon_boss_rule(world.get_location('Misery Mire - Prize', player)) @@ -287,7 +292,6 @@ def global_rules(world, player): set_rule(world.get_entrance('TR Big Chest Gap', player), lambda state: state.has('Cane of Somaria', player) or state.has_Boots(player)) set_rule(world.get_entrance('TR Dark Ride Up Stairs', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_entrance('TR Dark Ride SW', player), lambda state: state.has('Cane of Somaria', player)) - set_rule(world.get_entrance('TR Crystal Maze Cane Path', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_entrance('TR Final Abyss South Stairs', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_entrance('TR Final Abyss NW', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_location('Turtle Rock - Eye Bridge - Bottom Left', player), lambda state: state.has('Cane of Byrna', player) or state.has('Cape', player) or state.has('Mirror Shield', player)) @@ -309,8 +313,8 @@ def global_rules(world, player): set_rule(world.get_entrance('GT Hookshot East-South Path', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player)) set_rule(world.get_entrance('GT Hookshot North-East Path', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player)) set_rule(world.get_entrance('GT Hookshot North-South Path', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player)) - set_rule(world.get_entrance('GT Hookshot Entry Boomerang Path', player), lambda state: state.has('Blue Boomerang', player) or state.has('Red Boomerang', player)) set_rule(world.get_entrance('GT Firesnake Room Hook Path', player), lambda state: state.has('Hookshot', player)) + # I am tempted to stick an invincibility rule for getting across falling bridge set_rule(world.get_entrance('GT Ice Armos NE', player), lambda state: world.get_region('GT Ice Armos', player).dungeon.bosses['bottom'].can_defeat(state)) set_rule(world.get_entrance('GT Ice Armos WS', player), lambda state: world.get_region('GT Ice Armos', player).dungeon.bosses['bottom'].can_defeat(state)) @@ -346,17 +350,93 @@ def global_rules(world, player): else: set_rule(world.get_entrance('Thieves Attic ES', player), lambda state: state.can_reach_orange(world.get_region('Thieves Attic', player), player)) - set_rule(world.get_entrance('PoD Arena Crystal Path', player), lambda state: state.can_reach_blue(world.get_region('PoD Arena Crystal', player), player)) + set_rule(world.get_entrance('Hera Lobby to Front Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Lobby', player), player)) + set_rule(world.get_entrance('Hera Front to Lobby Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Front', player), player)) + set_rule(world.get_entrance('Hera Front to Down Stairs Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Front', player), player)) + set_rule(world.get_entrance('Hera Down Stairs to Front Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Down Stairs Landing', player), player)) + set_rule(world.get_entrance('Hera Front to Up Stairs Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Front', player), player)) + set_rule(world.get_entrance('Hera Up Stairs to Front Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Up Stairs Landing', player), player)) + set_rule(world.get_entrance('Hera Front to Back Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Front', player), player)) + set_rule(world.get_entrance('Hera Back to Front Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Back', player), player)) + set_rule(world.get_location('Tower of Hera - Basement Cage', player), lambda state: state.can_reach_orange(world.get_region('Hera Basement Cage', player), player)) + set_rule(world.get_entrance('Hera Tridorm WN', player), lambda state: state.can_reach_blue(world.get_region('Hera Tridorm', player), player)) + set_rule(world.get_entrance('Hera Tridorm SE', player), lambda state: state.can_reach_orange(world.get_region('Hera Tridorm', player), player)) + set_rule(world.get_entrance('Hera Tile Room EN', player), lambda state: state.can_reach_blue(world.get_region('Hera Tile Room', player), player)) + + set_rule(world.get_entrance('Hera Lobby to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Hera Front to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Hera Down Stairs Landing to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or (state.has('Hookshot', player) and state.can_reach_blue(world.get_region('Hera Down Stairs Landing', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('Hera Up Stairs Landing to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or (state.has('Hookshot', player) and state.can_reach_orange(world.get_region('Hera Up Stairs Landing', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('Hera Back to Ranged Crystal', player), lambda state: False) # state.can_shoot_arrows(player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player) or state.has_beam_sword(player) or (state.has('Hookshot', player) and state.has('Red Boomerang', player)) + set_rule(world.get_entrance('Hera Front to Back Bypass', player), lambda state: state.can_use_bombs(player) or state.can_shoot_arrows(player) or state.has('Red Boomerang', player) or state.has('Blue Boomerang', player) or state.has('Cane of Somaria', player) or state.has('Fire Rod', player) or state.has('Ice Rod', player)) # or state.has_beam_sword(player) + set_rule(world.get_entrance('Hera Basement Cage to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Hera Tridorm to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Hera Startile Wide to Crystal', player), lambda state: state.can_hit_crystal(player)) + + set_rule(world.get_entrance('PoD Arena North to Landing Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('PoD Arena North', player), player)) + set_rule(world.get_entrance('PoD Arena Landing to North Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('PoD Arena Landing', player), player)) + set_rule(world.get_entrance('PoD Arena Main to Landing Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('PoD Arena Main', player), player)) + set_rule(world.get_entrance('PoD Arena Landing to Main Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('PoD Arena Landing', player), player)) + set_rule(world.get_entrance('PoD Arena Landing to Right Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('PoD Arena Landing', player), player)) + set_rule(world.get_entrance('PoD Arena Right to Landing Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('PoD Arena Right', player), player)) + set_rule(world.get_entrance('PoD Bow Statue Left to Right Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('PoD Bow Statue Left', player), player)) + set_rule(world.get_entrance('PoD Bow Statue Right to Left Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('PoD Bow Statue Right', player), player)) + set_rule(world.get_entrance('PoD Dark Pegs Right to Middle Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('PoD Dark Pegs Right', player), player)) + set_rule(world.get_entrance('PoD Dark Pegs Middle to Right Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('PoD Dark Pegs Middle', player), player)) + set_rule(world.get_entrance('PoD Dark Pegs Middle to Left Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('PoD Dark Pegs Middle', player), player)) + set_rule(world.get_entrance('PoD Dark Pegs Left to Middle Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('PoD Dark Pegs Left', player), player)) + + set_rule(world.get_entrance('PoD Arena Main to Ranged Crystal', player), lambda state: True) # Can always throw pots here + set_rule(world.get_entrance('PoD Arena Main to Landing Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('PoD Arena Main to Right Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('PoD Arena Bridge to Ranged Crystal', player), lambda state: state.can_shoot_arrows(player) or state.has('Red Boomerang', player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player)) # or state.has_beam_sword(player) + set_rule(world.get_entrance('PoD Arena Right to Ranged Crystal', player), lambda state: False) # (state.has('Cane of Somaria', player) and state.has_Boots(player)) + set_rule(world.get_entrance('PoD Arena Ledge to Ranged Crystal', player), lambda state: False) # state.has('Cane of Somaria', player) or state.has_beam_sword(player) + set_rule(world.get_entrance('PoD Map Balcony to Ranged Crystal', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) # or state.has('Red Boomerang', player) + set_rule(world.get_entrance('PoD Bow Statue Left to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('PoD Bow Statue Right to Ranged Crystal', player), lambda state: state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('PoD Bow Statue Left to Right Bypass', player), lambda state: state.has('Cane of Somaria', player)) # or state.can_use_bombs(player) or state.can_shoot_arrows(player) or state.has_beam_sword(player) or state.has('Red Boomrang', player) or state.has('Ice Rod', player) or state.has('Fire Rod', player) + set_rule(world.get_entrance('PoD Dark Pegs Landing to Ranged Crystal', player), lambda state: state.has('Cane of Somaria', player)) # or state.can_use_bombs(player) or state.has('Blue boomerang', player) or state.has('Red boomerang', player) + set_rule(world.get_entrance('PoD Dark Pegs Middle to Ranged Crystal', player), lambda state: state.can_shoot_arrows(player) or state.can_use_bombs(player) or state.has('Red Boomerang', player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player) or (state.has('Hookshot', player) and state.can_reach_orange(world.get_region('PoD Dark Pegs Middle', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('PoD Dark Pegs Left to Ranged Crystal', player), lambda state: state.can_shoot_arrows(player) or state.has('Red Boomerang', player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player)) # or state.has_beam_sword(player) + set_rule(world.get_entrance('PoD Dark Pegs Right to Middle Bypass', player), lambda state: state.has('Blue Boomerang', player)) + set_rule(world.get_entrance('PoD Dark Pegs Middle to Left Bypass', player), lambda state: state.can_use_bombs(player)) + + set_rule(world.get_entrance('Swamp Crystal Switch Outer to Inner Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Swamp Trench 2 Pots', player), player)) + set_rule(world.get_entrance('Swamp Crystal Switch Inner to Outer Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Swamp Trench 2 Pots', player), player)) set_rule(world.get_entrance('Swamp Trench 2 Pots Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Swamp Trench 2 Pots', player), player)) set_rule(world.get_entrance('Swamp Shortcut Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Swamp Shortcut', player), player)) + set_rule(world.get_entrance('Swamp Barrier Ledge - Orange', player), lambda state: state.can_reach_orange(world.get_region('Swamp Barrier Ledge', player), player)) + set_rule(world.get_entrance('Swamp Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Swamp Barrier', player), player)) + + set_rule(world.get_entrance('Swamp Crystal Switch Inner to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Swamp Crystal Switch Outer to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or state.has_beam_sword(player) or (state.has('Hookshot', player) and state.can_reach_blue(world.get_region('Swamp Crystal Switch Outer', player), player))) # It is the length of the sword, not the beam itself that allows this + set_rule(world.get_entrance('Swamp Crystal Switch Outer to Inner Bypass', player), lambda state: state.world.can_take_damage or state.has('Cape', player) or state.has('Cane of Byrna', player)) + set_rule(world.get_entrance('Swamp Crystal Switch Inner to Outer Bypass', player), lambda state: state.world.can_take_damage or state.has('Cape', player) or state.has('Cane of Byrna', player)) + set_rule(world.get_entrance('Thieves Hellway Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Thieves Hellway', player), player)) + set_rule(world.get_entrance('Thieves Hellway Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Thieves Hellway', player), player)) set_rule(world.get_entrance('Thieves Hellway Crystal Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Thieves Hellway N Crystal', player), player)) + set_rule(world.get_entrance('Thieves Hellway Crystal Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Thieves Hellway S Crystal', player), player)) set_rule(world.get_entrance('Thieves Triple Bypass SE', player), lambda state: state.can_reach_blue(world.get_region('Thieves Triple Bypass', player), player)) set_rule(world.get_entrance('Thieves Triple Bypass WN', player), lambda state: state.can_reach_blue(world.get_region('Thieves Triple Bypass', player), player)) set_rule(world.get_entrance('Thieves Triple Bypass EN', player), lambda state: state.can_reach_blue(world.get_region('Thieves Triple Bypass', player), player)) + set_rule(world.get_entrance('Ice Crystal Right Blue Hole', player), lambda state: state.can_reach_blue(world.get_region('Ice Crystal Right', player), player)) + set_rule(world.get_entrance('Ice Crystal Right Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Crystal Right', player), player)) set_rule(world.get_entrance('Ice Crystal Left Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Ice Crystal Left', player), player)) + set_rule(world.get_entrance('Ice Crystal Left Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Crystal Left', player), player)) set_rule(world.get_entrance('Ice Backwards Room Hole', player), lambda state: state.can_reach_blue(world.get_region('Ice Backwards Room', player), player)) + set_rule(world.get_entrance('Ice Bomb Jump Ledge Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Bomb Jump Ledge', player), player)) + set_rule(world.get_entrance('Ice Bomb Jump Catwalk Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Bomb Jump Catwalk', player), player)) + + set_rule(world.get_entrance('Ice Conveyor to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Ice Refill to Crystal', player), lambda state: state.can_hit_crystal(player) or state.can_reach_blue(world.get_region('Ice Refill', player), player)) + + set_rule(world.get_entrance('Mire Crystal Right Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Crystal Right', player), player)) + set_rule(world.get_entrance('Mire Crystal Mid Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Crystal Mid', player), player)) + set_rule(world.get_entrance('Mire Firesnake Skip Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Firesnake Skip', player), player)) + set_rule(world.get_entrance('Mire Antechamber Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Antechamber', player), player)) set_rule(world.get_entrance('Mire Hub Upper Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Hub', player), player)) set_rule(world.get_entrance('Mire Hub Lower Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Hub', player), player)) set_rule(world.get_entrance('Mire Hub Right Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Hub Right', player), player)) @@ -371,31 +451,70 @@ def global_rules(world, player): set_rule(world.get_entrance('Mire Compass Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Compass Room', player), player)) set_rule(world.get_entrance('Mire Crystal Mid Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Crystal Mid', player), player)) set_rule(world.get_entrance('Mire Crystal Left Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Crystal Left', player), player)) - set_rule(world.get_entrance('TR Crystal Maze Blue Path', player), lambda state: state.can_reach_blue(world.get_region('TR Crystal Maze End', player), player)) - set_rule(world.get_entrance('GT Hookshot Entry Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('GT Hookshot South Entry', player), player)) - set_rule(world.get_entrance('GT Double Switch Key Blue Path', player), lambda state: state.can_reach_blue(world.get_region('GT Double Switch Key Spot', player), player)) - set_rule(world.get_entrance('GT Double Switch Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('GT Double Switch Switches', player), player)) - set_rule(world.get_entrance('GT Double Switch Transition Blue', player), lambda state: state.can_reach_blue(world.get_region('GT Double Switch Transition', player), player)) - set_rule(world.get_entrance('Swamp Barrier Ledge - Orange', player), lambda state: state.can_reach_orange(world.get_region('Swamp Barrier Ledge', player), player)) - set_rule(world.get_entrance('Swamp Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Swamp Barrier', player), player)) - set_rule(world.get_entrance('Thieves Hellway Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Thieves Hellway', player), player)) - set_rule(world.get_entrance('Thieves Hellway Crystal Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Thieves Hellway S Crystal', player), player)) - set_rule(world.get_entrance('Ice Bomb Jump Ledge Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Bomb Jump Ledge', player), player)) - set_rule(world.get_entrance('Ice Bomb Jump Catwalk Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Bomb Jump Catwalk', player), player)) - set_rule(world.get_entrance('Ice Crystal Right Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Crystal Right', player), player)) - set_rule(world.get_entrance('Ice Crystal Left Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Ice Crystal Left', player), player)) - set_rule(world.get_entrance('Mire Crystal Right Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Crystal Right', player), player)) - set_rule(world.get_entrance('Mire Crystal Mid Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Crystal Mid', player), player)) - set_rule(world.get_entrance('Mire Firesnake Skip Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Firesnake Skip', player), player)) - set_rule(world.get_entrance('Mire Antechamber Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Antechamber', player), player)) - set_rule(world.get_entrance('GT Double Switch Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Entry', player), player)) - set_rule(world.get_entrance('GT Double Switch Orange Barrier 2', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Entry', player), player)) - set_rule(world.get_entrance('GT Double Switch Orange Path', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Switches', player), player)) - set_rule(world.get_entrance('GT Double Switch Key Orange Path', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Key Spot', player), player)) + set_rule(world.get_entrance('Mire Conveyor to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('Mire Tall Dark and Roomy to Ranged Crystal', player), lambda state: True) # Can always throw pots + set_rule(world.get_entrance('Mire Fishbone Blue Barrier Bypass', player), lambda state: False) # (state.world.can_take_damage or state.has('Cape', player) or state.has('Cane of Byrna', player)) and state.can_tastate.can_use_bombs(player) // Easy to do but obscure. Should it be in logic? + + set_rule(world.get_location('Turtle Rock - Chain Chomps', player), lambda state: state.can_reach('TR Chain Chomps Top', 'Region', player) and state.can_hit_crystal_through_barrier(player)) + set_rule(world.get_entrance('TR Chain Chomps Top to Bottom Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Chain Chomps Top', player), player)) + set_rule(world.get_entrance('TR Chain Chomps Bottom to Top Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Chain Chomps Bottom', player), player)) + set_rule(world.get_entrance('TR Pokey 2 Top to Bottom Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Pokey 2 Top', player), player)) + set_rule(world.get_entrance('TR Pokey 2 Bottom to Top Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Pokey 2 Bottom', player), player)) + set_rule(world.get_entrance('TR Crystaroller Bottom to Middle Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Bottom', player), player)) + set_rule(world.get_entrance('TR Crystaroller Middle to Bottom Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Middle', player), player)) + set_rule(world.get_entrance('TR Crystaroller Middle to Chest Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystaroller Middle', player), player)) + set_rule(world.get_entrance('TR Crystaroller Middle to Top Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Middle', player), player)) + set_rule(world.get_entrance('TR Crystaroller Top to Middle Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Top', player), player)) + set_rule(world.get_entrance('TR Crystaroller Chest to Middle Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystaroller Chest', player), player)) + set_rule(world.get_entrance('TR Crystal Maze Start to Interior Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystal Maze Start', player), player)) + set_rule(world.get_entrance('TR Crystal Maze Interior to End Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystal Maze Interior', player), player)) + set_rule(world.get_entrance('TR Crystal Maze Interior to Start Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystal Maze Interior', player), player)) + set_rule(world.get_entrance('TR Crystal Maze End to Interior Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystal Maze End', player), player)) + + set_rule(world.get_entrance('TR Chain Chomps Top to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('TR Pokey 2 Top to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('TR Crystaroller Top to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('TR Crystal Maze Start to Crystal', player), lambda state: state.can_hit_crystal(player)) + set_rule(world.get_entrance('TR Chain Chomps Bottom to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or (state.has('Hookshot', player) and state.can_reach_orange(world.get_region('TR Chain Chomps Bottom', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('TR Pokey 2 Bottom to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or (state.has('Hookshot', player) and state.can_reach_blue(world.get_region('TR Pokey 2 Bottom', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('TR Crystaroller Bottom to Ranged Crystal', player), lambda state: state.can_shoot_arrows(player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player) or (state.has('Hookshot', player) and state.can_reach_orange(world.get_region('TR Crystaroller Bottom', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('TR Crystaroller Middle to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or (state.has('Hookshot', player) and state.can_reach_orange(world.get_region('TR Crystaroller Middle', player), player))) # or state.has_beam_sword(player) + set_rule(world.get_entrance('TR Crystaroller Middle to Bottom Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Blue Boomerang', player)) + set_rule(world.get_entrance('TR Crystal Maze End to Ranged Crystal', player), lambda state: state.has('Cane of Somaria', player)) # or state.has('Blue Boomerang', player) or state.has('Red Boomerang', player) // These work by clipping the rang through the two stone blocks, which works sometimes. + set_rule(world.get_entrance('TR Crystal Maze Interior to End Bypass', player), lambda state: state.can_use_bombs(player) or state.can_shoot_arrows(player) or state.has('Red Boomerang', player) or state.has('Blue Boomerang', player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player)) # Beam sword does NOT work + set_rule(world.get_entrance('TR Crystal Maze Interior to Start Bypass', player), lambda state: True) # Can always grab a pot from the interior and walk it to the start region and throw it there + + set_rule(world.get_entrance('GT Hookshot Platform Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('GT Hookshot South Platform', player), player)) + set_rule(world.get_entrance('GT Hookshot Entry Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('GT Hookshot South Entry', player), player)) + set_rule(world.get_entrance('GT Double Switch Entry to Pot Corners Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Entry', player), player)) + set_rule(world.get_entrance('GT Double Switch Entry to Left Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Entry', player), player)) + set_rule(world.get_entrance('GT Double Switch Left to Entry Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Left', player), player)) + set_rule(world.get_entrance('GT Double Switch Pot Corners to Entry Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Double Switch Pot Corners', player), player)) + set_rule(world.get_entrance('GT Double Switch Pot Corners to Exit Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('GT Double Switch Pot Corners', player), player)) + set_rule(world.get_entrance('GT Double Switch Exit to Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('GT Double Switch Exit', player), player)) + set_rule(world.get_entrance('GT Spike Crystal Left to Right Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Spike Crystal Left', player), player)) + set_rule(world.get_entrance('GT Spike Crystal Right to Left Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Spike Crystal Right', player), player)) + set_rule(world.get_entrance('GT Crystal Conveyor to Corner Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('GT Crystal Conveyor', player), player)) + set_rule(world.get_entrance('GT Crystal Conveyor Corner to Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('GT Crystal Conveyor Corner', player), player)) + set_rule(world.get_entrance('GT Crystal Conveyor Corner to Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Crystal Conveyor Corner', player), player)) + set_rule(world.get_entrance('GT Crystal Conveyor Left to Corner Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Crystal Conveyor Left', player), player)) + set_rule(world.get_entrance('GT Crystal Circles Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Crystal Circles', player), player)) + + set_rule(world.get_entrance('GT Hookshot Platform Barrier Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Blue Boomerang', player) or state.has('Red Boomerang', player) or state.has('Cane of Somaria', player)) # or state.has_Boots(player) /// There is a super precise trick where you can throw a pot and climp into the blue barrier, then sprint out of them. + set_rule(world.get_entrance('GT Hookshot South Entry to Ranged Crystal', player), lambda state: state.can_use_bombs(player) or state.has('Blue Boomerang', player) or state.has('Red Boomerang', player) or state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('GT Double Switch Entry to Ranged Switches', player), lambda state: False) # state.has('Cane of Somaria', player) + set_rule(world.get_entrance('GT Double Switch Left to Entry Bypass', player), lambda state: True) # Can always use pots + set_rule(world.get_entrance('GT Double Switch Left to Pot Corners Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player) or state.has('Red Boomerang', player)) # or (state.has('Blue Boomerang', player) and state.has('Hookshot', player)) or (state.has('Ice Rod', player) and state.has('Hookshot', player)) or state.has('Hookshot', player) /// You can do this with just a pot and a hookshot + set_rule(world.get_entrance('GT Double Switch Left to Exit Bypass', player), lambda state: False) # state.can_use_bombs(player) or (state.has('Cane of Somaria', player) and (state.has('Red Boomerang', player) or (state.has('Hookshot', player) and state.has('Blue Boomerang', player)) or (state.has('Hookshot', player) and state.has('Ice Rod', player)))) + set_rule(world.get_entrance('GT Double Switch Pot Corners to Ranged Switches', player), lambda state: False) # state.can_use_bombs(player) or state.has('Cane of Somaria', player) or (state.has('Cane of Somaria', player) and state.has_Boots(player)) /// There's two ways to interact with the switch. Somaria bounce at the top corner, or timed throws at the bottom corner. + set_rule(world.get_entrance('GT Spike Crystal Left to Right Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player) or state.has('Red Boomerang', player) or state.has('Blue Boomerang', player)) # or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.can_use_beam_sword(player) + set_rule(world.get_entrance('GT Crystal Conveyor to Ranged Crystal', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('GT Crystal Conveyor Corner to Ranged Crystal', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('GT Crystal Conveyor Corner to Left Bypass', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) + set_rule(world.get_entrance('GT Crystal Circles to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or state.has_blunt_weapon(player) or state.has('Cane of Byrna', player)) # or state.has_beam_sword(player) add_key_logic_rules(world, player) - # End of door rando rules. add_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player)) @@ -403,6 +522,113 @@ def global_rules(world, player): and (state.has('Tempered Sword', player) or state.has('Golden Sword', player) or (state.has('Silver Arrows', player) and state.can_shoot_arrows(player)) or state.has('Lamp', player) or state.can_extend_magic(player, 12))) # need to light torch a sufficient amount of times set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has_beam_sword(player)) # need to damage ganon to get tiles to drop +def bomb_rules(world, player): + bonkable_doors = ['Two Brothers House Exit (West)', 'Two Brothers House Exit (East)'] # Technically this is incorrectly defined, but functionally the same as what is intended. + bombable_doors = ['Ice Rod Cave', 'Light World Bomb Hut', 'Light World Death Mountain Shop', 'Mini Moldorm Cave', + 'Hookshot Cave Exit (South)', 'Hookshot Cave Exit (North)', 'Dark Lake Hylia Ledge Fairy', 'Hype Cave', 'Brewery'] + for entrance in bonkable_doors: + add_rule(world.get_entrance(entrance, player), lambda state: state.can_use_bombs(player) or state.has_Boots(player)) + for entrance in bombable_doors: + add_rule(world.get_entrance(entrance, player), lambda state: state.can_use_bombs(player)) + + bonkable_items = ['Sahasrahla\'s Hut - Left', 'Sahasrahla\'s Hut - Middle', 'Sahasrahla\'s Hut - Right'] + bombable_items = ['Blind\'s Hideout - Top', 'Kakariko Well - Top', 'Chicken House', 'Aginah\'s Cave', 'Graveyard Cave', + 'Paradox Cave Upper - Left', 'Paradox Cave Upper - Right', + 'Hype Cave - Top', 'Hype Cave - Middle Right', 'Hype Cave - Middle Left', 'Hype Cave - Bottom'] + for location in bonkable_items: + add_rule(world.get_location(location, player), lambda state: state.can_use_bombs(player) or state.has_Boots(player)) + for location in bombable_items: + add_rule(world.get_location(location, player), lambda state: state.can_use_bombs(player)) + + cave_kill_locations = ['Mini Moldorm Cave - Far Left', 'Mini Moldorm Cave - Far Right', 'Mini Moldorm Cave - Left', 'Mini Moldorm Cave - Right', 'Mini Moldorm Cave - Generous Guy'] + for location in cave_kill_locations: + add_rule(world.get_location(location, player), lambda state: state.can_kill_most_things(player) or state.can_use_bombs(player)) + + paradox_switch_chests = ['Paradox Cave Lower - Far Left', 'Paradox Cave Lower - Left', 'Paradox Cave Lower - Right', 'Paradox Cave Lower - Far Right', 'Paradox Cave Lower - Middle'] + for location in paradox_switch_chests: + add_rule(world.get_location(location, player), lambda state: state.can_hit_crystal_through_barrier(player)) + + # Dungeon bomb logic + easy_kill_rooms = [ # Door, bool-bombable + ('Hyrule Dungeon Armory S', True), # One green guard + ('Hyrule Dungeon Armory ES', True), # One green guard + ('Hyrule Dungeon Armory Boomerang WS', True), # One blue guard + ('Desert Compass NW', True), # Three popos + ('Desert Four Statues NW', True), # Four popos + ('Desert Four Statues ES', True), # Four popos + ('Hera Beetles WS', False), # Three blue beetles and only two pots, and bombs don't work. + ('Thieves Basement Block WN', True), # One blue and one red zazak and one Stalfos. Two pots. Need to kill the third enemy somehow. + ('Ice Pengator Trap NE', False), # Five pengators. Bomb-doable? + ('TR Twin Pokeys EN', False), # Two pokeys + ('TR Twin Pokeys SW', False), # Two pokeys + ('GT Petting Zoo SE', False), # Dont make anyone do this room with bombs and/or pots. + ('GT DMs Room SW', False) # Four red stalfos + ] + for killdoor,bombable in easy_kill_rooms: + if bombable: + add_rule(world.get_entrance(killdoor, player), lambda state: (state.can_use_bombs(player) or state.can_kill_most_things(player))) + else: + add_rule(world.get_entrance(killdoor, player), lambda state: state.can_kill_most_things(player)) + add_rule(world.get_entrance('Ice Stalfos Hint SE', player), lambda state: state.can_use_bombs(player)) # Need bombs for big stalfos knights + add_rule(world.get_entrance('Mire Cross ES', player), lambda state: state.can_kill_most_things(player)) # 4 Sluggulas. Bombs don't work // or (state.can_use_bombs(player) and state.has('Magic Powder'), player) + + enemy_kill_drops = [ # Location, bool-bombable + ('Hyrule Castle - Map Guard Key Drop', True), + ('Hyrule Castle - Boomerang Guard Key Drop', True), + ('Hyrule Castle - Key Rat Key Drop', True), +# ('Hyrule Castle - Big Key Drop', True), # Pots are available +# ('Eastern Palace - Dark Eyegore Key Drop', True), # Pots are available + ('Castle Tower - Dark Archer Key Drop', True), +# ('Castle Tower - Circle of Pots Key Drop', True), # Pots are available +# ('Skull Woods - Spike Corner Key Drop', True), # Pots are available + ('Ice Palace - Jelly Key Drop', True), + ('Ice Palace - Conveyor Key Drop', True), + ('Misery Mire - Conveyor Crystal Key Drop', True), + ('Turtle Rock - Pokey 1 Key Drop', True), + ('Turtle Rock - Pokey 2 Key Drop', True), +# ('Ganons Tower - Mini Helmasaur Key Drop', True) # Pots are available + ('Castle Tower - Room 03', True), # Two spring soliders + ('Ice Palace - Compass Chest', True) # Pengators + ] + for location,bombable in enemy_kill_drops: + if bombable: + add_rule(world.get_location(location, player), lambda state: state.can_use_bombs(player) or state.can_kill_most_things(player)) + else: + add_rule(world.get_location(location, player), lambda state: state.can_kill_most_things(player)) + + add_rule(world.get_location('Attic Cracked Floor', player), lambda state: state.can_use_bombs(player)) + bombable_floors = ['PoD Pit Room Bomb Hole', 'Ice Bomb Drop Hole', 'Ice Freezors Bomb Hole', 'GT Bob\'s Room Hole'] + for entrance in bombable_floors: + add_rule(world.get_entrance(entrance, player), lambda state: state.can_use_bombs(player)) + + if world.doorShuffle[player] == 'vanilla': + add_rule(world.get_entrance('TR Lazy Eyes SE', player), lambda state: state.can_use_bombs(player)) # ToDo: Add always true for inverted, cross-entrance, and door-variants and so on. + add_rule(world.get_entrance('Turtle Rock Ledge Exit (West)', player), lambda state: state.can_use_bombs(player)) # Is this the same as above? + + dungeon_bonkable = ['PoD Warp Hint SE', 'PoD Jelly Hall NW', 'PoD Jelly Hall NE', 'PoD Mimics 1 SW', + 'Thieves Ambush E', 'Thieves Rail Ledge W', + 'TR Dash Room NW', 'TR Crystaroller SW', 'TR Dash Room ES', + 'GT Four Torches NW','GT Fairy Abyss SW' + ] + dungeon_bombable = ['PoD Map Balcony WS', 'PoD Arena Ledge ES', 'PoD Dark Maze E', 'PoD Big Chest Balcony W', + 'Swamp Pot Row WN','Swamp Map Ledge EN', 'Swamp Hammer Switch WN', 'Swamp Hub Dead Ledge EN', 'Swamp Waterway N', 'Swamp I S', + 'Skull Pot Circle WN', 'Skull Pull Switch EN', 'Skull Big Key EN', 'Skull Lone Pot WN', + 'Thieves Rail Ledge NW', 'Thieves Pot Alcove Bottom SW', + 'Ice Bomb Drop Hole', 'Ice Freezors Bomb Hole', + 'Mire Crystal Mid NW', 'Mire Tall Dark and Roomy WN', 'Mire Shooter Rupees EN', 'Mire Crystal Top SW', + 'GT Warp Maze (Rails) WS', 'GT Bob\'s Room Hole', 'GT Randomizer Room ES', 'GT Bomb Conveyor SW', 'GT Crystal Circles NW', 'GT Cannonball Bridge SE', 'GT Refill NE' + ] + for entrance in dungeon_bonkable: + add_rule(world.get_entrance(entrance, player), lambda state: state.can_use_bombs(player) or state.has_Boots(player)) + for entrance in dungeon_bombable: + add_rule(world.get_entrance(entrance, player), lambda state: state.can_use_bombs(player)) + else: + doors_to_bomb_check = [x for x in world.doors if x.player == player and x.type in [DoorType.Normal, DoorType.Interior]] + for door in doors_to_bomb_check: + if door.kind(world) in [DoorKind.Dashable]: + add_rule(door.entrance, lambda state: state.can_use_bombs(player) or state.has_Boots(player)) + elif door.kind(world) in [DoorKind.Bombable]: + add_rule(door.entrance, lambda state: state.can_use_bombs(player)) def default_rules(world, player): # overworld requirements @@ -720,7 +946,7 @@ def no_glitches_rules(world, player): 'Mire Dark Shooters': {'sewer': False, 'entrances': ['Mire Dark Shooters Up Stairs', 'Mire Dark Shooters SW', 'Mire Dark Shooters SE'], 'locations': []}, 'Mire Key Rupees': {'sewer': False, 'entrances': ['Mire Key Rupees NE'], 'locations': []}, 'Mire Block X': {'sewer': False, 'entrances': ['Mire Block X NW', 'Mire Block X WS'], 'locations': []}, - 'Mire Tall Dark and Roomy': {'sewer': False, 'entrances': ['Mire Tall Dark and Roomy ES', 'Mire Tall Dark and Roomy WS', 'Mire Tall Dark and Roomy WN'], 'locations': []}, + 'Mire Tall Dark and Roomy': {'sewer': False, 'entrances': ['Mire Tall Dark and Roomy ES', 'Mire Tall Dark and Roomy WS', 'Mire Tall Dark and Roomy WN', 'Mire Tall Dark and Roomy to Ranged Crystal'], 'locations': []}, 'Mire Crystal Right': {'sewer': False, 'entrances': ['Mire Crystal Right ES'], 'locations': []}, 'Mire Crystal Mid': {'sewer': False, 'entrances': ['Mire Crystal Mid NW'], 'locations': []}, 'Mire Crystal Left': {'sewer': False, 'entrances': ['Mire Crystal Left WS'], 'locations': []}, @@ -730,9 +956,8 @@ def no_glitches_rules(world, player): 'PoD Callback': {'sewer': False, 'entrances': ['PoD Callback WS', 'PoD Callback Warp'], 'locations': []}, 'PoD Turtle Party': {'sewer': False, 'entrances': ['PoD Turtle Party ES', 'PoD Turtle Party NW'], 'locations': []}, 'PoD Lonely Turtle': {'sewer': False, 'entrances': ['PoD Lonely Turtle SW', 'PoD Lonely Turtle EN'], 'locations': []}, - 'PoD Dark Pegs': {'sewer': False, 'entrances': ['PoD Dark Pegs Hammer Path', 'PoD Dark Pegs WN'], 'locations': []}, - 'PoD Dark Pegs Ladder': {'sewer': False, 'entrances': ['PoD Dark Pegs Up Ladder', 'PoD Dark Pegs Ladder Hammer Path', 'PoD Dark Pegs Ladder Cane Path'], 'locations': []}, - 'PoD Dark Pegs Switch': {'sewer': False, 'entrances': ['PoD Dark Pegs Switch Path'], 'locations': []}, + 'PoD Dark Pegs Landing': {'sewer': False, 'entrances': ['PoD Dark Pegs Up Ladder', 'PoD Dark Pegs Landing to Right', 'PoD Dark Pegs Landing to Ranged Crystal'], 'locations': []}, + 'PoD Dark Pegs Left': {'sewer': False, 'entrances': ['PoD Dark Pegs WN', 'PoD Dark Pegs Left to Middle Barrier - Blue', 'PoD Dark Pegs Left to Ranged Crystal'], 'locations': []}, 'PoD Dark Basement': {'sewer': False, 'entrances': ['PoD Dark Basement W Up Stairs', 'PoD Dark Basement E Up Stairs'], 'locations': ['Palace of Darkness - Dark Basement - Left', 'Palace of Darkness - Dark Basement - Right']}, 'PoD Dark Maze': {'sewer': False, 'entrances': ['PoD Dark Maze EN', 'PoD Dark Maze E'], 'locations': ['Palace of Darkness - Dark Maze - Top', 'Palace of Darkness - Dark Maze - Bottom']}, 'Eastern Dark Square': {'sewer': False, 'entrances': ['Eastern Dark Square NW', 'Eastern Dark Square Key Door WN', 'Eastern Dark Square EN'], 'locations': []}, @@ -808,36 +1033,35 @@ def swordless_rules(world, player): std_kill_rooms = { - 'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S'], - 'Hyrule Dungeon Armory Boomerang': ['Hyrule Dungeon Armory Boomerang WS'], - 'Eastern Stalfos Spawn': ['Eastern Stalfos Spawn ES', 'Eastern Stalfos Spawn NW'], - 'Desert Compass Room': ['Desert Compass NW'], - 'Desert Four Statues': ['Desert Four Statues NW', 'Desert Four Statues ES'], - 'Hera Beetles': ['Hera Beetles WS'], - 'Tower Gold Knights': ['Tower Gold Knights SW', 'Tower Gold Knights EN'], - 'Tower Dark Archers': ['Tower Dark Archers WN'], - 'Tower Red Spears': ['Tower Red Spears WN'], - 'Tower Red Guards': ['Tower Red Guards EN', 'Tower Red Guards SW'], - 'Tower Circle of Pots': ['Tower Circle of Pots NW'], - 'PoD Turtle Party': ['PoD Turtle Party ES', 'PoD Turtle Party NW'], # todo: hammer req. in main rules - 'Thieves Basement Block': ['Thieves Basement Block WN'], - 'Ice Stalfos Hint': ['Ice Stalfos Hint SE'], - 'Ice Pengator Trap': ['Ice Pengator Trap NE'], - 'Mire 2': ['Mire 2 NE'], - 'Mire Cross': ['Mire Cross ES'], - 'TR Twin Pokeys': ['TR Twin Pokeys EN', 'TR Twin Pokeys SW'], - 'GT Petting Zoo': ['GT Petting Zoo SE'], - 'GT DMs Room': ['GT DMs Room SW'], - 'GT Gauntlet 1': ['GT Gauntlet 1 WN'], - 'GT Gauntlet 2': ['GT Gauntlet 2 EN', 'GT Gauntlet 2 SW'], - 'GT Gauntlet 3': ['GT Gauntlet 3 NW', 'GT Gauntlet 3 SW'], - 'GT Gauntlet 4': ['GT Gauntlet 4 NW', 'GT Gauntlet 4 SW'], - 'GT Gauntlet 5': ['GT Gauntlet 5 NW', 'GT Gauntlet 5 WS'], - 'GT Wizzrobes 1': ['GT Wizzrobes 1 SW'], - 'GT Wizzrobes 2': ['GT Wizzrobes 2 SE', 'GT Wizzrobes 2 NE'] + 'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard + 'Hyrule Dungeon Armory Boomerang': ['Hyrule Dungeon Armory Boomerang WS'], # One blue guard + 'Eastern Stalfos Spawn': ['Eastern Stalfos Spawn ES', 'Eastern Stalfos Spawn NW'], # Can use pots + 'Desert Compass Room': ['Desert Compass NW'], # Three popos + 'Desert Four Statues': ['Desert Four Statues NW', 'Desert Four Statues ES'], # Four popos + 'Hera Beetles': ['Hera Beetles WS'], # Three blue beetles and only two pots, and bombs don't work. + 'Tower Gold Knights': ['Tower Gold Knights SW', 'Tower Gold Knights EN'], # Two ball and chain + 'Tower Dark Archers': ['Tower Dark Archers WN'], # Not a kill room + 'Tower Red Spears': ['Tower Red Spears WN'], # Two spear soldiers + 'Tower Red Guards': ['Tower Red Guards EN', 'Tower Red Guards SW'], # Two usain bolts + 'Tower Circle of Pots': ['Tower Circle of Pots NW'], # Two spear soldiers. Plenty of pots. + 'PoD Turtle Party': ['PoD Turtle Party ES', 'PoD Turtle Party NW'], # Lots of turtles. + 'Thieves Basement Block': ['Thieves Basement Block WN'], # One blue and one red zazak and one Stalfos. Two pots. Need weapon. + 'Ice Stalfos Hint': ['Ice Stalfos Hint SE'], # Need bombs for big stalfos knights + 'Ice Pengator Trap': ['Ice Pengator Trap NE'], # Five pengators. Bomb-doable? + 'Mire 2': ['Mire 2 NE'], # Wizzrobes. Bombs dont work. + 'Mire Cross': ['Mire Cross ES'], # 4 Sluggulas. Bombs don't work + 'TR Twin Pokeys': ['TR Twin Pokeys EN', 'TR Twin Pokeys SW'], # Two pokeys + 'GT Petting Zoo': ['GT Petting Zoo SE'], # Dont make anyone do this room with bombs. + 'GT DMs Room': ['GT DMs Room SW'], # Four red stalfos + 'GT Gauntlet 1': ['GT Gauntlet 1 WN'], # Stalfos/zazaks + 'GT Gauntlet 2': ['GT Gauntlet 2 EN', 'GT Gauntlet 2 SW'], # Red stalfos + 'GT Gauntlet 3': ['GT Gauntlet 3 NW', 'GT Gauntlet 3 SW'], # Blue zazaks + 'GT Gauntlet 4': ['GT Gauntlet 4 NW', 'GT Gauntlet 4 SW'], # Red zazaks + 'GT Gauntlet 5': ['GT Gauntlet 5 NW', 'GT Gauntlet 5 WS'], # Stalfos and zazak + 'GT Wizzrobes 1': ['GT Wizzrobes 1 SW'], # Wizzrobes. Bombs don't work + 'GT Wizzrobes 2': ['GT Wizzrobes 2 SE', 'GT Wizzrobes 2 NE'] # Wizzrobes. Bombs don't work } # all trap rooms? - def add_connection(parent_name, target_name, entrance_name, world, player): parent = world.get_region(parent_name, player) target = world.get_region(target_name, player) @@ -873,7 +1097,7 @@ def standard_rules(world, player): return loc.item and loc.item.name == 'Bombs (10)' def standard_escape_rule(state): - return state.can_kill_most_things(player) or bomb_escape_rule() + return state.can_kill_most_things(player) or bomb_escape_rule() add_item_rule(world.get_location('Link\'s Uncle', player), uncle_item_rule) @@ -1551,30 +1775,32 @@ def set_inverted_bunny_rules(world, player): bunny_impassible_doors = { - 'Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES', 'Sewers Secret Room Push Block', 'Sewers Pull Switch S', + 'Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES', 'Sewers Pull Switch S', 'Eastern Lobby N', 'Eastern Courtyard Ledge W', 'Eastern Courtyard Ledge E', 'Eastern Pot Switch SE', - 'Eastern Map Balcony Hook Path', 'Eastern Stalfos Spawn ES', 'Eastern Stalfos Spawn NW', - 'Eastern Hint Tile Push Block', 'Eastern Darkness S', 'Eastern Darkness NE', 'Eastern Darkness Up Stairs', + 'Eastern Map Balcony Hook Path', 'Eastern Stalfos Spawn ES', 'Eastern Stalfos Spawn NW', + 'Eastern Darkness S', 'Eastern Darkness NE', 'Eastern Darkness Up Stairs', 'Eastern Attic Start WS', 'Eastern Single Eyegore NE', 'Eastern Duo Eyegores NE', 'Desert Main Lobby Left Path', 'Desert Main Lobby Right Path', 'Desert Left Alcove Path', 'Desert Right Alcove Path', 'Desert Compass NW', 'Desert West Lobby NW', 'Desert Back Lobby NW', 'Desert Four Statues NW', 'Desert Four Statues ES', - 'Desert Beamos Hall WS', 'Desert Beamos Hall NE', 'Desert Wall Slide NW', 'Hera Lobby Down Stairs', - 'Hera Lobby Key Stairs', 'Hera Lobby Up Stairs', 'Hera Tile Room EN', 'Hera Tridorm SE', 'Hera Beetles WS', + 'Desert Beamos Hall WS', 'Desert Beamos Hall NE', 'Desert Wall Slide NW', + 'Hera Lobby to Front Barrier - Blue', 'Hera Front to Lobby Barrier - Blue', 'Hera Front to Down Stairs Barrier - Blue', + 'Hera Down Stairs to Front Barrier - Blue', 'Hera Tile Room EN', 'Hera Tridorm SE', 'Hera Beetles WS', 'Hera 4F Down Stairs', 'Tower Gold Knights SW', 'Tower Dark Maze EN', 'Tower Dark Pits ES', 'Tower Dark Archers WN', 'Tower Red Spears WN', 'Tower Red Guards EN', 'Tower Red Guards SW', 'Tower Circle of Pots NW', 'Tower Altar NW', - 'PoD Left Cage SW', 'PoD Middle Cage SE', 'PoD Pit Room Bomb Hole', 'PoD Pit Room Block Path N', - 'PoD Pit Room Block Path S', 'PoD Stalfos Basement Warp', 'PoD Arena Main SW', 'PoD Arena Main Crystal Path', - 'PoD Arena Bonk Path', 'PoD Arena Crystal Path', 'PoD Sexy Statue NW', 'PoD Map Balcony Drop Down', - 'PoD Mimics 1 NW', 'PoD Warp Hint Warp', 'PoD Falling Bridge Path N', 'PoD Falling Bridge Path S', - 'PoD Mimics 2 NW', 'PoD Bow Statue Down Ladder', 'PoD Dark Pegs Up Ladder', 'PoD Dark Pegs WN', + 'PoD Left Cage SW', 'PoD Middle Cage SE', 'PoD Pit Room Bomb Hole', 'PoD Stalfos Basement Warp', + 'PoD Arena Main to Landing Barrier - Blue', 'PoD Arena Landing to Right Barrier - Blue', + 'PoD Arena Right to Landing Barrier - Blue', 'PoD Arena Main to Landing Barrier - Blue', + 'PoD Arena Landing Bonk Path', 'PoD Sexy Statue NW', 'PoD Map Balcony Drop Down', + 'PoD Mimics 1 NW', 'PoD Falling Bridge Path N', 'PoD Falling Bridge Path S', + 'PoD Mimics 2 NW', 'PoD Bow Statue Down Ladder', 'PoD Dark Pegs Landing to Right', + 'PoD Dark Pegs Left to Middle Barrier - Blue', 'PoD Dark Pegs Left to Ranged Crystal', 'PoD Turtle Party ES', 'PoD Turtle Party NW', 'PoD Callback Warp', 'Swamp Lobby Moat', 'Swamp Entrance Moat', 'Swamp Trench 1 Approach Swim Depart', 'Swamp Trench 1 Approach Key', 'Swamp Trench 1 Key Approach', 'Swamp Trench 1 Key Ledge Depart', 'Swamp Trench 1 Departure Approach', 'Swamp Trench 1 Departure Key', - 'Swamp Hub Hook Path', 'Swamp Compass Donut Push Block', - 'Swamp Shortcut Blue Barrier', 'Swamp Trench 2 Pots Blue Barrier', 'Swamp Trench 2 Pots Wet', - 'Swamp Trench 2 Departure Wet', 'Swamp West Shallows Push Blocks', 'Swamp West Ledge Hook Path', - 'Swamp Barrier Ledge Hook Path', 'Swamp Attic Left Pit', 'Swamp Attic Right Pit', 'Swamp Push Statue NW', - 'Swamp Push Statue NE', 'Swamp Drain Right Switch', 'Swamp Waterway NE', 'Swamp Waterway N', 'Swamp Waterway NW', + 'Swamp Hub Hook Path', 'Swamp Shortcut Blue Barrier', 'Swamp Trench 2 Pots Blue Barrier', + 'Swamp Trench 2 Pots Wet', 'Swamp Trench 2 Departure Wet', 'Swamp West Ledge Hook Path', 'Swamp Barrier Ledge Hook Path', + 'Swamp Attic Left Pit', 'Swamp Attic Right Pit', 'Swamp Push Statue NW', 'Swamp Push Statue NE', + 'Swamp Drain Right Switch', 'Swamp Waterway NE', 'Swamp Waterway N', 'Swamp Waterway NW', 'Skull Pot Circle WN', 'Skull Pot Circle Star Path', 'Skull Pull Switch S', 'Skull Big Chest N', 'Skull Big Chest Hookpath', 'Skull 2 East Lobby NW', 'Skull Back Drop Star Path', 'Skull 2 West Lobby NW', 'Skull 3 Lobby EN', 'Skull Star Pits SW', 'Skull Star Pits ES', 'Skull Torch Room WN', 'Skull Vines NW', @@ -1582,9 +1808,7 @@ bunny_impassible_doors = { 'Thieves Hellway Blue Barrier', 'Thieves Hellway Crystal Blue Barrier', 'Thieves Attic ES', 'Thieves Basement Block Path', 'Thieves Blocked Entry Path', 'Thieves Conveyor Bridge Block Path', 'Thieves Conveyor Block Path', 'Ice Lobby WS', 'Ice Cross Left Push Block', 'Ice Cross Bottom Push Block Left', - 'Ice Cross Bottom Push Block Right', 'Ice Cross Right Push Block Top', 'Ice Cross Right Push Block Bottom', - 'Ice Cross Top Push Block Bottom', 'Ice Cross Top Push Block Right', 'Ice Bomb Drop Hole', 'Ice Pengator Switch WS', - 'Ice Pengator Switch ES', 'Ice Big Key Push Block', 'Ice Stalfos Hint SE', 'Ice Bomb Jump EN', + 'Ice Bomb Drop Hole', 'Ice Pengator Switch WS', 'Ice Pengator Switch ES', 'Ice Big Key Push Block', 'Ice Stalfos Hint SE', 'Ice Bomb Jump EN', 'Ice Pengator Trap NE', 'Ice Hammer Block ES', 'Ice Tongue Pull WS', 'Ice Freezors Bomb Hole', 'Ice Tall Hint WS', 'Ice Hookshot Ledge Path', 'Ice Hookshot Balcony Path', 'Ice Many Pots SW', 'Ice Many Pots WS', 'Ice Crystal Right Blue Hole', 'Ice Crystal Left Blue Barrier', 'Ice Big Chest Landing Push Blocks', @@ -1593,22 +1817,20 @@ bunny_impassible_doors = { 'Mire Hub Right Blue Barrier', 'Mire Hub Top Blue Barrier', 'Mire Hub Switch Blue Barrier N', 'Mire Hub Switch Blue Barrier S', 'Mire Falling Bridge WN', 'Mire Map Spike Side Blue Barrier', 'Mire Map Spot Blue Barrier', 'Mire Crystal Dead End Left Barrier', 'Mire Crystal Dead End Right Barrier', - 'Mire Cross ES', 'Mire Hidden Shooters Block Path S', 'Mire Hidden Shooters Block Path N', - 'Mire Left Bridge Hook Path', 'Mire Fishbone Blue Barrier', + 'Mire Cross ES', 'Mire Left Bridge Hook Path', 'Mire Fishbone Blue Barrier', 'Mire South Fish Blue Barrier', 'Mire Tile Room NW', 'Mire Compass Blue Barrier', 'Mire Attic Hint Hole', 'Mire Dark Shooters SW', 'Mire Crystal Mid Blue Barrier', 'Mire Crystal Left Blue Barrier', 'TR Main Lobby Gap', 'TR Lobby Ledge Gap', 'TR Hub SW', 'TR Hub SE', 'TR Hub ES', 'TR Hub EN', 'TR Hub NW', 'TR Hub NE', 'TR Torches NW', - 'TR Pokey 2 EN', 'TR Pokey 2 ES', 'TR Twin Pokeys SW', 'TR Twin Pokeys EN', 'TR Big Chest Gap', + 'TR Pokey 2 Bottom to Top Barrier - Blue', 'TR Pokey 2 Top to Bottom Barrier - Blue', 'TR Twin Pokeys SW', 'TR Twin Pokeys EN', 'TR Big Chest Gap', 'TR Big Chest Entrance Gap', 'TR Lazy Eyes ES', 'TR Tongue Pull WS', 'TR Tongue Pull NE', 'TR Dark Ride Up Stairs', - 'TR Dark Ride SW', 'TR Crystal Maze Forwards Path', 'TR Crystal Maze Blue Path', 'TR Crystal Maze Cane Path', + 'TR Dark Ride SW', 'TR Crystal Maze Start to Interior Barrier - Blue', 'TR Crystal Maze End to Interior Barrier - Blue', 'TR Final Abyss South Stairs', 'TR Final Abyss NW', 'GT Hope Room EN', 'GT Blocked Stairs Block Path', 'GT Bob\'s Room Hole', 'GT Speed Torch SE', 'GT Speed Torch South Path', 'GT Speed Torch North Path', 'GT Crystal Conveyor NE', 'GT Crystal Conveyor WN', 'GT Conveyor Cross EN', 'GT Conveyor Cross WN', 'GT Hookshot East-North Path', 'GT Hookshot East-South Path', 'GT Hookshot North-East Path', 'GT Hookshot North-South Path', 'GT Hookshot South-East Path', 'GT Hookshot South-North Path', - 'GT Hookshot Platform Blue Barrier', 'GT Hookshot Entry Blue Barrier', 'GT Hookshot Entry Boomerang Path', - 'GT Double Switch Blue Path', 'GT Double Switch Key Blue Path', 'GT Double Switch Blue Barrier', - 'GT Double Switch Transition Blue', 'GT Firesnake Room Hook Path', 'GT Falling Bridge WN', 'GT Falling Bridge WS', + 'GT Hookshot Platform Blue Barrier', 'GT Hookshot Entry Blue Barrier', 'GT Double Switch Pot Corners to Exit Barrier - Blue', + 'GT Double Switch Exit to Blue Barrier', 'GT Firesnake Room Hook Path', 'GT Falling Bridge WN', 'GT Falling Bridge WS', 'GT Ice Armos NE', 'GT Ice Armos WS', 'GT Crystal Paths SW', 'GT Mimics 1 NW', 'GT Mimics 1 ES', 'GT Mimics 2 WS', 'GT Mimics 2 NE', 'GT Hidden Spikes EN', 'GT Cannonball Bridge SE', 'GT Gauntlet 1 WN', 'GT Gauntlet 2 EN', 'GT Gauntlet 2 SW', 'GT Gauntlet 3 NW', 'GT Gauntlet 3 SW', 'GT Gauntlet 4 NW', 'GT Gauntlet 4 SW', diff --git a/TestSuite.py b/TestSuite.py index af1d1db4..c4f24dd0 100644 --- a/TestSuite.py +++ b/TestSuite.py @@ -4,11 +4,50 @@ import multiprocessing import concurrent.futures import argparse from collections import OrderedDict +import csv cpu_threads = multiprocessing.cpu_count() py_version = f"{sys.version_info.major}.{sys.version_info.minor}" +SETTINGS = { + 'mode': ['open'], + 'goal': ['ganon', 'pedestal', 'triforcehunt', 'crystals', 'dungeons'], + 'swords': ['random', 'swordless', 'assured'], + 'shuffle': ['vanilla','simple','restricted','full','dungeonssimple','dungeonsfull', 'crossed','insanity'], + 'accessibility': [True, False], + 'difficulty': [True, False], + 'shufflepots': [True, False], + 'keydropshuffle': [True, False], + 'keysanity': [True, False], + 'retro': [True, False], + 'shopsanity': [True, False] +} + +SETTINGS = { + 'mode': ['open', 'inverted'], + 'goal': ['ganon'], + 'swords': ['random'], + 'shuffle': ['vanilla'], + 'accessibility': [True], + 'difficulty': [False], + 'shufflepots': [False], + 'keydropshuffle': [True, False], + 'keysanity': [True, False], + 'retro': [False], + 'shopsanity': [False] +} + +optionsList = [] +for sett,options in SETTINGS.items(): + for option in options: + if isinstance(option, str): + optionsList.append(f'{option}') + else: + optionsList.append('{}-{}'.format(sett,str(option))) + +headerList = list(SETTINGS.keys()) + def main(args=None): successes = [] errors = [] @@ -23,34 +62,88 @@ def main(args=None): dead_or_alive = 0 alive = 0 - def test(testname: str, command: str): - tests[testname] = [command] - for mode in [['Open', ''], - ['Std ', ' --mode standard'], - ['Inv ', ' --mode inverted']]: + def test(testname: list, command: str): + tests[' '.join(testname)] = [command] + basecommand = f"py -3.8 DungeonRandomizer.py --door_shuffle {args.dr} --intensity {args.tense} --suppress_rom --suppress_spoiler" - basecommand = f"python3.8 DungeonRandomizer.py --door_shuffle {args.dr} --intensity {args.tense} --suppress_rom --suppress_spoiler" + def gen_seed(): + taskcommand = basecommand + ' ' + command + return subprocess.run(taskcommand, capture_output=True, shell=True, text=True) - def gen_seed(): - taskcommand = basecommand + " " + command + mode[1] - return subprocess.run(taskcommand, capture_output=True, shell=True, text=True) + for _ in range(1, max_attempts + 1): + task = pool.submit(gen_seed) + task.success = False + task.name = ' '.join(testname) + task.settings = testname + task.cmd = basecommand + ' ' + command + task_mapping.append(task) - for x in range(1, max_attempts + 1): - task = pool.submit(gen_seed) - task.success = False - task.name = testname - task.mode = mode[0] - task.cmd = basecommand + " " + command + mode[1] - task_mapping.append(task) + for mode in SETTINGS['mode']: + for goal in SETTINGS['goal']: + for swords in SETTINGS['swords']: + for shuffle in SETTINGS['shuffle']: + for difficulty in SETTINGS['difficulty']: + for shufflepots in SETTINGS['shufflepots']: + for accessibility in SETTINGS['accessibility']: + for keydropshuffle in SETTINGS['keydropshuffle']: + for keysanity in SETTINGS['keysanity']: + for retro in SETTINGS['retro']: + for shopsanity in SETTINGS['shopsanity']: + commands = '' + name = [] + commands = commands + f' --mode {mode}' + name.append(mode) + commands = commands + f' --goal {goal}' + name.append(goal) + commands = commands + f' --swords {swords}' + name.append(swords) + commands = commands + f' --shuffle {shuffle}' + name.append(shuffle) + if difficulty: + commands = commands + f' --difficulty expert' + commands = commands + f' --item_functionality expert' + name.append('difficulty-True') + else: + name.append('difficulty-False') + if shufflepots: + commands = commands + f' --shufflepots' + name.append('shufflepots-True') + else: + name.append('shufflepots-False') + if not accessibility: + commands = commands + f' --accessibility none' + name.append('accessibility-False') + else: + name.append('accessibility-True') + if keydropshuffle: + commands = commands + f' --keydropshuffle' + name.append('keydropshuffle-True') + else: + name.append('keydropshuffle-False') + if keysanity: + commands = commands + f' --keysanity' + name.append('keysanity-True') + else: + name.append('keysanity-False') + if retro: + commands = commands + f' --retro' + name.append('retro-True') + else: + name.append('retro-False') + if shopsanity: + commands = commands + f' --shopsanity' + name.append('shopsanity-True') + else: + name.append('shopsanity-False') + test(name, commands) - test("Vanilla ", "--shuffle vanilla") - test("Retro ", "--retro --shuffle vanilla") - test("Keysanity ", "--shuffle vanilla --keydropshuffle --keysanity") - test("Shopsanity", "--shuffle vanilla --shopsanity") - test("Simple ", "--shuffle simple") - test("Full ", "--shuffle full") - test("Crossed ", "--shuffle crossed") - test("Insanity ", "--shuffle insanity") +# test("Vanilla ", "--futuro --shuffle vanilla") +# test("Basic ", "--futuro --retro --shuffle vanilla") +# test("Keysanity ", "--futuro --shuffle vanilla --keydropshuffle --keysanity") +# test("Simple ", "--futuro --shuffle simple") +# test("Crossed ", "--futuro --shuffle crossed") +# test("Insanity ", "--futuro --shuffle insanity") +# test("CrossKeys ", "--futuro --shuffle crossed --keydropshuffle --keysanity") from tqdm import tqdm with tqdm(concurrent.futures.as_completed(task_mapping), @@ -61,34 +154,53 @@ def main(args=None): try: result = task.result() if result.returncode: - errors.append([task.name + task.mode, task.cmd, result.stderr]) + errors.append([task.name, task.cmd, result.stderr]) else: alive += 1 task.success = True except Exception as e: raise e - progressbar.set_description(f"Success rate: {(alive/dead_or_alive)*100:.2f}% - {task.name}{task.mode}") + progressbar.set_description(f"Success rate: {(alive/dead_or_alive)*100:.2f}% - {task.name}") - def get_results(testname: str): + def get_results(option: str): result = "" - for mode in ['Open', 'Std ', 'Inv ']: - dead_or_alive = [task.success for task in task_mapping if task.name == testname and task.mode == mode] - alive = [x for x in dead_or_alive if x] - success = f"{testname}{mode} Rate: {(len(alive) / len(dead_or_alive)) * 100:.2f}%" - successes.append(success) - print(success) - result += f"{(len(alive)/len(dead_or_alive))*100:.2f}%\t" + dead_or_alive = [task.success for task in task_mapping if option in task.settings] + alive = [x for x in dead_or_alive if x] + success = f"{option} Rate: {(len(alive) / len(dead_or_alive)) * 100:.1f}%" + successes.append(success) + print(success) + result += f"{(len(alive)/len(dead_or_alive))*100:.2f}%\t" return result.strip() - + results = [] - for t in tests.keys(): - results.append(get_results(t)) + for option in optionsList: + results.append(get_results(option)) for result in results: - print(result) successes.append(result) + tabresultsfile = './output/' + args.dr + '.tsv' + with open(tabresultsfile, 'w+', newline='') as f: + writer = csv.writer(f, delimiter='\t') + header = headerList.copy() + header.append('Success') + writer.writerow(header) + for task in task_mapping: + settings = [] + for option in headerList: + if option in task.settings: + settings.append(1) + elif str(option + '-True') in task.settings: + settings.append(1) + else: + settings.append(0) + if task.success: + settings.append(1) + else: + settings.append(0) + writer.writerow(settings) + return successes, errors @@ -108,9 +220,10 @@ if __name__ == "__main__": cpu_threads = args.cpu_threads - for dr in [['vanilla', args.count if args.count else 2, 1], - ['basic', args.count if args.count else 5, 3], - ['crossed', args.count if args.count else 10, 3]]: +# for dr in [['vanilla', args.count if args.count else 2, 1], +# ['basic', args.count if args.count else 5, 1], +# ['crossed', args.count if args.count else 10, 1]]: + for dr in [['crossed', args.count if args.count else 2, 1]]: for tense in range(1, dr[2] + 1): args = argparse.Namespace() @@ -124,13 +237,13 @@ if __name__ == "__main__": print() if errors: - with open(f"{dr[0]}{(f'-{tense}' if dr[0] in ['basic', 'crossed'] else '')}-errors.txt", 'w') as stream: + with open(f"./output/{dr[0]}{(f'-{tense}' if dr[0] in ['basic', 'crossed'] else '')}-errors.txt", 'w') as stream: for error in errors: stream.write(error[0] + "\n") stream.write(error[1] + "\n") stream.write(error[2] + "\n\n") - with open("success.txt", "w") as stream: + with open("./output/success.txt", "w") as stream: stream.write(str.join("\n", successes)) input("Press enter to continue")