From 56b8492985a331b6d6e14ed6abaaaea5f9f09a92 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 30 Sep 2021 18:48:53 -0500 Subject: [PATCH] Added entrance and exit pool framework to ER --- EntranceShuffle.py | 570 +++++++++++++++++++++++++++++++++------------ 1 file changed, 415 insertions(+), 155 deletions(-) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 99655774..9717258f 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -3,10 +3,33 @@ import RaceRandom as random # ToDo: With shuffle_ganon option, prevent gtower from linking to an exit only location through a 2 entrance cave. from collections import defaultdict +entrance_pool = list() +exit_pool = list() def link_entrances(world, player): invFlag = world.mode[player] == 'inverted' + global entrance_pool, exit_pool + entrance_pool = Entrance_Pool_Base.copy() + exit_pool = Exit_Pool_Base.copy() + default_drops = default_drop_connections.copy() + default_dropexits = default_dropexit_connections.copy() + isolated_entrances = Isolated_LH_Doors.copy() + + # modifications to lists + if invFlag == (0x1b in world.owswaps[player][0] and world.owMixed[player]): + default_drops.append(tuple(('Pyramid Hole', 'Pyramid'))) + default_dropexits.append(tuple(('Pyramid Entrance', 'Pyramid Exit'))) + connect_simple(world, 'Other World S&Q', 'Pyramid Area', player) + else: + entrance_pool.remove('Pyramid Hole') + entrance_pool.add('Inverted Pyramid Hole') + entrance_pool.remove('Pyramid Entrance') + entrance_pool.add('Inverted Pyramid Entrance') + default_drops.append(tuple(('Inverted Pyramid Hole', 'Pyramid'))) + default_dropexits.append(tuple(('Inverted Pyramid Entrance', 'Pyramid Exit'))) + connect_simple(world, 'Other World S&Q', 'Hyrule Castle Ledge', player) + Dungeon_Exits = Dungeon_Exits_Base.copy() Cave_Exits = Cave_Exits_Base.copy() Old_Man_House = Old_Man_House_Base.copy() @@ -25,22 +48,25 @@ def link_entrances(world, player): for exitname, regionname in inverted_mandatory_connections: connect_simple(world, exitname, regionname, player) + connect_simple(world, 'Tavern North', 'Tavern', player) + connect_custom(world, player) # if we do not shuffle, set default connections if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']: - for exitname, regionname in default_connections + default_connector_connections + default_drop_connections + default_item_connections + default_shop_connections: - connect_simple(world, exitname, regionname, player) - if world.shuffle[player] == 'vanilla': - for exitname, regionname in default_dungeon_connections: - connect_simple(world, exitname, regionname, player) + for entrancename, exitname in default_connections + default_drops + default_item_connections + default_shop_connections: + connect_logical(world, entrancename, exitname, player, False) + for entrancename, exitname in default_connector_connections + default_dropexits: + connect_logical(world, entrancename, exitname, player, True) if not invFlag: - for exitname, regionname in open_default_connections: - connect_simple(world, exitname, regionname, player) + for entrancename, exitname in open_default_connections: + connect_logical(world, entrancename, exitname, player, True) + connect_exit(world, 'Chris Houlihan Room Exit', 'Links House', player) else: - for exitname, regionname in inverted_default_connections: - connect_simple(world, exitname, regionname, player) + for entrancename, exitname in inverted_default_connections: + connect_logical(world, entrancename, exitname, player, True) + connect_exit(world, 'Chris Houlihan Room Exit', 'Big Bomb Shop', player) # inverted entrance mods for owid in swapped_connections.keys(): @@ -60,12 +86,17 @@ def link_entrances(world, player): # dungeon entrance shuffle if world.shuffle[player] == 'vanilla': + for entrancename, exitname in default_dungeon_connections: + connect_logical(world, entrancename, exitname, player, True) + for entrancename, exitname in default_skulldrop_connections: + connect_logical(world, entrancename, exitname, player, False) + if not invFlag: - for exitname, regionname in open_default_dungeon_connections: - connect_simple(world, exitname, regionname, player) + for entrancename, exitname in open_default_dungeon_connections: + connect_logical(world, entrancename, exitname, player, True) else: - for exitname, regionname in inverted_default_dungeon_connections: - connect_simple(world, exitname, regionname, player) + for entrancename, exitname in inverted_default_dungeon_connections: + connect_logical(world, entrancename, exitname, player, True) elif world.shuffle[player] == 'dungeonssimple': simple_shuffle_dungeons(world, player) elif world.shuffle[player] == 'dungeonsfull': @@ -855,7 +886,7 @@ def link_entrances(world, player): world.powder_patch_required[player] = True # check for ganon location - if world.get_entrance('Pyramid Hole' if invFlag == (0x03 in world.owswaps[player][0] and world.owMixed[player]) else 'Inverted Pyramid Hole', player).connected_region.name != 'Pyramid': + if world.get_entrance('Pyramid Hole' if invFlag == (0x1b in world.owswaps[player][0] and world.owMixed[player]) else 'Inverted Pyramid Hole', player).connected_region.name != 'Pyramid': world.ganon_at_pyramid[player] = False # check for Ganon's Tower location @@ -874,6 +905,29 @@ def connect_simple(world, exitname, regionname, player): world.get_entrance(exitname, player).connect(world.get_region(regionname, player)) +def connect_logical(world, entrancename, exitname, player, isTwoWay = False): + if entrancename not in entrance_pool: + x = 9 + if exitname not in exit_pool: + x = 9 + assert entrancename in entrance_pool, 'Entrance not in pool: ' + entrancename + assert exitname in exit_pool, 'Exit not in pool: ' + exitname + try: + region = world.get_region(exitname, player) + exit = None + except RuntimeError: + exit = world.get_entrance(exitname, player) + region = exit.parent_region + + connect_simple(world, entrancename, region.name, player) + if isTwoWay: + region = world.get_entrance(entrancename, player).parent_region + connect_simple(world, exitname, region.name, player) + + entrance_pool.remove(entrancename) + exit_pool.remove(exitname) + + def connect_entrance(world, entrancename, exitname, player): entrance = world.get_entrance(entrancename, player) # check if we got an entrance or a region to connect to @@ -2071,6 +2125,285 @@ Inverted_Must_Exit_Invalid_Connections = defaultdict(set, { 'Hyrule Castle Entrance (East)': {'Hyrule Castle Entrance (West)', 'Agahnims Tower'}, }) +Entrance_Pool_Base = {'Links House', + 'Desert Palace Entrance (South)', + 'Desert Palace Entrance (West)', + 'Desert Palace Entrance (East)', + 'Desert Palace Entrance (North)', + 'Eastern Palace', + 'Tower of Hera', + 'Hyrule Castle Entrance (South)', + 'Hyrule Castle Entrance (West)', + 'Hyrule Castle Entrance (East)', + 'Agahnims Tower', + 'Thieves Town', + 'Skull Woods First Section Door', + 'Skull Woods Second Section Door (East)', + 'Skull Woods Second Section Door (West)', + 'Skull Woods Final Section', + 'Ice Palace', + 'Misery Mire', + 'Palace of Darkness', + 'Swamp Palace', + 'Turtle Rock', + 'Dark Death Mountain Ledge (West)', + 'Dark Death Mountain Ledge (East)', + 'Turtle Rock Isolated Ledge Entrance', + 'Hyrule Castle Secret Entrance Stairs', + 'Kakariko Well Cave', + 'Bat Cave Cave', + 'Elder House (East)', + 'Elder House (West)', + 'North Fairy Cave', + 'Lost Woods Hideout Stump', + 'Lumberjack Tree Cave', + 'Two Brothers House (East)', + 'Two Brothers House (West)', + 'Sanctuary', + 'Old Man Cave (East)', + 'Old Man Cave (West)', + 'Old Man House (Bottom)', + 'Old Man House (Top)', + 'Death Mountain Return Cave (West)', + 'Death Mountain Return Cave (East)', + 'Spectacle Rock Cave (Bottom)', + 'Spectacle Rock Cave', + 'Spectacle Rock Cave Peak', + 'Paradox Cave (Bottom)', + 'Paradox Cave (Middle)', + 'Paradox Cave (Top)', + 'Fairy Ascension Cave (Bottom)', + 'Fairy Ascension Cave (Top)', + 'Spiral Cave (Bottom)', + 'Spiral Cave', + 'Bumper Cave (Top)', + 'Bumper Cave (Bottom)', + 'Superbunny Cave (Top)', + 'Superbunny Cave (Bottom)', + 'Hookshot Cave', + 'Hookshot Cave Back Entrance', + 'Ganons Tower', + 'Pyramid Entrance', + 'Waterfall of Wishing', + 'Dam', + 'Blinds Hideout', + 'Lumberjack House', + 'Bonk Fairy (Light)', + 'Bonk Fairy (Dark)', + 'Lake Hylia Fairy', + 'Light Hype Fairy', + 'Desert Fairy', + 'Dark Lake Hylia Fairy', + 'Dark Lake Hylia Ledge Fairy', + 'Dark Desert Fairy', + 'Dark Death Mountain Fairy', + 'Fortune Teller (Light)', + 'Lake Hylia Fortune Teller', + 'Kings Grave', + 'Chicken House', + 'Aginahs Cave', + 'Sahasrahlas Hut', + 'Cave Shop (Lake Hylia)', + 'Cave Shop (Dark Death Mountain)', + 'Capacity Upgrade', + 'Blacksmiths Hut', + 'Sick Kids House', + 'Lost Woods Gamble', + 'Snitch Lady (East)', + 'Snitch Lady (West)', + 'Bush Covered House', + 'Tavern (Front)', + 'Light World Bomb Hut', + 'Kakariko Shop', + 'Cave 45', + 'Graveyard Cave', + 'Checkerboard Cave', + 'Mini Moldorm Cave', + 'Long Fairy Cave', + 'Good Bee Cave', + '20 Rupee Cave', + '50 Rupee Cave', + 'Ice Rod Cave', + 'Bonk Rock Cave', + 'Library', + 'Kakariko Gamble Game', + 'Potion Shop', + 'Hookshot Fairy', + 'Pyramid Fairy', + 'East Dark World Hint', + 'Palace of Darkness Hint', + 'Big Bomb Shop', + 'Dark World Shop', + 'Dark Lake Hylia Shop', + 'Dark World Lumberjack Shop', + 'Dark World Potion Shop', + 'Dark Lake Hylia Ledge Spike Cave', + 'Dark Lake Hylia Ledge Hint', + 'Hype Cave', + 'Brewery', + 'C-Shaped House', + 'Chest Game', + 'Dark World Hammer Peg Cave', + 'Red Shield Shop', + 'Dark Sanctuary Hint', + 'Fortune Teller (Dark)', + 'Archery Game', + 'Mire Shed', + 'Dark Desert Hint', + 'Spike Cave', + 'Mimic Cave', + 'Kakariko Well Drop', + 'Hyrule Castle Secret Entrance Drop', + 'Bat Cave Drop', + 'North Fairy Cave Drop', + 'Lost Woods Hideout Drop', + 'Lumberjack Tree Tree', + 'Sanctuary Grave', + 'Skull Woods Second Section Hole', + 'Skull Woods First Section Hole (West)', + 'Skull Woods First Section Hole (East)', + 'Skull Woods First Section Hole (North)', + 'Pyramid Hole'} + +Exit_Pool_Base = {'Links House Exit', + 'Desert Palace Exit (South)', + 'Desert Palace Exit (West)', + 'Desert Palace Exit (East)', + 'Desert Palace Exit (North)', + 'Eastern Palace Exit', + 'Tower of Hera Exit', + 'Hyrule Castle Exit (South)', + 'Hyrule Castle Exit (West)', + 'Hyrule Castle Exit (East)', + 'Agahnims Tower Exit', + 'Thieves Town Exit', + 'Skull Woods First Section Exit', + 'Skull Woods Second Section Exit (East)', + 'Skull Woods Second Section Exit (West)', + 'Skull Woods Final Section Exit', + 'Ice Palace Exit', + 'Misery Mire Exit', + 'Palace of Darkness Exit', + 'Swamp Palace Exit', + 'Turtle Rock Exit (Front)', + 'Turtle Rock Ledge Exit (West)', + 'Turtle Rock Ledge Exit (East)', + 'Turtle Rock Isolated Ledge Exit', + 'Hyrule Castle Secret Entrance Exit', + 'Kakariko Well Exit', + 'Bat Cave Exit', + 'Elder House Exit (East)', + 'Elder House Exit (West)', + 'North Fairy Cave Exit', + 'Lost Woods Hideout Exit', + 'Lumberjack Tree Exit', + 'Two Brothers House Exit (East)', + 'Two Brothers House Exit (West)', + 'Sanctuary Exit', + 'Old Man Cave Exit (East)', + 'Old Man Cave Exit (West)', + 'Old Man House Exit (Bottom)', + 'Old Man House Exit (Top)', + 'Death Mountain Return Cave Exit (West)', + 'Death Mountain Return Cave Exit (East)', + 'Spectacle Rock Cave Exit', + 'Spectacle Rock Cave Exit (Top)', + 'Spectacle Rock Cave Exit (Peak)', + 'Paradox Cave Exit (Bottom)', + 'Paradox Cave Exit (Middle)', + 'Paradox Cave Exit (Top)', + 'Fairy Ascension Cave Exit (Bottom)', + 'Fairy Ascension Cave Exit (Top)', + 'Spiral Cave Exit', + 'Spiral Cave Exit (Top)', + 'Bumper Cave Exit (Top)', + 'Bumper Cave Exit (Bottom)', + 'Superbunny Cave Exit (Top)', + 'Superbunny Cave Exit (Bottom)', + 'Hookshot Cave Front Exit', + 'Hookshot Cave Back Exit', + 'Ganons Tower Exit', + 'Pyramid Exit', + 'Waterfall of Wishing', + 'Dam', + 'Blinds Hideout', + 'Lumberjack House', + 'Bonk Fairy (Light)', + 'Bonk Fairy (Dark)', + 'Lake Hylia Healer Fairy', + 'Swamp Healer Fairy', + 'Desert Healer Fairy', + 'Dark Lake Hylia Healer Fairy', + 'Dark Lake Hylia Ledge Healer Fairy', + 'Dark Desert Healer Fairy', + 'Dark Death Mountain Healer Fairy', + 'Fortune Teller (Light)', + 'Lake Hylia Fortune Teller', + 'Kings Grave', + 'Chicken House', + 'Aginahs Cave', + 'Sahasrahlas Hut', + 'Cave Shop (Lake Hylia)', + 'Cave Shop (Dark Death Mountain)', + 'Capacity Upgrade', + 'Blacksmiths Hut', + 'Sick Kids House', + 'Lost Woods Gamble', + 'Snitch Lady (East)', + 'Snitch Lady (West)', + 'Bush Covered House', + 'Tavern (Front)', + 'Light World Bomb Hut', + 'Kakariko Shop', + 'Cave 45', + 'Graveyard Cave', + 'Checkerboard Cave', + 'Mini Moldorm Cave', + 'Long Fairy Cave', + 'Good Bee Cave', + '20 Rupee Cave', + '50 Rupee Cave', + 'Ice Rod Cave', + 'Bonk Rock Cave', + 'Library', + 'Kakariko Gamble Game', + 'Potion Shop', + 'Hookshot Fairy', + 'Pyramid Fairy', + 'East Dark World Hint', + 'Palace of Darkness Hint', + 'Big Bomb Shop', + 'Village of Outcasts Shop', + 'Dark Lake Hylia Shop', + 'Dark World Lumberjack Shop', + 'Dark World Potion Shop', + 'Dark Lake Hylia Ledge Spike Cave', + 'Dark Lake Hylia Ledge Hint', + 'Hype Cave', + 'Brewery', + 'C-Shaped House', + 'Chest Game', + 'Dark World Hammer Peg Cave', + 'Red Shield Shop', + 'Dark Sanctuary Hint', + 'Fortune Teller (Dark)', + 'Archery Game', + 'Mire Shed', + 'Dark Desert Hint', + 'Spike Cave', + 'Mimic Cave', + 'Kakariko Well (top)', + 'Hyrule Castle Secret Entrance', + 'Bat Cave (right)', + 'North Fairy Cave', + 'Lost Woods Hideout (top)', + 'Lumberjack Tree (top)', + 'Sewer Drop', + 'Skull Back Drop', + 'Skull Left Drop', + 'Skull Pinball', + 'Skull Pot Circle', + 'Pyramid'} # these are connections that cannot be shuffled and always exist. They link together separate parts of the world we need to divide into regions mandatory_connections = [('Links House S&Q', 'Links House'), @@ -2101,18 +2434,12 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ('Hookshot Cave Middle to Front', 'Hookshot Cave (Front)'), ('Hookshot Cave Middle to Back', 'Hookshot Cave (Back)'), ('Hookshot Cave Back to Middle', 'Hookshot Cave (Middle)'), - ('Ganon Drop', 'Bottom of Pyramid'), - - # Unshuffled Entrances - ('Tavern North', 'Tavern') + ('Ganon Drop', 'Bottom of Pyramid') ] -open_mandatory_connections = [('Sanctuary S&Q', 'Sanctuary'), - ('Other World S&Q', 'Pyramid Area')] +open_mandatory_connections = [('Sanctuary S&Q', 'Sanctuary')] -inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), - ('Other World S&Q', 'Hyrule Castle Ledge'), - ('Dark Sanctuary Hint Exit', 'Dark Chapel Area')] +inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint')] # non-shuffled entrance links default_connections = [('Lumberjack House', 'Lumberjack House'), @@ -2150,58 +2477,32 @@ default_connections = [('Lumberjack House', 'Lumberjack House'), ('Dark Death Mountain Fairy', 'Dark Death Mountain Healer Fairy'), ] -default_connector_connections = [('Old Man Cave (West)', 'Old Man Cave Ledge'), - ('Old Man Cave (East)', 'Old Man Cave'), - ('Old Man Cave Exit (West)', 'Mountain Entry Entrance'), - ('Old Man Cave Exit (East)', 'West Death Mountain (Bottom)'), - ('Old Man House (Bottom)', 'Old Man House'), - ('Old Man House Exit (Bottom)', 'West Death Mountain (Bottom)'), - ('Old Man House (Top)', 'Old Man House Back'), - ('Old Man House Exit (Top)', 'West Death Mountain (Bottom)'), - ('Death Mountain Return Cave (East)', 'Death Mountain Return Cave'), - ('Death Mountain Return Cave (West)', 'Death Mountain Return Cave'), - ('Death Mountain Return Cave Exit (West)', 'Mountain Entry Ledge'), - ('Death Mountain Return Cave Exit (East)', 'West Death Mountain (Bottom)'), - ('Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Peak)'), - ('Spectacle Rock Cave (Bottom)', 'Spectacle Rock Cave (Bottom)'), - ('Spectacle Rock Cave', 'Spectacle Rock Cave (Top)'), - ('Spectacle Rock Cave Exit', 'West Death Mountain (Bottom)'), - ('Spectacle Rock Cave Exit (Top)', 'West Death Mountain (Bottom)'), - ('Spectacle Rock Cave Exit (Peak)', 'West Death Mountain (Bottom)'), - ('Spiral Cave', 'Spiral Cave (Top)'), - ('Spiral Cave (Bottom)', 'Spiral Cave (Bottom)'), - ('Spiral Cave Exit', 'East Death Mountain (Bottom)'), - ('Spiral Cave Exit (Top)', 'Spiral Cave Ledge'), - ('Fairy Ascension Cave (Bottom)', 'Fairy Ascension Cave (Bottom)'), - ('Fairy Ascension Cave (Top)', 'Fairy Ascension Cave (Top)'), - ('Fairy Ascension Cave Exit (Bottom)', 'Fairy Ascension Plateau'), - ('Fairy Ascension Cave Exit (Top)', 'Fairy Ascension Ledge'), - ('Paradox Cave (Bottom)', 'Paradox Cave Front'), - ('Paradox Cave (Middle)', 'Paradox Cave'), - ('Paradox Cave (Top)', 'Paradox Cave'), - ('Paradox Cave Exit (Bottom)', 'East Death Mountain (Bottom)'), - ('Paradox Cave Exit (Middle)', 'East Death Mountain (Bottom)'), - ('Paradox Cave Exit (Top)', 'East Death Mountain (Top East)'), - ('Elder House (East)', 'Elder House'), - ('Elder House (West)', 'Elder House'), - ('Elder House Exit (East)', 'Kakariko Area'), - ('Elder House Exit (West)', 'Kakariko Area'), - ('Two Brothers House (East)', 'Two Brothers House'), - ('Two Brothers House (West)', 'Two Brothers House'), - ('Two Brothers House Exit (East)', 'Kakariko Suburb Area'), - ('Two Brothers House Exit (West)', 'Maze Race Ledge'), - ('Bumper Cave (Bottom)', 'Bumper Cave'), - ('Bumper Cave (Top)', 'Bumper Cave'), - ('Bumper Cave Exit (Top)', 'Bumper Cave Ledge'), - ('Bumper Cave Exit (Bottom)', 'Bumper Cave Entrance'), - ('Superbunny Cave (Top)', 'Superbunny Cave (Top)'), - ('Superbunny Cave (Bottom)', 'Superbunny Cave (Bottom)'), - ('Superbunny Cave Exit (Top)', 'East Dark Death Mountain (Top)'), - ('Superbunny Cave Exit (Bottom)', 'East Dark Death Mountain (Bottom)'), - ('Hookshot Cave', 'Hookshot Cave (Front)'), - ('Hookshot Cave Back Entrance', 'Hookshot Cave (Back)'), - ('Hookshot Cave Front Exit', 'East Dark Death Mountain (Top)'), - ('Hookshot Cave Back Exit', 'Dark Death Mountain Floating Island') +default_connector_connections = [('Old Man Cave (West)', 'Old Man Cave Exit (West)'), + ('Old Man Cave (East)', 'Old Man Cave Exit (East)'), + ('Old Man House (Bottom)', 'Old Man House Exit (Bottom)'), + ('Old Man House (Top)', 'Old Man House Exit (Top)'), + ('Death Mountain Return Cave (East)', 'Death Mountain Return Cave Exit (East)'), + ('Death Mountain Return Cave (West)', 'Death Mountain Return Cave Exit (West)'), + ('Spectacle Rock Cave Peak', 'Spectacle Rock Cave Exit (Peak)'), + ('Spectacle Rock Cave (Bottom)', 'Spectacle Rock Cave Exit'), + ('Spectacle Rock Cave', 'Spectacle Rock Cave Exit (Top)'), + ('Spiral Cave', 'Spiral Cave Exit (Top)'), + ('Spiral Cave (Bottom)', 'Spiral Cave Exit'), + ('Fairy Ascension Cave (Bottom)', 'Fairy Ascension Cave Exit (Bottom)'), + ('Fairy Ascension Cave (Top)', 'Fairy Ascension Cave Exit (Top)'), + ('Paradox Cave (Bottom)', 'Paradox Cave Exit (Bottom)'), + ('Paradox Cave (Middle)', 'Paradox Cave Exit (Middle)'), + ('Paradox Cave (Top)', 'Paradox Cave Exit (Top)'), + ('Elder House (East)', 'Elder House Exit (East)'), + ('Elder House (West)', 'Elder House Exit (West)'), + ('Two Brothers House (East)', 'Two Brothers House Exit (East)'), + ('Two Brothers House (West)', 'Two Brothers House Exit (West)'), + ('Bumper Cave (Bottom)', 'Bumper Cave Exit (Bottom)'), + ('Bumper Cave (Top)', 'Bumper Cave Exit (Top)'), + ('Superbunny Cave (Top)', 'Superbunny Cave Exit (Top)'), + ('Superbunny Cave (Bottom)', 'Superbunny Cave Exit (Bottom)'), + ('Hookshot Cave', 'Hookshot Cave Front Exit'), + ('Hookshot Cave Back Entrance', 'Hookshot Cave Back Exit') ] default_item_connections = [('Mimic Cave', 'Mimic Cave'), @@ -2244,33 +2545,25 @@ default_shop_connections = [('Kakariko Shop', 'Kakariko Shop'), ] default_drop_connections = [('Lost Woods Hideout Drop', 'Lost Woods Hideout (top)'), - ('Lost Woods Hideout Stump', 'Lost Woods Hideout (bottom)'), - ('Lost Woods Hideout Exit', 'Lost Woods East Area'), ('Lumberjack Tree Tree', 'Lumberjack Tree (top)'), - ('Lumberjack Tree Cave', 'Lumberjack Tree (bottom)'), - ('Lumberjack Tree Exit', 'Lumberjack Area'), - ('Sanctuary', 'Sanctuary Portal'), ('Sanctuary Grave', 'Sewer Drop'), - ('Sanctuary Exit', 'Sanctuary Area'), ('North Fairy Cave Drop', 'North Fairy Cave'), - ('North Fairy Cave', 'North Fairy Cave'), - ('North Fairy Cave Exit', 'River Bend Area'), ('Kakariko Well Drop', 'Kakariko Well (top)'), - ('Kakariko Well Cave', 'Kakariko Well (bottom)'), - ('Kakariko Well Exit', 'Kakariko Area'), ('Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance'), - ('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance'), - ('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Courtyard Northeast'), ('Bat Cave Drop', 'Bat Cave (right)'), - ('Bat Cave Cave', 'Bat Cave (left)'), - ('Bat Cave Exit', 'Blacksmith Area'), - ('Pyramid Hole', 'Pyramid'), - ('Pyramid Entrance', 'Bottom of Pyramid'), - ('Inverted Pyramid Hole', 'Pyramid'), - ('Inverted Pyramid Entrance', 'Bottom of Pyramid'), - ('Pyramid Exit', 'Pyramid Exit Ledge') + #('Pyramid Hole', 'Pyramid') # this is dynamically added because of Inverted/OW Mixed ] +default_dropexit_connections = [('Lost Woods Hideout Stump', 'Lost Woods Hideout Exit'), + ('Lumberjack Tree Cave', 'Lumberjack Tree Exit'), + ('Sanctuary', 'Sanctuary Exit'), + ('North Fairy Cave', 'North Fairy Cave Exit'), + ('Kakariko Well Cave', 'Kakariko Well Exit'), + ('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Exit'), + ('Bat Cave Cave', 'Bat Cave Exit'), + #('Pyramid Entrance', 'Pyramid Exit') # this is dynamically added because of Inverted/OW Mixed + ] + swapped_connections = { 0x03: [ ('Old Man Cave (East)', 'Death Mountain Return Cave Exit (West)'), @@ -2282,75 +2575,44 @@ swapped_connections = { ('Death Mountain Return Cave (West)', 'Bumper Cave Exit (Top)'), ('Bumper Cave (Bottom)', 'Old Man Cave Exit (West)'), ('Bumper Cave (Top)', 'Dark Death Mountain Healer Fairy') - ], - 0x1b: [ - ('Inverted Pyramid Entrance', 'Pyramid Exit') ] } -open_default_connections = [('Links House', 'Links House'), - ('Links House Exit', 'Links House Area'), +open_default_connections = [('Links House', 'Links House Exit'), ('Big Bomb Shop', 'Big Bomb Shop') ] -inverted_default_connections = [('Links House', 'Big Bomb Shop'), - ('Links House Exit', 'Big Bomb Shop Area'), - ('Big Bomb Shop', 'Links House') +inverted_default_connections = [('Big Bomb Shop', 'Links House Exit'), + ('Links House', 'Big Bomb Shop') ] # non shuffled dungeons -default_dungeon_connections = [('Desert Palace Entrance (South)', 'Desert South Portal'), - ('Desert Palace Entrance (West)', 'Desert West Portal'), - ('Desert Palace Entrance (North)', 'Desert Back Portal'), - ('Desert Palace Entrance (East)', 'Desert East Portal'), - ('Desert Palace Exit (South)', 'Desert Palace Stairs'), - ('Desert Palace Exit (West)', 'Desert Ledge'), - ('Desert Palace Exit (East)', 'Desert Palace Mouth'), - ('Desert Palace Exit (North)', 'Desert Palace Entrance (North) Spot'), +default_dungeon_connections = [('Desert Palace Entrance (South)', 'Desert Palace Exit (South)'), + ('Desert Palace Entrance (West)', 'Desert Palace Exit (West)'), + ('Desert Palace Entrance (North)', 'Desert Palace Exit (North)'), + ('Desert Palace Entrance (East)', 'Desert Palace Exit (East)'), + + ('Eastern Palace', 'Eastern Palace Exit'), + ('Tower of Hera', 'Tower of Hera Exit'), - ('Eastern Palace', 'Eastern Portal'), - ('Eastern Palace Exit', 'Eastern Palace Area'), - ('Tower of Hera', 'Hera Portal'), - ('Tower of Hera Exit', 'West Death Mountain (Top)'), + ('Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)'), + ('Hyrule Castle Entrance (West)', 'Hyrule Castle Exit (West)'), + ('Hyrule Castle Entrance (East)', 'Hyrule Castle Exit (East)'), - ('Hyrule Castle Entrance (South)', 'Hyrule Castle South Portal'), - ('Hyrule Castle Entrance (West)', 'Hyrule Castle West Portal'), - ('Hyrule Castle Entrance (East)', 'Hyrule Castle East Portal'), - ('Hyrule Castle Exit (South)', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Exit (West)', 'Hyrule Castle Ledge'), - ('Hyrule Castle Exit (East)', 'Hyrule Castle Ledge'), + ('Thieves Town', 'Thieves Town Exit'), + ('Skull Woods First Section Door', 'Skull Woods First Section Exit'), + ('Skull Woods Second Section Door (East)', 'Skull Woods Second Section Exit (East)'), + ('Skull Woods Second Section Door (West)', 'Skull Woods Second Section Exit (West)'), + ('Skull Woods Final Section', 'Skull Woods Final Section Exit'), + ('Ice Palace', 'Ice Palace Exit'), + ('Misery Mire', 'Misery Mire Exit'), + ('Palace of Darkness', 'Palace of Darkness Exit'), + ('Swamp Palace', 'Swamp Palace Exit'), # requires additional patch for flooding moat if moved - ('Thieves Town', 'Thieves Town Portal'), - ('Thieves Town Exit', 'Village of Outcasts Area'), - ('Skull Woods First Section Hole (East)', 'Skull Pinball'), - ('Skull Woods First Section Hole (West)', 'Skull Left Drop'), - ('Skull Woods First Section Hole (North)', 'Skull Pot Circle'), - ('Skull Woods First Section Door', 'Skull 1 Portal'), - ('Skull Woods First Section Exit', 'Skull Woods Forest'), - ('Skull Woods Second Section Hole', 'Skull Back Drop'), - ('Skull Woods Second Section Door (East)', 'Skull 2 East Portal'), - ('Skull Woods Second Section Door (West)', 'Skull 2 West Portal'), - ('Skull Woods Second Section Exit (East)', 'Skull Woods Forest'), - ('Skull Woods Second Section Exit (West)', 'Skull Woods Forest (West)'), - ('Skull Woods Final Section', 'Skull 3 Portal'), - ('Skull Woods Final Section Exit', 'Skull Woods Forest (West)'), - ('Ice Palace', 'Ice Portal'), - ('Ice Palace Exit', 'Ice Palace Area'), - ('Misery Mire', 'Mire Portal'), - ('Misery Mire Exit', 'Misery Mire Area'), - ('Palace of Darkness', 'Palace of Darkness Portal'), - ('Palace of Darkness Exit', 'Palace of Darkness Area'), - ('Swamp Palace', 'Swamp Portal'), # requires additional patch for flooding moat if moved - ('Swamp Palace Exit', 'Swamp Area'), - - ('Turtle Rock', 'Turtle Rock Main Portal'), - ('Turtle Rock Exit (Front)', 'Turtle Rock Area'), - ('Turtle Rock Ledge Exit (West)', 'Dark Death Mountain Ledge'), - ('Turtle Rock Ledge Exit (East)', 'Dark Death Mountain Ledge'), - ('Dark Death Mountain Ledge (West)', 'Turtle Rock Lazy Eyes Portal'), - ('Dark Death Mountain Ledge (East)', 'Turtle Rock Chest Portal'), - ('Turtle Rock Isolated Ledge Exit', 'Dark Death Mountain Isolated Ledge'), - ('Turtle Rock Isolated Ledge Entrance', 'Turtle Rock Eye Bridge Portal') + ('Turtle Rock', 'Turtle Rock Exit (Front)'), + ('Dark Death Mountain Ledge (West)', 'Turtle Rock Ledge Exit (West)'), + ('Dark Death Mountain Ledge (East)', 'Turtle Rock Ledge Exit (East)'), + ('Turtle Rock Isolated Ledge Entrance', 'Turtle Rock Isolated Ledge Exit') ] open_default_dungeon_connections = [('Ganons Tower', 'Ganons Tower Portal'), @@ -2359,10 +2621,8 @@ open_default_dungeon_connections = [('Ganons Tower', 'Ganons Tower Portal'), ('Agahnims Tower Exit', 'Hyrule Castle Ledge') ] -inverted_default_dungeon_connections = [('Ganons Tower', 'Agahnims Tower Portal'), - ('Ganons Tower Exit', 'Hyrule Castle Ledge'), - ('Agahnims Tower', 'Ganons Tower Portal'), - ('Agahnims Tower Exit', 'West Dark Death Mountain (Top)') +inverted_default_dungeon_connections = [('Ganons Tower', 'Agahnims Tower Exit'), + ('Agahnims Tower', 'Ganons Tower Exit') ] indirect_connections = {