From cc5b1ab60f46bdb120c04cb7ef58e5db0eab15c6 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 2 May 2021 21:30:25 -0500 Subject: [PATCH 01/10] Renamed some areas --- EntranceShuffle.py | 4 +- OWEdges.py | 188 ++++++++++++++++++++++---------------------- OverworldShuffle.py | 156 ++++++++++++++++++------------------ Regions.py | 56 ++++++------- Rules.py | 62 +++++++-------- 5 files changed, 233 insertions(+), 233 deletions(-) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index e31c0b2d..f0702734 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -3141,7 +3141,7 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), ('Elder House Exit (West)', 'Kakariko Area'), ('North Fairy Cave Drop', 'North Fairy Cave'), ('North Fairy Cave', 'North Fairy Cave'), - ('North Fairy Cave Exit', 'Useless Fairy Area'), + ('North Fairy Cave Exit', 'River Bend Area'), ('Lost Woods Gamble', 'Lost Woods Gamble'), ('Fortune Teller (Light)', 'Fortune Teller (Light)'), ('Snitch Lady (East)', 'Snitch Lady (East)'), @@ -3453,7 +3453,7 @@ default_dungeon_connections = [('Desert Palace Entrance (South)', 'Desert South ('Palace of Darkness', 'Palace of Darkness Portal'), ('Palace of Darkness Exit', 'Palace of Darkness Area'), ('Swamp Palace', 'Swamp Portal'), # requires additional patch for flooding moat if moved - ('Swamp Palace Exit', 'Swamp Palace Area'), + ('Swamp Palace Exit', 'Swamp Area'), ('Turtle Rock', 'Turtle Rock Main Portal'), ('Turtle Rock Exit (Front)', 'Turtle Rock Area'), diff --git a/OWEdges.py b/OWEdges.py index a0c78cff..e39b9533 100644 --- a/OWEdges.py +++ b/OWEdges.py @@ -33,8 +33,8 @@ def create_owedges(world, player): create_owedge(player, 'East Death Mountain WS', 0x05, We, Ld, 0x03, 0x0d).coordInfo(0x1660), create_owedge(player, 'East Death Mountain EN', 0x05, Ea, Ld, 0x02, 0x06).coordInfo(0x0180), create_owedge(player, 'Death Mountain TR Pegs WN', 0x07, We, Ld, 0x02) .coordInfo(0x00e0), - create_owedge(player, 'DM Ascent NW', 0x0a, No, Ld, 0x01) .coordInfo(0x180a), - create_owedge(player, 'DM Ascent SE', 0x0a, So, Ld, 0x04) .coordInfo(0x1012), + create_owedge(player, 'Mountain Entry NW', 0x0a, No, Ld, 0x01) .coordInfo(0x180a), + create_owedge(player, 'Mountain Entry SE', 0x0a, So, Ld, 0x04) .coordInfo(0x1012), create_owedge(player, 'Zora Approach NE', 0x0f, No, Ld, 0x02) .coordInfo(0x009a), create_owedge(player, 'Zora Approach SE', 0x0f, So, Ld, 0x05) .coordInfo(0x1020), create_owedge(player, 'Lost Woods Pass NW', 0x10, No, Ld, 0x03) .coordInfo(0x1800), @@ -57,13 +57,13 @@ def create_owedges(world, player): create_owedge(player, 'Sanctuary EC', 0x13, Ea, Ld, 0x08) .coordInfo(0x04c0), create_owedge(player, 'Graveyard WC', 0x14, We, Ld, 0x08) .coordInfo(0x04e0), create_owedge(player, 'Graveyard EC', 0x14, Ea, Ld, 0x09) .coordInfo(0x04c0), - create_owedge(player, 'Useless Fairy SW', 0x15, So, Ld, 0x0b) .coordInfo(0x1004), - create_owedge(player, 'Useless Fairy SC', 0x15, So, Wr, 0x0c) .coordInfo(0x1018), - create_owedge(player, 'Useless Fairy SE', 0x15, So, Ld, 0x0d) .coordInfo(0x1020), - create_owedge(player, 'Useless Fairy WC', 0x15, We, Ld, 0x09) .coordInfo(0x04e0), - create_owedge(player, 'Useless Fairy EN', 0x15, Ea, Wr, 0x0a) .coordInfo(0x01c0), - create_owedge(player, 'Useless Fairy EC', 0x15, Ea, Ld, 0x0b) .coordInfo(0x04c0), - create_owedge(player, 'Useless Fairy ES', 0x15, Ea, Ld, 0x0c) .coordInfo(0x08c0), + create_owedge(player, 'River Bend SW', 0x15, So, Ld, 0x0b) .coordInfo(0x1004), + create_owedge(player, 'River Bend SC', 0x15, So, Wr, 0x0c) .coordInfo(0x1018), + create_owedge(player, 'River Bend SE', 0x15, So, Ld, 0x0d) .coordInfo(0x1020), + create_owedge(player, 'River Bend WC', 0x15, We, Ld, 0x09) .coordInfo(0x04e0), + create_owedge(player, 'River Bend EN', 0x15, Ea, Wr, 0x0a) .coordInfo(0x01c0), + create_owedge(player, 'River Bend EC', 0x15, Ea, Ld, 0x0b) .coordInfo(0x04c0), + create_owedge(player, 'River Bend ES', 0x15, Ea, Ld, 0x0c) .coordInfo(0x08c0), create_owedge(player, 'Potion Shop WN', 0x16, We, Wr, 0x0a) .coordInfo(0x01e0), create_owedge(player, 'Potion Shop WC', 0x16, We, Ld, 0x0b) .coordInfo(0x04e0), create_owedge(player, 'Potion Shop WS', 0x16, We, Ld, 0x0c) .coordInfo(0x08e0), @@ -91,9 +91,9 @@ def create_owedges(world, player): create_owedge(player, 'Eastern Palace SW', 0x1e, So, Ld, 0x13, 0x26).coordInfo(0x2002), create_owedge(player, 'Eastern Palace SE', 0x1e, So, Ld, 0x14, 0x27).coordInfo(0x2060), create_owedge(player, 'Blacksmith WS', 0x22, We, Ld, 0x10) .coordInfo(0x05e0), - create_owedge(player, 'Sand Dune NW', 0x25, No, Ld, 0x10) .coordInfo(0x1806), - create_owedge(player, 'Sand Dune SC', 0x25, So, Ld, 0x12) .coordInfo(0x100e), - create_owedge(player, 'Sand Dune WN', 0x25, We, Ld, 0x11) .coordInfo(0x01e0), + create_owedge(player, 'Sand Dunes NW', 0x25, No, Ld, 0x10) .coordInfo(0x1806), + create_owedge(player, 'Sand Dunes SC', 0x25, So, Ld, 0x12) .coordInfo(0x100e), + create_owedge(player, 'Sand Dunes WN', 0x25, We, Ld, 0x11) .coordInfo(0x01e0), create_owedge(player, 'Maze Race ES', 0x28, Ea, Ld, 0x12) .coordInfo(0x0940), create_owedge(player, 'Kakariko Suburb NE', 0x29, No, Ld, 0x11) .coordInfo(0x1820), create_owedge(player, 'Kakariko Suburb WS', 0x29, We, Ld, 0x12) .coordInfo(0x0960), @@ -101,11 +101,11 @@ def create_owedges(world, player): create_owedge(player, 'Flute Boy SW', 0x2a, So, Ld, 0x15) .coordInfo(0x1000), create_owedge(player, 'Flute Boy SC', 0x2a, So, Ld, 0x16) .coordInfo(0x100c), create_owedge(player, 'Flute Boy WS', 0x2a, We, Ld, 0x13) .coordInfo(0x0960), - create_owedge(player, 'Central Bonk Rock NW', 0x2b, No, Ld, 0x12) .coordInfo(0x1802), - create_owedge(player, 'Central Bonk Rock SW', 0x2b, So, Ld, 0x17) .coordInfo(0x1004), - create_owedge(player, 'Central Bonk Rock EN', 0x2b, Ea, Ld, 0x14) .coordInfo(0x0340), - create_owedge(player, 'Central Bonk Rock EC', 0x2b, Ea, Ld, 0x15) .coordInfo(0x05c0), - create_owedge(player, 'Central Bonk Rock ES', 0x2b, Ea, Ld, 0x16) .coordInfo(0x08c0), + create_owedge(player, 'Central Bonk Rocks NW', 0x2b, No, Ld, 0x12) .coordInfo(0x1802), + create_owedge(player, 'Central Bonk Rocks SW', 0x2b, So, Ld, 0x17) .coordInfo(0x1004), + create_owedge(player, 'Central Bonk Rocks EN', 0x2b, Ea, Ld, 0x14) .coordInfo(0x0340), + create_owedge(player, 'Central Bonk Rocks EC', 0x2b, Ea, Ld, 0x15) .coordInfo(0x05c0), + create_owedge(player, 'Central Bonk Rocks ES', 0x2b, Ea, Ld, 0x16) .coordInfo(0x08c0), create_owedge(player, 'Links House NE', 0x2c, No, Ld, 0x13) .coordInfo(0x1814), create_owedge(player, 'Links House SC', 0x2c, So, Ld, 0x18) .coordInfo(0x100e), create_owedge(player, 'Links House WN', 0x2c, We, Ld, 0x14) .coordInfo(0x0360), @@ -146,12 +146,12 @@ def create_owedges(world, player): create_owedge(player, 'Lake Hylia WS', 0x35, We, Ld, 0x24, 0x3d).coordInfo(0x1860), create_owedge(player, 'Lake Hylia EC', 0x35, Ea, Wr, 0x24, 0x3e).coordInfo(0x1680), create_owedge(player, 'Lake Hylia ES', 0x35, Ea, Ld, 0x25, 0x3e).coordInfo(0x1880), - create_owedge(player, 'Ice Rod Cave SW', 0x37, So, Wr, 0x1e) .coordInfo(0x1002), - create_owedge(player, 'Ice Rod Cave SE', 0x37, So, Ld, 0x1f) .coordInfo(0x101c), - create_owedge(player, 'Purple Chest WC', 0x3a, We, Ld, 0x1f) .coordInfo(0x03e0), - create_owedge(player, 'Purple Chest WS', 0x3a, We, Ld, 0x20) .coordInfo(0x0860), - create_owedge(player, 'Purple Chest EC', 0x3a, Ea, Ld, 0x20) .coordInfo(0x0640), - create_owedge(player, 'Purple Chest ES', 0x3a, Ea, Ld, 0x21) .coordInfo(0x08c0), + create_owedge(player, 'Ice Cave SW', 0x37, So, Wr, 0x1e) .coordInfo(0x1002), + create_owedge(player, 'Ice Cave SE', 0x37, So, Ld, 0x1f) .coordInfo(0x101c), + create_owedge(player, 'Desert Pass WC', 0x3a, We, Ld, 0x1f) .coordInfo(0x03e0), + create_owedge(player, 'Desert Pass WS', 0x3a, We, Ld, 0x20) .coordInfo(0x0860), + create_owedge(player, 'Desert Pass EC', 0x3a, Ea, Ld, 0x20) .coordInfo(0x0640), + create_owedge(player, 'Desert Pass ES', 0x3a, Ea, Ld, 0x21) .coordInfo(0x08c0), create_owedge(player, 'Dam NC', 0x3b, No, Ld, 0x1e) .coordInfo(0x1816), create_owedge(player, 'Dam WC', 0x3b, We, Ld, 0x21) .coordInfo(0x0660), create_owedge(player, 'Dam WS', 0x3b, We, Ld, 0x22) .coordInfo(0x08e0), @@ -230,9 +230,9 @@ def create_owedges(world, player): create_owedge(player, 'Palace of Darkness SW', 0x5e, So, Ld, 0x33, 0x66).coordInfo(0x2002), create_owedge(player, 'Palace of Darkness SE', 0x5e, So, Ld, 0x34, 0x67).coordInfo(0x2060), create_owedge(player, 'Hammer Pegs WS', 0x62, We, Ld, 0x36) .coordInfo(0x05e0), - create_owedge(player, 'Dark Dune NW', 0x65, No, Ld, 0x30) .coordInfo(0x1806), - create_owedge(player, 'Dark Dune SC', 0x65, So, Ld, 0x32) .coordInfo(0x100e), - create_owedge(player, 'Dark Dune WN', 0x65, We, Ld, 0x37) .coordInfo(0x01e0), + create_owedge(player, 'Dark Dunes NW', 0x65, No, Ld, 0x30) .coordInfo(0x1806), + create_owedge(player, 'Dark Dunes SC', 0x65, So, Ld, 0x32) .coordInfo(0x100e), + create_owedge(player, 'Dark Dunes WN', 0x65, We, Ld, 0x37) .coordInfo(0x01e0), create_owedge(player, 'Dig Game EC', 0x68, Ea, Ld, 0x37) .coordInfo(0x08c0), create_owedge(player, 'Dig Game ES', 0x68, Ea, Ld, 0x38) .coordInfo(0x0940), create_owedge(player, 'Frog NE', 0x69, No, Ld, 0x31) .coordInfo(0x1820), @@ -242,11 +242,11 @@ def create_owedges(world, player): create_owedge(player, 'Stumpy SW', 0x6a, So, Ld, 0x35) .coordInfo(0x1000), create_owedge(player, 'Stumpy SC', 0x6a, So, Ld, 0x36) .coordInfo(0x100c), create_owedge(player, 'Stumpy WS', 0x6a, We, Ld, 0x3a) .coordInfo(0x0960), - create_owedge(player, 'Dark Bonk Rock NW', 0x6b, No, Ld, 0x32) .coordInfo(0x1802), - create_owedge(player, 'Dark Bonk Rock SW', 0x6b, So, Ld, 0x37) .coordInfo(0x1004), - create_owedge(player, 'Dark Bonk Rock EN', 0x6b, Ea, Ld, 0x3a) .coordInfo(0x0340), - create_owedge(player, 'Dark Bonk Rock EC', 0x6b, Ea, Ld, 0x3b) .coordInfo(0x05c0), - create_owedge(player, 'Dark Bonk Rock ES', 0x6b, Ea, Ld, 0x3c) .coordInfo(0x08c0), + create_owedge(player, 'Dark Bonk Rocks NW', 0x6b, No, Ld, 0x32) .coordInfo(0x1802), + create_owedge(player, 'Dark Bonk Rocks SW', 0x6b, So, Ld, 0x37) .coordInfo(0x1004), + create_owedge(player, 'Dark Bonk Rocks EN', 0x6b, Ea, Ld, 0x3a) .coordInfo(0x0340), + create_owedge(player, 'Dark Bonk Rocks EC', 0x6b, Ea, Ld, 0x3b) .coordInfo(0x05c0), + create_owedge(player, 'Dark Bonk Rocks ES', 0x6b, Ea, Ld, 0x3c) .coordInfo(0x08c0), create_owedge(player, 'Big Bomb Shop NE', 0x6c, No, Ld, 0x33) .coordInfo(0x1814), create_owedge(player, 'Big Bomb Shop SC', 0x6c, So, Ld, 0x38) .coordInfo(0x100e), create_owedge(player, 'Big Bomb Shop WN', 0x6c, We, Ld, 0x3b) .coordInfo(0x0360), @@ -278,27 +278,27 @@ def create_owedges(world, player): create_owedge(player, 'Hype Cave WN', 0x74, We, Ld, 0x42) .coordInfo(0x02e0), create_owedge(player, 'Hype Cave WC', 0x74, We, Wr, 0x43) .coordInfo(0x05e0), create_owedge(player, 'Hype Cave WS', 0x74, We, Ld, 0x44) .coordInfo(0x08e0), - create_owedge(player, 'Dark Lake Hylia NW', 0x75, No, Ld, 0x3b) .coordInfo(0x180c), - create_owedge(player, 'Dark Lake Hylia NC', 0x75, No, Wr, 0x3c, 0x76).coordInfo(0x185a), - create_owedge(player, 'Dark Lake Hylia NE', 0x75, No, Ld, 0x3d, 0x76).coordInfo(0x1860), - create_owedge(player, 'Dark Lake Hylia WS', 0x75, We, Ld, 0x48, 0x7d).coordInfo(0x1860), - create_owedge(player, 'Dark Lake Hylia EC', 0x75, Ea, Wr, 0x48, 0x7e).coordInfo(0x1680), - create_owedge(player, 'Dark Lake Hylia ES', 0x75, Ea, Ld, 0x49, 0x7e).coordInfo(0x1880), - create_owedge(player, 'Dark Shopping Mall SW', 0x77, So, Wr, 0x3e) .coordInfo(0x1002), - create_owedge(player, 'Dark Shopping Mall SE', 0x77, So, Ld, 0x3f) .coordInfo(0x101c), - create_owedge(player, 'Dark Purple Chest EC', 0x7a, Ea, Ld, 0x44) .coordInfo(0x0640), - create_owedge(player, 'Dark Purple Chest ES', 0x7a, Ea, Ld, 0x45) .coordInfo(0x08c0), - create_owedge(player, 'Swamp Palace NC', 0x7b, No, Ld, 0x3e) .coordInfo(0x1816), - create_owedge(player, 'Swamp Palace WC', 0x7b, We, Ld, 0x45) .coordInfo(0x0660), - create_owedge(player, 'Swamp Palace WS', 0x7b, We, Ld, 0x46) .coordInfo(0x08e0), - create_owedge(player, 'Swamp Palace EC', 0x7b, Ea, Ld, 0x46) .coordInfo(0x04c0), + create_owedge(player, 'Ice Lake NW', 0x75, No, Ld, 0x3b) .coordInfo(0x180c), + create_owedge(player, 'Ice Lake NC', 0x75, No, Wr, 0x3c, 0x76).coordInfo(0x185a), + create_owedge(player, 'Ice Lake NE', 0x75, No, Ld, 0x3d, 0x76).coordInfo(0x1860), + create_owedge(player, 'Ice Lake WS', 0x75, We, Ld, 0x48, 0x7d).coordInfo(0x1860), + create_owedge(player, 'Ice Lake EC', 0x75, Ea, Wr, 0x48, 0x7e).coordInfo(0x1680), + create_owedge(player, 'Ice Lake ES', 0x75, Ea, Ld, 0x49, 0x7e).coordInfo(0x1880), + create_owedge(player, 'Shopping Mall SW', 0x77, So, Wr, 0x3e) .coordInfo(0x1002), + create_owedge(player, 'Shopping Mall SE', 0x77, So, Ld, 0x3f) .coordInfo(0x101c), + create_owedge(player, 'Swamp Nook EC', 0x7a, Ea, Ld, 0x44) .coordInfo(0x0640), + create_owedge(player, 'Swamp Nook ES', 0x7a, Ea, Ld, 0x45) .coordInfo(0x08c0), + create_owedge(player, 'Swamp NC', 0x7b, No, Ld, 0x3e) .coordInfo(0x1816), + create_owedge(player, 'Swamp WC', 0x7b, We, Ld, 0x45) .coordInfo(0x0660), + create_owedge(player, 'Swamp WS', 0x7b, We, Ld, 0x46) .coordInfo(0x08e0), + create_owedge(player, 'Swamp EC', 0x7b, Ea, Ld, 0x46) .coordInfo(0x04c0), create_owedge(player, 'Dark South Pass NC', 0x7c, No, Ld, 0x3f) .coordInfo(0x1810), create_owedge(player, 'Dark South Pass WC', 0x7c, We, Ld, 0x47) .coordInfo(0x04e0), create_owedge(player, 'Dark South Pass ES', 0x7c, Ea, Ld, 0x47) .coordInfo(0x08c0), - create_owedge(player, 'Southeast DW NW', 0x7f, No, Wr, 0x40) .coordInfo(0x1802), - create_owedge(player, 'Southeast DW NE', 0x7f, No, Ld, 0x41) .coordInfo(0x181c), - create_owedge(player, 'Southeast DW WC', 0x7f, We, Wr, 0x49) .coordInfo(0x05e0), - create_owedge(player, 'Southeast DW WS', 0x7f, We, Ld, 0x4a) .coordInfo(0x0860), + create_owedge(player, 'Bomber Corner NW', 0x7f, No, Wr, 0x40) .coordInfo(0x1802), + create_owedge(player, 'Bomber Corner NE', 0x7f, No, Ld, 0x41) .coordInfo(0x181c), + create_owedge(player, 'Bomber Corner WC', 0x7f, We, Wr, 0x49) .coordInfo(0x05e0), + create_owedge(player, 'Bomber Corner WS', 0x7f, We, Ld, 0x4a) .coordInfo(0x0860), create_owedge(player, 'Master Sword Meadow SC', 0x80, So, Ld, 0x40) .coordInfo(0x0000), create_owedge(player, 'Hobo EC', 0x80, Ea, Wr, 0x4a) .coordInfo(0x0020), create_owedge(player, 'Zoras Domain SW', 0x81, So, Ld, 0x41, 0x89).coordInfo(0x1782) @@ -337,10 +337,10 @@ OWEdgeGroups = { ['Lumberjack WN'], ['Death Mountain TR Pegs WN'], ['Graveyard WC'], - ['Useless Fairy WC'], + ['River Bend WC'], ['Hyrule Castle WN'], ['Blacksmith WS'], - ['Sand Dune WN'], + ['Sand Dunes WN'], ['Kakariko Suburb WS'], ['Flute Boy WS'], ['Stone Bridge WS'], @@ -357,7 +357,7 @@ OWEdgeGroups = { (LW, Vt, Ld, 1): ( [ ['Lumberjack SW'], - ['DM Ascent SE'], + ['Mountain Entry SE'], ['Lost Woods SE'], ['Zora Approach SE'], ['Kakariko Fortune SC'], @@ -365,26 +365,26 @@ OWEdgeGroups = { ['Kakariko SE'], ['Hyrule Castle SW'], ['Hyrule Castle SE'], - ['Sand Dune SC'], + ['Sand Dunes SC'], ['Eastern Palace SW'], ['Eastern Palace SE'], - ['Central Bonk Rock SW'], + ['Central Bonk Rocks SW'], ['Links House SC'], ['Stone Bridge SC'], ['C Whirlpool SC'], ['Statues SC'], ['Tree Line SE'], - ['Ice Rod Cave SE'] + ['Ice Cave SE'] ], [ - ['DM Ascent NW'], + ['Mountain Entry NW'], ['Kakariko Pond NE'], ['Kakariko Fortune NE'], ['Zora Warning NE'], ['Kakariko NE'], - ['Sand Dune NW'], + ['Sand Dunes NW'], ['Kakariko Suburb NE'], - ['Central Bonk Rock NW'], + ['Central Bonk Rocks NW'], ['Links House NE'], ['Stone Bridge NC'], ['Tree Line NW'], @@ -396,25 +396,25 @@ OWEdgeGroups = { ['South Pass NC'], ['Lake Hylia NE'], ['Octoballoon NE'] - ], + ] ), (LW, Hz, Ld, 2): ( [ ['Kakariko Fortune EN', 'Kakariko Fortune ES'], ['Kakariko Pond EN', 'Kakariko Pond ES'], ['Desert EC', 'Desert ES'], - ['Purple Chest EC', 'Purple Chest ES'], - ['Useless Fairy EC', 'Useless Fairy ES'], + ['Desert Pass EC', 'Desert Pass ES'], + ['River Bend EC', 'River Bend ES'], ['C Whirlpool EN', 'C Whirlpool ES'] ], [ ['Kakariko Pond WN', 'Kakariko Pond WS'], ['Sanctuary WN', 'Sanctuary WS'], - ['Purple Chest WC', 'Purple Chest WS'], + ['Desert Pass WC', 'Desert Pass WS'], ['Dam WC', 'Dam WS'], ['Potion Shop WC', 'Potion Shop WS'], ['Statues WN', 'Statues WS'] - ], + ] ), (LW, Vt, Ld, 2): ( [ @@ -422,7 +422,7 @@ OWEdgeGroups = { ['Lost Woods Pass SW', 'Lost Woods Pass SE'], ['Kakariko Pond SW', 'Kakariko Pond SE'], ['Flute Boy SW', 'Flute Boy SC'], - ['Useless Fairy SW', 'Useless Fairy SE'] + ['River Bend SW', 'River Bend SE'] ], [ ['Lost Woods Pass NW', 'Lost Woods Pass NE'], @@ -430,10 +430,10 @@ OWEdgeGroups = { ['Forgotten Forest NW', 'Forgotten Forest NE'], ['Cave 45 NW', 'Cave 45 NC'], ['Wooden Bridge NW', 'Wooden Bridge NE'] - ], + ] ), (LW, Hz, Ld, 3): ( - [['Central Bonk Rock EN', 'Central Bonk Rock EC', 'Central Bonk Rock ES']], + [['Central Bonk Rocks EN', 'Central Bonk Rocks EC', 'Central Bonk Rocks ES']], [['Links House WN', 'Links House WC', 'Links House WS']] ), (LW, Hz, Wr, 1): ( @@ -441,7 +441,7 @@ OWEdgeGroups = { ['Potion Shop EN'], ['Lake Hylia EC'], ['Stone Bridge EC'], - ['Useless Fairy EN'], + ['River Bend EN'], ['C Whirlpool EC'] ], [ @@ -455,8 +455,8 @@ OWEdgeGroups = { (LW, Vt, Wr, 1): ( [ ['Tree Line SC'], - ['Ice Rod Cave SW'], - ['Useless Fairy SC'] + ['Ice Cave SW'], + ['River Bend SC'] ], [ ['Lake Hylia NC'], @@ -475,10 +475,10 @@ OWEdgeGroups = { ['Frog ES'], ['Big Bomb Shop ES'], ['Circle of Bushes EC'], - ['Swamp Palace EC'], + ['Swamp EC'], ['Dark South Pass ES'], ['Dark Witch EC'], - ['Dark Lake Hylia ES'], + ['Ice Lake ES'], ['Hammer Bridge EN'], ['West Dark Death Mountain EN'], ['West Dark Death Mountain ES'] @@ -489,14 +489,14 @@ OWEdgeGroups = { ['Dark Graveyard WC'], ['Qirn Jump WC'], ['Hammer Pegs WS'], - ['Dark Dune WN'], + ['Dark Dunes WN'], ['Stumpy WS'], ['Hammer Bridge WS'], ['Dark C Whirlpool WC'], ['Dark South Pass WC'], - ['Dark Lake Hylia WS'], + ['Ice Lake WS'], ['Catfish Approach WC'], - ['Southeast DW WS'], + ['Bomber Corner WS'], ['Dark Tree Line WN'], ['East Dark Death Mountain WN'], ['East Dark Death Mountain WS'] @@ -513,16 +513,16 @@ OWEdgeGroups = { ['Village of Outcasts SE'], ['Pyramid SW'], ['Pyramid SE'], - ['Dark Dune SC'], + ['Dark Dunes SC'], ['Palace of Darkness SW'], ['Palace of Darkness SE'], - ['Dark Bonk Rock SW'], + ['Dark Bonk Rocks SW'], ['Big Bomb Shop SC'], ['Hammer Bridge SC'], ['Dark C Whirlpool SC'], ['Hype Cave SC'], ['Dark Tree Line SE'], - ['Dark Shopping Mall SE'] + ['Shopping Mall SE'] ], [ ['Bumper Cave NW'], @@ -530,27 +530,27 @@ OWEdgeGroups = { ['Dark Fortune NE'], ['Catfish Approach NE'], ['Village of Outcasts NE'], - ['Dark Dune NW'], + ['Dark Dunes NW'], ['Frog NE'], - ['Dark Bonk Rock NW'], + ['Dark Bonk Rocks NW'], ['Big Bomb Shop NE'], ['Hammer Bridge NC'], ['Dark Tree Line NW'], ['Palace of Darkness Nook NE'], ['Dark C Whirlpool NW'], ['Hype Cave NC'], - ['Dark Lake Hylia NW'], - ['Swamp Palace NC'], + ['Ice Lake NW'], + ['Swamp NC'], ['Dark South Pass NC'], - ['Dark Lake Hylia NE'], - ['Southeast DW NE'] - ], + ['Ice Lake NE'], + ['Bomber Corner NE'] + ] ), (DW, Hz, Ld, 2): ( [ ['Dark Fortune EN', 'Dark Fortune ES'], ['Outcast Pond EN', 'Outcast Pond ES'], - ['Dark Purple Chest EC', 'Dark Purple Chest ES'], + ['Swamp Nook EC', 'Swamp Nook ES'], ['Dig Game EC', 'Dig Game ES'], ['Qirn Jump EC', 'Qirn Jump ES'], ['Dark C Whirlpool EN', 'Dark C Whirlpool ES'] @@ -558,11 +558,11 @@ OWEdgeGroups = { [ ['Outcast Pond WN', 'Outcast Pond WS'], ['Dark Chapel WN', 'Dark Chapel WS'], - ['Swamp Palace WC', 'Swamp Palace WS'], + ['Swamp WC', 'Swamp WS'], ['Frog WC', 'Frog WS'], ['Dark Witch WC', 'Dark Witch WS'], ['Hype Cave WN', 'Hype Cave WS'] - ], + ] ), (DW, Vt, Ld, 2): ( [ @@ -578,23 +578,23 @@ OWEdgeGroups = { ['Shield Shop NW', 'Shield Shop NE'], ['Circle of Bushes NW', 'Circle of Bushes NC'], ['Broken Bridge NW', 'Broken Bridge NE'] - ], + ] ), (DW, Hz, Ld, 3): ( - [['Dark Bonk Rock EN', 'Dark Bonk Rock EC', 'Dark Bonk Rock ES']], + [['Dark Bonk Rocks EN', 'Dark Bonk Rocks EC', 'Dark Bonk Rocks ES']], [['Big Bomb Shop WN', 'Big Bomb Shop WC', 'Big Bomb Shop WS']] ), (DW, Hz, Wr, 1): ( [ ['Dark Witch EN'], - ['Dark Lake Hylia EC'], + ['Ice Lake EC'], ['Hammer Bridge EC'], ['Qirn Jump EN'], ['Dark C Whirlpool EC'] ], [ ['Catfish Approach WN'], - ['Southeast DW WC'], + ['Bomber Corner WC'], ['Dark Tree Line WC'], ['Dark Witch WN'], ['Hype Cave WC'] @@ -603,12 +603,12 @@ OWEdgeGroups = { (DW, Vt, Wr, 1): ( [ ['Dark Tree Line SC'], - ['Dark Shopping Mall SW'], + ['Shopping Mall SW'], ['Qirn Jump SC'] ], [ - ['Dark Lake Hylia NC'], - ['Southeast DW NW'], + ['Ice Lake NC'], + ['Bomber Corner NW'], ['Broken Bridge NC'] ] ) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 1a0d4b05..1cb36ca8 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -226,27 +226,27 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Flute Spot 8', 'Octoballoon Area'), # Whirlpool Connections - ('C Whirlpool', 'Useless Fairy Water'), - ('Useless Fairy Whirlpool', 'C Whirlpool Area'), + ('C Whirlpool', 'River Bend Water'), + ('River Bend Whirlpool', 'C Whirlpool Area'), ('Lake Hylia Whirlpool', 'Zora Approach Area'), ('Zora Whirlpool', 'Lake Hylia Water'), ('Kakariko Pond Whirlpool', 'Octoballoon Water'), ('Octoballoon Whirlpool', 'Kakariko Pond Area'), - ('Qirn Jump Whirlpool', 'Southeast DW Water'), - ('Southeast DW Whirlpool', 'Qirn Jump Water'), + ('Qirn Jump Whirlpool', 'Bomber Corner Water'), + ('Bomber Corner Whirlpool', 'Qirn Jump Water'), # Intra-tile OW Connections ('Death Mountain Entrance Rock', 'Death Mountain Entrance'), - ('Death Mountain Entrance Drop', 'DM Ascent Area'), - ('Death Mountain Return Drop', 'DM Ascent Area'), + ('Death Mountain Entrance Drop', 'Mountain Entry Area'), + ('Death Mountain Return Drop', 'Mountain Entry Area'), ('Bonk Rock Ledge Drop', 'Sanctuary Area'), ('Kings Grave Outer Rocks', 'Kings Grave Area'), ('Kings Grave Inner Rocks', 'Graveyard Area'), ('Graveyard Ledge Drop', 'Graveyard Area'), - ('Useless Fairy Water Drop', 'Useless Fairy Water'), - ('Useless Fairy East Water Drop', 'Useless Fairy Water'), - ('Useless Fairy West Pier', 'Useless Fairy Area'), - ('Useless Fairy East Pier', 'Useless Fairy East Bank'), + ('River Bend Water Drop', 'River Bend Water'), + ('River Bend East Water Drop', 'River Bend Water'), + ('River Bend West Pier', 'River Bend Area'), + ('River Bend East Pier', 'River Bend East Bank'), ('Potion Shop Water Drop', 'Potion Shop Water'), ('Potion Shop Northeast Water Drop', 'Potion Shop Water'), ('Potion Shop Rock (South)', 'Potion Shop Northeast'), @@ -272,9 +272,9 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Desert Mouth Drop', 'Desert Area'), ('Desert Teleporter Drop', 'Desert Area'), ('Bombos Tablet Drop', 'Desert Area'), - ('Purple Chest Ledge Drop', 'Purple Chest Area'), - ('Purple Chest Rocks (North)', 'Purple Chest Southeast'), - ('Purple Chest Rocks (South)', 'Purple Chest Area'), + ('Desert Pass Ledge Drop', 'Desert Pass Area'), + ('Desert Pass Rocks (North)', 'Desert Pass Southeast'), + ('Desert Pass Rocks (South)', 'Desert Pass Area'), ('Lake Hylia Water Drop', 'Lake Hylia Water'), ('Lake Hylia South Water Drop', 'Lake Hylia Water'), ('Lake Hylia Northeast Water Drop', 'Lake Hylia Water'), @@ -340,14 +340,14 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Hammer Bridge Pegs (South)', 'Hammer Bridge North Area'), ('Hammer Bridge Water Drop', 'Hammer Bridge Water'), ('Hammer Bridge Pier', 'Hammer Bridge North Area'), - ('Dark Lake Hylia Water Drop', 'Dark Lake Hylia Water'), - ('Dark Lake Hylia Northeast Water Drop', 'Dark Lake Hylia Water'), - ('Dark Lake Hylia Southwest Water Drop', 'Dark Lake Hylia Water'), - ('Dark Lake Hylia Southeast Water Drop', 'Dark Lake Hylia Water'), - ('Dark Lake Hylia Northeast Pier', 'Dark Lake Hylia Northeast Bank'), - ('Southeast DW Water Drop', 'Southeast DW Water'), - ('Southeast DW Waterfall Water Drop', 'Southeast DW Water'), - ('Southeast DW Pier', 'Southeast DW Area'), + ('Ice Lake Water Drop', 'Ice Lake Water'), + ('Ice Lake Northeast Water Drop', 'Ice Lake Water'), + ('Ice Lake Southwest Water Drop', 'Ice Lake Water'), + ('Ice Lake Southeast Water Drop', 'Ice Lake Water'), + ('Ice Lake Northeast Pier', 'Ice Lake Northeast Bank'), + ('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)', 'Dark Death Mountain (West Bottom)'), ('Dark Death Mountain Drop (East)', 'Dark Death Mountain (East Bottom)'), @@ -374,9 +374,9 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Lost Woods Southwest Mirror Spot', 'Lost Woods Area'), ('Lost Woods Northeast Mirror Spot', 'Lost Woods Area'), ('Lumberjack Mirror Spot', 'Lumberjack Area'), - ('DM Ascent Mirror Spot', 'DM Ascent Area'), - ('DM Ascent Entrance Mirror Spot', 'Death Mountain Entrance'), - ('DM Ascent Ledge Mirror Spot', 'Death Mountain Return Ledge'), + ('Mountain Entry Mirror Spot', 'Mountain Entry Area'), + ('Mountain Entry Entrance Mirror Spot', 'Death Mountain Entrance'), + ('Mountain Entry Ledge Mirror Spot', 'Death Mountain Return Ledge'), ('Lost Woods Pass West Mirror Spot', 'Lost Woods Pass West Area'), ('Lost Woods Pass East Top Mirror Spot', 'Lost Woods Pass East Top Area'), ('Lost Woods East Bottom Mirror Spot', 'Lost Woods Pass East Bottom Area'), @@ -386,8 +386,8 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Bonk Rock Ledge Mirror Spot', 'Bonk Rock Ledge'), ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), ('Kings Grave Mirror Spot', 'Kings Grave Area'), - ('Useless Fairy Mirror Spot', 'Useless Fairy Area'), - ('Useless Fairy East Mirror Spot', 'Useless Fairy East Bank'), + ('River Bend Mirror Spot', 'River Bend Area'), + ('River Bend East Mirror Spot', 'River Bend East Bank'), ('Potion Shop Mirror Spot', 'Potion Shop Area'), ('Potion Shop Northeast Mirror Spot', 'Potion Shop Northeast'), ('Zora Warning Mirror Spot', 'Zora Warning Area'), @@ -405,7 +405,7 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Wooden Bridge Mirror Spot', 'Wooden Bridge Area'), ('Wooden Bridge Northeast Mirror Spot', 'Wooden Bridge Area'), ('Wooden Bridge West Mirror Spot', 'Wooden Bridge Area'), - ('Sand Dune Mirror Spot', 'Sand Dune Area'), + ('Sand Dunes Mirror Spot', 'Sand Dunes Area'), ('Eastern Palace Mirror Spot', 'Eastern Palace Area'), ('Eastern Nook Mirror Spot', 'Eastern Nook Area'), ('Maze Race Mirror Spot', 'Maze Race Ledge'), @@ -417,7 +417,7 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Cave 45 Mirror Spot', 'Cave 45 Ledge'), ('C Whirlpool Mirror Spot', 'C Whirlpool Area'), ('C Whirlpool Outer Mirror Spot', 'C Whirlpool Outer Area'), - ('Central Bonk Rock Mirror Spot', 'Central Bonk Rock Area'), + ('Central Bonk Rocks Mirror Spot', 'Central Bonk Rocks Area'), ('Links House Mirror Spot', 'Links House Area'), ('Stone Bridge Mirror Spot', 'Stone Bridge Area'), ('Stone Bridge South Mirror Spot', 'Stone Bridge Area'), @@ -427,8 +427,8 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Checkerboard Mirror Spot', 'Desert Checkerboard Ledge'), ('DP Stairs Mirror Spot', 'Desert Palace Stairs'), ('DP Entrance (North) Mirror Spot', 'Desert Palace Entrance (North) Spot'), - ('Bombos Tablet Mirror Spot', 'Purple Chest Ledge'), - ('Purple Chest Mirror Spot', 'Purple Chest Area'), + ('Bombos Tablet Mirror Spot', 'Desert Pass Ledge'), + ('Desert Pass Mirror Spot', 'Desert Pass Area'), ('Dam Mirror Spot', 'Dam Area'), ('Statues Mirror Spot', 'Statues Area'), ('South Pass Mirror Spot', 'South Pass Area'), @@ -439,7 +439,7 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('Lake Hylia Island Mirror Spot', 'Lake Hylia Island'), ('Lake Hylia Central Island Mirror Spot', 'Lake Hylia Central Island'), ('Octoballoon Mirror Spot', 'Octoballoon Area'), - ('Ice Rod Cave Mirror Spot', 'Ice Rod Cave Area'), + ('Ice Cave Mirror Spot', 'Ice Cave Area'), ('Spectacle Rock Mirror Spot', 'Spectacle Rock Ledge'), ('West Death Mountain (Top) Mirror Spot', 'West Death Mountain (Top)'), ('East Death Mountain (Top West) Mirror Spot', 'East Death Mountain (Top West)'), @@ -453,11 +453,11 @@ mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'), ('TR Pegs Area Mirror Spot', 'Death Mountain TR Pegs') ] -standard_connections = [('Hyrule Castle SW', 'Central Bonk Rock NW'), +standard_connections = [('Hyrule Castle SW', 'Central Bonk Rocks NW'), ('Hyrule Castle SE', 'Links House NE'), - ('Central Bonk Rock EN', 'Links House WN'), - ('Central Bonk Rock EC', 'Links House WC'), - ('Central Bonk Rock ES', 'Links House WS') + ('Central Bonk Rocks EN', 'Links House WN'), + ('Central Bonk Rocks EC', 'Links House WC'), + ('Central Bonk Rocks ES', 'Links House WS') ] # non shuffled overworld @@ -465,8 +465,8 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Lost Woods SC', 'Lost Woods Pass NE'), ('Lost Woods SE', 'Kakariko Fortune NE'), ('Lost Woods EN', 'Lumberjack WN'), - ('Lumberjack SW', 'DM Ascent NW'), - ('DM Ascent SE', 'Kakariko Pond NE'), + ('Lumberjack SW', 'Mountain Entry NW'), + ('Mountain Entry SE', 'Kakariko Pond NE'), ('Lost Woods Pass SW', 'Kakariko NW'), ('Lost Woods Pass SE', 'Kakariko NC'), ('Kakariko Fortune SC', 'Kakariko NE'), @@ -478,23 +478,23 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Kakariko Pond ES', 'Sanctuary WS'), ('Forgotten Forest ES', 'Hyrule Castle WN'), ('Sanctuary EC', 'Graveyard WC'), - ('Graveyard EC', 'Useless Fairy WC'), - ('Useless Fairy SW', 'Wooden Bridge NW'), - ('Useless Fairy SC', 'Wooden Bridge NC'), - ('Useless Fairy SE', 'Wooden Bridge NE'), - ('Useless Fairy EN', 'Potion Shop WN'), - ('Useless Fairy EC', 'Potion Shop WC'), - ('Useless Fairy ES', 'Potion Shop WS'), + ('Graveyard EC', 'River Bend WC'), + ('River Bend SW', 'Wooden Bridge NW'), + ('River Bend SC', 'Wooden Bridge NC'), + ('River Bend SE', 'Wooden Bridge NE'), + ('River Bend EN', 'Potion Shop WN'), + ('River Bend EC', 'Potion Shop WC'), + ('River Bend ES', 'Potion Shop WS'), ('Potion Shop EN', 'Zora Warning WN'), ('Potion Shop EC', 'Zora Warning WC'), ('Zora Warning NE', 'Zora Approach SE'), ('Kakariko SE', 'Kakariko Suburb NE'), ('Kakariko ES', 'Blacksmith WS'), - ('Hyrule Castle SW', 'Central Bonk Rock NW'), + ('Hyrule Castle SW', 'Central Bonk Rocks NW'), ('Hyrule Castle SE', 'Links House NE'), - ('Hyrule Castle ES', 'Sand Dune WN'), - ('Wooden Bridge SW', 'Sand Dune NW'), - ('Sand Dune SC', 'Stone Bridge NC'), + ('Hyrule Castle ES', 'Sand Dunes WN'), + ('Wooden Bridge SW', 'Sand Dunes NW'), + ('Sand Dunes SC', 'Stone Bridge NC'), ('Eastern Palace SW', 'Tree Line NW'), ('Eastern Palace SE', 'Eastern Nook NE'), ('Maze Race ES', 'Kakariko Suburb WS'), @@ -502,14 +502,14 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Flute Boy SW', 'Cave 45 NW'), ('Flute Boy SC', 'Cave 45 NC'), ('Cave 45 EC', 'C Whirlpool WC'), - ('C Whirlpool NW', 'Central Bonk Rock SW'), + ('C Whirlpool NW', 'Central Bonk Rocks SW'), ('C Whirlpool SC', 'Dam NC'), ('C Whirlpool EN', 'Statues WN'), ('C Whirlpool EC', 'Statues WC'), ('C Whirlpool ES', 'Statues WS'), - ('Central Bonk Rock EN', 'Links House WN'), - ('Central Bonk Rock EC', 'Links House WC'), - ('Central Bonk Rock ES', 'Links House WS'), + ('Central Bonk Rocks EN', 'Links House WN'), + ('Central Bonk Rocks EC', 'Links House WC'), + ('Central Bonk Rocks ES', 'Links House WS'), ('Links House SC', 'Statues NC'), ('Links House ES', 'Stone Bridge WS'), ('Stone Bridge SC', 'Lake Hylia NW'), @@ -517,17 +517,17 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Stone Bridge EC', 'Tree Line WC'), ('Tree Line SC', 'Lake Hylia NC'), ('Tree Line SE', 'Lake Hylia NE'), - ('Desert EC', 'Purple Chest WC'), - ('Desert ES', 'Purple Chest WS'), - ('Purple Chest EC', 'Dam WC'), - ('Purple Chest ES', 'Dam WS'), + ('Desert EC', 'Desert Pass WC'), + ('Desert ES', 'Desert Pass WS'), + ('Desert Pass EC', 'Dam WC'), + ('Desert Pass ES', 'Dam WS'), ('Dam EC', 'South Pass WC'), ('Statues SC', 'South Pass NC'), ('South Pass ES', 'Lake Hylia WS'), ('Lake Hylia EC', 'Octoballoon WC'), ('Lake Hylia ES', 'Octoballoon WS'), - ('Octoballoon NW', 'Ice Rod Cave SW'), - ('Octoballoon NE', 'Ice Rod Cave SE'), + ('Octoballoon NW', 'Ice Cave SW'), + ('Octoballoon NE', 'Ice Cave SE'), ('West Death Mountain EN', 'East Death Mountain WN'), ('West Death Mountain ES', 'East Death Mountain WS'), ('East Death Mountain EN', 'Death Mountain TR Pegs WN'), @@ -560,11 +560,11 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Catfish Approach NE', 'Catfish SE'), ('Village of Outcasts SE', 'Frog NE'), ('Village of Outcasts ES', 'Hammer Pegs WS'), - ('Pyramid SW', 'Dark Bonk Rock NW'), + ('Pyramid SW', 'Dark Bonk Rocks NW'), ('Pyramid SE', 'Big Bomb Shop NE'), - ('Pyramid ES', 'Dark Dune WN'), - ('Broken Bridge SW', 'Dark Dune NW'), - ('Dark Dune SC', 'Hammer Bridge NC'), + ('Pyramid ES', 'Dark Dunes WN'), + ('Broken Bridge SW', 'Dark Dunes NW'), + ('Dark Dunes SC', 'Hammer Bridge NC'), ('Palace of Darkness SW', 'Dark Tree Line NW'), ('Palace of Darkness SE', 'Palace of Darkness Nook NE'), ('Dig Game EC', 'Frog WC'), @@ -573,30 +573,30 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Stumpy SW', 'Circle of Bushes NW'), ('Stumpy SC', 'Circle of Bushes NC'), ('Circle of Bushes EC', 'Dark C Whirlpool WC'), - ('Dark C Whirlpool NW', 'Dark Bonk Rock SW'), - ('Dark C Whirlpool SC', 'Swamp Palace NC'), + ('Dark C Whirlpool NW', 'Dark Bonk Rocks SW'), + ('Dark C Whirlpool SC', 'Swamp NC'), ('Dark C Whirlpool EN', 'Hype Cave WN'), ('Dark C Whirlpool EC', 'Hype Cave WC'), ('Dark C Whirlpool ES', 'Hype Cave WS'), - ('Dark Bonk Rock EN', 'Big Bomb Shop WN'), - ('Dark Bonk Rock EC', 'Big Bomb Shop WC'), - ('Dark Bonk Rock ES', 'Big Bomb Shop WS'), + ('Dark Bonk Rocks EN', 'Big Bomb Shop WN'), + ('Dark Bonk Rocks EC', 'Big Bomb Shop WC'), + ('Dark Bonk Rocks ES', 'Big Bomb Shop WS'), ('Big Bomb Shop SC', 'Hype Cave NC'), ('Big Bomb Shop ES', 'Hammer Bridge WS'), - ('Hammer Bridge SC', 'Dark Lake Hylia NW'), + ('Hammer Bridge SC', 'Ice Lake NW'), ('Hammer Bridge EN', 'Dark Tree Line WN'), ('Hammer Bridge EC', 'Dark Tree Line WC'), - ('Dark Tree Line SC', 'Dark Lake Hylia NC'), - ('Dark Tree Line SE', 'Dark Lake Hylia NE'), - ('Dark Purple Chest EC', 'Swamp Palace WC'), - ('Dark Purple Chest ES', 'Swamp Palace WS'), - ('Swamp Palace EC', 'Dark South Pass WC'), + ('Dark Tree Line SC', 'Ice Lake NC'), + ('Dark Tree Line SE', 'Ice Lake NE'), + ('Swamp Nook EC', 'Swamp WC'), + ('Swamp Nook ES', 'Swamp WS'), + ('Swamp EC', 'Dark South Pass WC'), ('Hype Cave SC', 'Dark South Pass NC'), - ('Dark South Pass ES', 'Dark Lake Hylia WS'), - ('Dark Lake Hylia EC', 'Southeast DW WC'), - ('Dark Lake Hylia ES', 'Southeast DW WS'), - ('Southeast DW NW', 'Dark Shopping Mall SW'), - ('Southeast DW NE', 'Dark Shopping Mall SE'), + ('Dark South Pass ES', 'Ice Lake WS'), + ('Ice Lake EC', 'Bomber Corner WC'), + ('Ice Lake ES', 'Bomber Corner WS'), + ('Bomber Corner NW', 'Shopping Mall SW'), + ('Bomber Corner NE', 'Shopping Mall SE'), ('West Dark Death Mountain EN', 'East Dark Death Mountain WN'), ('West Dark Death Mountain ES', 'East Dark Death Mountain WS'), ('East Dark Death Mountain EN', 'Turtle Rock WN') diff --git a/Regions.py b/Regions.py index 065c26df..afb19aef 100644 --- a/Regions.py +++ b/Regions.py @@ -11,7 +11,7 @@ def create_regions(world, player): 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, 'Master Sword Meadow', ['Master Sword Pedestal'], ['Master Sword Meadow SC']), create_lw_region(player, 'Lumberjack Area', None, ['Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lumberjack House', 'Lumberjack WN', 'Lumberjack SW']), - create_lw_region(player, 'DM Ascent Area', None, ['Death Mountain Entrance Rock', 'DM Ascent NW', 'DM Ascent SE']), + create_lw_region(player, 'Mountain Entry Area', None, ['Death Mountain Entrance Rock', 'Mountain Entry NW', 'Mountain Entry SE']), create_lw_region(player, 'Death Mountain Entrance', None, ['Old Man Cave (West)', 'Death Mountain Entrance Drop']), create_lw_region(player, 'Death Mountain Return Ledge', None, ['Death Mountain Return Cave (West)', 'Death Mountain Return Drop']), create_lw_region(player, 'Lost Woods Pass West Area', None, ['Lost Woods Pass NW', 'Lost Woods Pass SW']), @@ -25,9 +25,9 @@ def create_regions(world, player): 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, 'Kings Grave Area', None, ['Kings Grave', 'Kings Grave Inner Rocks']), - create_lw_region(player, 'Useless Fairy Area', None, ['North Fairy Cave', 'North Fairy Cave Drop', 'Useless Fairy Water Drop', 'Useless Fairy WC', 'Useless Fairy SW']), - create_lw_region(player, 'Useless Fairy East Bank', None, ['Useless Fairy East Water Drop', 'Useless Fairy SE', 'Useless Fairy EC', 'Useless Fairy ES']), - create_lw_region(player, 'Useless Fairy Water', None, ['Useless Fairy West Pier', 'Useless Fairy East Pier', 'Useless Fairy EN', 'Useless Fairy SC', 'Useless Fairy Whirlpool']), + 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']), + create_lw_region(player, 'River Bend Water', None, ['River Bend West Pier', 'River Bend East Pier', 'River Bend EN', 'River Bend SC', 'River Bend Whirlpool']), create_lw_region(player, 'Potion Shop Area', None, ['Potion Shop', 'Potion Shop Water Drop', 'Potion Shop Rock (South)', 'Potion Shop WC', 'Potion Shop WS']), create_lw_region(player, 'Potion Shop Northeast', None, ['Potion Shop Northeast Water Drop', 'Potion Shop Rock (North)', 'Potion Shop EC']), create_lw_region(player, 'Potion Shop Water', None, ['Potion Shop WN', 'Potion Shop EN']), @@ -46,7 +46,7 @@ def create_regions(world, player): 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 Water', None, ['Wooden Bridge NC']), - create_lw_region(player, 'Sand Dune Area', None, ['Sand Dune NW', 'Sand Dune WN', 'Sand Dune SC']), + create_lw_region(player, 'Sand Dunes Area', None, ['Sand Dunes NW', 'Sand Dunes WN', 'Sand Dunes SC']), create_lw_region(player, 'Eastern Palace Area', None, ['Sahasrahlas Hut', 'Eastern Palace', 'Eastern Palace SW', 'Eastern Palace SE']), create_lw_region(player, 'Eastern Nook Area', None, ['Long Fairy Cave', 'East Hyrule Teleporter', 'Eastern Nook NE']), create_lw_region(player, 'Maze Race Area', None, ['Maze Race ES']), @@ -58,7 +58,7 @@ def create_regions(world, player): create_lw_region(player, 'Cave 45 Ledge', None, ['Cave 45', 'Cave 45 Ledge Drop']), create_lw_region(player, 'C Whirlpool Area', None, ['C Whirlpool Rock (Bottom)', 'South Hyrule Teleporter', 'C Whirlpool EN', 'C Whirlpool EC', 'C Whirlpool ES', 'C Whirlpool SC', 'C Whirlpool']), create_lw_region(player, 'C Whirlpool Outer Area', None, ['C Whirlpool Rock (Top)', 'C Whirlpool WC', 'C Whirlpool NW']), - create_lw_region(player, 'Central Bonk Rock Area', None, ['Bonk Fairy (Light)', 'Central Bonk Rock NW', 'Central Bonk Rock SW', 'Central Bonk Rock EN', 'Central Bonk Rock EC', 'Central Bonk Rock ES']), + create_lw_region(player, 'Central Bonk Rocks Area', None, ['Bonk Fairy (Light)', 'Central Bonk Rocks NW', 'Central Bonk Rocks SW', 'Central Bonk Rocks EN', 'Central Bonk Rocks EC', 'Central Bonk Rocks ES']), create_lw_region(player, 'Links House Area', None, ['Links House', 'Links House NE', 'Links House WN', 'Links House WC', 'Links House WS', 'Links House SC', 'Links House ES', 'Flute Away']), create_lw_region(player, 'Stone Bridge Area', None, ['Stone Bridge NC', 'Stone Bridge EN', 'Stone Bridge WS', 'Stone Bridge SC']), create_lw_region(player, 'Stone Bridge Water', None, ['Stone Bridge WC', 'Stone Bridge EC']), @@ -73,9 +73,9 @@ def create_regions(world, player): 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, 'Bombos Tablet Ledge', ['Bombos Tablet'], ['Bombos Tablet Drop', 'Desert EC']), - create_lw_region(player, 'Purple Chest Area', ['Purple Chest'], ['Desert Fairy', '50 Rupee Cave', 'Purple Chest WS', 'Purple Chest EC', 'Purple Chest Rocks (North)']), - create_lw_region(player, 'Purple Chest Southeast', None, ['Purple Chest Rocks (South)', 'Purple Chest ES']), - create_lw_region(player, 'Purple Chest Ledge', None, ['Purple Chest Ledge Drop', 'Purple Chest WC']), + 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 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, 'Dam Area', ['Sunken Treasure'], ['Dam', 'Dam WC', 'Dam WS', 'Dam NC', 'Dam EC']), create_lw_region(player, 'Statues Area', None, ['Light Hype Fairy', 'Statues NC', 'Statues WN', 'Statues WC', 'Statues WS', 'Statues SC']), create_lw_region(player, 'South Pass Area', None, ['South Pass WC', 'South Pass NC', 'South Pass ES']), @@ -88,7 +88,7 @@ def create_regions(world, player): create_lw_region(player, 'Octoballoon Area', None, ['Octoballoon Water Drop', 'Octoballoon WS', 'Octoballoon NE']), create_lw_region(player, 'Octoballoon Water', None, ['Octoballoon Pier', 'Octoballoon WC', 'Octoballoon Whirlpool']), create_lw_region(player, 'Octoballoon Water Ledge', None, ['Octoballoon Waterfall Water Drop', 'Octoballoon NW']), - create_lw_region(player, 'Ice Rod Cave Area', None, ['Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave', 'Ice Rod Cave SE', 'Ice Rod Cave SW']), + create_lw_region(player, 'Ice Cave Area', None, ['Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave', 'Ice Cave SE', 'Ice Cave SW']), create_cave_region(player, 'Blinds Hideout', 'a bounty of five items', ["Blind\'s Hideout - Top", "Blind\'s Hideout - Left", "Blind\'s Hideout - Right", @@ -203,9 +203,9 @@ def create_regions(world, player): 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, 'Dark Lumberjack Area', None, ['Dark World Lumberjack Shop', 'Lumberjack Mirror Spot', 'Dark Lumberjack WN', 'Dark Lumberjack SW']), - create_dw_region(player, 'Bumper Cave Area', None, ['Bumper Cave Entrance Rock', 'DM Ascent Mirror Spot', 'Bumper Cave NW', 'Bumper Cave SE']), - create_dw_region(player, 'Bumper Cave Entrance', None, ['Bumper Cave (Bottom)', 'DM Ascent Entrance Mirror Spot', 'Bumper Cave Ledge Drop']), - create_dw_region(player, 'Bumper Cave Ledge', ['Bumper Cave Ledge'], ['Bumper Cave (Top)', 'DM Ascent Ledge Mirror Spot', 'Bumper Cave Entrance Drop']), + 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, '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 Bottom Area', None, ['Skull Woods Pass Rock (Bottom)', 'Lost Woods East Bottom Mirror Spot', 'Skull Woods Pass SE']), @@ -214,8 +214,8 @@ def create_regions(world, player): 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, 'Dark Chapel Area', None, ['Dark Sanctuary Hint', 'Bonk Rock Ledge Mirror Spot', 'Dark Chapel WN', 'Dark Chapel WS', 'Dark Chapel EC']), create_dw_region(player, 'Dark Graveyard Area', None, ['Graveyard Ledge Mirror Spot', 'Kings Grave Mirror Spot', 'Dark Graveyard WC', 'Dark Graveyard ES']), - create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'Useless Fairy Mirror Spot', 'Qirn Jump WC', 'Qirn Jump SW']), - create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'Useless Fairy East Mirror Spot', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']), + create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'River Bend Mirror Spot', 'Qirn Jump WC', 'Qirn Jump SW']), + create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'River Bend East Mirror Spot', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']), create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump EN', 'Qirn Jump SC', 'Qirn Jump Whirlpool']), create_dw_region(player, 'Dark Witch Area', None, ['Dark World Potion Shop', 'Dark Witch Water Drop', 'Potion Shop Mirror Spot', 'Dark Witch Rock (South)', 'Dark Witch WC', 'Dark Witch WS']), create_dw_region(player, 'Dark Witch Northeast', None, ['Dark Witch Northeast Water Drop', 'Dark Witch Rock (North)', 'Potion Shop Northeast Mirror Spot', 'Dark Witch EC']), @@ -234,7 +234,7 @@ def create_regions(world, player): 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']), create_dw_region(player, 'Broken Bridge Water', None, ['Broken Bridge NC']), - create_dw_region(player, 'Dark Dune Area', None, ['Sand Dune Mirror Spot', 'Dark Dune NW', 'Dark Dune WN', 'Dark Dune SC']), + create_dw_region(player, 'Dark Dunes Area', None, ['Sand Dunes Mirror Spot', 'Dark Dunes NW', 'Dark Dunes WN', 'Dark Dunes SC']), create_dw_region(player, 'Palace of Darkness Area', None, ['Palace of Darkness Hint', 'Palace of Darkness', 'Eastern Palace Mirror Spot', 'Palace of Darkness SW', 'Palace of Darkness SE']), 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, 'Dig Game Area', ['Digging Game'], ['Dig Game To Ledge Drop', 'Maze Race Mirror Spot', 'Dig Game ES']), @@ -246,7 +246,7 @@ def create_regions(world, player): create_dw_region(player, 'Circle of Bushes Area', None, ['Cave 45 Mirror Spot', 'Circle of Bushes NW', 'Circle of Bushes NC', 'Circle of Bushes EC']), create_dw_region(player, 'Dark C Whirlpool Area', None, ['Dark C Whirlpool Rock (Bottom)', 'C Whirlpool Mirror Spot', 'Dark C Whirlpool EN', 'Dark C Whirlpool EC', 'Dark C Whirlpool ES', 'Dark C Whirlpool SC']), 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, 'Dark Bonk Rock Area', None, ['Bonk Fairy (Dark)', 'Central Bonk Rock Mirror Spot', 'Dark Bonk Rock NW', 'Dark Bonk Rock SW', 'Dark Bonk Rock EN', 'Dark Bonk Rock EC', 'Dark Bonk Rock ES']), + create_dw_region(player, 'Dark Bonk Rocks Area', None, ['Bonk Fairy (Dark)', 'Central Bonk Rocks Mirror Spot', 'Dark Bonk Rocks NW', 'Dark Bonk Rocks SW', 'Dark Bonk Rocks EN', 'Dark Bonk Rocks EC', 'Dark Bonk Rocks ES']), create_dw_region(player, 'Big Bomb Shop Area', None, ['Big Bomb Shop', 'Links House Mirror Spot', 'Big Bomb Shop NE', 'Big Bomb Shop WN', 'Big Bomb Shop WC', 'Big Bomb Shop WS', 'Big Bomb Shop SC', 'Big Bomb Shop ES']), create_dw_region(player, 'Hammer Bridge North Area', None, ['Hammer Bridge Pegs (North)', 'Hammer Bridge Water Drop', 'Stone Bridge Mirror Spot', 'Hammer Bridge NC', 'Hammer Bridge EN']), create_dw_region(player, 'Hammer Bridge South Area', None, ['Hammer Bridge Pegs (South)', 'Stone Bridge South Mirror Spot', 'Hammer Bridge WS', 'Hammer Bridge SC']), @@ -254,20 +254,20 @@ def create_regions(world, player): 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, '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, 'Dark Purple Chest Area', None, ['Bombos Tablet Mirror Spot', 'Purple Chest Mirror Spot', 'Dark Purple Chest EC', 'Dark Purple Chest ES']), - create_dw_region(player, 'Swamp Palace Area', None, ['Swamp Palace', 'Dam Mirror Spot', 'Swamp Palace WC', 'Swamp Palace WS', 'Swamp Palace NC', 'Swamp Palace EC']), + create_dw_region(player, 'Swamp Nook Area', None, ['Bombos Tablet 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']), create_dw_region(player, 'Hype Cave Area', None, ['Hype Cave', 'Statues Mirror Spot', 'Hype Cave NC', 'Hype Cave WN', 'Hype Cave WC', 'Hype Cave WS', 'Hype Cave SC']), create_dw_region(player, 'Dark South Pass Area', None, ['South Pass Mirror Spot', 'Dark South Pass WC', 'Dark South Pass NC', 'Dark South Pass ES']), - create_dw_region(player, 'Dark Lake Hylia Area', None, ['Dark Lake Hylia Shop', 'Dark Lake Hylia Water Drop', 'Lake Hylia Mirror Spot', 'Dark Lake Hylia NW']), - create_dw_region(player, 'Dark Lake Hylia Northeast Bank', None, ['Dark Lake Hylia Northeast Water Drop', 'Lake Hylia Northeast Mirror Spot', 'Dark Lake Hylia NE']), - create_dw_region(player, 'Dark Lake Hylia Ledge (West)', None, ['Dark Lake Hylia Southwest Water Drop', 'South Shore Mirror Spot', 'Dark Lake Hylia WS']), - create_dw_region(player, 'Dark Lake Hylia Ledge (East)', None, ['Dark Lake Hylia Southeast Water Drop', 'South Shore East Mirror Spot', 'Dark Lake Hylia ES']), - create_dw_region(player, 'Dark Lake Hylia Water', None, ['Lake Hylia Island Mirror Spot', 'Dark Lake Hylia Northeast Pier', 'Dark Lake Hylia NC', 'Dark Lake Hylia EC']), + create_dw_region(player, 'Ice Lake Area', None, ['Dark Lake Hylia Shop', 'Ice Lake Water Drop', 'Lake Hylia Mirror Spot', 'Ice Lake NW']), + 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 Palace Area', None, ['Ice Palace', 'Lake Hylia Central Island Mirror Spot']), - create_dw_region(player, 'Southeast DW Area', None, ['Southeast DW Water Drop', 'Octoballoon Mirror Spot', 'Southeast DW WS', 'Southeast DW NE']), - create_dw_region(player, 'Southeast DW Water', None, ['Southeast DW Pier', 'Southeast DW Whirlpool', 'Southeast DW WC']), - create_dw_region(player, 'Southeast DW Water Ledge', None, ['Southeast DW Waterfall Water Drop', 'Southeast DW NW']), - create_dw_region(player, 'Dark Shopping Mall Area', None, ['Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Ice Rod Cave Mirror Spot', 'Dark Shopping Mall SE', 'Dark Shopping Mall SW']), + create_dw_region(player, 'Bomber Corner Area', None, ['Bomber Corner Water Drop', 'Octoballoon Mirror Spot', 'Bomber Corner WS', 'Bomber Corner NE']), + create_dw_region(player, 'Bomber Corner Water', None, ['Bomber Corner Pier', 'Bomber Corner Whirlpool', 'Bomber Corner WC']), + create_dw_region(player, 'Bomber Corner Water Ledge', None, ['Bomber Corner Waterfall Water Drop', 'Bomber Corner NW']), + 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_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'), create_cave_region(player, 'East Dark World Hint', 'a storyteller'), create_cave_region(player, 'Big Bomb Shop', 'the bomb shop'), diff --git a/Rules.py b/Rules.py index f6ea5a37..81098568 100644 --- a/Rules.py +++ b/Rules.py @@ -130,13 +130,13 @@ def global_rules(world, 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('Useless Fairy 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('Southeast DW 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)) @@ -485,8 +485,8 @@ def default_rules(world, player): set_rule(world.get_entrance('Desert Palace Statue Move', player), lambda state: state.has('Book of Mudora', player)) 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('Purple Chest Rocks (North)', player), lambda state: state.can_lift_rocks(player)) - set_rule(world.get_entrance('Purple Chest Rocks (South)', 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('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('DM Broken Bridge (West)', player), lambda state: state.has('Hookshot', player)) @@ -523,8 +523,8 @@ def default_rules(world, player): set_rule(world.get_entrance('Zora Warning 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('Useless Fairy Water Drop', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Useless Fairy East Water Drop', 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('Wooden Bridge Water Drop', 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 South Water Drop', player), lambda state: state.has('Flippers', player)) @@ -542,14 +542,14 @@ def default_rules(world, 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('Dark Lake Hylia Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Lake Hylia Northeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Lake Hylia Southwest Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Lake Hylia Southeast Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Southeast DW Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Southeast DW Waterfall Water Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) - set_rule(world.get_entrance('Ice Rod Cave SW', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Shopping Mall SW', 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 Southwest Water Drop', 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)) + 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('C Whirlpool EC', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Statues WC', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Dark C Whirlpool EC', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) @@ -572,9 +572,9 @@ def default_rules(world, 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('Lumberjack Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('DM Ascent Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('DM Ascent Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('DM Ascent Entrance 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)) + set_rule(world.get_entrance('Mountain Entry Entrance Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods Pass West Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods Pass East Top Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods East Bottom Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -585,8 +585,8 @@ def default_rules(world, 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('Useless Fairy Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Useless Fairy East Mirror Spot', player), lambda state: state.has_Mirror(player)) + 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)) set_rule(world.get_entrance('Potion Shop Northeast Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Zora Warning Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -604,7 +604,7 @@ def default_rules(world, player): set_rule(world.get_entrance('Wooden Bridge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Wooden Bridge Northeast Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Wooden Bridge West Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Sand Dune Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Sand Dunes Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Eastern Palace Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Eastern Nook Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -616,7 +616,7 @@ def default_rules(world, player): set_rule(world.get_entrance('Cave 45 Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('C Whirlpool Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('C Whirlpool Outer Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Central Bonk Rock Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Central Bonk Rocks Mirror Spot', player), lambda state: state.has_Mirror(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)) @@ -627,7 +627,7 @@ def default_rules(world, player): set_rule(world.get_entrance('DP Stairs Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('DP Entrance (North) Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Bombos Tablet Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Purple Chest Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Desert Pass Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Dam Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Statues Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('South Pass Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -638,7 +638,7 @@ def default_rules(world, player): set_rule(world.get_entrance('South Shore Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('South Shore East Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Octoballoon Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Ice Rod Cave Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Ice Cave Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('West Death Mountain (Top) Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Spectacle Rock Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('East Death Mountain (Top West) Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -735,12 +735,12 @@ def inverted_rules(world, player): set_rule(world.get_entrance('South Dark World Bridge', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Bonk Fairy (Dark)', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('West Dark World Gap', player), lambda state: state.has('Hookshot', player)) - set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Drop (East)', player), lambda state: state.has('Flippers', 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_entrance('Dark Lake Hylia Drop (South)', player), lambda state: state.has('Flippers', player)) # ToDo any fake flipper set up? - set_rule(world.get_entrance('Dark Lake Hylia Ledge Pier', player), lambda state: state.has('Flippers', player)) - set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player)) - set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has('Flippers', player) and (state.has('Hammer', player) or state.can_lift_rocks(player))) # Fake Flippers + set_rule(world.get_entrance('Ice Lake Drop (South)', player), lambda state: state.has('Flippers', player)) # ToDo any fake flipper set up? + set_rule(world.get_entrance('Ice Lake Ledge Pier', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Ice Lake Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player)) + set_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))) # Fake Flippers set_rule(world.get_entrance('Village of Outcasts Heavy Rock', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('East Dark World Bridge', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -826,9 +826,9 @@ def no_glitches_rules(world, player): 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('Dark Lake Hylia Drop (East)', player), lambda state: state.has('Flippers', player)) - add_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has('Flippers', player) and (state.has('Hammer', player) or state.can_lift_rocks(player))) - add_rule(world.get_entrance('Dark Lake Hylia Ledge Drop', player), lambda state: 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)) From e4bff2c75e871714da8684278141f1f44de2dc8a Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 3 May 2021 03:34:03 -0500 Subject: [PATCH 02/10] Implemented a new shuffling algorithm --- OverworldShuffle.py | 203 +++++++++++++------------------------------- 1 file changed, 59 insertions(+), 144 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 1cb36ca8..2f1430c3 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -42,166 +42,81 @@ def link_overworld(world, player): for grouping in (OWEdgeGroups, None): if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work groups = list(grouping.values()) - random.shuffle(groups) - for (forward_edge_sets, back_edge_sets) in groups: - assert len(forward_edge_sets) == len(back_edge_sets) - random.shuffle(back_edge_sets) - - for (forward_set, back_set) in zip(forward_edge_sets, back_edge_sets): - assert len(forward_set) == len(back_set) - for (forward_edge, back_edge) in zip(forward_set, back_set): - connect_two_way(world, forward_edge, back_edge, player) - remaining_edges.remove(forward_edge) - remaining_edges.remove(back_edge) - - assert len(remaining_edges) == 0, remaining_edges else: - connect_remaining(world, remaining_edges, player) + for grouping in (OWEdgeGroups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (area, dir, terrain, count) = group + new_grouping[(area, dir, terrain)] = ([], []) + + for group in grouping.keys(): + (forward_edges, back_edges) = grouping[group] + forward_edges = [[i] for l in forward_edges for i in l] + back_edges = [[i] for l in back_edges for i in l] + for (e1, e2) in test_connections: + forward_edges = list(filter(([e1]).__ne__, forward_edges)) + forward_edges = list(filter(([e2]).__ne__, forward_edges)) + back_edges = list(filter(([e1]).__ne__, forward_edges)) + back_edges = list(filter(([e2]).__ne__, forward_edges)) + (area, dir, terrain, _) = group + (exist_forward_edges, exist_back_edges) = new_grouping[(area, dir, terrain)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(area, dir, terrain)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) + + #all shuffling occurs here + random.shuffle(groups) + for (forward_edge_sets, back_edge_sets) in groups: + assert len(forward_edge_sets) == len(back_edge_sets) + random.shuffle(back_edge_sets) + for (forward_set, back_set) in zip(forward_edge_sets, back_edge_sets): + assert len(forward_set) == len(back_set) + for (forward_edge, back_edge) in zip(forward_set, back_set): + connect_two_way(world, forward_edge, back_edge, player) + remaining_edges.remove(forward_edge) + remaining_edges.remove(back_edge) + + assert len(remaining_edges) == 0, remaining_edges else: raise NotImplementedError('Shuffling not supported yet') - def connect_custom(world, player): if hasattr(world, 'custom_overworld') and world.custom_overworld[player]: - for exit_name, region_name in world.custom_overworld[player]: - # doesn't actually change addresses - connect_simple(world, exit_name, region_name, player) - # this needs to remove custom connections from the pool - + for edgename1, edgename2 in world.custom_overworld[player]: + connect_two_way(world, edgename1, edgename2, player) + remaining_edges.remove(edgename1) + remaining_edges.remove(edgename2) def connect_simple(world, exitname, regionname, player): world.get_entrance(exitname, player).connect(world.get_region(regionname, player)) -def connect_two_way(world, entrancename, exitname, player): - entrance = world.get_entrance(entrancename, player) - exit = world.get_entrance(exitname, player) +def connect_two_way(world, edgename1, edgename2, player): + edge1 = world.get_entrance(edgename1, player) + edge2 = world.get_entrance(edgename2, player) # if these were already connected somewhere, remove the backreference - if entrance.connected_region is not None: - entrance.connected_region.entrances.remove(entrance) - if exit.connected_region is not None: - exit.connected_region.entrances.remove(exit) + if edge1.connected_region is not None: + edge1.connected_region.entrances.remove(edge1) + if edge2.connected_region is not None: + edge2.connected_region.entrances.remove(edge2) - entrance.connect(exit.parent_region) - exit.connect(entrance.parent_region) - x = world.check_for_owedge(entrancename, player) - y = world.check_for_owedge(exitname, player) - if x is not None and y is not None: + edge1.connect(edge2.parent_region) + edge2.connect(edge1.parent_region) + x = world.check_for_owedge(edgename1, player) + y = world.check_for_owedge(edgename2, player) + if x is None: + logging.getLogger('').error('%s is not a valid edge.', edgename1) + elif y is None: + logging.getLogger('').error('%s is not a valid edge.', edgename2) + else: x.dest = y y.dest = x - elif x is None: - logging.getLogger('').error('%s is not a valid edge.', entrancename) - elif y is None: - logging.getLogger('').error('%s is not a valid edge.', exitname) - - world.spoiler.set_overworld(exitname, entrancename, 'both', player) - -def connect_edges(world, edges, targets, player): - """This works inplace""" - random.shuffle(edges) - random.shuffle(targets) - while edges: - edge = edges.pop() - target = targets.pop() - connect_two_way(world, edge, target, player) - -def connect_remaining(world, edges, player): - lw_edges = list() - dw_edges = list() - for edgename in edges: - edge = world.check_for_owedge(edgename, player) - if edge.worldType == WorldType.Dark: - dw_edges.append(edge) - else: - lw_edges.append(edge) - land_edges = list() - water_edges = list() - for edge in lw_edges: - if edge.terrain == Terrain.Land: - land_edges.append(edge) - else: - water_edges.append(edge) - - north_edges = list() - south_edges = list() - west_edges = list() - east_edges = list() - for edge in land_edges: - if edge.direction == Direction.North: - north_edges.append(edge.name) - elif edge.direction == Direction.South: - south_edges.append(edge.name) - elif edge.direction == Direction.West: - west_edges.append(edge.name) - else: - east_edges.append(edge.name) - - #lw land edges - connect_edges(world, north_edges, south_edges, player) - connect_edges(world, west_edges, east_edges, player) - - north_edges = list() - south_edges = list() - west_edges = list() - east_edges = list() - for edge in water_edges: - if edge.direction == Direction.North: - north_edges.append(edge.name) - elif edge.direction == Direction.South: - south_edges.append(edge.name) - elif edge.direction == Direction.West: - west_edges.append(edge.name) - else: - east_edges.append(edge.name) - - #lw water edges - connect_edges(world, north_edges, south_edges, player) - connect_edges(world, west_edges, east_edges, player) - - land_edges = list() - water_edges = list() - for edge in dw_edges: - if edge.terrain == Terrain.Land: - land_edges.append(edge) - else: - water_edges.append(edge) - - north_edges = list() - south_edges = list() - west_edges = list() - east_edges = list() - for edge in land_edges: - if edge.direction == Direction.North: - north_edges.append(edge.name) - elif edge.direction == Direction.South: - south_edges.append(edge.name) - elif edge.direction == Direction.West: - west_edges.append(edge.name) - else: - east_edges.append(edge.name) - - #dw land edges - connect_edges(world, north_edges, south_edges, player) - connect_edges(world, west_edges, east_edges, player) - - north_edges = list() - south_edges = list() - west_edges = list() - east_edges = list() - for edge in water_edges: - if edge.direction == Direction.North: - north_edges.append(edge.name) - elif edge.direction == Direction.South: - south_edges.append(edge.name) - elif edge.direction == Direction.West: - west_edges.append(edge.name) - else: - east_edges.append(edge.name) - - #dw water edges - connect_edges(world, north_edges, south_edges, player) - connect_edges(world, west_edges, east_edges, player) + world.spoiler.set_overworld(edgename2, edgename1, 'both', player) test_connections = [ #('Links House ES', 'Octoballoon WS'), From 8d2c2add289e560308922bfcb04898636035e1a3 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 3 May 2021 19:32:13 -0500 Subject: [PATCH 03/10] Bad code --- OverworldShuffle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 2f1430c3..d0fe8b7f 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -58,8 +58,8 @@ def link_overworld(world, player): for (e1, e2) in test_connections: forward_edges = list(filter(([e1]).__ne__, forward_edges)) forward_edges = list(filter(([e2]).__ne__, forward_edges)) - back_edges = list(filter(([e1]).__ne__, forward_edges)) - back_edges = list(filter(([e2]).__ne__, forward_edges)) + back_edges = list(filter(([e1]).__ne__, back_edges)) + back_edges = list(filter(([e2]).__ne__, back_edges)) (area, dir, terrain, _) = group (exist_forward_edges, exist_back_edges) = new_grouping[(area, dir, terrain)] exist_forward_edges.extend(forward_edges) From 29f6e95e1d398c4e08d366e16d744afb529c2166 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 3 May 2021 23:32:29 -0500 Subject: [PATCH 04/10] Create CHANGELOG.md --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e42835c4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,27 @@ +# Changelog + +### 0.1.1.2 +- If Link's current position fits within the incoming gap, Link will not get re-centered to the incoming gap +- Added Rule for Pearl required to drop down back of SW +- Merged DR v0.3.1.8 - Improved Shopsanity pricing - Fixed Retro generation + +### 0.1.1.1 +- Fixed camera unlocking issue +- Changed default setting for DR to Vanilla + +### 0.1.1.0 +- Added 'Keep Similar Edges Together' toggle option +- Removed Duplicate Pyramid Ledge location, causing a Warning of unfilled location on generation + +### 0.1.0.3 +- Modified various logic rule for some OW locations + +### 0.1.0.2 +- Fixed error generating a bad Spoiler log + +### 0.1.0.1 +- Separated DR versioning from OR versioning +- Removed LW/DW flag toggle on transitions + +### 0.1.0.0 +- Initial release \ No newline at end of file From 26e3aee96b62587bf107e5bfae4b8726c895bba5 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Tue, 4 May 2021 06:21:06 -0500 Subject: [PATCH 05/10] Adding new GUI/CLI option for Parallel Worlds --- BaseClasses.py | 3 +++ CLI.py | 1 + Main.py | 1 + Mystery.py | 1 + README.md | 11 +++++++++++ resources/app/cli/args.json | 4 ++++ resources/app/cli/lang/en.json | 5 ++++- resources/app/gui/lang/en.json | 1 + resources/app/gui/randomize/overworld/widgets.json | 4 ++++ source/classes/constants.py | 3 ++- 10 files changed, 32 insertions(+), 2 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index b8a37691..ab008eff 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -25,6 +25,7 @@ class World(object): self.teams = 1 self.owShuffle = owShuffle.copy() self.owKeepSimilar = {} + self.owParallelWorlds = {} self.shuffle = shuffle.copy() self.doorShuffle = doorShuffle.copy() self.intensity = {} @@ -2095,6 +2096,7 @@ class Spoiler(object): 'goal': self.world.goal, 'ow_shuffle': self.world.owShuffle, 'ow_keepsimilar': self.world.owKeepSimilar, + 'ow_parallel': self.world.owParallelWorlds, 'shuffle': self.world.shuffle, 'door_shuffle': self.world.doorShuffle, 'intensity': self.world.intensity, @@ -2174,6 +2176,7 @@ class Spoiler(object): outfile.write('Item Functionality:'.ljust(line_width) + '%s\n' % self.metadata['item_functionality'][player]) outfile.write('Overworld Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['ow_shuffle'][player]) outfile.write('Keep OW Edges Together:'.ljust(line_width) + '%s\n' % ('Yes' if self.metadata['ow_keepsimilar'][player] else 'No')) + outfile.write('Parallel Worlds:'.ljust(line_width) + '%s\n' % ('Yes' if self.metadata['ow_parallel'][player] else 'No')) outfile.write('Entrance Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['shuffle'][player]) outfile.write('Door Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['door_shuffle'][player]) outfile.write('Intensity:'.ljust(line_width) + '%s\n' % self.metadata['intensity'][player]) diff --git a/CLI.py b/CLI.py index e1ae72b6..5bb22827 100644 --- a/CLI.py +++ b/CLI.py @@ -144,6 +144,7 @@ def parse_settings(): "shuffleganon": True, "ow_shuffle": "vanilla", "ow_keepsimilar": False, + "ow_parallel": False, "shuffle": "vanilla", "shufflepots": False, diff --git a/Main.py b/Main.py index df24228d..7e6e9233 100644 --- a/Main.py +++ b/Main.py @@ -74,6 +74,7 @@ def main(args, seed=None, fish=None): world.crystals_ganon_orig = args.crystals_ganon.copy() world.crystals_gt_orig = args.crystals_gt.copy() world.owKeepSimilar = args.ow_keepsimilar.copy() + world.owParallelWorlds = args.ow_parallel.copy() world.open_pyramid = args.openpyramid.copy() world.boss_shuffle = args.shufflebosses.copy() world.enemy_shuffle = args.shuffleenemies.copy() diff --git a/Mystery.py b/Mystery.py index b26e6ff9..f4dd0960 100644 --- a/Mystery.py +++ b/Mystery.py @@ -154,6 +154,7 @@ def roll_settings(weights): overworld_shuffle = get_choice('overworld_shuffle') ret.ow_shuffle = overworld_shuffle if overworld_shuffle != 'none' else 'vanilla' ret.ow_keepsimilar = get_choice('ow_keepsimilar') + ret.ow_parallel = get_choice('ow_parallel') entrance_shuffle = get_choice('entrance_shuffle') ret.shuffle = entrance_shuffle if entrance_shuffle != 'none' else 'vanilla' door_shuffle = get_choice('door_shuffle') diff --git a/README.md b/README.md index 9b60515c..291ede3e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This is a very new mode of LTTPR so the tools and info is very limited. There is # Known Issues (Updated 2021-04-26) +(Updated 2021-05-04) ### If you want to playtest this, know these things: - Camera unlocking issues, which opens up the possibility of a hardlock. The workaround is to move Link around until the camera locks in place. DO NOT try to transition where there is a visible line. @@ -56,6 +57,10 @@ OW is not shuffled. This keeps similar edge transitions together. ie. The 2 west edges will be paired to another set of two similar edges +## Parallel Worlds (--ow_parallel) + +This ensures matching layouts of Light and Dark worlds. Any remaining edge transitions that don't have a matching counterpart will be shuffled amongst themselves. ie. If going right from Link's House leads to Blacksmith, then going right from Big Bomb Shop will lead to Hammer Pegs + # Command Line Options @@ -76,3 +81,9 @@ For specifying the overworld shuffle you want as above. (default: vanilla) ``` This keeps similar edge transitions paired together with other pairs of transitions + +``` +--ow_parallel +``` + +This ensures the layout of both worlds have the same shape diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index cfdba1cb..1e3ecdf1 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -120,6 +120,10 @@ "action": "store_true", "type": "bool" }, + "ow_parallel": { + "action": "store_true", + "type": "bool" + }, "shuffle": { "choices": [ "vanilla", diff --git a/resources/app/cli/lang/en.json b/resources/app/cli/lang/en.json index ee0d50bc..3c4825f6 100644 --- a/resources/app/cli/lang/en.json +++ b/resources/app/cli/lang/en.json @@ -203,7 +203,10 @@ " overworld screens from the same world.", "Crossed: Overworld screen transitions can lead to any other overworld screen." ], - "ow_keepsimilar": [ "This keeps similar edge transitions together. ie. the two west edges on Potion Shop will be paired with another similar pair." ], + "ow_keepsimilar": [ + "This keeps similar edge transitions together. ie. the two west edges on", + "Potion Shop will be paired with another similar pair." ], + "ow_parallel": [ "This ensures the layouts of both worlds are the same shape." ], "door_shuffle": [ "Select Door Shuffling Algorithm. (default: %(default)s)", "Basic: Doors are mixed within a single dungeon.", diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index eadfe436..5bbb8897 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -116,6 +116,7 @@ "randomizer.overworld.overworldshuffle.crossed": "Crossed", "randomizer.overworld.keepsimilar": "Keep Similar Edges Together", + "randomizer.overworld.parallelworlds": "Parallel Worlds", "randomizer.entrance.openpyramid": "Pre-open Pyramid Hole", "randomizer.entrance.shuffleganon": "Include Ganon's Tower and Pyramid Hole in shuffle pool", diff --git a/resources/app/gui/randomize/overworld/widgets.json b/resources/app/gui/randomize/overworld/widgets.json index 5aa2d7cc..ee79e5a4 100644 --- a/resources/app/gui/randomize/overworld/widgets.json +++ b/resources/app/gui/randomize/overworld/widgets.json @@ -11,6 +11,10 @@ "keepsimilar": { "type": "checkbox", "default": true + }, + "parallelworlds": { + "type": "checkbox", + "default": true } } } \ No newline at end of file diff --git a/source/classes/constants.py b/source/classes/constants.py index 68df9519..0d722627 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -72,7 +72,8 @@ SETTINGSTOPROCESS = { }, "overworld": { "overworldshuffle": "ow_shuffle", - "keepsimilar": "ow_keepsimilar" + "keepsimilar": "ow_keepsimilar", + "parallelworlds": "ow_parallel" }, "entrance": { "openpyramid": "openpyramid", From f77a0d95fa7c37bb11c659734f34f8e2aa40999c Mon Sep 17 00:00:00 2001 From: codemann8 Date: Tue, 4 May 2021 06:21:28 -0500 Subject: [PATCH 06/10] Updated Readme --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 291ede3e..b65ca346 100644 --- a/README.md +++ b/README.md @@ -9,21 +9,18 @@ See https://alttpr.com/ for more details on the normal randomizer. This is a very new mode of LTTPR so the tools and info is very limited. There is a [OW Rando Cheat Sheet](https://zelda.codemann8.com/images/shared/ow-rando-reference-sheet.png) that shows all the transitions that exist and are candidates for shuffle. There is a rumor that some OW tracking capability will be coming to CodeTracker, an EmoTracker package for LTTPR. # Known Issues -(Updated 2021-04-26) (Updated 2021-05-04) ### If you want to playtest this, know these things: -- Camera unlocking issues, which opens up the possibility of a hardlock. The workaround is to move Link around until the camera locks in place. DO NOT try to transition where there is a visible line. - Big Red Bomb may require bomb duping as ledge drops may be in the way of your path to the Pyramid Fairy crack - Do NOT grab the Frogsmith until you have seen the Blacksmith location. Doing so may prevent you from continuing in your save file. -- Inverted regions/rules/logic is NOT implemented yet. Generation should fail 100%. +- Inverted/Standard regions/rules/logic is NOT implemented yet. Generation should fail 100%. - If you fake flipper, beware of transitioning south. You could end up at the top of the waterfall in the southeast of either world. If you mistakenly drop down, it is important to NOT make any other movements and S+Q immediately or there will be a hardlock. Falling from the waterfall is avoidable but it is super easy to do as it is super close the the transition. ### Known bugs: -- Camera unlocks, this is a known issue and will eventually be fixed at a later time +- ~~Camera unlocks, this is a known issue and will eventually be fixed at a later time~~ _(Fixed with 0.1.1.2)_ - ~~When generating, there is a message about one location that remains unfilled. You will find a Nothing item at that location.~~ _(Fixed with 0.1.1.0)_ - There may be an issue with progression being front-loaded in the seed in some scenarios, due to an unsophisticated shuffle algorithm that could make varying-sized parts of each world unreachable -- ~~Some rare instances of vanilla transitions occur when they should not, you can tell when this bug occurs because it doesn't re-center you within the gap. These cases are seemingly unreproducable, so you can re-navigate to see where it was supposed to lead. Video proof of these occurances are helpful.~~ _(Fixed with 0.1.1.0)_ # Feedback and Bug Reports @@ -55,7 +52,7 @@ OW is not shuffled. ## Keep Similar Edges Together (--ow_keepsimilar) -This keeps similar edge transitions together. ie. The 2 west edges will be paired to another set of two similar edges +This keeps similar edge transitions together. ie. The 2 west edges of Potion Shop will be paired to another set of two similar edges ## Parallel Worlds (--ow_parallel) From a5e17526dacbb446c96e5d8a177c5040ea9a7459 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Tue, 4 May 2021 21:42:07 -0500 Subject: [PATCH 07/10] Adding new GUI/CLI option for Parallel Worlds --- CLI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLI.py b/CLI.py index 5bb22827..6b6a52a1 100644 --- a/CLI.py +++ b/CLI.py @@ -94,7 +94,7 @@ def parse_cli(argv, no_defaults=False): for player in range(1, multiargs.multi + 1): playerargs = parse_cli(shlex.split(getattr(ret, f"p{player}")), True) - for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'ow_shuffle', 'ow_keepsimilar', + for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'ow_shuffle', 'ow_keepsimilar', 'ow_parallel', 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', 'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max', From d1b82e59100a2038f492473f54d8ddd1d8a0e653 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 5 May 2021 15:15:58 -0500 Subject: [PATCH 08/10] Implemented Parallel Worlds functionality --- OWEdges.py | 96 ++++++++--- OverworldShuffle.py | 391 +++++++++++++++++++++++++++++++++++++++----- Utils.py | 21 +++ 3 files changed, 437 insertions(+), 71 deletions(-) diff --git a/OWEdges.py b/OWEdges.py index e39b9533..0a81473d 100644 --- a/OWEdges.py +++ b/OWEdges.py @@ -1,5 +1,16 @@ from BaseClasses import OWEdge, Direction, Terrain, WorldType, PolSlot +from enum import Enum, unique + +@unique +class OpenStd(Enum): + Open = 0 + Standard = 1 + +@unique +class IsParallel(Enum): + No = 0 + Yes = 1 # constants We = Direction.West @@ -16,6 +27,12 @@ DW = WorldType.Dark Vt = PolSlot.NorthSouth Hz = PolSlot.EastWest +Op = OpenStd.Open +St = OpenStd.Standard + +PL = IsParallel.Yes +NP = IsParallel.No + def create_owedges(world, player): edges = [ @@ -312,13 +329,27 @@ def create_owedge(player, name, owIndex, direction, terrain, edge_id, owSlotInde OWEdgeGroups = { - (LW, Hz, Ld, 1): ( + #(IsStandard, World, EdgeAxis, Terrain, HasParallel, NumberInGroup) + (St, LW, Vt, Ld, PL, 1): ( + [ + ['Hyrule Castle SW'], + ['Hyrule Castle SE'] + ], + [ + ['Central Bonk Rocks NW'], + ['Links House NE'] + ] + ), + (St, LW, Hz, Ld, PL, 3): ( + [['Central Bonk Rocks EN', 'Central Bonk Rocks EC', 'Central Bonk Rocks ES']], + [['Links House WN', 'Links House WC', 'Links House WS']] + ), + (Op, LW, Hz, Ld, PL, 1): ( [ ['Lost Woods EN'], ['East Death Mountain EN'], ['Sanctuary EC'], ['Graveyard EC'], - ['Forgotten Forest ES'], ['Kakariko ES'], ['Hyrule Castle ES'], ['Maze Race ES'], @@ -338,7 +369,6 @@ OWEdgeGroups = { ['Death Mountain TR Pegs WN'], ['Graveyard WC'], ['River Bend WC'], - ['Hyrule Castle WN'], ['Blacksmith WS'], ['Sand Dunes WN'], ['Kakariko Suburb WS'], @@ -354,7 +384,15 @@ OWEdgeGroups = { ['East Death Mountain WS'] ] ), - (LW, Vt, Ld, 1): ( + (Op, LW, Hz, Ld, NP, 1): ( + [ + ['Forgotten Forest ES'] + ], + [ + ['Hyrule Castle WN'] + ] + ), + (Op, LW, Vt, Ld, PL, 1): ( [ ['Lumberjack SW'], ['Mountain Entry SE'], @@ -363,8 +401,6 @@ OWEdgeGroups = { ['Kakariko Fortune SC'], ['Wooden Bridge SW'], ['Kakariko SE'], - ['Hyrule Castle SW'], - ['Hyrule Castle SE'], ['Sand Dunes SC'], ['Eastern Palace SW'], ['Eastern Palace SE'], @@ -384,8 +420,6 @@ OWEdgeGroups = { ['Kakariko NE'], ['Sand Dunes NW'], ['Kakariko Suburb NE'], - ['Central Bonk Rocks NW'], - ['Links House NE'], ['Stone Bridge NC'], ['Tree Line NW'], ['Eastern Nook NE'], @@ -398,11 +432,10 @@ OWEdgeGroups = { ['Octoballoon NE'] ] ), - (LW, Hz, Ld, 2): ( + (Op, LW, Hz, Ld, PL, 2): ( [ ['Kakariko Fortune EN', 'Kakariko Fortune ES'], ['Kakariko Pond EN', 'Kakariko Pond ES'], - ['Desert EC', 'Desert ES'], ['Desert Pass EC', 'Desert Pass ES'], ['River Bend EC', 'River Bend ES'], ['C Whirlpool EN', 'C Whirlpool ES'] @@ -410,13 +443,20 @@ OWEdgeGroups = { [ ['Kakariko Pond WN', 'Kakariko Pond WS'], ['Sanctuary WN', 'Sanctuary WS'], - ['Desert Pass WC', 'Desert Pass WS'], ['Dam WC', 'Dam WS'], ['Potion Shop WC', 'Potion Shop WS'], ['Statues WN', 'Statues WS'] ] ), - (LW, Vt, Ld, 2): ( + (Op, LW, Hz, Ld, NP, 2): ( + [ + ['Desert EC', 'Desert ES'] + ], + [ + ['Desert Pass WC', 'Desert Pass WS'] + ] + ), + (Op, LW, Vt, Ld, PL, 2): ( [ ['Lost Woods SW', 'Lost Woods SC'], ['Lost Woods Pass SW', 'Lost Woods Pass SE'], @@ -432,11 +472,7 @@ OWEdgeGroups = { ['Wooden Bridge NW', 'Wooden Bridge NE'] ] ), - (LW, Hz, Ld, 3): ( - [['Central Bonk Rocks EN', 'Central Bonk Rocks EC', 'Central Bonk Rocks ES']], - [['Links House WN', 'Links House WC', 'Links House WS']] - ), - (LW, Hz, Wr, 1): ( + (Op, LW, Hz, Wr, PL, 1): ( [ ['Potion Shop EN'], ['Lake Hylia EC'], @@ -452,7 +488,7 @@ OWEdgeGroups = { ['Statues WC'] ] ), - (LW, Vt, Wr, 1): ( + (Op, LW, Vt, Wr, PL, 1): ( [ ['Tree Line SC'], ['Ice Cave SW'], @@ -464,7 +500,7 @@ OWEdgeGroups = { ['Wooden Bridge NC'] ] ), - (DW, Hz, Ld, 1): ( + (Op, DW, Hz, Ld, PL, 1): ( [ ['Skull Woods EN'], ['East Dark Death Mountain EN'], @@ -502,7 +538,7 @@ OWEdgeGroups = { ['East Dark Death Mountain WS'] ] ), - (DW, Vt, Ld, 1): ( + (Op, DW, Vt, Ld, PL, 1): ( [ ['Dark Lumberjack SW'], ['Bumper Cave SE'], @@ -546,12 +582,11 @@ OWEdgeGroups = { ['Bomber Corner NE'] ] ), - (DW, Hz, Ld, 2): ( + (Op, DW, Hz, Ld, PL, 2): ( [ ['Dark Fortune EN', 'Dark Fortune ES'], ['Outcast Pond EN', 'Outcast Pond ES'], ['Swamp Nook EC', 'Swamp Nook ES'], - ['Dig Game EC', 'Dig Game ES'], ['Qirn Jump EC', 'Qirn Jump ES'], ['Dark C Whirlpool EN', 'Dark C Whirlpool ES'] ], @@ -559,12 +594,19 @@ OWEdgeGroups = { ['Outcast Pond WN', 'Outcast Pond WS'], ['Dark Chapel WN', 'Dark Chapel WS'], ['Swamp WC', 'Swamp WS'], - ['Frog WC', 'Frog WS'], ['Dark Witch WC', 'Dark Witch WS'], ['Hype Cave WN', 'Hype Cave WS'] ] ), - (DW, Vt, Ld, 2): ( + (Op, DW, Hz, Ld, NP, 2): ( + [ + ['Dig Game EC', 'Dig Game ES'] + ], + [ + ['Frog WC', 'Frog WS'] + ] + ), + (Op, DW, Vt, Ld, PL, 2): ( [ ['Skull Woods SW', 'Skull Woods SC'], ['Skull Woods Pass SW', 'Skull Woods Pass SE'], @@ -580,11 +622,11 @@ OWEdgeGroups = { ['Broken Bridge NW', 'Broken Bridge NE'] ] ), - (DW, Hz, Ld, 3): ( + (Op, DW, Hz, Ld, PL, 3): ( [['Dark Bonk Rocks EN', 'Dark Bonk Rocks EC', 'Dark Bonk Rocks ES']], [['Big Bomb Shop WN', 'Big Bomb Shop WC', 'Big Bomb Shop WS']] ), - (DW, Hz, Wr, 1): ( + (Op, DW, Hz, Wr, PL, 1): ( [ ['Dark Witch EN'], ['Ice Lake EC'], @@ -600,7 +642,7 @@ OWEdgeGroups = { ['Hype Cave WC'] ] ), - (DW, Vt, Wr, 1): ( + (Op, DW, Vt, Wr, PL, 1): ( [ ['Dark Tree Line SC'], ['Shopping Mall SW'], diff --git a/OverworldShuffle.py b/OverworldShuffle.py index d0fe8b7f..30b58f0b 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -1,6 +1,7 @@ import random from BaseClasses import OWEdge, WorldType, Direction, Terrain -from OWEdges import OWEdgeGroups +from Utils import bidict +from OWEdges import OWEdgeGroups, IsParallel __version__ = '0.1.1.2-u' @@ -18,55 +19,180 @@ def link_overworld(world, player): for exitname, destname in default_connections: connect_two_way(world, exitname, destname, player) else: - remaining_edges = [] - for exitname, destname in default_connections: - remaining_edges.append(exitname) - remaining_edges.append(destname) + connected_edges = [] - if world.mode[player] == 'standard': - for exitname, destname in standard_connections: + if world.owKeepSimilar[player] and world.owParallelWorlds[player]: + for exitname, destname in parallelsimilar_connections: connect_two_way(world, exitname, destname, player) - remaining_edges.remove(exitname) - remaining_edges.remove(destname) + connected_edges.append(exitname) + connected_edges.append(destname) #TODO: Remove, just for testing for exitname, destname in test_connections: connect_two_way(world, exitname, destname, player) - remaining_edges.remove(exitname) - remaining_edges.remove(destname) + connected_edges.append(exitname) + connected_edges.append(destname) + + trimmed_groups = remove_reserved(world, OWEdgeGroups, connected_edges, player) if world.owShuffle[player] == 'full': + #predefined shuffle groups get reorganized here if world.owKeepSimilar[player]: - #TODO: remove edges from list that are already placed, Std and Plando - # shuffle edges in groups that connect the same pair of tiles - for grouping in (OWEdgeGroups, None): - if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work - groups = list(grouping.values()) + if world.owParallelWorlds[player]: + if world.mode[player] == 'standard': + #tuple stays (A,B,C,D,E,F) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + groups = list(grouping.values()) + else: + #tuple goes to (_,B,C,D,E,F) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (_, region, axis, terrain, parallel, count) = group + new_grouping[(region, axis, terrain, parallel, count)] = ([], []) + + for group in grouping.keys(): + (_, region, axis, terrain, parallel, count) = group + (forward_edges, back_edges) = grouping[group] + (exist_forward_edges, exist_back_edges) = new_grouping[(region, axis, terrain, parallel, count)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(region, axis, terrain, parallel, count)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) + else: + if world.mode[player] == 'standard': + #tuple stays (A,B,C,D,_,F) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (std, region, axis, terrain, _, count) = group + new_grouping[(std, region, axis, terrain, count)] = ([], []) + + for group in grouping.keys(): + (std, region, axis, terrain, _, count) = group + (forward_edges, back_edges) = grouping[group] + (exist_forward_edges, exist_back_edges) = new_grouping[(std, region, axis, terrain, count)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(std, region, axis, terrain, count)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) + else: + #tuple goes to (_,B,C,D,_,F) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (_, region, axis, terrain, _, count) = group + new_grouping[(region, axis, terrain, count)] = ([], []) + + for group in grouping.keys(): + (_, region, axis, terrain, _, count) = group + (forward_edges, back_edges) = grouping[group] + (exist_forward_edges, exist_back_edges) = new_grouping[(region, axis, terrain, count)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(region, axis, terrain, count)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) else: - for grouping in (OWEdgeGroups, None): - if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work - new_grouping = {} + if world.owParallelWorlds[player]: + if world.mode[player] == 'standard': + #tuple stays (A,B,C,D,E,_) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} - for group in grouping.keys(): - (area, dir, terrain, count) = group - new_grouping[(area, dir, terrain)] = ([], []) - - for group in grouping.keys(): - (forward_edges, back_edges) = grouping[group] - forward_edges = [[i] for l in forward_edges for i in l] - back_edges = [[i] for l in back_edges for i in l] - for (e1, e2) in test_connections: - forward_edges = list(filter(([e1]).__ne__, forward_edges)) - forward_edges = list(filter(([e2]).__ne__, forward_edges)) - back_edges = list(filter(([e1]).__ne__, back_edges)) - back_edges = list(filter(([e2]).__ne__, back_edges)) - (area, dir, terrain, _) = group - (exist_forward_edges, exist_back_edges) = new_grouping[(area, dir, terrain)] - exist_forward_edges.extend(forward_edges) - exist_back_edges.extend(back_edges) - new_grouping[(area, dir, terrain)] = (exist_forward_edges, exist_back_edges) + for group in grouping.keys(): + (std, region, axis, terrain, parallel, _) = group + new_grouping[(std, region, axis, terrain, parallel)] = ([], []) + + for group in grouping.keys(): + (std, region, axis, terrain, parallel, _) = group + (forward_edges, back_edges) = grouping[group] + forward_edges = [[i] for l in forward_edges for i in l] + back_edges = [[i] for l in back_edges for i in l] + + (exist_forward_edges, exist_back_edges) = new_grouping[(std, region, axis, terrain, parallel)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(std, region, axis, terrain, parallel)] = (exist_forward_edges, exist_back_edges) - groups = list(new_grouping.values()) + groups = list(new_grouping.values()) + else: + #tuple goes to (_,B,C,D,E,_) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (_, region, axis, terrain, parallel, _) = group + new_grouping[(region, axis, terrain, parallel)] = ([], []) + + for group in grouping.keys(): + (_, region, axis, terrain, parallel, _) = group + (forward_edges, back_edges) = grouping[group] + forward_edges = [[i] for l in forward_edges for i in l] + back_edges = [[i] for l in back_edges for i in l] + + (exist_forward_edges, exist_back_edges) = new_grouping[(region, axis, terrain, parallel)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(region, axis, terrain, parallel)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) + else: + if world.mode[player] == 'standard': + #tuple stays (A,B,C,D,_,_) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (std, region, axis, terrain, _, _) = group + new_grouping[(std, region, axis, terrain)] = ([], []) + + for group in grouping.keys(): + (std, region, axis, terrain, _, _) = group + (forward_edges, back_edges) = grouping[group] + forward_edges = [[i] for l in forward_edges for i in l] + back_edges = [[i] for l in back_edges for i in l] + + (exist_forward_edges, exist_back_edges) = new_grouping[(std, region, axis, terrain)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(std, region, axis, terrain)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) + else: + #tuple goes to (_,B,C,D,_,_) + for grouping in (trimmed_groups, None): + if grouping is not None: #TODO: Figure out why ^ has to be a tuple for this to work + new_grouping = {} + + for group in grouping.keys(): + (_, region, axis, terrain, _, _) = group + new_grouping[(region, axis, terrain)] = ([], []) + + for group in grouping.keys(): + (_, region, axis, terrain, _, _) = group + (forward_edges, back_edges) = grouping[group] + forward_edges = [[i] for l in forward_edges for i in l] + back_edges = [[i] for l in back_edges for i in l] + + (exist_forward_edges, exist_back_edges) = new_grouping[(region, axis, terrain)] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + new_grouping[(region, axis, terrain)] = (exist_forward_edges, exist_back_edges) + + groups = list(new_grouping.values()) #all shuffling occurs here random.shuffle(groups) @@ -77,10 +203,14 @@ def link_overworld(world, player): assert len(forward_set) == len(back_set) for (forward_edge, back_edge) in zip(forward_set, back_set): connect_two_way(world, forward_edge, back_edge, player) - remaining_edges.remove(forward_edge) - remaining_edges.remove(back_edge) - - assert len(remaining_edges) == 0, remaining_edges + connected_edges.append(forward_edge) + connected_edges.append(back_edge) + if world.owParallelWorlds[player] and forward_edge in parallel_links.keys(): + connect_two_way(world, parallel_links[forward_edge], parallel_links[back_edge], player) + connected_edges.append(parallel_links[forward_edge]) + connected_edges.append(parallel_links[back_edge]) + + assert len(connected_edges) == len(default_connections) * 2, connected_edges else: raise NotImplementedError('Shuffling not supported yet') @@ -88,8 +218,8 @@ def connect_custom(world, player): if hasattr(world, 'custom_overworld') and world.custom_overworld[player]: for edgename1, edgename2 in world.custom_overworld[player]: connect_two_way(world, edgename1, edgename2, player) - remaining_edges.remove(edgename1) - remaining_edges.remove(edgename2) + connected_edges.append(edgename1) + connected_edges.append(edgename2) def connect_simple(world, exitname, regionname, player): world.get_entrance(exitname, player).connect(world.get_region(regionname, player)) @@ -118,6 +248,38 @@ 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 + new_grouping = {} + for group in groupedlist.keys(): + new_grouping[group] = ([], []) + + for group in groupedlist.keys(): + (std, region, axis, terrain, parallel, count) = group + (forward_edges, back_edges) = groupedlist[group] + + for edge in connected_edges: + forward_edges = list(list(filter((edge).__ne__, i)) for i in forward_edges) + back_edges = list(list(filter((edge).__ne__, i)) for i in back_edges) + + if world.owParallelWorlds[player] and parallel == IsParallel.Yes and region == WorldType.Dark: + for edge in parallel_links: + forward_edges = list(list(filter((parallel_links[edge]).__ne__, i)) for i in forward_edges) + back_edges = list(list(filter((parallel_links[edge]).__ne__, i)) for i in back_edges) + + 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 + + (exist_forward_edges, exist_back_edges) = new_grouping[group] + exist_forward_edges.extend(forward_edges) + exist_back_edges.extend(back_edges) + if len(exist_forward_edges) > 0: + new_grouping[group] = (exist_forward_edges, exist_back_edges) + + return new_grouping + test_connections = [ #('Links House ES', 'Octoballoon WS'), #('Links House NE', 'Lost Woods Pass SW') @@ -375,6 +537,147 @@ standard_connections = [('Hyrule Castle SW', 'Central Bonk Rocks NW'), ('Central Bonk Rocks ES', 'Links House WS') ] +parallelsimilar_connections = [('Maze Race ES', 'Kakariko Suburb WS'), + ('Dig Game EC', 'Frog WC'), + ('Dig Game ES', 'Frog WS') + ] + +parallel_links = bidict({'Lost Woods SW': 'Skull Woods SW', + 'Lost Woods SC': 'Skull Woods SC', + 'Lost Woods SE': 'Skull Woods SE', + 'Lost Woods EN': 'Skull Woods EN', + 'Lumberjack SW': 'Dark Lumberjack SW', + 'Lumberjack WN': 'Dark Lumberjack WN', + 'West Death Mountain EN': 'West Dark Death Mountain EN', + 'West Death Mountain ES': 'West Dark Death Mountain ES', + 'East Death Mountain WN': 'East Dark Death Mountain WN', + 'East Death Mountain WS': 'East Dark Death Mountain WS', + 'East Death Mountain EN': 'East Dark Death Mountain EN', + 'Death Mountain TR Pegs WN': 'Turtle Rock WN', + 'Mountain Entry NW': 'Bumper Cave NW', + 'Mountain Entry SE': 'Bumper Cave SE', + 'Zora Approach SE': 'Catfish SE', + 'Lost Woods Pass NW': 'Skull Woods Pass NW', + 'Lost Woods Pass NE': 'Skull Woods Pass NE', + 'Lost Woods Pass SW': 'Skull Woods Pass SW', + 'Lost Woods Pass SE': 'Skull Woods Pass SE', + 'Kakariko Fortune NE': 'Dark Fortune NE', + 'Kakariko Fortune SC': 'Dark Fortune SC', + 'Kakariko Fortune EN': 'Dark Fortune EN', + 'Kakariko Fortune ES': 'Dark Fortune ES', + 'Kakariko Pond NE': 'Outcast Pond NE', + 'Kakariko Pond SW': 'Outcast Pond SW', + 'Kakariko Pond SE': 'Outcast Pond SE', + 'Kakariko Pond WN': 'Outcast Pond WN', + 'Kakariko Pond WS': 'Outcast Pond WS', + 'Kakariko Pond EN': 'Outcast Pond EN', + 'Kakariko Pond ES': 'Outcast Pond ES', + 'Sanctuary WN': 'Dark Chapel WN', + 'Sanctuary WS': 'Dark Chapel WS', + 'Sanctuary EC': 'Dark Chapel EC', + 'Graveyard WC': 'Dark Graveyard WC', + 'Graveyard EC': 'Dark Graveyard ES', + 'River Bend SW': 'Qirn Jump SW', + 'River Bend SC': 'Qirn Jump SC', + 'River Bend SE': 'Qirn Jump SE', + 'River Bend WC': 'Qirn Jump WC', + 'River Bend EN': 'Qirn Jump EN', + 'River Bend EC': 'Qirn Jump EC', + 'River Bend ES': 'Qirn Jump ES', + 'Potion Shop WN': 'Dark Witch WN', + 'Potion Shop WC': 'Dark Witch WC', + 'Potion Shop WS': 'Dark Witch WS', + 'Potion Shop EN': 'Dark Witch EN', + 'Potion Shop EC': 'Dark Witch EC', + 'Zora Warning NE': 'Catfish Approach NE', + 'Zora Warning WN': 'Catfish Approach WN', + 'Zora Warning WC': 'Catfish Approach WC', + 'Kakariko NW': 'Village of Outcasts NW', + 'Kakariko NC': 'Village of Outcasts NC', + 'Kakariko NE': 'Village of Outcasts NE', + 'Kakariko SE': 'Village of Outcasts SE', + 'Kakariko ES': 'Village of Outcasts ES', + 'Forgotten Forest NW': 'Shield Shop NW', + 'Forgotten Forest NE': 'Shield Shop NE', + 'Hyrule Castle SW': 'Pyramid SW', + 'Hyrule Castle SE': 'Pyramid SE', + 'Hyrule Castle ES': 'Pyramid ES', + 'Wooden Bridge NW': 'Broken Bridge NW', + 'Wooden Bridge NC': 'Broken Bridge NC', + 'Wooden Bridge NE': 'Broken Bridge NE', + 'Wooden Bridge SW': 'Broken Bridge SW', + 'Eastern Palace SW': 'Palace of Darkness SW', + 'Eastern Palace SE': 'Palace of Darkness SE', + 'Blacksmith WS': 'Hammer Pegs WS', + 'Sand Dunes NW': 'Dark Dunes NW', + 'Sand Dunes SC': 'Dark Dunes SC', + 'Sand Dunes WN': 'Dark Dunes WN', + 'Maze Race ES': 'Dig Game ES', + 'Kakariko Suburb NE': 'Frog NE', + 'Kakariko Suburb WS': 'Frog WS', + 'Kakariko Suburb ES': 'Frog ES', + 'Flute Boy SW': 'Stumpy SW', + 'Flute Boy SC': 'Stumpy SC', + 'Flute Boy WS': 'Stumpy WS', + 'Central Bonk Rocks NW': 'Dark Bonk Rocks NW', + 'Central Bonk Rocks SW': 'Dark Bonk Rocks SW', + 'Central Bonk Rocks EN': 'Dark Bonk Rocks EN', + 'Central Bonk Rocks EC': 'Dark Bonk Rocks EC', + 'Central Bonk Rocks ES': 'Dark Bonk Rocks ES', + 'Links House NE': 'Big Bomb Shop NE', + 'Links House SC': 'Big Bomb Shop SC', + 'Links House WN': 'Big Bomb Shop WN', + 'Links House WC': 'Big Bomb Shop WC', + 'Links House WS': 'Big Bomb Shop WS', + 'Links House ES': 'Big Bomb Shop ES', + 'Stone Bridge NC': 'Hammer Bridge NC', + 'Stone Bridge SC': 'Hammer Bridge SC', + 'Stone Bridge WS': 'Hammer Bridge WS', + 'Stone Bridge EN': 'Hammer Bridge EN', + 'Stone Bridge EC': 'Hammer Bridge EC', + 'Tree Line NW': 'Dark Tree Line NW', + 'Tree Line SC': 'Dark Tree Line SC', + 'Tree Line SE': 'Dark Tree Line SE', + 'Tree Line WN': 'Dark Tree Line WN', + 'Tree Line WC': 'Dark Tree Line WC', + 'Eastern Nook NE': 'Palace of Darkness Nook NE', + 'Cave 45 NW': 'Circle of Bushes NW', + 'Cave 45 NC': 'Circle of Bushes NC', + 'Cave 45 EC': 'Circle of Bushes EC', + 'C Whirlpool NW': 'Dark C Whirlpool NW', + 'C Whirlpool SC': 'Dark C Whirlpool SC', + 'C Whirlpool WC': 'Dark C Whirlpool WC', + 'C Whirlpool EN': 'Dark C Whirlpool EN', + 'C Whirlpool EC': 'Dark C Whirlpool EC', + 'C Whirlpool ES': 'Dark C Whirlpool ES', + 'Statues NC': 'Hype Cave NC', + 'Statues SC': 'Hype Cave SC', + 'Statues WN': 'Hype Cave WN', + 'Statues WC': 'Hype Cave WC', + 'Statues WS': 'Hype Cave WS', + 'Lake Hylia NW': 'Ice Lake NW', + 'Lake Hylia NC': 'Ice Lake NC', + 'Lake Hylia NE': 'Ice Lake NE', + 'Lake Hylia WS': 'Ice Lake WS', + 'Lake Hylia EC': 'Ice Lake EC', + 'Lake Hylia ES': 'Ice Lake ES', + 'Ice Cave SW': 'Shopping Mall SW', + 'Ice Cave SE': 'Shopping Mall SE', + 'Desert Pass EC': 'Swamp Nook EC', + 'Desert Pass ES': 'Swamp Nook ES', + 'Dam NC': 'Swamp NC', + 'Dam WC': 'Swamp WC', + 'Dam WS': 'Swamp WS', + 'Dam EC': 'Swamp EC', + 'South Pass WC': 'Dark South Pass WC', + 'South Pass NC': 'Dark South Pass NC', + 'South Pass ES': 'Dark South Pass ES', + 'Octoballoon NW': 'Bomber Corner NW', + 'Octoballoon NE': 'Bomber Corner NE', + 'Octoballoon WC': 'Bomber Corner WC', + 'Octoballoon WS': 'Bomber Corner WS' + }) + # non shuffled overworld default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), ('Lost Woods SC', 'Lost Woods Pass NE'), diff --git a/Utils.py b/Utils.py index 06ccca62..dceaca20 100644 --- a/Utils.py +++ b/Utils.py @@ -657,6 +657,27 @@ def extract_data_from_jp_rom(rom): print() +class bidict(dict): + def __init__(self, *args, **kwargs): + super(bidict, self).__init__(*args, **kwargs) + self.inverse = {} + for key, value in self.items(): + self.inverse.setdefault(value,[]).append(key) + + def __setitem__(self, key, value): + if key in self: + self.inverse[self[key]].remove(key) + super(bidict, self).__setitem__(key, value) + self.inverse.setdefault(value,[]).append(key) + + def __delitem__(self, key): + value = self[key] + self.inverse.setdefault(value,[]).remove(key) + if value in self.inverse and not self.inverse[value]: + del self.inverse[value] + super(bidict, self).__delitem__(key) + + if __name__ == '__main__': # make_new_base2current() # read_entrance_data(old_rom=sys.argv[1]) From d897333db668b8bfdf00e18c89f570f2b8f3613c Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 6 May 2021 01:16:23 -0500 Subject: [PATCH 09/10] Final tweaks to Parallel Worlds mode --- OverworldShuffle.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 30b58f0b..48a09d66 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -12,15 +12,15 @@ def link_overworld(world, player): for exitname, destname in temporary_mandatory_connections: connect_two_way(world, exitname, destname, player) - connect_custom(world, player) + connected_edges = [] + + connect_custom(world, connected_edges, player) # if we do not shuffle, set default connections if world.owShuffle[player] == 'vanilla': for exitname, destname in default_connections: connect_two_way(world, exitname, destname, player) else: - connected_edges = [] - if world.owKeepSimilar[player] and world.owParallelWorlds[player]: for exitname, destname in parallelsimilar_connections: connect_two_way(world, exitname, destname, player) @@ -214,7 +214,7 @@ def link_overworld(world, player): else: raise NotImplementedError('Shuffling not supported yet') -def connect_custom(world, player): +def connect_custom(world, connected_edges, player): if hasattr(world, 'custom_overworld') and world.custom_overworld[player]: for edgename1, edgename2 in world.custom_overworld[player]: connect_two_way(world, edgename1, edgename2, player) @@ -262,7 +262,7 @@ def remove_reserved(world, groupedlist, connected_edges, player): forward_edges = list(list(filter((edge).__ne__, i)) for i in forward_edges) back_edges = list(list(filter((edge).__ne__, i)) for i in back_edges) - if world.owParallelWorlds[player] and parallel == IsParallel.Yes and region == WorldType.Dark: + if world.owParallelWorlds[player] and region == WorldType.Dark: for edge in parallel_links: forward_edges = list(list(filter((parallel_links[edge]).__ne__, i)) for i in forward_edges) back_edges = list(list(filter((parallel_links[edge]).__ne__, i)) for i in back_edges) From ef4ca73e823f94c4246036b0808c5a9299b9b4a1 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 6 May 2021 01:18:03 -0500 Subject: [PATCH 10/10] Version bump --- OverworldShuffle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 48a09d66..16225518 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -3,7 +3,7 @@ from BaseClasses import OWEdge, WorldType, Direction, Terrain from Utils import bidict from OWEdges import OWEdgeGroups, IsParallel -__version__ = '0.1.1.2-u' +__version__ = '0.1.2.0-u' def link_overworld(world, player): # setup mandatory connections