From 118adabeb116e11e4ce613b8a7118906203bd62d Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 30 Dec 2022 06:17:54 -0600 Subject: [PATCH] Changing mirror exits to be dynamically created --- EntranceShuffle.py | 59 +--------------- Main.py | 3 + OverworldShuffle.py | 100 +++++++++++++++++++++++++++ Regions.py | 81 ++++++++++------------ Rules.py | 53 -------------- source/overworld/EntranceShuffle2.py | 59 +--------------- 6 files changed, 145 insertions(+), 210 deletions(-) create mode 100644 OverworldShuffle.py diff --git a/EntranceShuffle.py b/EntranceShuffle.py index ebd4c283..2e5162e4 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -2236,32 +2236,7 @@ open_mandatory_connections = [('Sanctuary S&Q', 'Sanctuary'), ('East Hyrule Teleporter', 'East Dark World'), ('South Hyrule Teleporter', 'South Dark World'), ('Desert Teleporter', 'Dark Desert'), - ('Lake Hylia Teleporter', 'Dark Lake Hylia Central Island'), - - # mirror - ('Spectacle Rock Mirror Spot', 'Spectacle Rock'), - ('East Death Mountain (Top) Mirror Spot', 'East Death Mountain (Top)'), - ('Dark Floating Island Mirror Spot', 'Death Mountain Floating Island'), - ('Spiral Cave Mirror Spot', 'Spiral Cave Ledge'), - ('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'), - ('Isolated Ledge Mirror Spot', 'Fairy Ascension Ledge'), - ('Fairy Ascension Mirror Spot', 'Fairy Ascension Plateau'), - ('Bumper Cave Ledge Mirror Spot', 'Death Mountain Return Ledge'), - ('Bumper Cave Entrance Mirror Spot', 'Death Mountain Entrance'), - ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), - ('Kings Grave Mirror Spot', 'Kings Grave Area'), - ('Dark Grassy Lawn Mirror Spot', 'Bush Covered Lawn'), - ('Hyrule Castle Ledge Mirror Spot', 'Hyrule Castle Ledge'), - ('Bat Cave Drop Ledge Mirror Spot', 'Bat Cave Ledge'), - ('Dig Game Mirror Spot', 'Maze Race Ledge'), - ('Desert Ledge Rocks Mirror Spot', 'Desert Palace Entrance (North) Spot'), - ('Desert Ledge Mirror Spot', 'Desert Ledge'), - ('Mire To Desert Stairs Mirror Spot', 'Desert Palace Stairs'), - ('Checkerboard Ledge Mirror Spot', 'Desert Checkerboard Ledge'), - ('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'), - ('Cave 45 Mirror Spot', 'Cave 45 Ledge'), - ('Lake Hylia Island Mirror Spot', 'Lake Hylia Island'), - ('Lake Hylia Central Island Mirror Spot', 'Lake Hylia Central Island') + ('Lake Hylia Teleporter', 'Dark Lake Hylia Central Island') ] inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), @@ -2318,37 +2293,7 @@ inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), ('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'), - - # mirror - ('Skull Woods Mirror Spot', 'Skull Woods Forest (West)'), - ('West Dark World Mirror Spot', 'West Dark World'), - ('Death Mountain (Top) Mirror Spot', 'Dark Death Mountain (Top)'), - ('Death Mountain Mirror Spot', 'West Dark Death Mountain (Bottom)'), - ('East Death Mountain Mirror Spot (Top)', 'Dark Death Mountain (Top)'), - ('Floating Island Mirror Spot', 'Dark Death Mountain Floating Island'), - ('Dark Death Mountain Ledge Mirror Spot (East)', 'Dark Death Mountain Ledge'), - ('Dark Death Mountain Ledge Mirror Spot (West)', 'Dark Death Mountain Ledge'), - ('Laser Bridge Mirror Spot', 'Dark Death Mountain Isolated Ledge'), - ('East Death Mountain Mirror Spot (Bottom)', 'East Dark Death Mountain (Bottom)'), - ('Mountain Exit Ledge Mirror Spot', 'Bumper Cave Ledge'), - ('Mountain Entrance Mirror Spot', 'Bumper Cave Entrance'), - ('Catfish Mirror Spot', 'Catfish Area'), - ('Graveyard Cave Mirror Spot', 'West Dark World'), - ('Potion Shop Mirror Spot', 'Northeast Dark World'), - ('Bush Covered Lawn Mirror Spot', 'Dark Grassy Lawn'), - ('Bomb Hut Mirror Spot', 'West Dark World'), - ('Pyramid Uncle Mirror Spot', 'East Dark World'), - ('East Dark World Mirror Spot', 'East Dark World'), - ('Hammer Peg Area Mirror Spot', 'Hammer Peg Area'), - ('Maze Race Mirror Spot', 'South Dark World'), - ('South Dark World Mirror Spot', 'South Dark World'), - ('Mire Mirror Spot', 'Dark Desert'), - ('Dark Desert Ledge Mirror Spot', 'Dark Desert'), - ('Desert Palace Stairs Mirror Spot', 'Dark Desert'), - ('Desert Palace North Mirror Spot', 'Dark Desert'), - ('Ice Lake Central Island Mirror Spot', 'Lake Hylia Central Island'), - ('Shopping Mall Mirror Spot', 'Southeast Dark World') + ('Dark Lake Hylia Teleporter', 'Lake Hylia Central Island') ] # non-shuffled entrance links diff --git a/Main.py b/Main.py index ebfa461e..58669567 100644 --- a/Main.py +++ b/Main.py @@ -15,6 +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 EntranceShuffle import link_entrances from Rom import patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, LocalRom, JsonRom, get_hash_string from Doors import create_doors @@ -217,6 +218,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): + create_dynamic_exits(world, player) if world.experimental[player] or world.shuffle[player] in ['lite', 'lean'] or world.shuffletavern[player] or (world.customizer and world.customizer.get_entrances()): link_entrances_new(world, player) else: @@ -485,6 +487,7 @@ def copy_world(world): for player in range(1, world.players + 1): create_regions(ret, player) + create_dynamic_exits(ret, player) create_dungeon_regions(ret, player) create_shops(ret, player) create_rooms(ret, player) diff --git a/OverworldShuffle.py b/OverworldShuffle.py new file mode 100644 index 00000000..64be6969 --- /dev/null +++ b/OverworldShuffle.py @@ -0,0 +1,100 @@ +from BaseClasses import RegionType, Entrance + +def get_mirror_exit_name(from_region, to_region): + if from_region in mirror_connections and to_region in mirror_connections[from_region]: + if len(mirror_connections[from_region]) == 1: + return f'Mirror From {from_region}' + else: + return f'Mirror To {to_region}' + return None + +def create_mirror_exits(world, player): + mirror_exits = set() + for region in (r for r in world.regions if r.player == player and r.name not in ['Zoras Domain', 'Master Sword Meadow', 'Hobo Bridge']): + if region.type == (RegionType.DarkWorld if world.mode[player] != 'inverted' else RegionType.LightWorld): + if region.name in mirror_connections: + for region_dest_name in mirror_connections[region.name]: + exitname = get_mirror_exit_name(region.name, region_dest_name) + + assert exitname not in mirror_exits, f'Mirror Exit with name already exists: {exitname}' + + 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 + 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) + exit.connect(to_region) + region.exits.append(exit) + + mirror_exits.add(exitname) + +def create_dynamic_exits(world, player): + create_mirror_exits(world, player) + world.initialize_regions() + + +mirror_connections = { + 'West Dark Death Mountain (Bottom)': ['Spectacle Rock'], + 'Dark Death Mountain (Top)': ['East Death Mountain (Top)'], + + 'Dark Death Mountain Floating Island': ['Death Mountain Floating Island'], + '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'], + + 'West Dark World': ['Graveyard Ledge', 'Kings Grave Area'], + + 'Bumper Cave Ledge': ['Death Mountain Return Ledge'], + 'Bumper Cave Entrance': ['Death Mountain Entrance'], + + 'Dark Grassy Lawn': ['Bush Covered Lawn'], + + 'Hammer Peg Area': ['Bat Cave Ledge'], + + 'East Dark World': ['Hyrule Castle Ledge'], + + 'Dark Desert': ['Desert Ledge', 'Desert Checkerboard Ledge', 'Desert Palace Stairs', 'Desert Palace Entrance (North) Spot'], + + 'South Dark World': ['Maze Race Ledge', 'Cave 45 Ledge', 'Bombos Tablet Ledge'], + + 'Dark Lake Hylia Water': ['Lake Hylia Island'], + 'Dark Lake Hylia Central Island': ['Lake Hylia Central Island'], + + + 'Light World': ['Skull Woods Forest (West)', 'West Dark World', 'Hammer Peg Area', 'East Dark World', 'South Dark World', 'Dark Desert', 'Southeast Dark World'], + + 'West Death Mountain (Top)': ['Dark Death Mountain (Top)'], + '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'], + 'Spiral Cave Ledge': ['Dark Death Mountain Ledge'], + 'Mimic Cave Ledge': ['Dark Death Mountain Ledge'], + 'Fairy Ascension Ledge': ['Dark Death Mountain Isolated Ledge'], + 'East Death Mountain (Bottom)': ['East Dark Death Mountain (Bottom)'], + + 'Death Mountain Return Ledge': ['Bumper Cave Ledge'], + 'Death Mountain Entrance': ['Bumper Cave Entrance'], + + 'Northeast Light World': ['Catfish Area'], + + 'Graveyard Ledge': ['West Dark World'], + + 'Potion Shop Area': ['Northeast Dark World'], + + 'Bush Covered Lawn': ['Dark Grassy Lawn'], + 'Bomb Hut Area': ['West Dark World'], + + 'Hyrule Castle Secret Entrance Area': ['East Dark World'], + + 'Maze Race Ledge': ['South Dark World'], + + 'Desert Palace Stairs': ['Dark Desert'], + 'Desert Ledge': ['Dark Desert'], + 'Desert Palace Entrance (North) Spot': ['Dark Desert'], + + 'Lake Hylia Central Island': ['Dark Lake Hylia Central Island'] +} \ No newline at end of file diff --git a/Regions.py b/Regions.py index 53d056ca..ca4ae24e 100644 --- a/Regions.py +++ b/Regions.py @@ -23,45 +23,42 @@ def create_regions(world, player): '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', 'Skull Woods Mirror Spot', 'West Dark World Mirror Spot', 'Hammer Peg Area Mirror Spot', - 'East Dark World Mirror Spot', 'South Dark World Mirror Spot', 'Mire Mirror Spot', 'Shopping Mall Mirror Spot']), + '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)', 'Death Mountain (Top) Mirror Spot']), + 'DM Hammer Bridge (West)']), 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', 'Death Mountain Mirror Spot']), + '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', 'East Death Mountain Mirror Spot (Top)']), - create_lw_region(player, 'Death Mountain Floating Island', ['Floating Island'], ['Floating Island Bridge (West)', 'Floating Island Mirror Spot']), - create_lw_region(player, 'Spiral Cave Ledge', None, ['Spiral Cave', 'Spiral Cave Ledge Drop', 'Dark Death Mountain Ledge Mirror Spot (West)']), - create_lw_region(player, 'Mimic Cave Ledge', None, ['Mimic Cave', 'Mimic Cave Ledge Drop', 'Dark Death Mountain Ledge Mirror Spot (East)']), - create_lw_region(player, 'Fairy Ascension Ledge', None, ['Fairy Ascension Cave (Top)', 'Fairy Ascension Ledge Drop', 'Laser Bridge Mirror Spot']), + 'Turtle Rock Teleporter']), + 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, 'Fairy Ascension Ledge', None, ['Fairy Ascension Cave (Top)', 'Fairy Ascension Ledge Drop']), 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', 'East Death Mountain Mirror Spot (Bottom)']), + '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', 'Mountain Exit Ledge Mirror Spot'], 'a ledge in the foothills'), - create_lw_region(player, 'Death Mountain Entrance', None, ['Old Man Cave (West)', 'Death Mountain Entrance Drop', 'Mountain Entrance Mirror Spot']), - create_lw_region(player, 'Northeast Light World', None, ['Zoras Domain', 'Potion Shop Rock (North)', 'Northeast Light World Water Drop', 'Catfish Mirror Spot']), + 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']), - create_lw_region(player, 'Graveyard Ledge', None, ['Graveyard Cave', 'Graveyard Ledge Drop', 'Graveyard Ladder (Top)', 'Graveyard Cave Mirror Spot']), + 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', 'Potion Shop Mirror Spot']), - create_lw_region(player, 'Bush Covered Lawn', None, ['Bush Covered House', 'Kakariko Yard Bush (North)', 'Bush Covered Lawn Mirror Spot']), - create_lw_region(player, 'Bomb Hut Area', None, ['Light World Bomb Hut', 'Kakariko Southwest Bush (South)', 'Bomb Hut Mirror Spot']), + 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)', 'Pyramid Uncle Mirror Spot']), + create_lw_region(player, 'Hyrule Castle Secret Entrance Area', 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', 'Maze Race Mirror Spot'], 'a race against time'), - create_lw_region(player, 'Desert Palace Stairs', None, ['Desert Palace Entrance (South)', 'Desert Palace Stairs Mirror Spot']), + 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'), - create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (West)', 'Desert Ledge Rocks (Outer)', 'Desert Ledge Drop', 'Dark Desert Ledge Mirror Spot'], 'the desert ledge'), - create_lw_region(player, 'Desert Palace Entrance (North) Spot', None, ['Desert Palace Entrance (North)', 'Desert Ledge Rocks (Inner)', 'Desert Palace North Mirror Spot'], 'the desert ledge'), + 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 Checkerboard Ledge', None, ['Checkerboard Cave', 'Checkerboard Ledge Drop', 'Checkerboard Ledge Leave']), 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)']), @@ -69,50 +66,48 @@ def create_regions(world, player): 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', 'Ice Lake Central Island Mirror Spot']), + 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_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', 'Spectacle Rock Mirror Spot']), + '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', 'East Death Mountain (Top) Mirror Spot']), - create_dw_region(player, 'Dark Death Mountain Floating Island', None, ['Hookshot Cave Back Entrance', 'Floating Island Drop', 'Dark Floating Island Mirror Spot'], 'a dark island'), - create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Mimic Cave Mirror Spot', 'Spiral Cave Mirror Spot'], 'a dark ledge'), - create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Turtle Rock Isolated Ledge Entrance', 'Isolated Ledge Mirror Spot'], 'a dark vista'), + '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'), + 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 (Bushes)', None, ['Fairy Ascension Mirror Spot']), + 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', 'Graveyard Ledge Mirror Spot', 'Kings Grave Mirror Spot']), + 'West Dark World Teleporter', 'WDW Flute']), 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, 'Bumper Cave Ledge', ['Bumper Cave Ledge'], ['Bumper Cave (Top)', 'Bumper Cave Ledge Drop', 'Bumper Cave Ledge Mirror Spot'], 'a ledge with an item'), - create_dw_region(player, 'Bumper Cave Entrance', None, ['Bumper Cave (Bottom)', 'Bumper Cave Entrance Drop', 'Bumper Cave Entrance Mirror Spot']), - create_dw_region(player, 'Dark Grassy Lawn', None, ['Dark World Shop', 'Grassy Lawn Pegs (Top)', 'Dark Grassy Lawn Flute', 'Dark Grassy Lawn Mirror Spot']), - create_dw_region(player, 'Hammer Peg Area', ['Dark Blacksmith Ruins'], ['Hammer Peg Cave', 'Peg Area Rocks (Right)', 'Hammer Peg Area Flute', 'Bat Cave Drop Ledge Mirror Spot']), + 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', 'Hyrule Castle Ledge Mirror Spot']), + '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', 'Checkerboard Ledge Mirror Spot', - 'Desert Ledge Mirror Spot', 'Mire To Desert Stairs Mirror Spot', 'Desert Ledge Rocks Mirror Spot']), + 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', 'Dig Game Mirror Spot', 'Cave 45 Mirror Spot', 'Bombos Tablet Mirror Spot']), - create_dw_region(player, 'Dark Lake Hylia Water', None, ['Northeast Dark World Pier', 'East Dark World Pier', 'Southeast Dark World Pier', - 'Ice Palace Approach', 'Lake Hylia Island Mirror Spot']), + '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', 'Lake Hylia Central Island Mirror Spot']), + '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']), diff --git a/Rules.py b/Rules.py index 69c4e21c..e23aa682 100644 --- a/Rules.py +++ b/Rules.py @@ -854,30 +854,6 @@ def pot_rules(world, player): def ow_inverted_rules(world, player): if world.mode[player] != 'inverted': - set_rule(world.get_entrance('Spectacle Rock Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('East Death Mountain (Top) Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Dark Floating Island Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Spiral Cave Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Mimic Cave Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Isolated Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Fairy Ascension Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Bumper Cave Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Bumper Cave Entrance Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Graveyard Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Kings Grave Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Dark Grassy Lawn Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Hyrule Castle Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Bat Cave Drop Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Dig Game Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Desert Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Desert Ledge Rocks Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Mire To Desert Stairs Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Checkerboard Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Bombos Tablet Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Cave 45 Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Lake Hylia Island Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player) and state.has_Mirror(player)) # force flipper rule since fake flipper cannot mirror - set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) - 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('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 @@ -892,35 +868,6 @@ def ow_inverted_rules(world, 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.open_pyramid[player] or world.goal[player] == 'trinity' or state.has('Beat Agahnim 2', player)) else: - set_rule(world.get_entrance('Skull Woods Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('West Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Death Mountain (Top) Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Death Mountain Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('East Death Mountain Mirror Spot (Top)', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Floating Island Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Dark Death Mountain Ledge Mirror Spot (West)', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Dark Death Mountain Ledge Mirror Spot (East)', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Laser Bridge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('East Death Mountain Mirror Spot (Bottom)', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Mountain Exit Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Mountain Entrance Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Catfish Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Graveyard Cave Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Potion Shop Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Bomb Hut Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Bush Covered Lawn Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Pyramid Uncle Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('East Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Hammer Peg Area Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('South Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Mire Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Dark Desert Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Desert Palace North Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Desert Palace Stairs Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Ice Lake Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Shopping Mall Mirror Spot', player), lambda state: state.has_Mirror(player)) - 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('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)) diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index d13b4416..8445c1ae 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -2025,32 +2025,7 @@ open_mandatory_connections = [('Sanctuary S&Q', 'Sanctuary'), ('East Hyrule Teleporter', 'East Dark World'), ('South Hyrule Teleporter', 'South Dark World'), ('Desert Teleporter', 'Dark Desert'), - ('Lake Hylia Teleporter', 'Dark Lake Hylia Central Island'), - - # mirror - ('Spectacle Rock Mirror Spot', 'Spectacle Rock'), - ('East Death Mountain (Top) Mirror Spot', 'East Death Mountain (Top)'), - ('Dark Floating Island Mirror Spot', 'Death Mountain Floating Island'), - ('Spiral Cave Mirror Spot', 'Spiral Cave Ledge'), - ('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'), - ('Isolated Ledge Mirror Spot', 'Fairy Ascension Ledge'), - ('Fairy Ascension Mirror Spot', 'Fairy Ascension Plateau'), - ('Bumper Cave Ledge Mirror Spot', 'Death Mountain Return Ledge'), - ('Bumper Cave Entrance Mirror Spot', 'Death Mountain Entrance'), - ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), - ('Kings Grave Mirror Spot', 'Kings Grave Area'), - ('Dark Grassy Lawn Mirror Spot', 'Bush Covered Lawn'), - ('Hyrule Castle Ledge Mirror Spot', 'Hyrule Castle Ledge'), - ('Bat Cave Drop Ledge Mirror Spot', 'Bat Cave Ledge'), - ('Dig Game Mirror Spot', 'Maze Race Ledge'), - ('Desert Ledge Rocks Mirror Spot', 'Desert Palace Entrance (North) Spot'), - ('Desert Ledge Mirror Spot', 'Desert Ledge'), - ('Mire To Desert Stairs Mirror Spot', 'Desert Palace Stairs'), - ('Checkerboard Ledge Mirror Spot', 'Desert Checkerboard Ledge'), - ('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'), - ('Cave 45 Mirror Spot', 'Cave 45 Ledge'), - ('Lake Hylia Island Mirror Spot', 'Lake Hylia Island'), - ('Lake Hylia Central Island Mirror Spot', 'Lake Hylia Central Island') + ('Lake Hylia Teleporter', 'Dark Lake Hylia Central Island') ] inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), @@ -2107,37 +2082,7 @@ inverted_mandatory_connections = [('Sanctuary S&Q', 'Dark Sanctuary Hint'), ('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'), - - # mirror - ('Skull Woods Mirror Spot', 'Skull Woods Forest (West)'), - ('West Dark World Mirror Spot', 'West Dark World'), - ('Death Mountain (Top) Mirror Spot', 'Dark Death Mountain (Top)'), - ('Death Mountain Mirror Spot', 'West Dark Death Mountain (Bottom)'), - ('East Death Mountain Mirror Spot (Top)', 'Dark Death Mountain (Top)'), - ('Floating Island Mirror Spot', 'Dark Death Mountain Floating Island'), - ('Dark Death Mountain Ledge Mirror Spot (East)', 'Dark Death Mountain Ledge'), - ('Dark Death Mountain Ledge Mirror Spot (West)', 'Dark Death Mountain Ledge'), - ('Laser Bridge Mirror Spot', 'Dark Death Mountain Isolated Ledge'), - ('East Death Mountain Mirror Spot (Bottom)', 'East Dark Death Mountain (Bottom)'), - ('Mountain Exit Ledge Mirror Spot', 'Bumper Cave Ledge'), - ('Mountain Entrance Mirror Spot', 'Bumper Cave Entrance'), - ('Catfish Mirror Spot', 'Catfish Area'), - ('Graveyard Cave Mirror Spot', 'West Dark World'), - ('Potion Shop Mirror Spot', 'Northeast Dark World'), - ('Bush Covered Lawn Mirror Spot', 'Dark Grassy Lawn'), - ('Bomb Hut Mirror Spot', 'West Dark World'), - ('Pyramid Uncle Mirror Spot', 'East Dark World'), - ('East Dark World Mirror Spot', 'East Dark World'), - ('Hammer Peg Area Mirror Spot', 'Hammer Peg Area'), - ('Maze Race Mirror Spot', 'South Dark World'), - ('South Dark World Mirror Spot', 'South Dark World'), - ('Mire Mirror Spot', 'Dark Desert'), - ('Dark Desert Ledge Mirror Spot', 'Dark Desert'), - ('Desert Palace Stairs Mirror Spot', 'Dark Desert'), - ('Desert Palace North Mirror Spot', 'Dark Desert'), - ('Ice Lake Central Island Mirror Spot', 'Lake Hylia Central Island'), - ('Shopping Mall Mirror Spot', 'Southeast Dark World') + ('Dark Lake Hylia Teleporter', 'Lake Hylia Central Island') ] # non-shuffled entrance links