diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 15e6907d..49548c90 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -1082,7 +1082,7 @@ def link_entrances(world, player): world.ganonstower_vanilla[player] = False def link_inverted_entrances(world, player): - # Link's house shuffled freely, Houlihan set in mandatory_connections + connect_exit(world, 'Chris Houlihan Room Exit', 'Pyramid Exit Ledge', player) Dungeon_Exits = Inverted_Dungeon_Exits_Base.copy() Cave_Exits = Cave_Exits_Base.copy() @@ -2939,6 +2939,7 @@ Inverted_Must_Exit_Invalid_Connections = defaultdict(set, { mandatory_connections = [('Links House S&Q', 'Links House'), ('Sanctuary S&Q', 'Sanctuary'), ('Old Man S&Q', 'Old Man House'), + ('Other World S&Q', 'Pyramid Area'), ('Flute Away', 'Flute Sky'), @@ -2967,9 +2968,9 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ] inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), - ('Dark Sanctuary S&Q', 'Inverted Dark Sanctuary'), + ('Sanctuary S&Q', 'Inverted Dark Sanctuary'), ('Old Man S&Q', 'Old Man House'), - ('Castle Ledge S&Q', 'Hyrule Castle Ledge'), + ('Other World S&Q', 'Hyrule Castle Ledge'), ('Lake Hylia Central Island Pier', 'Lake Hylia Central Island'), ('Lake Hylia Island Pier', 'Lake Hylia Island'), ('Lake Hylia Warp', 'Northeast Light World'), @@ -3127,14 +3128,15 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('Bomb Hut Inner Bushes', 'Light World'), ('Bomb Hut Outer Bushes', 'Bomb Hut Area'), ('Bomb Hut Mirror Spot', 'West Dark World')] + # non-shuffled entrance links default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), ("Blinds Hideout", "Blinds Hideout"), ('Dam', 'Dam'), ('Lumberjack House', 'Lumberjack House'), - ("Hyrule Castle Secret Entrance Drop", "Hyrule Castle Secret Entrance"), - ("Hyrule Castle Secret Entrance Stairs", "Hyrule Castle Secret Entrance"), - ("Hyrule Castle Secret Entrance Exit", "Hyrule Castle Courtyard"), + ('Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance'), + ('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance'), + ('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Courtyard Northeast'), ('Bonk Fairy (Light)', 'Bonk Fairy (Light)'), ('Lake Hylia Fairy', 'Lake Hylia Healer Fairy'), ('Lake Hylia Fortune Teller', 'Lake Hylia Fortune Teller'), @@ -3172,7 +3174,7 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), ('Kakariko Shop', 'Kakariko Shop'), ('Lost Woods Hideout Drop', 'Lost Woods Hideout (top)'), ('Lost Woods Hideout Stump', 'Lost Woods Hideout (bottom)'), - ('Lost Woods Hideout Exit', 'Lost Woods Area'), + ('Lost Woods Hideout Exit', 'Lost Woods East Area'), ('Lumberjack Tree Tree', 'Lumberjack Tree (top)'), ('Lumberjack Tree Cave', 'Lumberjack Tree (bottom)'), ('Lumberjack Tree Exit', 'Lumberjack Area'), @@ -3276,7 +3278,9 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), ('Pyramid Hole', 'Pyramid'), ('Pyramid Exit', 'Pyramid Exit Ledge'), - ('Pyramid Entrance', 'Bottom of Pyramid') + ('Pyramid Entrance', 'Bottom of Pyramid'), + ('Inverted Pyramid Hole', 'Pyramid'), + ('Inverted Pyramid Entrance', 'Bottom of Pyramid') ] inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), diff --git a/InvertedRegions.py b/InvertedRegions.py deleted file mode 100644 index f0a69eaa..00000000 --- a/InvertedRegions.py +++ /dev/null @@ -1,512 +0,0 @@ -import collections -from BaseClasses import RegionType -from Regions import create_lw_region, create_dw_region, create_cave_region, create_dungeon_region, create_menu_region - -# todo: shopsanity locations -def create_inverted_regions(world, player): - - world.regions += [ - create_menu_region(player, 'Menu', None, ['Links House S&Q', 'Dark Sanctuary S&Q', 'Old Man S&Q', 'Castle Ledge S&Q']), - create_lw_region(player, 'Light World', ['Mushroom', 'Bottle Merchant', 'Flute Spot', 'Sunken Treasure', 'Purple Chest', 'Bombos Tablet'], - ["Blinds Hideout", "Hyrule Castle Secret Entrance Drop", 'Kings Grave Outer Rocks', 'Dam', - 'Inverted Big Bomb Shop', 'Tavern North', 'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Kakariko Well Drop', 'Kakariko Well Cave', - 'Blacksmiths Hut', 'Bat Cave Drop Ledge', 'Bat Cave Cave', 'Sick Kids House', 'Hobo Bridge', 'Lost Woods Hideout Drop', 'Lost Woods Hideout Stump', - 'Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Mini Moldorm Cave', 'Ice Rod Cave', 'Lake Hylia Central Island Pier', 'Lake Hylia Island Pier', 'Lake Hylia Warp', - 'Bonk Rock Cave', 'Library', 'Two Brothers House (East)', 'Desert Palace Stairs', 'Eastern Palace', 'Master Sword Meadow', - 'Sanctuary', 'Sanctuary Grave', 'Death Mountain Entrance Rock', 'Light World River Drop', - '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 Shop', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', 'Cave Shop (Lake Hylia)', - 'Bonk Fairy (Light)', '50 Rupee Cave', 'Fortune Teller (Light)', 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Lumberjack House', 'Lake Hylia Fortune Teller', 'Kakariko Gamble Game', - 'East Dark World Mirror Spot', 'West Dark World Mirror Spot', 'South Dark World Mirror Spot', 'Cave 45', 'Checkerboard Cave', 'Mire Mirror Spot', 'Hammer Peg Area Mirror Spot', - 'Shopping Mall Mirror Spot', 'Skull Woods Mirror Spot', 'Inverted Pyramid Entrance','Hyrule Castle Entrance (South)', 'Secret Passage Outer Bushes', 'Bush Covered Lawn Outer Bushes', - 'Potion Shop Outer Bushes', 'Graveyard Cave Outer Bushes', 'Bomb Hut Outer Bushes']), - create_lw_region(player, 'Bush Covered Lawn', None, ['Bush Covered House', 'Bush Covered Lawn Inner Bushes', 'Bush Covered Lawn Mirror Spot']), - create_lw_region(player, 'Bomb Hut Area', None, ['Light World Bomb Hut', 'Bomb Hut Inner Bushes', 'Bomb Hut Mirror Spot']), - create_lw_region(player, 'Hyrule Castle Secret Entrance Area', None, ['Hyrule Castle Secret Entrance Stairs', 'Secret Passage Inner Bushes']), - create_lw_region(player, 'Death Mountain Entrance', None, ['Old Man Cave (West)', 'Death Mountain Entrance Drop', 'Bumper Cave Entrance Mirror Spot']), - create_lw_region(player, 'Lake Hylia Central Island', None, ['Capacity Upgrade', 'Lake Hylia Central Island Mirror Spot']), - create_cave_region(player, 'Blinds Hideout', 'a bounty of five items', ["Blind\'s Hideout - Top", - "Blind\'s Hideout - Left", - "Blind\'s Hideout - Right", - "Blind\'s Hideout - Far Left", - "Blind\'s Hideout - Far Right"]), - create_lw_region(player, 'Northeast Light World', None, ['Zoras River', 'Waterfall of Wishing Cave', 'Potion Shop Outer Rock', 'Catfish Mirror Spot', 'Northeast Light World Warp']), - create_lw_region(player, 'Waterfall of Wishing Cave', None, ['Waterfall of Wishing', 'Northeast Light World Return']), - create_lw_region(player, 'Potion Shop Area', None, ['Potion Shop', 'Potion Shop Inner Bushes', 'Potion Shop Inner Rock', 'Potion Shop Mirror Spot', 'Potion Shop River Drop']), - create_lw_region(player, 'Graveyard Cave Area', None, ['Graveyard Cave', 'Graveyard Cave Inner Bushes', 'Graveyard Cave Mirror Spot']), - create_lw_region(player, 'River', None, ['Light World Pier', 'Potion Shop Pier']), - create_cave_region(player, 'Hyrule Castle Secret Entrance', 'a drop\'s exit', ['Link\'s Uncle', 'Secret Passage'], ['Hyrule Castle Secret Entrance Exit']), - create_dungeon_region(player, 'Sewer Drop', 'a drop\'s exit', None, ['Sewer Drop']), # This exists only to be referenced for access checks - create_lw_region(player, 'Zoras River', ['King Zora', 'Zora\'s Ledge']), - create_cave_region(player, 'Waterfall of Wishing', 'a cave with two chests', ['Waterfall Fairy - Left', 'Waterfall Fairy - Right']), - create_lw_region(player, 'Kings Grave Area', None, ['Kings Grave', 'Kings Grave Inner Rocks']), - create_cave_region(player, 'Kings Grave', 'a cave with a chest', ['King\'s Tomb']), - create_cave_region(player, 'North Fairy Cave', 'a drop\'s exit', None, ['North Fairy Cave Exit']), - create_cave_region(player, 'Dam', 'the dam', ['Floodgate', 'Floodgate Chest']), - create_cave_region(player, 'Inverted Links House', 'your house', ['Link\'s House'], ['Inverted Links House Exit']), - create_cave_region(player, 'Chris Houlihan Room', 'I AM ERROR', None, ['Chris Houlihan Room Exit']), - create_cave_region(player, 'Tavern', 'the tavern', ['Kakariko Tavern']), - create_cave_region(player, 'Elder House', 'a connector', None, ['Elder House Exit (East)', 'Elder House Exit (West)']), - create_cave_region(player, 'Snitch Lady (East)', 'a boring house'), - create_cave_region(player, 'Snitch Lady (West)', 'a boring house'), - create_cave_region(player, 'Bush Covered House', 'the grass man'), - create_cave_region(player, 'Tavern (Front)', 'the tavern'), - create_cave_region(player, 'Light World Bomb Hut', 'a restock room'), - create_cave_region(player, 'Kakariko Shop', 'a common shop', ['Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right']), - create_cave_region(player, 'Fortune Teller (Light)', 'a fortune teller'), - create_cave_region(player, 'Lake Hylia Fortune Teller', 'a fortune teller'), - create_cave_region(player, 'Lumberjack House', 'a boring house'), - create_cave_region(player, 'Bonk Fairy (Light)', 'a fairy fountain'), - create_cave_region(player, 'Bonk Fairy (Dark)', 'a fairy fountain'), - create_cave_region(player, 'Lake Hylia Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Swamp Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Desert Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Dark Lake Hylia Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Dark Lake Hylia Ledge Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Dark Desert Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Dark Death Mountain Healer Fairy', 'a fairy fountain'), - create_cave_region(player, 'Chicken House', 'a house with a chest', ['Chicken House']), - create_cave_region(player, 'Aginahs Cave', 'a cave with a chest', ['Aginah\'s Cave']), - create_cave_region(player, 'Sahasrahlas Hut', 'Sahasrahla', ['Sahasrahla\'s Hut - Left', 'Sahasrahla\'s Hut - Middle', 'Sahasrahla\'s Hut - Right', 'Sahasrahla']), - create_cave_region(player, 'Kakariko Well (top)', 'a drop\'s exit', ['Kakariko Well - Top', 'Kakariko Well - Left', 'Kakariko Well - Middle', - 'Kakariko Well - Right', 'Kakariko Well - Bottom'], ['Kakariko Well (top to bottom)']), - create_cave_region(player, 'Kakariko Well (bottom)', 'a drop\'s exit', None, ['Kakariko Well Exit']), - create_cave_region(player, 'Blacksmiths Hut', 'the smith', ['Blacksmith', 'Missing Smith']), - create_lw_region(player, 'Bat Cave Drop Ledge', None, ['Bat Cave Drop']), - create_cave_region(player, 'Bat Cave (right)', 'a drop\'s exit', ['Magic Bat'], ['Bat Cave Door']), - create_cave_region(player, 'Bat Cave (left)', 'a drop\'s exit', None, ['Bat Cave Exit']), - create_cave_region(player, 'Sick Kids House', 'the sick kid', ['Sick Kid']), - create_lw_region(player, 'Hobo Bridge', ['Hobo']), - create_cave_region(player, 'Lost Woods Hideout (top)', 'a drop\'s exit', ['Lost Woods Hideout'], ['Lost Woods Hideout (top to bottom)']), - create_cave_region(player, 'Lost Woods Hideout (bottom)', 'a drop\'s exit', None, ['Lost Woods Hideout Exit']), - create_cave_region(player, 'Lumberjack Tree (top)', 'a drop\'s exit', ['Lumberjack Tree'], ['Lumberjack Tree (top to bottom)']), - create_cave_region(player, 'Lumberjack Tree (bottom)', 'a drop\'s exit', None, ['Lumberjack Tree Exit']), - create_cave_region(player, 'Cave 45', 'a cave with an item', ['Cave 45']), - create_cave_region(player, 'Graveyard Cave', 'a cave with an item', ['Graveyard Cave']), - create_cave_region(player, 'Checkerboard Cave', 'a cave with an item', ['Checkerboard Cave']), - create_cave_region(player, 'Long Fairy Cave', 'a fairy fountain'), - create_cave_region(player, 'Mini Moldorm Cave', 'a bounty of five items', ['Mini Moldorm Cave - Far Left', 'Mini Moldorm Cave - Left', 'Mini Moldorm Cave - Right', - 'Mini Moldorm Cave - Far Right', 'Mini Moldorm Cave - Generous Guy']), - create_cave_region(player, 'Ice Rod Cave', 'a cave with a chest', ['Ice Rod Cave']), - create_cave_region(player, 'Good Bee Cave', 'a cold bee'), - create_cave_region(player, '20 Rupee Cave', 'a cave with some cash'), - create_cave_region(player, 'Cave Shop (Lake Hylia)', 'a common shop', ['Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right']), - create_cave_region(player, 'Cave Shop (Dark Death Mountain)', 'a common shop', ['Dark Death Mountain Shop - Left', 'Dark Death Mountain Shop - Middle', 'Dark Death Mountain Shop - Right']), - create_cave_region(player, 'Bonk Rock Cave', 'a cave with a chest', ['Bonk Rock Cave']), - create_cave_region(player, 'Library', 'the library', ['Library']), - create_cave_region(player, 'Kakariko Gamble Game', 'a game of chance'), - create_cave_region(player, 'Potion Shop', 'the potion shop', ['Potion Shop', 'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right']), - create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island']), - create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']), - create_cave_region(player, 'Two Brothers House', 'a connector', None, ['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)']), - create_lw_region(player, 'Maze Race Ledge', ['Maze Race'], ['Two Brothers House (West)', 'Maze Race Mirror Spot']), - create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'), - create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (North) Rocks', 'Desert Palace Entrance (West)', 'Desert Ledge Drop']), - create_lw_region(player, 'Desert Palace Stairs', None, ['Desert Palace Entrance (South)', 'Desert Palace Stairs Mirror Spot']), - create_lw_region(player, 'Desert Palace Lone Stairs', None, ['Desert Palace Stairs Drop', 'Desert Palace Entrance (East)']), - create_lw_region(player, 'Desert Palace Entrance (North) Spot', None, ['Desert Palace Entrance (North)', 'Desert Ledge Return Rocks', 'Desert Palace North Mirror Spot']), - create_lw_region(player, 'Master Sword Meadow', ['Master Sword Pedestal']), - create_cave_region(player, 'Lost Woods Gamble', 'a game of chance'), - create_lw_region(player, 'Hyrule Castle Ledge', None, ['Hyrule Castle Entrance (East)', 'Hyrule Castle Entrance (West)', 'Inverted Ganons Tower', 'Hyrule Castle Ledge Courtyard Drop', 'Inverted Pyramid Hole']), - create_cave_region(player, 'Old Man Cave', 'a connector', ['Old Man'], ['Old Man Cave Exit (East)']), - create_cave_region(player, 'Old Man Cave Ledge', 'a connector', None, ['Old Man Cave Exit (West)', 'Old Man Cave Dropdown']), - create_cave_region(player, 'Old Man House', 'a connector', None, ['Old Man House Exit (Bottom)', 'Old Man House Front to Back']), - create_cave_region(player, 'Old Man House Back', 'a connector', None, ['Old Man House Exit (Top)', 'Old Man House Back to Front']), - create_lw_region(player, 'Death Mountain', 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)', 'Broken Bridge (West)', 'Death Mountain Mirror Spot']), - create_cave_region(player, 'Death Mountain Return Cave', 'a connector', None, ['Death Mountain Return Cave Exit (West)', 'Death Mountain Return Cave Exit (East)']), - create_lw_region(player, 'Death Mountain Return Ledge', None, ['Death Mountain Return Ledge Drop', 'Death Mountain Return Cave (West)', 'Bumper Cave Ledge Mirror Spot']), - create_cave_region(player, 'Spectacle Rock Cave (Top)', 'a connector', ['Spectacle Rock Cave'], ['Spectacle Rock Cave Drop', 'Spectacle Rock Cave Exit (Top)']), - create_cave_region(player, 'Spectacle Rock Cave (Bottom)', 'a connector', None, ['Spectacle Rock Cave Exit']), - create_cave_region(player, 'Spectacle Rock Cave (Peak)', 'a connector', None, ['Spectacle Rock Cave Peak Drop', 'Spectacle Rock Cave Exit (Peak)']), - create_lw_region(player, 'East Death Mountain (Bottom)', None, ['Broken Bridge (East)', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'East Death Mountain Mirror Spot (Bottom)', 'Hookshot Fairy', - 'Fairy Ascension Rocks', 'Spiral Cave (Bottom)']), - create_cave_region(player, 'Hookshot Fairy', 'fairies deep in a cave'), - create_cave_region(player, 'Paradox Cave Front', 'a connector', None, ['Paradox Cave Push Block Reverse', 'Paradox Cave Exit (Bottom)', 'Light World Death Mountain Shop']), - create_cave_region(player, 'Paradox Cave Chest Area', 'a connector', ['Paradox Cave Lower - Far Left', - 'Paradox Cave Lower - Left', - 'Paradox Cave Lower - Right', - 'Paradox Cave Lower - Far Right', - 'Paradox Cave Lower - Middle', - 'Paradox Cave Upper - Left', - 'Paradox Cave Upper - Right'], - ['Paradox Cave Push Block', 'Paradox Cave Bomb Jump']), - create_cave_region(player, 'Paradox Cave', 'a connector', None, ['Paradox Cave Exit (Middle)', 'Paradox Cave Exit (Top)', 'Paradox Cave Drop']), - create_cave_region(player, 'Light World Death Mountain Shop', 'a common shop', ['Paradox Shop - Left', 'Paradox Shop - Middle', 'Paradox Shop - Right']), - create_lw_region(player, 'East Death Mountain (Top)', ['Floating Island'], ['Paradox Cave (Top)', 'Death Mountain (Top)', 'Spiral Cave Ledge Access', 'East Death Mountain Drop', 'East Death Mountain Mirror Spot (Top)', 'Fairy Ascension Ledge Access', 'Mimic Cave Ledge Access', - '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_cave_region(player, 'Spiral Cave (Top)', 'a connector', ['Spiral Cave'], ['Spiral Cave (top to bottom)', 'Spiral Cave Exit (Top)']), - create_cave_region(player, 'Spiral Cave (Bottom)', 'a connector', None, ['Spiral Cave Exit']), - create_lw_region(player, 'Fairy Ascension Plateau', None, ['Fairy Ascension Drop', 'Fairy Ascension Cave (Bottom)']), - create_cave_region(player, 'Fairy Ascension Cave (Bottom)', 'a connector', None, ['Fairy Ascension Cave Climb', 'Fairy Ascension Cave Exit (Bottom)']), - create_cave_region(player, 'Fairy Ascension Cave (Drop)', 'a connector', None, ['Fairy Ascension Cave Pots']), - create_cave_region(player, 'Fairy Ascension Cave (Top)', 'a connector', None, ['Fairy Ascension Cave Exit (Top)', 'Fairy Ascension Cave Drop']), - create_lw_region(player, 'Fairy Ascension Ledge', None, ['Fairy Ascension Ledge Drop', 'Fairy Ascension Cave (Top)', 'Laser Bridge Mirror Spot']), - create_lw_region(player, 'Death Mountain (Top)', ['Ether Tablet', 'Spectacle Rock'], ['East Death Mountain (Top)', 'Tower of Hera', 'Death Mountain Drop', 'Death Mountain (Top) Mirror Spot']), - create_dw_region(player, 'Bumper Cave Ledge', ['Bumper Cave Ledge'], ['Bumper Cave Ledge Drop', 'Bumper Cave (Top)']), - - create_dw_region(player, 'East Dark World', ['Pyramid'], ['Pyramid Fairy', 'South Dark World Bridge', 'Palace of Darkness', 'Dark Lake Hylia Drop (East)', - 'Dark Lake Hylia Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Northeast Dark World Broken Bridge Pass', 'East Dark World Teleporter', 'EDW Flute']), - create_dw_region(player, 'Catfish', ['Catfish'], ['Catfish Exit Rock']), - create_dw_region(player, 'Northeast Dark World', None, ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass', 'NEDW Flute', 'Dark Lake Hylia Teleporter', 'Catfish Entrance Rock']), - create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'), - create_cave_region(player, 'East Dark World Hint', 'a storyteller'), - create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game'], ['Dark Lake Hylia Drop (South)', 'Hype Cave', 'Swamp Palace', 'Village of Outcasts Heavy Rock', 'East Dark World Bridge', 'Inverted Links House', 'Archery Game', 'Bonk Fairy (Dark)', - 'Dark Lake Hylia Shop', 'South Dark World Teleporter', 'Post Aga Teleporter', 'SDW Flute']), - create_cave_region(player, 'Inverted Big Bomb Shop', 'the bomb shop'), - create_cave_region(player, 'Archery Game', 'a game of skill'), - create_dw_region(player, 'Dark Lake Hylia', None, ['East Dark World Pier', 'Dark Lake Hylia Ledge Pier', 'Ice Palace Missing Wall']), - create_dw_region(player, 'Dark Lake Hylia Central Island', None, ['Dark Lake Hylia Shallows', 'Ice Palace', 'Dark Lake Hylia Central Island Teleporter']), - create_dw_region(player, 'Dark Lake Hylia Ledge', None, ['Dark Lake Hylia Ledge Drop', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', 'DLHL Flute']), - create_cave_region(player, 'Dark Lake Hylia Ledge Hint', 'a storyteller'), - create_cave_region(player, 'Dark Lake Hylia Ledge Spike Cave', 'a spiky hint'), - 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_dw_region(player, 'West Dark World', ['Frog'], ['Village of Outcasts Drop', 'East Dark World River Pier', 'Brewery', 'C-Shaped House', 'Chest Game', 'Thieves Town', 'Bumper Cave Entrance Rock', - 'Skull Woods Forest', 'Village of Outcasts Pegs', 'Village of Outcasts Eastern Rocks', 'Red Shield Shop', 'Inverted Dark Sanctuary', 'Fortune Teller (Dark)', 'Dark World Lumberjack Shop', - 'West Dark World Teleporter', 'WDW Flute']), - create_dw_region(player, 'Dark Grassy Lawn', None, ['Grassy Lawn Pegs', 'Dark World Shop', 'Dark Grassy Lawn Flute']), - create_dw_region(player, 'Hammer Peg Area', ['Dark Blacksmith Ruins'], ['Dark World Hammer Peg Cave', 'Peg Area Rocks', 'Hammer Peg Area Flute']), - create_dw_region(player, 'Bumper Cave Entrance', None, ['Bumper Cave (Bottom)', 'Bumper Cave Entrance Drop']), - create_cave_region(player, 'Fortune Teller (Dark)', 'a fortune teller'), - create_cave_region(player, 'Village of Outcasts Shop', 'a common shop', ['Village of Outcasts Shop - Left', 'Village of Outcasts Shop - Middle', 'Village of Outcasts Shop - Right']), - 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']), - create_cave_region(player, 'Dark World Lumberjack Shop', 'a common shop', ['Dark Lumberjack Shop - Left', 'Dark Lumberjack Shop - Middle', 'Dark Lumberjack Shop - Right']), - create_cave_region(player, 'Dark World Potion Shop', 'a common shop', ['Dark Potion Shop - Left', 'Dark Potion Shop - Middle', 'Dark Potion Shop - Right']), - create_cave_region(player, 'Dark World Hammer Peg Cave', 'a cave with an item', ['Peg Cave']), - create_cave_region(player, 'Pyramid Fairy', 'a cave with two chests', ['Pyramid Fairy - Left', 'Pyramid Fairy - Right']), - create_cave_region(player, 'Brewery', 'a house with a chest', ['Brewery']), - create_cave_region(player, 'C-Shaped House', 'a house with a chest', ['C-Shaped House']), - create_cave_region(player, 'Chest Game', 'a game of 16 chests', ['Chest Game']), - create_cave_region(player, 'Red Shield Shop', 'the rare shop', ['Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right']), - create_cave_region(player, 'Inverted Dark Sanctuary', 'a storyteller', None, ['Inverted Dark Sanctuary Exit']), - create_cave_region(player, 'Bumper Cave', 'a connector', None, ['Bumper Cave Exit (Bottom)', 'Bumper Cave Exit (Top)']), - 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']), - create_dw_region(player, 'Dark Desert', None, ['Misery Mire', 'Mire Shed', 'Dark Desert Hint', 'Dark Desert Fairy', 'DD Flute']), - create_dw_region(player, 'Dark Desert Ledge', None, ['Dark Desert Drop', 'Dark Desert Teleporter']), - create_cave_region(player, 'Mire Shed', 'a cave with two chests', ['Mire Shed - Left', 'Mire Shed - Right']), - create_cave_region(player, 'Dark Desert Hint', 'a storyteller'), - create_dw_region(player, 'Dark Death Mountain', None, ['Dark Death Mountain Drop (East)', 'Inverted Agahnims Tower', 'Superbunny Cave (Top)', 'Hookshot Cave', 'Turtle Rock', - 'Spike Cave', 'Dark Death Mountain Fairy', 'Dark Death Mountain Teleporter (West)', 'Turtle Rock Tail Drop', 'DDM Flute']), - create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)']), - create_dw_region(player, 'Turtle Rock (Top)', None, ['Dark Death Mountain Teleporter (East)', 'Turtle Rock Drop']), - create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Turtle Rock Isolated Ledge Entrance']), - create_dw_region(player, 'Dark Death Mountain (East Bottom)', None, ['Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Dark Death Mountain Teleporter (East Bottom)', 'EDDM Flute']), - create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']), - create_cave_region(player, 'Superbunny Cave (Bottom)', 'a connector', None, ['Superbunny Cave Climb', 'Superbunny Cave Exit (Bottom)']), - create_cave_region(player, 'Spike Cave', 'Spike Cave', ['Spike Cave']), - create_cave_region(player, 'Hookshot Cave', 'a connector', ['Hookshot Cave - Top Right', 'Hookshot Cave - Top Left', 'Hookshot Cave - Bottom Right', 'Hookshot Cave - Bottom Left'], - ['Hookshot Cave Exit (South)', 'Hookshot Cave Exit (North)']), - create_dw_region(player, 'Death Mountain Floating Island (Dark World)', None, ['Floating Island Drop', 'Hookshot Cave Back Entrance']), - create_cave_region(player, 'Mimic Cave', 'Mimic Cave', ['Mimic Cave']), - - create_cave_region(player, 'Pyramid', 'a drop\'s exit', ['Ganon'], ['Ganon Drop']), - create_cave_region(player, 'Bottom of Pyramid', 'a drop\'s exit', None, ['Pyramid Exit']), - create_dw_region(player, 'Pyramid Ledge', None, ['Pyramid Drop']), # houlihan room exits here in inverted - - # to simplify flute connections - create_cave_region(player, 'The Sky', 'A Dark Sky', None, ['DDM Landing','NEDW Landing', 'WDW Landing', 'SDW Landing', 'EDW Landing', 'DD Landing', 'DLHL Landing']) - ] - - -def mark_dark_world_regions(world, player): - # cross world caves may have some sections marked as both in_light_world, and in_dark_work. - # That is ok. the bunny logic will check for this case and incorporate special rules. - queue = collections.deque(region for region in world.get_regions(player) if region.type == RegionType.DarkWorld) - seen = set(queue) - while queue: - current = queue.popleft() - current.is_dark_world = True - for exit in current.exits: - if exit.connected_region is None or exit.connected_region.type == RegionType.LightWorld: # todo: remove none check - # Don't venture into the light world - continue - if exit.connected_region not in seen: - seen.add(exit.connected_region) - queue.append(exit.connected_region) - - queue = collections.deque(region for region in world.get_regions(player) if region.type == RegionType.LightWorld) - seen = set(queue) - while queue: - current = queue.popleft() - current.is_light_world = True - for exit in current.exits: - if exit.connected_region is not None: - if exit.connected_region.type == RegionType.DarkWorld: - # Don't venture into the dark world - continue - if exit.connected_region not in seen: - seen.add(exit.connected_region) - queue.append(exit.connected_region) - - -location_table = {'Mushroom': (0x180013, 0x186338, False, 'in the woods'), - 'Bottle Merchant': (0x2eb18, 0x186339, False, 'with a merchant'), - 'Flute Spot': (0x18014a, 0x18633d, False, 'underground'), - 'Sunken Treasure': (0x180145, 0x186354, False, 'underwater'), - 'Purple Chest': (0x33d68, 0x186359, False, 'from a box'), - "Blind's Hideout - Top": (0xeb0f, 0x1862e3, False, 'in a basement'), - "Blind's Hideout - Left": (0xeb12, 0x1862e6, False, 'in a basement'), - "Blind's Hideout - Right": (0xeb15, 0x1862e9, False, 'in a basement'), - "Blind's Hideout - Far Left": (0xeb18, 0x1862ec, False, 'in a basement'), - "Blind's Hideout - Far Right": (0xeb1b, 0x1862ef, False, 'in a basement'), - "Link's Uncle": (0x2df45, 0x18635f, False, 'with your uncle'), - 'Secret Passage': (0xe971, 0x186145, False, 'near your uncle'), - 'King Zora': (0xee1c3, 0x186360, False, 'at a high price'), - "Zora's Ledge": (0x180149, 0x186358, False, 'near Zora'), - 'Waterfall Fairy - Left': (0xe9b0, 0x186184, False, 'near a fairy'), - 'Waterfall Fairy - Right': (0xe9d1, 0x1861a5, False, 'near a fairy'), - "King's Tomb": (0xe97a, 0x18614e, False, 'alone in a cave'), - 'Floodgate Chest': (0xe98c, 0x186160, False, 'in the dam'), - "Link's House": (0xe9bc, 0x186190, False, 'in your home'), - 'Kakariko Tavern': (0xe9ce, 0x1861a2, False, 'in the bar'), - 'Chicken House': (0xe9e9, 0x1861bd, False, 'near poultry'), - "Aginah's Cave": (0xe9f2, 0x1861c6, False, 'with Aginah'), - "Sahasrahla's Hut - Left": (0xea82, 0x186256, False, 'near the elder'), - "Sahasrahla's Hut - Middle": (0xea85, 0x186259, False, 'near the elder'), - "Sahasrahla's Hut - Right": (0xea88, 0x18625c, False, 'near the elder'), - 'Sahasrahla': (0x2f1fc, 0x186365, False, 'with the elder'), - 'Kakariko Well - Top': (0xea8e, 0x186262, False, 'in a well'), - 'Kakariko Well - Left': (0xea91, 0x186265, False, 'in a well'), - 'Kakariko Well - Middle': (0xea94, 0x186268, False, 'in a well'), - 'Kakariko Well - Right': (0xea97, 0x18626b, False, 'in a well'), - 'Kakariko Well - Bottom': (0xea9a, 0x18626e, False, 'in a well'), - 'Blacksmith': (0x18002a, 0x186366, False, 'with the smith'), - 'Magic Bat': (0x180015, 0x18635e, False, 'with the bat'), - 'Sick Kid': (0x339cf, 0x186367, False, 'with the sick'), - 'Hobo': (0x33e7d, 0x186368, False, 'with the hobo'), - 'Lost Woods Hideout': (0x180000, 0x186348, False, 'near a thief'), - 'Lumberjack Tree': (0x180001, 0x186349, False, 'in a hole'), - 'Cave 45': (0x180003, 0x18634b, False, 'alone in a cave'), - 'Graveyard Cave': (0x180004, 0x18634c, False, 'alone in a cave'), - 'Checkerboard Cave': (0x180005, 0x18634d, False, 'alone in a cave'), - 'Mini Moldorm Cave - Far Left': (0xeb42, 0x186316, False, 'near Moldorms'), - 'Mini Moldorm Cave - Left': (0xeb45, 0x186319, False, 'near Moldorms'), - 'Mini Moldorm Cave - Right': (0xeb48, 0x18631c, False, 'near Moldorms'), - 'Mini Moldorm Cave - Far Right': (0xeb4b, 0x18631f, False, 'near Moldorms'), - 'Mini Moldorm Cave - Generous Guy': (0x180010, 0x18635a, False, 'near Moldorms'), - 'Ice Rod Cave': (0xeb4e, 0x186322, False, 'in a frozen cave'), - 'Bonk Rock Cave': (0xeb3f, 0x186313, False, 'alone in a cave'), - 'Library': (0x180012, 0x18635c, False, 'near books'), - 'Potion Shop': (0x180014, 0x18635d, False, 'near potions'), - 'Lake Hylia Island': (0x180144, 0x186353, False, 'on an island'), - 'Maze Race': (0x180142, 0x186351, False, 'at the race'), - 'Desert Ledge': (0x180143, 0x186352, False, 'in the desert'), - 'Desert Palace - Big Chest': (0xe98f, 0x186163, False, 'in Desert Palace'), - 'Desert Palace - Torch': (0x180160, 0x186362, False, 'in Desert Palace'), - 'Desert Palace - Map Chest': (0xe9b6, 0x18618a, False, 'in Desert Palace'), - 'Desert Palace - Compass Chest': (0xe9cb, 0x18619f, False, 'in Desert Palace'), - 'Desert Palace - Big Key Chest': (0xe9c2, 0x186196, False, 'in Desert Palace'), - 'Desert Palace - Boss': (0x180151, 0x18633f, False, 'with Lanmolas'), - 'Eastern Palace - Compass Chest': (0xe977, 0x18614b, False, 'in Eastern Palace'), - 'Eastern Palace - Big Chest': (0xe97d, 0x186151, False, 'in Eastern Palace'), - 'Eastern Palace - Cannonball Chest': (0xe9b3, 0x186187, False, 'in Eastern Palace'), - 'Eastern Palace - Big Key Chest': (0xe9b9, 0x18618d, False, 'in Eastern Palace'), - 'Eastern Palace - Map Chest': (0xe9f5, 0x1861c9, False, 'in Eastern Palace'), - 'Eastern Palace - Boss': (0x180150, 0x18633e, False, 'with the Armos'), - 'Master Sword Pedestal': (0x289b0, 0x186369, False, 'at the pedestal'), - 'Hyrule Castle - Boomerang Chest': (0xe974, 0x186148, False, 'in Hyrule Castle'), - 'Hyrule Castle - Map Chest': (0xeb0c, 0x1862e0, False, 'in Hyrule Castle'), - "Hyrule Castle - Zelda's Chest": (0xeb09, 0x1862dd, False, 'in Hyrule Castle'), - 'Sewers - Dark Cross': (0xe96e, 0x186142, False, 'in the sewers'), - 'Sewers - Secret Room - Left': (0xeb5d, 0x186331, False, 'in the sewers'), - 'Sewers - Secret Room - Middle': (0xeb60, 0x186334, False, 'in the sewers'), - 'Sewers - Secret Room - Right': (0xeb63, 0x186337, False, 'in the sewers'), - 'Sanctuary': (0xea79, 0x18624d, False, 'in Sanctuary'), - 'Castle Tower - Room 03': (0xeab5, 0x186289, False, 'in Castle Tower'), - 'Castle Tower - Dark Maze': (0xeab2, 0x186286, False, 'in Castle Tower'), - 'Old Man': (0xf69fa, 0x186364, False, 'with the old man'), - 'Spectacle Rock Cave': (0x180002, 0x18634a, False, 'alone in a cave'), - 'Paradox Cave Lower - Far Left': (0xeb2a, 0x1862fe, False, 'in a cave with seven chests'), - 'Paradox Cave Lower - Left': (0xeb2d, 0x186301, False, 'in a cave with seven chests'), - 'Paradox Cave Lower - Right': (0xeb30, 0x186304, False, 'in a cave with seven chests'), - 'Paradox Cave Lower - Far Right': (0xeb33, 0x186307, False, 'in a cave with seven chests'), - 'Paradox Cave Lower - Middle': (0xeb36, 0x18630a, False, 'in a cave with seven chests'), - 'Paradox Cave Upper - Left': (0xeb39, 0x18630d, False, 'in a cave with seven chests'), - 'Paradox Cave Upper - Right': (0xeb3c, 0x186310, False, 'in a cave with seven chests'), - 'Spiral Cave': (0xe9bf, 0x186193, False, 'in spiral cave'), - 'Ether Tablet': (0x180016, 0x18633b, False, 'at a monolith'), - 'Spectacle Rock': (0x180140, 0x18634f, False, 'atop a rock'), - 'Tower of Hera - Basement Cage': (0x180162, 0x18633a, False, 'in Tower of Hera'), - 'Tower of Hera - Map Chest': (0xe9ad, 0x186181, False, 'in Tower of Hera'), - 'Tower of Hera - Big Key Chest': (0xe9e6, 0x1861ba, False, 'in Tower of Hera'), - 'Tower of Hera - Compass Chest': (0xe9fb, 0x1861cf, False, 'in Tower of Hera'), - 'Tower of Hera - Big Chest': (0xe9f8, 0x1861cc, False, 'in Tower of Hera'), - 'Tower of Hera - Boss': (0x180152, 0x186340, False, 'with Moldorm'), - 'Pyramid': (0x180147, 0x186356, False, 'on the pyramid'), - 'Catfish': (0xee185, 0x186361, False, 'with a catfish'), - 'Stumpy': (0x330c7, 0x18636a, False, 'with tree boy'), - 'Digging Game': (0x180148, 0x186357, False, 'underground'), - 'Bombos Tablet': (0x180017, 0x18633c, False, 'at a monolith'), - 'Hype Cave - Top': (0xeb1e, 0x1862f2, False, 'near a bat-like man'), - 'Hype Cave - Middle Right': (0xeb21, 0x1862f5, False, 'near a bat-like man'), - 'Hype Cave - Middle Left': (0xeb24, 0x1862f8, False, 'near a bat-like man'), - 'Hype Cave - Bottom': (0xeb27, 0x1862fb, False, 'near a bat-like man'), - 'Hype Cave - Generous Guy': (0x180011, 0x18635b, False, 'with a bat-like man'), - 'Peg Cave': (0x180006, 0x18634e, False, 'alone in a cave'), - 'Pyramid Fairy - Left': (0xe980, 0x186154, False, 'near a fairy'), - 'Pyramid Fairy - Right': (0xe983, 0x186157, False, 'near a fairy'), - 'Brewery': (0xe9ec, 0x1861c0, False, 'alone in a home'), - 'C-Shaped House': (0xe9ef, 0x1861c3, False, 'alone in a home'), - 'Chest Game': (0xeda8, 0x18636b, False, 'as a prize'), - 'Bumper Cave Ledge': (0x180146, 0x186355, False, 'on a ledge'), - 'Mire Shed - Left': (0xea73, 0x186247, False, 'near sparks'), - 'Mire Shed - Right': (0xea76, 0x18624a, False, 'near sparks'), - 'Superbunny Cave - Top': (0xea7c, 0x186250, False, 'in a connection'), - 'Superbunny Cave - Bottom': (0xea7f, 0x186253, False, 'in a connection'), - 'Spike Cave': (0xea8b, 0x18625f, False, 'beyond spikes'), - 'Hookshot Cave - Top Right': (0xeb51, 0x186325, False, 'across pits'), - 'Hookshot Cave - Top Left': (0xeb54, 0x186328, False, 'across pits'), - 'Hookshot Cave - Bottom Right': (0xeb5a, 0x18632e, False, 'across pits'), - 'Hookshot Cave - Bottom Left': (0xeb57, 0x18632b, False, 'across pits'), - 'Floating Island': (0x180141, 0x186350, False, 'on an island'), - 'Mimic Cave': (0xe9c5, 0x186199, False, 'in a cave of mimicry'), - 'Swamp Palace - Entrance': (0xea9d, 0x186271, False, 'in Swamp Palace'), - 'Swamp Palace - Map Chest': (0xe986, 0x18615a, False, 'in Swamp Palace'), - 'Swamp Palace - Big Chest': (0xe989, 0x18615d, False, 'in Swamp Palace'), - 'Swamp Palace - Compass Chest': (0xeaa0, 0x186274, False, 'in Swamp Palace'), - 'Swamp Palace - Big Key Chest': (0xeaa6, 0x18627a, False, 'in Swamp Palace'), - 'Swamp Palace - West Chest': (0xeaa3, 0x186277, False, 'in Swamp Palace'), - 'Swamp Palace - Flooded Room - Left': (0xeaa9, 0x18627d, False, 'in Swamp Palace'), - 'Swamp Palace - Flooded Room - Right': (0xeaac, 0x186280, False, 'in Swamp Palace'), - 'Swamp Palace - Waterfall Room': (0xeaaf, 0x186283, False, 'in Swamp Palace'), - 'Swamp Palace - Boss': (0x180154, 0x186342, False, 'with Arrghus'), - "Thieves' Town - Big Key Chest": (0xea04, 0x1861d8, False, "in Thieves' Town"), - "Thieves' Town - Map Chest": (0xea01, 0x1861d5, False, "in Thieves' Town"), - "Thieves' Town - Compass Chest": (0xea07, 0x1861db, False, "in Thieves' Town"), - "Thieves' Town - Ambush Chest": (0xea0a, 0x1861de, False, "in Thieves' Town"), - "Thieves' Town - Attic": (0xea0d, 0x1861e1, False, "in Thieves' Town"), - "Thieves' Town - Big Chest": (0xea10, 0x1861e4, False, "in Thieves' Town"), - "Thieves' Town - Blind's Cell": (0xea13, 0x1861e7, False, "in Thieves' Town"), - "Thieves' Town - Boss": (0x180156, 0x186344, False, 'with Blind'), - 'Skull Woods - Compass Chest': (0xe992, 0x186166, False, 'in Skull Woods'), - 'Skull Woods - Map Chest': (0xe99b, 0x18616f, False, 'in Skull Woods'), - 'Skull Woods - Big Chest': (0xe998, 0x18616c, False, 'in Skull Woods'), - 'Skull Woods - Pot Prison': (0xe9a1, 0x186175, False, 'in Skull Woods'), - 'Skull Woods - Pinball Room': (0xe9c8, 0x18619c, False, 'in Skull Woods'), - 'Skull Woods - Big Key Chest': (0xe99e, 0x186172, False, 'in Skull Woods'), - 'Skull Woods - Bridge Room': (0xe9fe, 0x1861d2, False, 'near Mothula'), - 'Skull Woods - Boss': (0x180155, 0x186343, False, 'with Mothula'), - 'Ice Palace - Compass Chest': (0xe9d4, 0x1861a8, False, 'in Ice Palace'), - 'Ice Palace - Freezor Chest': (0xe995, 0x186169, False, 'in Ice Palace'), - 'Ice Palace - Big Chest': (0xe9aa, 0x18617e, False, 'in Ice Palace'), - 'Ice Palace - Iced T Room': (0xe9e3, 0x1861b7, False, 'in Ice Palace'), - 'Ice Palace - Spike Room': (0xe9e0, 0x1861b4, False, 'in Ice Palace'), - 'Ice Palace - Big Key Chest': (0xe9a4, 0x186178, False, 'in Ice Palace'), - 'Ice Palace - Map Chest': (0xe9dd, 0x1861b1, False, 'in Ice Palace'), - 'Ice Palace - Boss': (0x180157, 0x186345, False, 'with Kholdstare'), - 'Misery Mire - Big Chest': (0xea67, 0x18623b, False, 'in Misery Mire'), - 'Misery Mire - Map Chest': (0xea6a, 0x18623e, False, 'in Misery Mire'), - 'Misery Mire - Main Lobby': (0xea5e, 0x186232, False, 'in Misery Mire'), - 'Misery Mire - Bridge Chest': (0xea61, 0x186235, False, 'in Misery Mire'), - 'Misery Mire - Spike Chest': (0xe9da, 0x1861ae, False, 'in Misery Mire'), - 'Misery Mire - Compass Chest': (0xea64, 0x186238, False, 'in Misery Mire'), - 'Misery Mire - Big Key Chest': (0xea6d, 0x186241, False, 'in Misery Mire'), - 'Misery Mire - Boss': (0x180158, 0x186346, False, 'with Vitreous'), - 'Turtle Rock - Compass Chest': (0xea22, 0x1861f6, False, 'in Turtle Rock'), - 'Turtle Rock - Roller Room - Left': (0xea1c, 0x1861f0, False, 'in Turtle Rock'), - 'Turtle Rock - Roller Room - Right': (0xea1f, 0x1861f3, False, 'in Turtle Rock'), - 'Turtle Rock - Chain Chomps': (0xea16, 0x1861ea, False, 'in Turtle Rock'), - 'Turtle Rock - Big Key Chest': (0xea25, 0x1861f9, False, 'in Turtle Rock'), - 'Turtle Rock - Big Chest': (0xea19, 0x1861ed, False, 'in Turtle Rock'), - 'Turtle Rock - Crystaroller Room': (0xea34, 0x186208, False, 'in Turtle Rock'), - 'Turtle Rock - Eye Bridge - Bottom Left': (0xea31, 0x186205, False, 'in Turtle Rock'), - 'Turtle Rock - Eye Bridge - Bottom Right': (0xea2e, 0x186202, False, 'in Turtle Rock'), - 'Turtle Rock - Eye Bridge - Top Left': (0xea2b, 0x1861ff, False, 'in Turtle Rock'), - 'Turtle Rock - Eye Bridge - Top Right': (0xea28, 0x1861fc, False, 'in Turtle Rock'), - 'Turtle Rock - Boss': (0x180159, 0x186347, False, 'with Trinexx'), - 'Palace of Darkness - Shooter Room': (0xea5b, 0x18622f, False, 'in Palace of Darkness'), - 'Palace of Darkness - The Arena - Bridge': (0xea3d, 0x186211, False, 'in Palace of Darkness'), - 'Palace of Darkness - Stalfos Basement': (0xea49, 0x18621d, False, 'in Palace of Darkness'), - 'Palace of Darkness - Big Key Chest': (0xea37, 0x18620b, False, 'in Palace of Darkness'), - 'Palace of Darkness - The Arena - Ledge': (0xea3a, 0x18620e, False, 'in Palace of Darkness'), - 'Palace of Darkness - Map Chest': (0xea52, 0x186226, False, 'in Palace of Darkness'), - 'Palace of Darkness - Compass Chest': (0xea43, 0x186217, False, 'in Palace of Darkness'), - 'Palace of Darkness - Dark Basement - Left': (0xea4c, 0x186220, False, 'in Palace of Darkness'), - 'Palace of Darkness - Dark Basement - Right': (0xea4f, 0x186223, False, 'in Palace of Darkness'), - 'Palace of Darkness - Dark Maze - Top': (0xea55, 0x186229, False, 'in Palace of Darkness'), - 'Palace of Darkness - Dark Maze - Bottom': (0xea58, 0x18622c, False, 'in Palace of Darkness'), - 'Palace of Darkness - Big Chest': (0xea40, 0x186214, False, 'in Palace of Darkness'), - 'Palace of Darkness - Harmless Hellway': (0xea46, 0x18621a, False, 'in Palace of Darkness'), - 'Palace of Darkness - Boss': (0x180153, 0x186341, False, 'with Helmasaur King'), - "Ganons Tower - Bob's Torch": (0x180161, 0x186363, False, "in Ganon's Tower"), - 'Ganons Tower - Hope Room - Left': (0xead9, 0x1862ad, False, "in Ganon's Tower"), - 'Ganons Tower - Hope Room - Right': (0xeadc, 0x1862b0, False, "in Ganon's Tower"), - 'Ganons Tower - Tile Room': (0xeae2, 0x1862b6, False, "in Ganon's Tower"), - 'Ganons Tower - Compass Room - Top Left': (0xeae5, 0x1862b9, False, "in Ganon's Tower"), - 'Ganons Tower - Compass Room - Top Right': (0xeae8, 0x1862bc, False, "in Ganon's Tower"), - 'Ganons Tower - Compass Room - Bottom Left': (0xeaeb, 0x1862bf, False, "in Ganon's Tower"), - 'Ganons Tower - Compass Room - Bottom Right': (0xeaee, 0x1862c2, False, "in Ganon's Tower"), - 'Ganons Tower - DMs Room - Top Left': (0xeab8, 0x18628c, False, "in Ganon's Tower"), - 'Ganons Tower - DMs Room - Top Right': (0xeabb, 0x18628f, False, "in Ganon's Tower"), - 'Ganons Tower - DMs Room - Bottom Left': (0xeabe, 0x186292, False, "in Ganon's Tower"), - 'Ganons Tower - DMs Room - Bottom Right': (0xeac1, 0x186295, False, "in Ganon's Tower"), - 'Ganons Tower - Map Chest': (0xead3, 0x1862a7, False, "in Ganon's Tower"), - 'Ganons Tower - Firesnake Room': (0xead0, 0x1862a4, False, "in Ganon's Tower"), - 'Ganons Tower - Randomizer Room - Top Left': (0xeac4, 0x186298, False, "in Ganon's Tower"), - 'Ganons Tower - Randomizer Room - Top Right': (0xeac7, 0x18629b, False, "in Ganon's Tower"), - 'Ganons Tower - Randomizer Room - Bottom Left': (0xeaca, 0x18629e, False, "in Ganon's Tower"), - 'Ganons Tower - Randomizer Room - Bottom Right': (0xeacd, 0x1862a1, False, "in Ganon's Tower"), - "Ganons Tower - Bob's Chest": (0xeadf, 0x1862b3, False, "in Ganon's Tower"), - 'Ganons Tower - Big Chest': (0xead6, 0x1862aa, False, "in Ganon's Tower"), - 'Ganons Tower - Big Key Room - Left': (0xeaf4, 0x1862c8, False, "in Ganon's Tower"), - 'Ganons Tower - Big Key Room - Right': (0xeaf7, 0x1862cb, False, "in Ganon's Tower"), - 'Ganons Tower - Big Key Chest': (0xeaf1, 0x1862c5, False, "in Ganon's Tower"), - 'Ganons Tower - Mini Helmasaur Room - Left': (0xeafd, 0x1862d1, False, "atop Ganon's Tower"), - 'Ganons Tower - Mini Helmasaur Room - Right': (0xeb00, 0x1862d4, False, "atop Ganon's Tower"), - 'Ganons Tower - Pre-Moldorm Chest': (0xeb03, 0x1862d7, False, "atop Ganon's Tower"), - 'Ganons Tower - Validation Chest': (0xeb06, 0x1862da, False, "atop Ganon's Tower"), - 'Ganon': (None, None, False, 'from me'), - 'Agahnim 1': (None, None, False, 'from Ganon\'s wizardry form'), - 'Agahnim 2': (None, None, False, 'from Ganon\'s wizardry form'), - 'Floodgate': (None, None, False, None), - 'Frog': (None, None, False, None), - 'Missing Smith': (None, None, False, None), - 'Dark Blacksmith Ruins': (None, None, False, None), - 'Eastern Palace - Prize': ([0x1209D, 0x53EF8, 0x53EF9, 0x180052, 0x18007C, 0xC6FE], None, True, 'Eastern Palace'), - 'Desert Palace - Prize': ([0x1209E, 0x53F1C, 0x53F1D, 0x180053, 0x180078, 0xC6FF], None, True, 'Desert Palace'), - 'Tower of Hera - Prize': ([0x120A5, 0x53F0A, 0x53F0B, 0x18005A, 0x18007A, 0xC706], None, True, 'Tower of Hera'), - 'Palace of Darkness - Prize': ([0x120A1, 0x53F00, 0x53F01, 0x180056, 0x18007D, 0xC702], None, True, 'Palace of Darkness'), - 'Swamp Palace - Prize': ([0x120A0, 0x53F6C, 0x53F6D, 0x180055, 0x180071, 0xC701], None, True, 'Swamp Palace'), - 'Thieves\' Town - Prize': ([0x120A6, 0x53F36, 0x53F37, 0x18005B, 0x180077, 0xC707], None, True, 'Thieves\' Town'), - 'Skull Woods - Prize': ([0x120A3, 0x53F12, 0x53F13, 0x180058, 0x18007B, 0xC704], None, True, 'Skull Woods'), - 'Ice Palace - Prize': ([0x120A4, 0x53F5A, 0x53F5B, 0x180059, 0x180073, 0xC705], None, True, 'Ice Palace'), - 'Misery Mire - Prize': ([0x120A2, 0x53F48, 0x53F49, 0x180057, 0x180075, 0xC703], None, True, 'Misery Mire'), - 'Turtle Rock - Prize': ([0x120A7, 0x53F24, 0x53F25, 0x18005C, 0x180079, 0xC708], None, True, 'Turtle Rock'), - 'Kakariko Shop - Left': (None, None, False, 'for sale in Kakariko'), - 'Kakariko Shop - Middle': (None, None, False, 'for sale in Kakariko'), - 'Kakariko Shop - Right': (None, None, False, 'for sale in Kakariko'), - 'Lake Hylia Shop - Left': (None, None, False, 'for sale near the lake'), - 'Lake Hylia Shop - Middle': (None, None, False, 'for sale near the lake'), - 'Lake Hylia Shop - Right': (None, None, False, 'for sale near the lake'), - 'Paradox Shop - Left': (None, None, False, 'for sale near seven chests'), - 'Paradox Shop - Middle': (None, None, False, 'for sale near seven chests'), - 'Paradox Shop - Right': (None, None, False, 'for sale near seven chests'), - 'Capacity Upgrade - Left': (None, None, False, 'for sale near the queen'), - 'Capacity Upgrade - Right': (None, None, False, 'for sale near the queen'), - 'Village of Outcasts Shop - Left': (None, None, False, 'for sale near outcasts'), - 'Village of Outcasts Shop - Middle': (None, None, False, 'for sale near outcasts'), - 'Village of Outcasts Shop - Right': (None, None, False, 'for sale near outcasts'), - 'Dark Lumberjack Shop - Left': (None, None, False, 'for sale in the far north'), - 'Dark Lumberjack Shop - Middle': (None, None, False, 'for sale in the far north'), - 'Dark Lumberjack Shop - Right': (None, None, False, 'for sale in the far north'), - 'Dark Lake Hylia Shop - Left': (None, None, False, 'for sale near the dark lake'), - 'Dark Lake Hylia Shop - Middle': (None, None, False, 'for sale near the dark lake'), - 'Dark Lake Hylia Shop - Right': (None, None, False, 'for sale near the dark lake'), - 'Dark Potion Shop - Left': (None, None, False, 'for sale near a catfish'), - 'Dark Potion Shop - Middle': (None, None, False, 'for sale near a catfish'), - 'Dark Potion Shop - Right': (None, None, False, 'for sale near a catfish'), - 'Dark Death Mountain Shop - Left': (None, None, False, 'for sale on the dark mountain'), - 'Dark Death Mountain Shop - Middle': (None, None, False, 'for sale on the dark mountain'), - 'Dark Death Mountain Shop - Right': (None, None, False, 'for sale on the dark mountain'), - 'Red Shield Shop - Left': (None, None, False, 'for sale as a curiosity'), - 'Red Shield Shop - Middle': (None, None, False, 'for sale as a curiosity'), - 'Red Shield Shop - Right': (None, None, False, 'for sale as a curiosity'), - 'Potion Shop - Left': (None, None, False, 'for sale near the witch'), - 'Potion Shop - Middle': (None, None, False, 'for sale near the witch'), - 'Potion Shop - Right': (None, None, False, 'for sale near the witch'), - } diff --git a/Main.py b/Main.py index 0888b024..cc2c7e08 100644 --- a/Main.py +++ b/Main.py @@ -13,8 +13,7 @@ from Items import ItemFactory from KeyDoorShuffle import validate_key_placement from OverworldGlitchRules import create_owg_connections from PotShuffle import shuffle_pots -from Regions import create_regions, create_shops, mark_light_world_regions, create_dungeon_regions, adjust_locations -from InvertedRegions import create_inverted_regions, mark_dark_world_regions +from Regions import create_regions, create_shops, mark_light_world_regions, mark_dark_world_regions, create_dungeon_regions, adjust_locations from OWEdges import create_owedges from OverworldShuffle import link_overworld from EntranceShuffle import link_entrances, link_inverted_entrances @@ -127,10 +126,7 @@ def main(args, seed=None, fish=None): if item: world.push_precollected(item) - if world.mode[player] != 'inverted': - create_regions(world, player) - else: - create_inverted_regions(world, player) + create_regions(world, player) create_owedges(world, player) if world.logic[player] in ('owglitches', 'nologic'): create_owg_connections(world, player) @@ -403,10 +399,7 @@ def copy_world(world): ret.standardize_palettes = world.standardize_palettes.copy() for player in range(1, world.players + 1): - if world.mode[player] != 'inverted': - create_regions(ret, player) - else: - create_inverted_regions(ret, player) + create_regions(ret, player) create_dungeon_regions(ret, player) create_shops(ret, player) create_rooms(ret, player) diff --git a/OverworldGlitchRules.py b/OverworldGlitchRules.py index ced7520e..919af7ea 100644 --- a/OverworldGlitchRules.py +++ b/OverworldGlitchRules.py @@ -143,11 +143,11 @@ def get_boots_clip_exits_lw(inverted = False): yield ('Graveyard Ledge DMD Clip', 'West Death Mountain (Bottom)', 'Graveyard Ledge') yield ('Kings Grave DMD Clip', 'West Death Mountain (Bottom)', 'Kings Grave Area') yield ('EDM to WDM Top Clip', 'East Death Mountain (Top West)', 'West Death Mountain (Top)') - yield ('EDM East Dropdown Clip', 'East Death Mountain (Top East)', 'East Death Mountain (West Lip)') + yield ('EDM East Dropdown Clip', 'East Death Mountain (Top East)', 'East Death Mountain (Bottom Left)') yield ('EDM To TR Pegs Clip', 'East Death Mountain (Top East)', 'Death Mountain TR Pegs') yield ('EDM DMD FAWT Clip', 'East Death Mountain (Bottom)', 'Potion Shop Area') - yield ('WDM To EDM Bottom Clip', 'East Death Mountain (West Lip)', 'East Death Mountain (Bottom)') - yield ('WDM DMD To River Bend Clip', 'East Death Mountain (West Lip)', 'River Bend Area') + yield ('WDM To EDM Bottom Clip', 'East Death Mountain (Bottom Left)', 'East Death Mountain (Bottom)') + yield ('WDM DMD To River Bend Clip', 'East Death Mountain (Bottom Left)', 'River Bend Area') yield ('EDM DMD To River Bend Clip', 'East Death Mountain (Bottom)', 'River Bend Area') yield ('TR Pegs Ledge Clip', 'Death Mountain TR Pegs', 'Death Mountain TR Pegs Ledge') yield ('TR Pegs To EDM Clip', 'Death Mountain TR Pegs', 'East Death Mountain (Top East)') diff --git a/OverworldShuffle.py b/OverworldShuffle.py index f89b614d..f7b59c95 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -10,6 +10,13 @@ def link_overworld(world, player): connect_simple(world, exitname, regionname, player) for exitname, destname in temporary_mandatory_connections: connect_two_way(world, exitname, destname, player) + + if world.mode[player] != 'inverted': + for exitname, regionname in open_connections: + connect_simple(world, exitname, regionname, player) + else: + for exitname, regionname in inverted_connections: + connect_simple(world, exitname, regionname, player) connected_edges = [] @@ -249,7 +256,7 @@ def connect_two_way(world, edgename1, edgename2, player): world.spoiler.set_overworld(edgename2, edgename1, 'both', player) def remove_reserved(world, groupedlist, connected_edges, player): - #TODO: Remove edges set in connect_custom + #TODO: new_grouping = {} for group in groupedlist.keys(): new_grouping[group] = ([], []) @@ -270,7 +277,7 @@ def remove_reserved(world, groupedlist, connected_edges, player): forward_edges = list(filter(([]).__ne__, forward_edges)) back_edges = list(filter(([]).__ne__, back_edges)) - #TODO: The lists above can be left with invalid counts of edges, they need to get put into their appropriate group + #TODO: Remove edges set in connect_custom. The lists above can be left with invalid counts if connect_custom removes entries, they need to get put into their appropriate group (exist_forward_edges, exist_back_edges) = new_grouping[group] exist_forward_edges.extend(forward_edges) @@ -293,16 +300,7 @@ temporary_mandatory_connections = [ ] # 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 = [('Flute Spot 1', 'West Death Mountain (Bottom)'), - ('Flute Spot 2', 'Potion Shop Area'), - ('Flute Spot 3', 'Kakariko Area'), - ('Flute Spot 4', 'Links House Area'), - ('Flute Spot 5', 'Eastern Nook Area'), - ('Flute Spot 6', 'Desert Palace Teleporter Ledge'), - ('Flute Spot 7', 'Dam Area'), - ('Flute Spot 8', 'Octoballoon Area'), - - # Whirlpool Connections +mandatory_connections = [ # Whirlpool Connections ('C Whirlpool', 'River Bend Water'), ('River Bend Whirlpool', 'C Whirlpool Water'), ('Lake Hylia Whirlpool', 'Zora Waterfall Water'), @@ -313,6 +311,8 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Bomber Corner Whirlpool', 'Qirn Jump Water'), # Intra-tile OW Connections + ('Lost Woods Bush (West)', 'Lost Woods East Area'), + ('Lost Woods Bush (East)', 'Lost Woods West Area'), ('Death Mountain Entrance Rock', 'Death Mountain Entrance'), ('Death Mountain Entrance Drop', 'Mountain Entry Area'), ('Death Mountain Return Drop', 'Mountain Entry Area'), @@ -324,6 +324,8 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Kings Grave Outer Rocks', 'Kings Grave Area'), ('Kings Grave Inner Rocks', 'Graveyard Area'), ('Graveyard Ledge Drop', 'Graveyard Area'), + ('Graveyard Ladder (Top)', 'Graveyard Area'), + ('Graveyard Ladder (Bottom)', 'Graveyard Ledge'), ('River Bend Water Drop', 'River Bend Water'), ('River Bend East Water Drop', 'River Bend Water'), ('River Bend West Pier', 'River Bend Area'), @@ -333,17 +335,30 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Potion Shop Rock (South)', 'Potion Shop Northeast'), ('Potion Shop Rock (North)', 'Potion Shop Area'), ('Zora Approach Water Drop', 'Zora Approach Water'), + ('Kakariko Yard Bush (South)', 'Kakariko Grass Yard'), + ('Kakariko Yard Bush (North)', 'Kakariko Area'), + ('Kakariko Southwest Bush (North)', 'Kakariko Southwest'), + ('Kakariko Southwest Bush (South)', 'Kakariko Area'), ('Bat Cave Ledge Peg', 'Bat Cave Ledge'), + ('Hyrule Castle Courtyard Bush (North)', 'Hyrule Castle Courtyard'), + ('Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Courtyard Northeast'), ('Hyrule Castle Main Gate (South)', 'Hyrule Castle Courtyard'), ('Hyrule Castle Main Gate (North)', 'Hyrule Castle Area'), ('Hyrule Castle Ledge Drop', 'Hyrule Castle Area'), ('Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Courtyard'), ('Hyrule Castle Inner East Rock', 'Hyrule Castle East Entry'), ('Hyrule Castle Outer East Rock', 'Hyrule Castle Area'), + ('Wooden Bridge Bush (South)', 'Wooden Bridge Northeast'), + ('Wooden Bridge Bush (North)', 'Wooden Bridge Area'), ('Wooden Bridge Water Drop', 'Wooden Bridge Water'), + ('Wooden Bridge Northeast Water Drop', 'Wooden Bridge Water'), ('Maze Race Game', 'Maze Race Prize'), ('Maze Race Ledge Drop', 'Maze Race Area'), + ('Flute Boy Bush (North)', 'Flute Boy Approach Area'), + ('Flute Boy Bush (South)', 'Flute Boy Bush Entry'), ('Cave 45 Ledge Drop', 'Flute Boy Approach Area'), + ('Cave 45 Inverted Leave', 'Flute Boy Approach Area'), + ('Cave 45 Inverted Approach', 'Cave 45 Ledge'), ('C Whirlpool Water Entry', 'C Whirlpool Water'), ('C Whirlpool Landing', 'C Whirlpool Area'), ('C Whirlpool Rock (Bottom)', 'C Whirlpool Outer Area'), @@ -355,10 +370,14 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Desert Ledge Outer Rocks', 'Desert Palace Entrance (North) Spot'), ('Desert Ledge Inner Rocks', 'Desert Ledge'), ('Checkerboard Ledge Drop', 'Desert Area'), + ('Checkerboard Ledge Approach', 'Desert Checkerboard Ledge'), + ('Checkerboard Ledge Leave', 'Desert Area'), ('Desert Mouth Drop', 'Desert Area'), ('Desert Teleporter Drop', 'Desert Area'), ('Bombos Tablet Drop', 'Desert Area'), ('Desert Pass Ledge Drop', 'Desert Pass Area'), + ('Desert Pass Ladder (North)', 'Desert Pass Area'), + ('Desert Pass Ladder (South)', 'Desert Pass Ledge'), ('Desert Pass Rocks (North)', 'Desert Pass Southeast'), ('Desert Pass Rocks (South)', 'Desert Pass Area'), ('Lake Hylia Water Drop', 'Lake Hylia Water'), @@ -367,6 +386,7 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Lake Hylia Central Water Drop', 'Lake Hylia Water'), ('Lake Hylia Island Water Drop', 'Lake Hylia Water'), ('Lake Hylia Central Island Pier', 'Lake Hylia Central Island'), + ('Lake Hylia Island Pier', 'Lake Hylia Island'), ('Lake Hylia West Pier', 'Lake Hylia Area'), ('Lake Hylia East Pier', 'Lake Hylia Northeast Bank'), ('Octoballoon Water Drop', 'Octoballoon Water'), @@ -375,16 +395,23 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('West Death Mountain Drop', 'West Death Mountain (Bottom)'), ('Spectacle Rock Drop', 'West Death Mountain (Top)'), + ('Spectacle Rock Leave', 'West Death Mountain (Top)'), + ('Spectacle Rock Approach', 'Spectacle Rock Ledge'), ('DM Hammer Bridge (West)', 'East Death Mountain (Top West)'), ('DM Hammer Bridge (East)', 'East Death Mountain (Top East)'), - ('East Death Mountain Spiral Drop', 'Spiral Cave Ledge'), - ('East Death Mountain Fairy Drop', 'Fairy Ascension Ledge'), + ('Floating Island Bridge (West)', 'East Death Mountain (Top East)'), + ('Floating Island Bridge (East)', 'Death Mountain Floating Island'), + ('East Death Mountain Spiral Ledge Drop', 'Spiral Cave Ledge'), + ('East Death Mountain Fairy Ledge Drop', 'Fairy Ascension Ledge'), + ('East Death Mountain Mimic Ledge Drop', 'Mimic Cave Ledge'), ('Spiral Ledge Drop', 'East Death Mountain (Bottom)'), ('Fairy Ascension Ledge Drop', 'Fairy Ascension Plateau'), - ('Fairy Ascension Plateau Drop', 'East Death Mountain (Bottom)'), - ('Fairy Ascension Rocks', 'Fairy Ascension Plateau'), + ('Fairy Ascension Plateau Ledge Drop', 'East Death Mountain (Bottom)'), + ('Fairy Ascension Rocks (North)', 'East Death Mountain (Bottom)'), + ('Fairy Ascension Rocks (South)', 'Fairy Ascension Plateau'), + ('Mimic Ledge Drop', 'East Death Mountain (Bottom)'), ('DM Broken Bridge (West)', 'East Death Mountain (Bottom)'), - ('DM Broken Bridge (East)', 'East Death Mountain (West Lip)'), + ('DM Broken Bridge (East)', 'East Death Mountain (Bottom Left)'), ('TR Pegs Ledge Entry', 'Death Mountain TR Pegs Ledge'), ('TR Pegs Ledge Drop', 'Death Mountain TR Pegs'), @@ -409,9 +436,11 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Catfish Approach Water Drop', 'Catfish Approach Water'), ('Village of Outcasts Pegs', 'Dark Grassy Lawn'), ('Grassy Lawn Pegs', 'Village of Outcasts Area'), + ('Shield Shop Fence (Outer) Ledge Drop', 'Shield Shop Fence'), + ('Shield Shop Fence (Inner) Ledge Drop', 'Shield Shop Area'), ('Peg Area Rocks (West)', 'Hammer Peg Area'), ('Peg Area Rocks (East)', 'Hammer Peg Entry'), - ('Pyramid Exit Drop', 'Pyramid Area'), + ('Pyramid Exit Ledge Drop', 'Pyramid Area'), ('Broken Bridge Hammer Rock (South)', 'Broken Bridge Northeast'), ('Broken Bridge Hammer Rock (North)', 'Broken Bridge Area'), ('Broken Bridge Hookshot Gap', 'Broken Bridge West'), @@ -441,15 +470,21 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Ice Lake Southeast Water Drop', 'Ice Lake Water'), ('Ice Lake Moat Water Drop', 'Ice Lake Water'), ('Ice Lake Northeast Pier', 'Ice Lake Northeast Bank'), + ('Ice Palace Approach', 'Ice Palace Area'), + ('Ice Palace Leave', 'Ice Lake Moat'), ('Bomber Corner Water Drop', 'Bomber Corner Water'), ('Bomber Corner Waterfall Water Drop', 'Bomber Corner Water'), ('Bomber Corner Pier', 'Bomber Corner Area'), ('Dark Death Mountain Drop (West)', 'West Dark Death Mountain (Bottom)'), - ('GT Approach Entry', 'GT Approach'), + ('Dark Death Mountain Ladder (North)', 'West Dark Death Mountain (Bottom)'), + ('Dark Death Mountain Ladder (South)', 'West Dark Death Mountain (Top)'), + ('GT Entry Approach', 'GT Approach'), + ('GT Entry Leave', 'West Dark Death Mountain (Top)'), ('Dark Death Mountain Drop (East)', 'East Dark Death Mountain (Bottom)'), ('Floating Island Drop', 'East Dark Death Mountain (Top)'), ('Turtle Rock Ledge Drop', 'Turtle Rock Area'), + ('Turtle Rock Tail Ledge Drop', 'Turtle Rock Ledge'), # OWG Connections ('Sand Dunes Ledge Drop', 'Sand Dunes Area'), @@ -497,7 +532,7 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Ice Lake Northeast Pier Bomb Jump', 'Ice Lake Northeast Bank'), ('Dark C Whirlpool Cliff Ledge Drop', 'Dark C Whirlpool Area'), ('Dark C Whirlpool Outer Cliff Ledge Drop', 'Dark C Whirlpool Outer Area'), - #('Dark South Teleporter Cliff Ledge Drop', 'C Whirlpool Area'), #inverted only, add glove requirement + ('Dark South Teleporter Cliff Ledge Drop', 'Dark Central Cliffs'), #TODO:inverted only, add glove requirement ('Hype Cliff Ledge Drop', 'Hype Cave Area'), ('Ice Palace Island FAWT Ledge Drop', 'Ice Lake Moat'), ('Hammer Bridge EC Cliff Water Drop', 'Hammer Bridge Water'), #fake flipper @@ -515,13 +550,25 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('West Death Mountain Teleporter', 'West Dark Death Mountain (Bottom)'), ('East Death Mountain Teleporter', 'East Dark Death Mountain (Bottom)'), ('TR Pegs Teleporter', 'Turtle Rock Ledge'), + + ('Post Aga Inverted Teleporter', 'Hyrule Castle Area'), + ('Ice Palace Teleporter', 'Lake Hylia Central Island'), + ('Misery Mire Teleporter', 'Desert Palace Teleporter Ledge'), + ('East Dark World Teleporter', 'Eastern Nook Area'), + ('South Dark World Teleporter', 'C Whirlpool Area'), + ('West Dark World Teleporter (Hammer)', 'Lost Woods Pass East Top Area'), + ('West Dark World Teleporter (Rock)', 'Lost Woods Pass East Bottom Area'), + ('Dark Death Mountain Teleporter (West)', 'West Death Mountain (Bottom)'), + ('Dark Death Mountain Teleporter (East)', 'East Death Mountain (Bottom)'), + ('Turtle Rock Teleporter', 'Death Mountain TR Pegs Ledge'), # Mirror Connections - ('Lost Woods Mirror Spot', 'Lost Woods Area'), - ('Lost Woods Entry Mirror Spot', 'Lost Woods Area'), - ('Lost Woods Pedestal Mirror Spot', 'Lost Woods Area'), - ('Lost Woods Southwest Mirror Spot', 'Lost Woods Area'), - ('Lost Woods Northeast Mirror Spot', 'Lost Woods Area'), + ('Lost Woods East Mirror Spot', 'Lost Woods East Area'), + ('Lost Woods Entry Mirror Spot', 'Lost Woods West Area'), + ('Lost Woods Pedestal Mirror Spot', 'Lost Woods West Area'), + ('Lost Woods Southwest Mirror Spot', 'Lost Woods West Area'), + ('Lost Woods East (Forgotten) Mirror Spot', 'Lost Woods East Area'), + ('Lost Woods West (Forgotten) Mirror Spot', 'Lost Woods West Area'), ('Lumberjack Mirror Spot', 'Lumberjack Area'), ('Mountain Entry Mirror Spot', 'Mountain Entry Area'), ('Mountain Entry Entrance Mirror Spot', 'Death Mountain Entrance'), @@ -599,9 +646,11 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'), ('Isolated Ledge Mirror Spot', 'Fairy Ascension Ledge'), ('Fairy Ascension Mirror Spot', 'Fairy Ascension Plateau'), - ('Death Mountain Bridge Mirror Spot', 'East Death Mountain (West Lip)'), + ('Death Mountain Bridge Mirror Spot', 'East Death Mountain (Bottom Left)'), ('Floating Island Mirror Spot', 'Death Mountain Floating Island'), ('TR Pegs Area Mirror Spot', 'Death Mountain TR Pegs') + + #TODO: Inverted Mirror Spots ] standard_connections = [('Hyrule Castle SW', 'Central Bonk Rocks NW'), @@ -611,6 +660,26 @@ standard_connections = [('Hyrule Castle SW', 'Central Bonk Rocks NW'), ('Central Bonk Rocks ES', 'Links House WS') ] +open_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), + ('Flute Spot 2', 'Potion Shop Area'), + ('Flute Spot 3', 'Kakariko Area'), + ('Flute Spot 4', 'Links House Area'), + ('Flute Spot 5', 'Eastern Nook Area'), + ('Flute Spot 6', 'Desert Palace Teleporter Ledge'), + ('Flute Spot 7', 'Dam Area'), + ('Flute Spot 8', 'Octoballoon Area') + ] + +inverted_connections = [('Flute Spot 1', 'West Dark Death Mountain (Bottom)'), + ('Flute Spot 2', 'Dark Witch Area'), + ('Flute Spot 3', 'Village of Outcasts Area'), + ('Flute Spot 4', 'Big Bomb Shop Area'), + ('Flute Spot 5', 'Palace of Darkness Nook Area'), + ('Flute Spot 6', 'Misery Mire Teleporter Ledge'), + ('Flute Spot 7', 'Swamp Area'), + ('Flute Spot 8', 'Bomber Corner Area') + ] + parallelsimilar_connections = [('Maze Race ES', 'Kakariko Suburb WS'), ('Dig Game EC', 'Frog WC'), ('Dig Game ES', 'Frog WS') diff --git a/Regions.py b/Regions.py index 79dd7fb3..a62dd829 100644 --- a/Regions.py +++ b/Regions.py @@ -5,24 +5,25 @@ from BaseClasses import Region, Location, Entrance, RegionType, Shop, ShopType def create_regions(world, player): world.regions += [ - create_menu_region(player, 'Menu', None, ['Links House S&Q', 'Sanctuary S&Q', 'Old Man S&Q']), + 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, 'Master Sword Meadow', ['Master Sword Pedestal'], ['Master Sword Meadow SC']), - create_lw_region(player, 'Lost Woods Area', ['Mushroom'], ['Lost Woods Gamble', 'Lost Woods Hideout Drop', 'Lost Woods Hideout Stump', 'Lost Woods NW', 'Lost Woods SW', 'Lost Woods SC', 'Lost Woods SE', 'Lost Woods EN']), + 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 Bush (East)', 'Lost Woods Gamble', 'Lost Woods Hideout Drop', 'Lost Woods Hideout Stump', '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', 'West Death Mountain Drop', 'West Death Mountain EN']), - create_lw_region(player, 'Spectacle Rock Ledge', ['Spectacle Rock'], ['Spectacle Rock Drop']), + 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 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)', '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)', 'East Death Mountain Spiral Drop', 'East Death Mountain Fairy Drop', 'East Death Mountain EN']), + create_lw_region(player, 'East Death Mountain (Top East)', None, ['Paradox Cave (Top)', 'DM Hammer Bridge (East)', 'Floating Island Bridge (East)', 'East Death Mountain Spiral Ledge Drop', 'East Death Mountain Fairy Ledge Drop', 'East Death Mountain Mimic Ledge Drop', 'East Death Mountain EN']), create_lw_region(player, 'Spiral Cave Ledge', None, ['Spiral Cave', 'Spiral Ledge Drop']), - create_lw_region(player, 'Mimic Cave Ledge', None, ['Mimic Cave']), + create_lw_region(player, 'Mimic Cave Ledge', None, ['Mimic Cave', 'Mimic Ledge Drop']), create_lw_region(player, 'Fairy Ascension Ledge', None, ['Fairy Ascension Ledge Drop', 'Fairy Ascension Cave (Top)']), - create_lw_region(player, 'Fairy Ascension Plateau', None, ['Fairy Ascension Plateau Drop', 'Fairy Ascension Cave (Bottom)']), - create_lw_region(player, 'East Death Mountain (West Lip)', None, ['DM Broken Bridge (West)', 'East Death Mountain WS']), - create_lw_region(player, 'East Death Mountain (Bottom)', None, ['DM Broken Bridge (East)', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Hookshot Fairy', 'Spiral Cave (Bottom)', 'Fairy Ascension Rocks', 'East Death Mountain Teleporter']), - create_lw_region(player, 'Death Mountain Floating Island', ['Floating Island']), + create_lw_region(player, 'Fairy Ascension Plateau', None, ['Fairy Ascension Rocks (North)', 'Fairy Ascension Plateau Ledge Drop', 'Fairy Ascension Cave (Bottom)']), + 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, ['DM Broken Bridge (East)', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Hookshot Fairy', 'Spiral Cave (Bottom)', 'Fairy Ascension Rocks (South)', 'East Death Mountain Teleporter']), + create_lw_region(player, 'Death Mountain Floating Island', ['Floating Island'], ['Floating Island Bridge (West)']), create_lw_region(player, 'Death Mountain TR Pegs', None, ['Death Mountain TR Pegs WN', 'TR Pegs Ledge Entry']), create_lw_region(player, 'Death Mountain TR Pegs Ledge', None, ['TR Pegs Ledge Drop', 'TR Pegs Teleporter']), create_lw_region(player, 'Mountain Entry Area', None, ['Death Mountain Entrance Rock', 'Mountain Entry NW', 'Mountain Entry SE']), @@ -39,8 +40,8 @@ def create_regions(world, player): create_lw_region(player, 'Kakariko Pond Area', None, ['Kakariko Pond NE', 'Kakariko Pond WN', 'Kakariko Pond WS', 'Kakariko Pond SW', 'Kakariko Pond SE', 'Kakariko Pond EN', 'Kakariko Pond ES', 'Kakariko Pond Whirlpool']), 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 Outer Rocks', 'Graveyard WC', 'Graveyard EC']), - create_lw_region(player, 'Graveyard Ledge', None, ['Graveyard Cave', 'Graveyard Ledge Drop']), + create_lw_region(player, 'Graveyard Area', None, ['Sanctuary Grave', 'Kings Grave Outer Rocks', '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 Inner Rocks']), create_lw_region(player, 'River Bend Area', None, ['North Fairy Cave', 'North Fairy Cave Drop', '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']), @@ -50,15 +51,19 @@ def create_regions(world, player): create_lw_region(player, 'Potion Shop Water', None, ['Potion Shop WN', 'Potion Shop EN']), create_lw_region(player, 'Zora Approach Area', None, ['Zora Approach Water Drop', 'Zora Approach WC', 'Zora Approach NE']), create_lw_region(player, 'Zora Approach Water', None, ['Zora Approach WN']), - create_lw_region(player, 'Kakariko Area', ['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', 'Bush Covered House', 'Light World Bomb Hut', - 'Kakariko Shop', 'Tavern (Front)', 'Tavern North', 'Kakariko NW', 'Kakariko NC', 'Kakariko NE', 'Kakariko ES', 'Kakariko SE']), + create_lw_region(player, 'Kakariko Area', ['Bottle Merchant'], ['Kakariko Southwest Bush (North)', 'Kakariko Yard Bush (South)', '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 NW', 'Kakariko NC', 'Kakariko NE', 'Kakariko ES', 'Kakariko SE']), + create_lw_region(player, 'Kakariko Southwest', None, ['Kakariko Southwest Bush (South)', 'Light World Bomb Hut']), + create_lw_region(player, 'Kakariko Grass Yard', None, ['Kakariko Yard Bush (North)', 'Bush Covered House']), 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', 'Top of Pyramid', 'Hyrule Castle Main Gate (South)', 'Hyrule Castle Inner East Rock', 'Hyrule Castle WN', 'Hyrule Castle SW', 'Hyrule Castle SE']), - create_lw_region(player, 'Hyrule Castle Courtyard', None, ['Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Entrance (South)', 'Hyrule Castle Main Gate (North)', 'Top of Pyramid (Inner)']), - create_lw_region(player, 'Hyrule Castle Ledge', None, ['Hyrule Castle Entrance (West)', 'Agahnims Tower', 'Hyrule Castle Entrance (East)', 'Hyrule Castle Ledge Drop', 'Hyrule Castle Ledge Courtyard Drop']), + create_lw_region(player, 'Hyrule Castle Courtyard', None, ['Hyrule Castle Courtyard Bush (South)', 'Inverted Pyramid Entrance', 'Hyrule Castle Entrance (South)', 'Hyrule Castle Main Gate (North)', 'Top of Pyramid (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', 'Inverted Ganons Tower', 'Hyrule Castle Entrance (East)', 'Inverted Pyramid Hole', 'Hyrule Castle Ledge Drop', 'Hyrule Castle Ledge Courtyard Drop']), create_lw_region(player, 'Hyrule Castle East Entry', None, ['Hyrule Castle Outer East Rock', 'Hyrule Castle ES']), - create_lw_region(player, 'Wooden Bridge Area', None, ['Wooden Bridge Water Drop', 'Wooden Bridge NW', 'Wooden Bridge NE', 'Wooden Bridge SW']), + 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']), create_lw_region(player, 'Eastern Palace Area', None, ['Sahasrahlas Hut', 'Eastern Palace', 'Eastern Palace SW', 'Eastern Palace SE']), create_lw_region(player, 'Eastern Cliff', None, ['Sand Dunes Ledge Drop', 'Stone Bridge East Ledge Drop', 'Tree Line Ledge Drop', 'Eastern Palace Ledge Drop']), @@ -80,17 +85,18 @@ def create_regions(world, player): 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']), 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 Palace Statue Move', 'Desert ES']), + create_lw_region(player, 'Desert Area', None, ['Aginahs Cave', 'Desert Palace Statue Move', 'Checkerboard Ledge Approach', 'Desert ES']), create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (West)', 'Desert Ledge Outer Rocks', 'Desert Ledge Drop']), create_lw_region(player, 'Desert Palace Entrance (North) Spot', None, ['Desert Palace Entrance (North)', 'Desert Ledge Inner Rocks']), - create_lw_region(player, 'Desert Checkerboard Ledge', None, ['Checkerboard Cave', 'Checkerboard Ledge Drop']), + create_lw_region(player, 'Desert Checkerboard Ledge', None, ['Checkerboard Cave', 'Checkerboard Ledge Leave', 'Checkerboard Ledge Drop']), 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 Mouth Drop']), create_lw_region(player, 'Desert Palace Teleporter Ledge', None, ['Desert Teleporter Drop', 'Desert Teleporter']), create_lw_region(player, 'Desert Northeast Cliffs', None, ['Desert Boss Cliff Ledge Drop', 'Checkerboard Cliff Ledge Drop', 'Suburb Cliff Ledge Drop', 'Cave 45 Cliff Ledge Drop', 'Desert C Whirlpool Cliff Ledge Drop', 'Desert Pass Cliff Ledge Drop', 'Desert Pass Southeast Cliff Ledge Drop', 'Dam 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 Approach NW', 'Flute Boy Approach NC', 'Flute Boy Approach EC']), - create_lw_region(player, 'Cave 45 Ledge', None, ['Cave 45', 'Cave 45 Ledge Drop']), + create_lw_region(player, 'Flute Boy Approach Area', None, ['Flute Boy Bush (South)', 'Cave 45 Inverted Approach', 'Flute Boy Approach NW', 'Flute Boy Approach EC']), + create_lw_region(player, 'Flute Boy Bush Entry', None, ['Flute Boy Bush (North)', 'Flute Boy Approach NC']), + create_lw_region(player, 'Cave 45 Ledge', None, ['Cave 45', 'Cave 45 Inverted Leave', 'Cave 45 Ledge Drop']), create_lw_region(player, 'C Whirlpool Area', None, ['C Whirlpool Rock (Bottom)', 'C Whirlpool Water Entry', 'South Hyrule Teleporter', 'C Whirlpool EN', 'C Whirlpool ES', 'C Whirlpool SC']), create_lw_region(player, 'C Whirlpool Water', None, ['C Whirlpool Landing', 'C Whirlpool EC', 'C Whirlpool']), create_lw_region(player, 'C Whirlpool Outer Area', None, ['C Whirlpool Rock (Top)', 'C Whirlpool WC', 'C Whirlpool NW']), @@ -101,11 +107,11 @@ def create_regions(world, player): create_lw_region(player, 'Lake Hylia Northeast Bank', None, ['Lake Hylia Northeast Water Drop', 'Lake Hylia NE']), 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 West Pier', 'Lake Hylia East Pier', 'Lake Hylia NC', 'Lake Hylia EC', 'Lake Hylia Whirlpool']), + 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 NC', 'Lake Hylia EC', 'Lake Hylia Whirlpool']), create_lw_region(player, 'Ice Cave Area', None, ['Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave', 'Ice Cave SE', 'Ice Cave SW']), - create_lw_region(player, 'Desert Pass Area', ['Purple Chest'], ['Desert Fairy', '50 Rupee Cave', 'Desert Pass WS', 'Desert Pass EC', 'Desert Pass Rocks (North)']), + create_lw_region(player, 'Desert Pass Area', ['Purple Chest'], ['Desert Fairy', '50 Rupee Cave', 'Desert Pass Ladder (South)', 'Desert Pass WS', 'Desert Pass EC', 'Desert Pass Rocks (North)']), 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 Ledge Drop', 'Desert Pass WC']), + 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']), @@ -113,29 +119,29 @@ def create_regions(world, player): create_lw_region(player, 'Octoballoon Water Ledge', None, ['Octoballoon Waterfall Water Drop', 'Octoballoon NW']), 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 Bush Rock (East)', 'Lost Woods Mirror Spot', 'Skull Woods SE']), + 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)', 'Skull Woods Bush Rock (East)', 'Lost Woods East Mirror Spot', 'Skull Woods SE']), create_dw_region(player, 'Skull Woods Portal Entry', None, ['Skull Woods Bush Rock (West)', 'Lost Woods Entry Mirror Spot', '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', 'Lost Woods Pedestal Mirror Spot']), create_dw_region(player, 'Skull Woods Forgotten Path (Southwest)', None, ['Skull Woods Forgotten Bush (West)', 'Lost Woods Southwest Mirror Spot', 'Skull Woods SW']), - create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Lost Woods Northeast Mirror Spot', 'Skull Woods EN']), + create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Lost Woods East (Forgotten) Mirror Spot', 'Lost Woods West (Forgotten) Mirror Spot', 'Skull Woods EN']), create_dw_region(player, 'Dark Lumberjack Area', None, ['Dark World Lumberjack Shop', 'Lumberjack Mirror Spot', 'Dark Lumberjack WN', 'Dark Lumberjack SW']), - create_dw_region(player, 'West Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (West)', 'GT Approach Entry', 'West Death Mountain (Top) Mirror Spot', 'West Dark Death Mountain EN']), - create_dw_region(player, 'GT Approach', None, ['Ganons Tower']), - create_dw_region(player, 'West Dark Death Mountain (Bottom)', None, ['Spike Cave', 'Dark Death Mountain Fairy', 'Spectacle Rock Mirror Spot', 'West Dark Death Mountain ES']), - create_dw_region(player, 'East Dark Death Mountain (Top)', None, ['Superbunny Cave (Top)', 'Hookshot Cave', 'Dark Death Mountain Drop (East)', 'East Death Mountain (Top West) Mirror Spot', 'East Death Mountain (Top East) Mirror Spot', 'East Dark Death Mountain WN', 'East Dark Death Mountain EN']), - create_dw_region(player, 'East Dark Death Mountain (Bottom)', None, ['Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Fairy Ascension Mirror Spot']), - create_dw_region(player, 'East Dark Death Mountain (West Lip)', None, ['Death Mountain Bridge Mirror Spot', 'East Dark Death Mountain WS']), + create_dw_region(player, 'West Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (West)', 'GT Entry Approach', 'Dark Death Mountain Ladder (North)', 'West Death Mountain (Top) Mirror Spot', 'West Dark Death Mountain EN']), + create_dw_region(player, 'GT Approach', None, ['GT Entry Leave', 'Ganons Tower', 'Inverted Agahnims Tower']), + create_dw_region(player, 'West Dark Death Mountain (Bottom)', None, ['Dark Death Mountain Ladder (South)', 'Spike Cave', 'Dark Death Mountain Fairy', 'Dark Death Mountain Teleporter (West)', 'Spectacle Rock Mirror Spot', 'West Dark Death Mountain ES']), + create_dw_region(player, 'East Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (East)', 'Superbunny Cave (Top)', 'Hookshot Cave', 'East Death Mountain (Top West) Mirror Spot', 'East Death Mountain (Top East) Mirror Spot', 'East Dark Death Mountain WN', 'East Dark Death Mountain EN']), + create_dw_region(player, 'East Dark Death Mountain (Bottom)', None, ['Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Dark Death Mountain Teleporter (East)', 'Fairy Ascension Mirror Spot']), + create_dw_region(player, 'East Dark Death Mountain (Bottom Left)', None, ['Death Mountain Bridge Mirror Spot', 'East Dark Death Mountain WS']), create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)', 'Spiral Cave Mirror Spot', 'Mimic Cave Mirror Spot']), create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Turtle Rock Isolated Ledge Entrance', 'Isolated Ledge Mirror Spot']), create_dw_region(player, 'Dark Death Mountain Floating Island', None, ['Floating Island Drop', 'Hookshot Cave Back Entrance', 'Floating Island Mirror Spot']), - create_dw_region(player, 'Turtle Rock Area', None, ['Turtle Rock', 'TR Pegs Area Mirror Spot', 'Turtle Rock WN']), - create_dw_region(player, 'Turtle Rock Ledge', None, ['Turtle Rock Ledge Drop']), + create_dw_region(player, 'Turtle Rock Area', None, ['Turtle Rock Tail Ledge Drop', 'Turtle Rock', 'TR Pegs Area Mirror Spot', '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 Entrance Rock', 'Mountain Entry Mirror Spot', 'Bumper Cave NW', 'Bumper Cave SE']), create_dw_region(player, 'Bumper Cave Entrance', None, ['Bumper Cave (Bottom)', 'Mountain Entry Entrance Mirror Spot', 'Bumper Cave Ledge Drop']), create_dw_region(player, 'Bumper Cave Ledge', ['Bumper Cave Ledge'], ['Bumper Cave (Top)', 'Mountain Entry Ledge Mirror Spot', 'Bumper Cave Entrance Drop']), create_dw_region(player, 'Catfish Area', ['Catfish'], ['Zora Waterfall Mirror Spot', 'Catfish SE']), create_dw_region(player, 'Skull Woods Pass West Area', None, ['Skull Woods Pass Bush Row (West)', 'Lost Woods Pass West Mirror Spot', '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 Rock (Top)', 'Lost Woods Pass East Top Mirror Spot', 'Skull Woods Pass NE']), + create_dw_region(player, 'Skull Woods Pass East Top Area', None, ['Skull Woods Pass Bush Row (East)', 'Skull Woods Pass Rock (Top)', 'West Dark World Teleporter (Hammer)', 'West Dark World Teleporter (Rock)', 'Lost Woods Pass East Top Mirror Spot', 'Skull Woods Pass NE']), create_dw_region(player, 'Skull Woods Pass East Bottom Area', None, ['Skull Woods Pass Rock (Bottom)', 'Lost Woods East Bottom Mirror Spot', 'Skull Woods Pass SE']), create_dw_region(player, 'Dark Fortune Area', None, ['Fortune Teller (Dark)', 'Kakariko Fortune Mirror Spot', 'Dark Fortune NE', 'Dark Fortune EN', 'Dark Fortune ES', 'Dark Fortune SC']), create_dw_region(player, 'Outcast Pond Area', None, ['Kakariko Pond Mirror Spot', 'Outcast Pond NE', 'Outcast Pond WN', 'Outcast Pond WS', 'Outcast Pond SW', 'Outcast Pond SE', 'Outcast Pond EN', 'Outcast Pond ES']), @@ -151,10 +157,11 @@ def create_regions(world, player): create_dw_region(player, 'Catfish Approach Water', None, ['Catfish Approach WN']), create_dw_region(player, 'Village of Outcasts Area', None, ['Chest Game', 'Thieves Town', 'C-Shaped House', 'Brewery', 'Village of Outcasts Pegs', 'Kakariko Mirror Spot', 'Village of Outcasts NW', 'Village of Outcasts NC', 'Village of Outcasts NE', 'Village of Outcasts ES', 'Village of Outcasts SE']), create_dw_region(player, 'Dark Grassy Lawn', None, ['Dark World Shop', 'Kakariko Grass Mirror Spot', 'Grassy Lawn Pegs']), - create_dw_region(player, 'Shield Shop Area', None, ['Red Shield Shop', 'Forgotton Forest Mirror Spot', 'Shield Shop NW', 'Shield Shop NE']), + create_dw_region(player, 'Shield Shop Area', None, ['Shield Shop Fence (Outer) Ledge Drop', 'Forgotton Forest Mirror Spot', 'Shield Shop NW', 'Shield Shop NE']), + create_dw_region(player, 'Shield Shop Fence', None, ['Shield Shop Fence (Inner) Ledge Drop', 'Red Shield Shop', 'Forgotton Forest Fence Mirror Spot']), create_dw_region(player, 'Pyramid Area', ['Pyramid'], ['Pyramid Fairy', 'Pyramid Hole', 'HC Ledge Mirror Spot', 'HC Courtyard Mirror Spot', 'HC Area Mirror Spot', 'HC East Entry Mirror Spot', 'Pyramid ES']), - create_dw_region(player, 'Pyramid Exit Ledge', None, ['Pyramid Entrance', 'Pyramid Exit Drop']), - create_dw_region(player, 'Pyramid Pass', None, ['HC Area South Mirror Spot', 'Pyramid SW', 'Pyramid SE']), + create_dw_region(player, 'Pyramid Exit Ledge', None, ['Pyramid Entrance', 'Pyramid Exit Ledge Drop']), + create_dw_region(player, 'Pyramid Pass', None, ['Post Aga Inverted Teleporter', 'HC Area South Mirror Spot', 'Pyramid SW', 'Pyramid SE']), create_dw_region(player, 'Broken Bridge Area', None, ['Broken Bridge Hammer Rock (South)', 'Broken Bridge Water Drop', 'Wooden Bridge Mirror Spot', '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', 'Wooden Bridge Northeast Mirror Spot', 'Broken Bridge NE']), create_dw_region(player, 'Broken Bridge West', None, ['Broken Bridge West Water Drop', 'Wooden Bridge West Mirror Spot', 'Broken Bridge NW']), @@ -176,16 +183,16 @@ def create_regions(world, player): create_dw_region(player, 'Hammer Bridge South Area', None, ['Hammer Bridge Pegs (South)', 'Stone Bridge South Mirror Spot', 'Hammer Bridge WS', 'Hammer Bridge SC']), create_dw_region(player, 'Hammer Bridge Water', None, ['Hammer Bridge Pier', 'Hobo Mirror Spot', 'Hammer Bridge EC']), create_dw_region(player, 'Dark Central Cliffs', None, ['Dark Bonk Rocks Cliff Ledge Drop', 'Bomb Shop Cliff Ledge Drop', 'Hammer Bridge South Cliff Ledge Drop', 'Ice Lake Area Cliff Ledge Drop', 'Ice Palace Island FAWT Ledge Drop', - 'Hammer Bridge EC Cliff Water Drop', 'Dark Tree Line WC Cliff Water Drop', 'Dark C Whirlpool Outer Cliff Ledge Drop', 'Dark C Whirlpool Cliff Ledge Drop', 'Hype Cliff Ledge Drop']), #, 'Dark South Teleporter Cliff Ledge Drop']), #will add in Inverted + 'Hammer Bridge EC Cliff Water Drop', 'Dark Tree Line WC Cliff Water Drop', 'Dark C Whirlpool Outer Cliff Ledge Drop', 'Dark C Whirlpool Cliff Ledge Drop', 'Hype Cliff Ledge Drop', 'Dark South Teleporter Cliff Ledge Drop']), create_dw_region(player, 'Dark Tree Line Area', None, ['Dark Lake Hylia Fairy', 'Tree Line Mirror Spot', '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']), - create_dw_region(player, 'Palace of Darkness Nook Area', None, ['East Dark World Hint', 'Eastern Nook Mirror Spot', 'Palace of Darkness Nook NE']), + create_dw_region(player, 'Palace of Darkness Nook Area', None, ['East Dark World Hint', 'East Dark World Teleporter', 'Eastern Nook Mirror Spot', 'Palace of Darkness Nook NE']), create_dw_region(player, 'Misery Mire Area', None, ['Mire Shed', 'Misery Mire', 'Dark Desert Fairy', 'Dark Desert Hint', 'Desert Ledge Mirror Spot', 'Checkerboard Mirror Spot', 'DP Stairs Mirror Spot', 'DP Entrance (North) Mirror Spot']), - create_dw_region(player, 'Misery Mire Teleporter Ledge', None, ['Misery Mire Teleporter Ledge Drop']), + create_dw_region(player, 'Misery Mire Teleporter Ledge', None, ['Misery Mire Teleporter Ledge Drop', 'Misery Mire Teleporter']), create_dw_region(player, 'Mire Northeast Cliffs', None, ['Mire Cliff Ledge Drop', 'Archery Game Cliff Ledge Drop', 'Stumpy Approach Cliff Ledge Drop', 'Mire C Whirlpool Cliff Ledge Drop', 'Swamp Nook Cliff Ledge Drop', 'Swamp Cliff Ledge Drop', 'Bombos Tablet Ledge Mirror Spot']), create_dw_region(player, 'Stumpy Approach Area', None, ['Stumpy Approach Bush (South)', 'Cave 45 Mirror Spot', 'Stumpy Approach NW', 'Stumpy Approach EC']), create_dw_region(player, 'Stumpy Approach Bush Entry', None, ['Stumpy Approach Bush (North)', 'Flute Boy Entry Mirror Spot', 'Stumpy Approach NC']), - create_dw_region(player, 'Dark C Whirlpool Area', None, ['Dark C Whirlpool Rock (Bottom)', 'C Whirlpool Mirror Spot', 'Dark C Whirlpool Water Entry', 'Dark C Whirlpool EN', 'Dark C Whirlpool ES', 'Dark C Whirlpool SC']), + create_dw_region(player, 'Dark C Whirlpool Area', None, ['Dark C Whirlpool Rock (Bottom)', 'South Dark World Teleporter', 'C Whirlpool Mirror Spot', 'Dark C Whirlpool Water Entry', 'Dark C Whirlpool EN', 'Dark C Whirlpool ES', 'Dark C Whirlpool SC']), create_dw_region(player, 'Dark C Whirlpool Water', None, ['Dark C Whirlpool Landing', 'Dark C Whirlpool EC']), create_dw_region(player, 'Dark C Whirlpool Outer Area', None, ['Dark C Whirlpool Rock (Top)', 'C Whirlpool Outer Mirror Spot', 'Dark C Whirlpool WC', 'Dark C Whirlpool NW']), create_dw_region(player, 'Hype Cave Area', None, ['Hype Cave', 'Statues Mirror Spot', 'Hype Cave Water Entry', 'Hype Cave NC', 'Hype Cave WN', 'Hype Cave WS', 'Hype Cave SC']), @@ -194,9 +201,9 @@ def create_regions(world, player): create_dw_region(player, 'Ice Lake Northeast Bank', None, ['Ice Lake Northeast Water Drop', 'Lake Hylia Northeast Mirror Spot', 'Ice Lake NE']), create_dw_region(player, 'Ice Lake Ledge (West)', None, ['Ice Lake Southwest Water Drop', 'South Shore Mirror Spot', 'Ice Lake WS']), create_dw_region(player, 'Ice Lake Ledge (East)', None, ['Ice Lake Southeast Water Drop', 'South Shore East Mirror Spot', 'Ice Lake ES']), - create_dw_region(player, 'Ice Lake Water', None, ['Lake Hylia Island Mirror Spot', 'Ice Lake Northeast Pier', 'Ice Lake NC', 'Ice Lake EC']), - create_dw_region(player, 'Ice Lake Moat', None, ['Ice Lake Moat Water Drop', 'Ice Lake Northeast Pier Bomb Jump', 'Lake Hylia Water Mirror Spot']), - create_dw_region(player, 'Ice Palace Area', None, ['Ice Palace', 'Lake Hylia Central Island Mirror Spot']), + create_dw_region(player, 'Ice Lake Water', None, ['Ice Lake Northeast Pier', 'Lake Hylia Island Mirror Spot', 'Ice Lake NC', 'Ice Lake EC']), + create_dw_region(player, 'Ice Lake Moat', None, ['Ice Lake Moat Water Drop', 'Ice Lake Northeast Pier Bomb Jump', 'Ice Palace Approach', 'Lake Hylia Water Mirror Spot']), + create_dw_region(player, 'Ice Palace Area', None, ['Ice Palace Leave', 'Ice Palace', 'Ice Palace Teleporter', 'Lake Hylia Central Island Mirror Spot']), create_dw_region(player, 'Shopping Mall Area', None, ['Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Ice Cave Mirror Spot', 'Shopping Mall SE', 'Shopping Mall SW']), create_dw_region(player, 'Swamp Nook Area', None, ['Desert Pass Ledge Mirror Spot', 'Desert Pass Mirror Spot', 'Swamp Nook EC', 'Swamp Nook ES']), create_dw_region(player, 'Swamp Area', None, ['Swamp Palace', 'Dam Mirror Spot', 'Swamp WC', 'Swamp WS', 'Swamp NC', 'Swamp EC']), @@ -1063,6 +1070,37 @@ def mark_light_world_regions(world, player): queue.append(exit.connected_region) +def mark_dark_world_regions(world, player): + # cross world caves may have some sections marked as both in_light_world, and in_dark_work. + # That is ok. the bunny logic will check for this case and incorporate special rules. + queue = collections.deque(region for region in world.get_regions(player) if region.type == RegionType.DarkWorld) + seen = set(queue) + while queue: + current = queue.popleft() + current.is_dark_world = True + for exit in current.exits: + if exit.connected_region is None or exit.connected_region.type == RegionType.LightWorld: # todo: remove none check + # Don't venture into the light world + continue + if exit.connected_region not in seen: + seen.add(exit.connected_region) + queue.append(exit.connected_region) + + queue = collections.deque(region for region in world.get_regions(player) if region.type == RegionType.LightWorld) + seen = set(queue) + while queue: + current = queue.popleft() + current.is_light_world = True + for exit in current.exits: + if exit.connected_region is not None: + if exit.connected_region.type == RegionType.DarkWorld: + # Don't venture into the dark world + continue + if exit.connected_region not in seen: + seen.add(exit.connected_region) + queue.append(exit.connected_region) + + def create_shops(world, player): world.shops[player] = [] for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram) in shop_table.items(): diff --git a/Rules.py b/Rules.py index 926620c3..428eb008 100644 --- a/Rules.py +++ b/Rules.py @@ -127,6 +127,9 @@ def add_rule(spot, rule, combine='and'): else: spot.access_rule = lambda state: rule(state) and old_rule(state) +def add_bunny_rule(spot, player): + add_rule(spot, lambda state: state.is_not_bunny(spot.parent_region, player)) + def or_rule(rule1, rule2): return lambda state: rule1(state) or rule2(state) @@ -180,16 +183,6 @@ 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)) - #TODO: Remove the water drop ones, they should be redundant - # set_rule(world.get_entrance('C Whirlpool', player), lambda state: state.has('Flippers', player)) - # set_rule(world.get_entrance('River Bend Whirlpool', player), lambda state: state.has('Flippers', player)) - # set_rule(world.get_entrance('Lake Hylia Whirlpool', player), lambda state: state.has('Flippers', player)) - # set_rule(world.get_entrance('Zora Whirlpool', player), lambda state: state.has('Flippers', player)) - # set_rule(world.get_entrance('Kakariko Pond Whirlpool', player), lambda state: state.has('Flippers', player)) - # set_rule(world.get_entrance('Octoballoon Whirlpool', player), lambda state: state.has('Flippers', player)) - # set_rule(world.get_entrance('Qirn Jump Whirlpool', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - # set_rule(world.get_entrance('Bomber Corner Whirlpool', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - 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)) set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest @@ -703,6 +696,8 @@ def bomb_rules(world, player): add_rule(door.entrance, lambda state: state.can_use_bombs(player)) def default_rules(world, player): + set_rule(world.get_entrance('Other World S&Q', player), lambda state: state.has_Mirror(player) and state.has('Beat Agahnim 1', player)) + # Underworld Logic set_rule(world.get_entrance('Old Man Cave Exit (West)', player), lambda state: False) # drop cannot be climbed up set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: state.has('Mirror', player)) # can erase block @@ -715,8 +710,13 @@ def default_rules(world, player): set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player)) 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('Frog', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) # will get automatic moon pearl requirement - set_rule(world.get_location('Catfish', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_location('Frog', player), lambda state: state.can_lift_heavy_rocks(player)) # will get automatic moon pearl requirement + add_bunny_rule(world.get_location('Mushroom', player), 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('Frog', player), player) + add_bunny_rule(world.get_location('Catfish', player), player) # Entrance Access set_rule(world.get_entrance('Lumberjack Tree Tree', player), lambda state: state.has_Boots(player) and state.has('Beat Agahnim 1', player)) @@ -724,28 +724,58 @@ def default_rules(world, player): set_rule(world.get_entrance('Sanctuary Grave', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Kings Grave', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('Waterfall of Wishing', player), lambda state: state.has('Flippers', player)) # can be fake flippered into, but is in weird state inside that might prevent you from doing things. Can be improved in future Todo - set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle + 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('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) + add_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Inverted Pyramid Entrance', player), lambda state: state.world.mode[player] == 'inverted') set_rule(world.get_entrance('Bonk Fairy (Light)', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('Checkerboard Cave', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('50 Rupee Cave', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('20 Rupee Cave', player), lambda state: state.can_lift_rocks(player)) - set_rule(world.get_entrance('Skull Woods First Section Hole (North)', player), lambda state: state.has_Pearl(player)) # bunny cannot lift bush - set_rule(world.get_entrance('Skull Woods Second Section Hole', player), lambda state: state.has_Pearl(player)) # bunny cannot lift bush - set_rule(world.get_entrance('Skull Woods Final Section', player), lambda state: state.has('Fire Rod', player) and state.has_Pearl(player)) # bunny cannot use fire rod - set_rule(world.get_entrance('Thieves Town', player), lambda state: state.has_Pearl(player)) # bunny cannot pull - set_rule(world.get_entrance('Brewery', player), lambda state: state.has_Pearl(player)) # bomb required - set_rule(world.get_entrance('Dark World Hammer Peg Cave', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) - set_rule(world.get_entrance('Bonk Fairy (Dark)', player), lambda state: state.has_Pearl(player) and state.has_Boots(player)) - set_rule(world.get_entrance('Hype Cave', player), lambda state: state.has_Pearl(player)) # bomb required - set_rule(world.get_entrance('Palace of Darkness', player), lambda state: state.has_Pearl(player)) # kiki needs pearl - set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_Pearl(player) and state.has_sword(player) and state.has_misery_mire_medallion(player)) # sword required to cast magic (!) - set_rule(world.get_entrance('Dark Lake Hylia Ledge Fairy', player), lambda state: state.has_Pearl(player)) # bomb required - set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Hookshot Cave', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_Pearl(player) and 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 (!) + set_rule(world.get_entrance('Skull Woods Final Section', player), lambda state: state.has('Fire Rod', player)) + set_rule(world.get_entrance('Dark World Hammer Peg Cave', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) + add_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.world.mode[player] != 'inverted') + set_rule(world.get_entrance('Pyramid Entrance', player), lambda state: state.world.mode[player] != 'inverted') + set_rule(world.get_entrance('Bonk Fairy (Dark)', player), lambda state: state.has_Boots(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('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Hookshot Cave', player), lambda state: state.can_lift_rocks(player)) + 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 (!) + 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) + add_bunny_rule(world.get_entrance('North Fairy Cave Drop', player), player) + add_bunny_rule(world.get_entrance('Hyrule Castle Secret Entrance Drop', player), player) + add_bunny_rule(world.get_entrance('Agahnims Tower', player), player) + add_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Beat Agahnim 1', player), 'or') # barrier gets removed after killing agahnim, relevant for entrance shuffle + add_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.world.mode[player] != 'inverted') + add_bunny_rule(world.get_entrance('Bonk Fairy (Light)', player), player) + add_bunny_rule(world.get_entrance('Checkerboard Cave', player), player) + add_bunny_rule(world.get_entrance('50 Rupee Cave', player), player) + add_bunny_rule(world.get_entrance('20 Rupee Cave', player), player) + add_bunny_rule(world.get_entrance('Skull Woods First Section Hole (North)', player), player) # bunny cannot lift bush + add_bunny_rule(world.get_entrance('Skull Woods Second Section Hole', player), player) # bunny cannot lift bush + add_bunny_rule(world.get_entrance('Skull Woods Final Section', player), player) # bunny cannot use fire rod + add_bunny_rule(world.get_entrance('Thieves Town', player), player) # bunny cannot pull + add_bunny_rule(world.get_entrance('Brewery', player), player) # bomb required + add_bunny_rule(world.get_entrance('Dark World Hammer Peg Cave', player), player) + add_bunny_rule(world.get_entrance('Bonk Fairy (Dark)', player), player) + add_bunny_rule(world.get_entrance('Hype Cave', player), player) # bomb required + add_bunny_rule(world.get_entrance('Palace of Darkness', player), player) # kiki needs pearl + add_bunny_rule(world.get_entrance('Misery Mire', player), player) + add_bunny_rule(world.get_entrance('Dark Lake Hylia Ledge Fairy', player), player) # bomb required + add_bunny_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), player) + add_bunny_rule(world.get_entrance('Hookshot Cave', player), player) + add_bunny_rule(world.get_entrance('Turtle Rock', player), player) - # Region Access + # Region Access set_rule(world.get_entrance('Death Mountain Entrance Rock', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Graveyard Ladder (Top)', player), lambda state: state.has_Pearl(player) and state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Graveyard Ladder (Bottom)', player), lambda state: state.has_Pearl(player) and state.world.mode[player] == 'inverted') set_rule(world.get_entrance('Kings Grave Outer Rocks', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('Kings Grave Inner Rocks', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('Potion Shop Rock (South)', player), lambda state: state.can_lift_rocks(player)) @@ -755,86 +785,242 @@ def default_rules(world, 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 Inner East Rock', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Hyrule Castle Outer East Rock', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Cave 45 Inverted Approach', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Cave 45 Inverted Leave', player), lambda state: state.world.mode[player] == 'inverted') 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('Lake Hylia Island Pier', player), lambda state: state.world.mode[player] == 'inverted') set_rule(world.get_entrance('Desert Palace Statue Move', player), lambda state: state.has('Book of Mudora', player)) + set_rule(world.get_entrance('Checkerboard Ledge Approach', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Checkerboard Ledge Leave', player), lambda state: state.world.mode[player] == 'inverted') set_rule(world.get_entrance('Desert Ledge Outer Rocks', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Desert Ledge Inner Rocks', player), lambda state: state.can_lift_rocks(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('Desert Pass Ladder (North)', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Desert Pass Ladder (South)', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Spectacle Rock Approach', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Spectacle Rock Leave', player), lambda state: state.world.mode[player] == 'inverted') set_rule(world.get_entrance('DM Hammer Bridge (West)', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('DM Hammer Bridge (East)', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Floating Island Bridge (West)', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Floating Island Bridge (East)', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('East Death Mountain Mimic Ledge Drop', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Mimic Ledge Drop', player), lambda state: state.world.mode[player] == 'inverted') 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('Fairy Ascension Rocks (North)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Fairy Ascension Rocks (South)', 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('Skull Woods Bush Rock (West)', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Skull Woods Bush Rock (East)', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Skull Woods Forgotten Bush (West)', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Skull Woods Forgotten Bush (East)', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Skull Woods Second Section Hole', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Bumper Cave Entrance Rock', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Skull Woods Pass Bush Row (West)', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Skull Woods Pass Bush Row (East)', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Skull Woods Pass Rock (Top)', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Skull Woods Pass Rock (Bottom)', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Dark Witch Rock (North)', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Dark Witch Rock (South)', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Broken Bridge Hammer Rock (South)', player), lambda state: state.has_Pearl(player) and (state.can_lift_rocks(player) or state.has('Hammer', player))) - set_rule(world.get_entrance('Broken Bridge Hammer Rock (North)', player), lambda state: state.has_Pearl(player) and (state.can_lift_rocks(player) or state.has('Hammer', player))) - set_rule(world.get_entrance('Broken Bridge Hookshot Gap', player), lambda state: state.has_Pearl(player) and state.has('Hookshot', player)) - set_rule(world.get_entrance('Village of Outcasts Pegs', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) - set_rule(world.get_entrance('Grassy Lawn Pegs', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) - set_rule(world.get_entrance('Peg Area Rocks (West)', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Peg Area Rocks (East)', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Dig Game To Ledge Drop', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Archery Game Rock', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('Dark C Whirlpool Rock (Bottom)', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Dark C Whirlpool Rock (Top)', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) - set_rule(world.get_entrance('Hammer Bridge Pegs (North)', player), lambda state: state.has('Hammer', player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Hammer Bridge Pegs (South)', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) - set_rule(world.get_entrance('Stumpy Approach Bush (North)', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Stumpy Approach Bush (South)', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Skull Woods Bush Rock (West)', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Skull Woods Bush Rock (East)', player), lambda state: state.can_lift_rocks(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 Pass Rock (Top)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Skull Woods Pass Rock (Bottom)', player), lambda state: state.can_lift_heavy_rocks(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('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('Village of Outcasts Pegs', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('Grassy Lawn Pegs', player), lambda state: state.has('Hammer', 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('Archery Game Rock', 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)) + 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('Ice Palace Approach', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Ice Palace Leave', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Dark Death Mountain Ladder (North)', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Dark Death Mountain Ladder (South)', player), lambda state: state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('Turtle Rock Tail Ledge Drop', player), lambda state: state.world.mode[player] == 'inverted') + 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('Death Mountain Entrance Rock', player), player) + add_bunny_rule(world.get_entrance('Kings Grave Outer Rocks', player), player) + add_bunny_rule(world.get_entrance('Kings Grave Inner Rocks', player), player) + add_bunny_rule(world.get_entrance('Potion Shop Rock (South)', player), player) + add_bunny_rule(world.get_entrance('Potion Shop Rock (North)', 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('Bat Cave Ledge Peg', 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 Inner East Rock', player), player) + add_bunny_rule(world.get_entrance('Hyrule Castle Outer East Rock', 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('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 Rock (Bottom)', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Rock (Top)', player), player) + add_bunny_rule(world.get_entrance('Desert Ledge Outer Rocks', player), player) + add_bunny_rule(world.get_entrance('Desert Ledge Inner Rocks', 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('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 (North)', player), player) + add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (South)', player), player) + add_bunny_rule(world.get_entrance('TR Pegs Ledge Entry', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Bush Rock (West)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Bush 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('Bumper Cave Entrance Rock', 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 Rock (Top)', player), player) + add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Bottom)', 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('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('Village of Outcasts Pegs', player), player) + add_bunny_rule(world.get_entrance('Grassy Lawn Pegs', 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('Archery Game Rock', 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 Rock (Bottom)', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Rock (Top)', 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) set_rule(world.get_entrance('Flute Away', player), lambda state: state.can_flute(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('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('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 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('Octoballoon Waterfall Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Broken Bridge Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Broken Bridge Northeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Broken Bridge West Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Hammer Bridge Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Ice Lake Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Ice Lake Northeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Ice Lake Moat Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Ice Lake Southwest Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) set_rule(world.get_entrance('Ice Cave SW', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Shopping Mall SW', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Octoballoon Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Octoballoon Waterfall 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 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('Qirn Jump Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has('Flippers', 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('Hammer Bridge 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 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 Southeast Water Drop', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Shopping Mall SW', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Bomber Corner 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)) + add_bunny_rule(world.get_entrance('Zora Approach 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('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('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('C Whirlpool Water Entry', 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('Ice Cave SW', 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('Catfish Approach 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('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('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('Hammer Bridge Water Drop', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Water Entry', 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('Shopping Mall SW', 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) - set_rule(world.get_entrance('Kakariko Teleporter (Hammer)', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot lift bushes - set_rule(world.get_entrance('Kakariko Teleporter (Rock)', player), lambda state: state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) # bunny cannot lift bushes - set_rule(world.get_entrance('Top of Pyramid', player), lambda state: state.has('Beat Agahnim 1', player)) - set_rule(world.get_entrance('Top of Pyramid (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('South Teleporter Cliff Ledge Drop', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) # OWG only, can bomb clip out - 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('East Death Mountain Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) - set_rule(world.get_entrance('TR Pegs Teleporter', player), lambda state: state.has('Hammer', player)) + if world.mode[player] != 'inverted': + set_rule(world.get_entrance('Kakariko Teleporter (Hammer)', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot lift bushes + set_rule(world.get_entrance('Kakariko Teleporter (Rock)', player), lambda state: state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) # bunny cannot lift bushes + set_rule(world.get_entrance('Top of Pyramid', player), lambda state: state.has('Beat Agahnim 1', player)) + set_rule(world.get_entrance('Top of Pyramid (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('South Teleporter Cliff Ledge Drop', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) # OWG only, can bomb clip out + 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('East Death Mountain Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('TR Pegs Teleporter', player), lambda state: state.has('Hammer', player)) + + set_rule(world.get_entrance('West Dark World Teleporter (Hammer)', player), lambda state: False) + set_rule(world.get_entrance('West Dark World Teleporter (Rock)', player), lambda state: False) + set_rule(world.get_entrance('Post Aga Inverted Teleporter', player), lambda state: False) + set_rule(world.get_entrance('East Dark World Teleporter', player), lambda state: False) + set_rule(world.get_entrance('South Dark World Teleporter', player), lambda state: False) + set_rule(world.get_entrance('South Teleporter Cliff Ledge Drop', player), lambda state: False) + set_rule(world.get_entrance('Misery Mire Teleporter', player), lambda state: False) + set_rule(world.get_entrance('Ice Palace Teleporter', player), lambda state: False) + set_rule(world.get_entrance('Dark Death Mountain Teleporter (West)', player), lambda state: False) + set_rule(world.get_entrance('Dark Death Mountain Teleporter (East)', player), lambda state: False) + set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: False) + else: + set_rule(world.get_entrance('Kakariko Teleporter (Hammer)', player), lambda state: False) + set_rule(world.get_entrance('Kakariko Teleporter (Rock)', player), lambda state: False) + set_rule(world.get_entrance('Top of Pyramid', player), lambda state: False) + set_rule(world.get_entrance('Top of Pyramid (Inner)', player), lambda state: False) + set_rule(world.get_entrance('East Hyrule Teleporter', player), lambda state: False) + set_rule(world.get_entrance('South Hyrule Teleporter', player), lambda state: False) + set_rule(world.get_entrance('South Teleporter Cliff Ledge Drop', player), lambda state: False) + set_rule(world.get_entrance('Desert Teleporter', player), lambda state: False) + set_rule(world.get_entrance('Lake Hylia Teleporter', player), lambda state: False) + set_rule(world.get_entrance('East Death Mountain Teleporter', player), lambda state: False) + set_rule(world.get_entrance('TR Pegs Teleporter', player), lambda state: False) + + set_rule(world.get_entrance('West Dark World Teleporter (Hammer)', player), lambda state: state.has('Hammer', player) and state.has_Pearl(player)) + set_rule(world.get_entrance('West Dark World Teleporter (Rock)', player), lambda state: state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) # bunny cannot lift bushes + set_rule(world.get_entrance('Post Aga Inverted 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)) + 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)) + set_rule(world.get_entrance('South Teleporter Cliff Ledge Drop', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) + set_rule(world.get_entrance('Misery Mire Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Ice Palace Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Dark Death Mountain Teleporter (East)', player), lambda state: state.can_lift_heavy_rocks(player)) + set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: state.has('Hammer', player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Lost Woods Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Lost Woods East Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods Entry Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods Pedestal Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods Southwest Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Lost Woods Northeast Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Lost Woods East (Forgotten) Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Lost Woods West (Forgotten) Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lumberjack Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Mountain Entry Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Mountain Entry Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -845,10 +1031,10 @@ def default_rules(world, player): set_rule(world.get_entrance('Kakariko Fortune Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Kakariko Pond Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Forgotton Forest Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Forgotton Forest Fence Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Bonk Rock Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Graveyard Ledge Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player)) set_rule(world.get_entrance('Kings Grave Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player)) - # 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) set_rule(world.get_entrance('River Bend Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('River Bend East 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)) @@ -885,7 +1071,7 @@ def default_rules(world, player): set_rule(world.get_entrance('Links House Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Stone Bridge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Stone Bridge South Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Hobo Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Hobo Mirror Spot', player), lambda state: state.has_Mirror(player) and state.has_Pearl(player) and state.has('Flippers', player)) set_rule(world.get_entrance('Tree Line Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Checkerboard 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)) @@ -899,7 +1085,7 @@ def default_rules(world, player): set_rule(world.get_entrance('South Pass Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lake Hylia Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lake Hylia Northeast 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_Mirror(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Lake Hylia Island Mirror Spot', player), lambda state: state.has_Mirror(player) and state.has_Pearl(player) and state.has('Flippers', player)) set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lake Hylia Water Mirror Spot', player), lambda state: state.has_Mirror(player)), set_rule(world.get_entrance('South Shore Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -923,13 +1109,13 @@ def default_rules(world, player): if world.swords[player] == 'swordless': swordless_rules(world, player) - set_rule(world.get_entrance('GT Approach Entry', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) + set_rule(world.get_entrance('GT Entry Approach', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player) or state.world.mode[player] == 'inverted') + set_rule(world.get_entrance('GT Entry Leave', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player) or state.world.mode[player] == 'inverted' or state.world.shuffle[player] in ('restricted', 'full', 'crossed', 'insanity')) def inverted_rules(world, 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('Castle Ledge S&Q', player), lambda state: state.has_Mirror(player) and state.has('Beat Agahnim 1', player)) - + # overworld requirements set_rule(world.get_location('Ice Rod Cave', player), lambda state: state.has_Pearl(player)) set_rule(world.get_location('Maze Race', player), lambda state: state.has_Pearl(player)) @@ -1077,39 +1263,44 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Inverted Ganons Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) def no_glitches_rules(world, player): - if world.mode[player] != 'inverted': - # TODO: move some OW fake flipper situations here, new Water Drop Exits will need to be created - set_rule(world.get_entrance('Waterfall of Wishing Cave Entry', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('River Bend 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)) - set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - else: - add_rule(world.get_entrance('Zoras River', player), lambda state: state.has_Pearl(player) and (state.has('Flippers', player) or state.can_lift_rocks(player))) - add_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to - add_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Lake Hylia Warp', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to - set_rule(world.get_entrance('Northeast Light World Warp', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to - add_rule(world.get_entrance('Hobo Bridge', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - add_rule(world.get_entrance('Ice Lake Drop (East)', player), lambda state: state.has('Flippers', player)) - add_rule(world.get_entrance('Ice Lake Teleporter', player), lambda state: state.has('Flippers', player) and (state.has('Hammer', player) or state.can_lift_rocks(player))) - add_rule(world.get_entrance('Ice Lake Ledge Drop', player), lambda state: state.has('Flippers', player)) - add_rule(world.get_entrance('East Dark World Pier', player), lambda state: state.has('Flippers', player)) - add_rule(world.get_entrance('East Dark World River Pier', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Waterfall of Wishing Cave Entry', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('River Bend 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)) + set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + add_bunny_rule(world.get_entrance('Waterfall of Wishing Cave Entry', 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('Zora Approach Water Drop', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Water Entry', player), player) + add_bunny_rule(world.get_entrance('Statues Water Entry', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia South Water Drop', player), player) + add_bunny_rule(world.get_entrance('Octoballoon Water Drop', 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('Catfish Approach Water Drop', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), player) + add_bunny_rule(world.get_entrance('Hype Cave Water Entry', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Bomber Corner Water Drop', player), player) # todo: move some dungeon rules to no glictes 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)) @@ -1123,37 +1314,44 @@ def no_glitches_rules(world, player): def fake_flipper_rules(world, player): - if world.mode[player] != 'inverted': - set_rule(world.get_entrance('Waterfall of Wishing Cave Entry', player), lambda state: state.has('Flippers', player) or state.has_Pearl(player)) - set_rule(world.get_entrance('River Bend 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('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) - set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has_Pearl(player)) - else: - set_rule(world.get_entrance('Zoras River', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Lake Hylia Warp', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Northeast Light World Warp', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Hobo Bridge', player), lambda state: state.has_Pearl(player)) - set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: True) - set_rule(world.get_entrance('Dark Lake Hylia Ledge Drop', player), lambda state: True) - set_rule(world.get_entrance('East Dark World Pier', player), lambda state: True) + set_rule(world.get_entrance('Waterfall of Wishing Cave Entry', player), lambda state: state.has('Flippers', player) or (state.has_Pearl(player) and state.can_reach('C Whirlpool Area', player))) + set_rule(world.get_entrance('River Bend 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('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) + set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has_Pearl(player)) + add_bunny_rule(world.get_entrance('Waterfall of Wishing Cave Entry', 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('Zora Approach Water Drop', player), player) + add_bunny_rule(world.get_entrance('C Whirlpool Water Entry', player), player) + add_bunny_rule(world.get_entrance('Statues Water Entry', player), player) + add_bunny_rule(world.get_entrance('Lake Hylia South Water Drop', player), player) + add_bunny_rule(world.get_entrance('Octoballoon Water Drop', 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('Catfish Approach Water Drop', player), player) + add_bunny_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), player) + add_bunny_rule(world.get_entrance('Hype Cave Water Entry', player), player) + add_bunny_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), player) + add_bunny_rule(world.get_entrance('Bomber Corner Water Drop', player), player) def forbid_bomb_jump_requirements(world, player): diff --git a/test/inverted/TestInverted.py b/test/inverted/TestInverted.py index 06d7a655..9fba6b95 100644 --- a/test/inverted/TestInverted.py +++ b/test/inverted/TestInverted.py @@ -3,10 +3,9 @@ from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool from EntranceShuffle import link_inverted_entrances -from InvertedRegions import create_inverted_regions from ItemList import generate_itempool, difficulties from Items import ItemFactory -from Regions import mark_light_world_regions, create_dungeon_regions, create_shops +from Regions import create_regions, mark_light_world_regions, create_dungeon_regions, create_shops from RoomData import create_rooms from Rules import set_rules from test.TestBase import TestBase @@ -18,7 +17,7 @@ class TestInverted(TestBase): {1: True}, {1: False}, False, None, {1: False}) self.world.difficulty_requirements[1] = difficulties['normal'] self.world.intensity = {1: 1} - create_inverted_regions(self.world, 1) + create_regions(self.world, 1) create_dungeon_regions(self.world, 1) create_shops(self.world, 1) create_doors(self.world, 1) diff --git a/test/inverted/TestInvertedBombRules.py b/test/inverted/TestInvertedBombRules.py index bbcf43dd..9ce3c546 100644 --- a/test/inverted/TestInvertedBombRules.py +++ b/test/inverted/TestInvertedBombRules.py @@ -4,7 +4,6 @@ from BaseClasses import World from Dungeons import create_dungeons from EntranceShuffle import connect_entrance, Inverted_LW_Entrances, Inverted_LW_Dungeon_Entrances, Inverted_LW_Single_Cave_Doors, Inverted_Old_Man_Entrances, Inverted_DW_Entrances, Inverted_DW_Dungeon_Entrances, Inverted_DW_Single_Cave_Doors, \ Inverted_LW_Entrances_Must_Exit, Inverted_LW_Dungeon_Entrances_Must_Exit, Inverted_Bomb_Shop_Multi_Cave_Doors, Inverted_Bomb_Shop_Single_Cave_Doors, Inverted_Blacksmith_Single_Cave_Doors, Inverted_Blacksmith_Multi_Cave_Doors -from InvertedRegions import create_inverted_regions from ItemList import difficulties from Rules import set_inverted_big_bomb_rules from test.inverted.TestInverted import TestInverted diff --git a/test/inverted_owg/TestInvertedOWG.py b/test/inverted_owg/TestInvertedOWG.py index b772468f..c565461f 100644 --- a/test/inverted_owg/TestInvertedOWG.py +++ b/test/inverted_owg/TestInvertedOWG.py @@ -3,11 +3,10 @@ from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool from EntranceShuffle import link_inverted_entrances -from InvertedRegions import create_inverted_regions from ItemList import generate_itempool, difficulties from Items import ItemFactory from OverworldGlitchRules import create_owg_connections -from Regions import mark_light_world_regions, create_dungeon_regions, create_shops +from Regions import create_regions, mark_light_world_regions, create_dungeon_regions, create_shops from RoomData import create_rooms from Rules import set_rules from test.TestBase import TestBase @@ -19,7 +18,7 @@ class TestInvertedOWG(TestBase): {1: True}, {1: False}, False, None, {1: False}) self.world.difficulty_requirements[1] = difficulties['normal'] self.world.intensity = {1: 1} - create_inverted_regions(self.world, 1) + create_regions(self.world, 1) create_dungeon_regions(self.world, 1) create_shops(self.world, 1) create_doors(self.world, 1) diff --git a/test/owg/TestVanillaOWG.py b/test/owg/TestVanillaOWG.py index 0eb4271f..7aff5d8e 100644 --- a/test/owg/TestVanillaOWG.py +++ b/test/owg/TestVanillaOWG.py @@ -3,11 +3,10 @@ from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool from EntranceShuffle import link_entrances -from InvertedRegions import mark_dark_world_regions from ItemList import difficulties, generate_itempool from Items import ItemFactory from OverworldGlitchRules import create_owg_connections -from Regions import create_regions, create_dungeon_regions, create_shops +from Regions import create_regions, create_dungeon_regions, create_shops, mark_dark_world_regions from RoomData import create_rooms from Rules import set_rules from test.TestBase import TestBase diff --git a/test/vanilla/TestVanilla.py b/test/vanilla/TestVanilla.py index 1fc316e9..355f2769 100644 --- a/test/vanilla/TestVanilla.py +++ b/test/vanilla/TestVanilla.py @@ -3,10 +3,9 @@ from DoorShuffle import link_doors from Doors import create_doors from Dungeons import create_dungeons, get_dungeon_item_pool from EntranceShuffle import link_entrances -from InvertedRegions import mark_dark_world_regions from ItemList import difficulties, generate_itempool from Items import ItemFactory -from Regions import create_regions, create_dungeon_regions, create_shops +from Regions import create_regions, create_dungeon_regions, create_shops, mark_dark_world_regions from RoomData import create_rooms from Rules import set_rules from test.TestBase import TestBase