diff --git a/BaseClasses.py b/BaseClasses.py index 384ce313..ab4f4158 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1135,11 +1135,11 @@ class CollectionState(object): def can_lift_rocks(self, player): return self.has('Power Glove', player) or self.has('Titans Mitts', player) - - def can_bomb_clip(self, region, player: int) -> bool: + + def can_bomb_clip(self, region, player: int) -> bool: return self.is_not_bunny(region, player) and self.has('Pegasus Boots', player) and self.can_use_bombs(player) - - def can_dash_clip(self, region, player: int) -> bool: + + def can_dash_clip(self, region, player: int) -> bool: return self.is_not_bunny(region, player) and self.has('Pegasus Boots', player) def has_bottle(self, player): @@ -1254,7 +1254,7 @@ class CollectionState(object): def can_flute(self, player): if self.world.mode[player] == 'standard' and not self.has('Zelda Delivered', player): return False # can't flute in rain state - lw = self.world.get_region('Light World', player) + lw = self.world.get_region('Kakariko Village', player) return self.has('Ocarina (Activated)', player) or (self.has('Ocarina', player) and lw.can_reach(self) and self.is_not_bunny(lw, player)) @@ -1311,7 +1311,7 @@ class CollectionState(object): def can_superbunny_mirror_with_sword(self, player): return self.has_Mirror(player) and self.has_sword(player) - + def can_bunny_pocket(self, player): return self.has_Boots(player) and (self.has_Mirror(player) or self.has_bottle(player)) @@ -1456,6 +1456,12 @@ class CollectionState(object): raise RuntimeError('Cannot parse %s.' % item) +@unique +class Terrain(Enum): + Land = 0 + Water = 1 + + @unique class RegionType(Enum): Menu = 0 @@ -1484,6 +1490,7 @@ class Region(object): self.is_light_world = False # will be set aftermaking connections. self.is_dark_world = False self.spot_type = 'Region' + self.terrain = None self.hint_text = hint self.recursion_count = 0 self.player = player diff --git a/DoorShuffle.py b/DoorShuffle.py index 143f8497..bf646a45 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -478,7 +478,7 @@ def choose_portals(world, player): if portal_region.type == RegionType.LightWorld: world.get_portal(portal, player).light_world = True if name in world.inaccessible_regions[player] or (hc_flag and portal != 'Hyrule Castle South'): - name_key = 'Desert Ledge' if name == 'Desert Palace Entrance (North) Spot' else name + name_key = 'Desert Ledge' if name == 'Desert Ledge Keep' else name region_map[name_key].append(portal) inaccessible_portals.append(portal) else: @@ -631,7 +631,7 @@ def analyze_portals(world, player): if portal_region.type == RegionType.LightWorld: world.get_portal(portal, player).light_world = True if name in world.inaccessible_regions[player]: - name_key = 'Desert Ledge' if name == 'Desert Palace Entrance (North) Spot' else name + name_key = 'Desert Ledge' if name == 'Desert Ledge Keep' else name region_map[name_key].append(portal) inaccessible_portals.append(portal) else: @@ -3368,7 +3368,7 @@ def find_accessible_entrances(world, player, builder): hc_std = True start_regions = ['Hyrule Castle Courtyard'] elif world.mode[player] != 'inverted': - start_regions = ['Links House', 'Sanctuary', 'East Dark World'] + start_regions = ['Links House', 'Sanctuary', 'Pyramid Area'] else: start_regions = ['Links House', 'Dark Sanctuary Hint', 'Hyrule Castle Ledge'] regs = convert_regions(start_regions, world, player) @@ -3390,7 +3390,7 @@ def find_accessible_entrances(world, player, builder): if connect not in queue and connect not in visited_regions: queue.append(connect) for ext in next_region.exits: - if hc_std and ext.name in ['Hyrule Castle Main Gate (North)', 'Castle Gate Teleporter', 'Hyrule Castle Ledge Drop']: # just skip it + if hc_std and ext.name in ['Hyrule Castle Main Gate (North)', 'Castle Gate Teleporter (Inner)', 'Hyrule Castle Ledge Drop']: # just skip it continue connect = ext.connected_region if connect is None or ext.door and ext.door.blocked: diff --git a/DungeonGenerator.py b/DungeonGenerator.py index ed0a7b78..5f34fbf2 100644 --- a/DungeonGenerator.py +++ b/DungeonGenerator.py @@ -1538,8 +1538,8 @@ def calc_allowance_and_dead_ends(builder, connections_tuple, world, player): if entrance in connections.keys(): enabling_region = connections[entrance] check_list = list(potentials[enabling_region]) - if enabling_region.name in ['Desert Ledge', 'Desert Palace Entrance (North) Spot']: - alternate = 'Desert Palace Entrance (North) Spot' if enabling_region.name == 'Desert Ledge' else 'Desert Ledge' + if enabling_region.name in ['Desert Ledge', 'Desert Ledge Keep']: + alternate = 'Desert Ledge Keep' if enabling_region.name == 'Desert Ledge' else 'Desert Ledge' if world.get_region(alternate, player) in potentials: check_list.extend(potentials[world.get_region(alternate, player)]) connecting_entrances = [x for x in check_list if x != entrance and x not in dead_entrances and x not in drop_entrances_allowance] diff --git a/ER_hint_reference.txt b/ER_hint_reference.txt index 018dfb3a..2752961a 100644 --- a/ER_hint_reference.txt +++ b/ER_hint_reference.txt @@ -188,7 +188,7 @@ Dark World Shop: The hammer sealed building Red Shield Shop: The fenced in building Mire Shed: The western hut in the mire East Dark World Hint: The dark cave near the eastmost portal -Dark Desert Hint: The cave east of the mire +Mire Hint: The cave east of the mire Spike Cave: The ledge cave on west dark DM Palace of Darkness Hint: The building south of Kiki Dark Lake Hylia Ledge Spike Cave: The rock SE dark Lake Hylia @@ -200,7 +200,7 @@ Hype Cave: The cave south of the old bomb shop Brewery: The Village of Outcasts building with no door Dark Lake Hylia Ledge Hint: The open cave SE dark Lake Hylia Chest Game: The westmost building in the Village of Outcasts -Dark Desert Fairy: The eastern hut in the mire +Mire Fairy: The eastern hut in the mire Dark Lake Hylia Ledge Fairy: The sealed cave SE dark Lake Hylia Fortune Teller (Dark): The building NE the Village of Outcasts Sanctuary: Sanctuary diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 020e95a7..95cf696f 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -20,13 +20,6 @@ def link_entrances(world, player): for exitname, regionname in mandatory_connections: connect_simple(world, exitname, regionname, player) - if not invFlag: - for exitname, regionname in open_mandatory_connections: - connect_simple(world, exitname, regionname, player) - else: - for exitname, regionname in inverted_mandatory_connections: - connect_simple(world, exitname, regionname, player) - connect_custom(world, player) # if we do not shuffle, set default connections @@ -1579,7 +1572,7 @@ DW_Single_Cave_Doors = ['Bonk Fairy (Dark)', 'Red Shield Shop', 'Mire Shed', 'East Dark World Hint', - 'Dark Desert Hint', + 'Mire Hint', 'Spike Cave', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', @@ -1592,7 +1585,7 @@ DW_Single_Cave_Doors = ['Bonk Fairy (Dark)', 'Brewery', 'Dark Lake Hylia Ledge Hint', 'Chest Game', - 'Dark Desert Fairy', + 'Mire Fairy', 'Dark Lake Hylia Ledge Fairy', 'Fortune Teller (Dark)', 'Hammer Peg Cave'] @@ -1657,8 +1650,8 @@ Bomb_Shop_Single_Cave_Doors = ['Waterfall of Wishing', 'Dark Potion Shop', 'Archery Game', 'Mire Shed', - 'Dark Desert Hint', - 'Dark Desert Fairy', + 'Mire Hint', + 'Mire Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Fairy', @@ -1723,8 +1716,8 @@ Single_Cave_Targets = ['Blinds Hideout', 'Dark Lumberjack Shop', 'Archery Game', 'Mire Shed', - 'Dark Desert Hint', - 'Dark Desert Healer Fairy', + 'Mire Hint', + 'Mire Healer Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Healer Fairy', @@ -1867,7 +1860,7 @@ Inverted_DW_Single_Cave_Doors = ['Bonk Fairy (Dark)', 'Red Shield Shop', 'Mire Shed', 'East Dark World Hint', - 'Dark Desert Hint', + 'Mire Hint', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Death Mountain Shop', @@ -1879,7 +1872,7 @@ Inverted_DW_Single_Cave_Doors = ['Bonk Fairy (Dark)', 'Brewery', 'Dark Lake Hylia Ledge Hint', 'Chest Game', - 'Dark Desert Fairy', + 'Mire Fairy', 'Dark Lake Hylia Ledge Fairy', 'Fortune Teller (Dark)', 'Hammer Peg Cave'] @@ -1914,8 +1907,8 @@ Inverted_Bomb_Shop_Single_Cave_Doors = ['Waterfall of Wishing', 'Dark Potion Shop', 'Archery Game', 'Mire Shed', - 'Dark Desert Hint', - 'Dark Desert Fairy', + 'Mire Hint', + 'Mire Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Bumper Cave (Top)', @@ -2010,8 +2003,8 @@ Inverted_Single_Cave_Targets = ['Blinds Hideout', 'Dark Lumberjack Shop', 'Archery Game', 'Mire Shed', - 'Dark Desert Hint', - 'Dark Desert Healer Fairy', + 'Mire Hint', + 'Mire Healer Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Healer Fairy', @@ -2067,9 +2060,7 @@ Inverted_Must_Exit_Invalid_Connections = defaultdict(set, { # 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'), - - # underworld +mandatory_connections = [# underworld ('Lost Woods Hideout (top to bottom)', 'Lost Woods Hideout (bottom)'), ('Lumberjack Tree (top to bottom)', 'Lumberjack Tree (bottom)'), ('Death Mountain Return Cave E', 'Death Mountain Return Cave (right)'), @@ -2116,212 +2107,18 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ('Superbunny Cave Climb', 'Superbunny Cave (Top)'), ('Bumper Cave Bottom to Top', 'Bumper Cave (top)'), ('Bumper Cave Top To Bottom', 'Bumper Cave (bottom)'), - ('Ganon Drop', 'Bottom of Pyramid'), - - # water entry - ('Waterfall Fairy Access', 'Zora Waterfall Entryway'), - ('Zora Waterfall Water Drop', 'Lake Hylia Water'), - ('Light World Water Drop', 'Lake Hylia Water'), - ('Potion Shop Water Drop', 'Lake Hylia Water'), - ('Northeast Light World Water Drop', 'Lake Hylia Water'), - ('Lake Hylia Central Island Water Drop', 'Lake Hylia Water'), - - ('West Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Northeast Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Catfish Water Drop', 'Dark Lake Hylia Water'), - ('East Dark World Water Drop', 'Dark Lake Hylia Water'), - ('South Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Southeast Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Ice Palace Leave Water Drop', 'Dark Lake Hylia Water'), - - # water exit - ('Light World Pier', 'Light World'), # there are several piers in-game, only one needs to be modeled - ('Potion Shop Pier', 'Potion Shop Area'), - ('Hobo Pier', 'Hobo Bridge'), - ('Lake Hylia Central Island Pier', 'Lake Hylia Central Island'), - ('Lake Hylia Whirlpool', 'Northeast Light World'), - - ('Northeast Dark World Pier', 'Northeast Dark World'), - ('East Dark World Pier', 'East Dark World'), - ('Southeast Dark World Pier', 'Southeast Dark World'), - - # terrain - ('Master Sword Meadow', 'Master Sword Meadow'), - ('DM Hammer Bridge (West)', 'East Death Mountain (Top)'), - ('DM Hammer Bridge (East)', 'West Death Mountain (Top)'), - ('DM Broken Bridge (West)', 'East Death Mountain (Bottom)'), - ('DM Broken Bridge (East)', 'West Death Mountain (Bottom)'), - ('Fairy Ascension Rocks', 'Fairy Ascension Plateau'), - ('Death Mountain Entrance Rock', 'Death Mountain Entrance'), - ('Zoras Domain', 'Zoras Domain'), - ('Kings Grave Rocks (Outer)', 'Kings Grave Area'), - ('Kings Grave Rocks (Inner)', 'Light World'), - ('Potion Shop Rock (South)', 'Northeast Light World'), - ('Potion Shop Rock (North)', 'Potion Shop Area'), - ('Kakariko Southwest Bush (North)', 'Bomb Hut Area'), - ('Kakariko Southwest Bush (South)', 'Light World'), - ('Kakariko Yard Bush (North)', 'Light World'), - ('Kakariko Yard Bush (South)', 'Bush Covered Lawn'), - ('Hyrule Castle Courtyard Bush (North)', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Secret Entrance Area'), - ('Hyrule Castle Main Gate', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Main Gate (North)', 'Light World'), - ('Wooden Bridge Bush (North)', 'Light World'), - ('Wooden Bridge Bush (South)', 'Potion Shop Area'), - ('Bat Cave Ledge Peg', 'Bat Cave Ledge'), - ('Bat Cave Ledge Peg (East)', 'Light World'), - ('Desert Statue Move', 'Desert Palace Stairs'), - ('Desert Ledge Rocks (Outer)', 'Desert Palace Entrance (North) Spot'), - ('Desert Ledge Rocks (Inner)', 'Desert Ledge'), - - ('Skull Woods Forest', 'Skull Woods Forest'), - ('East Dark Death Mountain Bushes', 'East Dark Death Mountain (Bushes)'), - ('Bumper Cave Entrance Rock', 'Bumper Cave Entrance'), - ('Dark Witch Rock (North)', 'Northeast Dark World'), - ('Dark Witch Rock (South)', 'Catfish Area'), - ('Grassy Lawn Pegs (Top)', 'West Dark World'), - ('Grassy Lawn Pegs (Bottom)', 'Dark Grassy Lawn'), - ('West Dark World Gap', 'West Dark World'), - ('Broken Bridge Pass (Top)', 'East Dark World'), - ('Broken Bridge Pass (Bottom)', 'Northeast Dark World'), - ('Dark Graveyard Bush (South)', 'Dark Graveyard North'), - ('Dark Graveyard Bush (North)', 'West Dark World'), - ('Peg Area Rocks (Left)', 'Hammer Peg Area'), - ('Peg Area Rocks (Right)', 'West Dark World'), - ('Village of Outcasts Heavy Rock', 'West Dark World'), - ('Hammer Bridge Pegs (North)', 'South Dark World'), - ('Hammer Bridge Pegs (South)', 'East Dark World'), - ('Ice Island To East Pier', 'East Dark World'), - - # ledge drops - ('Spectacle Rock Drop', 'West Death Mountain (Top)'), - ('Death Mountain Drop', 'West Death Mountain (Bottom)'), - ('Spiral Cave Ledge Access', 'Spiral Cave Ledge'), - ('Fairy Ascension Ledge Access', 'Fairy Ascension Ledge'), - ('East Death Mountain Drop', 'East Death Mountain (Bottom)'), - ('Spiral Cave Ledge Drop', 'East Death Mountain (Bottom)'), - ('Fairy Ascension Ledge Drop', 'Fairy Ascension Plateau'), - ('Fairy Ascension Drop', 'East Death Mountain (Bottom)'), - ('Death Mountain Entrance Drop', 'Light World'), - ('Death Mountain Return Ledge Drop', 'Light World'), - ('Graveyard Ledge Drop', 'Light World'), - ('Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Ledge Drop', 'Light World'), - ('Maze Race Ledge Drop', 'Light World'), - ('Desert Ledge Drop', 'Light World'), - ('Desert Palace Mouth Drop', 'Light World'), - ('Checkerboard Ledge Drop', 'Light World'), - ('Desert Teleporter Drop', 'Light World'), - ('Cave 45 Ledge Drop', 'Light World'), - - ('Dark Death Mountain Drop (West)', 'West Dark Death Mountain (Bottom)'), - ('Dark Death Mountain Drop (East)', 'East Dark Death Mountain (Bottom)'), - ('Floating Island Drop', 'Dark Death Mountain (Top)'), - ('Turtle Rock Drop', 'Dark Death Mountain (Top)'), - ('Bumper Cave Entrance Drop', 'West Dark World'), - ('Bumper Cave Ledge Drop', 'West Dark World'), - ('Pyramid Drop', 'East Dark World'), - ('Village of Outcasts Drop', 'South Dark World'), - ('Dark Desert Drop', 'Dark Desert') + ('Ganon Drop', 'Bottom of Pyramid') ] -open_mandatory_connections = [('Sanctuary S&Q', 'Sanctuary'), - ('Old Man S&Q', 'Old Man House'), - ('Other World S&Q', 'East Dark World'), - - # flute - ('Flute Spot 1', 'West Death Mountain (Bottom)'), - ('Flute Spot 2', 'Potion Shop Area'), - ('Flute Spot 3', 'Light World'), - ('Flute Spot 4', 'Light World'), - ('Flute Spot 5', 'Light World'), - ('Flute Spot 6', 'Desert Teleporter Ledge'), - ('Flute Spot 7', 'Light World'), - ('Flute Spot 8', 'Light World'), - ('LW Flute', 'Flute Sky'), - ('NWLW Flute', 'Flute Sky'), - ('ZLW Flute', 'Flute Sky'), - ('DM Flute', 'Flute Sky'), - ('EDM Flute', 'Flute Sky'), - - # portals - ('Death Mountain Teleporter', 'West Dark Death Mountain (Bottom)'), - ('East Death Mountain Teleporter', 'East Dark Death Mountain (Bottom)'), - ('Turtle Rock Teleporter', 'Turtle Rock (Top)'), - ('Kakariko Teleporter', 'West Dark World'), - ('Castle Gate Teleporter', 'East Dark World'), - ('East Hyrule Teleporter', 'East Dark World'), - ('South Hyrule Teleporter', 'South Dark World'), - ('Desert Teleporter', 'Dark Desert'), - ('Lake Hylia Teleporter', 'Dark Lake Hylia Central Island') - ] - -inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), - ('Old Man S&Q', 'West Dark Death Mountain (Bottom)'), - ('Other World S&Q', 'Hyrule Castle Ledge'), - - # flute - ('Flute Spot 1', 'West Dark Death Mountain (Bottom)'), - ('Flute Spot 2', 'Northeast Dark World'), - ('Flute Spot 3', 'West Dark World'), - ('Flute Spot 4', 'South Dark World'), - ('Flute Spot 5', 'East Dark World'), - ('Flute Spot 6', 'Dark Desert Ledge'), - ('Flute Spot 7', 'South Dark World'), - ('Flute Spot 8', 'Southeast Dark World'), - ('DDM Flute', 'Flute Sky'), - ('NEDW Flute', 'Flute Sky'), - ('WDW Flute', 'Flute Sky'), - ('SDW Flute', 'Flute Sky'), - ('EDW Flute', 'Flute Sky'), - ('DD Flute', 'Flute Sky'), - ('DLHL Flute', 'Flute Sky'), - ('EDDM Flute', 'Flute Sky'), - ('Dark Grassy Lawn Flute', 'Flute Sky'), - ('Hammer Peg Area Flute', 'Flute Sky'), - - # modified terrain - ('Spectacle Rock Approach', 'Spectacle Rock'), - ('Spectacle Rock Leave', 'West Death Mountain (Top)'), - ('Floating Island Bridge (West)', 'East Death Mountain (Top)'), - ('Floating Island Bridge (East)', 'Death Mountain Floating Island'), - ('Graveyard Ladder (Top)', 'Light World'), - ('Graveyard Ladder (Bottom)', 'Graveyard Ledge'), - ('Mimic Cave Ledge Access', 'Mimic Cave Ledge'), - ('Mimic Cave Ledge Drop', 'East Death Mountain (Bottom)'), - ('Checkerboard Ledge Approach', 'Desert Checkerboard Ledge'), - ('Checkerboard Ledge Leave', 'Light World'), - ('Cave 45 Approach', 'Cave 45 Ledge'), - ('Cave 45 Leave', 'Light World'), - ('Lake Hylia Island Pier', 'Lake Hylia Island'), - ('Bombos Tablet Ladder (Top)', 'Light World'), - ('Bombos Tablet Ladder (Bottom)', 'Bombos Tablet Ledge'), - ('Dark Death Mountain Ladder (Top)', 'West Dark Death Mountain (Bottom)'), - ('Dark Death Mountain Ladder (Bottom)', 'Dark Death Mountain (Top)'), - ('Turtle Rock Tail Drop', 'Turtle Rock (Top)'), - ('Ice Palace Approach', 'Dark Lake Hylia Central Island'), - - # portals - ('Dark Death Mountain Teleporter (West)', 'West Death Mountain (Bottom)'), - ('East Dark Death Mountain Teleporter (Bottom)', 'East Death Mountain (Bottom)'), - ('East Dark Death Mountain Teleporter (Top)', 'East Death Mountain (Top)'), - ('West Dark World Teleporter', 'Light World'), - ('Post Aga Teleporter', 'Light World'), - ('East Dark World Teleporter', 'Light World'), - ('South Dark World Teleporter', 'Light World'), - ('Dark Desert Teleporter', 'Light World'), - ('Dark Lake Hylia Teleporter', 'Lake Hylia Central Island') - ] - # non-shuffled entrance links default_connections = [('Lost Woods Gamble', 'Lost Woods Gamble'), ('Lost Woods Hideout Drop', 'Lost Woods Hideout (top)'), ('Lost Woods Hideout Stump', 'Lost Woods Hideout (bottom)'), - ('Lost Woods Hideout Exit', 'Light World'), + ('Lost Woods Hideout Exit', 'Lost Woods East Area'), ('Lumberjack House', 'Lumberjack House'), ('Lumberjack Tree Tree', 'Lumberjack Tree (top)'), ('Lumberjack Tree Cave', 'Lumberjack Tree (bottom)'), - ('Lumberjack Tree Exit', 'Light World'), + ('Lumberjack Tree Exit', 'Lumberjack Area'), ('Death Mountain Return Cave (East)', 'Death Mountain Return Cave (right)'), ('Death Mountain Return Cave Exit (East)', 'West Death Mountain (Bottom)'), ('Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Peak)'), @@ -2354,22 +2151,22 @@ default_connections = [('Lost Woods Gamble', 'Lost Woods Gamble'), ('Fortune Teller (Light)', 'Fortune Teller (Light)'), ('Bonk Rock Cave', 'Bonk Rock Cave'), ('Sanctuary', 'Sanctuary Portal'), - ('Sanctuary Exit', 'Light World'), + ('Sanctuary Exit', 'Sanctuary Area'), ('Sanctuary Grave', 'Sewer Drop'), ('Graveyard Cave', 'Graveyard Cave'), ('Kings Grave', 'Kings Grave'), ('North Fairy Cave Drop', 'North Fairy Cave'), ('North Fairy Cave', 'North Fairy Cave'), - ('North Fairy Cave Exit', 'Light World'), + ('North Fairy Cave Exit', 'River Bend Area'), ('Potion Shop', 'Potion Shop'), ('Kakariko Well Drop', 'Kakariko Well (top)'), ('Kakariko Well Cave', 'Kakariko Well (bottom)'), - ('Kakariko Well Exit', 'Light World'), + ('Kakariko Well Exit', 'Kakariko Village'), ('Blinds Hideout', 'Blinds Hideout'), ('Elder House (West)', 'Elder House'), ('Elder House (East)', 'Elder House'), - ('Elder House Exit (West)', 'Light World'), - ('Elder House Exit (East)', 'Light World'), + ('Elder House Exit (West)', 'Kakariko Village'), + ('Elder House Exit (East)', 'Kakariko Village'), ('Snitch Lady (West)', 'Snitch Lady (West)'), ('Snitch Lady (East)', 'Snitch Lady (East)'), ('Bush Covered House', 'Bush Covered House'), @@ -2381,16 +2178,16 @@ default_connections = [('Lost Woods Gamble', 'Lost Woods Gamble'), ('Tavern (Front)', 'Tavern (Front)'), ('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 Secret Entrance Area'), + ('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Courtyard Northeast'), ('Sahasrahlas Hut', 'Sahasrahlas Hut'), ('Blacksmiths Hut', 'Blacksmiths Hut'), ('Bat Cave Drop', 'Bat Cave (right)'), ('Bat Cave Cave', 'Bat Cave (left)'), - ('Bat Cave Exit', 'Light World'), + ('Bat Cave Exit', 'Blacksmith Area'), ('Two Brothers House (West)', 'Two Brothers House'), ('Two Brothers House Exit (West)', 'Maze Race Ledge'), ('Two Brothers House (East)', 'Two Brothers House'), - ('Two Brothers House Exit (East)', 'Light World'), + ('Two Brothers House Exit (East)', 'Kakariko Suburb Area'), ('Library', 'Library'), ('Kakariko Gamble Game', 'Kakariko Gamble Game'), ('Bonk Fairy (Light)', 'Bonk Fairy (Light)'), @@ -2416,9 +2213,9 @@ default_connections = [('Lost Woods Gamble', 'Lost Woods Gamble'), ('Hookshot Cave Back Exit', 'Dark Death Mountain Floating Island'), ('Hookshot Cave Back Entrance', 'Hookshot Cave (Back)'), ('Hookshot Cave', 'Hookshot Cave (Front)'), - ('Hookshot Cave Front Exit', 'Dark Death Mountain (Top)'), + ('Hookshot Cave Front Exit', 'East Dark Death Mountain (Top)'), ('Superbunny Cave (Top)', 'Superbunny Cave (Top)'), - ('Superbunny Cave Exit (Top)', 'Dark Death Mountain (Top)'), + ('Superbunny Cave Exit (Top)', 'East Dark Death Mountain (Top)'), ('Superbunny Cave (Bottom)', 'Superbunny Cave (Bottom)'), ('Superbunny Cave Exit (Bottom)', 'East Dark Death Mountain (Bottom)'), ('Dark Death Mountain Shop', 'Dark Death Mountain Shop'), @@ -2438,8 +2235,8 @@ default_connections = [('Lost Woods Gamble', 'Lost Woods Gamble'), ('Dark Lake Hylia Fairy', 'Dark Lake Hylia Healer Fairy'), ('East Dark World Hint', 'East Dark World Hint'), ('Mire Shed', 'Mire Shed'), - ('Dark Desert Fairy', 'Dark Desert Healer Fairy'), - ('Dark Desert Hint', 'Dark Desert Hint'), + ('Mire Fairy', 'Mire Healer Fairy'), + ('Mire Hint', 'Mire Hint'), ('Hype Cave', 'Hype Cave'), ('Dark Lake Hylia Shop', 'Dark Lake Hylia Shop'), ('Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Healer Fairy'), @@ -2448,18 +2245,18 @@ default_connections = [('Lost Woods Gamble', 'Lost Woods Gamble'), ] open_default_connections = [('Links House', 'Links House'), - ('Links House Exit', 'Light World'), + ('Links House Exit', 'Links House Area'), ('Big Bomb Shop', 'Big Bomb Shop'), ('Old Man Cave (West)', 'Old Man Cave Ledge'), ('Old Man Cave (East)', 'Old Man Cave (East)'), - ('Old Man Cave Exit (West)', 'Light World'), + ('Old Man Cave Exit (West)', 'Mountain Pass Entry'), ('Old Man Cave Exit (East)', 'West Death Mountain (Bottom)'), ('Death Mountain Return Cave (West)', 'Death Mountain Return Cave (left)'), - ('Death Mountain Return Cave Exit (West)', 'Death Mountain Return Ledge'), + ('Death Mountain Return Cave Exit (West)', 'Mountain Pass Ledge'), ('Bumper Cave (Bottom)', 'Bumper Cave (bottom)'), ('Bumper Cave (Top)', 'Bumper Cave (top)'), ('Bumper Cave Exit (Top)', 'Bumper Cave Ledge'), - ('Bumper Cave Exit (Bottom)', 'West Dark World'), + ('Bumper Cave Exit (Bottom)', 'Bumper Cave Entry'), ('Dark Death Mountain Fairy', 'Dark Death Mountain Healer Fairy'), ('Pyramid Hole', 'Pyramid'), ('Pyramid Entrance', 'Bottom of Pyramid'), @@ -2467,19 +2264,19 @@ open_default_connections = [('Links House', 'Links House'), ] inverted_default_connections = [('Links House', 'Big Bomb Shop'), - ('Links House Exit', 'South Dark World'), + ('Links House Exit', 'Big Bomb Shop Area'), ('Big Bomb Shop', 'Links House'), - ('Dark Sanctuary Hint Exit', 'West Dark World'), + ('Dark Sanctuary Hint Exit', 'Dark Chapel Area'), ('Old Man Cave (West)', 'Bumper Cave (bottom)'), ('Old Man Cave (East)', 'Death Mountain Return Cave (left)'), - ('Old Man Cave Exit (West)', 'West Dark World'), + ('Old Man Cave Exit (West)', 'Bumper Cave Entry'), ('Old Man Cave Exit (East)', 'West Dark Death Mountain (Bottom)'), ('Death Mountain Return Cave (West)', 'Bumper Cave (top)'), ('Death Mountain Return Cave Exit (West)', 'West Death Mountain (Bottom)'), ('Bumper Cave (Bottom)', 'Old Man Cave Ledge'), ('Bumper Cave (Top)', 'Dark Death Mountain Healer Fairy'), - ('Bumper Cave Exit (Top)', 'Death Mountain Return Ledge'), - ('Bumper Cave Exit (Bottom)', 'Light World'), + ('Bumper Cave Exit (Top)', 'Mountain Pass Ledge'), + ('Bumper Cave Exit (Bottom)', 'Mountain Pass Entry'), ('Dark Death Mountain Fairy', 'Old Man Cave (East)'), ('Inverted Pyramid Hole', 'Pyramid'), ('Inverted Pyramid Entrance', 'Bottom of Pyramid'), @@ -2497,19 +2294,19 @@ default_dungeon_connections = [('Hyrule Castle Entrance (South)', 'Hyrule Castle ('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 (South)', 'Desert Stairs'), ('Desert Palace Exit (West)', 'Desert Ledge'), - ('Desert Palace Exit (East)', 'Desert Palace Mouth'), - ('Desert Palace Exit (North)', 'Desert Palace Entrance (North) Spot'), + ('Desert Palace Exit (East)', 'Desert Mouth'), + ('Desert Palace Exit (North)', 'Desert Ledge Keep'), ('Eastern Palace', 'Eastern Portal'), - ('Eastern Palace Exit', 'Light World'), + ('Eastern Palace Exit', 'Eastern Palace Area'), ('Tower of Hera', 'Hera Portal'), ('Tower of Hera Exit', 'West Death Mountain (Top)'), ('Palace of Darkness', 'Palace of Darkness Portal'), - ('Palace of Darkness Exit', 'East Dark World'), + ('Palace of Darkness Exit', 'Palace of Darkness Area'), ('Swamp Palace', 'Swamp Portal'), # requires additional patch for flooding moat if moved - ('Swamp Palace Exit', 'South Dark World'), + ('Swamp Palace Exit', 'Swamp 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'), @@ -2523,13 +2320,13 @@ default_dungeon_connections = [('Hyrule Castle Entrance (South)', 'Hyrule Castle ('Skull Woods Final Section', 'Skull 3 Portal'), ('Skull Woods Final Section Exit', 'Skull Woods Forest (West)'), ('Thieves Town', 'Thieves Town Portal'), - ('Thieves Town Exit', 'West Dark World'), + ('Thieves Town Exit', 'Village of Outcasts'), ('Ice Palace', 'Ice Portal'), - ('Ice Palace Exit', 'Dark Lake Hylia Central Island'), + ('Ice Palace Exit', 'Ice Palace Area'), ('Misery Mire', 'Mire Portal'), - ('Misery Mire Exit', 'Dark Desert'), + ('Misery Mire Exit', 'Mire Area'), ('Turtle Rock', 'Turtle Rock Main Portal'), - ('Turtle Rock Exit (Front)', 'Dark Death Mountain (Top)'), + ('Turtle Rock Exit (Front)', 'Turtle Rock Area'), ('Dark Death Mountain Ledge (West)', 'Turtle Rock Lazy Eyes Portal'), ('Dark Death Mountain Ledge (East)', 'Turtle Rock Chest Portal'), ('Turtle Rock Ledge Exit (West)', 'Dark Death Mountain Ledge'), @@ -2541,23 +2338,23 @@ default_dungeon_connections = [('Hyrule Castle Entrance (South)', 'Hyrule Castle open_default_dungeon_connections = [('Agahnims Tower', 'Agahnims Tower Portal'), ('Agahnims Tower Exit', 'Hyrule Castle Ledge'), ('Ganons Tower', 'Ganons Tower Portal'), - ('Ganons Tower Exit', 'Dark Death Mountain (Top)') + ('Ganons Tower Exit', 'West Dark Death Mountain (Top)') ] inverted_default_dungeon_connections = [('Agahnims Tower', 'Ganons Tower Portal'), - ('Agahnims Tower Exit', 'Dark Death Mountain (Top)'), + ('Agahnims Tower Exit', 'West Dark Death Mountain (Top)'), ('Ganons Tower', 'Agahnims Tower Portal'), ('Ganons Tower Exit', 'Hyrule Castle Ledge') ] indirect_connections = { - 'Turtle Rock (Top)': 'Turtle Rock', - 'East Dark World': 'Pyramid Fairy', + 'Turtle Rock Ledge': 'Turtle Rock', + 'Pyramid Area': 'Pyramid Fairy', 'Big Bomb Shop': 'Pyramid Fairy', - 'Dark Desert': 'Pyramid Fairy', - 'West Dark World': 'Pyramid Fairy', - 'South Dark World': 'Pyramid Fairy', - 'Light World': 'Pyramid Fairy', + 'Mire Area': 'Pyramid Fairy', + #'West Dark World': 'Pyramid Fairy', + 'Big Bomb Shop Area': 'Pyramid Fairy', + #'Light World': 'Pyramid Fairy', 'Old Man Cave (East)': 'Old Man S&Q' } # format: @@ -2698,8 +2495,8 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c, 0x0506, 0x0a9a, 0x0832, 0 'Dark Potion Shop': (0x6E, (0x010f, 0x56, 0x080e, 0x04f4, 0x0c66, 0x0548, 0x0cd8, 0x0563, 0x0ce3, 0x0a, 0xf6, 0x0000, 0x0000)), 'Archery Game': (0x58, (0x0111, 0x69, 0x069e, 0x0ac4, 0x02ea, 0x0b18, 0x0368, 0x0b33, 0x036f, 0x0a, 0xf6, 0x09AC, 0x0000)), 'Mire Shed': (0x5E, (0x010d, 0x70, 0x0384, 0x0c69, 0x001e, 0x0cb6, 0x0098, 0x0cd6, 0x00a3, 0x07, 0xf9, 0x0000, 0x0000)), - 'Dark Desert Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000)), - 'Dark Desert Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000)), + 'Mire Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000)), + 'Mire Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000)), 'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000)), 'Dark Death Mountain Shop': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000)), 'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000)), @@ -2785,7 +2582,7 @@ exit_ids = {'Links House Exit': (0x01, 0x00), 'Desert Healer Fairy': 0x5E, 'Dark Lake Hylia Healer Fairy': 0x5E, 'Dark Lake Hylia Ledge Healer Fairy': 0x5E, - 'Dark Desert Healer Fairy': 0x5E, + 'Mire Healer Fairy': 0x5E, 'Dark Death Mountain Healer Fairy': 0x5E, 'Fortune Teller (Light)': 0x65, 'Lake Hylia Fortune Teller': 0x65, @@ -2840,7 +2637,7 @@ exit_ids = {'Links House Exit': (0x01, 0x00), 'Fortune Teller (Dark)': 0x66, 'Archery Game': 0x59, 'Mire Shed': 0x5F, - 'Dark Desert Hint': 0x62, + 'Mire Hint': 0x62, 'Spike Cave': 0x41, 'Mimic Cave': 0x4F, 'Kakariko Well (top)': 0x80, @@ -2976,8 +2773,8 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Dark Potion Shop': (0xc80, 0x4c0), 'Archery Game': (0x2f0, 0xaf0), 'Mire Shed': (0x060, 0xc90), - 'Dark Desert Hint': (0x2e0, 0xd00), - 'Dark Desert Fairy': (0x1c0, 0xc90), + 'Mire Hint': (0x2e0, 0xd00), + 'Mire Fairy': (0x1c0, 0xc90), 'Spike Cave': (0x860, 0x180), 'Dark Death Mountain Shop': (0xd80, 0x180), 'Dark Death Mountain Fairy': (0x620, 0x2c0), diff --git a/Fill.py b/Fill.py index 49b9f113..6ac6b3bb 100644 --- a/Fill.py +++ b/Fill.py @@ -932,7 +932,7 @@ def balance_money_progression(world): checked_locations = [] for player in range(1, world.players+1): kiki_payable = state.prog_items[('Moon Pearl', player)] > 0 or world.mode[player] == 'inverted' - if kiki_payable and world.get_region('East Dark World', player) in state.reachable_regions[player]: + if kiki_payable and world.get_region('Palace of Darkness Area', player) in state.reachable_regions[player]: if not kiki_paid[player]: kiki_check[player] = True sphere_costs[player] += 110 diff --git a/ItemList.py b/ItemList.py index f8cf2941..7b8172d5 100644 --- a/ItemList.py +++ b/ItemList.py @@ -199,7 +199,7 @@ def generate_itempool(world, player): world.push_item(world.get_location('Ganon', player), ItemFactory('Triforce', player), False) if world.goal[player] in ['triforcehunt', 'trinity']: - region = world.get_region('Light World', player) + region = world.get_region('Hyrule Castle Courtyard', player) loc = Location(player, "Murahdahla", parent=region) region.locations.append(loc) world.dynamic_locations.append(loc) @@ -476,11 +476,11 @@ take_any_locations = [ 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Light World Bomb Hut', 'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Lumberjack House', 'Bonk Fairy (Light)', 'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy', 'Light Hype Fairy', 'Desert Healer Fairy', - 'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Dark Desert Healer Fairy', + 'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Mire Healer Fairy', 'Dark Death Mountain Healer Fairy', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', 'Kakariko Gamble Game', '50 Rupee Cave', 'Lost Woods Gamble', 'Hookshot Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Archery Game', 'Dark Lake Hylia Ledge Hint', - 'Dark Lake Hylia Ledge Spike Cave', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Dark Desert Hint'] + 'Dark Lake Hylia Ledge Spike Cave', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Mire Hint'] fixed_take_anys = [ 'Desert Healer Fairy', 'Light Hype Fairy', 'Dark Death Mountain Healer Fairy', diff --git a/Main.py b/Main.py index 85fd02ce..b12cdf42 100644 --- a/Main.py +++ b/Main.py @@ -15,7 +15,7 @@ from KeyDoorShuffle import validate_key_placement from OverworldGlitchRules import create_owg_connections from PotShuffle import shuffle_pots, shuffle_pot_switches from Regions import create_regions, create_shops, mark_light_dark_world_regions, create_dungeon_regions, adjust_locations -from OverworldShuffle import create_dynamic_exits +from OverworldShuffle import link_overworld, create_dynamic_exits from EntranceShuffle import link_entrances from Rom import patch_rom, patch_race_rom, apply_rom_settings, LocalRom, JsonRom, get_hash_string from Doors import create_doors @@ -246,6 +246,7 @@ def main(args, seed=None, fish=None): logger.info(world.fish.translate("cli","cli","shuffling.world")) for player in range(1, world.players + 1): + link_overworld(world, player) create_dynamic_exits(world, player) if world.experimental[player] or world.shuffle[player] in ['lite', 'lean', 'swapped'] or world.shuffletavern[player] or (world.customizer and world.customizer.get_entrances()): link_entrances_new(world, player) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 3793f272..303aeed2 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -1,4 +1,41 @@ -from BaseClasses import RegionType, Entrance +from BaseClasses import RegionType, Terrain, Entrance +from Utils import bidict +import logging + +def link_overworld(world, player): + # setup mandatory connections + for exitname, regionname in mandatory_connections: + connect_simple(world, exitname, regionname, player) + + # apply tile logical connections + if not world.mode[player] == 'inverted': + for exitname, regionname in open_mandatory_connections: + connect_simple(world, exitname, regionname, player) + else: + for exitname, regionname in inverted_mandatory_connections: + connect_simple(world, exitname, regionname, player) + + for forward_edge, back_edge in default_connections: + connect_two_way(world, forward_edge, back_edge, player) + + +def connect_simple(world, exitname, regionname, player): + world.get_entrance(exitname, player).connect(world.get_region(regionname, player)) + +def connect_two_way(world, edgename1, edgename2, player): + edge1 = world.get_entrance(edgename1, player) + edge2 = world.get_entrance(edgename2, player) + edge1.connect(edge2.parent_region) + edge2.connect(edge1.parent_region) + +def create_flute_exits(world, player): + for region in (r for r in world.regions if r.player == player and r.terrain == Terrain.Land and r.name not in ['Zoras Domain', 'Master Sword Meadow', 'Hobo Bridge']): + if region.type == (RegionType.LightWorld if world.mode[player] != 'inverted' else RegionType.DarkWorld): + exitname = 'Flute From ' + region.name + exit = Entrance(region.player, exitname, region) + exit.spot_type = 'Flute' + exit.connect(world.get_region('Flute Sky', player)) + region.exits.append(exit) def get_mirror_exit_name(from_region, to_region): if from_region in mirror_connections and to_region in mirror_connections[from_region]: @@ -21,8 +58,7 @@ def create_mirror_exits(world, player): exit = Entrance(region.player, exitname, region) exit.spot_type = 'Mirror' to_region = world.get_region(region_dest_name, player) - # if region.terrain == Terrain.Water or to_region.terrain == Terrain.Water: - if region.name == 'Dark Lake Hylia Water': # TODO: Uncomment line above when Terrain type is modeled + if region.terrain == Terrain.Water or to_region.terrain == Terrain.Water: exit.access_rule = lambda state: state.has('Flippers', player) and state.has_Pearl(player) and state.has_Mirror(player) else: exit.access_rule = lambda state: state.has_Mirror(player) @@ -32,80 +68,997 @@ def create_mirror_exits(world, player): mirror_exits.add(exitname) def create_dynamic_exits(world, player): + create_flute_exits(world, player) create_mirror_exits(world, player) world.initialize_regions() -mirror_connections = { - 'Skull Woods Forest (West)': ['Light World'], +# 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'), - 'West Dark Death Mountain (Bottom)': ['Spectacle Rock'], - 'Dark Death Mountain (Top)': ['East Death Mountain (Top)'], + # Intra-tile OW Connections + ('Lost Woods Bush (West)', 'Lost Woods East Area'), #pearl + ('Lost Woods Bush (East)', 'Lost Woods West Area'), #pearl + ('West Death Mountain Drop', 'West Death Mountain (Bottom)'), + ('Spectacle Rock Ledge Drop', 'West Death Mountain (Top)'), + ('DM Hammer Bridge (West)', 'East Death Mountain (Top East)'), #hammer + ('DM Hammer Bridge (East)', 'East Death Mountain (Top West)'), #hammer + ('EDM To Spiral Ledge Drop', 'Spiral Cave Ledge'), + ('EDM To Fairy Ledge Drop', 'Fairy Ascension Ledge'), + ('EDM Ledge Drop', 'East Death Mountain (Bottom)'), + ('Spiral Ledge Drop', 'East Death Mountain (Bottom)'), + ('Fairy Ascension Ledge Drop', 'Fairy Ascension Plateau'), + ('Fairy Ascension Plateau Ledge Drop', 'East Death Mountain (Bottom)'), + ('Fairy Ascension Rocks (Inner)', 'East Death Mountain (Bottom)'), #mitts + ('Fairy Ascension Rocks (Outer)', 'Fairy Ascension Plateau'), #mitts + ('DM Broken Bridge (West)', 'East Death Mountain (Bottom)'), #hookshot + ('DM Broken Bridge (East)', 'East Death Mountain (Bottom Left)'), #hookshot + ('TR Pegs Ledge Entry', 'Death Mountain TR Pegs Ledge'), #mitts + ('TR Pegs Ledge Leave', 'Death Mountain TR Pegs Area'), #mitts + ('TR Pegs Ledge Drop', 'Death Mountain TR Pegs Area'), + ('Mountain Pass Rock (Outer)', 'Mountain Pass Entry'), #glove + ('Mountain Pass Rock (Inner)', 'Mountain Pass Area'), #glove + ('Mountain Pass Entry Ledge Drop', 'Mountain Pass Area'), + ('Mountain Pass Ledge Drop', 'Mountain Pass Area'), + ('Zora Waterfall Landing', 'Zora Waterfall Area'), + ('Zora Waterfall Water Drop', 'Zora Waterfall Water'), #flippers + ('Zora Waterfall Water Entry', 'Zora Waterfall Water'), #flippers + ('Zora Waterfall Approach', 'Zora Waterfall Entryway'), #flippers + ('Lost Woods Pass Hammer (North)', 'Lost Woods Pass Portal Area'), #hammer + ('Lost Woods Pass Hammer (South)', 'Lost Woods Pass East Top Area'), #hammer + ('Lost Woods Pass Rock (North)', 'Lost Woods Pass East Bottom Area'), #mitts + ('Lost Woods Pass Rock (South)', 'Lost Woods Pass Portal Area'), #mitts + ('Bonk Rock Ledge Drop', 'Sanctuary Area'), + ('Graveyard Ledge Drop', 'Graveyard Area'), + ('Kings Grave Rocks (Outer)', 'Kings Grave Area'), #mitts + ('Kings Grave Rocks (Inner)', 'Graveyard Area'), #mitts + ('River Bend Water Drop', 'River Bend Water'), #flippers + ('River Bend East Water Drop', 'River Bend Water'), #flippers + ('River Bend West Pier', 'River Bend Area'), + ('River Bend East Pier', 'River Bend East Bank'), + ('Potion Shop Water Drop', 'Potion Shop Water'), #flippers + ('Potion Shop Northeast Water Drop', 'Potion Shop Water'), #flippers + ('Potion Shop Rock (South)', 'Potion Shop Northeast'), #glove + ('Potion Shop Rock (North)', 'Potion Shop Area'), #glove + ('Zora Approach Water Drop', 'Zora Approach Water'), #flippers + ('Zora Approach Rocks (West)', 'Zora Approach Ledge'), #mitts/boots + ('Zora Approach Rocks (East)', 'Zora Approach Area'), #mitts/boots + ('Zora Approach Bottom Ledge Drop', 'Zora Approach Ledge'), + ('Zora Approach Ledge Drop', 'Zora Approach Area'), + ('Kakariko Southwest Bush (North)', 'Kakariko Southwest'), #pearl + ('Kakariko Southwest Bush (South)', 'Kakariko Village'), #pearl + ('Kakariko Yard Bush (South)', 'Kakariko Bush Yard'), #pearl + ('Kakariko Yard Bush (North)', 'Kakariko Village'), #pearl + ('Hyrule Castle Southwest Bush (North)', 'Hyrule Castle Southwest'), #pearl + ('Hyrule Castle Southwest Bush (South)', 'Hyrule Castle Area'), #pearl + ('Hyrule Castle Courtyard Bush (North)', 'Hyrule Castle Courtyard'), #pearl + ('Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Courtyard Northeast'), #pearl + ('Hyrule Castle Main Gate (South)', 'Hyrule Castle Courtyard'), #aga+mirror + ('Hyrule Castle Main Gate (North)', 'Hyrule Castle Area'), #aga+mirror + ('Hyrule Castle Ledge Drop', 'Hyrule Castle Area'), + ('Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Courtyard'), + ('Hyrule Castle East Rock (Inner)', 'Hyrule Castle East Entry'), #glove + ('Hyrule Castle East Rock (Outer)', 'Hyrule Castle Area'), #glove + ('Wooden Bridge Bush (South)', 'Wooden Bridge Northeast'), #pearl + ('Wooden Bridge Bush (North)', 'Wooden Bridge Area'), #pearl + ('Wooden Bridge Water Drop', 'Wooden Bridge Water'), #flippers + ('Wooden Bridge Northeast Water Drop', 'Wooden Bridge Water'), #flippers + ('Blacksmith Ledge Peg (West)', 'Blacksmith Ledge'), #hammer + ('Blacksmith Ledge Peg (East)', 'Blacksmith Area'), #hammer + ('Maze Race Game', 'Maze Race Prize'), #pearl + ('Maze Race Ledge Drop', 'Maze Race Area'), + ('Stone Bridge (Southbound)', 'Stone Bridge South Area'), + ('Stone Bridge (Northbound)', 'Stone Bridge North Area'), + ('Desert Statue Move', 'Desert Stairs'), #book + ('Desert Ledge Drop', 'Desert Area'), + ('Desert Ledge Rocks (Outer)', 'Desert Ledge Keep'), #glove + ('Desert Ledge Rocks (Inner)', 'Desert Ledge'), #glove + ('Checkerboard Ledge Drop', 'Desert Area'), + ('Desert Mouth Drop', 'Desert Area'), + ('Desert Teleporter Drop', 'Desert Area'), + ('Bombos Tablet Drop', 'Desert Area'), + ('Flute Boy Bush (North)', 'Flute Boy Approach Area'), #pearl + ('Flute Boy Bush (South)', 'Flute Boy Bush Entry'), #pearl + ('Cave 45 Ledge Drop', 'Flute Boy Approach Area'), + ('C Whirlpool Water Entry', 'C Whirlpool Water'), #flippers + ('C Whirlpool Landing', 'C Whirlpool Area'), + ('C Whirlpool Rock (Bottom)', 'C Whirlpool Outer Area'), #glove + ('C Whirlpool Rock (Top)', 'C Whirlpool Area'), #glove + ('C Whirlpool Pegs (Outer)', 'C Whirlpool Portal Area'), #hammer + ('C Whirlpool Pegs (Inner)', 'C Whirlpool Area'), #hammer + ('Statues Water Entry', 'Statues Water'), #flippers + ('Statues Landing', 'Statues Area'), + ('Lake Hylia Water Drop', 'Lake Hylia Water'), #flippers + ('Lake Hylia South Water Drop', 'Lake Hylia Water'), #flippers + ('Lake Hylia Northeast Water Drop', 'Lake Hylia Water'), #flippers + ('Lake Hylia Central Water Drop', 'Lake Hylia Water'), #flippers + ('Lake Hylia Island Water Drop', 'Lake Hylia Water'), #flippers + ('Lake Hylia Central Island Pier', 'Lake Hylia Central Island'), + ('Lake Hylia West Pier', 'Lake Hylia Northwest Bank'), + ('Lake Hylia East Pier', 'Lake Hylia Northeast Bank'), + ('Lake Hylia Water D Approach', 'Lake Hylia Water D'), + ('Lake Hylia Water D Leave', 'Lake Hylia Water'), #flippers + ('Ice Cave Water Drop', 'Ice Cave Water'), #flippers + ('Ice Cave Pier', 'Ice Cave Area'), + ('Desert Pass Ledge Drop', 'Desert Pass Area'), + ('Desert Pass Rocks (North)', 'Desert Pass Southeast'), #glove + ('Desert Pass Rocks (South)', 'Desert Pass Area'), #glove + ('Octoballoon Water Drop', 'Octoballoon Water'), #flippers + ('Octoballoon Waterfall Water Drop', 'Octoballoon Water'), #flippers + ('Octoballoon Pier', 'Octoballoon Area'), + + ('Skull Woods Rock (West)', 'Skull Woods Forest'), #glove + ('Skull Woods Rock (East)', 'Skull Woods Portal Entry'), #glove + ('Skull Woods Forgotten Bush (West)', 'Skull Woods Forgotten Path (Northeast)'), #pearl + ('Skull Woods Forgotten Bush (East)', 'Skull Woods Forgotten Path (Southwest)'), #pearl + ('West Dark Death Mountain Drop', 'West Dark Death Mountain (Bottom)'), + ('GT Approach', 'GT Stairs'), + ('GT Leave', 'West Dark Death Mountain (Top)'), + ('Floating Island Drop', 'East Dark Death Mountain (Top)'), + ('East Dark Death Mountain Drop', 'East Dark Death Mountain (Bottom)'), + ('East Dark Death Mountain Bushes', 'East Dark Death Mountain (Bushes)'), + ('Turtle Rock Ledge Drop', 'Turtle Rock Area'), + ('Bumper Cave Rock (Outer)', 'Bumper Cave Entry'), #glove + ('Bumper Cave Rock (Inner)', 'Bumper Cave Area'), #glove + ('Bumper Cave Ledge Drop', 'Bumper Cave Area'), + ('Bumper Cave Entry Drop', 'Bumper Cave Area'), + ('Skull Woods Pass Bush Row (West)', 'Skull Woods Pass East Top Area'), #pearl + ('Skull Woods Pass Bush Row (East)', 'Skull Woods Pass West Area'), #pearl + ('Skull Woods Pass Bush (North)', 'Skull Woods Pass Portal Area'), #pearl + ('Skull Woods Pass Bush (South)', 'Skull Woods Pass East Top Area'), #pearl + ('Skull Woods Pass Rock (North)', 'Skull Woods Pass East Bottom Area'), #mitts + ('Skull Woods Pass Rock (South)', 'Skull Woods Pass Portal Area'), #mitts + ('Dark Graveyard Bush (South)', 'Dark Graveyard North'), #pearl + ('Dark Graveyard Bush (North)', 'Dark Graveyard Area'), #pearl + ('Qirn Jump Water Drop', 'Qirn Jump Water'), #flippers + ('Qirn Jump East Water Drop', 'Qirn Jump Water'), #flippers + ('Qirn Jump Pier', 'Qirn Jump East Bank'), + ('Dark Witch Water Drop', 'Dark Witch Water'), #flippers + ('Dark Witch Northeast Water Drop', 'Dark Witch Water'), #flippers + ('Dark Witch Rock (North)', 'Dark Witch Area'), #glove + ('Dark Witch Rock (South)', 'Dark Witch Northeast'), #glove + ('Catfish Approach Water Drop', 'Catfish Approach Water'), #flippers + ('Catfish Approach Rocks (West)', 'Catfish Approach Ledge'), #mitts/boots + ('Catfish Approach Rocks (East)', 'Catfish Approach Area'), #mitts/boots + ('Catfish Approach Bottom Ledge Drop', 'Catfish Approach Ledge'), + ('Catfish Approach Ledge Drop', 'Catfish Approach Area'), + ('Bush Yard Pegs (Outer)', 'Village of Outcasts Bush Yard'), #hammer + ('Bush Yard Pegs (Inner)', 'Village of Outcasts'), #hammer + ('Shield Shop Fence Drop (Outer)', 'Shield Shop Fence'), + ('Shield Shop Fence Drop (Inner)', 'Shield Shop Area'), + ('Pyramid Exit Ledge Drop', 'Pyramid Area'), + ('Broken Bridge Hammer Rock (South)', 'Broken Bridge Northeast'), #hammer/glove + ('Broken Bridge Hammer Rock (North)', 'Broken Bridge Area'), #hammer/glove + ('Broken Bridge Hookshot Gap', 'Broken Bridge West'), #hookshot + ('Broken Bridge Water Drop', 'Broken Bridge Water'), #flippers + ('Broken Bridge Northeast Water Drop', 'Broken Bridge Water'), #flippers + ('Broken Bridge West Water Drop', 'Broken Bridge Water'), #flippers + ('Peg Area Rocks (West)', 'Hammer Pegs Area'), #mitts + ('Peg Area Rocks (East)', 'Hammer Pegs Entry'), #mitts + ('Dig Game To Ledge Drop', 'Dig Game Ledge'), #mitts + ('Dig Game Ledge Drop', 'Dig Game Area'), + ('Frog Ledge Drop', 'Archery Game Area'), + ('Frog Rock (Inner)', 'Frog Area'), #mitts + ('Frog Rock (Outer)', 'Frog Prison'), #mitts + ('Archery Game Rock (North)', 'Archery Game Area'), #mitts + ('Archery Game Rock (South)', 'Frog Area'), #mitts + ('Hammer Bridge Pegs (North)', 'Hammer Bridge South Area'), #hammer + ('Hammer Bridge Pegs (South)', 'Hammer Bridge North Area'), #hammer + ('Hammer Bridge Water Drop', 'Hammer Bridge Water'), #flippers + ('Hammer Bridge Pier', 'Hammer Bridge North Area'), + ('Mire Teleporter Ledge Drop', 'Mire Area'), + ('Stumpy Approach Bush (North)', 'Stumpy Approach Area'), #pearl + ('Stumpy Approach Bush (South)', 'Stumpy Approach Bush Entry'), #pearl + ('Dark C Whirlpool Water Entry', 'Dark C Whirlpool Water'), #flippers + ('Dark C Whirlpool Landing', 'Dark C Whirlpool Area'), + ('Dark C Whirlpool Rock (Bottom)', 'Dark C Whirlpool Outer Area'), #glove + ('Dark C Whirlpool Rock (Top)', 'Dark C Whirlpool Area'), #glove + ('Dark C Whirlpool Pegs (Outer)', 'Dark C Whirlpool Portal Area'), #hammer + ('Dark C Whirlpool Pegs (Inner)', 'Dark C Whirlpool Area'), #hammer + ('Hype Cave Water Entry', 'Hype Cave Water'), #flippers + ('Hype Cave Landing', 'Hype Cave Area'), + ('Ice Lake Water Drop', 'Ice Lake Water'), #flippers + ('Ice Lake Northeast Water Drop', 'Ice Lake Water'), #flippers + ('Ice Lake Southwest Water Drop', 'Ice Lake Water'), #flippers + ('Ice Lake Southeast Water Drop', 'Ice Lake Water'), #flippers + ('Ice Lake Iceberg Water Entry', 'Ice Lake Water'), #flippers + ('Ice Lake Northeast Pier', 'Ice Lake Northeast Bank'), + ('Shopping Mall Water Drop', 'Shopping Mall Water'), #flippers + ('Shopping Mall Pier', 'Shopping Mall Area'), + ('Bomber Corner Water Drop', 'Bomber Corner Water'), #flippers + ('Bomber Corner Waterfall Water Drop', 'Bomber Corner Water'), #flippers + ('Bomber Corner Pier', 'Bomber Corner Area'), + + # OWG In-Bounds Connections + ('Ice Lake Northeast Pier Hop', 'Ice Lake Northeast Bank'), + ('Ice Lake Iceberg Bomb Jump', 'Ice Lake Iceberg'), + + # OWG Connections + ('Lake Hylia Island FAWT Ledge Drop', 'Lake Hylia Island'), + ('Stone Bridge EC Cliff Water Drop', 'Stone Bridge Water'), #fake flipper + ('C Whirlpool Portal Cliff Ledge Drop', 'C Whirlpool Portal Area'), + ('Checkerboard Cliff Ledge Drop', 'Desert Checkerboard Ledge'), + ('Cave 45 Cliff Ledge Drop', 'Cave 45 Ledge'), + + ('Ice Lake Iceberg FAWT Ledge Drop', 'Ice Lake Iceberg'), + ('Hammer Bridge EC Cliff Water Drop', 'Hammer Bridge Water'), #fake flipper + ('Dark C Whirlpool Portal Cliff Ledge Drop', 'Dark C Whirlpool Portal Area'), + ('Mire Cliff Ledge Drop', 'Mire Area'), + ('Stumpy Approach Cliff Ledge Drop', 'Stumpy Approach Area') +] + +open_mandatory_connections = [ + ('Sanctuary S&Q', 'Sanctuary'), + ('Old Man S&Q', 'Old Man House'), + ('Other World S&Q', 'Pyramid Area'), + + # flute + ('Flute Spot 1', 'West Death Mountain (Bottom)'), + ('Flute Spot 2', 'Potion Shop Area'), + ('Flute Spot 3', 'Kakariko Village'), + ('Flute Spot 4', 'Links House Area'), + ('Flute Spot 5', 'Eastern Nook Area'), + ('Flute Spot 6', 'Desert Teleporter Ledge'), + ('Flute Spot 7', 'Dam Area'), + ('Flute Spot 8', 'Octoballoon Area'), + + # portals + ('West Death Mountain Teleporter', 'West Dark Death Mountain (Bottom)'), + ('East Death Mountain Teleporter', 'East Dark Death Mountain (Bottom)'), + ('TR Pegs Teleporter', 'Turtle Rock Ledge'), + ('Kakariko Teleporter', 'Skull Woods Pass Portal Area'), + ('Castle Gate Teleporter', 'Pyramid Area'), + ('Castle Gate Teleporter (Inner)', 'Pyramid Area'), + ('East Hyrule Teleporter', 'Darkness Nook Area'), + ('South Hyrule Teleporter', 'Dark C Whirlpool Portal Area'), + ('Desert Teleporter', 'Mire Teleporter Ledge'), + ('Lake Hylia Teleporter', 'Ice Palace Area'), + + # OWG connections + ('Mirror To Bombos Tablet Ledge', 'Bombos Tablet Ledge') +] + +inverted_mandatory_connections = [ + ('Sanctuary S&Q', 'Dark Sanctuary Hint'), + ('Old Man S&Q', 'West Dark Death Mountain (Bottom)'), + ('Other World S&Q', 'Hyrule Castle Ledge'), + + # flute + ('Flute Spot 1', 'West Dark Death Mountain (Bottom)'), + ('Flute Spot 2', 'Dark Witch Area'), + ('Flute Spot 3', 'Village of Outcasts'), + ('Flute Spot 4', 'Big Bomb Shop Area'), + ('Flute Spot 5', 'Darkness Nook Area'), + ('Flute Spot 6', 'Mire Teleporter Ledge'), + ('Flute Spot 7', 'Swamp Area'), + ('Flute Spot 8', 'Bomber Corner Area'), + + # modified terrain + ('Spectacle Rock Approach', 'Spectacle Rock Ledge'), + ('Spectacle Rock Leave', 'West Death Mountain (Top)'), + ('Floating Island Bridge (West)', 'East Death Mountain (Top East)'), + ('Floating Island Bridge (East)', 'Death Mountain Floating Island'), + ('Graveyard Ladder (Top)', 'Graveyard Area'), + ('Graveyard Ladder (Bottom)', 'Graveyard Ledge'), + ('EDM To Mimic Ledge Drop', 'Mimic Cave Ledge'), + ('Mimic Ledge Drop', 'East Death Mountain (Bottom)'), + ('Checkerboard Ledge Approach', 'Desert Checkerboard Ledge'), + ('Checkerboard Ledge Leave', 'Desert Area'), + ('Cave 45 Approach', 'Cave 45 Ledge'), + ('Cave 45 Leave', 'Flute Boy Approach Area'), + ('Lake Hylia Island Pier', 'Lake Hylia Island'), + ('Desert Pass Ladder (North)', 'Desert Pass Area'), + ('Desert Pass Ladder (South)', 'Desert Pass Ledge'), + ('Dark Death Mountain Ladder (Top)', 'West Dark Death Mountain (Bottom)'), + ('Dark Death Mountain Ladder (Bottom)', 'West Dark Death Mountain (Top)'), + ('Turtle Rock Tail Ledge Drop', 'Turtle Rock Ledge'), + ('Ice Palace Approach', 'Ice Palace Area'), + ('Ice Palace Leave', 'Ice Lake Iceberg'), + + # portals + ('Dark Death Mountain Teleporter (West)', 'West Death Mountain (Bottom)'), + ('East Dark Death Mountain Teleporter', 'East Death Mountain (Bottom)'), + ('Turtle Rock Teleporter', 'Death Mountain TR Pegs Ledge'), + ('West Dark World Teleporter', 'Lost Woods Pass Portal Area'), + ('Post Aga Teleporter', 'Hyrule Castle Area'), + ('East Dark World Teleporter', 'Eastern Nook Area'), + ('South Dark World Teleporter', 'C Whirlpool Portal Area'), + ('Mire Teleporter', 'Desert Teleporter Ledge'), + ('Ice Lake Teleporter', 'Lake Hylia Central Island') +] + +# non shuffled overworld +default_connections = [ + ('Lost Woods NW', 'Master Sword Meadow SC'), + ('Lost Woods SW', 'Lost Woods Pass NW'), + ('Lost Woods SC', 'Lost Woods Pass NE'), + ('Lost Woods SE', 'Kakariko Fortune NE'), + ('Lost Woods EN', 'Lumberjack WN'), + ('Lumberjack SW', 'Mountain Pass NW'), + ('Mountain Pass SE', 'Kakariko Pond NE'), + ('Zora Waterfall NE', 'Zoras Domain SW'), + ('Lost Woods Pass SW', 'Kakariko NW'), + ('Lost Woods Pass SE', 'Kakariko NC'), + ('Kakariko Fortune SC', 'Kakariko NE'), + ('Kakariko Fortune EN', 'Kakariko Pond WN'), + ('Kakariko Fortune ES', 'Kakariko Pond WS'), + ('Kakariko Pond SW', 'Forgotten Forest NW'), + ('Kakariko Pond SE', 'Forgotten Forest NE'), + ('Kakariko Pond EN', 'Sanctuary WN'), + ('Kakariko Pond ES', 'Sanctuary WS'), + ('Forgotten Forest ES', 'Hyrule Castle WN'), + ('Sanctuary EC', 'Graveyard WC'), + ('Graveyard EC', 'River Bend WC'), + ('River Bend SW', 'Wooden Bridge NW'), + ('River Bend SC', 'Wooden Bridge NC'), + ('River Bend SE', 'Wooden Bridge NE'), + ('River Bend EN', 'Potion Shop WN'), + ('River Bend EC', 'Potion Shop WC'), + ('River Bend ES', 'Potion Shop WS'), + ('Potion Shop EN', 'Zora Approach WN'), + ('Potion Shop EC', 'Zora Approach WC'), + ('Zora Approach NE', 'Zora Waterfall SE'), + ('Kakariko SE', 'Kakariko Suburb NE'), + ('Kakariko ES', 'Blacksmith WS'), + ('Hyrule Castle SW', 'Central Bonk Rocks NW'), + ('Hyrule Castle SE', 'Links House NE'), + ('Hyrule Castle ES', 'Sand Dunes WN'), + ('Wooden Bridge SW', 'Sand Dunes NW'), + ('Sand Dunes SC', 'Stone Bridge NC'), + ('Eastern Palace SW', 'Tree Line NW'), + ('Eastern Palace SE', 'Eastern Nook NE'), + ('Maze Race ES', 'Kakariko Suburb WS'), + ('Kakariko Suburb ES', 'Flute Boy WS'), + ('Flute Boy SW', 'Flute Boy Pass NW'), + ('Flute Boy SC', 'Flute Boy Pass NC'), + ('Flute Boy Pass EC', 'C Whirlpool WC'), + ('C Whirlpool NW', 'Central Bonk Rocks SW'), + ('C Whirlpool SC', 'Dam NC'), + ('C Whirlpool EN', 'Statues WN'), + ('C Whirlpool EC', 'Statues WC'), + ('C Whirlpool ES', 'Statues WS'), + ('Central Bonk Rocks EN', 'Links House WN'), + ('Central Bonk Rocks EC', 'Links House WC'), + ('Central Bonk Rocks ES', 'Links House WS'), + ('Links House SC', 'Statues NC'), + ('Links House ES', 'Stone Bridge WS'), + ('Stone Bridge SC', 'Lake Hylia NW'), + ('Stone Bridge EN', 'Tree Line WN'), + ('Stone Bridge EC', 'Tree Line WC'), + ('Stone Bridge WC', 'Hobo EC'), + ('Tree Line SC', 'Lake Hylia NC'), + ('Tree Line SE', 'Lake Hylia NE'), + ('Desert EC', 'Desert Pass WC'), + ('Desert ES', 'Desert Pass WS'), + ('Desert Pass EC', 'Dam WC'), + ('Desert Pass ES', 'Dam WS'), + ('Dam EC', 'South Pass WC'), + ('Statues SC', 'South Pass NC'), + ('South Pass ES', 'Lake Hylia WS'), + ('Lake Hylia EC', 'Octoballoon WC'), + ('Lake Hylia ES', 'Octoballoon WS'), + ('Octoballoon NW', 'Ice Cave SW'), + ('Octoballoon NE', 'Ice Cave SE'), + ('West Death Mountain EN', 'East Death Mountain WN'), + ('West Death Mountain ES', 'East Death Mountain WS'), + ('East Death Mountain EN', 'Death Mountain TR Pegs WN'), + + ('Skull Woods SW', 'Skull Woods Pass NW'), + ('Skull Woods SC', 'Skull Woods Pass NE'), + ('Skull Woods SE', 'Dark Fortune NE'), + ('Skull Woods EN', 'Dark Lumberjack WN'), + ('Dark Lumberjack SW', 'Bumper Cave NW'), + ('Bumper Cave SE', 'Outcast Pond NE'), + ('Skull Woods Pass SW', 'Village of Outcasts NW'), + ('Skull Woods Pass SE', 'Village of Outcasts NC'), + ('Dark Fortune SC', 'Village of Outcasts NE'), + ('Dark Fortune EN', 'Outcast Pond WN'), + ('Dark Fortune ES', 'Outcast Pond WS'), + ('Outcast Pond SW', 'Shield Shop NW'), + ('Outcast Pond SE', 'Shield Shop NE'), + ('Outcast Pond EN', 'Dark Chapel WN'), + ('Outcast Pond ES', 'Dark Chapel WS'), + ('Dark Chapel EC', 'Dark Graveyard WC'), + ('Dark Graveyard EC', 'Qirn Jump WC'), + ('Qirn Jump SW', 'Broken Bridge NW'), + ('Qirn Jump SC', 'Broken Bridge NC'), + ('Qirn Jump SE', 'Broken Bridge NE'), + ('Qirn Jump EN', 'Dark Witch WN'), + ('Qirn Jump EC', 'Dark Witch WC'), + ('Qirn Jump ES', 'Dark Witch WS'), + ('Dark Witch EN', 'Catfish Approach WN'), + ('Dark Witch EC', 'Catfish Approach WC'), + ('Catfish Approach NE', 'Catfish SE'), + ('Village of Outcasts SE', 'Frog NE'), + ('Village of Outcasts ES', 'Hammer Pegs WS'), + ('Pyramid SW', 'Dark Bonk Rocks NW'), + ('Pyramid SE', 'Big Bomb Shop NE'), + ('Pyramid ES', 'Dark Dunes WN'), + ('Broken Bridge SW', 'Dark Dunes NW'), + ('Dark Dunes SC', 'Hammer Bridge NC'), + ('Palace of Darkness SW', 'Dark Tree Line NW'), + ('Palace of Darkness SE', 'Palace of Darkness Nook NE'), + ('Dig Game EC', 'Frog WC'), + ('Dig Game ES', 'Frog WS'), + ('Frog ES', 'Stumpy WS'), + ('Stumpy SW', 'Stumpy Approach NW'), + ('Stumpy SC', 'Stumpy Approach NC'), + ('Stumpy Approach EC', 'Dark C Whirlpool WC'), + ('Dark C Whirlpool NW', 'Dark Bonk Rocks SW'), + ('Dark C Whirlpool SC', 'Swamp NC'), + ('Dark C Whirlpool EN', 'Hype Cave WN'), + ('Dark C Whirlpool EC', 'Hype Cave WC'), + ('Dark C Whirlpool ES', 'Hype Cave WS'), + ('Dark Bonk Rocks EN', 'Big Bomb Shop WN'), + ('Dark Bonk Rocks EC', 'Big Bomb Shop WC'), + ('Dark Bonk Rocks ES', 'Big Bomb Shop WS'), + ('Big Bomb Shop SC', 'Hype Cave NC'), + ('Big Bomb Shop ES', 'Hammer Bridge WS'), + ('Hammer Bridge SC', 'Ice Lake NW'), + ('Hammer Bridge EN', 'Dark Tree Line WN'), + ('Hammer Bridge EC', 'Dark Tree Line WC'), + ('Dark Tree Line SC', 'Ice Lake NC'), + ('Dark Tree Line SE', 'Ice Lake NE'), + ('Swamp Nook EC', 'Swamp WC'), + ('Swamp Nook ES', 'Swamp WS'), + ('Swamp EC', 'Dark South Pass WC'), + ('Hype Cave SC', 'Dark South Pass NC'), + ('Dark South Pass ES', 'Ice Lake WS'), + ('Ice Lake EC', 'Bomber Corner WC'), + ('Ice Lake ES', 'Bomber Corner WS'), + ('Bomber Corner NW', 'Shopping Mall SW'), + ('Bomber Corner NE', 'Shopping Mall SE'), + ('West Dark Death Mountain EN', 'East Dark Death Mountain WN'), + ('West Dark Death Mountain ES', 'East Dark Death Mountain WS'), + ('East Dark Death Mountain EN', 'Turtle Rock WN'), + + # whirlpool connections + ('C Whirlpool', 'River Bend Whirlpool'), + ('Lake Hylia Whirlpool', 'Zora Whirlpool'), + ('Kakariko Pond Whirlpool', 'Octoballoon Whirlpool'), + ('Qirn Jump Whirlpool', 'Bomber Corner Whirlpool') +] + +mirror_connections = { + 'Skull Woods Forest': ['Lost Woods East Area'], + 'Skull Woods Portal Entry': ['Lost Woods West Area'], + 'Skull Woods Forest (West)': ['Lost Woods West Area'], + 'Skull Woods Forgotten Path (Southwest)': ['Lost Woods West Area'], + 'Skull Woods Forgotten Path (Northeast)': ['Lost Woods East Area', 'Lost Woods West Area'], + + 'Dark Lumberjack Area': ['Lumberjack Area'], + + 'West Dark Death Mountain (Top)': ['West Death Mountain (Top)'], + 'West Dark Death Mountain (Bottom)': ['Spectacle Rock Ledge'], 'Dark Death Mountain Floating Island': ['Death Mountain Floating Island'], + 'East Dark Death Mountain (Top)': ['East Death Mountain (Top West)', 'East Death Mountain (Top East)'], 'Dark Death Mountain Ledge': ['Spiral Cave Ledge', 'Mimic Cave Ledge'], 'Dark Death Mountain Isolated Ledge': ['Fairy Ascension Ledge'], 'East Dark Death Mountain (Bushes)': ['Fairy Ascension Plateau'], - 'East Dark Death Mountain (Bottom)': ['East Death Mountain (Bottom)'], - + 'East Dark Death Mountain (Bottom Left)': ['East Death Mountain (Bottom Left)'], + + 'Turtle Rock Area': ['Death Mountain TR Pegs Area'], + + 'Bumper Cave Area': ['Mountain Pass Area'], + 'Bumper Cave Entry': ['Mountain Pass Entry'], + 'Bumper Cave Ledge': ['Mountain Pass Ledge'], + + 'Catfish Area': ['Zora Waterfall Area'], + + 'Skull Woods Pass West Area': ['Lost Woods Pass West Area'], + 'Skull Woods Pass East Top Area': ['Lost Woods Pass East Top Area'], + 'Skull Woods Pass Portal Area': ['Lost Woods Pass Portal Area'], + 'Skull Woods Pass East Bottom Area': ['Lost Woods Pass East Bottom Area'], + + 'Dark Fortune Area': ['Kakariko Fortune Area'], + + 'Outcast Pond Area': ['Kakariko Pond Area'], + + 'Dark Chapel Area': ['Sanctuary Area', 'Bonk Rock Ledge'], + + 'Dark Graveyard Area': ['Graveyard Area'], 'Dark Graveyard North': ['Graveyard Ledge', 'Kings Grave Area'], - 'Bumper Cave Ledge': ['Death Mountain Return Ledge'], - 'Bumper Cave Entrance': ['Death Mountain Entrance'], + 'Qirn Jump Area': ['River Bend Area'], + 'Qirn Jump East Bank': ['River Bend East Bank'], - 'Northeast Dark World': ['Potion Shop Area'], + 'Dark Witch Area': ['Potion Shop Area'], + 'Dark Witch Northeast': ['Potion Shop Northeast'], - 'Dark Grassy Lawn': ['Bush Covered Lawn'], + 'Catfish Approach Area': ['Zora Approach Area'], + 'Catfish Approach Ledge': ['Zora Approach Ledge'], - 'Hammer Peg Area': ['Bat Cave Ledge'], + 'Village of Outcasts': ['Kakariko Village'], + 'Village of Outcasts Bush Yard': ['Kakariko Village'], - 'East Dark World': ['Hyrule Castle Ledge', 'Hyrule Castle Courtyard'], + 'Shield Shop Area': ['Forgotten Forest Area'], + 'Shield Shop Fence': ['Forgotten Forest Area'], - 'Dark Desert': ['Desert Ledge', 'Desert Checkerboard Ledge', 'Desert Palace Stairs', 'Desert Palace Entrance (North) Spot'], + 'Pyramid Area': ['Hyrule Castle Ledge', 'Hyrule Castle Courtyard', 'Hyrule Castle Area', 'Hyrule Castle East Entry'], + 'Pyramid Exit Ledge': ['Hyrule Castle Courtyard'], + 'Pyramid Pass': ['Hyrule Castle Area'], - 'South Dark World': ['Maze Race Ledge', 'Cave 45 Ledge', 'Bombos Tablet Ledge'], + 'Broken Bridge Area': ['Wooden Bridge Area'], + 'Broken Bridge Northeast': ['Wooden Bridge Area'], + 'Broken Bridge West': ['Wooden Bridge Area'], - 'Dark Lake Hylia Water': ['Lake Hylia Island'], - 'Dark Lake Hylia Central Island': ['Lake Hylia Central Island'], + 'Palace of Darkness Area': ['Eastern Palace Area'], - 'Southeast Dark World': ['Light World'], + 'Hammer Pegs Area': ['Blacksmith Area', 'Blacksmith Ledge'], + 'Hammer Pegs Entry': ['Blacksmith Area'], + + 'Dark Dunes Area': ['Sand Dunes Area'], + + 'Dig Game Area': ['Maze Race Ledge'], + 'Dig Game Ledge': ['Maze Race Ledge'], + + 'Frog Area': ['Kakariko Suburb Area'], + 'Archery Game Area': ['Kakariko Suburb Area'], + + 'Stumpy Area': ['Flute Boy Area'], + 'Stumpy Pass': ['Flute Boy Pass'], + + 'Dark Bonk Rocks Area': ['Central Bonk Rocks Area'], + + 'Big Bomb Shop Area': ['Links House Area'], + + 'Hammer Bridge North Area': ['Stone Bridge North Area'], + 'Hammer Bridge South Area': ['Stone Bridge South Area'], + 'Hammer Bridge Water': ['Stone Bridge Water'], + + 'Dark Tree Line Area': ['Tree Line Area'], + + 'Darkness Nook Area': ['Eastern Nook Area'], + + 'Mire Area': ['Desert Area', 'Desert Ledge', 'Desert Checkerboard Ledge', 'Desert Stairs', 'Desert Ledge Keep'], + + 'Stumpy Approach Area': ['Cave 45 Ledge'], + 'Stumpy Approach Bush Entry': ['Flute Boy Bush Entry'], + + 'Dark C Whirlpool Area': ['C Whirlpool Area'], + 'Dark C Whirlpool Outer Area': ['C Whirlpool Outer Area'], + + 'Hype Cave Area': ['Statues Area'], + + 'Ice Lake Northwest Bank': ['Lake Hylia Northwest Bank'], + 'Ice Lake Northeast Bank': ['Lake Hylia Northeast Bank'], + 'Ice Lake Southwest Ledge': ['Lake Hylia South Shore'], + 'Ice Lake Southeast Ledge': ['Lake Hylia South Shore'], + 'Ice Lake Water': ['Lake Hylia Island'], + 'Ice Palace Area': ['Lake Hylia Central Island'], + 'Ice Lake Iceberg': ['Lake Hylia Water', 'Lake Hylia Water D'], #first one needs flippers + + 'Shopping Mall Area': ['Ice Cave Area'], + + 'Swamp Nook Area': ['Desert Pass Area', 'Desert Pass Ledge'], + + 'Swamp Area': ['Dam Area'], + + 'Dark South Pass Area': ['South Pass Area'], + + 'Bomber Corner Area': ['Octoballoon Area'], - 'Light World': ['Skull Woods Forest (West)', 'West Dark World', 'Hammer Peg Area', 'East Dark World', 'South Dark World', 'Dark Desert', 'Southeast Dark World'], + 'Lost Woods West Area': ['Skull Woods Forest (West)', 'Skull Woods Forgotten Path (Southwest)', 'Skull Woods Portal Entry'], + #'Lost Woods West Area': ['Skull Woods Forgotten Path (Northeast)'], # technically yes, but we dont need it + 'Lost Woods East Area': ['Skull Woods Forgotten Path (Northeast)', 'Skull Woods Forest'], - 'West Death Mountain (Top)': ['Dark Death Mountain (Top)'], + 'Lumberjack Area': ['Dark Lumberjack Area'], + + 'West Death Mountain (Top)': ['West Dark Death Mountain (Top)'], + 'Spectacle Rock Ledge': ['West Dark Death Mountain (Bottom)'], 'West Death Mountain (Bottom)': ['West Dark Death Mountain (Bottom)'], - 'East Death Mountain (Top)': ['Dark Death Mountain (Top)'], - 'Death Mountain Floating Island': ['Dark Death Mountain Floating Island'], + 'East Death Mountain (Top West)': ['East Dark Death Mountain (Top)'], + 'East Death Mountain (Top East)': ['East Dark Death Mountain (Top)'], 'Spiral Cave Ledge': ['Dark Death Mountain Ledge'], 'Mimic Cave Ledge': ['Dark Death Mountain Ledge'], 'Fairy Ascension Ledge': ['Dark Death Mountain Isolated Ledge'], + 'Fairy Ascension Plateau': ['East Dark Death Mountain (Bottom)'], + 'East Death Mountain (Bottom Left)': ['East Dark Death Mountain (Bottom Left)'], 'East Death Mountain (Bottom)': ['East Dark Death Mountain (Bottom)'], + 'Death Mountain Floating Island': ['Dark Death Mountain Floating Island'], - 'Death Mountain Return Ledge': ['Bumper Cave Ledge'], - 'Death Mountain Entrance': ['Bumper Cave Entrance'], + 'Death Mountain TR Pegs Area': ['Turtle Rock Area'], + 'Death Mountain TR Pegs Ledge': ['Turtle Rock Ledge'], - 'Northeast Light World': ['Catfish Area'], + 'Mountain Pass Area': ['Bumper Cave Area'], + 'Mountain Pass Entry': ['Bumper Cave Entry'], + 'Mountain Pass Ledge': ['Bumper Cave Ledge'], - 'Graveyard Ledge': ['West Dark World'], - 'Kings Grave Area': ['West Dark World'], + 'Zora Waterfall Area': ['Catfish Area'], - 'Potion Shop Area': ['Northeast Dark World'], + 'Lost Woods Pass West Area': ['Skull Woods Pass West Area'], + 'Lost Woods Pass East Top Area': ['Skull Woods Pass East Top Area'], + 'Lost Woods Pass Portal Area': ['Skull Woods Pass Portal Area'], + 'Lost Woods Pass East Bottom Area': ['Skull Woods Pass East Bottom Area'], - 'Bush Covered Lawn': ['Dark Grassy Lawn'], - 'Bomb Hut Area': ['West Dark World'], + 'Kakariko Fortune Area': ['Dark Fortune Area'], - 'Hyrule Castle Secret Entrance Area': ['East Dark World'], + 'Kakariko Pond Area': ['Outcast Pond Area'], - 'Maze Race Ledge': ['South Dark World'], + 'Sanctuary Area': ['Dark Chapel Area'], + 'Bonk Rock Ledge': ['Dark Chapel Area'], - 'Cave 45 Ledge': ['South Dark World'], + 'Graveyard Area': ['Dark Graveyard Area'], + 'Graveyard Ledge': ['Dark Graveyard Area'], + 'Kings Grave Area': ['Dark Graveyard Area'], - 'Desert Palace Stairs': ['Dark Desert'], - 'Desert Ledge': ['Dark Desert'], - 'Desert Palace Entrance (North) Spot': ['Dark Desert'], - 'Desert Checkerboard Ledge': ['Dark Desert'], + 'River Bend Area': ['Qirn Jump Area'], + 'River Bend East Bank': ['Qirn Jump East Bank'], - 'Lake Hylia Central Island': ['Dark Lake Hylia Central Island'] -} \ No newline at end of file + 'Potion Shop Area': ['Dark Witch Area'], + 'Potion Shop Northeast': ['Dark Witch Northeast'], + + 'Zora Approach Area': ['Catfish Approach Area'], + 'Zora Approach Ledge': ['Catfish Approach Ledge'], + + 'Kakariko Village': ['Village of Outcasts'], + 'Kakariko Southwest': ['Village of Outcasts'], + 'Kakariko Bush Yard': ['Village of Outcasts Bush Yard'], + + 'Forgotten Forest Area': ['Shield Shop Area'], + + 'Hyrule Castle Area': ['Pyramid Area', 'Pyramid Pass'], + 'Hyrule Castle Southwest': ['Pyramid Pass'], + 'Hyrule Castle Courtyard': ['Pyramid Area'], + 'Hyrule Castle Courtyard Northeast': ['Pyramid Area'], + 'Hyrule Castle Ledge': ['Pyramid Area'], + 'Hyrule Castle East Entry': ['Pyramid Area'], + + 'Wooden Bridge Area': ['Broken Bridge Area', 'Broken Bridge West'], + 'Wooden Bridge Northeast': ['Broken Bridge Northeast'], + + 'Eastern Palace Area': ['Palace of Darkness Area'], + + 'Blacksmith Area': ['Hammer Pegs Area', 'Hammer Pegs Entry'], + + 'Sand Dunes Area': ['Dark Dunes Area'], + + 'Maze Race Area': ['Dig Game Area'], + 'Maze Race Ledge': ['Dig Game Ledge'], + + 'Kakariko Suburb Area': ['Frog Area', 'Frog Prison', 'Archery Game Area'], + + 'Flute Boy Area': ['Stumpy Area'], + 'Flute Boy Pass': ['Stumpy Pass'], + + 'Central Bonk Rocks Area': ['Dark Bonk Rocks Area'], + + 'Links House Area': ['Big Bomb Shop Area'], + + 'Stone Bridge North Area': ['Hammer Bridge North Area'], + 'Stone Bridge South Area': ['Hammer Bridge South Area'], + 'Stone Bridge Water': ['Hammer Bridge Water'], + + 'Tree Line Area': ['Dark Tree Line Area'], + + 'Eastern Nook Area': ['Darkness Nook Area'], + + 'Desert Area': ['Mire Area'], + 'Desert Ledge': ['Mire Area'], + 'Desert Ledge Keep': ['Mire Area'], + 'Desert Checkerboard Ledge': ['Mire Area'], + 'Desert Stairs': ['Mire Area'], + + 'Flute Boy Approach Area': ['Stumpy Approach Area'], + 'Cave 45 Ledge': ['Stumpy Approach Area'], + 'Flute Boy Bush Entry': ['Stumpy Approach Bush Entry'], + + 'C Whirlpool Area': ['Dark C Whirlpool Area'], + 'C Whirlpool Outer Area': ['Dark C Whirlpool Outer Area'], + + 'Statues Area': ['Hype Cave Area'], + + 'Lake Hylia Northwest Bank': ['Ice Lake Northwest Bank'], + 'Lake Hylia South Shore': ['Ice Lake Southwest Ledge', 'Ice Lake Southeast Ledge'], + 'Lake Hylia Northeast Bank': ['Ice Lake Northeast Bank'], + 'Lake Hylia Central Island': ['Ice Palace Area'], + 'Lake Hylia Water D': ['Ice Lake Iceberg'], + + 'Ice Cave Area': ['Shopping Mall Area'], + + 'Desert Pass Area': ['Swamp Nook Area'], + 'Desert Pass Southeast': ['Swamp Nook Area'], + 'Desert Pass Ledge': ['Swamp Nook Area'], + + 'Dam Area': ['Swamp Area'], + + 'South Pass Area': ['Dark South Pass Area'], + + 'Octoballoon Area': ['Bomber Corner Area'] +} + +OWTileRegions = bidict({ + 'Lost Woods West Area': 0x00, + 'Lost Woods East Area': 0x00, + + 'Lumberjack Area': 0x02, + + 'West Death Mountain (Top)': 0x03, + 'Spectacle Rock Ledge': 0x03, + 'West Death Mountain (Bottom)': 0x03, + + 'East Death Mountain (Top West)': 0x05, + 'East Death Mountain (Top East)': 0x05, + 'Spiral Cave Ledge': 0x05, + 'Mimic Cave Ledge': 0x05, + 'Fairy Ascension Ledge': 0x05, + 'Fairy Ascension Plateau': 0x05, + 'East Death Mountain (Bottom Left)': 0x05, + 'East Death Mountain (Bottom)': 0x05, + 'Death Mountain Floating Island': 0x05, + + 'Death Mountain TR Pegs Area': 0x07, + 'Death Mountain TR Pegs Ledge': 0x07, + + 'Mountain Pass Area': 0x0a, + 'Mountain Pass Entry': 0x0a, + 'Mountain Pass Ledge': 0x0a, + + 'Zora Waterfall Area': 0x0f, + 'Zora Waterfall Water': 0x0f, + 'Zora Waterfall Entryway': 0x0f, + + 'Lost Woods Pass West Area': 0x10, + 'Lost Woods Pass East Top Area': 0x10, + 'Lost Woods Pass Portal Area': 0x10, + 'Lost Woods Pass East Bottom Area': 0x10, + + 'Kakariko Fortune Area': 0x11, + + 'Kakariko Pond Area': 0x12, + + 'Sanctuary Area': 0x13, + 'Bonk Rock Ledge': 0x13, + + 'Graveyard Area': 0x14, + 'Graveyard Ledge': 0x14, + 'Kings Grave Area': 0x14, + + 'River Bend Area': 0x15, + 'River Bend East Bank': 0x15, + 'River Bend Water': 0x15, + + 'Potion Shop Area': 0x16, + 'Potion Shop Northeast': 0x16, + 'Potion Shop Water': 0x16, + + 'Zora Approach Area': 0x17, + 'Zora Approach Ledge': 0x17, + 'Zora Approach Water': 0x17, + + 'Kakariko Village': 0x18, + 'Kakariko Southwest': 0x18, + 'Kakariko Bush Yard': 0x18, + + 'Forgotten Forest Area': 0x1a, + + 'Hyrule Castle Area': 0x1b, + 'Hyrule Castle Southwest': 0x1b, + 'Hyrule Castle Courtyard': 0x1b, + 'Hyrule Castle Courtyard Northeast': 0x1b, + 'Hyrule Castle Ledge': 0x1b, + 'Hyrule Castle East Entry': 0x1b, + 'Hyrule Castle Water': 0x1b, + + 'Wooden Bridge Area': 0x1d, + 'Wooden Bridge Northeast': 0x1d, + 'Wooden Bridge Water': 0x1d, + + 'Eastern Palace Area': 0x1e, + + 'Blacksmith Area': 0x22, + 'Blacksmith Ledge': 0x22, + + 'Sand Dunes Area': 0x25, + + 'Maze Race Area': 0x28, + 'Maze Race Ledge': 0x28, + 'Maze Race Prize': 0x28, + + 'Kakariko Suburb Area': 0x29, + + 'Flute Boy Area': 0x2a, + 'Flute Boy Pass': 0x2a, + + 'Central Bonk Rocks Area': 0x2b, + + 'Links House Area': 0x2c, + + 'Stone Bridge North Area': 0x2d, + 'Stone Bridge South Area': 0x2d, + 'Stone Bridge Water': 0x2d, + + 'Tree Line Area': 0x2e, + 'Tree Line Water': 0x2e, + + 'Eastern Nook Area': 0x2f, + + 'Desert Area': 0x30, + 'Desert Ledge': 0x30, + 'Desert Ledge Keep': 0x30, + 'Desert Checkerboard Ledge': 0x30, + 'Desert Stairs': 0x30, + 'Desert Mouth': 0x30, + 'Desert Teleporter Ledge': 0x30, + 'Bombos Tablet Ledge': 0x30, + + 'Flute Boy Approach Area': 0x32, + 'Flute Boy Bush Entry': 0x32, + 'Cave 45 Ledge': 0x32, + + 'C Whirlpool Area': 0x33, + 'C Whirlpool Portal Area': 0x33, + 'C Whirlpool Water': 0x33, + 'C Whirlpool Outer Area': 0x33, + + 'Statues Area': 0x34, + 'Statues Water': 0x34, + + 'Lake Hylia Northwest Bank': 0x35, + 'Lake Hylia Northeast Bank': 0x35, + 'Lake Hylia South Shore': 0x35, + 'Lake Hylia Central Island': 0x35, + 'Lake Hylia Island': 0x35, + 'Lake Hylia Water': 0x35, + 'Lake Hylia Water D': 0x35, + + 'Ice Cave Area': 0x37, + 'Ice Cave Water': 0x37, + + 'Desert Pass Area': 0x3a, + 'Desert Pass Southeast': 0x3a, + 'Desert Pass Ledge': 0x3a, + + 'Dam Area': 0x3b, + + 'South Pass Area': 0x3c, + + 'Octoballoon Area': 0x3f, + 'Octoballoon Water': 0x3f, + 'Octoballoon Water Ledge': 0x3f, + + 'Skull Woods Forest': 0x40, + 'Skull Woods Portal Entry': 0x40, + 'Skull Woods Forest (West)': 0x40, + 'Skull Woods Forgotten Path (Southwest)': 0x40, + 'Skull Woods Forgotten Path (Northeast)': 0x40, + + 'Dark Lumberjack Area': 0x42, + + 'West Dark Death Mountain (Top)': 0x43, + 'GT Stairs': 0x43, + 'West Dark Death Mountain (Bottom)': 0x43, + + 'East Dark Death Mountain (Top)': 0x45, + 'East Dark Death Mountain (Bottom Left)': 0x45, + 'East Dark Death Mountain (Bottom)': 0x45, + 'East Dark Death Mountain (Bushes)': 0x45, + 'Dark Death Mountain Ledge': 0x45, + 'Dark Death Mountain Isolated Ledge': 0x45, + 'Dark Death Mountain Floating Island': 0x45, + + 'Turtle Rock Area': 0x47, + 'Turtle Rock Ledge': 0x47, + + 'Bumper Cave Area': 0x4a, + 'Bumper Cave Entry': 0x4a, + 'Bumper Cave Ledge': 0x4a, + + 'Catfish Area': 0x4f, + + 'Skull Woods Pass West Area': 0x50, + 'Skull Woods Pass East Top Area': 0x50, + 'Skull Woods Pass Portal Area': 0x50, + 'Skull Woods Pass East Bottom Area': 0x50, + + 'Dark Fortune Area': 0x51, + + 'Outcast Pond Area': 0x52, + + 'Dark Chapel Area': 0x53, + + 'Dark Graveyard Area': 0x54, + 'Dark Graveyard North': 0x54, + + 'Qirn Jump Area': 0x55, + 'Qirn Jump East Bank': 0x55, + 'Qirn Jump Water': 0x55, + + 'Dark Witch Area': 0x56, + 'Dark Witch Northeast': 0x56, + 'Dark Witch Water': 0x56, + + 'Catfish Approach Area': 0x57, + 'Catfish Approach Ledge': 0x57, + 'Catfish Approach Water': 0x57, + + 'Village of Outcasts': 0x58, + 'Village of Outcasts Bush Yard': 0x58, + + 'Shield Shop Area': 0x5a, + 'Shield Shop Fence': 0x5a, + + 'Pyramid Area': 0x5b, + 'Pyramid Exit Ledge': 0x5b, + 'Pyramid Pass': 0x5b, + 'Pyramid Water': 0x5b, + + 'Broken Bridge Area': 0x5d, + 'Broken Bridge Northeast': 0x5d, + 'Broken Bridge West': 0x5d, + 'Broken Bridge Water': 0x5d, + + 'Palace of Darkness Area': 0x5e, + + 'Hammer Pegs Area': 0x62, + 'Hammer Pegs Entry': 0x62, + + 'Dark Dunes Area': 0x65, + + 'Dig Game Area': 0x68, + 'Dig Game Ledge': 0x68, + + 'Frog Area': 0x69, + 'Frog Prison': 0x69, + 'Archery Game Area': 0x69, + + 'Stumpy Area': 0x6a, + 'Stumpy Pass': 0x6a, + + 'Dark Bonk Rocks Area': 0x6b, + + 'Big Bomb Shop Area': 0x6c, + + 'Hammer Bridge North Area': 0x6d, + 'Hammer Bridge South Area': 0x6d, + 'Hammer Bridge Water': 0x6d, + + 'Dark Tree Line Area': 0x6e, + 'Dark Tree Line Water': 0x6e, + + 'Darkness Nook Area': 0x6f, + + 'Mire Area': 0x70, + 'Mire Teleporter Ledge': 0x70, + + 'Stumpy Approach Area': 0x72, + 'Stumpy Approach Bush Entry': 0x72, + + 'Dark C Whirlpool Area': 0x73, + 'Dark C Whirlpool Portal Area': 0x73, + 'Dark C Whirlpool Water': 0x73, + 'Dark C Whirlpool Outer Area': 0x73, + + 'Hype Cave Area': 0x74, + 'Hype Cave Water': 0x74, + + 'Ice Lake Northwest Bank': 0x75, + 'Ice Lake Northeast Bank': 0x75, + 'Ice Lake Southwest Ledge': 0x75, + 'Ice Lake Southeast Ledge': 0x75, + 'Ice Lake Water': 0x75, + 'Ice Lake Iceberg': 0x75, + 'Ice Palace Area': 0x75, + + 'Shopping Mall Area': 0x77, + 'Shopping Mall Water': 0x77, + + 'Swamp Nook Area': 0x7a, + + 'Swamp Area': 0x7b, + + 'Dark South Pass Area': 0x7c, + + 'Bomber Corner Area': 0x7f, + 'Bomber Corner Water': 0x7f, + 'Bomber Corner Water Ledge': 0x7f, + + 'Master Sword Meadow': 0x80, + 'Hobo Bridge': 0x80, + + 'Zoras Domain': 0x81 +}) \ No newline at end of file diff --git a/Plando.py b/Plando.py index 4374b706..1af62926 100755 --- a/Plando.py +++ b/Plando.py @@ -9,6 +9,7 @@ import sys from BaseClasses import World from Regions import create_regions +from OverworldShuffle import link_overworld from EntranceShuffle import link_entrances, connect_entrance, connect_two_way, connect_exit from Rom import patch_rom, LocalRom, write_string_to_rom, apply_rom_settings, get_sprite_from_name from Rules import set_rules @@ -42,6 +43,7 @@ def main(args): create_regions(world, 1) create_dungeons(world, 1) + link_overworld(world, 1) link_entrances(world, 1) logger.info('Calculating Access Rules.') diff --git a/PotShuffle.py b/PotShuffle.py index 4ad16554..c7164565 100644 --- a/PotShuffle.py +++ b/PotShuffle.py @@ -788,12 +788,12 @@ vanilla_pots = { 0x108: [Pot(166, 19, PotItem.Chicken, 'Chicken House', obj=RoomObject(0x03EFA9, [0x4F, 0x9F, 0xFA]))], 0x10C: [Pot(88, 14, PotItem.Heart, 'Hookshot Fairy', obj=RoomObject(0x03F329, [0xB3, 0x73, 0xFA]))], # note: these addresses got moved thanks to waterfall fairy edit - 0x114: [Pot(92, 4, PotItem.Heart, 'Dark Desert Hint', obj=RoomObject(0x03F79A, [0xBB, 0x23, 0xFA])), - Pot(96, 4, PotItem.Heart, 'Dark Desert Hint', obj=RoomObject(0x03F79D, [0xC3, 0x23, 0xFA])), - Pot(92, 5, PotItem.Bomb, 'Dark Desert Hint', obj=RoomObject(0x03F7A0, [0xBB, 0x2B, 0xFA])), - Pot(96, 5, PotItem.Bomb, 'Dark Desert Hint', obj=RoomObject(0x03F7A3, [0xC3, 0x2B, 0xFA])), - Pot(92, 10, PotItem.FiveArrows, 'Dark Desert Hint', obj=RoomObject(0x03F7A6, [0xBB, 0x53, 0xFA])), - Pot(96, 10, PotItem.Heart, 'Dark Desert Hint', obj=RoomObject(0x03F7A9, [0xC3, 0x53, 0xFA]))], + 0x114: [Pot(92, 4, PotItem.Heart, 'Mire Hint', obj=RoomObject(0x03F79A, [0xBB, 0x23, 0xFA])), + Pot(96, 4, PotItem.Heart, 'Mire Hint', obj=RoomObject(0x03F79D, [0xC3, 0x23, 0xFA])), + Pot(92, 5, PotItem.Bomb, 'Mire Hint', obj=RoomObject(0x03F7A0, [0xBB, 0x2B, 0xFA])), + Pot(96, 5, PotItem.Bomb, 'Mire Hint', obj=RoomObject(0x03F7A3, [0xC3, 0x2B, 0xFA])), + Pot(92, 10, PotItem.FiveArrows, 'Mire Hint', obj=RoomObject(0x03F7A6, [0xBB, 0x53, 0xFA])), + Pot(96, 10, PotItem.Heart, 'Mire Hint', obj=RoomObject(0x03F7A9, [0xC3, 0x53, 0xFA]))], 0x117: [Pot(138, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCB2, [0x17, 0x1F, 0xFA])), # 0x38A -> 38A Pot(142, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCB8, [0x1F, 0x1F, 0xFA])), Pot(166, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCC1, [0x4F, 0x1F, 0xFA])), diff --git a/Regions.py b/Regions.py index fc8bb98e..6cb44847 100644 --- a/Regions.py +++ b/Regions.py @@ -1,6 +1,6 @@ import collections from Items import ItemFactory -from BaseClasses import Region, Location, Entrance, RegionType, Shop, ShopType, LocationType, PotItem, PotFlags +from BaseClasses import Region, Location, Entrance, RegionType, Terrain, Shop, ShopType, LocationType, PotItem, PotFlags from PotShuffle import key_drop_data, vanilla_pots, choose_pots, PotSecretTable from source.dungeon.EnemyList import setup_enemy_locations, enemy_names @@ -10,109 +10,235 @@ def create_regions(world, player): world.regions += [ create_menu_region(player, 'Menu', None, ['Links House S&Q', 'Sanctuary S&Q', 'Old Man S&Q', 'Other World S&Q']), create_menu_region(player, 'Flute Sky', None, ['Flute Spot 1', 'Flute Spot 2', 'Flute Spot 3', 'Flute Spot 4', - 'Flute Spot 5', 'Flute Spot 6', 'Flute Spot 7', 'Flute Spot 8']), - create_lw_region(player, 'Light World', ['Mushroom', 'Bottle Merchant', 'Flute Spot', 'Sunken Treasure', 'Purple Chest'], - ['Lost Woods Gamble', 'Lost Woods Hideout Drop', 'Lost Woods Hideout Stump', 'Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lumberjack House', - 'Fortune Teller (Light)', 'Bonk Rock Cave', 'Sanctuary', 'Sanctuary Grave', 'North Fairy Cave Drop', 'North Fairy Cave', - 'Kakariko Well Drop', 'Kakariko Well Cave', 'Blinds Hideout', 'Elder House (West)', 'Elder House (East)', - 'Snitch Lady (West)', 'Snitch Lady (East)', 'Chicken House', 'Sick Kids House', 'Kakariko Shop', 'Tavern North', 'Tavern (Front)', - 'Hyrule Castle Secret Entrance Drop', 'Sahasrahlas Hut', 'Eastern Palace', 'Blacksmiths Hut', 'Bat Cave Cave', - 'Library', 'Two Brothers House (East)', 'Kakariko Gamble Game', 'Bonk Fairy (Light)', 'Links House', 'Lake Hylia Fairy', 'Long Fairy Cave', - 'Aginahs Cave', 'Light Hype Fairy', 'Lake Hylia Fortune Teller', 'Lake Hylia Shop', 'Mini Moldorm Cave', - 'Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave', 'Desert Fairy', '50 Rupee Cave', 'Dam', - - 'Master Sword Meadow', 'Death Mountain Entrance Rock', 'Graveyard Ladder (Bottom)', 'Kings Grave Rocks (Outer)', - 'Wooden Bridge Bush (South)', 'Kakariko Southwest Bush (North)', 'Kakariko Yard Bush (South)', 'Hyrule Castle Main Gate', 'Bat Cave Ledge Peg', - 'Light World Water Drop', 'Desert Statue Move', 'Checkerboard Ledge Approach', 'Cave 45 Approach', 'Bombos Tablet Ladder (Bottom)', - - 'Kakariko Teleporter', 'Castle Gate Teleporter', 'East Hyrule Teleporter', 'South Hyrule Teleporter', 'LW Flute']), - create_lw_region(player, 'West Death Mountain (Top)', ['Ether Tablet'], ['Tower of Hera', 'Death Mountain Drop', 'Spectacle Rock Approach', - 'DM Hammer Bridge (West)']), + 'Flute Spot 5', 'Flute Spot 6', 'Flute Spot 7', 'Flute Spot 8']), + create_lw_region(player, 'Master Sword Meadow', ['Master Sword Pedestal'], ['Master Sword Meadow SC']), + create_lw_region(player, 'Lost Woods West Area', None, ['Lost Woods Bush (West)', 'Lost Woods NW', 'Lost Woods SW', 'Lost Woods SC']), + create_lw_region(player, 'Lost Woods East Area', ['Mushroom'], ['Lost Woods Gamble', 'Lost Woods Hideout Drop', 'Lost Woods Hideout Stump', 'Lost Woods Bush (East)', 'Lost Woods SE', 'Lost Woods EN']), + create_lw_region(player, 'Lumberjack Area', None, ['Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lumberjack House', 'Lumberjack WN', 'Lumberjack SW']), + create_lw_region(player, 'West Death Mountain (Top)', ['Ether Tablet'], ['Tower of Hera', 'Spectacle Rock Approach', 'West Death Mountain Drop', 'West Death Mountain EN']), + create_lw_region(player, 'Spectacle Rock Ledge', ['Spectacle Rock'], ['Spectacle Rock Leave', 'Spectacle Rock Ledge Drop']), create_lw_region(player, 'West Death Mountain (Bottom)', None, ['Old Man Cave (East)', 'Old Man House (Bottom)', 'Old Man House (Top)', - 'Death Mountain Return Cave (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', - 'DM Broken Bridge (West)', 'Death Mountain Teleporter', 'DM Flute']), - create_lw_region(player, 'Spectacle Rock', ['Spectacle Rock'], ['Spectacle Rock Drop', 'Spectacle Rock Leave']), - create_lw_region(player, 'East Death Mountain (Top)', None, ['Paradox Cave (Top)', 'DM Hammer Bridge (East)', 'Floating Island Bridge (East)', - 'Spiral Cave Ledge Access', 'Fairy Ascension Ledge Access', 'Mimic Cave Ledge Access', 'East Death Mountain Drop', - 'Turtle Rock Teleporter']), + 'Death Mountain Return Cave (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', + 'West Death Mountain Teleporter', 'West Death Mountain ES']), + create_lw_region(player, 'East Death Mountain (Top West)', None, ['DM Hammer Bridge (West)', 'East Death Mountain WN']), + create_lw_region(player, 'East Death Mountain (Top East)', None, ['Paradox Cave (Top)', 'DM Hammer Bridge (East)', 'Floating Island Bridge (East)', + 'EDM To Spiral Ledge Drop', 'EDM To Fairy Ledge Drop', 'EDM To Mimic Ledge Drop', 'EDM Ledge Drop', 'East Death Mountain EN']), create_lw_region(player, 'Death Mountain Floating Island', ['Floating Island'], ['Floating Island Bridge (West)']), - create_lw_region(player, 'Spiral Cave Ledge', None, ['Spiral Cave', 'Spiral Cave Ledge Drop']), - create_lw_region(player, 'Mimic Cave Ledge', None, ['Mimic Cave', 'Mimic Cave Ledge Drop']), + create_lw_region(player, 'Spiral Cave Ledge', None, ['Spiral Cave', 'Spiral Ledge Drop']), + create_lw_region(player, 'Mimic Cave Ledge', None, ['Mimic Cave', 'Mimic Ledge Drop']), create_lw_region(player, 'Fairy Ascension Ledge', None, ['Fairy Ascension Cave (Top)', 'Fairy Ascension Ledge Drop']), + create_lw_region(player, 'Fairy Ascension Plateau', None, ['Fairy Ascension Cave (Bottom)', 'Fairy Ascension Rocks (Inner)', 'Fairy Ascension Plateau Ledge Drop']), + create_lw_region(player, 'East Death Mountain (Bottom Left)', None, ['DM Broken Bridge (West)', 'East Death Mountain WS']), create_lw_region(player, 'East Death Mountain (Bottom)', None, ['Spiral Cave (Bottom)', 'Hookshot Fairy', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', - 'DM Broken Bridge (East)', 'Fairy Ascension Rocks', 'East Death Mountain Teleporter', 'EDM Flute']), - create_lw_region(player, 'Fairy Ascension Plateau', None, ['Fairy Ascension Cave (Bottom)', 'Fairy Ascension Drop']), - create_lw_region(player, 'Death Mountain Return Ledge', None, ['Death Mountain Return Cave (West)', 'Death Mountain Return Ledge Drop'], 'a ledge in the foothills'), - create_lw_region(player, 'Death Mountain Entrance', None, ['Old Man Cave (West)', 'Death Mountain Entrance Drop']), - create_lw_region(player, 'Northeast Light World', None, ['Zoras Domain', 'Potion Shop Rock (North)', 'Northeast Light World Water Drop']), - create_lw_region(player, 'Zora Waterfall Entryway', None, ['Waterfall of Wishing', 'Zora Waterfall Water Drop', 'ZLW Flute']), + 'DM Broken Bridge (East)', 'Fairy Ascension Rocks (Outer)', 'East Death Mountain Teleporter']), + create_lw_region(player, 'Death Mountain TR Pegs Area', None, ['TR Pegs Ledge Entry', 'Death Mountain TR Pegs WN']), + create_lw_region(player, 'Death Mountain TR Pegs Ledge', None, ['TR Pegs Ledge Leave', 'TR Pegs Ledge Drop', 'TR Pegs Teleporter']), + create_lw_region(player, 'Mountain Pass Area', None, ['Mountain Pass Rock (Outer)', 'Mountain Pass NW', 'Mountain Pass SE']), + create_lw_region(player, 'Mountain Pass Ledge', None, ['Death Mountain Return Cave (West)', 'Mountain Pass Ledge Drop'], 'a ledge in the foothills'), + create_lw_region(player, 'Mountain Pass Entry', None, ['Old Man Cave (West)', 'Mountain Pass Rock (Inner)', 'Mountain Pass Entry Ledge Drop']), + create_lw_region(player, 'Zora Waterfall Area', None, ['Zora Waterfall Water Entry', 'Zora Waterfall SE', 'Zora Waterfall NE']), + create_lw_region(player, 'Zora Waterfall Water', None, ['Zora Waterfall Approach', 'Zora Waterfall Landing', 'Zora Whirlpool'], 'Light World', Terrain.Water), + create_lw_region(player, 'Zora Waterfall Entryway', None, ['Waterfall of Wishing', 'Zora Waterfall Water Drop']), + create_lw_region(player, 'Zoras Domain', ['King Zora', 'Zora\'s Ledge'], ['Zoras Domain SW']), + create_lw_region(player, 'Lost Woods Pass West Area', None, ['Lost Woods Pass NW', 'Lost Woods Pass SW']), + create_lw_region(player, 'Lost Woods Pass East Top Area', None, ['Lost Woods Pass Hammer (North)', 'Lost Woods Pass NE']), + create_lw_region(player, 'Lost Woods Pass Portal Area', None, ['Lost Woods Pass Hammer (South)', 'Lost Woods Pass Rock (North)', 'Kakariko Teleporter']), + create_lw_region(player, 'Lost Woods Pass East Bottom Area', None, ['Lost Woods Pass Rock (South)', 'Lost Woods Pass SE']), + create_lw_region(player, 'Kakariko Fortune Area', None, ['Fortune Teller (Light)', 'Kakariko Fortune NE', 'Kakariko Fortune EN', 'Kakariko Fortune ES', 'Kakariko Fortune SC']), + create_lw_region(player, 'Kakariko Pond Area', None, ['Kakariko Pond Whirlpool', 'Kakariko Pond NE', 'Kakariko Pond WN', 'Kakariko Pond WS', + 'Kakariko Pond SW', 'Kakariko Pond SE', 'Kakariko Pond EN', 'Kakariko Pond ES']), + create_lw_region(player, 'Sanctuary Area', None, ['Sanctuary', 'Sanctuary WS', 'Sanctuary EC']), + create_lw_region(player, 'Bonk Rock Ledge', None, ['Bonk Rock Cave', 'Bonk Rock Ledge Drop', 'Sanctuary WN']), + create_lw_region(player, 'Graveyard Area', None, ['Sanctuary Grave', 'Kings Grave Rocks (Outer)', 'Graveyard Ladder (Bottom)', 'Graveyard WC', 'Graveyard EC']), create_lw_region(player, 'Graveyard Ledge', None, ['Graveyard Cave', 'Graveyard Ledge Drop', 'Graveyard Ladder (Top)']), create_lw_region(player, 'Kings Grave Area', None, ['Kings Grave', 'Kings Grave Rocks (Inner)']), - create_lw_region(player, 'Potion Shop Area', None, ['Potion Shop', 'Wooden Bridge Bush (North)', 'Potion Shop Rock (South)', 'Potion Shop Water Drop', 'NWLW Flute']), - create_lw_region(player, 'Bush Covered Lawn', None, ['Bush Covered House', 'Kakariko Yard Bush (North)']), - create_lw_region(player, 'Bomb Hut Area', None, ['Light World Bomb Hut', 'Kakariko Southwest Bush (South)']), - create_lw_region(player, 'Hyrule Castle Courtyard', None, ['Hyrule Castle Entrance (South)', 'Inverted Pyramid Entrance', 'Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Main Gate (North)']), - create_lw_region(player, 'Hyrule Castle Secret Entrance Area', None, ['Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Courtyard Bush (North)']), + create_lw_region(player, 'River Bend Area', None, ['North Fairy Cave Drop', 'North Fairy Cave', 'River Bend Water Drop', 'River Bend WC', 'River Bend SW']), + create_lw_region(player, 'River Bend East Bank', None, ['River Bend East Water Drop', 'River Bend SE', 'River Bend EC', 'River Bend ES']), + create_lw_region(player, 'River Bend Water', None, ['River Bend West Pier', 'River Bend East Pier', 'River Bend Whirlpool', 'River Bend EN', 'River Bend SC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Potion Shop Area', None, ['Potion Shop', 'Potion Shop Water Drop', 'Potion Shop Rock (South)', 'Potion Shop WC', 'Potion Shop WS']), + create_lw_region(player, 'Potion Shop Northeast', None, ['Potion Shop Northeast Water Drop', 'Potion Shop Rock (North)', 'Potion Shop EC']), + create_lw_region(player, 'Potion Shop Water', None, ['Potion Shop WN', 'Potion Shop EN'], 'Light World', Terrain.Water), + create_lw_region(player, 'Zora Approach Area', None, ['Zora Approach Rocks (West)', 'Zora Approach Bottom Ledge Drop', 'Zora Approach Water Drop', 'Zora Approach WC']), + create_lw_region(player, 'Zora Approach Ledge', None, ['Zora Approach Rocks (East)', 'Zora Approach Ledge Drop', 'Zora Approach NE']), + create_lw_region(player, 'Zora Approach Water', None, ['Zora Approach WN'], 'Light World', Terrain.Water), + create_lw_region(player, 'Kakariko Village', ['Bottle Merchant'], ['Kakariko Well Drop', 'Kakariko Well Cave', 'Blinds Hideout', 'Elder House (West)', 'Elder House (East)', + 'Snitch Lady (West)', 'Snitch Lady (East)', 'Chicken House', 'Sick Kids House', 'Kakariko Shop', 'Tavern (Front)', 'Tavern North', + 'Kakariko Southwest Bush (North)', 'Kakariko Yard Bush (South)', 'Kakariko NW', 'Kakariko NC', 'Kakariko NE', 'Kakariko ES', 'Kakariko SE']), + create_lw_region(player, 'Kakariko Southwest', None, ['Light World Bomb Hut', 'Kakariko Southwest Bush (South)']), + create_lw_region(player, 'Kakariko Bush Yard', None, ['Bush Covered House', 'Kakariko Yard Bush (North)']), + create_lw_region(player, 'Forgotten Forest Area', None, ['Forgotten Forest NW', 'Forgotten Forest NE', 'Forgotten Forest ES']), + create_lw_region(player, 'Hyrule Castle Area', None, ['Hyrule Castle Secret Entrance Drop', 'Hyrule Castle East Rock (Inner)', 'Hyrule Castle Southwest Bush (North)', + 'Hyrule Castle Main Gate (South)', 'Castle Gate Teleporter', 'Hyrule Castle WN', 'Hyrule Castle SE']), + create_lw_region(player, 'Hyrule Castle Southwest', None, ['Hyrule Castle Southwest Bush (South)', 'Hyrule Castle SW']), + create_lw_region(player, 'Hyrule Castle Courtyard', None, ['Hyrule Castle Entrance (South)', 'Inverted Pyramid Entrance', 'Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Main Gate (North)', 'Castle Gate Teleporter (Inner)']), + create_lw_region(player, 'Hyrule Castle Courtyard Northeast', None, ['Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Courtyard Bush (North)']), create_lw_region(player, 'Hyrule Castle Ledge', None, ['Hyrule Castle Entrance (West)', 'Agahnims Tower', 'Hyrule Castle Entrance (East)', 'Inverted Pyramid Hole', - 'Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Ledge Drop'], 'the castle rampart'), - create_lw_region(player, 'Bat Cave Ledge', None, ['Bat Cave Drop', 'Bat Cave Ledge Peg (East)']), - create_lw_region(player, 'Maze Race Ledge', ['Maze Race'], ['Two Brothers House (West)', 'Maze Race Ledge Drop'], 'a race against time'), - create_lw_region(player, 'Desert Palace Stairs', None, ['Desert Palace Entrance (South)']), - create_lw_region(player, 'Desert Palace Mouth', None, ['Desert Palace Entrance (East)', 'Desert Palace Mouth Drop'], 'a sandy vista'), + 'Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Ledge Drop'], 'the castle rampart'), + create_lw_region(player, 'Hyrule Castle East Entry', None, ['Hyrule Castle East Rock (Outer)', 'Hyrule Castle ES']), + create_lw_region(player, 'Hyrule Castle Water', None, [], 'Light World', Terrain.Water), + create_lw_region(player, 'Wooden Bridge Area', None, ['Wooden Bridge Bush (South)', 'Wooden Bridge Water Drop', 'Wooden Bridge NW', 'Wooden Bridge SW']), + create_lw_region(player, 'Wooden Bridge Northeast', None, ['Wooden Bridge Bush (North)', 'Wooden Bridge Northeast Water Drop', 'Wooden Bridge NE']), + create_lw_region(player, 'Wooden Bridge Water', None, ['Wooden Bridge NC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Eastern Palace Area', None, ['Sahasrahlas Hut', 'Eastern Palace', 'Eastern Palace SW', 'Eastern Palace SE']), + create_lw_region(player, 'Blacksmith Area', None, ['Blacksmiths Hut', 'Bat Cave Cave', 'Blacksmith Ledge Peg (West)', 'Blacksmith WS']), + create_lw_region(player, 'Blacksmith Ledge', None, ['Bat Cave Drop', 'Blacksmith Ledge Peg (East)']), + create_lw_region(player, 'Sand Dunes Area', None, ['Sand Dunes NW', 'Sand Dunes WN', 'Sand Dunes SC']), + create_lw_region(player, 'Maze Race Area', None, ['Maze Race ES']), + create_lw_region(player, 'Maze Race Ledge', None, ['Two Brothers House (West)', 'Maze Race Game'], 'a race against time'), + create_lw_region(player, 'Maze Race Prize', ['Maze Race'], ['Maze Race Ledge Drop']), # this is a separate region to make OWG item get possible without allowing the Entrance access + create_lw_region(player, 'Kakariko Suburb Area', None, ['Library', 'Two Brothers House (East)', 'Kakariko Gamble Game', 'Kakariko Suburb NE', 'Kakariko Suburb WS', 'Kakariko Suburb ES']), + create_lw_region(player, 'Flute Boy Area', ['Flute Spot'], ['Flute Boy SC']), + create_lw_region(player, 'Flute Boy Pass', None, ['Flute Boy WS', 'Flute Boy SW']), + create_lw_region(player, 'Central Bonk Rocks Area', None, ['Bonk Fairy (Light)', 'Central Bonk Rocks NW', 'Central Bonk Rocks SW', + 'Central Bonk Rocks EN', 'Central Bonk Rocks EC', 'Central Bonk Rocks ES']), + create_lw_region(player, 'Links House Area', None, ['Links House', 'Links House NE', 'Links House WN', 'Links House WC', 'Links House WS', 'Links House SC', 'Links House ES']), + create_lw_region(player, 'Stone Bridge North Area', None, ['Stone Bridge (Southbound)', 'Stone Bridge NC', 'Stone Bridge EN']), + create_lw_region(player, 'Stone Bridge South Area', None, ['Stone Bridge (Northbound)', 'Stone Bridge WS', 'Stone Bridge SC']), + create_lw_region(player, 'Stone Bridge Water', None, ['Stone Bridge WC', 'Stone Bridge EC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Hobo Bridge', ['Hobo'], ['Hobo EC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Central Cliffs', None, ['Lake Hylia Island FAWT Ledge Drop', 'Stone Bridge EC Cliff Water Drop', 'C Whirlpool Portal Cliff Ledge Drop']), + create_lw_region(player, 'Tree Line Area', None, ['Lake Hylia Fairy', 'Tree Line WN', 'Tree Line NW', 'Tree Line SE']), + create_lw_region(player, 'Tree Line Water', None, ['Tree Line WC', 'Tree Line SC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Eastern Nook Area', None, ['Long Fairy Cave', 'East Hyrule Teleporter', 'Eastern Nook NE']), + create_lw_region(player, 'Desert Area', None, ['Aginahs Cave', 'Desert Statue Move', 'Checkerboard Ledge Approach', 'Desert ES']), create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (West)', 'Desert Ledge Rocks (Outer)', 'Desert Ledge Drop'], 'the desert ledge'), - create_lw_region(player, 'Desert Palace Entrance (North) Spot', None, ['Desert Palace Entrance (North)', 'Desert Ledge Rocks (Inner)'], 'the desert ledge'), + create_lw_region(player, 'Desert Ledge Keep', None, ['Desert Palace Entrance (North)', 'Desert Ledge Rocks (Inner)'], 'the desert ledge'), create_lw_region(player, 'Desert Checkerboard Ledge', None, ['Checkerboard Cave', 'Checkerboard Ledge Drop', 'Checkerboard Ledge Leave']), + create_lw_region(player, 'Desert Stairs', None, ['Desert Palace Entrance (South)']), + create_lw_region(player, 'Desert Mouth', None, ['Desert Palace Entrance (East)', 'Desert Mouth Drop'], 'a sandy vista'), create_lw_region(player, 'Desert Teleporter Ledge', None, ['Desert Teleporter Drop', 'Desert Teleporter']), - create_lw_region(player, 'Bombos Tablet Ledge', ['Bombos Tablet'], ['Bombos Tablet Ladder (Top)']), - create_lw_region(player, 'Desert Northern Cliffs'), + create_lw_region(player, 'Desert Northern Cliffs', None, ['Checkerboard Cliff Ledge Drop', 'Cave 45 Cliff Ledge Drop']), + create_lw_region(player, 'Bombos Tablet Ledge', ['Bombos Tablet'], ['Bombos Tablet Drop', 'Desert EC']), + create_lw_region(player, 'Flute Boy Approach Area', None, ['Flute Boy Bush (South)', 'Cave 45 Approach', 'Flute Boy Pass NW', 'Flute Boy Pass EC']), + create_lw_region(player, 'Flute Boy Bush Entry', None, ['Flute Boy Bush (North)', 'Flute Boy Pass NC']), create_lw_region(player, 'Cave 45 Ledge', None, ['Cave 45', 'Cave 45 Ledge Drop', 'Cave 45 Leave']), - create_lw_region(player, 'Lake Hylia Water', None, ['Light World Pier', 'Potion Shop Pier', 'Hobo Pier', 'Lake Hylia Island Pier', 'Lake Hylia Central Island Pier', 'Lake Hylia Whirlpool', 'Waterfall Fairy Access']), - create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island']), - create_lw_region(player, 'Lake Hylia Central Island', None, ['Capacity Upgrade', 'Lake Hylia Central Island Water Drop', 'Lake Hylia Teleporter']), - create_lw_region(player, 'Master Sword Meadow', ['Master Sword Pedestal']), - create_lw_region(player, 'Hobo Bridge', ['Hobo']), - create_lw_region(player, 'Zoras Domain', ['King Zora', 'Zora\'s Ledge']), + create_lw_region(player, 'C Whirlpool Area', None, ['C Whirlpool Rock (Bottom)', 'C Whirlpool Pegs (Outer)', 'C Whirlpool Water Entry', 'C Whirlpool EN', 'C Whirlpool ES', 'C Whirlpool SC']), + create_lw_region(player, 'C Whirlpool Portal Area', None, ['C Whirlpool Pegs (Inner)', 'South Hyrule Teleporter']), + create_lw_region(player, 'C Whirlpool Water', None, ['C Whirlpool Landing', 'C Whirlpool', 'C Whirlpool EC'], 'Light World', Terrain.Water), + create_lw_region(player, 'C Whirlpool Outer Area', None, ['C Whirlpool Rock (Top)', 'C Whirlpool WC', 'C Whirlpool NW']), + create_lw_region(player, 'Statues Area', None, ['Light Hype Fairy', 'Statues Water Entry', 'Statues NC', 'Statues WN', 'Statues WS', 'Statues SC']), + create_lw_region(player, 'Statues Water', None, ['Statues Landing', 'Statues WC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Lake Hylia Northwest Bank', None, ['Lake Hylia Fortune Teller', 'Lake Hylia Shop', 'Lake Hylia Water Drop', 'Lake Hylia NW']), + create_lw_region(player, 'Lake Hylia Northeast Bank', None, ['Lake Hylia Northeast Water Drop', 'Lake Hylia NE']), + create_lw_region(player, 'Lake Hylia South Shore', None, ['Mini Moldorm Cave', 'Lake Hylia South Water Drop', 'Lake Hylia WS', 'Lake Hylia ES']), + create_lw_region(player, 'Lake Hylia Central Island', None, ['Capacity Upgrade', 'Lake Hylia Central Water Drop', 'Lake Hylia Teleporter']), + create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island'], ['Lake Hylia Island Water Drop']), + create_lw_region(player, 'Lake Hylia Water', None, ['Lake Hylia Central Island Pier', 'Lake Hylia Island Pier', 'Lake Hylia West Pier', 'Lake Hylia East Pier', + 'Lake Hylia Water D Approach', 'Lake Hylia Whirlpool', 'Lake Hylia NC', 'Lake Hylia EC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Lake Hylia Water D', None, ['Lake Hylia Water D Leave']), + create_lw_region(player, 'Ice Cave Area', None, ['Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave', 'Ice Cave Water Drop', 'Ice Cave SE']), + create_lw_region(player, 'Ice Cave Water', None, ['Ice Cave Pier', 'Ice Cave SW'], 'Light World', Terrain.Water), + create_lw_region(player, 'Desert Pass Area', ['Purple Chest'], ['Desert Fairy', '50 Rupee Cave', 'Desert Pass Ladder (South)', 'Desert Pass Rocks (North)', 'Desert Pass WS', 'Desert Pass EC']), + create_lw_region(player, 'Desert Pass Southeast', None, ['Desert Pass Rocks (South)', 'Desert Pass ES']), + create_lw_region(player, 'Desert Pass Ledge', None, ['Desert Pass Ladder (North)', 'Desert Pass Ledge Drop', 'Desert Pass WC']), + create_lw_region(player, 'Dam Area', ['Sunken Treasure'], ['Dam', 'Dam WC', 'Dam WS', 'Dam NC', 'Dam EC']), + create_lw_region(player, 'South Pass Area', None, ['South Pass WC', 'South Pass NC', 'South Pass ES']), + create_lw_region(player, 'Octoballoon Area', None, ['Octoballoon Water Drop', 'Octoballoon WS', 'Octoballoon NE']), + create_lw_region(player, 'Octoballoon Water', None, ['Octoballoon Pier', 'Octoballoon Whirlpool', 'Octoballoon WC'], 'Light World', Terrain.Water), + create_lw_region(player, 'Octoballoon Water Ledge', None, ['Octoballoon Waterfall Water Drop', 'Octoballoon NW'], 'Light World', Terrain.Water), + create_dw_region(player, 'Skull Woods Forest', None, ['Skull Woods First Section Hole (East)', 'Skull Woods First Section Hole (West)', 'Skull Woods First Section Hole (North)', + 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)', 'Skull Woods Rock (East)', 'Skull Woods SE']), + create_dw_region(player, 'Skull Woods Portal Entry', None, ['Skull Woods Rock (West)', 'Skull Woods SC']), + create_dw_region(player, 'Skull Woods Forest (West)', None, ['Skull Woods Second Section Hole', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section'], 'a deep, dark forest'), + create_dw_region(player, 'Skull Woods Forgotten Path (Southwest)', None, ['Skull Woods Forgotten Bush (West)', 'Skull Woods SW']), + create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Skull Woods EN']), + create_dw_region(player, 'Dark Lumberjack Area', None, ['Dark Lumberjack Shop', 'Dark Lumberjack WN', 'Dark Lumberjack SW']), + create_dw_region(player, 'West Dark Death Mountain (Top)', None, ['GT Approach', 'Dark Death Mountain Ladder (Top)', 'West Dark Death Mountain Drop', 'West Dark Death Mountain EN']), + create_dw_region(player, 'GT Stairs', None, ['Ganons Tower', 'GT Leave']), create_dw_region(player, 'West Dark Death Mountain (Bottom)', None, ['Spike Cave', 'Dark Death Mountain Fairy', 'Dark Death Mountain Ladder (Bottom)', - 'Dark Death Mountain Teleporter (West)', 'DDM Flute']), - create_dw_region(player, 'Dark Death Mountain (Top)', None, ['Ganons Tower', 'Hookshot Cave', 'Superbunny Cave (Top)', 'Turtle Rock', 'Dark Death Mountain Drop (West)', - 'Dark Death Mountain Drop (East)', 'Dark Death Mountain Ladder (Top)', 'Turtle Rock Tail Drop']), - create_dw_region(player, 'Dark Death Mountain Floating Island', None, ['Hookshot Cave Back Entrance', 'Floating Island Drop'], 'a dark island'), + 'Dark Death Mountain Teleporter (West)', 'West Dark Death Mountain ES']), + create_dw_region(player, 'East Dark Death Mountain (Top)', None, ['Superbunny Cave (Top)', 'Hookshot Cave', 'East Dark Death Mountain Drop', 'East Dark Death Mountain WN', 'East Dark Death Mountain EN']), + create_dw_region(player, 'Dark Death Mountain Floating Island', None, ['Hookshot Cave Back Entrance', 'Floating Island Drop'], 'a dark floating island'), create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)'], 'a dark ledge'), create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Turtle Rock Isolated Ledge Entrance'], 'a dark vista'), - create_dw_region(player, 'East Dark Death Mountain (Bottom)', None, ['East Dark Death Mountain Bushes', 'Superbunny Cave (Bottom)', 'Dark Death Mountain Shop', - 'East Dark Death Mountain Teleporter (Bottom)', 'EDDM Flute']), + create_dw_region(player, 'East Dark Death Mountain (Bottom)', None, ['Superbunny Cave (Bottom)', 'Dark Death Mountain Shop', 'East Dark Death Mountain Bushes', 'East Dark Death Mountain Teleporter']), create_dw_region(player, 'East Dark Death Mountain (Bushes)', None, []), - create_dw_region(player, 'Turtle Rock (Top)', None, ['Turtle Rock Drop', 'East Dark Death Mountain Teleporter (Top)']), - create_dw_region(player, 'West Dark World', ['Frog'], ['Dark Lumberjack Shop', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Chest Game', 'Thieves Town', - 'C-Shaped House', 'Brewery', 'Red Shield Shop', 'Skull Woods Forest', 'Bumper Cave Entrance Rock', - 'West Dark World Water Drop', 'Grassy Lawn Pegs (Bottom)', 'Peg Area Rocks (Left)', 'Village of Outcasts Drop', - 'West Dark World Teleporter', 'WDW Flute', 'Dark Graveyard Bush (South)']), - create_dw_region(player, 'Dark Graveyard North', None, ['Dark Graveyard Bush (North)']), - create_dw_region(player, 'Skull Woods Forest', None, ['Skull Woods First Section Hole (East)', 'Skull Woods First Section Hole (West)', 'Skull Woods First Section Hole (North)', - 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)']), - create_dw_region(player, 'Skull Woods Forest (West)', None, ['Skull Woods Second Section Hole', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section'], 'a deep, dark forest'), + create_dw_region(player, 'East Dark Death Mountain (Bottom Left)', None, ['East Dark Death Mountain WS']), + create_dw_region(player, 'Turtle Rock Area', None, ['Turtle Rock', 'Turtle Rock Tail Ledge Drop', 'Turtle Rock WN']), + create_dw_region(player, 'Turtle Rock Ledge', None, ['Turtle Rock Ledge Drop', 'Turtle Rock Teleporter']), + create_dw_region(player, 'Bumper Cave Area', None, ['Bumper Cave Rock (Outer)', 'Bumper Cave NW', 'Bumper Cave SE']), create_dw_region(player, 'Bumper Cave Ledge', ['Bumper Cave Ledge'], ['Bumper Cave (Top)', 'Bumper Cave Ledge Drop'], 'a ledge with an item'), - create_dw_region(player, 'Bumper Cave Entrance', None, ['Bumper Cave (Bottom)', 'Bumper Cave Entrance Drop']), - create_dw_region(player, 'Dark Grassy Lawn', None, ['Dark World Shop', 'Grassy Lawn Pegs (Top)', 'Dark Grassy Lawn Flute']), - create_dw_region(player, 'Hammer Peg Area', ['Dark Blacksmith Ruins'], ['Hammer Peg Cave', 'Peg Area Rocks (Right)', 'Hammer Peg Area Flute']), - create_dw_region(player, 'Northeast Dark World', None, ['Dark Potion Shop', 'Northeast Dark World Water Drop', 'Dark Witch Rock (South)', 'West Dark World Gap', - 'Broken Bridge Pass (Top)', 'NEDW Flute']), - create_dw_region(player, 'Catfish Area', ['Catfish'], ['Dark Witch Rock (North)', 'Catfish Water Drop']), - create_dw_region(player, 'East Dark World', ['Pyramid'], ['Pyramid Hole', 'Pyramid Fairy', 'Palace of Darkness Hint', 'Palace of Darkness', 'Dark Lake Hylia Fairy', - 'East Dark World Hint', 'Broken Bridge Pass (Bottom)', 'East Dark World Water Drop', 'Hammer Bridge Pegs (North)', - 'East Dark World Teleporter', 'EDW Flute']), - create_dw_region(player, 'Pyramid Exit Ledge', None, ['Pyramid Entrance', 'Pyramid Drop']), - create_dw_region(player, 'Dark Desert', None, ['Mire Shed', 'Misery Mire', 'Dark Desert Fairy', 'Dark Desert Hint', 'DD Flute']), - create_dw_region(player, 'Dark Desert Ledge', None, ['Dark Desert Drop', 'Dark Desert Teleporter']), - create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game'], ['Archery Game', 'Bonk Fairy (Dark)', 'Big Bomb Shop', 'Hype Cave', 'Dark Lake Hylia Shop', 'Swamp Palace', - 'Village of Outcasts Heavy Rock', 'Hammer Bridge Pegs (South)', 'South Dark World Water Drop', 'Post Aga Teleporter', - 'South Dark World Teleporter', 'SDW Flute']), - create_dw_region(player, 'Dark Lake Hylia Water', None, ['Northeast Dark World Pier', 'East Dark World Pier', 'Southeast Dark World Pier', 'Ice Palace Approach']), - create_dw_region(player, 'Dark Lake Hylia Central Island', None, ['Ice Palace', 'Ice Palace Leave Water Drop', 'Ice Island To East Pier', - 'Dark Lake Hylia Teleporter']), - create_dw_region(player, 'Southeast Dark World', None, ['Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', - 'Southeast Dark World Water Drop', 'DLHL Flute']), + create_dw_region(player, 'Bumper Cave Entry', None, ['Bumper Cave (Bottom)', 'Bumper Cave Rock (Inner)', 'Bumper Cave Entry Drop']), + create_dw_region(player, 'Catfish Area', ['Catfish'], ['Catfish SE']), + create_dw_region(player, 'Skull Woods Pass West Area', None, ['Skull Woods Pass Bush Row (West)', 'Skull Woods Pass NW', 'Skull Woods Pass SW']), + create_dw_region(player, 'Skull Woods Pass East Top Area', None, ['Skull Woods Pass Bush Row (East)', 'Skull Woods Pass Bush (North)', 'Skull Woods Pass NE']), + create_dw_region(player, 'Skull Woods Pass Portal Area', None, ['Skull Woods Pass Bush (South)', 'Skull Woods Pass Rock (North)', 'West Dark World Teleporter']), + create_dw_region(player, 'Skull Woods Pass East Bottom Area', None, ['Skull Woods Pass Rock (South)', 'Skull Woods Pass SE']), + create_dw_region(player, 'Dark Fortune Area', None, ['Fortune Teller (Dark)', 'Dark Fortune NE', 'Dark Fortune EN', 'Dark Fortune ES', 'Dark Fortune SC']), + create_dw_region(player, 'Outcast Pond Area', None, ['Outcast Pond NE', 'Outcast Pond WN', 'Outcast Pond WS', 'Outcast Pond SW', 'Outcast Pond SE', 'Outcast Pond EN', 'Outcast Pond ES']), + create_dw_region(player, 'Dark Chapel Area', None, ['Dark Sanctuary Hint', 'Dark Chapel WN', 'Dark Chapel WS', 'Dark Chapel EC']), + create_dw_region(player, 'Dark Graveyard Area', None, ['Dark Graveyard Bush (South)', 'Dark Graveyard WC', 'Dark Graveyard EC']), + create_dw_region(player, 'Dark Graveyard North', None, ['Dark Graveyard Bush (North)']), + create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'Qirn Jump WC', 'Qirn Jump SW']), + create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']), + create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump Whirlpool', 'Qirn Jump EN', 'Qirn Jump SC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Dark Witch Area', None, ['Dark Potion Shop', 'Dark Witch Water Drop', 'Dark Witch Rock (South)', 'Dark Witch WC', 'Dark Witch WS']), + create_dw_region(player, 'Dark Witch Northeast', None, ['Dark Witch Northeast Water Drop', 'Dark Witch Rock (North)', 'Dark Witch EC']), + create_dw_region(player, 'Dark Witch Water', None, ['Dark Witch WN', 'Dark Witch EN'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Catfish Approach Area', None, ['Catfish Approach Rocks (West)', 'Catfish Approach Bottom Ledge Drop', 'Catfish Approach Water Drop', 'Catfish Approach WC']), + create_dw_region(player, 'Catfish Approach Ledge', None, ['Catfish Approach Rocks (East)', 'Catfish Approach Ledge Drop', 'Catfish Approach NE']), + create_dw_region(player, 'Catfish Approach Water', None, ['Catfish Approach WN'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Village of Outcasts', None, ['Chest Game', 'Thieves Town', 'C-Shaped House', 'Brewery', 'Bush Yard Pegs (Outer)', + 'Village of Outcasts NW', 'Village of Outcasts NC', 'Village of Outcasts NE', 'Village of Outcasts ES', 'Village of Outcasts SE']), + create_dw_region(player, 'Village of Outcasts Bush Yard', None, ['Dark World Shop', 'Bush Yard Pegs (Inner)']), + create_dw_region(player, 'Shield Shop Area', None, ['Shield Shop Fence Drop (Outer)', 'Shield Shop NW', 'Shield Shop NE']), + create_dw_region(player, 'Shield Shop Fence', None, ['Red Shield Shop', 'Shield Shop Fence Drop (Inner)']), + create_dw_region(player, 'Pyramid Area', ['Pyramid'], ['Pyramid Hole', 'Pyramid Fairy', 'Pyramid ES']), + create_dw_region(player, 'Pyramid Exit Ledge', None, ['Pyramid Entrance', 'Pyramid Exit Ledge Drop']), + create_dw_region(player, 'Pyramid Pass', None, ['Post Aga Teleporter', 'Pyramid SW', 'Pyramid SE']), + create_dw_region(player, 'Pyramid Water', None, [], 'Dark World', Terrain.Water), + create_dw_region(player, 'Broken Bridge Area', None, ['Broken Bridge Hammer Rock (South)', 'Broken Bridge Water Drop', 'Broken Bridge SW']), + create_dw_region(player, 'Broken Bridge Northeast', None, ['Broken Bridge Hammer Rock (North)', 'Broken Bridge Hookshot Gap', 'Broken Bridge Northeast Water Drop', 'Broken Bridge NE']), + create_dw_region(player, 'Broken Bridge West', None, ['Broken Bridge West Water Drop', 'Broken Bridge NW']), + create_dw_region(player, 'Broken Bridge Water', None, ['Broken Bridge NC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Palace of Darkness Area', None, ['Palace of Darkness Hint', 'Palace of Darkness', 'Palace of Darkness SW', 'Palace of Darkness SE']), + create_dw_region(player, 'Hammer Pegs Area', ['Dark Blacksmith Ruins'], ['Hammer Peg Cave', 'Peg Area Rocks (East)']), + create_dw_region(player, 'Hammer Pegs Entry', None, ['Peg Area Rocks (West)', 'Hammer Pegs WS']), + create_dw_region(player, 'Dark Dunes Area', None, ['Dark Dunes NW', 'Dark Dunes WN', 'Dark Dunes SC']), + create_dw_region(player, 'Dig Game Area', ['Digging Game'], ['Dig Game To Ledge Drop', 'Dig Game ES']), + create_dw_region(player, 'Dig Game Ledge', None, ['Dig Game Ledge Drop', 'Dig Game EC']), + create_dw_region(player, 'Frog Area', None, ['Frog Ledge Drop', 'Frog Rock (Outer)', 'Archery Game Rock (North)', 'Frog NE']), + create_dw_region(player, 'Frog Prison', ['Frog'], ['Frog Rock (Inner)']), + create_dw_region(player, 'Archery Game Area', None, ['Archery Game', 'Archery Game Rock (South)', 'Frog WC', 'Frog WS', 'Frog ES']), + create_dw_region(player, 'Stumpy Area', ['Stumpy'], ['Stumpy SC']), + create_dw_region(player, 'Stumpy Pass', None, ['Stumpy WS', 'Stumpy SW']), + create_dw_region(player, 'Dark Bonk Rocks Area', None, ['Bonk Fairy (Dark)', 'Dark Bonk Rocks NW', 'Dark Bonk Rocks SW', 'Dark Bonk Rocks EN', 'Dark Bonk Rocks EC', 'Dark Bonk Rocks ES']), + create_dw_region(player, 'Big Bomb Shop Area', None, ['Big Bomb Shop', 'Big Bomb Shop NE', 'Big Bomb Shop WN', 'Big Bomb Shop WC', 'Big Bomb Shop WS', 'Big Bomb Shop SC', 'Big Bomb Shop ES']), + create_dw_region(player, 'Hammer Bridge North Area', None, ['Hammer Bridge Pegs (North)', 'Hammer Bridge Water Drop', 'Hammer Bridge NC', 'Hammer Bridge EN']), + create_dw_region(player, 'Hammer Bridge South Area', None, ['Hammer Bridge Pegs (South)', 'Hammer Bridge WS', 'Hammer Bridge SC']), + create_dw_region(player, 'Hammer Bridge Water', None, ['Hammer Bridge Pier', 'Hammer Bridge EC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Dark Central Cliffs', None, ['Ice Lake Iceberg FAWT Ledge Drop', 'Hammer Bridge EC Cliff Water Drop', 'Dark C Whirlpool Portal Cliff Ledge Drop']), + create_dw_region(player, 'Dark Tree Line Area', None, ['Dark Lake Hylia Fairy', 'Dark Tree Line WN', 'Dark Tree Line NW', 'Dark Tree Line SE']), + create_dw_region(player, 'Dark Tree Line Water', None, ['Dark Tree Line WC', 'Dark Tree Line SC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Darkness Nook Area', None, ['East Dark World Hint', 'East Dark World Teleporter', 'Palace of Darkness Nook NE']), + create_dw_region(player, 'Mire Area', None, ['Mire Shed', 'Misery Mire', 'Mire Fairy', 'Mire Hint']), + create_dw_region(player, 'Mire Teleporter Ledge', None, ['Mire Teleporter Ledge Drop', 'Mire Teleporter']), + create_dw_region(player, 'Mire Northern Cliffs', None, ['Mire Cliff Ledge Drop', 'Stumpy Approach Cliff Ledge Drop', 'Mirror To Bombos Tablet Ledge']), + create_dw_region(player, 'Stumpy Approach Area', None, ['Stumpy Approach Bush (South)', 'Stumpy Approach NW', 'Stumpy Approach EC']), + create_dw_region(player, 'Stumpy Approach Bush Entry', None, ['Stumpy Approach Bush (North)', 'Stumpy Approach NC']), + create_dw_region(player, 'Dark C Whirlpool Area', None, ['Dark C Whirlpool Rock (Bottom)', 'Dark C Whirlpool Pegs (Outer)', 'Dark C Whirlpool Water Entry', + 'Dark C Whirlpool EN', 'Dark C Whirlpool ES', 'Dark C Whirlpool SC']), + create_dw_region(player, 'Dark C Whirlpool Portal Area', None, ['Dark C Whirlpool Pegs (Inner)', 'South Dark World Teleporter']), + create_dw_region(player, 'Dark C Whirlpool Water', None, ['Dark C Whirlpool Landing', 'Dark C Whirlpool EC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Dark C Whirlpool Outer Area', None, ['Dark C Whirlpool Rock (Top)', 'Dark C Whirlpool WC', 'Dark C Whirlpool NW']), + create_dw_region(player, 'Hype Cave Area', None, ['Hype Cave', 'Hype Cave Water Entry', 'Hype Cave NC', 'Hype Cave WN', 'Hype Cave WS', 'Hype Cave SC']), + create_dw_region(player, 'Hype Cave Water', None, ['Hype Cave Landing', 'Hype Cave WC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Ice Lake Northwest Bank', None, ['Dark Lake Hylia Shop', 'Ice Lake Water Drop', 'Ice Lake NW']), + create_dw_region(player, 'Ice Lake Northeast Bank', None, ['Ice Lake Northeast Water Drop', 'Ice Lake Iceberg Bomb Jump', 'Ice Lake NE']), + create_dw_region(player, 'Ice Lake Southwest Ledge', None, ['Ice Lake Southwest Water Drop', 'Ice Lake WS']), + create_dw_region(player, 'Ice Lake Southeast Ledge', None, ['Ice Lake Southeast Water Drop', 'Ice Lake ES']), + create_dw_region(player, 'Ice Lake Water', None, ['Ice Lake Northeast Pier', 'Ice Lake NC', 'Ice Lake EC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Ice Lake Iceberg', None, ['Ice Palace Approach', 'Ice Lake Iceberg Water Entry', 'Ice Lake Northeast Pier Hop', 'Ice Lake Teleporter']), + create_dw_region(player, 'Ice Palace Area', None, ['Ice Palace', 'Ice Palace Leave']), + create_dw_region(player, 'Shopping Mall Area', None, ['Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Shopping Mall Water Drop', 'Shopping Mall SE']), + create_dw_region(player, 'Shopping Mall Water', None, ['Shopping Mall Pier', 'Shopping Mall SW'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Swamp Nook Area', None, ['Swamp Nook EC', 'Swamp Nook ES']), + create_dw_region(player, 'Swamp Area', None, ['Swamp Palace', 'Swamp WC', 'Swamp WS', 'Swamp NC', 'Swamp EC']), + create_dw_region(player, 'Dark South Pass Area', None, ['Dark South Pass WC', 'Dark South Pass NC', 'Dark South Pass ES']), + create_dw_region(player, 'Bomber Corner Area', None, ['Bomber Corner Water Drop', 'Bomber Corner WS', 'Bomber Corner NE']), + create_dw_region(player, 'Bomber Corner Water', None, ['Bomber Corner Pier', 'Bomber Corner Whirlpool', 'Bomber Corner WC'], 'Dark World', Terrain.Water), + create_dw_region(player, 'Bomber Corner Water Ledge', None, ['Bomber Corner Waterfall Water Drop', 'Bomber Corner NW'], 'Dark World', Terrain.Water), create_cave_region(player, 'Lost Woods Gamble', 'a game of chance'), create_cave_region(player, 'Lost Woods Hideout (top)', 'a drop\'s exit', ['Lost Woods Hideout'], ['Lost Woods Hideout (top to bottom)']), @@ -236,8 +362,8 @@ def create_regions(world, player): create_cave_region(player, 'Dark Lake Hylia Healer Fairy', 'a fairy fountain'), create_cave_region(player, 'East Dark World Hint', 'a storyteller'), create_cave_region(player, 'Mire Shed', 'a cave with two chests', ['Mire Shed - Left', 'Mire Shed - Right']), - create_cave_region(player, 'Dark Desert Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Dark Desert Hint', 'a storyteller'), + create_cave_region(player, 'Mire Healer Fairy', 'a fairy fountain'), + create_cave_region(player, 'Mire Hint', 'a storyteller'), create_cave_region(player, 'Hype Cave', 'a bounty of five items', ['Hype Cave - Top', 'Hype Cave - Middle Right', 'Hype Cave - Middle Left', 'Hype Cave - Bottom', 'Hype Cave - Generous Guy']), create_cave_region(player, 'Dark Lake Hylia Shop', 'a common shop', ['Dark Lake Hylia Shop - Left', 'Dark Lake Hylia Shop - Middle', 'Dark Lake Hylia Shop - Right']), @@ -946,12 +1072,16 @@ def create_menu_region(player, name, locations=None, exits=None): return _create_region(player, name, RegionType.Menu, 'Menu', locations, exits) -def create_lw_region(player, name, locations=None, exits=None, hint='Light World'): - return _create_region(player, name, RegionType.LightWorld, hint, locations, exits) +def create_lw_region(player, name, locations=None, exits=None, hint='Light World', terrain=Terrain.Land): + region = _create_region(player, name, RegionType.LightWorld, hint, locations, exits) + region.terrain = terrain + return region -def create_dw_region(player, name, locations=None, exits=None, hint='Dark World'): - return _create_region(player, name, RegionType.DarkWorld, hint, locations, exits) +def create_dw_region(player, name, locations=None, exits=None, hint='Dark World', terrain=Terrain.Land): + region = _create_region(player, name, RegionType.DarkWorld, hint, locations, exits) + region.terrain = terrain + return region def create_cave_region(player, name, hint='Hyrule', locations=None, exits=None): @@ -988,7 +1118,7 @@ def mark_light_dark_world_regions(world, player): current = queue.popleft() current.is_light_world = True for exit in current.exits: - if exit.connected_region is None or exit.connected_region.type == RegionType.DarkWorld: # todo: remove none check + if exit.connected_region is None or exit.connected_region.type == RegionType.DarkWorld: # Don't venture into the dark world continue if exit.connected_region not in seen: @@ -1090,7 +1220,7 @@ def adjust_locations(world, player): index += 1 setup_enemy_locations(world, player) # unreal events: - for l in ['Ganon', 'Agahnim 1', 'Agahnim 2', 'Dark Blacksmith Ruins', 'Frog', 'Missing Smith', 'Floodgate', + for l in ['Ganon', 'Agahnim 1', 'Agahnim 2', 'Frog', 'Missing Smith', 'Dark Blacksmith Ruins', 'Floodgate', 'Trench 1 Switch', 'Trench 2 Switch', 'Swamp Drain', 'Attic Cracked Floor', 'Suspicious Maiden', 'Revealing Light', 'Ice Block Drop', 'Zelda Pickup', 'Zelda Drop Off', 'Skull Star Tile']: location = world.get_location_unsafe(l, player) diff --git a/Rom.py b/Rom.py index b4ed05f4..fd904442 100644 --- a/Rom.py +++ b/Rom.py @@ -2662,12 +2662,12 @@ OtherEntrances = {'Lake Hylia Fairy': 'A cave NE of Lake Hylia', 'Dark Lake Hylia Fairy': 'The cave NE dark Lake Hylia', 'Dark Death Mountain Fairy': 'The SW cave on dark DM', 'East Dark World Hint': 'The dark cave near the eastmost portal', - 'Dark Desert Hint': 'The cave east of the mire', + 'Mire Hint': 'The cave east of the mire', 'Palace of Darkness Hint': 'The building south of Kiki', 'Dark Lake Hylia Ledge Spike Cave': 'The rock SE dark Lake Hylia', 'Archery Game': 'The old archery game', 'Dark Lake Hylia Ledge Hint': 'The open cave SE dark Lake Hylia', - 'Dark Desert Fairy': 'The eastern hut in the mire', + 'Mire Fairy': 'The eastern hut in the mire', 'Dark Lake Hylia Ledge Fairy': 'The sealed cave SE dark Lake Hylia', 'Fortune Teller (Dark)': 'The building NE the Village of Outcasts', 'Dark Sanctuary Hint': 'The dark sanctuary cave' diff --git a/Rules.py b/Rules.py index 9abc4887..317a99c7 100644 --- a/Rules.py +++ b/Rules.py @@ -193,6 +193,10 @@ def global_rules(world, player): for exit in world.get_region('Menu', player).exits: exit.hide_path = True + # s&q regions. link's house entrance is set to true so the filler knows the chest inside can always be reached + set_rule(world.get_entrance('Old Man S&Q', player), lambda state: state.can_reach('Old Man', 'Location', player)) + set_rule(world.get_entrance('Other World S&Q', player), lambda state: state.has_Mirror(player) and state.has('Beat Agahnim 1', player)) + # flute rules set_rule(world.get_entrance('Flute Spot 1', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 2', player), lambda state: state.can_flute(player)) @@ -203,31 +207,26 @@ def global_rules(world, player): set_rule(world.get_entrance('Flute Spot 7', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 8', player), lambda state: state.can_flute(player)) - # s&q regions. link's house entrance is set to true so the filler knows the chest inside can always be reached - set_rule(world.get_entrance('Old Man S&Q', player), lambda state: state.can_reach('Old Man', 'Location', player)) - set_rule(world.get_entrance('Other World S&Q', player), lambda state: state.has_Mirror(player) and state.has('Beat Agahnim 1', player)) - # overworld location rules set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player)) - set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player)) - set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player)) set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player)) + set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_location('Missing Smith', player), lambda state: state.has('Get Frog', player) and state.can_reach('Blacksmiths Hut', 'Region', player)) # Can't S&Q with smith + set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player)) set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player)) - - set_rule(world.get_location('Missing Smith', player), lambda state: state.has('Get Frog', player) and state.can_reach('Blacksmiths Hut', 'Region', player)) # Can't S&Q with smith - set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player)) set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest + set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player)) + set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player)) - # underworld rules + # underworld location rules + set_rule(world.get_entrance('Old Man Cave Exit (West)', player), lambda state: False) # drop cannot be climbed up set_rule(world.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: state.has_Mirror(player)) # can erase block - overridden in noglitches set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player) and state.can_reach('Potion Shop Area', 'Region', player)) set_rule(world.get_location('Sick Kid', player), lambda state: state.has_bottle(player)) - set_rule(world.get_location('Magic Bat', player), lambda state: state.has('Magic Powder', player)) - set_rule(world.get_location('Blacksmith', player), lambda state: state.has('Return Smith', player)) - set_rule(world.get_location('Library', player), lambda state: state.has_Boots(player)) set_rule(world.get_location('Sahasrahla', player), lambda state: state.has('Green Pendant', player)) + set_rule(world.get_location('Blacksmith', player), lambda state: state.has('Return Smith', player)) + set_rule(world.get_location('Magic Bat', player), lambda state: state.has('Magic Powder', player)) + set_rule(world.get_location('Library', player), lambda state: state.has_Boots(player)) set_rule(world.get_location('Spike Cave', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and ((state.has('Cape', player) and state.can_extend_magic(player, 16, True)) or @@ -235,6 +234,9 @@ def global_rules(world, player): (state.can_extend_magic(player, 12, True) or (state.world.can_take_damage and (state.has_Boots(player) or state.has_hearts(player, 4)))))) ) + + # underworld rules + set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: state.has_Mirror(player)) # can erase block - overridden in noglitches set_rule(world.get_entrance('Hookshot Cave Bonk Path', player), lambda state: state.has('Hookshot', player) or state.has('Pegasus Boots', player)) set_rule(world.get_entrance('Hookshot Cave Hook Path', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Bumper Cave Bottom to Top', player), lambda state: state.has('Cape', player)) @@ -245,37 +247,93 @@ def global_rules(world, player): set_rule(world.get_entrance('DM Hammer Bridge (East)', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('DM Broken Bridge (West)', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('DM Broken Bridge (East)', player), lambda state: state.has('Hookshot', player)) - set_rule(world.get_entrance('Fairy Ascension Rocks', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Death Mountain Entrance Rock', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Fairy Ascension Rocks (Inner)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Fairy Ascension Rocks (Outer)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('TR Pegs Ledge Entry', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('TR Pegs Ledge Leave', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Mountain Pass Rock (Outer)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Mountain Pass Rock (Inner)', player), lambda state: state.can_lift_rocks(player)) # can be fake flippered into, but is in weird state inside that might prevent you from doing things. - set_rule(world.get_entrance('Waterfall Fairy Access', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Zora Waterfall Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Zora Waterfall Water Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Zora Waterfall Approach', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Lost Woods Pass Hammer (North)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Lost Woods Pass Hammer (South)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Lost Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Lost Woods Pass Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Kakariko Pond Whirlpool', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Kings Grave Rocks (Outer)', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('Kings Grave Rocks (Inner)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('River Bend Water Drop', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Potion Shop Rock (North)', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Potion Shop Rock (South)', player), lambda state: state.can_lift_rocks(player)) - set_rule(world.get_entrance('Bat Cave Ledge Peg', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('Bat Cave Ledge Peg (East)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Zora Approach Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player)) + set_rule(world.get_entrance('Zora Approach Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player)) + set_rule(world.get_entrance('Hyrule Castle East Rock (Inner)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Hyrule Castle East Rock (Outer)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Wooden Bridge Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Wooden Bridge Northeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Blacksmith Ledge Peg (West)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Blacksmith Ledge Peg (East)', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Desert Statue Move', player), lambda state: state.has('Book of Mudora', player)) set_rule(world.get_entrance('Desert Ledge Rocks (Outer)', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Desert Ledge Rocks (Inner)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('C Whirlpool Rock (Bottom)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('C Whirlpool Rock (Top)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('C Whirlpool Pegs (Outer)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('C Whirlpool Pegs (Inner)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Lake Hylia Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Lake Hylia Northeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Lake Hylia Central Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Lake Hylia Island Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Lake Hylia Water D Leave', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Cave Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Desert Pass Rocks (North)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Desert Pass Rocks (South)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Octoballoon Waterfall Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Bumper Cave Entrance Rock', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Skull Woods Rock (West)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Skull Woods Rock (East)', player), lambda state: state.can_lift_rocks(player)) + # this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off? + set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player)) + set_rule(world.get_entrance('Bumper Cave Rock (Outer)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Bumper Cave Rock (Inner)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Skull Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Skull Woods Pass Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Dark Witch Rock (North)', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Dark Witch Rock (South)', player), lambda state: state.can_lift_rocks(player)) - set_rule(world.get_entrance('Grassy Lawn Pegs (Bottom)', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('Grassy Lawn Pegs (Top)', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('Broken Bridge Pass (Bottom)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player) or state.has('Flippers', player)) - set_rule(world.get_entrance('Broken Bridge Pass (Top)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player)) - set_rule(world.get_entrance('West Dark World Gap', player), lambda state: state.has('Hookshot', player)) - set_rule(world.get_entrance('Peg Area Rocks (Left)', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Peg Area Rocks (Right)', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Village of Outcasts Heavy Rock', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Catfish Approach Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player)) + set_rule(world.get_entrance('Catfish Approach Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player)) + set_rule(world.get_entrance('Bush Yard Pegs (Outer)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Bush Yard Pegs (Inner)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Broken Bridge Hammer Rock (South)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player)) + set_rule(world.get_entrance('Broken Bridge Hammer Rock (North)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player)) + set_rule(world.get_entrance('Broken Bridge Hookshot Gap', player), lambda state: state.has('Hookshot', player)) + set_rule(world.get_entrance('Broken Bridge Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Broken Bridge Northeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Broken Bridge West Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Peg Area Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Peg Area Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Dig Game To Ledge Drop', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Frog Rock (Inner)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Frog Rock (Outer)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Archery Game Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Archery Game Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('Hammer Bridge Pegs (North)', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Hammer Bridge Pegs (South)', player), lambda state: state.has('Hammer', player)) - - # this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off? - set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: state.has_Pearl(player) and - (state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player))) + set_rule(world.get_entrance('Hammer Bridge Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Dark C Whirlpool Rock (Bottom)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Dark C Whirlpool Rock (Top)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Dark C Whirlpool Pegs (Outer)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Dark C Whirlpool Pegs (Inner)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Ice Lake Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Northeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Southwest Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Iceberg Water Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Iceberg Bomb Jump', player), lambda state: state.can_use_bombs(player)) + set_rule(world.get_entrance('Shopping Mall Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), lambda state: state.has('Flippers', player)) # entrance rules # Caution: If king's grave is relaxed at all to account for reaching it via a two way cave's exit in insanity mode, then the bomb shop logic will need to be updated (that would involve create a small ledge-like Region for it) @@ -295,11 +353,14 @@ def global_rules(world, player): set_rule(world.get_entrance('Skull Woods Final Section', player), lambda state: state.has('Fire Rod', player)) set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_sword(player) and state.has_misery_mire_medallion(player)) # sword required to cast magic (!) - set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword required to cast magic (!) + set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword required to cast magic (!) if not world.is_atgt_swapped(player): set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player)) - set_rule(world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) + set_rule(world.get_entrance('GT Approach', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) + set_rule(world.get_entrance('GT Leave', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) + else: + set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) # Start of door rando rules # TODO: Do these need to flag off when door rando is off? - some of them, yes @@ -759,8 +820,7 @@ def global_rules(world, player): add_mc_rule('Agahnim 1') add_mc_rule('Agahnim 2') - add_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player)) - set_rule(world.get_location('Ganon', player), lambda state: state.has_beam_sword(player) and state.has_fire_source(player) + set_rule(world.get_location('Ganon', player), lambda state: state.has_beam_sword(player) and state.has_fire_source(player) and state.has_crystals(world.crystals_needed_for_ganon[player], 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 if world.goal[player] != 'ganonhunt': add_rule(world.get_location('Ganon', player), lambda state: state.has_crystals(world.crystals_needed_for_ganon[player], player)) @@ -789,13 +849,16 @@ def bomb_rules(world, player): bombable_items = ['Chicken House', 'Aginah\'s Cave', 'Graveyard Cave', '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)) + add_rule(world.get_location(location, player), lambda state: state.can_use_bombs(player) or state.has_Boots(player)) + add_bunny_rule(world.get_location(location, player), player) for location in bombable_items: add_rule(world.get_location(location, player), lambda state: state.can_use_bombs(player)) + add_bunny_rule(world.get_location(location, player), 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)) + add_bunny_rule(world.get_location(location, player), 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'] @@ -891,7 +954,7 @@ def pot_rules(world, player): (state.has('Cane of Byrna', player) and (state.can_extend_magic(player, 12, True) or (state.world.can_take_damage and (state.has_Boots(player) or state.has_hearts(player, 4))))))) - for l in world.get_region('Dark Desert Hint', player).locations: + for l in world.get_region('Mire Hint', player).locations: if l.type == LocationType.Pot: add_rule(l, lambda state: state.can_use_bombs(player)) for l in world.get_region('Palace of Darkness Hint', player).locations: @@ -938,31 +1001,36 @@ def drop_rules(world, player): def ow_inverted_rules(world, player): if world.mode[player] != 'inverted': set_rule(world.get_entrance('East Death Mountain Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) + set_rule(world.get_entrance('TR Pegs Teleporter', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Kakariko Teleporter', player), lambda state: ((state.has('Hammer', player) and state.can_lift_rocks(player)) or state.can_lift_heavy_rocks(player)) and state.has_Pearl(player)) # bunny cannot lift bushes set_rule(world.get_entrance('Castle Gate Teleporter', player), lambda state: state.has('Beat Agahnim 1', player)) + set_rule(world.get_entrance('Castle Gate Teleporter (Inner)', player), lambda state: state.has('Beat Agahnim 1', player)) set_rule(world.get_entrance('East Hyrule Teleporter', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot use hammer set_rule(world.get_entrance('South Hyrule Teleporter', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot use hammer set_rule(world.get_entrance('Desert Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('Lake Hylia Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Hyrule Castle Main Gate', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Hyrule Castle Main Gate (North)', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Hyrule Castle Main Gate (South)', player), lambda state: state.has_Mirror(player)) set_rule(world.get_location('Frog', player), lambda state: state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Pyramid Hole', player), lambda state: world.is_pyramid_open(player) or state.has('Beat Agahnim 2', player)) + set_rule(world.get_entrance('Pyramid Hole', player), lambda state: world.is_pyramid_open(player) or world.goal[player] == 'trinity' or state.has('Beat Agahnim 2', player)) + set_rule(world.get_entrance('Mirror To Bombos Tablet Ledge', player), lambda state: state.has_Mirror(player)) # OWG else: - set_rule(world.get_entrance('East Dark Death Mountain Teleporter (Top)', player), lambda state: state.can_lift_heavy_rocks(player) and state.has('Hammer', player) and state.has_Pearl(player)) # bunny cannot use hammer - set_rule(world.get_entrance('East Dark Death Mountain Teleporter (Bottom)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: state.can_lift_heavy_rocks(player) and state.has('Hammer', player) and state.has_Pearl(player)) # bunny cannot use hammer + set_rule(world.get_entrance('East Dark Death Mountain Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('West Dark World Teleporter', player), lambda state: ((state.has('Hammer', player) and state.can_lift_rocks(player)) or state.can_lift_heavy_rocks(player)) and state.has_Pearl(player)) set_rule(world.get_entrance('Post Aga Teleporter', player), lambda state: state.has('Beat Agahnim 1', player)) set_rule(world.get_entrance('East Dark World Teleporter', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot use hammer set_rule(world.get_entrance('South Dark World Teleporter', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot use hammer - set_rule(world.get_entrance('Dark Desert Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Mire Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Ice Lake Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) + + set_rule(world.get_entrance('TR Pegs Ledge Drop', player), lambda state: state.has('Hammer', player)) # inverted 1.0 + set_rule(world.get_entrance('Pyramid Exit Ledge Drop', player), lambda state: state.has('Hammer', player)) # inverted 1.0 set_rule(world.get_location('Frog', player), lambda state: state.can_lift_heavy_rocks(player) and (state.has_Pearl(player) or state.has('Beat Agahnim 1', player)) - or (state.can_reach('Light World', 'Region', player) and state.has_Mirror(player))) # Need LW access using Mirror or Portal + or (state.can_reach('Kakariko Suburb Area', 'Region', player) and state.has_Mirror(player))) # Need LW access using Mirror or Portal set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: world.is_pyramid_open(player) or state.has('Beat Agahnim 2', player)) @@ -972,10 +1040,12 @@ def ow_bunny_rules(world, player): add_bunny_rule(world.get_location('Zora\'s Ledge', player), player) add_bunny_rule(world.get_location('Maze Race', player), player) add_bunny_rule(world.get_location('Flute Spot', player), player) + add_bunny_rule(world.get_location('Catfish', player), player) # entrances add_bunny_rule(world.get_entrance('Lost Woods Hideout Drop', player), player) add_bunny_rule(world.get_entrance('Lumberjack Tree Tree', player), player) + add_bunny_rule(world.get_entrance('Waterfall of Wishing', player), player) add_bunny_rule(world.get_entrance('Bonk Rock Cave', player), player) add_bunny_rule(world.get_entrance('Sanctuary Grave', player), player) add_bunny_rule(world.get_entrance('Kings Grave', player), player) @@ -999,48 +1069,144 @@ def ow_bunny_rules(world, player): add_bunny_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), player) # terrain + add_bunny_rule(world.get_entrance('Lost Woods Bush (West)', player), player) + add_bunny_rule(world.get_entrance('Lost Woods Bush (East)', player), player) add_bunny_rule(world.get_entrance('DM Hammer Bridge (West)', player), player) add_bunny_rule(world.get_entrance('DM Hammer Bridge (East)', player), player) add_bunny_rule(world.get_entrance('DM Broken Bridge (West)', player), player) add_bunny_rule(world.get_entrance('DM Broken Bridge (East)', player), player) - add_bunny_rule(world.get_entrance('Fairy Ascension Rocks', player), player) - add_bunny_rule(world.get_entrance('Death Mountain Entrance Rock', player), player) - add_bunny_rule(world.get_entrance('Waterfall Fairy Access', player), player) - add_bunny_rule(world.get_entrance('Graveyard Ladder (Top)', player), player) - add_bunny_rule(world.get_entrance('Graveyard Ladder (Bottom)', player), player) + add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (Inner)', player), player) + add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (Outer)', player), player) + add_bunny_rule(world.get_entrance('TR Pegs Ledge Entry', player), player) + add_bunny_rule(world.get_entrance('TR Pegs Ledge Leave', player), player) + add_bunny_rule(world.get_entrance('TR Pegs Ledge Drop', player), player) # inverted 1.0 + add_bunny_rule(world.get_entrance('Mountain Pass Rock (Outer)', player), player) + add_bunny_rule(world.get_entrance('Mountain Pass Rock (Inner)', player), player) + add_bunny_rule(world.get_entrance('Zora Waterfall Water Drop', player), player) + add_bunny_rule(world.get_entrance('Zora Waterfall Water Entry', player), player) + add_bunny_rule(world.get_entrance('Zora Waterfall Approach', player), player) + add_bunny_rule(world.get_entrance('Lost Woods Pass Hammer (North)', player), player) + add_bunny_rule(world.get_entrance('Lost Woods Pass Hammer (South)', player), player) + add_bunny_rule(world.get_entrance('Lost Woods Pass Rock (North)', player), player) + add_bunny_rule(world.get_entrance('Lost Woods Pass Rock (South)', player), player) + add_bunny_rule(world.get_entrance('Kakariko Pond Whirlpool', player), player) add_bunny_rule(world.get_entrance('Kings Grave Rocks (Outer)', player), player) add_bunny_rule(world.get_entrance('Kings Grave Rocks (Inner)', player), player) + add_bunny_rule(world.get_entrance('Graveyard Ladder (Top)', player), player) + add_bunny_rule(world.get_entrance('Graveyard Ladder (Bottom)', player), player) + add_bunny_rule(world.get_entrance('River Bend Water Drop', player), player) + add_bunny_rule(world.get_entrance('River Bend East Water Drop', player), player) + add_bunny_rule(world.get_entrance('Potion Shop Water Drop', player), player) + add_bunny_rule(world.get_entrance('Potion Shop Northeast Water Drop', player), player) add_bunny_rule(world.get_entrance('Potion Shop Rock (North)', player), player) add_bunny_rule(world.get_entrance('Potion Shop Rock (South)', player), player) - add_bunny_rule(world.get_entrance('Kakariko Yard Bush (North)', player), player) - add_bunny_rule(world.get_entrance('Kakariko Yard Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Zora Approach Water Drop', player), player) + add_bunny_rule(world.get_entrance('Zora Approach Rocks (West)', player), player) + add_bunny_rule(world.get_entrance('Zora Approach Rocks (East)', player), player) add_bunny_rule(world.get_entrance('Kakariko Southwest Bush (North)', player), player) add_bunny_rule(world.get_entrance('Kakariko Southwest Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Kakariko Yard Bush (North)', player), player) + add_bunny_rule(world.get_entrance('Kakariko Yard Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Hyrule Castle Southwest Bush (North)', player), player) + add_bunny_rule(world.get_entrance('Hyrule Castle Southwest Bush (South)', player), player) add_bunny_rule(world.get_entrance('Hyrule Castle Courtyard Bush (North)', player), player) add_bunny_rule(world.get_entrance('Hyrule Castle Courtyard Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Hyrule Castle East Rock (Inner)', player), player) + add_bunny_rule(world.get_entrance('Hyrule Castle East Rock (Outer)', player), player) add_bunny_rule(world.get_entrance('Wooden Bridge Bush (North)', player), player) add_bunny_rule(world.get_entrance('Wooden Bridge Bush (South)', player), player) - add_bunny_rule(world.get_entrance('Bat Cave Ledge Peg', player), player) - add_bunny_rule(world.get_entrance('Bat Cave Ledge Peg (East)', player), player) + add_bunny_rule(world.get_entrance('Wooden Bridge Water Drop', player), player) + add_bunny_rule(world.get_entrance('Wooden Bridge Northeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Blacksmith Ledge Peg (West)', player), player) + add_bunny_rule(world.get_entrance('Blacksmith Ledge Peg (East)', player), player) + add_bunny_rule(world.get_entrance('Maze Race Game', player), player) add_bunny_rule(world.get_entrance('Desert Ledge Rocks (Outer)', player), player) add_bunny_rule(world.get_entrance('Desert Ledge Rocks (Inner)', player), player) + add_bunny_rule(world.get_entrance('Flute Boy Bush (North)', player), player) + add_bunny_rule(world.get_entrance('Flute Boy Bush (South)', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Water Entry', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Rock (Bottom)', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Rock (Top)', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Pegs (Outer)', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Pegs (Inner)', player), player) + add_bunny_rule(world.get_entrance('Statues Water Entry', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia Water Drop', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia South Water Drop', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia Northeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia Central Water Drop', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia Island Water Drop', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia Water D Leave', player), player) + add_bunny_rule(world.get_entrance('Ice Cave Water Drop', player), player) + add_bunny_rule(world.get_entrance('Desert Pass Rocks (North)', player), player) + add_bunny_rule(world.get_entrance('Desert Pass Rocks (South)', player), player) + add_bunny_rule(world.get_entrance('Octoballoon Water Drop', player), player) + add_bunny_rule(world.get_entrance('Octoballoon Waterfall Water Drop', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Rock (West)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Rock (East)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Forgotten Bush (West)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Forgotten Bush (East)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Second Section Hole', player), player) add_bunny_rule(world.get_entrance('East Dark Death Mountain Bushes', player), player) - add_bunny_rule(world.get_entrance('Bumper Cave Entrance Rock', player), player) + add_bunny_rule(world.get_entrance('Bumper Cave Ledge Drop', player), player) + add_bunny_rule(world.get_entrance('Bumper Cave Rock (Outer)', player), player) + add_bunny_rule(world.get_entrance('Bumper Cave Rock (Inner)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (West)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (East)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Bush (North)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (North)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (South)', player), player) add_bunny_rule(world.get_entrance('Dark Graveyard Bush (South)', player), player) add_bunny_rule(world.get_entrance('Dark Graveyard Bush (North)', player), player) + add_bunny_rule(world.get_entrance('Qirn Jump Water Drop', player), player) + add_bunny_rule(world.get_entrance('Qirn Jump East Water Drop', player), player) + add_bunny_rule(world.get_entrance('Dark Witch Water Drop', player), player) + add_bunny_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), player) add_bunny_rule(world.get_entrance('Dark Witch Rock (North)', player), player) add_bunny_rule(world.get_entrance('Dark Witch Rock (South)', player), player) - add_bunny_rule(world.get_entrance('Grassy Lawn Pegs (Bottom)', player), player) - add_bunny_rule(world.get_entrance('Grassy Lawn Pegs (Top)', player), player) - add_bunny_rule(world.get_entrance('Broken Bridge Pass (Bottom)', player), player) - add_bunny_rule(world.get_entrance('Broken Bridge Pass (Top)', player), player) - add_bunny_rule(world.get_entrance('West Dark World Gap', player), player) - add_bunny_rule(world.get_entrance('Peg Area Rocks (Left)', player), player) - add_bunny_rule(world.get_entrance('Peg Area Rocks (Right)', player), player) - add_bunny_rule(world.get_entrance('Village of Outcasts Heavy Rock', player), player) + add_bunny_rule(world.get_entrance('Catfish Approach Water Drop', player), player) + add_bunny_rule(world.get_entrance('Catfish Approach Rocks (West)', player), player) + add_bunny_rule(world.get_entrance('Catfish Approach Rocks (East)', player), player) + add_bunny_rule(world.get_entrance('Bush Yard Pegs (Outer)', player), player) + add_bunny_rule(world.get_entrance('Bush Yard Pegs (Inner)', player), player) + add_bunny_rule(world.get_entrance('Broken Bridge Hammer Rock (South)', player), player) + add_bunny_rule(world.get_entrance('Broken Bridge Hammer Rock (North)', player), player) + add_bunny_rule(world.get_entrance('Broken Bridge Hookshot Gap', player), player) + add_bunny_rule(world.get_entrance('Broken Bridge Water Drop', player), player) + add_bunny_rule(world.get_entrance('Broken Bridge Northeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Broken Bridge West Water Drop', player), player) + add_bunny_rule(world.get_entrance('Peg Area Rocks (West)', player), player) + add_bunny_rule(world.get_entrance('Peg Area Rocks (East)', player), player) + add_bunny_rule(world.get_entrance('Dig Game To Ledge Drop', player), player) + add_bunny_rule(world.get_entrance('Frog Rock (Inner)', player), player) + add_bunny_rule(world.get_entrance('Frog Rock (Outer)', player), player) + add_bunny_rule(world.get_entrance('Archery Game Rock (North)', player), player) + add_bunny_rule(world.get_entrance('Archery Game Rock (South)', player), player) add_bunny_rule(world.get_entrance('Hammer Bridge Pegs (North)', player), player) add_bunny_rule(world.get_entrance('Hammer Bridge Pegs (South)', player), player) + add_bunny_rule(world.get_entrance('Hammer Bridge Water Drop', player), player) + add_bunny_rule(world.get_entrance('Stumpy Approach Bush (North)', player), player) + add_bunny_rule(world.get_entrance('Stumpy Approach Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Rock (Bottom)', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Rock (Top)', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Pegs (Outer)', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Pegs (Inner)', player), player) + add_bunny_rule(world.get_entrance('Hype Cave Water Entry', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Water Drop', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Northeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Southwest Water Drop', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Iceberg Water Entry', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Iceberg Bomb Jump', player), player) + add_bunny_rule(world.get_entrance('Shopping Mall Water Drop', player), player) + add_bunny_rule(world.get_entrance('Bomber Corner Water Drop', player), player) + add_bunny_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), player) + + # OWG rules + add_bunny_rule(world.get_entrance('Stone Bridge EC Cliff Water Drop', player), player) + add_bunny_rule(world.get_entrance('Hammer Bridge EC Cliff Water Drop', player), player) if not world.is_atgt_swapped(player): add_bunny_rule(world.get_entrance('Agahnims Tower', player), player) @@ -1051,31 +1217,23 @@ def ow_bunny_rules(world, player): def no_glitches_rules(world, player): - set_rule(world.get_entrance('Light World Water Drop', player), lambda state: state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Zora Waterfall Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Potion Shop Water Drop', player), lambda state: state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Northeast Light World Water Drop', player), lambda state: state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Lake Hylia Central Island Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('West Dark World Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('South Dark World Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('East Dark World Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Northeast Dark World Water Drop', player), lambda state: state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Southeast Dark World Water Drop', player), lambda state: state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Catfish Water Drop', player), lambda state: state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Ice Palace Leave Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('River Bend East Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Potion Shop Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Potion Shop Northeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Zora Approach Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('C Whirlpool Water Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Statues Water Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Lake Hylia South Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Octoballoon Water Drop', player), lambda state: state.has('Flippers', player)) - add_bunny_rule(world.get_entrance('Light World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Zora Waterfall Water Drop', player), player) - add_bunny_rule(world.get_entrance('Potion Shop Water Drop', player), player) - add_bunny_rule(world.get_entrance('Northeast Light World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Lake Hylia Central Island Water Drop', player), player) - add_bunny_rule(world.get_entrance('West Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('South Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('East Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Northeast Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Southeast Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Catfish Water Drop', player), player) - add_bunny_rule(world.get_entrance('Ice Palace Leave Water Drop', player), player) + set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has('Flippers', player)) # todo: move some dungeon rules to no glicthes logic - see these for examples # add_rule(world.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player)) @@ -1084,24 +1242,29 @@ def no_glitches_rules(world, player): # for location in DMs_room_chests: # add_rule(world.get_location(location, player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: False) # no glitches does not require block override + set_rule(world.get_entrance('Ice Lake Northeast Pier Hop', player), lambda state: False) forbid_bomb_jump_requirements(world, player) add_conditional_lamps(world, player) def fake_flipper_rules(world, player): - set_rule(world.get_entrance('Light World Water Drop', player), lambda state: True) + set_rule(world.get_entrance('River Bend East Water Drop', player), lambda state: True) set_rule(world.get_entrance('Potion Shop Water Drop', player), lambda state: True) - set_rule(world.get_entrance('Northeast Light World Water Drop', player), lambda state: True) - set_rule(world.get_entrance('Northeast Dark World Water Drop', player), lambda state: True) - set_rule(world.get_entrance('Southeast Dark World Water Drop', player), lambda state: True) - set_rule(world.get_entrance('Catfish Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Potion Shop Northeast Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Zora Approach Water Drop', player), lambda state: True) + set_rule(world.get_entrance('C Whirlpool Water Entry', player), lambda state: True) + set_rule(world.get_entrance('Statues Water Entry', player), lambda state: True) + set_rule(world.get_entrance('Lake Hylia South Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Octoballoon Water Drop', player), lambda state: True) - add_bunny_rule(world.get_entrance('Light World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Potion Shop Water Drop', player), player) - add_bunny_rule(world.get_entrance('Northeast Light World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Northeast Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Southeast Dark World Water Drop', player), player) - add_bunny_rule(world.get_entrance('Catfish Water Drop', player), player) + set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: True) + set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: True) + set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: True) + set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: True) def forbid_bomb_jump_requirements(world, player): @@ -1109,7 +1272,7 @@ def forbid_bomb_jump_requirements(world, player): for location in DMs_room_chests: add_rule(world.get_location(location, player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Paradox Cave Bomb Jump', player), lambda state: False) - set_rule(world.get_entrance('Ice Island To East Pier', player), lambda state: False) + set_rule(world.get_entrance('Ice Lake Iceberg Bomb Jump', player), lambda state: False) # Light cones in standard depend on which world we actually are in, not which one the location would normally be @@ -1218,7 +1381,7 @@ def swordless_rules(world, player): set_rule(world.get_location('Ganon', player), lambda state: state.has('Hammer', player) and state.has_fire_source(player) and state.has('Silver Arrows', player) and state.can_shoot_arrows(player) and state.has_crystals(world.crystals_needed_for_ganon[player], player)) set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has('Hammer', player)) # need to damage ganon to get tiles to drop - set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword not required to use medallion for opening in swordless (!) + set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!) if world.mode[player] != 'inverted': @@ -1330,8 +1493,6 @@ def standard_rules(world, player): entrance = world.get_portal(portal_name, player).door.entrance set_rule(entrance, lambda state: state.has('Zelda Delivered', player)) set_rule(world.get_entrance('Sanctuary Exit', player), lambda state: state.has('Zelda Delivered', player)) - set_rule(world.get_entrance('Hyrule Castle Ledge Drop', player), lambda state: state.has('Zelda Delivered', player)) - set_rule(world.get_entrance('Hyrule Castle Main Gate (North)', player), lambda state: state.has('Zelda Delivered', player)) # zelda should be saved before agahnim is in play add_rule(world.get_location('Agahnim 1', player), lambda state: state.has('Zelda Delivered', player)) @@ -1381,24 +1542,8 @@ def standard_rules(world, player): set_rule(world.get_location('Zelda Drop Off', player), lambda state: state.has('Zelda Herself', player) and check_rule_list(state, rule_list)) - for location in ['Mushroom', 'Bottle Merchant', 'Flute Spot', 'Sunken Treasure', 'Purple Chest']: - add_rule(world.get_location(location, player), lambda state: state.has('Zelda Delivered', player)) - - for entrance in ['Blinds Hideout', 'Kings Grave Rocks (Outer)', 'Dam', 'Tavern North', 'Chicken House', - 'Aginahs Cave', 'Sahasrahlas Hut', 'Kakariko Well Drop', 'Kakariko Well Cave', 'Blacksmiths Hut', - 'Bat Cave Ledge Peg', 'Bat Cave Cave', 'Sick Kids House', 'Wooden Bridge Bush (South)', - 'Lost Woods Hideout Drop', 'Lost Woods Hideout Stump', 'Lumberjack Tree Tree', - 'Lumberjack Tree Cave', 'Mini Moldorm Cave', 'Ice Rod Cave', 'Light World Water Drop', - 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Two Brothers House (East)', 'Desert Statue Move', - 'Eastern Palace', 'Master Sword Meadow', 'Sanctuary', 'Sanctuary Grave', - 'Death Mountain Entrance Rock', 'Light World Water Drop', 'East Hyrule Teleporter', - 'South Hyrule Teleporter', 'Kakariko Teleporter', 'Elder House (East)', 'Elder House (West)', - 'North Fairy Cave', 'North Fairy Cave Drop', 'Lost Woods Gamble', 'Snitch Lady (East)', - 'Snitch Lady (West)', 'Tavern (Front)', 'Kakariko Yard Bush (South)', 'Kakariko Southwest Bush (North)', - 'Kakariko Shop', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', 'Lake Hylia Shop', - 'Waterfall of Wishing', 'Hyrule Castle Main Gate', '50 Rupee Cave', 'Bonk Fairy (Light)', - 'Fortune Teller (Light)', 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', - 'Lumberjack House', 'Lake Hylia Fortune Teller', 'Kakariko Gamble Game', 'Castle Gate Teleporter']: + for entrance in ['Links House SC', 'Links House ES', 'Central Bonk Rocks SW', 'Hyrule Castle WN', 'Hyrule Castle ES', + 'Bonk Fairy (Light)', 'Hyrule Castle Main Gate (South)', 'Hyrule Castle Main Gate (North)', 'Hyrule Castle Ledge Drop']: add_rule(world.get_entrance(entrance, player), lambda state: state.has('Zelda Delivered', player)) # don't allow bombs to get past here before zelda is rescued @@ -1483,8 +1628,8 @@ def set_big_bomb_rules(world, player): 'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Hint', 'Mire Shed', - 'Dark Desert Hint', - 'Dark Desert Fairy', + 'Mire Hint', + 'Mire Fairy', 'Misery Mire'] Northern_DW_entrances = ['Brewery', 'C-Shaped House', @@ -1549,7 +1694,7 @@ def set_big_bomb_rules(world, player): 'Desert Palace Entrance (South)', 'Checkerboard Cave'] - set_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_reach('East Dark World', 'Region', player) and state.can_reach('Big Bomb Shop', 'Region', player) and state.has('Crystal 5', player) and state.has('Crystal 6', player)) + set_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_reach('Pyramid Area', 'Region', player) and state.can_reach('Big Bomb Shop', 'Region', player) and state.has('Crystal 5', player) and state.has('Crystal 6', player)) # crossing peg bridge starting from the southern dark world def cross_peg_bridge(state): @@ -1630,7 +1775,7 @@ def set_big_bomb_rules(world, player): # 1. Have mire access, Mirror to reach locations, return via mirror spot, move to center of desert, mirror again and then basic routes # 2. flute then basic routes # -> (Mire access and M) or Flute) and BR - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: ((state.can_reach('Dark Desert', 'Region', player) and state.has_Mirror(player)) or state.can_flute(player)) and basic_routes(state)) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: ((state.can_reach('Mire Area', 'Region', player) and state.has_Mirror(player)) or state.can_flute(player)) and basic_routes(state)) elif bombshop_entrance.name == 'Old Man Cave (West)': # 1. Lift rock then basic_routes # 2. flute then basic_routes @@ -1640,12 +1785,12 @@ def set_big_bomb_rules(world, player): # 1. flute then basic routes # 2. (has west dark world access) use existing mirror spot (required Pearl), mirror again off ledge # -> (Flute or (M and P and West Dark World access) and BR - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: (state.can_flute(player) or (state.can_reach('West Dark World', 'Region', player) and state.has_Pearl(player) and state.has_Mirror(player))) and basic_routes(state)) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: (state.can_flute(player) or (state.can_reach('Village of Outcasts Area', 'Region', player) and state.has_Pearl(player) and state.has_Mirror(player))) and basic_routes(state)) elif bombshop_entrance.name in Mirror_from_SDW_entrances: # 1. flute then basic routes # 2. (has South dark world access) use existing mirror spot, mirror again off ledge # -> (Flute or (M and South Dark World access) and BR - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: (state.can_flute(player) or (state.can_reach('South Dark World', 'Region', player) and state.has_Mirror(player))) and basic_routes(state)) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: (state.can_flute(player) or (state.can_reach('Big Bomb Shop Area', 'Region', player) and state.has_Mirror(player))) and basic_routes(state)) elif bombshop_entrance.name == 'Dark Potion Shop': # 1. walk down by lifting rock: needs gloves and pearl` # 2. walk down by hammering peg: needs hammer and pearl @@ -1772,8 +1917,8 @@ def set_inverted_big_bomb_rules(world, player): 'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Hint', 'Mire Shed', - 'Dark Desert Hint', - 'Dark Desert Fairy', + 'Mire Hint', + 'Mire Fairy', 'Misery Mire', 'Red Shield Shop'] LW_bush_entrances = ['Bush Covered House', @@ -1784,7 +1929,7 @@ def set_inverted_big_bomb_rules(world, player): 'Spectacle Rock Cave (Bottom)'] set_rule(world.get_entrance('Pyramid Fairy', player), - lambda state: state.can_reach('East Dark World', 'Region', player) and state.can_reach('Big Bomb Shop', 'Region', player) and state.has('Crystal 5', player) and state.has('Crystal 6', player)) + lambda state: state.can_reach('Pyramid Area', 'Region', player) and state.can_reach('Big Bomb Shop', 'Region', player) and state.has('Crystal 5', player) and state.has('Crystal 6', player)) # Key for below abbreviations: # P = pearl @@ -1804,25 +1949,25 @@ def set_inverted_big_bomb_rules(world, player): elif bombshop_entrance.name in Northern_DW_entrances: # You can just fly with the Flute, you can take a long walk with Mitts and Hammer, # or you can leave a Mirror portal nearby and then walk to the castle to Mirror again. - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.has_Mirror(player) and state.can_reach('Light World', 'Region', player))) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.has_Mirror(player) and state.can_reach('Hyrule Castle Area', 'Region', player))) elif bombshop_entrance.name in Southern_DW_entrances: # This is the same as north DW without the Mitts rock present. - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.has('Hammer', player) or state.can_flute(player) or (state.has_Mirror(player) and state.can_reach('Light World', 'Region', player))) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.has('Hammer', player) or state.can_flute(player) or (state.has_Mirror(player) and state.can_reach('Hyrule Castle Area', 'Region', player))) elif bombshop_entrance.name in Isolated_DW_entrances: # There's just no way to escape these places with the bomb and no Flute. add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute(player)) elif bombshop_entrance.name in LW_walkable_entrances: # You can fly with the flute, or leave a mirror portal and walk through the light world - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute(player) or (state.has_Mirror(player) and state.can_reach('Light World', 'Region', player))) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute(player) or (state.has_Mirror(player) and state.can_reach('Hyrule Castle Area', 'Region', player))) elif bombshop_entrance.name in LW_bush_entrances: # These entrances are behind bushes in LW so you need either Pearl or the tools to solve NDW bomb shop locations. add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.has_Mirror(player) and (state.can_flute(player) or state.has_Pearl(player) or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)))) elif bombshop_entrance.name == 'Dark World Shop': # This is mostly the same as NDW but the Mirror path requires the Pearl, or using the Hammer - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.has_Mirror(player) and state.can_reach('Light World', 'Region', player) and (state.has_Pearl(player) or state.has('Hammer', player)))) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.has_Mirror(player) and state.can_reach('Hyrule Castle Area', 'Region', player) and (state.has_Pearl(player) or state.has('Hammer', player)))) elif bombshop_entrance.name == 'Bumper Cave (Bottom)': # This is mostly the same as NDW but the Mirror path requires being able to lift a rock. - add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.has_Mirror(player) and state.can_lift_rocks(player) and state.can_reach('Light World', 'Region', player))) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_flute or (state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.has_Mirror(player) and state.can_lift_rocks(player) and state.can_reach('Hyrule Castle Area', 'Region', player))) elif bombshop_entrance.name == 'Old Man Cave (West)': # The three paths back are Mirror and DW walk, Mirror and Flute, or LW walk and then Mirror. add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.has_Mirror(player) and ((state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) or (state.can_lift_rocks(player) and state.has_Pearl(player)) or state.can_flute(player))) @@ -1904,8 +2049,8 @@ def set_bunny_rules(world, player, inverted): return region.is_dark_world else: return region.is_light_world - - # Is it possible to do bunny pocket here + + # Is it possible to do bunny pocket here def can_bunny_pocket_skull_woods(world, player): return world.get_entrance( "Skull Woods Second Section Door (West)", player @@ -1913,7 +2058,7 @@ def set_bunny_rules(world, player, inverted): world.state.can_reach_from("Skull Woods Forest (West)", "Light World", 1) and world.state.can_reach_from("Light World", "Skull Woods Forest (West)", 1) ) - + def can_bunny_pocket_voo_shop(world, player): return ( world.state.can_reach_from("West Dark World", "Light World", 1) @@ -2021,7 +2166,7 @@ def set_bunny_rules(world, player, inverted): for ent_name in bunny_impassible_doors: bunny_exit = world.get_entrance(ent_name, player) - if is_bunny(bunny_exit.parent_region): + if bunny_exit.connected_region and is_bunny(bunny_exit.parent_region): add_rule(bunny_exit, get_rule_to_add(bunny_exit.parent_region)) for ent_name in bunny_impassible_if_trapped: diff --git a/Utils.py b/Utils.py index c32adbd8..50ab1b84 100644 --- a/Utils.py +++ b/Utils.py @@ -743,6 +743,27 @@ def load_cached_yaml(path_list): return data +class bidict(dict): + def __init__(self, *args, **kwargs): + super(bidict, self).__init__(*args, **kwargs) + self.inverse = {} + for key, value in self.items(): + self.inverse.setdefault(value,[]).append(key) + + def __setitem__(self, key, value): + if key in self: + self.inverse[self[key]].remove(key) + super(bidict, self).__setitem__(key, value) + self.inverse.setdefault(value,[]).append(key) + + def __delitem__(self, key): + value = self[key] + self.inverse.setdefault(value,[]).remove(key) + if value in self.inverse and not self.inverse[value]: + del self.inverse[value] + super(bidict, self).__delitem__(key) + + if __name__ == '__main__': # make_new_base2current() # read_entrance_data(old_rom=sys.argv[1]) diff --git a/source/item/District.py b/source/item/District.py index cdfa7bbf..bd482ba4 100644 --- a/source/item/District.py +++ b/source/item/District.py @@ -75,7 +75,7 @@ def create_district_helper(world, player): 'Fortune Teller (Dark)', 'Dark World Shop', 'Dark Lumberjack Shop', 'Skull Woods First Section Hole (West)', 'Skull Woods First Section Hole (East)', 'Skull Woods First Section Hole (North)', 'Skull Woods Second Section Hole'] - mire_entrances = ['Misery Mire', 'Mire Shed', 'Dark Desert Hint', 'Dark Desert Fairy'] + mire_entrances = ['Misery Mire', 'Mire Shed', 'Mire Hint', 'Mire Fairy'] ddm_entrances = ['Turtle Rock', 'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Turtle Rock Isolated Ledge Entrance', 'Superbunny Cave (Top)', 'Superbunny Cave (Bottom)', 'Hookshot Cave', 'Hookshot Cave Back Entrance', 'Ganons Tower', 'Spike Cave', @@ -150,10 +150,10 @@ def find_reachable_locations(state, player): return check_set -inaccessible_regions_std = {'Desert Palace Mouth', 'Bumper Cave Ledge', 'Skull Woods Forest (West)', +inaccessible_regions_std = {'Desert Mouth', 'Bumper Cave Ledge', 'Skull Woods Forest (West)', 'Dark Death Mountain Ledge', 'Dark Death Mountain Isolated Ledge', 'Dark Death Mountain Floating Island'} -inaccessible_regions_inv = {'Desert Palace Mouth', 'Maze Race Ledge', 'Desert Ledge', - 'Desert Palace Entrance (North) Spot', 'Hyrule Castle Ledge', 'Death Mountain Return Ledge'} +inaccessible_regions_inv = {'Desert Mouth', 'Maze Race Ledge', 'Desert Ledge', + 'Desert Ledge Keep', 'Hyrule Castle Ledge', 'Mountain Pass Ledge'} diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index 1d36e43c..2a80d82d 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -77,12 +77,6 @@ def link_entrances_new(world, player): # setup mandatory connections for exit_name, region_name in mandatory_connections: connect_simple(world, exit_name, region_name, player) - if not avail_pool.inverted: - for exit_name, region_name in open_mandatory_connections: - connect_simple(world, exit_name, region_name, player) - else: - for exit_name, region_name in inverted_mandatory_connections: - connect_simple(world, exit_name, region_name, player) connect_custom(avail_pool, world, player) @@ -1435,7 +1429,7 @@ modes = { 'fixed_non_items': { 'special': 'vanilla', 'condition': '', - 'entrances': ['Dark Death Mountain Fairy', 'Dark Desert Fairy', 'Archery Game', + 'entrances': ['Dark Death Mountain Fairy', 'Mire Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop', 'East Dark World Hint', 'Kakariko Gamble Game', 'Good Bee Cave', @@ -1456,7 +1450,7 @@ modes = { 'entrances': ['Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', - 'Dark Desert Hint'] + 'Mire Hint'] }, 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps @@ -1471,7 +1465,7 @@ modes = { 'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', - 'Dark Desert Hint', + 'Mire Hint', 'Links House', 'Tavern North'] }, 'old_man_cave': { # have to do old man cave first so lw dungeon don't use up everything @@ -1511,7 +1505,7 @@ modes = { 'fixed_non_items': { 'special': 'vanilla', 'condition': '', - 'entrances': ['Dark Death Mountain Fairy', 'Dark Desert Fairy', 'Archery Game', + 'entrances': ['Dark Death Mountain Fairy', 'Mire Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop', 'East Dark World Hint', 'Kakariko Gamble Game', 'Good Bee Cave', @@ -1532,7 +1526,7 @@ modes = { 'entrances': ['Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', - 'Dark Desert Hint'] + 'Mire Hint'] }, 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps @@ -1547,7 +1541,7 @@ modes = { 'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', - 'Dark Desert Hint', + 'Mire Hint', 'Links House', 'Tavern North'] # inverted links house gets substituted } } @@ -1836,7 +1830,7 @@ entrance_map = { single_entrance_map = { 'Mimic Cave': 'Mimic Cave', 'Dark Death Mountain Fairy': 'Dark Death Mountain Healer Fairy', 'Dark Death Mountain Shop': 'Dark Death Mountain Shop', 'Spike Cave': 'Spike Cave', - 'Dark Desert Fairy': 'Dark Desert Healer Fairy', 'Dark Desert Hint': 'Dark Desert Hint', 'Mire Shed': 'Mire Shed', + 'Mire Fairy': 'Mire Healer Fairy', 'Mire Hint': 'Mire Hint', 'Mire Shed': 'Mire Shed', 'Archery Game': 'Archery Game', 'Dark Potion Shop': 'Dark Potion Shop', 'Dark Lumberjack Shop': 'Dark Lumberjack Shop', 'Dark World Shop': 'Village of Outcasts Shop', 'Fortune Teller (Dark)': 'Fortune Teller (Dark)', 'Dark Sanctuary Hint': 'Dark Sanctuary Hint', @@ -1876,12 +1870,12 @@ default_dw = { 'Turtle Rock Ledge Exit (East)', 'Turtle Rock Isolated Ledge Exit', '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', 'Bonk Fairy (Dark)', - 'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Dark Desert Healer Fairy', + 'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Mire Healer Fairy', 'Dark Death Mountain Healer Fairy', 'Dark Death Mountain Shop', 'Pyramid Fairy', 'East Dark World Hint', 'Palace of Darkness Hint', 'Village of Outcasts Shop', 'Dark Lake Hylia Shop', 'Dark Lumberjack Shop', 'Dark Potion Shop', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Hint', 'Hype Cave', 'Brewery', 'C-Shaped House', 'Chest Game', 'Hammer Peg Cave', - 'Red Shield Shop', 'Dark Sanctuary Hint', 'Fortune Teller (Dark)', 'Archery Game', 'Mire Shed', 'Dark Desert Hint', + 'Red Shield Shop', 'Dark Sanctuary Hint', 'Fortune Teller (Dark)', 'Archery Game', 'Mire Shed', 'Mire Hint', 'Spike Cave', 'Skull Back Drop', 'Skull Left Drop', 'Skull Pinball', 'Skull Pot Circle', 'Pyramid' } @@ -1934,10 +1928,10 @@ DW_Entrances = ['Bumper Cave (Bottom)', 'Superbunny Cave (Top)', 'Superbunny Ca 'Turtle Rock Isolated Ledge Entrance', 'Bumper Cave (Top)', 'Hookshot Cave Back Entrance', 'Bonk Fairy (Dark)', 'Dark Sanctuary Hint', 'Dark Lake Hylia Fairy', 'C-Shaped House', 'Big Bomb Shop', 'Dark Death Mountain Fairy', 'Dark Lake Hylia Shop', 'Dark World Shop', 'Red Shield Shop', 'Mire Shed', - 'East Dark World Hint', 'Dark Desert Hint', 'Spike Cave', 'Palace of Darkness Hint', + 'East Dark World Hint', 'Mire Hint', 'Spike Cave', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Death Mountain Shop', 'Dark Potion Shop', 'Pyramid Fairy', 'Archery Game', 'Dark Lumberjack Shop', 'Hype Cave', 'Brewery', - 'Dark Lake Hylia Ledge Hint', 'Chest Game', 'Dark Desert Fairy', 'Dark Lake Hylia Ledge Fairy', + 'Dark Lake Hylia Ledge Hint', 'Chest Game', 'Mire Fairy', 'Dark Lake Hylia Ledge Fairy', 'Fortune Teller (Dark)', 'Hammer Peg Cave', 'Pyramid Entrance', 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)', 'Skull Woods Second Section Door (West)', 'Ganons Tower'] @@ -2071,8 +2065,8 @@ Bomb_Shop_Options = [ 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Hint', 'Hype Cave', 'Bonk Fairy (Dark)', 'Brewery', 'C-Shaped House', 'Chest Game', 'Hammer Peg Cave', 'Red Shield Shop', 'Dark Sanctuary Hint', 'Fortune Teller (Dark)', 'Dark World Shop', - 'Dark Lumberjack Shop', 'Dark Potion Shop', 'Archery Game', 'Mire Shed', 'Dark Desert Hint', - 'Dark Desert Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Fairy', 'Mimic Cave', + 'Dark Lumberjack Shop', 'Dark Potion Shop', 'Archery Game', 'Mire Shed', 'Mire Hint', + 'Mire Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Fairy', 'Mimic Cave', 'Big Bomb Shop', 'Dark Lake Hylia Shop', 'Bumper Cave (Top)', 'Links House', 'Hyrule Castle Entrance (South)', 'Misery Mire', 'Thieves Town', 'Bumper Cave (Bottom)', 'Swamp Palace', 'Hyrule Castle Secret Entrance Stairs', 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)', @@ -2093,8 +2087,8 @@ Inverted_Bomb_Shop_Options = [ 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Hint', 'Hype Cave', 'Bonk Fairy (Dark)', 'Brewery', 'C-Shaped House', 'Chest Game', 'Hammer Peg Cave', 'Red Shield Shop', 'Fortune Teller (Dark)', 'Dark World Shop', - 'Dark Lumberjack Shop', 'Dark Potion Shop', 'Archery Game', 'Mire Shed', 'Dark Desert Hint', - 'Dark Desert Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Fairy', 'Mimic Cave', + 'Dark Lumberjack Shop', 'Dark Potion Shop', 'Archery Game', 'Mire Shed', 'Mire Hint', + 'Mire Fairy', 'Spike Cave', 'Dark Death Mountain Shop', 'Dark Death Mountain Fairy', 'Mimic Cave', 'Dark Lake Hylia Shop', 'Bumper Cave (Top)', 'Hyrule Castle Entrance (South)', 'Misery Mire', 'Thieves Town', 'Bumper Cave (Bottom)', 'Swamp Palace', 'Hyrule Castle Secret Entrance Stairs', 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)', @@ -2114,9 +2108,7 @@ Forbidden_Swap_Entrances = {'Old Man Cave (East)', 'Blacksmiths Hut', 'Big Bomb # 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'), - - # underworld +mandatory_connections = [# underworld ('Lost Woods Hideout (top to bottom)', 'Lost Woods Hideout (bottom)'), ('Lumberjack Tree (top to bottom)', 'Lumberjack Tree (bottom)'), ('Death Mountain Return Cave E', 'Death Mountain Return Cave (right)'), @@ -2163,203 +2155,9 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ('Superbunny Cave Climb', 'Superbunny Cave (Top)'), ('Bumper Cave Bottom to Top', 'Bumper Cave (top)'), ('Bumper Cave Top To Bottom', 'Bumper Cave (bottom)'), - ('Ganon Drop', 'Bottom of Pyramid'), - - # water entry - ('Waterfall Fairy Access', 'Zora Waterfall Entryway'), - ('Zora Waterfall Water Drop', 'Lake Hylia Water'), - ('Light World Water Drop', 'Lake Hylia Water'), - ('Potion Shop Water Drop', 'Lake Hylia Water'), - ('Northeast Light World Water Drop', 'Lake Hylia Water'), - ('Lake Hylia Central Island Water Drop', 'Lake Hylia Water'), - - ('West Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Northeast Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Catfish Water Drop', 'Dark Lake Hylia Water'), - ('East Dark World Water Drop', 'Dark Lake Hylia Water'), - ('South Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Southeast Dark World Water Drop', 'Dark Lake Hylia Water'), - ('Ice Palace Leave Water Drop', 'Dark Lake Hylia Water'), - - # water exit - ('Light World Pier', 'Light World'), # there are several piers in-game, only one needs to be modeled - ('Potion Shop Pier', 'Potion Shop Area'), - ('Hobo Pier', 'Hobo Bridge'), - ('Lake Hylia Central Island Pier', 'Lake Hylia Central Island'), - ('Lake Hylia Whirlpool', 'Northeast Light World'), - - ('Northeast Dark World Pier', 'Northeast Dark World'), - ('East Dark World Pier', 'East Dark World'), - ('Southeast Dark World Pier', 'Southeast Dark World'), - - # terrain - ('Master Sword Meadow', 'Master Sword Meadow'), - ('DM Hammer Bridge (West)', 'East Death Mountain (Top)'), - ('DM Hammer Bridge (East)', 'West Death Mountain (Top)'), - ('DM Broken Bridge (West)', 'East Death Mountain (Bottom)'), - ('DM Broken Bridge (East)', 'West Death Mountain (Bottom)'), - ('Fairy Ascension Rocks', 'Fairy Ascension Plateau'), - ('Death Mountain Entrance Rock', 'Death Mountain Entrance'), - ('Zoras Domain', 'Zoras Domain'), - ('Kings Grave Rocks (Outer)', 'Kings Grave Area'), - ('Kings Grave Rocks (Inner)', 'Light World'), - ('Potion Shop Rock (South)', 'Northeast Light World'), - ('Potion Shop Rock (North)', 'Potion Shop Area'), - ('Kakariko Southwest Bush (North)', 'Bomb Hut Area'), - ('Kakariko Southwest Bush (South)', 'Light World'), - ('Kakariko Yard Bush (North)', 'Light World'), - ('Kakariko Yard Bush (South)', 'Bush Covered Lawn'), - ('Hyrule Castle Courtyard Bush (North)', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Secret Entrance Area'), - ('Hyrule Castle Main Gate', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Main Gate (North)', 'Light World'), - ('Wooden Bridge Bush (North)', 'Light World'), - ('Wooden Bridge Bush (South)', 'Potion Shop Area'), - ('Bat Cave Ledge Peg', 'Bat Cave Ledge'), - ('Bat Cave Ledge Peg (East)', 'Light World'), - ('Desert Statue Move', 'Desert Palace Stairs'), - ('Desert Ledge Rocks (Outer)', 'Desert Palace Entrance (North) Spot'), - ('Desert Ledge Rocks (Inner)', 'Desert Ledge'), - - ('Skull Woods Forest', 'Skull Woods Forest'), - ('East Dark Death Mountain Bushes', 'East Dark Death Mountain (Bushes)'), - ('Bumper Cave Entrance Rock', 'Bumper Cave Entrance'), - ('Dark Witch Rock (North)', 'Northeast Dark World'), - ('Dark Witch Rock (South)', 'Catfish Area'), - ('Grassy Lawn Pegs (Top)', 'West Dark World'), - ('Grassy Lawn Pegs (Bottom)', 'Dark Grassy Lawn'), - ('West Dark World Gap', 'West Dark World'), - ('Dark Graveyard Bush (South)', 'Dark Graveyard North'), - ('Dark Graveyard Bush (North)', 'West Dark World'), - ('Broken Bridge Pass (Top)', 'East Dark World'), - ('Broken Bridge Pass (Bottom)', 'Northeast Dark World'), - ('Peg Area Rocks (Left)', 'Hammer Peg Area'), - ('Peg Area Rocks (Right)', 'West Dark World'), - ('Village of Outcasts Heavy Rock', 'West Dark World'), - ('Hammer Bridge Pegs (North)', 'South Dark World'), - ('Hammer Bridge Pegs (South)', 'East Dark World'), - ('Ice Island To East Pier', 'East Dark World'), - - # ledge drops - ('Spectacle Rock Drop', 'West Death Mountain (Top)'), - ('Death Mountain Drop', 'West Death Mountain (Bottom)'), - ('Spiral Cave Ledge Access', 'Spiral Cave Ledge'), - ('Fairy Ascension Ledge Access', 'Fairy Ascension Ledge'), - ('East Death Mountain Drop', 'East Death Mountain (Bottom)'), - ('Spiral Cave Ledge Drop', 'East Death Mountain (Bottom)'), - ('Fairy Ascension Ledge Drop', 'Fairy Ascension Plateau'), - ('Fairy Ascension Drop', 'East Death Mountain (Bottom)'), - ('Death Mountain Entrance Drop', 'Light World'), - ('Death Mountain Return Ledge Drop', 'Light World'), - ('Graveyard Ledge Drop', 'Light World'), - ('Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Courtyard'), - ('Hyrule Castle Ledge Drop', 'Light World'), - ('Maze Race Ledge Drop', 'Light World'), - ('Desert Ledge Drop', 'Light World'), - ('Desert Palace Mouth Drop', 'Light World'), - ('Checkerboard Ledge Drop', 'Light World'), - ('Desert Teleporter Drop', 'Light World'), - ('Cave 45 Ledge Drop', 'Light World'), - - ('Dark Death Mountain Drop (West)', 'West Dark Death Mountain (Bottom)'), - ('Dark Death Mountain Drop (East)', 'East Dark Death Mountain (Bottom)'), - ('Floating Island Drop', 'Dark Death Mountain (Top)'), - ('Turtle Rock Drop', 'Dark Death Mountain (Top)'), - ('Bumper Cave Entrance Drop', 'West Dark World'), - ('Bumper Cave Ledge Drop', 'West Dark World'), - ('Pyramid Drop', 'East Dark World'), - ('Village of Outcasts Drop', 'South Dark World'), - ('Dark Desert Drop', 'Dark Desert') + ('Ganon Drop', 'Bottom of Pyramid') ] -open_mandatory_connections = [('Sanctuary S&Q', 'Sanctuary'), - ('Old Man S&Q', 'Old Man House'), - ('Other World S&Q', 'East Dark World'), - - # flute - ('Flute Spot 1', 'West Death Mountain (Bottom)'), - ('Flute Spot 2', 'Potion Shop Area'), - ('Flute Spot 3', 'Light World'), - ('Flute Spot 4', 'Light World'), - ('Flute Spot 5', 'Light World'), - ('Flute Spot 6', 'Desert Teleporter Ledge'), - ('Flute Spot 7', 'Light World'), - ('Flute Spot 8', 'Light World'), - ('LW Flute', 'Flute Sky'), - ('NWLW Flute', 'Flute Sky'), - ('ZLW Flute', 'Flute Sky'), - ('DM Flute', 'Flute Sky'), - ('EDM Flute', 'Flute Sky'), - - # portals - ('Death Mountain Teleporter', 'West Dark Death Mountain (Bottom)'), - ('East Death Mountain Teleporter', 'East Dark Death Mountain (Bottom)'), - ('Turtle Rock Teleporter', 'Turtle Rock (Top)'), - ('Kakariko Teleporter', 'West Dark World'), - ('Castle Gate Teleporter', 'East Dark World'), - ('East Hyrule Teleporter', 'East Dark World'), - ('South Hyrule Teleporter', 'South Dark World'), - ('Desert Teleporter', 'Dark Desert'), - ('Lake Hylia Teleporter', 'Dark Lake Hylia Central Island') - ] - -inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), - ('Old Man S&Q', 'West Dark Death Mountain (Bottom)'), - ('Other World S&Q', 'Hyrule Castle Ledge'), - - # flute - ('Flute Spot 1', 'West Dark Death Mountain (Bottom)'), - ('Flute Spot 2', 'Northeast Dark World'), - ('Flute Spot 3', 'West Dark World'), - ('Flute Spot 4', 'South Dark World'), - ('Flute Spot 5', 'East Dark World'), - ('Flute Spot 6', 'Dark Desert Ledge'), - ('Flute Spot 7', 'South Dark World'), - ('Flute Spot 8', 'Southeast Dark World'), - ('DDM Flute', 'Flute Sky'), - ('NEDW Flute', 'Flute Sky'), - ('WDW Flute', 'Flute Sky'), - ('SDW Flute', 'Flute Sky'), - ('EDW Flute', 'Flute Sky'), - ('DD Flute', 'Flute Sky'), - ('DLHL Flute', 'Flute Sky'), - ('EDDM Flute', 'Flute Sky'), - ('Dark Grassy Lawn Flute', 'Flute Sky'), - ('Hammer Peg Area Flute', 'Flute Sky'), - - # modified terrain - ('Spectacle Rock Approach', 'Spectacle Rock'), - ('Spectacle Rock Leave', 'West Death Mountain (Top)'), - ('Floating Island Bridge (West)', 'East Death Mountain (Top)'), - ('Floating Island Bridge (East)', 'Death Mountain Floating Island'), - ('Graveyard Ladder (Top)', 'Light World'), - ('Graveyard Ladder (Bottom)', 'Graveyard Ledge'), - ('Mimic Cave Ledge Access', 'Mimic Cave Ledge'), - ('Mimic Cave Ledge Drop', 'East Death Mountain (Bottom)'), - ('Checkerboard Ledge Approach', 'Desert Checkerboard Ledge'), - ('Checkerboard Ledge Leave', 'Light World'), - ('Cave 45 Approach', 'Cave 45 Ledge'), - ('Cave 45 Leave', 'Light World'), - ('Lake Hylia Island Pier', 'Lake Hylia Island'), - ('Bombos Tablet Ladder (Top)', 'Light World'), - ('Bombos Tablet Ladder (Bottom)', 'Bombos Tablet Ledge'), - ('Dark Death Mountain Ladder (Top)', 'West Dark Death Mountain (Bottom)'), - ('Dark Death Mountain Ladder (Bottom)', 'Dark Death Mountain (Top)'), - ('Turtle Rock Tail Drop', 'Turtle Rock (Top)'), - ('Ice Palace Approach', 'Dark Lake Hylia Central Island'), - - # portals - ('Dark Death Mountain Teleporter (West)', 'West Death Mountain (Bottom)'), - ('East Dark Death Mountain Teleporter (Bottom)', 'East Death Mountain (Bottom)'), - ('East Dark Death Mountain Teleporter (Top)', 'East Death Mountain (Top)'), - ('West Dark World Teleporter', 'Light World'), - ('Post Aga Teleporter', 'Light World'), - ('East Dark World Teleporter', 'Light World'), - ('South Dark World Teleporter', 'Light World'), - ('Dark Desert Teleporter', 'Light World'), - ('Dark Lake Hylia Teleporter', 'Lake Hylia Central Island') - ] - # non-shuffled entrance links default_connections = {'Lost Woods Gamble': 'Lost Woods Gamble', 'Lost Woods Hideout Drop': 'Lost Woods Hideout (top)', @@ -2485,8 +2283,8 @@ default_connections = {'Lost Woods Gamble': 'Lost Woods Gamble', 'Dark Lake Hylia Fairy': 'Dark Lake Hylia Healer Fairy', 'East Dark World Hint': 'East Dark World Hint', 'Mire Shed': 'Mire Shed', - 'Dark Desert Fairy': 'Dark Desert Healer Fairy', - 'Dark Desert Hint': 'Dark Desert Hint', + 'Mire Fairy': 'Mire Healer Fairy', + 'Mire Hint': 'Mire Hint', 'Hype Cave': 'Hype Cave', 'Dark Lake Hylia Shop': 'Dark Lake Hylia Shop', 'Dark Lake Hylia Ledge Fairy': 'Dark Lake Hylia Ledge Healer Fairy', @@ -2544,19 +2342,19 @@ default_dungeon_connections = [('Hyrule Castle Entrance (South)', 'Hyrule Castle ('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 (South)', 'Desert Stairs'), ('Desert Palace Exit (West)', 'Desert Ledge'), - ('Desert Palace Exit (East)', 'Desert Palace Mouth'), - ('Desert Palace Exit (North)', 'Desert Palace Entrance (North) Spot'), + ('Desert Palace Exit (East)', 'Desert Mouth'), + ('Desert Palace Exit (North)', 'Desert Ledge Keep'), ('Eastern Palace', 'Eastern Portal'), - ('Eastern Palace Exit', 'Light World'), + ('Eastern Palace Exit', 'Eastern Palace Area'), ('Tower of Hera', 'Hera Portal'), ('Tower of Hera Exit', 'West Death Mountain (Top)'), ('Palace of Darkness', 'Palace of Darkness Portal'), - ('Palace of Darkness Exit', 'East Dark World'), + ('Palace of Darkness Exit', 'Palace of Darkness Area'), ('Swamp Palace', 'Swamp Portal'), # requires additional patch for flooding moat if moved - ('Swamp Palace Exit', 'South Dark World'), + ('Swamp Palace Exit', 'Swamp 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'), @@ -2570,13 +2368,13 @@ default_dungeon_connections = [('Hyrule Castle Entrance (South)', 'Hyrule Castle ('Skull Woods Final Section', 'Skull 3 Portal'), ('Skull Woods Final Section Exit', 'Skull Woods Forest (West)'), ('Thieves Town', 'Thieves Town Portal'), - ('Thieves Town Exit', 'West Dark World'), + ('Thieves Town Exit', 'Village of Outcasts'), ('Ice Palace', 'Ice Portal'), - ('Ice Palace Exit', 'Dark Lake Hylia Central Island'), + ('Ice Palace Exit', 'Ice Palace Area'), ('Misery Mire', 'Mire Portal'), - ('Misery Mire Exit', 'Dark Desert'), + ('Misery Mire Exit', 'Mire Area'), ('Turtle Rock', 'Turtle Rock Main Portal'), - ('Turtle Rock Exit (Front)', 'Dark Death Mountain (Top)'), + ('Turtle Rock Exit (Front)', 'Turtle Rock Area'), ('Dark Death Mountain Ledge (West)', 'Turtle Rock Lazy Eyes Portal'), ('Dark Death Mountain Ledge (East)', 'Turtle Rock Chest Portal'), ('Turtle Rock Ledge Exit (West)', 'Dark Death Mountain Ledge'), @@ -2588,23 +2386,23 @@ default_dungeon_connections = [('Hyrule Castle Entrance (South)', 'Hyrule Castle open_default_dungeon_connections = [('Agahnims Tower', 'Agahnims Tower Portal'), ('Agahnims Tower Exit', 'Hyrule Castle Ledge'), ('Ganons Tower', 'Ganons Tower Portal'), - ('Ganons Tower Exit', 'Dark Death Mountain (Top)') + ('Ganons Tower Exit', 'West Dark Death Mountain (Top)') ] inverted_default_dungeon_connections = [('Agahnims Tower', 'Ganons Tower Portal'), - ('Agahnims Tower Exit', 'Dark Death Mountain (Top)'), + ('Agahnims Tower Exit', 'West Dark Death Mountain (Top)'), ('Ganons Tower', 'Agahnims Tower Portal'), ('Ganons Tower Exit', 'Hyrule Castle Ledge') ] indirect_connections = { - 'Turtle Rock (Top)': 'Turtle Rock', - 'East Dark World': 'Pyramid Fairy', + 'Turtle Rock Ledge': 'Turtle Rock', + 'Pyramid Area': 'Pyramid Fairy', 'Big Bomb Shop': 'Pyramid Fairy', - 'Dark Desert': 'Pyramid Fairy', - 'West Dark World': 'Pyramid Fairy', - 'South Dark World': 'Pyramid Fairy', - 'Light World': 'Pyramid Fairy', + 'Mire Area': 'Pyramid Fairy', + #'West Dark World': 'Pyramid Fairy', + 'Big Bomb Shop Area': 'Pyramid Fairy', + #'Light World': 'Pyramid Fairy', 'Old Man Cave (East)': 'Old Man S&Q' } # format: @@ -2745,8 +2543,8 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c, 0x0506, 0x0a9a, 0x0832, 0 'Dark Potion Shop': (0x6E, (0x010f, 0x56, 0x080e, 0x04f4, 0x0c66, 0x0548, 0x0cd8, 0x0563, 0x0ce3, 0x0a, 0xf6, 0x0000, 0x0000)), 'Archery Game': (0x58, (0x0111, 0x69, 0x069e, 0x0ac4, 0x02ea, 0x0b18, 0x0368, 0x0b33, 0x036f, 0x0a, 0xf6, 0x09AC, 0x0000)), 'Mire Shed': (0x5E, (0x010d, 0x70, 0x0384, 0x0c69, 0x001e, 0x0cb6, 0x0098, 0x0cd6, 0x00a3, 0x07, 0xf9, 0x0000, 0x0000)), - 'Dark Desert Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000)), - 'Dark Desert Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000)), + 'Mire Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000)), + 'Mire Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000)), 'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000)), 'Dark Death Mountain Shop': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000)), 'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000)), @@ -2832,7 +2630,7 @@ exit_ids = {'Links House Exit': (0x01, 0x00), 'Desert Healer Fairy': 0x5E, 'Dark Lake Hylia Healer Fairy': 0x5E, 'Dark Lake Hylia Ledge Healer Fairy': 0x5E, - 'Dark Desert Healer Fairy': 0x5E, + 'Mire Healer Fairy': 0x5E, 'Dark Death Mountain Healer Fairy': 0x5E, 'Fortune Teller (Light)': 0x65, 'Lake Hylia Fortune Teller': 0x65, @@ -2887,7 +2685,7 @@ exit_ids = {'Links House Exit': (0x01, 0x00), 'Fortune Teller (Dark)': 0x66, 'Archery Game': 0x59, 'Mire Shed': 0x5F, - 'Dark Desert Hint': 0x62, + 'Mire Hint': 0x62, 'Spike Cave': 0x41, 'Mimic Cave': 0x4F, 'Kakariko Well (top)': 0x80, @@ -3023,8 +2821,8 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Dark Potion Shop': (0xc80, 0x4c0), 'Archery Game': (0x2f0, 0xaf0), 'Mire Shed': (0x060, 0xc90), - 'Dark Desert Hint': (0x2e0, 0xd00), - 'Dark Desert Fairy': (0x1c0, 0xc90), + 'Mire Hint': (0x2e0, 0xd00), + 'Mire Fairy': (0x1c0, 0xc90), 'Spike Cave': (0x860, 0x180), 'Dark Death Mountain Shop': (0xd80, 0x180), 'Dark Death Mountain Fairy': (0x620, 0x2c0), diff --git a/test/inverted/TestInverted.py b/test/inverted/TestInverted.py index 75c945e6..cc3eb68a 100644 --- a/test/inverted/TestInverted.py +++ b/test/inverted/TestInverted.py @@ -2,6 +2,7 @@ from BaseClasses import World from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool +from OverworldShuffle import link_overworld from EntranceShuffle import link_entrances from ItemList import generate_itempool, difficulties from Items import ItemFactory @@ -23,6 +24,7 @@ class TestInverted(TestBase): create_doors(self.world, 1) create_rooms(self.world, 1) create_dungeons(self.world, 1) + link_overworld(self.world, 1) link_entrances(self.world, 1) link_doors(self.world, 1) generate_itempool(self.world, 1) diff --git a/test/inverted_owg/TestInvertedOWG.py b/test/inverted_owg/TestInvertedOWG.py index 2453d7ab..9c584c25 100644 --- a/test/inverted_owg/TestInvertedOWG.py +++ b/test/inverted_owg/TestInvertedOWG.py @@ -2,6 +2,7 @@ from BaseClasses import World from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool +from OverworldShuffle import link_overworld from EntranceShuffle import link_entrances from ItemList import generate_itempool, difficulties from Items import ItemFactory @@ -24,6 +25,7 @@ class TestInvertedOWG(TestBase): create_doors(self.world, 1) create_rooms(self.world, 1) create_dungeons(self.world, 1) + link_overworld(self.world, 1) create_owg_connections(self.world, 1) link_entrances(self.world, 1) link_doors(self.world, 1) diff --git a/test/owg/TestVanillaOWG.py b/test/owg/TestVanillaOWG.py index c5bd18d0..8c245125 100644 --- a/test/owg/TestVanillaOWG.py +++ b/test/owg/TestVanillaOWG.py @@ -2,6 +2,7 @@ from BaseClasses import World from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool +from OverworldShuffle import link_overworld from EntranceShuffle import link_entrances from ItemList import difficulties, generate_itempool from Items import ItemFactory @@ -24,6 +25,7 @@ class TestVanillaOWG(TestBase): create_doors(self.world, 1) create_rooms(self.world, 1) create_dungeons(self.world, 1) + link_overworld(self.world, 1) link_entrances(self.world, 1) link_doors(self.world, 1) create_owg_connections(self.world, 1) diff --git a/test/vanilla/TestVanilla.py b/test/vanilla/TestVanilla.py index 80bbc7b9..f1bd23f2 100644 --- a/test/vanilla/TestVanilla.py +++ b/test/vanilla/TestVanilla.py @@ -2,6 +2,7 @@ from BaseClasses import World from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool +from OverworldShuffle import link_overworld from EntranceShuffle import link_entrances from ItemList import difficulties, generate_itempool from Items import ItemFactory @@ -23,6 +24,7 @@ class TestVanilla(TestBase): create_doors(self.world, 1) create_rooms(self.world, 1) create_dungeons(self.world, 1) + link_overworld(self.world, 1) link_entrances(self.world, 1) link_doors(self.world, 1) generate_itempool(self.world, 1)