Merge branch 'OverworldShuffleDev' into OverworldShuffle

This commit is contained in:
codemann8
2023-04-13 18:50:56 -05:00
40 changed files with 749 additions and 683 deletions
+5 -2
View File
@@ -3092,7 +3092,7 @@ class Spoiler(object):
outfile.write('Entrance Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['shuffle'][player]) outfile.write('Entrance Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['shuffle'][player])
if self.metadata['shuffle'][player] != 'vanilla': if self.metadata['shuffle'][player] != 'vanilla':
outfile.write('Shuffle GT/Ganon:'.ljust(line_width) + '%s\n' % yn(self.metadata['shuffleganon'][player])) outfile.write('Shuffle GT/Ganon:'.ljust(line_width) + '%s\n' % yn(self.metadata['shuffleganon'][player]))
outfile.write('Shuffle Links:'.ljust(line_width) + '%s\n' % yn(self.metadata['shufflelinks'][player])) outfile.write('Shuffle Link\'s House:'.ljust(line_width) + '%s\n' % yn(self.metadata['shufflelinks'][player]))
outfile.write('Shuffle Tavern:'.ljust(line_width) + '%s\n' % yn(self.metadata['shuffletavern'][player])) outfile.write('Shuffle Tavern:'.ljust(line_width) + '%s\n' % yn(self.metadata['shuffletavern'][player]))
outfile.write('Pyramid Hole Pre-opened:'.ljust(line_width) + '%s\n' % self.metadata['open_pyramid'][player]) outfile.write('Pyramid Hole Pre-opened:'.ljust(line_width) + '%s\n' % self.metadata['open_pyramid'][player])
if self.metadata['shuffle'][player] != 'vanilla' or self.metadata['ow_mixed'][player]: if self.metadata['shuffle'][player] != 'vanilla' or self.metadata['ow_mixed'][player]:
@@ -3380,6 +3380,9 @@ class Pot(object):
item = self.item if not self.indicator else self.standing_item_code item = self.item if not self.indicator else self.standing_item_code
return [self.x, high_byte, item] return [self.x, high_byte, item]
def get_region(self, world, player):
return world.get_region(self.room, 1)
def __eq__(self, other): def __eq__(self, other):
return self.x == other.x and self.y == other.y and self.room == other.room return self.x == other.x and self.y == other.y and self.room == other.room
@@ -3485,7 +3488,7 @@ class Settings(object):
| (counter_mode[w.dungeon_counters[p]] << 1) | (1 if w.experimental[p] else 0), | (counter_mode[w.dungeon_counters[p]] << 1) | (1 if w.experimental[p] else 0),
((8 if w.crystals_ganon_orig[p] == "random" else int(w.crystals_ganon_orig[p])) << 3) ((8 if w.crystals_ganon_orig[p] == "random" else int(w.crystals_ganon_orig[p])) << 3)
| (0x4 if w.open_pyramid[p] else 0) | access_mode[w.accessibility[p]], | (0x4 if w.is_pyramid_open(p) else 0) | access_mode[w.accessibility[p]],
(0x80 if w.bigkeyshuffle[p] else 0) (0x80 if w.bigkeyshuffle[p] else 0)
| (0x20 if w.mapshuffle[p] else 0) | (0x10 if w.compassshuffle[p] else 0) | (0x20 if w.mapshuffle[p] else 0) | (0x10 if w.compassshuffle[p] else 0)
+7
View File
@@ -1,5 +1,12 @@
# Changelog # Changelog
## 0.3.0.6
- \~Merged in DR v1.2.0.15~
- Fixed Tower of Hera music silence issue
- Improved GT crystal cutscene
- Fixed issue with bonk drop items causing duplicate sprite spawns
- Changed bonk prizes to not mark as collected unless it is visible on screen
## 0.3.0.5 ## 0.3.0.5
- Major reorganization to GUI Options - Major reorganization to GUI Options
- Corrected various fake world behavior in glitched modes - Corrected various fake world behavior in glitched modes
+12 -12
View File
@@ -436,7 +436,6 @@ def pair_existing_key_doors(world, player, door_a, door_b):
def choose_portals(world, player): def choose_portals(world, player):
if world.doorShuffle[player] != ['vanilla']: if world.doorShuffle[player] != ['vanilla']:
shuffle_flag = world.doorShuffle[player] != 'basic' shuffle_flag = world.doorShuffle[player] != 'basic'
allowed = {} allowed = {}
@@ -3286,7 +3285,8 @@ def remove_pair_type_if_present(door, world, player):
def find_inaccessible_regions(world, player): def find_inaccessible_regions(world, player):
world.inaccessible_regions[player] = [] world.inaccessible_regions[player] = []
start_regions = ['Links House' if not world.is_bombshop_start(player) else 'Big Bomb Shop', 'Sanctuary' if world.mode[player] != 'inverted' else 'Dark Sanctuary Hint'] start_regions = ['Links House' if not world.is_bombshop_start(player) else 'Big Bomb Shop']
start_regions.append('Sanctuary' if world.mode[player] != 'inverted' else 'Dark Sanctuary Hint')
regs = convert_regions(start_regions, world, player) regs = convert_regions(start_regions, world, player)
if all(all(not e.connected_region for e in r.exits) for r in regs): if all(all(not e.connected_region for e in r.exits) for r in regs):
# if attempting to find inaccessible regions before any connections made above, assume eventual access to Pyramid S&Q # if attempting to find inaccessible regions before any connections made above, assume eventual access to Pyramid S&Q
@@ -3328,9 +3328,10 @@ def find_accessible_entrances(world, player, builder):
hc_std = True hc_std = True
start_regions = ['Hyrule Castle Courtyard'] start_regions = ['Hyrule Castle Courtyard']
else: else:
start_regions = ['Links House' if not world.is_bombshop_start(player) else 'Big Bomb Shop', 'Sanctuary' if world.mode[player] != 'inverted' else 'Dark Sanctuary Hint'] start_regions = ['Links House' if not world.is_bombshop_start(player) else 'Big Bomb Shop']
if world.is_tile_swapped(0x1b, player): start_regions.append('Sanctuary' if world.mode[player] != 'inverted' else 'Dark Sanctuary Hint')
start_regions.append('Hyrule Castle Ledge') start_regions.append('Pyramid Area' if not world.is_tile_swapped(0x1b, player) else 'Hyrule Castle Ledge')
regs = convert_regions(start_regions, world, player) regs = convert_regions(start_regions, world, player)
visited_regions = set() visited_regions = set()
visited_entrances = [] visited_entrances = []
@@ -3350,12 +3351,12 @@ def find_accessible_entrances(world, player, builder):
if connect not in queue and connect not in visited_regions: if connect not in queue and connect not in visited_regions:
queue.append(connect) queue.append(connect)
for ext in next_region.exits: for ext in next_region.exits:
if hc_std and ext.name == 'Hyrule Castle Main Gate (North)': # just skip it if hc_std and ext.name in ['Hyrule Castle Main Gate (North)', 'Castle Gate Teleporter (Inner)', 'Hyrule Castle Ledge Drop']: # just skip it
continue continue
connect = ext.connected_region connect = ext.connected_region
if connect is None or ext.door and ext.door.blocked: if connect is None or ext.door and ext.door.blocked:
continue continue
if world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and (ext.name.startswith('Flute From') or ext.name in ['Hyrule Castle Main Gate (North)', 'Top of Pyramid (Inner)', 'Inverted Pyramid Entrance']): if world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and (ext.name.startswith('Flute From') or ext.name in ['Hyrule Castle Main Gate (North)', 'Castle Gate Teleporter (Inner)', 'Inverted Pyramid Entrance']):
continue continue
if connect.name in entrances and connect not in visited_entrances: if connect.name in entrances and connect not in visited_entrances:
visited_entrances.append(connect.name) visited_entrances.append(connect.name)
@@ -3388,10 +3389,7 @@ def create_doors_for_inaccessible_region(inaccessible_region, world, player):
region = world.get_region(inaccessible_region, player) region = world.get_region(inaccessible_region, player)
for ext in region.exits: for ext in region.exits:
create_door(world, player, ext.name, region.name) create_door(world, player, ext.name, region.name)
if ext.connected_region is None: if ext.connected_region and ext.connected_region.name.endswith(' Portal'):
# TODO: Since Open/Inverted regions are merged into one world model, some exits are left disconnected intentionally
logging.getLogger('').debug('Exit not connected to any region: %s', ext.name)
elif ext.connected_region.name.endswith(' Portal'):
for more_exts in ext.connected_region.exits: for more_exts in ext.connected_region.exits:
create_door(world, player, more_exts.name, ext.connected_region.name) create_door(world, player, more_exts.name, ext.connected_region.name)
@@ -3401,7 +3399,7 @@ def create_door(world, player, entName, region_name):
connect = entrance.connected_region connect = entrance.connected_region
if connect is not None: if connect is not None:
for ext in connect.exits: for ext in connect.exits:
if ext.connected_region is not None and ext.connected_region.name == region_name: if ext.connected_region and ext.connected_region.name == region_name:
d = Door(player, ext.name, DoorType.Logical, ext), d = Door(player, ext.name, DoorType.Logical, ext),
world.doors += d world.doors += d
connect_door_only(world, ext.name, ext.connected_region, player) connect_door_only(world, ext.name, ext.connected_region, player)
@@ -3814,6 +3812,8 @@ logical_connections = [
('GT Blocked Stairs Block Path', 'GT Big Chest'), ('GT Blocked Stairs Block Path', 'GT Big Chest'),
('GT Speed Torch South Path', 'GT Speed Torch'), ('GT Speed Torch South Path', 'GT Speed Torch'),
('GT Speed Torch North Path', 'GT Speed Torch Upper'), ('GT Speed Torch North Path', 'GT Speed Torch Upper'),
('GT Conveyor Cross Hammer Path', 'GT Conveyor Cross Across Pits'),
('GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross'),
('GT Hookshot East-Mid Path', 'GT Hookshot Mid Platform'), ('GT Hookshot East-Mid Path', 'GT Hookshot Mid Platform'),
('GT Hookshot Mid-East Path', 'GT Hookshot East Platform'), ('GT Hookshot Mid-East Path', 'GT Hookshot East Platform'),
('GT Hookshot North-Mid Path', 'GT Hookshot Mid Platform'), ('GT Hookshot North-Mid Path', 'GT Hookshot Mid Platform'),
+2
View File
@@ -1115,6 +1115,8 @@ def create_doors(world, player):
create_door(player, 'GT Invisible Catwalk NE', Nrml).dir(No, 0x9c, Right, High).pos(2), create_door(player, 'GT Invisible Catwalk NE', Nrml).dir(No, 0x9c, Right, High).pos(2),
create_door(player, 'GT Conveyor Cross EN', Nrml).dir(Ea, 0x8b, Top, High).pos(2), create_door(player, 'GT Conveyor Cross EN', Nrml).dir(Ea, 0x8b, Top, High).pos(2),
create_door(player, 'GT Conveyor Cross WN', Intr).dir(We, 0x8b, Top, High).pos(0), create_door(player, 'GT Conveyor Cross WN', Intr).dir(We, 0x8b, Top, High).pos(0),
create_door(player, 'GT Conveyor Cross Hammer Path', Lgcl),
create_door(player, 'GT Conveyor Cross Hookshot Path', Lgcl),
create_door(player, 'GT Hookshot EN', Intr).dir(Ea, 0x8b, Top, High).pos(0), create_door(player, 'GT Hookshot EN', Intr).dir(Ea, 0x8b, Top, High).pos(0),
create_door(player, 'GT Hookshot East-Mid Path', Lgcl), create_door(player, 'GT Hookshot East-Mid Path', Lgcl),
create_door(player, 'GT Hookshot Mid-East Path', Lgcl), create_door(player, 'GT Hookshot Mid-East Path', Lgcl),
+8 -6
View File
@@ -190,10 +190,11 @@ gt_regions = [
'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor', 'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor',
'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal', 'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal',
'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk', 'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk',
'GT Conveyor Cross', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform', 'GT Hookshot North Platform', 'GT Conveyor Cross', 'GT Conveyor Cross Across Pits', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform',
'GT Hookshot South Platform', 'GT Hookshot South Entry', 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', 'GT Hookshot North Platform', 'GT Hookshot South Platform', 'GT Hookshot South Entry',
'GT Double Switch Entry', 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', 'GT Double Switch Entry',
'GT Double Switch Left', 'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches', 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', 'GT Double Switch Left',
'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches',
'GT Double Switch Exit', 'GT Spike Crystal Left', 'GT Double Switch Exit', 'GT Spike Crystal Left',
'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section', 'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section',
'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot', 'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot',
@@ -204,8 +205,9 @@ gt_regions = [
'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2', 'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2',
'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1', 'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1',
'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches', 'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches',
'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', 'GT Crystal Circles - Ranged Crystal', 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle',
'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', 'GT Crystal Circles - Ranged Crystal', 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm',
'GT Moldorm Pit', 'GT Validation', 'GT Validation Door',
'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal' 'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal'
] ]
+7 -7
View File
@@ -98,7 +98,7 @@ Ice Palace: Ice Palace
Skull Woods Final Section: The back of Skull Woods Skull Woods Final Section: The back of Skull Woods
Death Mountain Return Cave (West): The SW DM Foothills Cave Death Mountain Return Cave (West): The SW DM Foothills Cave
Mimic Cave: Mimic Ledge Mimic Cave: Mimic Ledge
Dark World Hammer Peg Cave: The rows of pegs Hammer Peg Cave: The rows of pegs
Pyramid Fairy: The crack on the pyramid Pyramid Fairy: The crack on the pyramid
Eastern Palace: Eastern Palace Eastern Palace: Eastern Palace
Elder House (East): Elder House Elder House (East): Elder House
@@ -145,7 +145,7 @@ Chicken House: The chicken lady's house
Tavern North: A backdoor Tavern North: A backdoor
Aginahs Cave: The open desert cave Aginahs Cave: The open desert cave
Sahasrahlas Hut: The house near armos Sahasrahlas Hut: The house near armos
Cave Shop (Lake Hylia): The cave NW Lake Hylia Lake Hylia Shop: The cave NW Lake Hylia
Blacksmiths Hut: The old smithery Blacksmiths Hut: The old smithery
Sick Kids House: The central house in Kakariko Sick Kids House: The central house in Kakariko
Lost Woods Gamble: A tree trunk door Lost Woods Gamble: A tree trunk door
@@ -188,19 +188,19 @@ Dark World Shop: The hammer sealed building
Red Shield Shop: The fenced in building Red Shield Shop: The fenced in building
Mire Shed: The western hut in the mire Mire Shed: The western hut in the mire
East Dark World Hint: The dark cave near the eastmost portal East Dark World Hint: The dark cave near the eastmost portal
Dark Desert Hint: The cave east of the mire Mire Hint: The cave east of the mire
Spike Cave: The ledge cave on west dark DM Spike Cave: The ledge cave on west dark DM
Palace of Darkness Hint: The building south of Kiki Palace of Darkness Hint: The building south of Kiki
Dark Lake Hylia Ledge Spike Cave: The rock SE dark Lake Hylia Dark Lake Hylia Ledge Spike Cave: The rock SE dark Lake Hylia
Cave Shop (Dark Death Mountain): The base of east dark DM Dark Death Mountain Shop: The base of east dark DM
Dark World Potion Shop: The building near the catfish Dark Potion Shop: The building near the catfish
Archery Game: The old archery game Archery Game: The old archery game
Dark World Lumberjack Shop: The northmost Dark World building Dark Lumberjack Shop: The northmost Dark World building
Hype Cave: The cave south of the old bomb shop Hype Cave: The cave south of the old bomb shop
Brewery: The Village of Outcasts building with no door Brewery: The Village of Outcasts building with no door
Dark Lake Hylia Ledge Hint: The open cave SE dark Lake Hylia Dark Lake Hylia Ledge Hint: The open cave SE dark Lake Hylia
Chest Game: The westmost building in the Village of Outcasts Chest Game: The westmost building in the Village of Outcasts
Dark Desert Fairy: The eastern hut in the mire Mire Fairy: The eastern hut in the mire
Dark Lake Hylia Ledge Fairy: The sealed cave SE dark Lake Hylia Dark Lake Hylia Ledge Fairy: The sealed cave SE dark Lake Hylia
Fortune Teller (Dark): The building NE the Village of Outcasts Fortune Teller (Dark): The building NE the Village of Outcasts
Sanctuary: Sanctuary Sanctuary: Sanctuary
+47 -47
View File
@@ -671,7 +671,7 @@ def link_entrances(world, player):
world.ganon_at_pyramid[player] = False world.ganon_at_pyramid[player] = False
# check for Ganon's Tower location # check for Ganon's Tower location
if world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player).connected_region.name != 'Ganons Tower Portal' if not invFlag else 'GT Lobby': if world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player).connected_region.name != 'Ganons Tower Portal':
world.ganonstower_vanilla[player] = False world.ganonstower_vanilla[player] = False
@@ -1943,7 +1943,7 @@ Entrance_Pool_Base = ['Links House',
'Desert Fairy', 'Desert Fairy',
'Dark Lake Hylia Fairy', 'Dark Lake Hylia Fairy',
'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Fairy',
'Dark Desert Fairy', 'Mire Fairy',
'Dark Death Mountain Fairy', 'Dark Death Mountain Fairy',
'Fortune Teller (Light)', 'Fortune Teller (Light)',
'Lake Hylia Fortune Teller', 'Lake Hylia Fortune Teller',
@@ -1951,8 +1951,8 @@ Entrance_Pool_Base = ['Links House',
'Chicken House', 'Chicken House',
'Aginahs Cave', 'Aginahs Cave',
'Sahasrahlas Hut', 'Sahasrahlas Hut',
'Cave Shop (Lake Hylia)', 'Lake Hylia Shop',
'Cave Shop (Dark Death Mountain)', 'Dark Death Mountain Shop',
'Capacity Upgrade', 'Capacity Upgrade',
'Blacksmiths Hut', 'Blacksmiths Hut',
'Sick Kids House', 'Sick Kids House',
@@ -1983,21 +1983,21 @@ Entrance_Pool_Base = ['Links House',
'Big Bomb Shop', 'Big Bomb Shop',
'Dark World Shop', 'Dark World Shop',
'Dark Lake Hylia Shop', 'Dark Lake Hylia Shop',
'Dark World Lumberjack Shop', 'Dark Lumberjack Shop',
'Dark World Potion Shop', 'Dark Potion Shop',
'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Spike Cave',
'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Hint',
'Hype Cave', 'Hype Cave',
'Brewery', 'Brewery',
'C-Shaped House', 'C-Shaped House',
'Chest Game', 'Chest Game',
'Dark World Hammer Peg Cave', 'Hammer Peg Cave',
'Red Shield Shop', 'Red Shield Shop',
'Dark Sanctuary Hint', 'Dark Sanctuary Hint',
'Fortune Teller (Dark)', 'Fortune Teller (Dark)',
'Archery Game', 'Archery Game',
'Mire Shed', 'Mire Shed',
'Dark Desert Hint', 'Mire Hint',
'Spike Cave', 'Spike Cave',
'Mimic Cave', 'Mimic Cave',
'Kakariko Well Drop', 'Kakariko Well Drop',
@@ -2079,11 +2079,11 @@ Exit_Pool_Base = ['Links House Exit',
'Bonk Fairy (Light)', 'Bonk Fairy (Light)',
'Bonk Fairy (Dark)', 'Bonk Fairy (Dark)',
'Lake Hylia Healer Fairy', 'Lake Hylia Healer Fairy',
'Swamp Healer Fairy', 'Light Hype Fairy',
'Desert Healer Fairy', 'Desert Healer Fairy',
'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Healer Fairy',
'Dark Lake Hylia Ledge Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy',
'Dark Desert Healer Fairy', 'Mire Healer Fairy',
'Dark Death Mountain Healer Fairy', 'Dark Death Mountain Healer Fairy',
'Fortune Teller (Light)', 'Fortune Teller (Light)',
'Lake Hylia Fortune Teller', 'Lake Hylia Fortune Teller',
@@ -2091,8 +2091,8 @@ Exit_Pool_Base = ['Links House Exit',
'Chicken House', 'Chicken House',
'Aginahs Cave', 'Aginahs Cave',
'Sahasrahlas Hut', 'Sahasrahlas Hut',
'Cave Shop (Lake Hylia)', 'Lake Hylia Shop',
'Cave Shop (Dark Death Mountain)', 'Dark Death Mountain Shop',
'Capacity Upgrade', 'Capacity Upgrade',
'Blacksmiths Hut', 'Blacksmiths Hut',
'Sick Kids House', 'Sick Kids House',
@@ -2123,21 +2123,21 @@ Exit_Pool_Base = ['Links House Exit',
'Big Bomb Shop', 'Big Bomb Shop',
'Village of Outcasts Shop', 'Village of Outcasts Shop',
'Dark Lake Hylia Shop', 'Dark Lake Hylia Shop',
'Dark World Lumberjack Shop', 'Dark Lumberjack Shop',
'Dark World Potion Shop', 'Dark Potion Shop',
'Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Spike Cave',
'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Hint',
'Hype Cave', 'Hype Cave',
'Brewery', 'Brewery',
'C-Shaped House', 'C-Shaped House',
'Chest Game', 'Chest Game',
'Dark World Hammer Peg Cave', 'Hammer Peg Cave',
'Red Shield Shop', 'Red Shield Shop',
'Dark Sanctuary Hint', 'Dark Sanctuary Hint',
'Fortune Teller (Dark)', 'Fortune Teller (Dark)',
'Archery Game', 'Archery Game',
'Mire Shed', 'Mire Shed',
'Dark Desert Hint', 'Mire Hint',
'Spike Cave', 'Spike Cave',
'Mimic Cave', 'Mimic Cave',
'Kakariko Well (top)', 'Kakariko Well (top)',
@@ -2170,7 +2170,7 @@ mandatory_connections = [('Lost Woods Hideout (top to bottom)', 'Lost Woods Hide
('Death Mountain Return Cave E', 'Death Mountain Return Cave (right)'), ('Death Mountain Return Cave E', 'Death Mountain Return Cave (right)'),
('Death Mountain Return Cave W', 'Death Mountain Return Cave (left)'), ('Death Mountain Return Cave W', 'Death Mountain Return Cave (left)'),
('Spiral Cave (top to bottom)', 'Spiral Cave (Bottom)'), ('Spiral Cave (top to bottom)', 'Spiral Cave (Bottom)'),
('Light World Death Mountain Shop', 'Light World Death Mountain Shop'), ('Paradox Shop', 'Paradox Shop'),
('Paradox Cave Push Block Reverse', 'Paradox Cave Chest Area'), ('Paradox Cave Push Block Reverse', 'Paradox Cave Chest Area'),
('Paradox Cave Push Block', 'Paradox Cave Front'), ('Paradox Cave Push Block', 'Paradox Cave Front'),
('Paradox Cave Chest Area NE', 'Paradox Cave Bomb Area'), ('Paradox Cave Chest Area NE', 'Paradox Cave Bomb Area'),
@@ -2209,10 +2209,10 @@ default_connections = [('Bonk Fairy (Light)', 'Bonk Fairy (Light)'),
('Dark Sanctuary Hint', 'Dark Sanctuary Hint'), ('Dark Sanctuary Hint', 'Dark Sanctuary Hint'),
('Fortune Teller (Dark)', 'Fortune Teller (Dark)'), ('Fortune Teller (Dark)', 'Fortune Teller (Dark)'),
('Archery Game', 'Archery Game'), ('Archery Game', 'Archery Game'),
('Dark Desert Fairy', 'Dark Desert Healer Fairy') ('Mire Fairy', 'Mire Healer Fairy')
] ]
default_takeany_connections = [('Light Hype Fairy', 'Swamp Healer Fairy'), default_takeany_connections = [('Light Hype Fairy', 'Light Hype Fairy'),
('Desert Fairy', 'Desert Healer Fairy'), ('Desert Fairy', 'Desert Healer Fairy'),
('Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Healer Fairy'), ('Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Healer Fairy'),
('Bonk Fairy (Dark)', 'Bonk Fairy (Dark)'), ('Bonk Fairy (Dark)', 'Bonk Fairy (Dark)'),
@@ -2229,7 +2229,7 @@ default_pot_connections = [('Lumberjack House', 'Lumberjack House'),
('Hookshot Fairy', 'Hookshot Fairy'), ('Hookshot Fairy', 'Hookshot Fairy'),
('Palace of Darkness Hint', 'Palace of Darkness Hint'), ('Palace of Darkness Hint', 'Palace of Darkness Hint'),
('Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Spike Cave'), ('Dark Lake Hylia Ledge Spike Cave', 'Dark Lake Hylia Ledge Spike Cave'),
('Dark Desert Hint', 'Dark Desert Hint') ('Mire Hint', 'Mire Hint')
] ]
default_connector_connections = [('Old Man Cave (West)', 'Old Man Cave Exit (West)'), default_connector_connections = [('Old Man Cave (West)', 'Old Man Cave Exit (West)'),
@@ -2284,18 +2284,18 @@ default_item_connections = [('Links House', 'Links House Exit'),
('C-Shaped House', 'C-Shaped House'), ('C-Shaped House', 'C-Shaped House'),
('Brewery', 'Brewery'), ('Brewery', 'Brewery'),
('Pyramid Fairy', 'Pyramid Fairy'), ('Pyramid Fairy', 'Pyramid Fairy'),
('Dark World Hammer Peg Cave', 'Dark World Hammer Peg Cave'), ('Hammer Peg Cave', 'Hammer Peg Cave'),
('Big Bomb Shop', 'Big Bomb Shop'), ('Big Bomb Shop', 'Big Bomb Shop'),
('Mire Shed', 'Mire Shed'), ('Mire Shed', 'Mire Shed'),
('Hype Cave', 'Hype Cave') ('Hype Cave', 'Hype Cave')
] ]
default_shop_connections = [('Kakariko Shop', 'Kakariko Shop'), default_shop_connections = [('Kakariko Shop', 'Kakariko Shop'),
('Cave Shop (Lake Hylia)', 'Cave Shop (Lake Hylia)'), ('Lake Hylia Shop', 'Lake Hylia Shop'),
('Capacity Upgrade', 'Capacity Upgrade'), ('Capacity Upgrade', 'Capacity Upgrade'),
('Dark World Lumberjack Shop', 'Dark World Lumberjack Shop'), ('Dark Lumberjack Shop', 'Dark Lumberjack Shop'),
('Cave Shop (Dark Death Mountain)', 'Cave Shop (Dark Death Mountain)'), ('Dark Death Mountain Shop', 'Dark Death Mountain Shop'),
('Dark World Potion Shop', 'Dark World Potion Shop'), ('Dark Potion Shop', 'Dark Potion Shop'),
('Dark World Shop', 'Village of Outcasts Shop'), ('Dark World Shop', 'Village of Outcasts Shop'),
('Red Shield Shop', 'Red Shield Shop'), ('Red Shield Shop', 'Red Shield Shop'),
('Dark Lake Hylia Shop', 'Dark Lake Hylia Shop') ('Dark Lake Hylia Shop', 'Dark Lake Hylia Shop')
@@ -2449,7 +2449,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c
'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000), 0x00), 'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000), 0x00),
'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000), 0x00), 'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000), 0x00),
'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Cave Shop (Lake Hylia)': (0x57, (0x0112, 0x35, 0x0022, 0x0c00, 0x0b1a, 0x0c26, 0x0b98, 0x0c6d, 0x0b9f, 0x00, 0x00, 0x0000, 0x0000), 0x00), 'Lake Hylia Shop': (0x57, (0x0112, 0x35, 0x0022, 0x0c00, 0x0b1a, 0x0c26, 0x0b98, 0x0c6d, 0x0b9f, 0x00, 0x00, 0x0000, 0x0000), 0x00),
'Capacity Upgrade': (0x5C, (0x0115, 0x35, 0x0a46, 0x0d36, 0x0c2a, 0x0d88, 0x0ca8, 0x0da3, 0x0caf, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Capacity Upgrade': (0x5C, (0x0115, 0x35, 0x0a46, 0x0d36, 0x0c2a, 0x0d88, 0x0ca8, 0x0da3, 0x0caf, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Kakariko Well Drop': ([0xDB85C, 0xDB85D], None), 'Kakariko Well Drop': ([0xDB85C, 0xDB85D], None),
'Blacksmiths Hut': (0x63, (0x0121, 0x22, 0x010c, 0x081a, 0x0466, 0x0868, 0x04d8, 0x0887, 0x04e3, 0x06, 0xfa, 0x041A, 0x0000), 0x00), 'Blacksmiths Hut': (0x63, (0x0121, 0x22, 0x010c, 0x081a, 0x0466, 0x0868, 0x04d8, 0x0887, 0x04e3, 0x06, 0xfa, 0x041A, 0x0000), 0x00),
@@ -2492,19 +2492,19 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c
'Brewery': (0x47, (0x0106, 0x58, 0x16a8, 0x08e4, 0x013e, 0x0938, 0x01b8, 0x0953, 0x01c3, 0x0a, 0xf6, 0x1AB6, 0x0000), 0x02), 'Brewery': (0x47, (0x0106, 0x58, 0x16a8, 0x08e4, 0x013e, 0x0938, 0x01b8, 0x0953, 0x01c3, 0x0a, 0xf6, 0x1AB6, 0x0000), 0x02),
'C-Shaped House': (0x53, (0x011c, 0x58, 0x09d8, 0x0744, 0x02ce, 0x0797, 0x0348, 0x07b3, 0x0353, 0x0a, 0xf6, 0x0DE8, 0x0000), 0x00), 'C-Shaped House': (0x53, (0x011c, 0x58, 0x09d8, 0x0744, 0x02ce, 0x0797, 0x0348, 0x07b3, 0x0353, 0x0a, 0xf6, 0x0DE8, 0x0000), 0x00),
'Chest Game': (0x46, (0x0106, 0x58, 0x078a, 0x0705, 0x004e, 0x0758, 0x00c8, 0x0774, 0x00d3, 0x09, 0xf7, 0x0B98, 0x0000), 0x00), 'Chest Game': (0x46, (0x0106, 0x58, 0x078a, 0x0705, 0x004e, 0x0758, 0x00c8, 0x0774, 0x00d3, 0x09, 0xf7, 0x0B98, 0x0000), 0x00),
'Dark World Hammer Peg Cave': (0x7E, (0x0127, 0x62, 0x0894, 0x091e, 0x0492, 0x09a6, 0x0508, 0x098b, 0x050f, 0x00, 0x00, 0x0000, 0x0000), 0x20), 'Hammer Peg Cave': (0x7E, (0x0127, 0x62, 0x0894, 0x091e, 0x0492, 0x09a6, 0x0508, 0x098b, 0x050f, 0x00, 0x00, 0x0000, 0x0000), 0x20),
'Red Shield Shop': (0x74, (0x0110, 0x5a, 0x079a, 0x06e8, 0x04d6, 0x0738, 0x0548, 0x0755, 0x0553, 0x08, 0xf8, 0x0AA8, 0x0000), 0x00), 'Red Shield Shop': (0x74, (0x0110, 0x5a, 0x079a, 0x06e8, 0x04d6, 0x0738, 0x0548, 0x0755, 0x0553, 0x08, 0xf8, 0x0AA8, 0x0000), 0x00),
'Dark Sanctuary Hint': (0x59, (0x0112, 0x53, 0x001e, 0x0400, 0x06e2, 0x0446, 0x0758, 0x046d, 0x075f, 0x00, 0x00, 0x0000, 0x0000), 0x00), 'Dark Sanctuary Hint': (0x59, (0x0112, 0x53, 0x001e, 0x0400, 0x06e2, 0x0446, 0x0758, 0x046d, 0x075f, 0x00, 0x00, 0x0000, 0x0000), 0x00),
'Fortune Teller (Dark)': (0x65, (0x0122, 0x51, 0x0610, 0x04b4, 0x027e, 0x0507, 0x02f8, 0x0523, 0x0303, 0x0a, 0xf6, 0x091E, 0x0000), 0x00), 'Fortune Teller (Dark)': (0x65, (0x0122, 0x51, 0x0610, 0x04b4, 0x027e, 0x0507, 0x02f8, 0x0523, 0x0303, 0x0a, 0xf6, 0x091E, 0x0000), 0x00),
'Dark World Shop': (0x5F, (0x010f, 0x58, 0x1058, 0x0814, 0x02be, 0x0868, 0x0338, 0x0883, 0x0343, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark World Shop': (0x5F, (0x010f, 0x58, 0x1058, 0x0814, 0x02be, 0x0868, 0x0338, 0x0883, 0x0343, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Dark World Lumberjack Shop': (0x56, (0x010f, 0x42, 0x041c, 0x0074, 0x04e2, 0x00c7, 0x0558, 0x00e3, 0x055f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark Lumberjack Shop': (0x56, (0x010f, 0x42, 0x041c, 0x0074, 0x04e2, 0x00c7, 0x0558, 0x00e3, 0x055f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Dark World Potion Shop': (0x6E, (0x010f, 0x56, 0x080e, 0x04f4, 0x0c66, 0x0548, 0x0cd8, 0x0563, 0x0ce3, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark Potion Shop': (0x6E, (0x010f, 0x56, 0x080e, 0x04f4, 0x0c66, 0x0548, 0x0cd8, 0x0563, 0x0ce3, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Archery Game': (0x58, (0x0111, 0x69, 0x069e, 0x0ac4, 0x02ea, 0x0b18, 0x0368, 0x0b33, 0x036f, 0x0a, 0xf6, 0x09AC, 0x0000), 0x00), 'Archery Game': (0x58, (0x0111, 0x69, 0x069e, 0x0ac4, 0x02ea, 0x0b18, 0x0368, 0x0b33, 0x036f, 0x0a, 0xf6, 0x09AC, 0x0000), 0x00),
'Mire Shed': (0x5E, (0x010d, 0x70, 0x0384, 0x0c69, 0x001e, 0x0cb6, 0x0098, 0x0cd6, 0x00a3, 0x07, 0xf9, 0x0000, 0x0000), 0x00), 'Mire Shed': (0x5E, (0x010d, 0x70, 0x0384, 0x0c69, 0x001e, 0x0cb6, 0x0098, 0x0cd6, 0x00a3, 0x07, 0xf9, 0x0000, 0x0000), 0x00),
'Dark Desert Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000), 0x00), 'Mire Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000), 0x00),
'Dark Desert Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000), 0x00), 'Mire Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000), 0x00),
'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Cave Shop (Dark Death Mountain)': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00), 'Dark Death Mountain Shop': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Mimic Cave': (0x4E, (0x010c, 0x05, 0x07e0, 0x0103, 0x0d00, 0x0156, 0x0d78, 0x0172, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00), 'Mimic Cave': (0x4E, (0x010c, 0x05, 0x07e0, 0x0103, 0x0d00, 0x0156, 0x0d78, 0x0172, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Big Bomb Shop': (0x52, (0x011c, 0x6c, 0x0506, 0x0a9a, 0x0832, 0x0ae7, 0x08b8, 0x0b07, 0x08bf, 0x06, 0xfa, 0x0816, 0x0000), 0x00), 'Big Bomb Shop': (0x52, (0x011c, 0x6c, 0x0506, 0x0a9a, 0x0832, 0x0ae7, 0x08b8, 0x0b07, 0x08bf, 0x06, 0xfa, 0x0816, 0x0000), 0x00),
@@ -2584,11 +2584,11 @@ exit_ids = {'Links House Exit': (0x01, 0x00),
'Bonk Fairy (Light)': 0x71, 'Bonk Fairy (Light)': 0x71,
'Bonk Fairy (Dark)': 0x71, 'Bonk Fairy (Dark)': 0x71,
'Lake Hylia Healer Fairy': 0x5E, 'Lake Hylia Healer Fairy': 0x5E,
'Swamp Healer Fairy': 0x5E, 'Light Hype Fairy': 0x5E,
'Desert Healer Fairy': 0x5E, 'Desert Healer Fairy': 0x5E,
'Dark Lake Hylia Healer Fairy': 0x5E, 'Dark Lake Hylia Healer Fairy': 0x5E,
'Dark Lake Hylia Ledge Healer Fairy': 0x5E, 'Dark Lake Hylia Ledge Healer Fairy': 0x5E,
'Dark Desert Healer Fairy': 0x5E, 'Mire Healer Fairy': 0x5E,
'Dark Death Mountain Healer Fairy': 0x5E, 'Dark Death Mountain Healer Fairy': 0x5E,
'Fortune Teller (Light)': 0x65, 'Fortune Teller (Light)': 0x65,
'Lake Hylia Fortune Teller': 0x65, 'Lake Hylia Fortune Teller': 0x65,
@@ -2597,8 +2597,8 @@ exit_ids = {'Links House Exit': (0x01, 0x00),
'Chicken House': 0x4B, 'Chicken House': 0x4B,
'Aginahs Cave': 0x4D, 'Aginahs Cave': 0x4D,
'Sahasrahlas Hut': 0x45, 'Sahasrahlas Hut': 0x45,
'Cave Shop (Lake Hylia)': 0x58, 'Lake Hylia Shop': 0x58,
'Cave Shop (Dark Death Mountain)': 0x58, 'Dark Death Mountain Shop': 0x58,
'Capacity Upgrade': 0x5D, 'Capacity Upgrade': 0x5D,
'Blacksmiths Hut': 0x64, 'Blacksmiths Hut': 0x64,
'Sick Kids House': 0x40, 'Sick Kids House': 0x40,
@@ -2629,21 +2629,21 @@ exit_ids = {'Links House Exit': (0x01, 0x00),
'Big Bomb Shop': 0x53, 'Big Bomb Shop': 0x53,
'Village of Outcasts Shop': 0x60, 'Village of Outcasts Shop': 0x60,
'Dark Lake Hylia Shop': 0x60, 'Dark Lake Hylia Shop': 0x60,
'Dark World Lumberjack Shop': 0x60, 'Dark Lumberjack Shop': 0x60,
'Dark World Potion Shop': 0x60, 'Dark Potion Shop': 0x60,
'Dark Lake Hylia Ledge Spike Cave': 0x70, 'Dark Lake Hylia Ledge Spike Cave': 0x70,
'Dark Lake Hylia Ledge Hint': 0x6A, 'Dark Lake Hylia Ledge Hint': 0x6A,
'Hype Cave': 0x3D, 'Hype Cave': 0x3D,
'Brewery': 0x48, 'Brewery': 0x48,
'C-Shaped House': 0x54, 'C-Shaped House': 0x54,
'Chest Game': 0x47, 'Chest Game': 0x47,
'Dark World Hammer Peg Cave': 0x83, 'Hammer Peg Cave': 0x83,
'Red Shield Shop': 0x57, 'Red Shield Shop': 0x57,
'Dark Sanctuary Hint': 0x5A, 'Dark Sanctuary Hint': 0x5A,
'Fortune Teller (Dark)': 0x66, 'Fortune Teller (Dark)': 0x66,
'Archery Game': 0x59, 'Archery Game': 0x59,
'Mire Shed': 0x5F, 'Mire Shed': 0x5F,
'Dark Desert Hint': 0x62, 'Mire Hint': 0x62,
'Spike Cave': 0x41, 'Spike Cave': 0x41,
'Mimic Cave': 0x4F, 'Mimic Cave': 0x4F,
'Kakariko Well (top)': 0x80, 'Kakariko Well (top)': 0x80,
@@ -2730,7 +2730,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d),
'Chicken House': (0x120, 0x880), 'Chicken House': (0x120, 0x880),
'Aginahs Cave': (0x2e0, 0xd00), 'Aginahs Cave': (0x2e0, 0xd00),
'Sahasrahlas Hut': (0xcf0, 0x6c0), 'Sahasrahlas Hut': (0xcf0, 0x6c0),
'Cave Shop (Lake Hylia)': (0xbc0, 0xc00), 'Lake Hylia Shop': (0xbc0, 0xc00),
'Capacity Upgrade': (0xca0, 0xda0), 'Capacity Upgrade': (0xca0, 0xda0),
'Kakariko Well Drop': None, 'Kakariko Well Drop': None,
'Blacksmiths Hut': (0x4a0, 0x880), 'Blacksmiths Hut': (0x4a0, 0x880),
@@ -2770,19 +2770,19 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d),
'Hype Cave': (0x940, 0xc80), 'Hype Cave': (0x940, 0xc80),
'Bonk Fairy (Dark)': (0x740, 0xa80), 'Bonk Fairy (Dark)': (0x740, 0xa80),
'Brewery': (0x170, 0x980), 'C-Shaped House': (0x310, 0x7a0), 'Chest Game': (0x800, 0x7a0), 'Brewery': (0x170, 0x980), 'C-Shaped House': (0x310, 0x7a0), 'Chest Game': (0x800, 0x7a0),
'Dark World Hammer Peg Cave': (0x4c0, 0x940), 'Hammer Peg Cave': (0x4c0, 0x940),
'Red Shield Shop': (0x500, 0x680), 'Red Shield Shop': (0x500, 0x680),
'Dark Sanctuary Hint': (0x720, 0x4a0), 'Dark Sanctuary Hint': (0x720, 0x4a0),
'Fortune Teller (Dark)': (0x2c0, 0x4c0), 'Fortune Teller (Dark)': (0x2c0, 0x4c0),
'Dark World Shop': (0x2e0, 0x880), 'Dark World Shop': (0x2e0, 0x880),
'Dark World Lumberjack Shop': (0x4e0, 0x0d0), 'Dark Lumberjack Shop': (0x4e0, 0x0d0),
'Dark World Potion Shop': (0xc80, 0x4c0), 'Dark Potion Shop': (0xc80, 0x4c0),
'Archery Game': (0x2f0, 0xaf0), 'Archery Game': (0x2f0, 0xaf0),
'Mire Shed': (0x060, 0xc90), 'Mire Shed': (0x060, 0xc90),
'Dark Desert Hint': (0x2e0, 0xd00), 'Mire Hint': (0x2e0, 0xd00),
'Dark Desert Fairy': (0x1c0, 0xc90), 'Mire Fairy': (0x1c0, 0xc90),
'Spike Cave': (0x860, 0x180), 'Spike Cave': (0x860, 0x180),
'Cave Shop (Dark Death Mountain)': (0xd80, 0x180), 'Dark Death Mountain Shop': (0xd80, 0x180),
'Dark Death Mountain Fairy': (0x620, 0x2c0), 'Dark Death Mountain Fairy': (0x620, 0x2c0),
'Mimic Cave': (0xc80, 0x180), 'Mimic Cave': (0xc80, 0x180),
'Big Bomb Shop': (0x8b1, 0xb2d), 'Big Bomb Shop': (0x8b1, 0xb2d),
+6 -9
View File
@@ -494,15 +494,15 @@ def generate_itempool(world, player):
take_any_locations = [ take_any_locations = [
'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Light World Bomb Hut', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Light World Bomb Hut',
'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Lumberjack House', 'Bonk Fairy (Light)', 'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Lumberjack House', 'Bonk Fairy (Light)',
'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy', 'Swamp Healer Fairy', 'Desert Healer Fairy', 'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy', 'Light Hype Fairy', 'Desert Healer Fairy',
'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Dark Desert Healer Fairy', 'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Mire Healer Fairy',
'Dark Death Mountain Healer Fairy', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', 'Dark Death Mountain Healer Fairy', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave',
'Kakariko Gamble Game', '50 Rupee Cave', 'Lost Woods Gamble', 'Hookshot Fairy', 'Kakariko Gamble Game', '50 Rupee Cave', 'Lost Woods Gamble', 'Hookshot Fairy',
'Palace of Darkness Hint', 'East Dark World Hint', 'Archery Game', 'Dark Lake Hylia Ledge Hint', 'Palace of Darkness Hint', 'East Dark World Hint', 'Archery Game', 'Dark Lake Hylia Ledge Hint',
'Dark Lake Hylia Ledge Spike Cave', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Dark Desert Hint'] 'Dark Lake Hylia Ledge Spike Cave', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Mire Hint']
fixed_take_anys = [ fixed_take_anys = [
'Desert Healer Fairy', 'Swamp Healer Fairy', 'Dark Death Mountain Healer Fairy', 'Desert Healer Fairy', 'Light Hype Fairy', 'Dark Death Mountain Healer Fairy',
'Dark Lake Hylia Ledge Healer Fairy', 'Bonk Fairy (Dark)'] 'Dark Lake Hylia Ledge Healer Fairy', 'Bonk Fairy (Dark)']
@@ -966,7 +966,7 @@ def balance_prices(world, player):
def check_hints(world, player): def check_hints(world, player):
if world.shuffle[player] in ['simple', 'restricted', 'full', 'lite', 'lean', 'crossed', 'insanity']: if world.shuffle[player] in ['simple', 'restricted', 'full', 'lite', 'lean', 'crossed', 'insanity']:
for shop, location_list in shop_to_location_table.items(): for shop, location_list in shop_to_location_table.items():
if shop in ['Capacity Upgrade', 'Light World Death Mountain Shop', 'Potion Shop']: if shop in ['Capacity Upgrade', 'Paradox Shop', 'Potion Shop']:
continue # near the queen, near potions, and near 7 chests are fine continue # near the queen, near potions, and near 7 chests are fine
for loc_name in location_list: # other shops are indistinguishable in ER for loc_name in location_list: # other shops are indistinguishable in ER
world.get_location(loc_name, player).hint_text = f'for sale' world.get_location(loc_name, player).hint_text = f'for sale'
@@ -1144,10 +1144,7 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
if world.keyshuffle[player] == 'universal': if world.keyshuffle[player] == 'universal':
pool.extend(diff.retro) pool.extend(diff.retro)
if door_shuffle != 'vanilla': # door shuffle needs more keys for universal keys if door_shuffle != 'vanilla': # door shuffle needs more keys for universal keys
replace = 'Rupees (20)' if difficulty == 'normal' else 'Rupees (5)' pool.extend(['Small Key (Universal)'] * 5) # reduce to 5 for now
indices = [i for i, x in enumerate(pool) if x == replace]
for i in range(0, min(10, len(indices))):
pool[indices[i]] = 'Small Key (Universal)'
if mode == 'standard': if mode == 'standard':
if door_shuffle == 'vanilla': if door_shuffle == 'vanilla':
key_location = random.choice(['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross']) key_location = random.choice(['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross'])
+1 -1
View File
@@ -1421,7 +1421,7 @@ def prize_relevance(key_layout, dungeon_entrance, is_atgt_swapped):
def prize_relevance_sig2(start_regions, d_name, dungeon_entrance, is_atgt_swapped): def prize_relevance_sig2(start_regions, d_name, dungeon_entrance, is_atgt_swapped):
if len(start_regions) > 1 and dungeon_entrance and dungeon_table[d_name].prize: if len(start_regions) > 1 and dungeon_entrance and dungeon_table[d_name].prize:
if dungeon_entrance.name == ('Agahmins Tower' if is_atgt_swapped else 'Ganons Tower'): if dungeon_entrance.name == ('Agahnims Tower' if is_atgt_swapped else 'Ganons Tower'):
return 'GT' return 'GT'
elif dungeon_entrance.name == 'Pyramid Fairy': elif dungeon_entrance.name == 'Pyramid Fairy':
return 'BigBomb' return 'BigBomb'
+2 -2
View File
@@ -36,7 +36,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new
from source.tools.BPS import create_bps_from_data from source.tools.BPS import create_bps_from_data
from source.classes.CustomSettings import CustomSettings from source.classes.CustomSettings import CustomSettings
version_number = '1.2.0.14' version_number = '1.2.0.15'
version_branch = '-u' version_branch = '-u'
__version__ = f'{version_number}{version_branch}' __version__ = f'{version_number}{version_branch}'
@@ -267,6 +267,7 @@ def main(args, seed=None, fish=None):
set_rules(world, player) set_rules(world, player)
district_item_pool_config(world) district_item_pool_config(world)
dungeon_tracking(world)
fill_specific_items(world) fill_specific_items(world)
for player in range(1, world.players + 1): for player in range(1, world.players + 1):
if world.shopsanity[player]: if world.shopsanity[player]:
@@ -279,7 +280,6 @@ def main(args, seed=None, fish=None):
massage_item_pool(world) massage_item_pool(world)
if args.print_custom_yaml: if args.print_custom_yaml:
world.settings.record_item_pool(world) world.settings.record_item_pool(world)
dungeon_tracking(world)
logger.info(world.fish.translate("cli", "cli", "placing.dungeon.prizes")) logger.info(world.fish.translate("cli", "cli", "placing.dungeon.prizes"))
fill_prizes(world) fill_prizes(world)
+2 -2
View File
@@ -1707,8 +1707,8 @@ OWExitTypes = {
'East Death Mountain Teleporter', 'East Death Mountain Teleporter',
'TR Pegs Teleporter', 'TR Pegs Teleporter',
'Kakariko Teleporter', 'Kakariko Teleporter',
'Top of Pyramid', 'Castle Gate Teleporter',
'Top of Pyramid (Inner)', 'Castle Gate Teleporter (Inner)',
'East Hyrule Teleporter', 'East Hyrule Teleporter',
'Desert Teleporter', 'Desert Teleporter',
'South Hyrule Teleporter', 'South Hyrule Teleporter',
+2 -2
View File
@@ -37,7 +37,7 @@ def get_invalid_mirror_bunny_entrances():
yield 'Hype Cave' yield 'Hype Cave'
yield 'Bonk Fairy (Dark)' yield 'Bonk Fairy (Dark)'
yield 'Thieves Town' yield 'Thieves Town'
yield 'Dark World Hammer Peg Cave' yield 'Hammer Peg Cave'
yield 'Brewery' yield 'Brewery'
yield 'Hookshot Cave' yield 'Hookshot Cave'
yield 'Dark Lake Hylia Ledge Fairy' yield 'Dark Lake Hylia Ledge Fairy'
@@ -359,7 +359,7 @@ boots_clips_local = [ # (name, from_region, to_region)
('Floating Island Clip', 'East Death Mountain (Top East)', 'Death Mountain Floating Island'), ('Floating Island Clip', 'East Death Mountain (Top East)', 'Death Mountain Floating Island'),
('Floating Island Return Clip', 'Death Mountain Floating Island', 'East Death Mountain (Top East)'), ('Floating Island Return Clip', 'Death Mountain Floating Island', 'East Death Mountain (Top East)'),
#('DW Floating Island Clip', 'East Dark Death Mountain (Bottom)', 'Dark Death Mountain Floating Island'), #cannot guarantee camera correction #('DW Floating Island Clip', 'East Dark Death Mountain (Bottom)', 'Death Mountain Floating Island'), #cannot guarantee camera correction
('EDM East Dropdown Clip', 'East Death Mountain (Top East)', 'East Death Mountain (Bottom Left)'), ('EDM East Dropdown Clip', 'East Death Mountain (Top East)', 'East Death Mountain (Bottom Left)'),
('EDM Hammer Bypass Teleport', 'East Death Mountain (Top West)', 'East Death Mountain (Top East)'), ('EDM Hammer Bypass Teleport', 'East Death Mountain (Top West)', 'East Death Mountain (Top East)'),
('EDDM West Dropdown Clip', 'East Dark Death Mountain (Top)', 'East Dark Death Mountain (Bottom Left)'), ('EDDM West Dropdown Clip', 'East Dark Death Mountain (Top)', 'East Dark Death Mountain (Bottom Left)'),
+3 -3
View File
@@ -7,7 +7,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType
from OverworldGlitchRules import create_owg_connections from OverworldGlitchRules import create_owg_connections
from Utils import bidict from Utils import bidict
version_number = '0.3.0.5' version_number = '0.3.0.6'
# branch indicator is intentionally different across branches # branch indicator is intentionally different across branches
version_branch = '' version_branch = ''
@@ -1506,8 +1506,8 @@ ow_connections = {
('Graveyard Ladder (Bottom)', 'Graveyard Ledge') ('Graveyard Ladder (Bottom)', 'Graveyard Ledge')
]), ]),
0x1b: ([ 0x1b: ([
('Top of Pyramid', 'Pyramid Area'), ('Castle Gate Teleporter', 'Pyramid Area'),
('Top of Pyramid (Inner)', 'Pyramid Area') ('Castle Gate Teleporter (Inner)', 'Pyramid Area')
], [ ], [
('Post Aga Inverted Teleporter', 'Hyrule Castle Area') ('Post Aga Inverted Teleporter', 'Hyrule Castle Area')
]), ]),
+10 -10
View File
@@ -788,12 +788,12 @@ vanilla_pots = {
0x108: [Pot(166, 19, PotItem.Chicken, 'Chicken House', obj=RoomObject(0x03EFA9, [0x4F, 0x9F, 0xFA]))], 0x108: [Pot(166, 19, PotItem.Chicken, 'Chicken House', obj=RoomObject(0x03EFA9, [0x4F, 0x9F, 0xFA]))],
0x10C: [Pot(88, 14, PotItem.Heart, 'Hookshot Fairy', obj=RoomObject(0x03F329, [0xB3, 0x73, 0xFA]))], 0x10C: [Pot(88, 14, PotItem.Heart, 'Hookshot Fairy', obj=RoomObject(0x03F329, [0xB3, 0x73, 0xFA]))],
# note: these addresses got moved thanks to waterfall fairy edit # note: these addresses got moved thanks to waterfall fairy edit
0x114: [Pot(92, 4, PotItem.Heart, 'Dark Desert Hint', obj=RoomObject(0x03F79A, [0xBB, 0x23, 0xFA])), 0x114: [Pot(92, 4, PotItem.Heart, 'Mire Hint', obj=RoomObject(0x03F79A, [0xBB, 0x23, 0xFA])),
Pot(96, 4, PotItem.Heart, 'Dark Desert Hint', obj=RoomObject(0x03F79D, [0xC3, 0x23, 0xFA])), Pot(96, 4, PotItem.Heart, 'Mire Hint', obj=RoomObject(0x03F79D, [0xC3, 0x23, 0xFA])),
Pot(92, 5, PotItem.Bomb, 'Dark Desert Hint', obj=RoomObject(0x03F7A0, [0xBB, 0x2B, 0xFA])), Pot(92, 5, PotItem.Bomb, 'Mire Hint', obj=RoomObject(0x03F7A0, [0xBB, 0x2B, 0xFA])),
Pot(96, 5, PotItem.Bomb, 'Dark Desert Hint', obj=RoomObject(0x03F7A3, [0xC3, 0x2B, 0xFA])), Pot(96, 5, PotItem.Bomb, 'Mire Hint', obj=RoomObject(0x03F7A3, [0xC3, 0x2B, 0xFA])),
Pot(92, 10, PotItem.FiveArrows, 'Dark Desert Hint', obj=RoomObject(0x03F7A6, [0xBB, 0x53, 0xFA])), Pot(92, 10, PotItem.FiveArrows, 'Mire Hint', obj=RoomObject(0x03F7A6, [0xBB, 0x53, 0xFA])),
Pot(96, 10, PotItem.Heart, 'Dark Desert Hint', obj=RoomObject(0x03F7A9, [0xC3, 0x53, 0xFA]))], Pot(96, 10, PotItem.Heart, 'Mire Hint', obj=RoomObject(0x03F7A9, [0xC3, 0x53, 0xFA]))],
0x117: [Pot(138, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCB2, [0x17, 0x1F, 0xFA])), # 0x38A -> 38A 0x117: [Pot(138, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCB2, [0x17, 0x1F, 0xFA])), # 0x38A -> 38A
Pot(142, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCB8, [0x1F, 0x1F, 0xFA])), Pot(142, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCB8, [0x1F, 0x1F, 0xFA])),
Pot(166, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCC1, [0x4F, 0x1F, 0xFA])), Pot(166, 3, PotItem.Heart, 'Spike Cave', obj=RoomObject(0x03FCC1, [0x4F, 0x1F, 0xFA])),
@@ -851,10 +851,10 @@ vanilla_pots = {
Pot(100, 22, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB62A, [0xCB, 0xB3, 0xFA])), Pot(100, 22, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB62A, [0xCB, 0xB3, 0xFA])),
Pot(88, 28, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB633, [0xB3, 0xE3, 0xFA])), Pot(88, 28, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB633, [0xB3, 0xE3, 0xFA])),
Pot(100, 28, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB636, [0xCB, 0xE3, 0xFA]))], Pot(100, 28, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB636, [0xCB, 0xE3, 0xFA]))],
0x127: [Pot(24, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B801A, [0x33, 0xCB, 0xFA])), 0x127: [Pot(24, 25, PotItem.Nothing, 'Hammer Peg Cave', obj=RoomObject(0x2B801A, [0x33, 0xCB, 0xFA])),
Pot(28, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B801D, [0x3B, 0xCB, 0xFA])), Pot(28, 25, PotItem.Nothing, 'Hammer Peg Cave', obj=RoomObject(0x2B801D, [0x3B, 0xCB, 0xFA])),
Pot(32, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B8020, [0x43, 0xCB, 0xFA])), Pot(32, 25, PotItem.Nothing, 'Hammer Peg Cave', obj=RoomObject(0x2B8020, [0x43, 0xCB, 0xFA])),
Pot(36, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B8023, [0x4B, 0xCB, 0xFA]))], Pot(36, 25, PotItem.Nothing, 'Hammer Peg Cave', obj=RoomObject(0x2B8023, [0x4B, 0xCB, 0xFA]))],
} }
+11
View File
@@ -109,6 +109,17 @@ These are now independent of retro mode and have three options: None, Random, an
# Bug Fixes and Notes # Bug Fixes and Notes
* 1.2.0.15u
* GUI reorganization
* Logic fix for pots in GT conveyor cross
* Auto option for pyramid open (trinity or ER + crystals goal)
* World model refactor (combining inverted and normal world models)
* Partitioned fix for lamp logic and links house
* Fix starting flute logic
* Reduced universal keys in pool slightly for non-vanilla dungeons
* Fake world fix finally
* Some extra restrictions on links house placement for lite/lean
* Collection_rate works in customizer files
* 1.2.0.14u * 1.2.0.14u
* Small fix for key logic validation (got rid of a false negative) * Small fix for key logic validation (got rid of a false negative)
* Customized doors in ice cross work properly now * Customized doors in ice cross work properly now
+52 -50
View File
@@ -62,9 +62,9 @@ def create_regions(world, player):
create_lw_region(player, 'Kakariko Southwest', None, ['Kakariko Southwest Bush (South)', 'Light World Bomb Hut']), create_lw_region(player, 'Kakariko Southwest', None, ['Kakariko Southwest Bush (South)', 'Light World Bomb Hut']),
create_lw_region(player, 'Kakariko Grass Yard', None, ['Kakariko Yard Bush (North)', 'Bush Covered House']), create_lw_region(player, 'Kakariko Grass Yard', None, ['Kakariko Yard Bush (North)', 'Bush Covered House']),
create_lw_region(player, 'Forgotten Forest Area', None, ['Forgotten Forest NW', 'Forgotten Forest NE', 'Forgotten Forest ES']), create_lw_region(player, 'Forgotten Forest Area', None, ['Forgotten Forest NW', 'Forgotten Forest NE', 'Forgotten Forest ES']),
create_lw_region(player, 'Hyrule Castle Area', None, ['Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Main Gate (South)', 'Hyrule Castle Inner East Rock', 'Hyrule Castle Southwest Bush (North)', 'Top of Pyramid', 'Hyrule Castle WN', 'Hyrule Castle SE']), create_lw_region(player, 'Hyrule Castle Area', None, ['Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Main Gate (South)', 'Hyrule Castle Inner East Rock', 'Hyrule Castle Southwest Bush (North)', 'Castle Gate Teleporter', 'Hyrule Castle WN', 'Hyrule Castle SE']),
create_lw_region(player, 'Hyrule Castle Southwest', None, ['Hyrule Castle Southwest Bush (South)', 'Hyrule Castle SW']), create_lw_region(player, 'Hyrule Castle Southwest', None, ['Hyrule Castle Southwest Bush (South)', 'Hyrule Castle SW']),
create_lw_region(player, 'Hyrule Castle Courtyard', None, ['Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Main Gate (North)', 'Hyrule Castle Entrance (South)', 'Top of Pyramid (Inner)']), create_lw_region(player, 'Hyrule Castle Courtyard', None, ['Hyrule Castle Courtyard Bush (South)', 'Hyrule Castle Main Gate (North)', 'Hyrule Castle Entrance (South)', 'Castle Gate Teleporter (Inner)']),
create_lw_region(player, 'Hyrule Castle Courtyard Northeast', None, ['Hyrule Castle Courtyard Bush (North)', 'Hyrule Castle Secret Entrance Stairs']), create_lw_region(player, 'Hyrule Castle Courtyard Northeast', None, ['Hyrule Castle Courtyard Bush (North)', 'Hyrule Castle Secret Entrance Stairs']),
create_lw_region(player, 'Hyrule Castle Ledge', None, ['Hyrule Castle Ledge Drop', 'Hyrule Castle Ledge Courtyard Drop', 'Inverted Pyramid Entrance', 'Hyrule Castle Entrance (West)', 'Agahnims Tower', 'Hyrule Castle Entrance (East)', 'Inverted Pyramid Hole'], 'the castle rampart'), create_lw_region(player, 'Hyrule Castle Ledge', None, ['Hyrule Castle Ledge Drop', 'Hyrule Castle Ledge Courtyard Drop', 'Inverted Pyramid Entrance', 'Hyrule Castle Entrance (West)', 'Agahnims Tower', 'Hyrule Castle Entrance (East)', 'Inverted Pyramid Hole'], 'the castle rampart'),
create_lw_region(player, 'Hyrule Castle East Entry', None, ['Hyrule Castle Outer East Rock', 'Hyrule Castle ES']), create_lw_region(player, 'Hyrule Castle East Entry', None, ['Hyrule Castle Outer East Rock', 'Hyrule Castle ES']),
@@ -111,7 +111,7 @@ def create_regions(world, player):
create_lw_region(player, 'C Whirlpool Outer Area', None, ['C Whirlpool Rock (Top)', 'C Whirlpool WC', 'C Whirlpool NW']), create_lw_region(player, 'C Whirlpool Outer Area', None, ['C Whirlpool Rock (Top)', 'C Whirlpool WC', 'C Whirlpool NW']),
create_lw_region(player, 'Statues Area', None, ['Statues Water Entry', 'Light Hype Fairy', 'Statues NC', 'Statues WN', 'Statues WS', 'Statues SC']), create_lw_region(player, 'Statues Area', None, ['Statues Water Entry', 'Light Hype Fairy', 'Statues NC', 'Statues WN', 'Statues WS', 'Statues SC']),
create_lw_region(player, 'Statues Water', None, ['Statues Landing', 'Statues WC'], 'Light World', Terrain.Water), create_lw_region(player, 'Statues Water', None, ['Statues Landing', 'Statues WC'], 'Light World', Terrain.Water),
create_lw_region(player, 'Lake Hylia Area', None, ['Lake Hylia Water Drop', 'Lake Hylia Fortune Teller', 'Cave Shop (Lake Hylia)', 'Lake Hylia NW']), create_lw_region(player, 'Lake Hylia Area', None, ['Lake Hylia Water Drop', 'Lake Hylia Fortune Teller', 'Lake Hylia Shop', 'Lake Hylia NW']),
create_lw_region(player, 'Lake Hylia South Shore', None, ['Lake Hylia South Water Drop', 'Mini Moldorm Cave', 'Lake Hylia WS', 'Lake Hylia ES']), create_lw_region(player, 'Lake Hylia South Shore', None, ['Lake Hylia South Water Drop', 'Mini Moldorm Cave', 'Lake Hylia WS', 'Lake Hylia ES']),
create_lw_region(player, 'Lake Hylia Northeast Bank', None, ['Lake Hylia Northeast Water Drop', 'Lake Hylia NE']), create_lw_region(player, 'Lake Hylia Northeast Bank', None, ['Lake Hylia Northeast Water Drop', 'Lake Hylia NE']),
create_lw_region(player, 'Lake Hylia Central Island', None, ['Lake Hylia Central Water Drop', 'Capacity Upgrade', 'Lake Hylia Teleporter']), create_lw_region(player, 'Lake Hylia Central Island', None, ['Lake Hylia Central Water Drop', 'Capacity Upgrade', 'Lake Hylia Teleporter']),
@@ -135,12 +135,12 @@ def create_regions(world, player):
create_dw_region(player, 'Skull Woods Forest (West)', None, ['Skull Woods Second Section Hole', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section'], 'a deep, dark forest'), create_dw_region(player, 'Skull Woods Forest (West)', None, ['Skull Woods Second Section Hole', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section'], 'a deep, dark forest'),
create_dw_region(player, 'Skull Woods Forgotten Path (Southwest)', None, ['Skull Woods Forgotten Bush (West)', 'Skull Woods SW']), create_dw_region(player, 'Skull Woods Forgotten Path (Southwest)', None, ['Skull Woods Forgotten Bush (West)', 'Skull Woods SW']),
create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Skull Woods EN']), create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Skull Woods EN']),
create_dw_region(player, 'Dark Lumberjack Area', None, ['Dark World Lumberjack Shop', 'Dark Lumberjack WN', 'Dark Lumberjack SW']), create_dw_region(player, 'Dark Lumberjack Area', None, ['Dark Lumberjack Shop', 'Dark Lumberjack WN', 'Dark Lumberjack SW']),
create_dw_region(player, 'West Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (West)', 'GT Entry Approach', 'West Dark Death Mountain EN']), create_dw_region(player, 'West Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (West)', 'GT Entry Approach', 'West Dark Death Mountain EN']),
create_dw_region(player, 'GT Approach', None, ['GT Entry Leave', 'Ganons Tower']), create_dw_region(player, 'GT Approach', None, ['GT Entry Leave', 'Ganons Tower']),
create_dw_region(player, 'West Dark Death Mountain (Bottom)', None, ['Spike Cave', 'Dark Death Mountain Fairy', 'Dark Death Mountain Teleporter (West)', 'West Dark Death Mountain ES']), create_dw_region(player, 'West Dark Death Mountain (Bottom)', None, ['Spike Cave', 'Dark Death Mountain Fairy', 'Dark Death Mountain Teleporter (West)', 'West Dark Death Mountain ES']),
create_dw_region(player, 'East Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (East)', 'Superbunny Cave (Top)', 'Hookshot Cave', 'East Dark Death Mountain WN', 'East Dark Death Mountain EN']), create_dw_region(player, 'East Dark Death Mountain (Top)', None, ['Dark Death Mountain Drop (East)', 'Superbunny Cave (Top)', 'Hookshot Cave', 'East Dark Death Mountain WN', 'East Dark Death Mountain EN']),
create_dw_region(player, 'East Dark Death Mountain (Bottom)', None, ['East Dark Death Mountain Bushes', 'Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Dark Death Mountain Teleporter (East)']), create_dw_region(player, 'East Dark Death Mountain (Bottom)', None, ['East Dark Death Mountain Bushes', 'Superbunny Cave (Bottom)', 'Dark Death Mountain Shop', 'Dark Death Mountain Teleporter (East)']),
create_dw_region(player, 'East Dark Death Mountain (Bushes)', None, []), create_dw_region(player, 'East Dark Death Mountain (Bushes)', None, []),
create_dw_region(player, 'East Dark Death Mountain (Bottom Left)', None, ['East Dark Death Mountain WS']), create_dw_region(player, 'East Dark Death Mountain (Bottom Left)', None, ['East Dark Death Mountain WS']),
create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)'], 'a dark ledge'), create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)'], 'a dark ledge'),
@@ -164,7 +164,7 @@ def create_regions(world, player):
create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'Qirn Jump WC', 'Qirn Jump SW']), create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'Qirn Jump WC', 'Qirn Jump SW']),
create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']), create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']),
create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump Whirlpool', 'Qirn Jump EN', 'Qirn Jump SC'], 'Dark World', Terrain.Water), create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump Whirlpool', 'Qirn Jump EN', 'Qirn Jump SC'], 'Dark World', Terrain.Water),
create_dw_region(player, 'Dark Witch Area', None, ['Dark Witch Water Drop', 'Dark Witch Rock (South)', 'Dark World Potion Shop', 'Dark Witch WC', 'Dark Witch WS']), create_dw_region(player, 'Dark Witch Area', None, ['Dark Witch Water Drop', 'Dark Witch Rock (South)', 'Dark Potion Shop', 'Dark Witch WC', 'Dark Witch WS']),
create_dw_region(player, 'Dark Witch Northeast', None, ['Dark Witch Northeast Water Drop', 'Dark Witch Rock (North)', 'Dark Witch EC']), create_dw_region(player, 'Dark Witch Northeast', None, ['Dark Witch Northeast Water Drop', 'Dark Witch Rock (North)', 'Dark Witch EC']),
create_dw_region(player, 'Dark Witch Water', None, ['Dark Witch WN', 'Dark Witch EN'], 'Dark World', Terrain.Water), create_dw_region(player, 'Dark Witch Water', None, ['Dark Witch WN', 'Dark Witch EN'], 'Dark World', Terrain.Water),
create_dw_region(player, 'Catfish Approach Area', None, ['Catfish Approach Rocks (West)', 'Catfish Approach Bottom Ledge Drop', 'Catfish Approach Water Drop', 'Catfish Approach WC']), create_dw_region(player, 'Catfish Approach Area', None, ['Catfish Approach Rocks (West)', 'Catfish Approach Bottom Ledge Drop', 'Catfish Approach Water Drop', 'Catfish Approach WC']),
@@ -186,7 +186,7 @@ def create_regions(world, player):
create_dw_region(player, 'Palace of Darkness Area', None, ['Palace of Darkness Hint', 'Palace of Darkness', 'Palace of Darkness SW', 'Palace of Darkness SE']), create_dw_region(player, 'Palace of Darkness Area', None, ['Palace of Darkness Hint', 'Palace of Darkness', 'Palace of Darkness SW', 'Palace of Darkness SE']),
create_dw_region(player, 'Darkness Cliff', None, ['Dark Dunes Ledge Drop', 'Hammer Bridge North Ledge Drop', 'Dark Tree Line Ledge Drop', 'Palace of Darkness Ledge Drop']), create_dw_region(player, 'Darkness Cliff', None, ['Dark Dunes Ledge Drop', 'Hammer Bridge North Ledge Drop', 'Dark Tree Line Ledge Drop', 'Palace of Darkness Ledge Drop']),
create_dw_region(player, 'Hammer Pegs Entry', None, ['Peg Area Rocks (West)', 'Hammer Pegs WS']), create_dw_region(player, 'Hammer Pegs Entry', None, ['Peg Area Rocks (West)', 'Hammer Pegs WS']),
create_dw_region(player, 'Hammer Pegs Area', ['Dark Blacksmith Ruins'], ['Peg Area Rocks (East)', 'Dark World Hammer Peg Cave']), create_dw_region(player, 'Hammer Pegs Area', ['Dark Blacksmith Ruins'], ['Peg Area Rocks (East)', 'Hammer Peg Cave']),
create_dw_region(player, 'Dark Dunes Area', None, ['Dark Dunes NW', 'Dark Dunes WN', 'Dark Dunes SC']), create_dw_region(player, 'Dark Dunes Area', None, ['Dark Dunes NW', 'Dark Dunes WN', 'Dark Dunes SC']),
create_dw_region(player, 'Dig Game Area', ['Digging Game'], ['Dig Game To Ledge Drop', 'Dig Game ES']), create_dw_region(player, 'Dig Game Area', ['Digging Game'], ['Dig Game To Ledge Drop', 'Dig Game ES']),
create_dw_region(player, 'Dig Game Ledge', None, ['Dig Game Ledge Drop', 'Dig Game EC']), create_dw_region(player, 'Dig Game Ledge', None, ['Dig Game Ledge Drop', 'Dig Game EC']),
@@ -205,7 +205,7 @@ def create_regions(world, player):
create_dw_region(player, 'Dark Tree Line Area', None, ['Dark Lake Hylia Fairy', 'Dark Tree Line WN', 'Dark Tree Line NW', 'Dark Tree Line SE']), create_dw_region(player, 'Dark Tree Line Area', None, ['Dark Lake Hylia Fairy', 'Dark Tree Line WN', 'Dark Tree Line NW', 'Dark Tree Line SE']),
create_dw_region(player, 'Dark Tree Line Water', None, ['Dark Tree Line WC', 'Dark Tree Line SC'], 'Dark World', Terrain.Water), create_dw_region(player, 'Dark Tree Line Water', None, ['Dark Tree Line WC', 'Dark Tree Line SC'], 'Dark World', Terrain.Water),
create_dw_region(player, 'Palace of Darkness Nook Area', None, ['East Dark World Hint', 'East Dark World Teleporter', 'Palace of Darkness Nook NE']), create_dw_region(player, 'Palace of Darkness Nook Area', None, ['East Dark World Hint', 'East Dark World Teleporter', 'Palace of Darkness Nook NE']),
create_dw_region(player, 'Misery Mire Area', None, ['Mire Shed', 'Misery Mire', 'Dark Desert Fairy', 'Dark Desert Hint']), create_dw_region(player, 'Misery Mire Area', None, ['Mire Shed', 'Misery Mire', 'Mire Fairy', 'Mire Hint']),
create_dw_region(player, 'Misery Mire Teleporter Ledge', None, ['Misery Mire Teleporter Ledge Drop', 'Misery Mire Teleporter']), create_dw_region(player, 'Misery Mire Teleporter Ledge', None, ['Misery Mire Teleporter Ledge Drop', 'Misery Mire Teleporter']),
create_dw_region(player, 'Mire Northeast Cliffs', None, ['Mire Cliff Ledge Drop', 'Dark Checkerboard Cliff Ledge Drop', 'Archery Game Cliff Ledge Drop', 'Stumpy Approach Cliff Ledge Drop', 'Mire C Whirlpool Cliff Ledge Drop', 'Swamp Nook Cliff Ledge Drop', 'Swamp Cliff Ledge Drop', 'Mirror To Bombos Tablet Ledge']), create_dw_region(player, 'Mire Northeast Cliffs', None, ['Mire Cliff Ledge Drop', 'Dark Checkerboard Cliff Ledge Drop', 'Archery Game Cliff Ledge Drop', 'Stumpy Approach Cliff Ledge Drop', 'Mire C Whirlpool Cliff Ledge Drop', 'Swamp Nook Cliff Ledge Drop', 'Swamp Cliff Ledge Drop', 'Mirror To Bombos Tablet Ledge']),
create_dw_region(player, 'Stumpy Approach Area', None, ['Stumpy Approach Bush (South)', 'Stumpy Approach NW', 'Stumpy Approach EC']), create_dw_region(player, 'Stumpy Approach Area', None, ['Stumpy Approach Bush (South)', 'Stumpy Approach NW', 'Stumpy Approach EC']),
@@ -246,19 +246,20 @@ def create_regions(world, player):
create_cave_region(player, 'Spectacle Rock Cave (Top)', 'a connector', ['Spectacle Rock Cave'], ['Spectacle Rock Cave Drop', 'Spectacle Rock Cave Exit (Top)']), create_cave_region(player, 'Spectacle Rock Cave (Top)', 'a connector', ['Spectacle Rock Cave'], ['Spectacle Rock Cave Drop', 'Spectacle Rock Cave Exit (Top)']),
create_cave_region(player, 'Spectacle Rock Cave (Bottom)', 'a connector', None, ['Spectacle Rock Cave Exit']), create_cave_region(player, 'Spectacle Rock Cave (Bottom)', 'a connector', None, ['Spectacle Rock Cave Exit']),
create_cave_region(player, 'Spectacle Rock Cave (Peak)', 'a connector', None, ['Spectacle Rock Cave Peak Drop', 'Spectacle Rock Cave Exit (Peak)']), create_cave_region(player, 'Spectacle Rock Cave (Peak)', 'a connector', None, ['Spectacle Rock Cave Peak Drop', 'Spectacle Rock Cave Exit (Peak)']),
create_cave_region(player, 'Hookshot Fairy', 'fairies deep in a cave'),
create_cave_region(player, 'Paradox Cave Front', 'a connector', None, ['Paradox Cave Push Block Reverse', 'Paradox Cave Exit (Bottom)', 'Light World Death Mountain Shop']),
create_cave_region(player, 'Paradox Cave Chest Area', 'a connector', ['Paradox Cave Lower - Far Left', 'Paradox Cave Lower - Left', 'Paradox Cave Lower - Right', 'Paradox Cave Lower - Far Right', 'Paradox Cave Lower - Middle'],
['Paradox Cave Push Block', 'Paradox Cave Bomb Jump', 'Paradox Cave Chest Area NE']),
create_cave_region(player, 'Paradox Cave Bomb Area', 'a connector', ['Paradox Cave Upper - Left', 'Paradox Cave Upper - Right']),
create_cave_region(player, 'Paradox Cave', 'a connector', None, ['Paradox Cave Exit (Middle)', 'Paradox Cave Exit (Top)', 'Paradox Cave Drop']),
create_cave_region(player, 'Light World Death Mountain Shop', 'a common shop', ['Paradox Shop - Left', 'Paradox Shop - Middle', 'Paradox Shop - Right']),
create_cave_region(player, 'Fairy Ascension Cave (Bottom)', 'a connector', None, ['Fairy Ascension Cave Climb', 'Fairy Ascension Cave Exit (Bottom)']),
create_cave_region(player, 'Fairy Ascension Cave (Drop)', 'a connector', None, ['Fairy Ascension Cave Pots']),
create_cave_region(player, 'Fairy Ascension Cave (Top)', 'a connector', None, ['Fairy Ascension Cave Exit (Top)', 'Fairy Ascension Cave Drop']),
create_cave_region(player, 'Spiral Cave (Top)', 'a connector', ['Spiral Cave'], ['Spiral Cave (top to bottom)', 'Spiral Cave Exit (Top)']), create_cave_region(player, 'Spiral Cave (Top)', 'a connector', ['Spiral Cave'], ['Spiral Cave (top to bottom)', 'Spiral Cave Exit (Top)']),
create_cave_region(player, 'Spiral Cave (Bottom)', 'a connector', None, ['Spiral Cave Exit']), create_cave_region(player, 'Spiral Cave (Bottom)', 'a connector', None, ['Spiral Cave Exit']),
create_cave_region(player, 'Mimic Cave', 'Mimic Cave', ['Mimic Cave']), create_cave_region(player, 'Mimic Cave', 'Mimic Cave', ['Mimic Cave']),
create_cave_region(player, 'Fairy Ascension Cave (Bottom)', 'a connector', None, ['Fairy Ascension Cave Climb', 'Fairy Ascension Cave Exit (Bottom)']),
create_cave_region(player, 'Fairy Ascension Cave (Drop)', 'a connector', None, ['Fairy Ascension Cave Pots']),
create_cave_region(player, 'Fairy Ascension Cave (Top)', 'a connector', None, ['Fairy Ascension Cave Exit (Top)', 'Fairy Ascension Cave Drop']),
create_cave_region(player, 'Hookshot Fairy', 'fairies deep in a cave'),
create_cave_region(player, 'Paradox Cave Front', 'a connector', None, ['Paradox Cave Push Block Reverse', 'Paradox Cave Exit (Bottom)', 'Paradox Shop']),
create_cave_region(player, 'Paradox Cave Chest Area', 'a connector', ['Paradox Cave Lower - Far Left', 'Paradox Cave Lower - Left',
'Paradox Cave Lower - Right', 'Paradox Cave Lower - Far Right', 'Paradox Cave Lower - Middle'],
['Paradox Cave Push Block', 'Paradox Cave Bomb Jump', 'Paradox Cave Chest Area NE']),
create_cave_region(player, 'Paradox Cave Bomb Area', 'a connector', ['Paradox Cave Upper - Left', 'Paradox Cave Upper - Right']),
create_cave_region(player, 'Paradox Cave', 'a connector', None, ['Paradox Cave Exit (Middle)', 'Paradox Cave Exit (Top)', 'Paradox Cave Drop']),
create_cave_region(player, 'Paradox Shop', 'a common shop', ['Paradox Shop - Left', 'Paradox Shop - Middle', 'Paradox Shop - Right']),
create_cave_region(player, 'Waterfall of Wishing', 'a cave with two chests', ['Waterfall Fairy - Left', 'Waterfall Fairy - Right']), create_cave_region(player, 'Waterfall of Wishing', 'a cave with two chests', ['Waterfall Fairy - Left', 'Waterfall Fairy - Right']),
create_cave_region(player, 'Fortune Teller (Light)', 'a fortune teller'), create_cave_region(player, 'Fortune Teller (Light)', 'a fortune teller'),
create_cave_region(player, 'Bonk Rock Cave', 'a cave with a chest', ['Bonk Rock Cave']), create_cave_region(player, 'Bonk Rock Cave', 'a cave with a chest', ['Bonk Rock Cave']),
@@ -267,16 +268,16 @@ def create_regions(world, player):
create_cave_region(player, 'Kings Grave', 'a cave with a chest', ['King\'s Tomb']), create_cave_region(player, 'Kings Grave', 'a cave with a chest', ['King\'s Tomb']),
create_cave_region(player, 'North Fairy Cave', 'a drop\'s exit', None, ['North Fairy Cave Exit']), create_cave_region(player, 'North Fairy Cave', 'a drop\'s exit', None, ['North Fairy Cave Exit']),
create_cave_region(player, 'Potion Shop', 'the potion shop', ['Potion Shop', 'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right']), create_cave_region(player, 'Potion Shop', 'the potion shop', ['Potion Shop', 'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right']),
create_cave_region(player, 'Kakariko Well (top)', 'a drop', ['Kakariko Well - Left', 'Kakariko Well - Middle', 'Kakariko Well - Right', create_cave_region(player, 'Kakariko Well (top)', 'a drop', ['Kakariko Well - Left', 'Kakariko Well - Middle', 'Kakariko Well - Right', 'Kakariko Well - Bottom'],
'Kakariko Well - Bottom'], ['Kakariko Well (top to bottom)', 'Kakariko Well (top to back)']), ['Kakariko Well (top to bottom)', 'Kakariko Well (top to back)']),
create_cave_region(player, 'Kakariko Well (back)', 'a drop', ['Kakariko Well - Top']), create_cave_region(player, 'Kakariko Well (back)', 'a drop', ['Kakariko Well - Top']),
create_cave_region(player, 'Kakariko Well (bottom)', 'a drop\'s exit', None, ['Kakariko Well Exit']), create_cave_region(player, 'Kakariko Well (bottom)', 'a drop\'s exit', None, ['Kakariko Well Exit']),
create_cave_region(player, 'Blinds Hideout', 'a bounty of five items', [ "Blind's Hideout - Left", "Blind's Hideout - Right", create_cave_region(player, 'Blinds Hideout', 'a bounty of five items', [ "Blind's Hideout - Left", "Blind's Hideout - Right",
"Blind's Hideout - Far Left", "Blind's Hideout - Far Right"], ['Blinds Hideout N']), "Blind's Hideout - Far Left", "Blind's Hideout - Far Right"], ['Blinds Hideout N']),
create_cave_region(player, 'Blinds Hideout (Top)', 'a bounty of five items', ["Blind's Hideout - Top"]), create_cave_region(player, 'Blinds Hideout (Top)', 'a bounty of five items', ["Blind's Hideout - Top"]),
create_cave_region(player, 'Elder House', 'a connector', None, ['Elder House Exit (East)', 'Elder House Exit (West)']), create_cave_region(player, 'Elder House', 'a connector', None, ['Elder House Exit (East)', 'Elder House Exit (West)']),
create_cave_region(player, 'Snitch Lady (West)', 'a boring house'),
create_cave_region(player, 'Snitch Lady (East)', 'a boring house'), create_cave_region(player, 'Snitch Lady (East)', 'a boring house'),
create_cave_region(player, 'Snitch Lady (West)', 'a boring house'),
create_cave_region(player, 'Chicken House', 'a house with a chest', ['Chicken House']), create_cave_region(player, 'Chicken House', 'a house with a chest', ['Chicken House']),
create_cave_region(player, 'Sick Kids House', 'the sick kid', ['Sick Kid']), create_cave_region(player, 'Sick Kids House', 'the sick kid', ['Sick Kid']),
create_cave_region(player, 'Bush Covered House', 'the grass man'), create_cave_region(player, 'Bush Covered House', 'the grass man'),
@@ -301,60 +302,60 @@ def create_regions(world, player):
create_cave_region(player, 'Checkerboard Cave', 'a cave with an item', ['Checkerboard Cave']), create_cave_region(player, 'Checkerboard Cave', 'a cave with an item', ['Checkerboard Cave']),
create_cave_region(player, 'Aginahs Cave', 'a cave with a chest', ['Aginah\'s Cave']), create_cave_region(player, 'Aginahs Cave', 'a cave with a chest', ['Aginah\'s Cave']),
create_cave_region(player, 'Cave 45', 'a cave with an item', ['Cave 45']), create_cave_region(player, 'Cave 45', 'a cave with an item', ['Cave 45']),
create_cave_region(player, 'Swamp Healer Fairy', 'a fairy fountain'), create_cave_region(player, 'Light Hype Fairy', 'a fairy fountain'),
create_cave_region(player, 'Lake Hylia Fortune Teller', 'a fortune teller'), create_cave_region(player, 'Lake Hylia Fortune Teller', 'a fortune teller'),
create_cave_region(player, 'Cave Shop (Lake Hylia)', 'a common shop', ['Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right']), create_cave_region(player, 'Lake Hylia Shop', 'a common shop', ['Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right']),
create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']), create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']),
create_cave_region(player, 'Mini Moldorm Cave', 'a bounty of five items', ['Mini Moldorm Cave - Far Left', 'Mini Moldorm Cave - Left',
'Mini Moldorm Cave - Right', 'Mini Moldorm Cave - Far Right', 'Mini Moldorm Cave - Generous Guy']),
create_cave_region(player, 'Ice Rod Cave', 'a cave with a chest', ['Ice Rod Cave']), create_cave_region(player, 'Ice Rod Cave', 'a cave with a chest', ['Ice Rod Cave']),
create_cave_region(player, 'Good Bee Cave', 'a cold bee'), create_cave_region(player, 'Good Bee Cave', 'a cold bee'),
create_cave_region(player, '20 Rupee Cave', 'a cave with some cash'), create_cave_region(player, '20 Rupee Cave', 'a cave with some cash'),
create_cave_region(player, 'Desert Healer Fairy', 'a fairy fountain'), create_cave_region(player, 'Desert Healer Fairy', 'a fairy fountain'),
create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'), create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'),
create_cave_region(player, 'Dam', 'the dam', ['Floodgate', 'Floodgate Chest']), create_cave_region(player, 'Dam', 'the dam', ['Floodgate', 'Floodgate Chest']),
create_cave_region(player, 'Mini Moldorm Cave', 'a bounty of five items', ['Mini Moldorm Cave - Far Left', 'Mini Moldorm Cave - Left', 'Mini Moldorm Cave - Right',
'Mini Moldorm Cave - Far Right', 'Mini Moldorm Cave - Generous Guy']),
create_cave_region(player, 'Dark World Lumberjack Shop', 'a common shop', ['Dark Lumberjack Shop - Left', 'Dark Lumberjack Shop - Middle', 'Dark Lumberjack Shop - Right']), create_cave_region(player, 'Dark Lumberjack Shop', 'a common shop', ['Dark Lumberjack Shop - Left', 'Dark Lumberjack Shop - Middle', 'Dark Lumberjack Shop - Right']),
create_cave_region(player, 'Spike Cave', 'Spike Cave', ['Spike Cave']),
create_cave_region(player, 'Dark Death Mountain Healer Fairy', 'a fairy fountain'), create_cave_region(player, 'Dark Death Mountain Healer Fairy', 'a fairy fountain'),
create_cave_region(player, 'Hookshot Cave (Front)', 'a connector', None, create_cave_region(player, 'Spike Cave', 'Spike Cave', ['Spike Cave']),
['Hookshot Cave Front to Middle', 'Hookshot Cave Front Exit', 'Hookshot Cave Bonk Path', 'Hookshot Cave Hook Path']), create_cave_region(player, 'Hookshot Cave (Front)', 'a connector', None, ['Hookshot Cave Front Exit', 'Hookshot Cave Front to Middle',
'Hookshot Cave Bonk Path', 'Hookshot Cave Hook Path']),
create_cave_region(player, 'Hookshot Cave (Bonk Islands)', 'a connector', ['Hookshot Cave - Bottom Right']), create_cave_region(player, 'Hookshot Cave (Bonk Islands)', 'a connector', ['Hookshot Cave - Bottom Right']),
create_cave_region(player, 'Hookshot Cave (Hook Islands)', 'a connector', ['Hookshot Cave - Top Right', 'Hookshot Cave - Top Left', 'Hookshot Cave - Bottom Left']), create_cave_region(player, 'Hookshot Cave (Hook Islands)', 'a connector', ['Hookshot Cave - Top Right', 'Hookshot Cave - Top Left', 'Hookshot Cave - Bottom Left']),
create_cave_region(player, 'Hookshot Cave (Back)', 'a connector', None, ['Hookshot Cave Back to Middle', 'Hookshot Cave Back Exit']),
create_cave_region(player, 'Hookshot Cave (Middle)', 'a connector', None, ['Hookshot Cave Middle to Back', 'Hookshot Cave Middle to Front']), create_cave_region(player, 'Hookshot Cave (Middle)', 'a connector', None, ['Hookshot Cave Middle to Back', 'Hookshot Cave Middle to Front']),
create_cave_region(player, 'Hookshot Cave (Back)', 'a connector', None, ['Hookshot Cave Back to Middle', 'Hookshot Cave Back Exit']),
create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']), create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']),
create_cave_region(player, 'Superbunny Cave (Bottom)', 'a connector', None, ['Superbunny Cave Climb', 'Superbunny Cave Exit (Bottom)']), create_cave_region(player, 'Superbunny Cave (Bottom)', 'a connector', None, ['Superbunny Cave Climb', 'Superbunny Cave Exit (Bottom)']),
create_cave_region(player, 'Cave Shop (Dark Death Mountain)', 'a common shop', ['Dark Death Mountain Shop - Left', 'Dark Death Mountain Shop - Middle', 'Dark Death Mountain Shop - Right']), create_cave_region(player, 'Dark Death Mountain Shop', 'a common shop', ['Dark Death Mountain Shop - Left', 'Dark Death Mountain Shop - Middle', 'Dark Death Mountain Shop - Right']),
create_cave_region(player, 'Bumper Cave (bottom)', 'a connector', None, ['Bumper Cave Exit (Bottom)', 'Bumper Cave Bottom to Top']), create_cave_region(player, 'Bumper Cave (bottom)', 'a connector', None, ['Bumper Cave Exit (Bottom)', 'Bumper Cave Bottom to Top']),
create_cave_region(player, 'Bumper Cave (top)', 'a connector', None, ['Bumper Cave Exit (Top)', 'Bumper Cave Top To Bottom']), create_cave_region(player, 'Bumper Cave (top)', 'a connector', None, ['Bumper Cave Exit (Top)', 'Bumper Cave Top To Bottom']),
create_cave_region(player, 'Fortune Teller (Dark)', 'a fortune teller'), create_cave_region(player, 'Fortune Teller (Dark)', 'a fortune teller'),
create_cave_region(player, 'Dark Sanctuary Hint', 'a storyteller', None, ['Dark Sanctuary Hint Exit']), create_cave_region(player, 'Dark Sanctuary Hint', 'a storyteller', None, ['Dark Sanctuary Hint Exit']),
create_cave_region(player, 'Dark World Potion Shop', 'a common shop', ['Dark Potion Shop - Left', 'Dark Potion Shop - Middle', 'Dark Potion Shop - Right']), create_cave_region(player, 'Dark Potion Shop', 'a common shop', ['Dark Potion Shop - Left', 'Dark Potion Shop - Middle', 'Dark Potion Shop - Right']),
create_cave_region(player, 'Village of Outcasts Shop', 'a common shop', ['Village of Outcasts Shop - Left', 'Village of Outcasts Shop - Middle', 'Village of Outcasts Shop - Right']),
create_cave_region(player, 'Chest Game', 'a game of 16 chests', ['Chest Game']), create_cave_region(player, 'Chest Game', 'a game of 16 chests', ['Chest Game']),
create_cave_region(player, 'C-Shaped House', 'a house with a chest', ['C-Shaped House']), create_cave_region(player, 'C-Shaped House', 'a house with a chest', ['C-Shaped House']),
create_cave_region(player, 'Brewery', 'a house with a chest', ['Brewery']), create_cave_region(player, 'Brewery', 'a house with a chest', ['Brewery']),
create_cave_region(player, 'Village of Outcasts Shop', 'a common shop', ['Village of Outcasts Shop - Left', 'Village of Outcasts Shop - Middle', 'Village of Outcasts Shop - Right']),
create_cave_region(player, 'Red Shield Shop', 'the rare shop', ['Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right']), create_cave_region(player, 'Red Shield Shop', 'the rare shop', ['Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right']),
create_cave_region(player, 'Pyramid Fairy', 'a cave with two chests', ['Pyramid Fairy - Left', 'Pyramid Fairy - Right']), create_cave_region(player, 'Pyramid Fairy', 'a cave with two chests', ['Pyramid Fairy - Left', 'Pyramid Fairy - Right']),
create_cave_region(player, 'Pyramid', 'a drop\'s exit', ['Ganon'], ['Ganon Drop']), create_cave_region(player, 'Pyramid', 'a drop\'s exit', ['Ganon'], ['Ganon Drop']),
create_cave_region(player, 'Bottom of Pyramid', 'a drop\'s exit', None, ['Pyramid Exit']), create_cave_region(player, 'Bottom of Pyramid', 'a drop\'s exit', None, ['Pyramid Exit']),
create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'), create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'),
create_cave_region(player, 'Dark World Hammer Peg Cave', 'a cave with an item', ['Peg Cave']), create_cave_region(player, 'Hammer Peg Cave', 'a cave with an item', ['Peg Cave']),
create_cave_region(player, 'Archery Game', 'a game of skill'), create_cave_region(player, 'Archery Game', 'a game of skill'),
create_cave_region(player, 'Bonk Fairy (Dark)', 'a fairy fountain'), create_cave_region(player, 'Bonk Fairy (Dark)', 'a fairy fountain'),
create_cave_region(player, 'Big Bomb Shop', 'the bomb shop', ['Big Bomb'], ['Big Bomb Shop Exit']), create_cave_region(player, 'Big Bomb Shop', 'the bomb shop', ['Big Bomb'], ['Big Bomb Shop Exit']),
create_cave_region(player, 'Dark Lake Hylia Healer Fairy', 'a fairy fountain'), create_cave_region(player, 'Dark Lake Hylia Healer Fairy', 'a fairy fountain'),
create_cave_region(player, 'East Dark World Hint', 'a storyteller'), create_cave_region(player, 'East Dark World Hint', 'a storyteller'),
create_cave_region(player, 'Mire Shed', 'a cave with two chests', ['Mire Shed - Left', 'Mire Shed - Right']),
create_cave_region(player, 'Mire Healer Fairy', 'a fairy fountain'),
create_cave_region(player, 'Mire Hint', 'a storyteller'),
create_cave_region(player, 'Hype Cave', 'a bounty of five items', ['Hype Cave - Top', 'Hype Cave - Middle Right', 'Hype Cave - Middle Left', create_cave_region(player, 'Hype Cave', 'a bounty of five items', ['Hype Cave - Top', 'Hype Cave - Middle Right', 'Hype Cave - Middle Left',
'Hype Cave - Bottom', 'Hype Cave - Generous Guy']), 'Hype Cave - Bottom', 'Hype Cave - Generous Guy']),
create_cave_region(player, 'Dark Lake Hylia Shop', 'a common shop', ['Dark Lake Hylia Shop - Left', 'Dark Lake Hylia Shop - Middle', 'Dark Lake Hylia Shop - Right']), create_cave_region(player, 'Dark Lake Hylia Shop', 'a common shop', ['Dark Lake Hylia Shop - Left', 'Dark Lake Hylia Shop - Middle', 'Dark Lake Hylia Shop - Right']),
create_cave_region(player, 'Dark Lake Hylia Ledge Healer Fairy', 'a fairy fountain'), create_cave_region(player, 'Dark Lake Hylia Ledge Healer Fairy', 'a fairy fountain'),
create_cave_region(player, 'Dark Lake Hylia Ledge Hint', 'a storyteller'), create_cave_region(player, 'Dark Lake Hylia Ledge Hint', 'a storyteller'),
create_cave_region(player, 'Dark Lake Hylia Ledge Spike Cave', 'a spiky hint'), create_cave_region(player, 'Dark Lake Hylia Ledge Spike Cave', 'a spiky hint')
create_cave_region(player, 'Mire Shed', 'a cave with two chests', ['Mire Shed - Left', 'Mire Shed - Right']),
create_cave_region(player, 'Dark Desert Healer Fairy', 'a fairy fountain'),
create_cave_region(player, 'Dark Desert Hint', 'a storyteller')
] ]
@@ -908,7 +909,8 @@ def create_dungeon_regions(world, player):
['GT Compass Room EN', 'GT Compass Room Warp']), ['GT Compass Room EN', 'GT Compass Room Warp']),
create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']), create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']),
create_dungeon_region(player, 'GT Invisible Catwalk', 'Ganon\'s Tower', None, ['GT Invisible Catwalk ES', 'GT Invisible Catwalk WS', 'GT Invisible Catwalk NW', 'GT Invisible Catwalk NE']), create_dungeon_region(player, 'GT Invisible Catwalk', 'Ganon\'s Tower', None, ['GT Invisible Catwalk ES', 'GT Invisible Catwalk WS', 'GT Invisible Catwalk NW', 'GT Invisible Catwalk NE']),
create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross WN']), create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross Hammer Path']),
create_dungeon_region(player, 'GT Conveyor Cross Across Pits', 'Ganon\'s Tower', None, ['GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross WN']),
create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-Mid Path']), create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-Mid Path']),
create_dungeon_region(player, 'GT Hookshot Mid Platform', 'Ganon\'s Tower', None, ['GT Hookshot Mid-East Path', 'GT Hookshot Mid-South Path', 'GT Hookshot Mid-North Path']), create_dungeon_region(player, 'GT Hookshot Mid Platform', 'Ganon\'s Tower', None, ['GT Hookshot Mid-East Path', 'GT Hookshot Mid-South Path', 'GT Hookshot Mid-North Path']),
create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-Mid Path']), create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-Mid Path']),
@@ -1137,7 +1139,7 @@ def create_shops(world, player):
for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram) in shop_table.items(): for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram) in shop_table.items():
if world.mode[player] == 'inverted': if world.mode[player] == 'inverted':
if (0x35 not in world.owswaps[player][0] and region_name == 'Dark Lake Hylia Shop') \ if (0x35 not in world.owswaps[player][0] and region_name == 'Dark Lake Hylia Shop') \
or (0x35 in world.owswaps[player][0] and region_name == 'Cave Shop (Lake Hylia)'): or (0x35 in world.owswaps[player][0] and region_name == 'Lake Hylia Shop'):
locked = True locked = True
inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)] inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)]
custom = True custom = True
@@ -1319,16 +1321,16 @@ bonk_table_by_location = {y: x for x, y in bonk_table_by_location_id.items()}
_basic_shop_defaults = [('Red Potion', 150), ('Small Heart', 10), ('Bombs (10)', 50)] _basic_shop_defaults = [('Red Potion', 150), ('Small Heart', 10), ('Bombs (10)', 50)]
_dark_world_shop_defaults = [('Red Potion', 150), ('Blue Shield', 50), ('Bombs (10)', 50)] _dark_world_shop_defaults = [('Red Potion', 150), ('Blue Shield', 50), ('Bombs (10)', 50)]
shop_table = { shop_table = {
'Cave Shop (Dark Death Mountain)': (0x0112, ShopType.Shop, 0xC1, False, False, _basic_shop_defaults, 0), 'Dark Death Mountain Shop': (0x0112, ShopType.Shop, 0xC1, False, False, _basic_shop_defaults, 0),
'Red Shield Shop': (0x0110, ShopType.Shop, 0xC1, False, False, 'Red Shield Shop': (0x0110, ShopType.Shop, 0xC1, False, False,
[('Red Shield', 500), ('Bee', 10), ('Arrows (10)', 30)], 3), [('Red Shield', 500), ('Bee', 10), ('Arrows (10)', 30)], 3),
'Dark Lake Hylia Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 6), 'Dark Lake Hylia Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 6),
'Dark World Lumberjack Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 9), 'Dark Lumberjack Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 9),
'Village of Outcasts Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 12), 'Village of Outcasts Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 12),
'Dark World Potion Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 15), 'Dark Potion Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 15),
'Light World Death Mountain Shop': (0x00FF, ShopType.Shop, 0xA0, False, False, _basic_shop_defaults, 18), 'Paradox Shop': (0x00FF, ShopType.Shop, 0xA0, False, False, _basic_shop_defaults, 18),
'Kakariko Shop': (0x011F, ShopType.Shop, 0xA0, False, False, _basic_shop_defaults, 21), 'Kakariko Shop': (0x011F, ShopType.Shop, 0xA0, False, False, _basic_shop_defaults, 21),
'Cave Shop (Lake Hylia)': (0x0112, ShopType.Shop, 0xA0, False, False, _basic_shop_defaults, 24), 'Lake Hylia Shop': (0x0112, ShopType.Shop, 0xA0, False, False, _basic_shop_defaults, 24),
'Potion Shop': (0x0109, ShopType.Shop, 0xFF, False, True, 'Potion Shop': (0x0109, ShopType.Shop, 0xFF, False, True,
[('Red Potion', 120), ('Green Potion', 60), ('Blue Potion', 160)], 27), [('Red Potion', 120), ('Green Potion', 60), ('Blue Potion', 160)], 27),
'Capacity Upgrade': (0x0115, ShopType.UpgradeShop, 0x04, True, True, 'Capacity Upgrade': (0x0115, ShopType.UpgradeShop, 0x04, True, True,
@@ -1337,15 +1339,15 @@ shop_table = {
shop_to_location_table = { shop_to_location_table = {
'Cave Shop (Dark Death Mountain)': ['Dark Death Mountain Shop - Left', 'Dark Death Mountain Shop - Middle', 'Dark Death Mountain Shop - Right'], 'Dark Death Mountain Shop': ['Dark Death Mountain Shop - Left', 'Dark Death Mountain Shop - Middle', 'Dark Death Mountain Shop - Right'],
'Red Shield Shop': ['Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right'], 'Red Shield Shop': ['Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right'],
'Dark Lake Hylia Shop': ['Dark Lake Hylia Shop - Left', 'Dark Lake Hylia Shop - Middle', 'Dark Lake Hylia Shop - Right'], 'Dark Lake Hylia Shop': ['Dark Lake Hylia Shop - Left', 'Dark Lake Hylia Shop - Middle', 'Dark Lake Hylia Shop - Right'],
'Dark World Lumberjack Shop': ['Dark Lumberjack Shop - Left', 'Dark Lumberjack Shop - Middle', 'Dark Lumberjack Shop - Right'], 'Dark Lumberjack Shop': ['Dark Lumberjack Shop - Left', 'Dark Lumberjack Shop - Middle', 'Dark Lumberjack Shop - Right'],
'Village of Outcasts Shop': ['Village of Outcasts Shop - Left', 'Village of Outcasts Shop - Middle', 'Village of Outcasts Shop - Right'], 'Village of Outcasts Shop': ['Village of Outcasts Shop - Left', 'Village of Outcasts Shop - Middle', 'Village of Outcasts Shop - Right'],
'Dark World Potion Shop': ['Dark Potion Shop - Left', 'Dark Potion Shop - Middle', 'Dark Potion Shop - Right'], 'Dark Potion Shop': ['Dark Potion Shop - Left', 'Dark Potion Shop - Middle', 'Dark Potion Shop - Right'],
'Light World Death Mountain Shop': ['Paradox Shop - Left', 'Paradox Shop - Middle', 'Paradox Shop - Right'], 'Paradox Shop': ['Paradox Shop - Left', 'Paradox Shop - Middle', 'Paradox Shop - Right'],
'Kakariko Shop': ['Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right'], 'Kakariko Shop': ['Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right'],
'Cave Shop (Lake Hylia)': ['Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right'], 'Lake Hylia Shop': ['Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right'],
'Potion Shop': ['Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right'], 'Potion Shop': ['Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right'],
'Capacity Upgrade': ['Capacity Upgrade - Left', 'Capacity Upgrade - Right'], 'Capacity Upgrade': ['Capacity Upgrade - Left', 'Capacity Upgrade - Right'],
} }
+8 -8
View File
@@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127
JAP10HASH = '03a63945398191337e896e5771f77173' JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = '92c16c60f26218c9aec838ce204c0b1e' RANDOMIZERBASEHASH = '544b8d7dd202c6e8a9e70b31af5bae3d'
class JsonRom(object): class JsonRom(object):
@@ -2881,7 +2881,7 @@ InconvenientDungeonEntrances = {'Turtle Rock': 'Turtle Rock Main',
InconvenientOtherEntrances = {'Death Mountain Return Cave (West)': 'The SW DM foothills cave', InconvenientOtherEntrances = {'Death Mountain Return Cave (West)': 'The SW DM foothills cave',
'Mimic Cave': 'Mimic Ledge', 'Mimic Cave': 'Mimic Ledge',
'Dark World Hammer Peg Cave': 'The rows of pegs', 'Hammer Peg Cave': 'The rows of pegs',
'Pyramid Fairy': 'The crack on the pyramid' 'Pyramid Fairy': 'The crack on the pyramid'
} }
@@ -2950,15 +2950,15 @@ ItemEntrances = {'Blinds Hideout': 'Blind\'s old house',
'Chest Game': 'The westmost building in the Village of Outcasts' 'Chest Game': 'The westmost building in the Village of Outcasts'
} }
ShopEntrances = {'Cave Shop (Lake Hylia)': 'The cave NW Lake Hylia', ShopEntrances = {'Lake Hylia Shop': 'The cave NW Lake Hylia',
'Kakariko Shop': 'The old Kakariko shop', 'Kakariko Shop': 'The old Kakariko shop',
'Capacity Upgrade': 'The cave on the island', 'Capacity Upgrade': 'The cave on the island',
'Dark Lake Hylia Shop': 'The building NW dark Lake Hylia', 'Dark Lake Hylia Shop': 'The building NW dark Lake Hylia',
'Dark World Shop': 'The hammer sealed building', 'Dark World Shop': 'The hammer sealed building',
'Red Shield Shop': 'The fenced in building', 'Red Shield Shop': 'The fenced in building',
'Cave Shop (Dark Death Mountain)': 'The base of east dark DM', 'Dark Death Mountain Shop': 'The base of east dark DM',
'Dark World Potion Shop': 'The building near the catfish', 'Dark Potion Shop': 'The building near the catfish',
'Dark World Lumberjack Shop': 'The northmost Dark World building' 'Dark Lumberjack Shop': 'The northmost Dark World building'
} }
OtherEntrances = {'Lake Hylia Fairy': 'A cave NE of Lake Hylia', OtherEntrances = {'Lake Hylia Fairy': 'A cave NE of Lake Hylia',
@@ -2984,12 +2984,12 @@ OtherEntrances = {'Lake Hylia Fairy': 'A cave NE of Lake Hylia',
'Dark Lake Hylia Fairy': 'The cave NE dark Lake Hylia', 'Dark Lake Hylia Fairy': 'The cave NE dark Lake Hylia',
'Dark Death Mountain Fairy': 'The SW cave on dark DM', 'Dark Death Mountain Fairy': 'The SW cave on dark DM',
'East Dark World Hint': 'The dark cave near the eastmost portal', 'East Dark World Hint': 'The dark cave near the eastmost portal',
'Dark Desert Hint': 'The cave east of the mire', 'Mire Hint': 'The cave east of the mire',
'Palace of Darkness Hint': 'The building south of Kiki', 'Palace of Darkness Hint': 'The building south of Kiki',
'Dark Lake Hylia Ledge Spike Cave': 'The rock SE dark Lake Hylia', 'Dark Lake Hylia Ledge Spike Cave': 'The rock SE dark Lake Hylia',
'Archery Game': 'The old archery game', 'Archery Game': 'The old archery game',
'Dark Lake Hylia Ledge Hint': 'The open cave SE dark Lake Hylia', 'Dark Lake Hylia Ledge Hint': 'The open cave SE dark Lake Hylia',
'Dark Desert Fairy': 'The eastern hut in the mire', 'Mire Fairy': 'The eastern hut in the mire',
'Dark Lake Hylia Ledge Fairy': 'The sealed cave SE dark Lake Hylia', 'Dark Lake Hylia Ledge Fairy': 'The sealed cave SE dark Lake Hylia',
'Fortune Teller (Dark)': 'The building NE the Village of Outcasts' 'Fortune Teller (Dark)': 'The building NE the Village of Outcasts'
} }
+230 -222
View File
@@ -21,20 +21,19 @@ def set_rules(world, player):
return return
global_rules(world, player) global_rules(world, player)
default_rules(world, player)
ow_inverted_rules(world, player) ow_inverted_rules(world, player)
ow_bunny_rules(world, player) if world.swords[player] == 'swordless':
swordless_rules(world, player)
ow_bunny_rules(world, player)
ow_terrain_rules(world, player) ow_terrain_rules(world, player)
if world.mode[player] == 'standard': if world.mode[player] == 'standard':
if not world.is_copied_world: if not world.is_copied_world:
standard_rules(world, player) standard_rules(world, player)
elif world.mode[player] == 'open' or world.mode[player] == 'inverted':
open_rules(world, player)
else: else:
raise NotImplementedError('Not implemented yet') misc_key_rules(world, player)
bomb_rules(world, player) bomb_rules(world, player)
pot_rules(world, player) pot_rules(world, player)
@@ -195,8 +194,11 @@ def global_rules(world, player):
#for exit in world.get_region('Flute Sky', player).exits: #for exit in world.get_region('Flute Sky', player).exits:
# exit.hide_path = True # exit.hide_path = True
# s&q regions. link's house entrance is set to true so the filler knows the chest inside can always be reached
set_rule(world.get_entrance('Old Man S&Q', player), lambda state: state.has('Return Old Man', player)) set_rule(world.get_entrance('Old Man S&Q', player), lambda state: state.has('Return Old Man', player))
set_rule(world.get_entrance('Other World S&Q', player), lambda state: state.has_Mirror(player) and state.has_beaten_aga(player))
# flute rules
set_rule(world.get_entrance('Flute Spot 1', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 1', player), lambda state: state.can_flute(player))
set_rule(world.get_entrance('Flute Spot 2', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 2', player), lambda state: state.can_flute(player))
set_rule(world.get_entrance('Flute Spot 3', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 3', player), lambda state: state.can_flute(player))
@@ -206,25 +208,44 @@ def global_rules(world, player):
set_rule(world.get_entrance('Flute Spot 7', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 7', player), lambda state: state.can_flute(player))
set_rule(world.get_entrance('Flute Spot 8', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 8', player), lambda state: state.can_flute(player))
set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player)) # overworld location rules
set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player)) set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
set_rule(world.get_location('Old Man', player), lambda state: state.has('Return Old Man', player)) set_rule(world.get_location('Old Man', player), lambda state: state.has('Return Old Man', player))
set_rule(world.get_location('Old Man Drop Off', player), lambda state: state.has('Escort Old Man', player)) set_rule(world.get_location('Old Man Drop Off', player), lambda state: state.has('Escort Old Man', player))
set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player))
set_rule(world.get_location('Middle Aged Man', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest set_rule(world.get_location('Middle Aged Man', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest
set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Deliver Purple Chest', player)) # Can S&Q with chest set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Deliver Purple Chest', player)) # Can S&Q with chest
set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player))
set_rule(world.get_location('Turtle Medallion Pad', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player)) # sword required to cast magic (!)
set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player))
set_rule(world.get_location('Big Bomb', player), lambda state: state.has('Crystal 5', player) and state.has('Crystal 6', player)) set_rule(world.get_location('Big Bomb', player), lambda state: state.has('Crystal 5', player) and state.has('Crystal 6', player))
set_rule(world.get_location('Pyramid Crack', player), lambda state: state.has('Pick Up Big Bomb', player))
set_rule(world.get_entrance('Pyramid Crack', player), lambda state: state.has('Detonate Big Bomb', player))
set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player)) set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player))
set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player))
# bonk items
if world.shuffle_bonk_drops[player]:
if not world.is_copied_world:
from Regions import bonk_prize_table
for location_name, (_, _, aga_required, _, _, _) in bonk_prize_table.items():
loc = world.get_location(location_name, player)
if location_name == 'Cold Fairy Statue':
set_rule(loc, lambda state: state.can_use_bombs(player) and state.can_collect_bonkdrops(player))
elif not aga_required:
set_rule(loc, lambda state: state.can_collect_bonkdrops(player))
else:
set_rule(loc, lambda state: state.can_collect_bonkdrops(player) and state.has_beaten_aga(player))
add_bunny_rule(loc, player)
# underworld location rules
set_rule(world.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player))
set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player) and state.can_reach('Potion Shop Area', 'Region', player))
set_rule(world.get_location('Sick Kid', player), lambda state: state.has_bottle(player))
set_rule(world.get_location('Sahasrahla', player), lambda state: state.has('Green Pendant', player))
set_rule(world.get_location('Missing Smith', player), lambda state: state.has('Get Frog', player)) set_rule(world.get_location('Missing Smith', player), lambda state: state.has('Get Frog', player))
set_rule(world.get_location('Blacksmith', player), lambda state: state.has('Return Smith', player)) set_rule(world.get_location('Blacksmith', player), lambda state: state.has('Return Smith', player))
set_rule(world.get_location('Magic Bat', player), lambda state: state.has('Magic Powder', player)) set_rule(world.get_location('Magic Bat', player), lambda state: state.has('Magic Powder', player))
set_rule(world.get_location('Sick Kid', player), lambda state: state.has_bottle(player))
set_rule(world.get_location('Library', player), lambda state: state.has_Boots(player)) set_rule(world.get_location('Library', player), lambda state: state.has_Boots(player))
set_rule(world.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player))
set_rule(world.get_location('Sahasrahla', player), lambda state: state.has('Green Pendant', player))
set_rule(world.get_location('Spike Cave', player), lambda state: set_rule(world.get_location('Spike Cave', player), lambda state:
state.has('Hammer', player) and state.can_lift_rocks(player) and state.has('Hammer', player) and state.can_lift_rocks(player) and
((state.has('Cape', player) and state.can_extend_magic(player, 16, True)) or ((state.has('Cape', player) and state.can_extend_magic(player, 16, True)) or
@@ -233,13 +254,102 @@ def global_rules(world, player):
(state.world.can_take_damage and (state.has_Boots(player) or state.has_hearts(player, 4)))))) (state.world.can_take_damage and (state.has_Boots(player) or state.has_hearts(player, 4))))))
) )
set_rule(world.get_location('Hookshot Cave - Top Right', player), lambda state: state.has('Hookshot', player)) # underworld rules
set_rule(world.get_location('Hookshot Cave - Top Left', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: state.has_Mirror(player)) # can erase block - overridden in noglitches
set_rule(world.get_location('Hookshot Cave - Bottom Right', player), lambda state: state.has('Hookshot', player) or state.has('Pegasus Boots', player))
set_rule(world.get_location('Hookshot Cave - Bottom Left', player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Hookshot Cave Bonk Path', player), lambda state: state.has('Hookshot', player) or state.has('Pegasus Boots', player)) set_rule(world.get_entrance('Hookshot Cave Bonk Path', player), lambda state: state.has('Hookshot', player) or state.has('Pegasus Boots', player))
set_rule(world.get_entrance('Hookshot Cave Hook Path', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Hookshot Cave Hook Path', player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Bumper Cave Bottom to Top', player), lambda state: state.has('Cape', player))
set_rule(world.get_entrance('Bumper Cave Top To Bottom', player), lambda state: state.has('Cape', player) or state.has('Hookshot', player))
# terrain rules
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))
set_rule(world.get_entrance('DM Broken Bridge (East)', player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Fairy Ascension Rocks (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Fairy Ascension Rocks (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('TR Pegs Ledge Entry', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Mountain Entry Entrance Rock (West)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Mountain Entry Entrance Rock (East)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Lost Woods Pass Hammer (North)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Lost Woods Pass Hammer (South)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Lost Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Lost Woods Pass Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Kings Grave Outer Rocks', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Kings Grave Inner Rocks', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Potion Shop Rock (South)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Potion Shop Rock (North)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Zora Approach Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Zora Approach Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Hyrule Castle Inner East Rock', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Hyrule Castle Outer East Rock', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Bat Cave Ledge Peg', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Bat Cave Ledge Peg (East)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('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('C Whirlpool Rock (Bottom)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('C Whirlpool Rock (Top)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('C Whirlpool Pegs (Left)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('C Whirlpool Pegs (Right)', player), lambda state: state.has('Hammer', 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('Skull Woods Bush Rock (West)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Skull Woods Bush Rock (East)', player), lambda state: state.can_lift_rocks(player))
# this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off?
set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: (state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player)))
set_rule(world.get_entrance('Bumper Cave Entrance Rock', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Skull Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Skull Woods Pass Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Dark Witch Rock (North)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Dark Witch Rock (South)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Catfish Approach Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Catfish Approach Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Village of Outcasts Pegs', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Grassy Lawn Pegs', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Broken Bridge Hammer Rock (South)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player))
set_rule(world.get_entrance('Broken Bridge Hammer Rock (North)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player))
set_rule(world.get_entrance('Broken Bridge Hookshot Gap', player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Peg Area Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Peg Area Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Dig Game To Ledge Drop', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Frog Rock (Inner)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Frog Rock (Outer)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Archery Game Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Archery Game Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Hammer Bridge Pegs (North)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Hammer Bridge Pegs (South)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Dark C Whirlpool Rock (Bottom)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Dark C Whirlpool Rock (Top)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Dark C Whirlpool Pegs (Left)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Dark C Whirlpool Pegs (Right)', player), lambda state: state.has('Hammer', player))
# entrance rules
# Caution: If king's grave is relaxed at all to account for reaching it via a two way cave's exit in insanity mode, then the bomb shop logic will need to be updated (that would involve create a small ledge-like Region for it)
# TODO: Not sure if this ^ is true anymore since Kings Grave is its own region now
set_rule(world.get_entrance('Lumberjack Tree Tree', player), lambda state: state.has_Boots(player) and state.has_beaten_aga(player))
set_rule(world.get_entrance('Bonk Rock Cave', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('Sanctuary Grave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Kings Grave', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('Bonk Fairy (Light)', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('Checkerboard Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('20 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('50 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Hookshot Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_location('Pyramid Crack', player), lambda state: state.has('Pick Up Big Bomb', player))
set_rule(world.get_entrance('Pyramid Crack', player), lambda state: state.has('Detonate Big Bomb', player))
set_rule(world.get_entrance('Hammer Peg Cave', 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('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Skull Woods Final Section', player), lambda state: state.has('Fire Rod', player))
set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_sword(player) and state.has_misery_mire_medallion(player)) # sword required to cast magic (!)
set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Turtle Opened', player))
if not world.is_atgt_swapped(player):
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player))
set_rule(world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
# Start of door rando rules # Start of door rando rules
# TODO: Do these need to flag off when door rando is off? - some of them, yes # TODO: Do these need to flag off when door rando is off? - some of them, yes
@@ -435,8 +545,8 @@ def global_rules(world, player):
set_rule(world.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has_Boots(player)) set_rule(world.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('GT Hope Room EN', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_entrance('GT Hope Room EN', player), lambda state: state.has('Cane of Somaria', player))
set_rule(world.get_entrance('GT Conveyor Cross WN', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('GT Conveyor Cross Hammer Path', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('GT Conveyor Cross EN', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('GT Conveyor Cross Hookshot Path', player), lambda state: state.has('Hookshot', player))
if not world.get_door('GT Speed Torch SE', player).entranceFlag: if not world.get_door('GT Speed Torch SE', player).entranceFlag:
set_rule(world.get_entrance('GT Speed Torch SE', player), lambda state: state.has('Fire Rod', player)) set_rule(world.get_entrance('GT Speed Torch SE', player), lambda state: state.has('Fire Rod', player))
set_rule(world.get_entrance('GT Hookshot South-Mid Path', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('GT Hookshot South-Mid Path', player), lambda state: state.has('Hookshot', player))
@@ -682,7 +792,7 @@ def global_rules(world, player):
def bomb_rules(world, player): def bomb_rules(world, player):
# todo: kak well, pod hint (bonkable pots), hookshot pot, spike cave pots # todo: kak well, pod hint (bonkable pots), hookshot pot, spike cave pots
bonkable_doors = ['Two Brothers House Exit (West)', 'Two Brothers House Exit (East)'] # Technically this is incorrectly defined, but functionally the same as what is intended. bonkable_doors = ['Two Brothers House Exit (West)', 'Two Brothers House Exit (East)'] # Technically this is incorrectly defined, but functionally the same as what is intended.
bombable_doors = ['Ice Rod Cave', 'Light World Bomb Hut', 'Light World Death Mountain Shop', 'Mini Moldorm Cave', bombable_doors = ['Ice Rod Cave', 'Light World Bomb Hut', 'Paradox Shop', 'Mini Moldorm Cave',
'Hookshot Cave Back to Middle', 'Hookshot Cave Front to Middle', 'Hookshot Cave Middle to Front', 'Hookshot Cave Back to Middle', 'Hookshot Cave Front to Middle', 'Hookshot Cave Middle to Front',
'Hookshot Cave Middle to Back', 'Dark Lake Hylia Ledge Fairy', 'Hype Cave', 'Brewery', 'Hookshot Cave Middle to Back', 'Dark Lake Hylia Ledge Fairy', 'Hype Cave', 'Brewery',
'Paradox Cave Chest Area NE', 'Blinds Hideout N', 'Kakariko Well (top to back)', 'Paradox Cave Chest Area NE', 'Blinds Hideout N', 'Kakariko Well (top to back)',
@@ -815,7 +925,7 @@ def pot_rules(world, player):
(state.has('Cane of Byrna', player) and (state.has('Cane of Byrna', player) and
(state.can_extend_magic(player, 12, True) or (state.can_extend_magic(player, 12, True) or
(state.world.can_take_damage and (state.has_Boots(player) or state.has_hearts(player, 4))))))) (state.world.can_take_damage and (state.has_Boots(player) or state.has_hearts(player, 4)))))))
for l in world.get_region('Dark Desert Hint', player).locations: for l in world.get_region('Mire Hint', player).locations:
if l.type == LocationType.Pot: if l.type == LocationType.Pot:
add_rule(l, lambda state: state.can_use_bombs(player)) add_rule(l, lambda state: state.can_use_bombs(player))
for l in world.get_region('Palace of Darkness Hint', player).locations: for l in world.get_region('Palace of Darkness Hint', player).locations:
@@ -845,170 +955,11 @@ def pot_rules(world, player):
add_rule(l, lambda state: state.can_hit_crystal(player)) add_rule(l, lambda state: state.can_hit_crystal(player))
def default_rules(world, player):
set_rule(world.get_entrance('Other World S&Q', player), lambda state: state.has_Mirror(player) and state.has_beaten_aga(player))
# Underworld Logic
set_rule(world.get_entrance('Old Man Cave Exit (West)', player), lambda state: False) # drop cannot be climbed up
set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: state.has_Mirror(player)) # can erase block, overwritten in noglitches
set_rule(world.get_entrance('Bumper Cave Bottom to Top', player), lambda state: state.has('Cape', player))
set_rule(world.get_entrance('Bumper Cave Top To Bottom', player), lambda state: state.has('Cape', player) or state.has('Hookshot', player))
set_rule(world.get_entrance('Superbunny Cave Exit (Bottom)', player), lambda state: False) # Cannot get to bottom exit from top. Just exists for shuffling
# Item Access
set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player))
set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player))
set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player))
set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
set_rule(world.get_location('Turtle Medallion Pad', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player)) # sword required to cast magic (!)
# Bonk Item Access
if world.shuffle_bonk_drops[player]:
if not world.is_copied_world:
from Regions import bonk_prize_table
for location_name, (_, _, aga_required, _, _, _) in bonk_prize_table.items():
loc = world.get_location(location_name, player)
if location_name == 'Cold Fairy Statue':
set_rule(loc, lambda state: state.can_use_bombs(player) and state.can_collect_bonkdrops(player))
elif not aga_required:
set_rule(loc, lambda state: state.can_collect_bonkdrops(player))
else:
set_rule(loc, lambda state: state.can_collect_bonkdrops(player) and state.has_beaten_aga(player))
add_bunny_rule(loc, player)
# Entrance Access
set_rule(world.get_entrance('Lumberjack Tree Tree', player), lambda state: state.has_Boots(player) and state.has_beaten_aga(player))
set_rule(world.get_entrance('Bonk Rock Cave', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('Sanctuary Grave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Kings Grave', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('Bonk Fairy (Light)', player), lambda state: state.has_Boots(player))
set_rule(world.get_entrance('Checkerboard Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('50 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('20 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Skull Woods Final Section', player), lambda state: state.has('Fire Rod', player))
set_rule(world.get_entrance('Hookshot Cave', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Turtle Opened', player))
set_rule(world.get_entrance('Dark World Hammer Peg Cave', 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('Misery Mire', player), lambda state: state.has_sword(player) and state.has_misery_mire_medallion(player)) # sword required to cast magic (!)
set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player))
# Region Access
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))
set_rule(world.get_entrance('DM Broken Bridge (East)', player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Fairy Ascension Rocks (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Fairy Ascension Rocks (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('TR Pegs Ledge Entry', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('TR Pegs Ledge Leave', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Mountain Entry Entrance Rock (West)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Mountain Entry Entrance Rock (East)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Lost Woods Pass Hammer (North)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Lost Woods Pass Hammer (South)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Lost Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Lost Woods Pass Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Kings Grave Outer Rocks', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Kings Grave Inner Rocks', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Potion Shop Rock (South)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Potion Shop Rock (North)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Zora Approach Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Zora Approach Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Hyrule Castle Inner East Rock', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Hyrule Castle Outer East Rock', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Bat Cave Ledge Peg', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Bat Cave Ledge Peg (East)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('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('C Whirlpool Rock (Bottom)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('C Whirlpool Rock (Top)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('C Whirlpool Pegs (Left)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('C Whirlpool Pegs (Right)', player), lambda state: state.has('Hammer', 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('Skull Woods Bush Rock (West)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Skull Woods Bush Rock (East)', player), lambda state: state.can_lift_rocks(player))
# this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off?
set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: (state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player)))
set_rule(world.get_entrance('Bumper Cave Entrance Rock', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Skull Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Skull Woods Pass Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Dark Witch Rock (North)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Dark Witch Rock (South)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Catfish Approach Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Catfish Approach Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player) or state.has_Boots(player))
set_rule(world.get_entrance('Village of Outcasts Pegs', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Grassy Lawn Pegs', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Broken Bridge Hammer Rock (South)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player))
set_rule(world.get_entrance('Broken Bridge Hammer Rock (North)', player), lambda state: state.can_lift_rocks(player) or state.has('Hammer', player))
set_rule(world.get_entrance('Broken Bridge Hookshot Gap', player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Peg Area Rocks (West)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Peg Area Rocks (East)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Dig Game To Ledge Drop', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Frog Rock (Inner)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Frog Rock (Outer)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Archery Game Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Archery Game Rock (South)', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Hammer Bridge Pegs (North)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Hammer Bridge Pegs (South)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Dark C Whirlpool Rock (Bottom)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Dark C Whirlpool Rock (Top)', player), lambda state: state.can_lift_rocks(player))
set_rule(world.get_entrance('Dark C Whirlpool Pegs (Left)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Dark C Whirlpool Pegs (Right)', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Zora Waterfall Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Zora Waterfall Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Zora Waterfall Water Approach', 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('River Bend Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('River Bend East Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Potion Shop Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Potion Shop Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Zora Approach Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Wooden Bridge Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Wooden Bridge Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('C Whirlpool Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Statues Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia South Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Central Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Island Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Water D Leave', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Cave SW', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Octoballoon Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Octoballoon Waterfall Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Broken Bridge Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Broken Bridge Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Broken Bridge West Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Hammer Bridge Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Southwest Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Moat Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Shopping Mall SW', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), lambda state: state.has('Flippers', player))
if world.swords[player] == 'swordless':
swordless_rules(world, player)
def ow_inverted_rules(world, player): def ow_inverted_rules(world, player):
if world.is_atgt_swapped(player): if world.is_atgt_swapped(player):
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
else: else:
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player) or state.has_beaten_aga(player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player)) # barrier gets removed after killing agahnim, rule for that added later
set_rule(world.get_entrance('GT Entry Approach', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) set_rule(world.get_entrance('GT Entry Approach', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
set_rule(world.get_entrance('GT Entry Leave', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player) or state.world.shuffle[player] in ('restricted', 'full', 'lite', 'lean', 'crossed', 'insanity')) set_rule(world.get_entrance('GT Entry Leave', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player) or state.world.shuffle[player] in ('restricted', 'full', 'lite', 'lean', 'crossed', 'insanity'))
@@ -1023,6 +974,7 @@ def ow_inverted_rules(world, player):
if not world.is_tile_swapped(0x07, player): if not world.is_tile_swapped(0x07, player):
set_rule(world.get_entrance('TR Pegs Teleporter', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('TR Pegs Teleporter', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('TR Pegs Ledge Leave', player), lambda state: state.can_lift_heavy_rocks(player))
else: else:
set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('TR Pegs Ledge Drop', player), lambda state: False) set_rule(world.get_entrance('TR Pegs Ledge Drop', player), lambda state: False)
@@ -1041,8 +993,8 @@ def ow_inverted_rules(world, player):
set_rule(world.get_entrance('Hyrule Castle Main Gate (South)', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Hyrule Castle Main Gate (South)', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Hyrule Castle Main Gate (North)', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Hyrule Castle Main Gate (North)', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Top of Pyramid', player), lambda state: state.has_beaten_aga(player)) set_rule(world.get_entrance('Castle Gate Teleporter', player), lambda state: state.has_beaten_aga(player))
set_rule(world.get_entrance('Top of Pyramid (Inner)', player), lambda state: state.has_beaten_aga(player)) set_rule(world.get_entrance('Castle Gate Teleporter (Inner)', player), lambda state: state.has_beaten_aga(player))
else: else:
set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: world.is_pyramid_open(player) or state.has('Beat Agahnim 2', player)) set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: world.is_pyramid_open(player) or state.has('Beat Agahnim 2', player))
set_rule(world.get_entrance('Pyramid Hole', player), lambda state: False) set_rule(world.get_entrance('Pyramid Hole', player), lambda state: False)
@@ -1084,6 +1036,7 @@ def ow_inverted_rules(world, player):
def ow_bunny_rules(world, player): def ow_bunny_rules(world, player):
# locations
add_bunny_rule(world.get_location('Mushroom', player), player) add_bunny_rule(world.get_location('Mushroom', player), player)
add_bunny_rule(world.get_location('Zora\'s Ledge', player), player) add_bunny_rule(world.get_location('Zora\'s Ledge', player), player)
add_bunny_rule(world.get_location('Maze Race', player), player) add_bunny_rule(world.get_location('Maze Race', player), player)
@@ -1091,6 +1044,7 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_location('Turtle Medallion Pad', player), player) add_bunny_rule(world.get_location('Turtle Medallion Pad', player), player)
add_bunny_rule(world.get_location('Catfish', player), player) add_bunny_rule(world.get_location('Catfish', player), player)
# entrances
add_bunny_rule(world.get_entrance('Lost Woods Hideout Drop', player), player) add_bunny_rule(world.get_entrance('Lost Woods Hideout Drop', player), player)
add_bunny_rule(world.get_entrance('Lumberjack Tree Tree', player), player) add_bunny_rule(world.get_entrance('Lumberjack Tree Tree', player), player)
add_bunny_rule(world.get_entrance('Waterfall of Wishing', player), player) add_bunny_rule(world.get_entrance('Waterfall of Wishing', player), player)
@@ -1101,30 +1055,29 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_entrance('Hyrule Castle Secret Entrance Drop', player), player) add_bunny_rule(world.get_entrance('Hyrule Castle Secret Entrance Drop', player), player)
add_bunny_rule(world.get_entrance('Bonk Fairy (Light)', player), player) add_bunny_rule(world.get_entrance('Bonk Fairy (Light)', player), player)
add_bunny_rule(world.get_entrance('Checkerboard Cave', player), player) add_bunny_rule(world.get_entrance('Checkerboard Cave', player), player)
add_bunny_rule(world.get_entrance('50 Rupee Cave', player), player)
add_bunny_rule(world.get_entrance('20 Rupee Cave', player), player) add_bunny_rule(world.get_entrance('20 Rupee Cave', player), player)
add_bunny_rule(world.get_entrance('50 Rupee Cave', player), player)
add_bunny_rule(world.get_entrance('Skull Woods First Section Hole (North)', player), player) # bunny cannot lift bush add_bunny_rule(world.get_entrance('Skull Woods First Section Hole (North)', player), player) # bunny cannot lift bush
add_bunny_rule(world.get_entrance('Skull Woods Second Section Hole', player), player) # bunny cannot lift bush add_bunny_rule(world.get_entrance('Skull Woods Second Section Hole', player), player) # bunny cannot lift bush
add_bunny_rule(world.get_entrance('Skull Woods Final Section', player), player) # bunny cannot use fire rod add_bunny_rule(world.get_entrance('Skull Woods Final Section', player), player) # bunny cannot use fire rod
add_bunny_rule(world.get_entrance('Hookshot Cave', player), player) add_bunny_rule(world.get_entrance('Hookshot Cave', player), player)
add_bunny_rule(world.get_entrance('Thieves Town', player), player) # bunny cannot pull add_bunny_rule(world.get_entrance('Thieves Town', player), player) # bunny cannot pull
add_bunny_rule(world.get_entrance('Brewery', player), player) # bomb required
add_bunny_rule(world.get_entrance('Palace of Darkness', player), player) # kiki needs pearl add_bunny_rule(world.get_entrance('Palace of Darkness', player), player) # kiki needs pearl
add_bunny_rule(world.get_entrance('Dark World Hammer Peg Cave', player), player) add_bunny_rule(world.get_entrance('Hammer Peg Cave', player), player)
add_bunny_rule(world.get_entrance('Bonk Fairy (Dark)', player), player) add_bunny_rule(world.get_entrance('Bonk Fairy (Dark)', player), player)
add_bunny_rule(world.get_entrance('Misery Mire', player), player) add_bunny_rule(world.get_entrance('Misery Mire', player), player)
add_bunny_rule(world.get_entrance('Hype Cave', player), player) # bomb required
add_bunny_rule(world.get_entrance('Dark Lake Hylia Ledge Fairy', player), player) # bomb required
add_bunny_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), player) add_bunny_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), player)
# terrain
add_bunny_rule(world.get_entrance('Lost Woods Bush (West)', player), player) add_bunny_rule(world.get_entrance('Lost Woods Bush (West)', player), player)
add_bunny_rule(world.get_entrance('Lost Woods Bush (East)', player), player) add_bunny_rule(world.get_entrance('Lost Woods Bush (East)', player), player)
add_bunny_rule(world.get_entrance('DM Hammer Bridge (West)', player), player) add_bunny_rule(world.get_entrance('DM Hammer Bridge (West)', player), player)
add_bunny_rule(world.get_entrance('DM Hammer Bridge (East)', player), player) add_bunny_rule(world.get_entrance('DM Hammer Bridge (East)', player), player)
add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (North)', player), player)
add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (South)', player), player)
add_bunny_rule(world.get_entrance('DM Broken Bridge (West)', player), player) add_bunny_rule(world.get_entrance('DM Broken Bridge (West)', player), player)
add_bunny_rule(world.get_entrance('DM Broken Bridge (East)', player), player) add_bunny_rule(world.get_entrance('DM Broken Bridge (East)', player), player)
add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (North)', player), player)
add_bunny_rule(world.get_entrance('Fairy Ascension Rocks (South)', player), player)
add_bunny_rule(world.get_entrance('TR Pegs Ledge Entry', player), player) add_bunny_rule(world.get_entrance('TR Pegs Ledge Entry', player), player)
add_bunny_rule(world.get_entrance('Mountain Entry Entrance Rock (West)', player), player) add_bunny_rule(world.get_entrance('Mountain Entry Entrance Rock (West)', player), player)
add_bunny_rule(world.get_entrance('Mountain Entry Entrance Rock (East)', player), player) add_bunny_rule(world.get_entrance('Mountain Entry Entrance Rock (East)', player), player)
@@ -1162,6 +1115,7 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_entrance('C Whirlpool Pegs (Right)', player), player) add_bunny_rule(world.get_entrance('C Whirlpool Pegs (Right)', player), player)
add_bunny_rule(world.get_entrance('Desert Pass Rocks (North)', player), player) add_bunny_rule(world.get_entrance('Desert Pass Rocks (North)', player), player)
add_bunny_rule(world.get_entrance('Desert Pass Rocks (South)', player), player) add_bunny_rule(world.get_entrance('Desert Pass Rocks (South)', player), player)
add_bunny_rule(world.get_entrance('Skull Woods Bush Rock (West)', player), player) add_bunny_rule(world.get_entrance('Skull Woods Bush Rock (West)', player), player)
add_bunny_rule(world.get_entrance('Skull Woods Bush Rock (East)', player), player) add_bunny_rule(world.get_entrance('Skull Woods Bush Rock (East)', player), player)
add_bunny_rule(world.get_entrance('Skull Woods Forgotten Bush (West)', player), player) add_bunny_rule(world.get_entrance('Skull Woods Forgotten Bush (West)', player), player)
@@ -1203,6 +1157,73 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_entrance('Dark C Whirlpool Pegs (Left)', player), player) add_bunny_rule(world.get_entrance('Dark C Whirlpool Pegs (Left)', player), player)
add_bunny_rule(world.get_entrance('Dark C Whirlpool Pegs (Right)', player), player) add_bunny_rule(world.get_entrance('Dark C Whirlpool Pegs (Right)', player), player)
if not world.is_atgt_swapped(player):
add_bunny_rule(world.get_entrance('Agahnims Tower', player), player)
#TODO: This needs to get applied after bunny rules, move somewhere else tho
if not world.is_atgt_swapped(player):
add_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has_beaten_aga(player), 'or') # barrier gets removed after killing agahnim, relevant for entrance shuffle
def ow_terrain_rules(world, player):
for edge in world.owedges:
if edge.player == player and edge.dest and edge.dest.terrain == Terrain.Water:
ent = world.get_entrance(edge.name, player)
if edge.terrain == Terrain.Land:
set_rule(ent, lambda state: state.has('Flippers', player))
if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'):
add_rule(ent, lambda state: state.has_Pearl(player))
for whirlpool_name in OWExitTypes['Whirlpool']:
ent = world.get_entrance(whirlpool_name, player)
if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'):
add_rule(ent, lambda state: state.has_Pearl(player))
def no_glitches_rules(world, player):
set_rule(world.get_entrance('Zora Waterfall Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Zora Waterfall Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Zora Waterfall Water Approach', 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('River Bend Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('River Bend East Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Potion Shop Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Potion Shop Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Zora Approach Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Wooden Bridge Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Wooden Bridge Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('C Whirlpool Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Statues Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia South Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Central Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Island Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Water D Leave', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Cave SW', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Octoballoon Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Octoballoon Waterfall Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Qirn Jump Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Qirn Jump East Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Dark Witch Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Dark Witch Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Catfish Approach Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Broken Bridge Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Broken Bridge Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Broken Bridge West Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Hammer Bridge Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Dark C Whirlpool Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Northeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Southwest Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Ice Lake Moat Water Entry', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Shopping Mall SW', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), lambda state: state.has('Flippers', player))
add_bunny_rule(world.get_entrance('Zora Waterfall Water Drop', player), player) add_bunny_rule(world.get_entrance('Zora Waterfall Water Drop', player), player)
add_bunny_rule(world.get_entrance('Zora Waterfall Water Entry', player), player) add_bunny_rule(world.get_entrance('Zora Waterfall Water Entry', player), player)
add_bunny_rule(world.get_entrance('Zora Waterfall Water Approach', player), player) add_bunny_rule(world.get_entrance('Zora Waterfall Water Approach', player), player)
@@ -1225,6 +1246,7 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_entrance('Ice Cave SW', player), player) add_bunny_rule(world.get_entrance('Ice Cave SW', player), player)
add_bunny_rule(world.get_entrance('Octoballoon Water Drop', player), player) add_bunny_rule(world.get_entrance('Octoballoon Water Drop', player), player)
add_bunny_rule(world.get_entrance('Octoballoon Waterfall Water Drop', player), player) add_bunny_rule(world.get_entrance('Octoballoon Waterfall Water Drop', player), player)
add_bunny_rule(world.get_entrance('Qirn Jump Water Drop', player), player) add_bunny_rule(world.get_entrance('Qirn Jump Water Drop', player), player)
add_bunny_rule(world.get_entrance('Qirn Jump East Water Drop', player), player) add_bunny_rule(world.get_entrance('Qirn Jump East Water Drop', player), player)
add_bunny_rule(world.get_entrance('Dark Witch Water Drop', player), player) add_bunny_rule(world.get_entrance('Dark Witch Water Drop', player), player)
@@ -1246,23 +1268,7 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), player) add_bunny_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), player)
def ow_terrain_rules(world, player): # todo: move some dungeon rules to no glicthes logic - see these for examples
for edge in world.owedges:
if edge.player == player and edge.dest and edge.dest.terrain == Terrain.Water:
ent = world.get_entrance(edge.name, player)
if edge.terrain == Terrain.Land:
set_rule(ent, lambda state: state.has('Flippers', player))
if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'):
add_rule(ent, lambda state: state.has_Pearl(player))
for whirlpool_name in OWExitTypes['Whirlpool']:
ent = world.get_entrance(whirlpool_name, player)
if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'):
add_rule(ent, lambda state: state.has_Pearl(player))
def no_glitches_rules(world, player):
# todo: move some dungeon rules to no glictes logic - see these for examples
# add_rule(world.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player)) # add_rule(world.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player))
# add_rule(world.get_entrance('Ganons Tower (Double Switch Room)', player), lambda state: state.has('Hookshot', player)) # add_rule(world.get_entrance('Ganons Tower (Double Switch Room)', player), lambda state: state.has('Hookshot', player))
# DMs_room_chests = ['Ganons Tower - DMs Room - Top Left', 'Ganons Tower - DMs Room - Top Right', 'Ganons Tower - DMs Room - Bottom Left', 'Ganons Tower - DMs Room - Bottom Right'] # DMs_room_chests = ['Ganons Tower - DMs Room - Top Left', 'Ganons Tower - DMs Room - Top Right', 'Ganons Tower - DMs Room - Bottom Left', 'Ganons Tower - DMs Room - Bottom Right']
@@ -1294,6 +1300,7 @@ def fake_flipper_rules(world, player):
set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: True) set_rule(world.get_entrance('Hype Cave Water Entry', player), lambda state: True)
set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: True) set_rule(world.get_entrance('Ice Lake Southeast Water Drop', player), lambda state: True)
set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: True) set_rule(world.get_entrance('Bomber Corner Water Drop', player), lambda state: True)
add_bunny_rule(world.get_entrance('Zora Waterfall Water Approach', player), player) add_bunny_rule(world.get_entrance('Zora Waterfall Water Approach', player), player)
add_bunny_rule(world.get_entrance('River Bend Water Drop', player), player) add_bunny_rule(world.get_entrance('River Bend Water Drop', player), player)
add_bunny_rule(world.get_entrance('River Bend East Water Drop', player), player) add_bunny_rule(world.get_entrance('River Bend East Water Drop', player), player)
@@ -1320,6 +1327,7 @@ def forbid_bomb_jump_requirements(world, player):
for location in DMs_room_chests: for location in DMs_room_chests:
add_rule(world.get_location(location, player), lambda state: state.has('Hookshot', player)) add_rule(world.get_location(location, player), lambda state: state.has('Hookshot', player))
set_rule(world.get_entrance('Paradox Cave Bomb Jump', player), lambda state: False) set_rule(world.get_entrance('Paradox Cave Bomb Jump', player), lambda state: False)
set_rule(world.get_entrance('Ice Lake Northeast Pier Hop', player), lambda state: False)
def add_conditional_lamps(world, player): def add_conditional_lamps(world, player):
def add_conditional_lamp(spot, spottype='Location'): def add_conditional_lamp(spot, spottype='Location'):
@@ -1376,9 +1384,9 @@ def add_conditional_lamps(world, player):
is_dark = False is_dark = False
if not world.sewer_light_cone[player]: if not world.sewer_light_cone[player]:
is_dark = True is_dark = True
elif world.doorShuffle[player] not in ['partitioned', 'crossed'] and not info['sewer']: elif world.doorShuffle[player] not in ['crossed', 'partitioned'] and not info['sewer']:
is_dark = True is_dark = True
elif world.doorShuffle[player] in ['partitioned', 'crossed']: elif world.doorShuffle[player] in ['crossed', 'partitioned']:
sewer_builder = world.dungeon_layouts[player]['Hyrule Castle'] sewer_builder = world.dungeon_layouts[player]['Hyrule Castle']
is_dark = region not in sewer_builder.master_sector.region_set() is_dark = region not in sewer_builder.master_sector.region_set()
if is_dark: if is_dark:
@@ -1392,7 +1400,8 @@ def add_conditional_lamps(world, player):
add_conditional_lamp('Old Man House Front to Back', 'Entrance') add_conditional_lamp('Old Man House Front to Back', 'Entrance')
def open_rules(world, player):
def misc_key_rules(world, player):
# softlock protection as you can reach the sewers small key door with a guard drop key # softlock protection as you can reach the sewers small key door with a guard drop key
set_rule(world.get_location('Hyrule Castle - Boomerang Chest', player), lambda state: state.has_sm_key('Small Key (Escape)', player)) set_rule(world.get_location('Hyrule Castle - Boomerang Chest', player), lambda state: state.has_sm_key('Small Key (Escape)', player))
set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state.has_sm_key('Small Key (Escape)', player)) set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state.has_sm_key('Small Key (Escape)', player))
@@ -1409,13 +1418,12 @@ def swordless_rules(world, player):
set_rule(world.get_location('Ganon', player), lambda state: state.has('Hammer', player) and state.has_fire_source(player) and state.has('Silver Arrows', player) and state.can_shoot_arrows(player) and state.has_crystals(world.crystals_needed_for_ganon[player], player)) set_rule(world.get_location('Ganon', player), lambda state: state.has('Hammer', player) and state.has_fire_source(player) and state.has('Silver Arrows', player) and state.can_shoot_arrows(player) and state.has_crystals(world.crystals_needed_for_ganon[player], player))
set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has('Hammer', player)) # need to damage ganon to get tiles to drop set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has('Hammer', player)) # need to damage ganon to get tiles to drop
if not world.is_atgt_swapped(player):
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player) or state.has_beaten_aga(player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle
set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!)
set_rule(world.get_location('Turtle Medallion Pad', player), lambda state: state.has_turtle_rock_medallion(player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_location('Turtle Medallion Pad', player), lambda state: state.has_turtle_rock_medallion(player)) # sword not required to use medallion for opening in swordless (!)
add_bunny_rule(world.get_entrance('Misery Mire', player), player)
add_bunny_rule(world.get_location('Turtle Medallion Pad', player), player) if not world.is_atgt_swapped(player):
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player)) # barrier gets removed after killing agahnim, rule for that added later
std_kill_rooms = { std_kill_rooms = {
'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard 'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard
@@ -1563,11 +1571,11 @@ def set_bunny_rules(world, player, inverted):
bunny_impassable_caves = ['Bumper Cave (top)', 'Bumper Cave (bottom)', 'Two Brothers House', bunny_impassable_caves = ['Bumper Cave (top)', 'Bumper Cave (bottom)', 'Two Brothers House',
'Hookshot Cave (Middle)', 'Pyramid', 'Spiral Cave (Top)', 'Fairy Ascension Cave (Drop)'] 'Hookshot Cave (Middle)', 'Pyramid', 'Spiral Cave (Top)', 'Fairy Ascension Cave (Drop)']
bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree',
'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Old Man',
'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Old Man', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins',
'Frog', 'Missing Smith', 'Dark Blacksmith Ruins', 'Purple Chest', 'Pyramid Crack', 'Big Bomb', 'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Purple Chest', 'Blacksmith',
'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Blacksmith', 'Stumpy', 'Missing Smith', 'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge',
'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge', 'Pyramid Crack', 'Big Bomb', 'Stumpy', 'Lost Old Man', 'Old Man Drop Off',
'Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right', 'Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right',
'Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right', 'Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right',
'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right', 'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right',
@@ -1687,7 +1695,7 @@ def set_bunny_rules(world, player, inverted):
for ext in region.exits: for ext in region.exits:
add_rule(ext, rule) add_rule(ext, rule)
paradox_shop = world.get_region('Light World Death Mountain Shop', player) paradox_shop = world.get_region('Paradox Shop', player)
if is_bunny(paradox_shop): if is_bunny(paradox_shop):
add_rule(paradox_shop.entrances[0], get_rule_to_add(paradox_shop)) add_rule(paradox_shop.entrances[0], get_rule_to_add(paradox_shop))
+3 -2
View File
@@ -520,7 +520,7 @@ OWBonkGoodBeeDrop:
LDA.w $0D00,Y : SEC : SBC.l OWBonkPrizeTable[42].vert_offset : STA.w $0D00,Y LDA.w $0D00,Y : SEC : SBC.l OWBonkPrizeTable[42].vert_offset : STA.w $0D00,Y
LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y
LDA.b #$01 : STA !REDRAW : STA !FORCE_HEART_SPAWN LDA.b #$01 : STA !REDRAW
.return .return
PLY PLY
@@ -607,6 +607,7 @@ OWBonkDrops:
.mark_collected ; S = Collected, FlagBitmask, X (row + 2) .mark_collected ; S = Collected, FlagBitmask, X (row + 2)
PLA : BNE + ; S = FlagBitmask, X (row + 2) PLA : BNE + ; S = FlagBitmask, X (row + 2)
TYX : JSL Sprite_IsOnscreen : BCC +
LDX.b $8A : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X LDX.b $8A : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X
REP #$20 REP #$20
@@ -642,7 +643,7 @@ OWBonkDrops:
LDA.w $0D00,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w $0D00,Y LDA.w $0D00,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w $0D00,Y
LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y
LDA.b #$01 : STA !REDRAW : STA !FORCE_HEART_SPAWN LDA.b #$01 : STA !REDRAW
PLB : RTL PLB : RTL
Binary file not shown.
+2 -2
View File
@@ -253,6 +253,7 @@
"randomizer.item.worldstate.open": "Open", "randomizer.item.worldstate.open": "Open",
"randomizer.item.worldstate.inverted": "Inverted", "randomizer.item.worldstate.inverted": "Inverted",
"randomizer.item.worldstate.retro": "Retro", "randomizer.item.worldstate.retro": "Retro",
"randomizer.item.retro": "Enable Retro",
"randomizer.item.logiclevel": "Logic Level", "randomizer.item.logiclevel": "Logic Level",
"randomizer.item.logiclevel.noglitches": "No Glitches", "randomizer.item.logiclevel.noglitches": "No Glitches",
@@ -347,7 +348,7 @@
"randomizer.item.potshuffle": "Pot Shuffle (Legacy)", "randomizer.item.potshuffle": "Pot Shuffle (Legacy)",
"randomizer.item.dropshuffle": "Shuffle Enemy Key Drops", "randomizer.item.dropshuffle": "Shuffle Enemy Key Drops",
"randomizer.item.keydropshuffle": "Key Drop Shuffle (Legacy)", "randomizer.item.keydropshuffle": "Enable Key Drop Shuffle (Legacy)",
"randomizer.item.take_any": "Take Any Caves", "randomizer.item.take_any": "Take Any Caves",
"randomizer.item.take_any.none": "None", "randomizer.item.take_any.none": "None",
@@ -358,7 +359,6 @@
"randomizer.item.itempool.normal": "Normal", "randomizer.item.itempool.normal": "Normal",
"randomizer.item.itempool.hard": "Hard", "randomizer.item.itempool.hard": "Hard",
"randomizer.item.itempool.expert": "Expert", "randomizer.item.itempool.expert": "Expert",
"randomizer.item.flute_mode": "Flute Mode", "randomizer.item.flute_mode": "Flute Mode",
"randomizer.item.flute_mode.normal": "Normal", "randomizer.item.flute_mode.normal": "Normal",
"randomizer.item.flute_mode.active": "Pre-Activated", "randomizer.item.flute_mode.active": "Pre-Activated",
@@ -6,7 +6,10 @@
"none", "none",
"wild", "wild",
"universal" "universal"
] ],
"config": {
"padx": [20,0]
}
}, },
"mapshuffle": { "type": "checkbox" }, "mapshuffle": { "type": "checkbox" },
"compassshuffle": { "type": "checkbox" }, "compassshuffle": { "type": "checkbox" },
+11 -7
View File
@@ -11,12 +11,8 @@
"options": [ "options": [
"standard", "standard",
"open", "open",
"inverted", "inverted"
"retro" ]
],
"config": {
"command": "worldstate"
}
}, },
"logiclevel": { "logiclevel": {
"type": "selectbox", "type": "selectbox",
@@ -65,6 +61,12 @@
} }
}, },
"rightItemFrame": { "rightItemFrame": {
"retro": {
"type": "button",
"config": {
"command": "retro"
}
},
"sortingalgo": { "sortingalgo": {
"type": "selectbox", "type": "selectbox",
"default": "balanced", "default": "balanced",
@@ -155,9 +157,11 @@
}, },
"dropshuffle": { "dropshuffle": {
"type": "checkbox" "type": "checkbox"
}
}, },
"leftPoolFrame2": {
"keydropshuffle": { "keydropshuffle": {
"type": "checkbox", "type": "button",
"config": { "config": {
"command": "keydropshuffle" "command": "keydropshuffle"
} }
+2
View File
@@ -124,6 +124,7 @@ class CustomSettings(object):
args.crystals_gt[p] = get_setting(settings['crystals_gt'], args.crystals_gt[p]) args.crystals_gt[p] = get_setting(settings['crystals_gt'], args.crystals_gt[p])
args.crystals_ganon[p] = get_setting(settings['crystals_ganon'], args.crystals_ganon[p]) args.crystals_ganon[p] = get_setting(settings['crystals_ganon'], args.crystals_ganon[p])
args.experimental[p] = get_setting(settings['experimental'], args.experimental[p]) args.experimental[p] = get_setting(settings['experimental'], args.experimental[p])
args.collection_rate[p] = get_setting(settings['collection_rate'], args.collection_rate[p])
args.openpyramid[p] = get_setting(settings['openpyramid'], args.openpyramid[p]) args.openpyramid[p] = get_setting(settings['openpyramid'], args.openpyramid[p])
args.bigkeyshuffle[p] = get_setting(settings['bigkeyshuffle'], args.bigkeyshuffle[p]) args.bigkeyshuffle[p] = get_setting(settings['bigkeyshuffle'], args.bigkeyshuffle[p])
args.keyshuffle[p] = get_setting(settings['keyshuffle'], args.keyshuffle[p]) args.keyshuffle[p] = get_setting(settings['keyshuffle'], args.keyshuffle[p])
@@ -257,6 +258,7 @@ class CustomSettings(object):
settings_dict[p]['crystals_gt'] = world.crystals_gt_orig[p] settings_dict[p]['crystals_gt'] = world.crystals_gt_orig[p]
settings_dict[p]['crystals_ganon'] = world.crystals_ganon_orig[p] settings_dict[p]['crystals_ganon'] = world.crystals_ganon_orig[p]
settings_dict[p]['experimental'] = world.experimental[p] settings_dict[p]['experimental'] = world.experimental[p]
settings_dict[p]['collection_rate'] = world.collection_rate[p]
settings_dict[p]['openpyramid'] = world.open_pyramid[p] settings_dict[p]['openpyramid'] = world.open_pyramid[p]
settings_dict[p]['bigkeyshuffle'] = world.bigkeyshuffle[p] settings_dict[p]['bigkeyshuffle'] = world.bigkeyshuffle[p]
settings_dict[p]['keyshuffle'] = world.keyshuffle[p] settings_dict[p]['keyshuffle'] = world.keyshuffle[p]
+2 -1
View File
@@ -66,6 +66,7 @@ SETTINGSTOPROCESS = {
"crystals_ganon": "crystals_ganon", "crystals_ganon": "crystals_ganon",
"weapons": "swords", "weapons": "swords",
"retro": "retro",
"sortingalgo": "algorithm", "sortingalgo": "algorithm",
"accessibility": "accessibility", "accessibility": "accessibility",
"restrict_boss_items": "restrict_boss_items", "restrict_boss_items": "restrict_boss_items",
@@ -118,7 +119,7 @@ SETTINGSTOPROCESS = {
"experimental": "experimental", "experimental": "experimental",
"dungeon_counters": "dungeon_counters", "dungeon_counters": "dungeon_counters",
"mixed_travel": "mixed_travel", "mixed_travel": "mixed_travel",
"standardize_palettes": "standardize_palettes" "standardize_palettes": "standardize_palettes",
}, },
"enemizer": { "enemizer": {
"enemyshuffle": "shuffleenemies", "enemyshuffle": "shuffleenemies",
+1 -4
View File
@@ -215,6 +215,7 @@ def create_guiargs(parent):
arg = options[mainpage][subpage][widget] if subpage != "" else options[mainpage][widget] arg = options[mainpage][subpage][widget] if subpage != "" else options[mainpage][widget]
page = parent.pages[mainpage].pages[subpage] if subpage != "" else parent.pages[mainpage] page = parent.pages[mainpage].pages[subpage] if subpage != "" else parent.pages[mainpage]
pagewidgets = page.content.customWidgets if mainpage == "custom" else page.content.startingWidgets if mainpage == "startinventory" else page.widgets pagewidgets = page.content.customWidgets if mainpage == "custom" else page.content.startingWidgets if mainpage == "startinventory" else page.widgets
if hasattr(pagewidgets[widget], 'storageVar'):
setattr(guiargs, arg, pagewidgets[widget].storageVar.get()) setattr(guiargs, arg, pagewidgets[widget].storageVar.get())
# Get EnemizerCLI setting # Get EnemizerCLI setting
@@ -287,10 +288,6 @@ def create_guiargs(parent):
guiargs = update_deprecated_args(guiargs) guiargs = update_deprecated_args(guiargs)
# Key drop shuffle stuff # Key drop shuffle stuff
if guiargs.keydropshuffle:
guiargs.dropshuffle = 1
guiargs.pottery = 'keys' if guiargs.pottery == 'none' else guiargs.pottery
if (hasattr(guiargs, 'retro') and guiargs.retro) or guiargs.mode == 'retro': if (hasattr(guiargs, 'retro') and guiargs.retro) or guiargs.mode == 'retro':
if guiargs.bow_mode == 'progressive': if guiargs.bow_mode == 'progressive':
guiargs.bow_mode = 'retro' guiargs.bow_mode = 'retro'
+3
View File
@@ -57,6 +57,9 @@ def loadcliargs(gui, args, settings=None):
pagewidgets[widget].selectbox.options = theseOptions pagewidgets[widget].selectbox.options = theseOptions
elif thisType == "spinbox": elif thisType == "spinbox":
pagewidgets[widget].label.configure(text=label) pagewidgets[widget].label.configure(text=label)
elif thisType == 'button':
pagewidgets[widget].button.configure(text=label)
if hasattr(pagewidgets[widget], 'storageVar'):
pagewidgets[widget].storageVar.set(args[arg]) pagewidgets[widget].storageVar.set(args[arg])
# If we're on the Game Options page and it's not about Hints # If we're on the Game Options page and it's not about Hints
if subpage == "gameoptions" and widget not in ["hints", "collection_rate"]: if subpage == "gameoptions" and widget not in ["hints", "collection_rate"]:
+7 -2
View File
@@ -43,7 +43,10 @@ def item_page(parent):
self.frames["leftPoolHeader"].pack(side=TOP, anchor=W) self.frames["leftPoolHeader"].pack(side=TOP, anchor=W)
self.frames["leftPoolFrame"] = Frame(self.frames["leftPoolContainer"]) self.frames["leftPoolFrame"] = Frame(self.frames["leftPoolContainer"])
self.frames["leftPoolFrame"].pack(side=LEFT, fill=Y) self.frames["leftPoolFrame"].pack(side=TOP, fill=Y)
self.frames["leftPoolFrame2"] = Frame(self.frames["leftPoolContainer"])
self.frames["leftPoolFrame2"].pack(side=LEFT, fill=Y)
self.frames["rightPoolFrame"] = Frame(self.frames["poolFrame"]) self.frames["rightPoolFrame"] = Frame(self.frames["poolFrame"])
self.frames["rightPoolFrame"].pack(side=RIGHT) self.frames["rightPoolFrame"].pack(side=RIGHT)
@@ -62,7 +65,9 @@ def item_page(parent):
for key in dictWidgets: for key in dictWidgets:
self.widgets[key] = dictWidgets[key] self.widgets[key] = dictWidgets[key]
packAttrs = {"anchor":E} packAttrs = {"anchor":E}
if self.widgets[key].type == "checkbox" or framename == "leftPoolFrame": if key == "retro":
packAttrs["side"] = RIGHT
if self.widgets[key].type == "checkbox" or framename.startswith("leftPoolFrame"):
packAttrs["anchor"] = W packAttrs["anchor"] = W
if framename == "checkboxes": if framename == "checkboxes":
packAttrs["side"] = LEFT packAttrs["side"] = LEFT
+24 -6
View File
@@ -1,4 +1,5 @@
from tkinter import messagebox, Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X from tkinter import messagebox, Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X
from tkinter import Button
from source.classes.Empty import Empty from source.classes.Empty import Empty
# Override Spinbox to include mousewheel support for changing value # Override Spinbox to include mousewheel support for changing value
@@ -172,6 +173,22 @@ def make_textbox(self, parent, label, storageVar, manager, managerAttrs):
widget.textbox.pack(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None) widget.textbox.pack(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None)
return widget return widget
def make_button(self, parent, label, manager, managerAttrs, config):
self = Frame(parent)
if config and "command" in config:
self.command = config["command"]
else:
self.command = lambda: None
self.button = Button(parent, text=label, command=lambda: widget_command(self, self.command))
if managerAttrs is not None:
self.button.pack(managerAttrs)
else:
self.button.pack(anchor='w')
return self
# Make a generic widget # Make a generic widget
def make_widget(self, type, parent, label, storageVar=None, manager=None, managerAttrs=dict(), def make_widget(self, type, parent, label, storageVar=None, manager=None, managerAttrs=dict(),
options=None, config=None): options=None, config=None):
@@ -201,6 +218,8 @@ def make_widget(self, type, parent, label, storageVar=None, manager=None, manage
if thisStorageVar is None: if thisStorageVar is None:
thisStorageVar = StringVar() thisStorageVar = StringVar()
widget = make_textbox(self, parent, label, thisStorageVar, manager, managerAttrs) widget = make_textbox(self, parent, label, thisStorageVar, manager, managerAttrs)
elif type == 'button':
widget = make_button(self, parent, label, manager, managerAttrs, config)
widget.type = type widget.type = type
return widget return widget
@@ -243,8 +262,7 @@ def add_padding_from_config(packAttrs, defn):
def widget_command(widget, command=""): def widget_command(widget, command=""):
root = widget.winfo_toplevel() root = widget.winfo_toplevel()
text_output = "" text_output = ""
if command == "worldstate": if command == "retro":
if widget.storageVar.get() == 'retro':
temp_widget = root.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"] temp_widget = root.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"]
text_output += f'\n {temp_widget.label.cget("text")}' text_output += f'\n {temp_widget.label.cget("text")}'
temp_widget.storageVar.set('universal') temp_widget.storageVar.set('universal')
@@ -261,18 +279,18 @@ def widget_command(widget, command=""):
if temp_widget.storageVar.get() == 'none': if temp_widget.storageVar.get() == 'none':
temp_widget.storageVar.set('random') temp_widget.storageVar.set('random')
widget.storageVar.set('open')
messagebox.showinfo('', f'The following settings were changed:{text_output}') messagebox.showinfo('', f'The following settings were changed:{text_output}')
elif command == "keydropshuffle": elif command == "keydropshuffle":
if widget.storageVar.get() > 0:
temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"] temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"]
text_output += f'\n {temp_widget.label.cget("text")}' text_output += f'\n {temp_widget.label.cget("text")}'
if temp_widget.storageVar.get() == 'none': if temp_widget.storageVar.get() == 'none':
temp_widget.storageVar.set('keys') temp_widget.storageVar.set('keys')
temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"] temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"]
temp_widget.storageVar.set(1)
text_output += f'\n {temp_widget.checkbox.cget("text")}' text_output += f'\n {temp_widget.checkbox.cget("text")}'
if temp_widget.storageVar.get() == 0:
temp_widget.storageVar.set(1)
widget.storageVar.set(0) if text_output:
messagebox.showinfo('', f'The following settings were changed:{text_output}') messagebox.showinfo('', f'The following settings were changed:{text_output}')
+4 -4
View File
@@ -119,7 +119,7 @@ def resolve_districts(world):
if not location.item and location.real: if not location.item and location.real:
district.locations.add(location.name) district.locations.add(location.name)
for ext in region.exits: for ext in region.exits:
if ext.connected_region is not None and ext.connected_region not in visited: if ext.connected_region and ext.connected_region not in visited:
queue.appendleft(ext.connected_region) queue.appendleft(ext.connected_region)
elif region.type == RegionType.Dungeon and region.dungeon: elif region.type == RegionType.Dungeon and region.dungeon:
district.dungeons.add(region.dungeon.name) district.dungeons.add(region.dungeon.name)
@@ -138,10 +138,10 @@ def find_reachable_locations(state, player):
return check_set return check_set
inaccessible_regions_std = {'Desert Palace Stairs', 'Bumper Cave Ledge', 'Skull Woods Forest (West)', inaccessible_regions_std = {'Desert Palace Mouth', 'Bumper Cave Ledge', 'Skull Woods Forest (West)',
'Dark Death Mountain Ledge', 'Dark Death Mountain Isolated Ledge', 'Dark Death Mountain Ledge', 'Dark Death Mountain Isolated Ledge',
'Dark Death Mountain Floating Island'} 'Death Mountain Floating Island'}
inaccessible_regions_inv = {'Desert Palace Stairs', 'Maze Race Ledge', 'Desert Ledge', inaccessible_regions_inv = {'Desert Palace Mouth', 'Maze Race Ledge', 'Desert Ledge',
'Desert Palace Entrance (North) Spot', 'Hyrule Castle Ledge', 'Mountain Entry Ledge'} 'Desert Palace Entrance (North) Spot', 'Hyrule Castle Ledge', 'Mountain Entry Ledge'}
+1 -1
View File
@@ -221,7 +221,7 @@ def district_item_pool_config(world):
scale_factors = defaultdict(int) scale_factors = defaultdict(int)
scale_total = 0 scale_total = 0
for p in range(1, world.players + 1): for p in range(1, world.players + 1):
ent = 'Agahnims Tower' if world.is_atgt_swapped(player) else 'Ganons Tower' ent = 'Agahnims Tower' if world.is_atgt_swapped(p) else 'Ganons Tower'
dungeon = world.get_entrance(ent, p).connected_region.dungeon dungeon = world.get_entrance(ent, p).connected_region.dungeon
if dungeon: if dungeon:
scale = world.crystals_needed_for_gt[p] scale = world.crystals_needed_for_gt[p]
+201 -201
View File
@@ -499,9 +499,6 @@ def do_links_house(entrances, exits, avail, cross_world):
if not avail.world.shufflelinks[avail.player]: if not avail.world.shufflelinks[avail.player]:
links_house = 'Big Bomb Shop' if avail.world.is_bombshop_start(avail.player) else 'Links House' links_house = 'Big Bomb Shop' if avail.world.is_bombshop_start(avail.player) else 'Links House'
else: else:
# lobby shuffle means you ought to keep links house in the same world
sanc_spawn_can_be_dark = (not avail.inverted and avail.world.doorShuffle[avail.player] == 'crossed'
and avail.world.intensity[avail.player] >= 3)
entrance_pool = entrances if avail.coupled else avail.decoupled_entrances entrance_pool = entrances if avail.coupled else avail.decoupled_entrances
forbidden = list(Isolated_LH_Doors) forbidden = list(Isolated_LH_Doors)
@@ -512,10 +509,10 @@ def do_links_house(entrances, exits, avail, cross_world):
if avail.inverted: if avail.inverted:
dark_sanc_region = avail.world.get_entrance('Dark Sanctuary Hint Exit', avail.player).connected_region.name dark_sanc_region = avail.world.get_entrance('Dark Sanctuary Hint Exit', avail.player).connected_region.name
forbidden.extend(get_nearby_entrances(avail, dark_sanc_region)) forbidden.extend(get_nearby_entrances(avail, dark_sanc_region))
shuffle_mode = avail.world.shuffle[avail.player]
if avail.world.owShuffle[avail.player] == 'vanilla': if shuffle_mode == 'vanilla':
# simple shuffle - # simple shuffle -
if avail.world.shuffle[avail.player] == 'simple': if shuffle_mode == 'simple':
avail.links_on_mountain = True # taken care of by the logic below avail.links_on_mountain = True # taken care of by the logic below
if avail.world.is_tile_swapped(0x03, avail.player): # in inverted, links house cannot be on the mountain if avail.world.is_tile_swapped(0x03, avail.player): # in inverted, links house cannot be on the mountain
forbidden.extend(['Spike Cave', 'Dark Death Mountain Fairy', 'Hookshot Fairy']) forbidden.extend(['Spike Cave', 'Dark Death Mountain Fairy', 'Hookshot Fairy'])
@@ -528,17 +525,22 @@ def do_links_house(entrances, exits, avail, cross_world):
# can't have links house on eddm in restricted because Inverted Aga Tower isn't available # can't have links house on eddm in restricted because Inverted Aga Tower isn't available
# todo: inverted full may have the same problem if both links house and a mandatory connector is chosen # todo: inverted full may have the same problem if both links house and a mandatory connector is chosen
# from the 3 inverted options # from the 3 inverted options
if avail.world.shuffle[avail.player] in ['restricted', 'lite', 'lean'] and avail.world.is_tile_swapped(0x03, avail.player): if shuffle_mode == 'restricted' and avail.world.is_tile_swapped(0x03, avail.player):
avail.links_on_mountain = True avail.links_on_mountain = True
forbidden.extend(['Spike Cave', 'Dark Death Mountain Fairy']) forbidden.extend(['Spike Cave', 'Dark Death Mountain Fairy'])
if avail.world.shuffle[avail.player] in ['lite', 'lean']: if shuffle_mode in ['lite', 'lean']:
forbidden.extend(['Spike Cave', 'Mire Shed'])
if avail.world.is_tile_swapped(0x05, avail.player): if avail.world.is_tile_swapped(0x05, avail.player):
avail.links_on_mountain = True avail.links_on_mountain = True
forbidden.extend(['Cave Shop (Dark Death Mountain)']) forbidden.extend(['Dark Death Mountain Shop'])
else: else:
avail.links_on_mountain = True avail.links_on_mountain = True
# lobby shuffle means you ought to keep links house in the same world
sanc_spawn_can_be_dark = (not avail.inverted and avail.world.doorShuffle[avail.player] in ['partitioned', 'crossed']
and avail.world.intensity[avail.player] >= 3)
if cross_world and not sanc_spawn_can_be_dark: if cross_world and not sanc_spawn_can_be_dark:
possible = [e for e in entrance_pool if e not in forbidden] possible = [e for e in entrance_pool if e not in forbidden]
else: else:
@@ -1350,8 +1352,7 @@ inverted_sub_table = {
'Pyramid Entrance': 'Inverted Pyramid Entrance' 'Pyramid Entrance': 'Inverted Pyramid Entrance'
} }
inverted_exit_sub_table = { inverted_exit_sub_table = { }
}
def inverted_substitution(avail_pool, collection, is_entrance, is_set=False): def inverted_substitution(avail_pool, collection, is_entrance, is_set=False):
@@ -1570,18 +1571,18 @@ modes = {
'fixed_non_items': { 'fixed_non_items': {
'special': 'vanilla', 'special': 'vanilla',
'condition': '', 'condition': '',
'entrances': ['Dark Desert Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'entrances': ['Mire Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint',
'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop',
'East Dark World Hint', 'Kakariko Gamble Game', 'Long Fairy Cave', 'East Dark World Hint', 'Kakariko Gamble Game', 'Long Fairy Cave',
'Bush Covered House', 'Fortune Teller (Light)', 'Lost Woods Gamble', 'Bush Covered House', 'Fortune Teller (Light)', 'Lost Woods Gamble',
'Lake Hylia Fortune Teller', 'Lake Hylia Fairy', 'Bonk Fairy (Light)', 'Inverted Dark Sanctuary'], 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy', 'Bonk Fairy (Light)'],
}, },
'fixed_shops': { 'fixed_shops': {
'special': 'vanilla', 'special': 'vanilla',
'condition': 'shopsanity', 'condition': 'shopsanity',
'entrances': ['Cave Shop (Dark Death Mountain)', 'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'entrances': ['Dark Death Mountain Shop', 'Dark Potion Shop', 'Dark Lumberjack Shop',
'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade',
'Cave Shop (Lake Hylia)'], 'Lake Hylia Shop'],
}, },
'fixed_takeanys': { 'fixed_takeanys': {
'special': 'vanilla', 'special': 'vanilla',
@@ -1595,7 +1596,7 @@ modes = {
'entrances': ['Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'entrances': ['Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)',
'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy',
'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave',
'Dark Desert Hint'] 'Mire Hint']
}, },
'fixed_bonk': { 'fixed_bonk': {
'special': 'vanilla', 'special': 'vanilla',
@@ -1603,18 +1604,18 @@ modes = {
'entrances': ['Good Bee Cave'] 'entrances': ['Good Bee Cave']
}, },
'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps
'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Dark World Hammer Peg Cave', 'Chest Game', 'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Hammer Peg Cave', 'Chest Game',
'C-Shaped House', 'Brewery', 'Hype Cave', 'Big Bomb Shop', 'Pyramid Fairy', 'C-Shaped House', 'Brewery', 'Hype Cave', 'Big Bomb Shop', 'Pyramid Fairy',
'Ice Rod Cave', 'Dam', 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Mini Moldorm Cave', 'Ice Rod Cave', 'Dam', 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Mini Moldorm Cave',
'Checkerboard Cave', 'Graveyard Cave', 'Cave 45', 'Sick Kids House', 'Blacksmiths Hut', 'Checkerboard Cave', 'Graveyard Cave', 'Cave 45', 'Sick Kids House', 'Blacksmiths Hut',
'Sahasrahlas Hut', 'Aginahs Cave', 'Chicken House', 'Kings Grave', 'Blinds Hideout', 'Sahasrahlas Hut', 'Aginahs Cave', 'Chicken House', 'Kings Grave', 'Blinds Hideout',
'Waterfall of Wishing', 'Cave Shop (Dark Death Mountain)', 'Good Bee Cave', 'Waterfall of Wishing', 'Dark Death Mountain Shop', 'Good Bee Cave',
'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop', 'Dark Potion Shop', 'Dark Lumberjack Shop', 'Dark World Shop',
'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Lake Hylia Shop',
'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)',
'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy',
'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave',
'Dark Desert Hint', 'Desert Fairy', 'Light Hype Fairy', 'Dark Death Mountain Fairy', 'Mire Hint', 'Desert Fairy', 'Light Hype Fairy', 'Dark Death Mountain Fairy',
'Dark Lake Hylia Ledge Fairy', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Ledge Fairy', 'Bonk Fairy (Dark)',
'Links House', 'Tavern North'] 'Links House', 'Tavern North']
}, },
@@ -1661,18 +1662,18 @@ modes = {
'fixed_non_items': { 'fixed_non_items': {
'special': 'vanilla', 'special': 'vanilla',
'condition': '', 'condition': '',
'entrances': ['Dark Desert Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'entrances': ['Mire Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint',
'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop',
'East Dark World Hint', 'Kakariko Gamble Game', 'Long Fairy Cave', 'East Dark World Hint', 'Kakariko Gamble Game', 'Long Fairy Cave',
'Bush Covered House', 'Fortune Teller (Light)', 'Lost Woods Gamble', 'Bush Covered House', 'Fortune Teller (Light)', 'Lost Woods Gamble',
'Lake Hylia Fortune Teller', 'Lake Hylia Fairy', 'Bonk Fairy (Light)', 'Inverted Dark Sanctuary'], 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy', 'Bonk Fairy (Light)'],
}, },
'fixed_shops': { 'fixed_shops': {
'special': 'vanilla', 'special': 'vanilla',
'condition': 'shopsanity', 'condition': 'shopsanity',
'entrances': ['Cave Shop (Dark Death Mountain)', 'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'entrances': ['Dark Death Mountain Shop', 'Dark Potion Shop', 'Dark Lumberjack Shop',
'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade',
'Cave Shop (Lake Hylia)'], 'Lake Hylia Shop'],
}, },
'fixed_takeanys': { 'fixed_takeanys': {
'special': 'vanilla', 'special': 'vanilla',
@@ -1686,7 +1687,7 @@ modes = {
'entrances': ['Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'entrances': ['Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)',
'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy',
'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave',
'Dark Desert Hint'] 'Mire Hint']
}, },
'fixed_bonk': { 'fixed_bonk': {
'special': 'vanilla', 'special': 'vanilla',
@@ -1694,18 +1695,18 @@ modes = {
'entrances': ['Good Bee Cave'] 'entrances': ['Good Bee Cave']
}, },
'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps
'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Dark World Hammer Peg Cave', 'Chest Game', 'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Hammer Peg Cave', 'Chest Game',
'C-Shaped House', 'Brewery', 'Hype Cave', 'Big Bomb Shop', 'Pyramid Fairy', 'C-Shaped House', 'Brewery', 'Hype Cave', 'Big Bomb Shop', 'Pyramid Fairy',
'Ice Rod Cave', 'Dam', 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Mini Moldorm Cave', 'Ice Rod Cave', 'Dam', 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Mini Moldorm Cave',
'Checkerboard Cave', 'Graveyard Cave', 'Cave 45', 'Sick Kids House', 'Blacksmiths Hut', 'Checkerboard Cave', 'Graveyard Cave', 'Cave 45', 'Sick Kids House', 'Blacksmiths Hut',
'Sahasrahlas Hut', 'Aginahs Cave', 'Chicken House', 'Kings Grave', 'Blinds Hideout', 'Sahasrahlas Hut', 'Aginahs Cave', 'Chicken House', 'Kings Grave', 'Blinds Hideout',
'Waterfall of Wishing', 'Cave Shop (Dark Death Mountain)', 'Good Bee Cave', 'Waterfall of Wishing', 'Dark Death Mountain Shop', 'Good Bee Cave',
'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop', 'Dark Potion Shop', 'Dark Lumberjack Shop', 'Dark World Shop',
'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Lake Hylia Shop',
'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', 'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)',
'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy',
'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave',
'Dark Desert Hint', 'Desert Fairy', 'Light Hype Fairy', 'Dark Death Mountain Fairy', 'Mire Hint', 'Desert Fairy', 'Light Hype Fairy', 'Dark Death Mountain Fairy',
'Dark Lake Hylia Ledge Fairy', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Ledge Fairy', 'Bonk Fairy (Dark)',
'Links House', 'Tavern North'] # inverted links house gets substituted 'Links House', 'Tavern North'] # inverted links house gets substituted
} }
@@ -1963,12 +1964,12 @@ entrance_map = {
single_entrance_map = { single_entrance_map = {
'Mimic Cave': 'Mimic Cave', 'Dark Death Mountain Fairy': 'Dark Death Mountain Healer Fairy', 'Mimic Cave': 'Mimic Cave', 'Dark Death Mountain Fairy': 'Dark Death Mountain Healer Fairy',
'Cave Shop (Dark Death Mountain)': 'Cave Shop (Dark Death Mountain)', 'Spike Cave': 'Spike Cave', 'Dark Death Mountain Shop': 'Dark Death Mountain Shop', 'Spike Cave': 'Spike Cave',
'Dark Desert Fairy': 'Dark Desert Healer Fairy', 'Dark Desert Hint': 'Dark Desert Hint', 'Mire Shed': 'Mire Shed', 'Mire Fairy': 'Mire Healer Fairy', 'Mire Hint': 'Mire Hint', 'Mire Shed': 'Mire Shed',
'Archery Game': 'Archery Game', 'Dark World Potion Shop': 'Dark World Potion Shop', 'Archery Game': 'Archery Game', 'Dark Potion Shop': 'Dark Potion Shop',
'Dark World Lumberjack Shop': 'Dark World Lumberjack Shop', 'Dark World Shop': 'Village of Outcasts Shop', 'Dark Lumberjack Shop': 'Dark Lumberjack Shop', 'Dark World Shop': 'Village of Outcasts Shop',
'Fortune Teller (Dark)': 'Fortune Teller (Dark)', 'Dark Sanctuary Hint': 'Dark Sanctuary Hint', 'Fortune Teller (Dark)': 'Fortune Teller (Dark)', 'Dark Sanctuary Hint': 'Dark Sanctuary Hint',
'Red Shield Shop': 'Red Shield Shop', 'Dark World Hammer Peg Cave': 'Dark World Hammer Peg Cave', 'Red Shield Shop': 'Red Shield Shop', 'Hammer Peg Cave': 'Hammer Peg Cave',
'Chest Game': 'Chest Game', 'C-Shaped House': 'C-Shaped House', 'Brewery': 'Brewery', 'Chest Game': 'Chest Game', 'C-Shaped House': 'C-Shaped House', 'Brewery': 'Brewery',
'Bonk Fairy (Dark)': 'Bonk Fairy (Dark)', 'Hype Cave': 'Hype Cave', 'Bonk Fairy (Dark)': 'Bonk Fairy (Dark)', 'Hype Cave': 'Hype Cave',
'Dark Lake Hylia Ledge Hint': 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Hint': 'Dark Lake Hylia Ledge Hint',
@@ -1987,9 +1988,9 @@ single_entrance_map = {
'Snitch Lady (West)': 'Snitch Lady (West)', 'Snitch Lady (East)': 'Snitch Lady (East)', 'Snitch Lady (West)': 'Snitch Lady (West)', 'Snitch Lady (East)': 'Snitch Lady (East)',
'Fortune Teller (Light)': 'Fortune Teller (Light)', 'Lost Woods Gamble': 'Lost Woods Gamble', 'Fortune Teller (Light)': 'Fortune Teller (Light)', 'Lost Woods Gamble': 'Lost Woods Gamble',
'Sick Kids House': 'Sick Kids House', 'Blacksmiths Hut': 'Blacksmiths Hut', 'Capacity Upgrade': 'Capacity Upgrade', 'Sick Kids House': 'Sick Kids House', 'Blacksmiths Hut': 'Blacksmiths Hut', 'Capacity Upgrade': 'Capacity Upgrade',
'Cave Shop (Lake Hylia)': 'Cave Shop (Lake Hylia)', 'Sahasrahlas Hut': 'Sahasrahlas Hut', 'Lake Hylia Shop': 'Lake Hylia Shop', 'Sahasrahlas Hut': 'Sahasrahlas Hut',
'Aginahs Cave': 'Aginahs Cave', 'Chicken House': 'Chicken House', 'Tavern North': 'Tavern', 'Aginahs Cave': 'Aginahs Cave', 'Chicken House': 'Chicken House', 'Tavern North': 'Tavern',
'Kings Grave': 'Kings Grave', 'Desert Fairy': 'Desert Healer Fairy', 'Light Hype Fairy': 'Swamp Healer Fairy', 'Kings Grave': 'Kings Grave', 'Desert Fairy': 'Desert Healer Fairy', 'Light Hype Fairy': 'Light Hype Fairy',
'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy': 'Lake Hylia Healer Fairy', 'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy': 'Lake Hylia Healer Fairy',
'Bonk Fairy (Light)': 'Bonk Fairy (Light)', 'Lumberjack House': 'Lumberjack House', 'Dam': 'Dam', 'Bonk Fairy (Light)': 'Bonk Fairy (Light)', 'Lumberjack House': 'Lumberjack House', 'Dam': 'Dam',
'Blinds Hideout': 'Blinds Hideout', 'Waterfall of Wishing': 'Waterfall of Wishing' 'Blinds Hideout': 'Blinds Hideout', 'Waterfall of Wishing': 'Waterfall of Wishing'
@@ -2001,9 +2002,9 @@ DW_Entrances = []
Isolated_LH_Doors = ['Kings Grave', 'Waterfall of Wishing', 'Desert Palace Entrance (South)', Isolated_LH_Doors = ['Kings Grave', 'Waterfall of Wishing', 'Desert Palace Entrance (South)',
'Desert Palace Entrance (North)', 'Capacity Upgrade', 'Ice Palace', 'Desert Palace Entrance (North)', 'Capacity Upgrade', 'Ice Palace',
'Skull Woods Final Section', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section', 'Skull Woods Second Section Door (West)',
'Dark World Hammer Peg Cave', 'Turtle Rock Isolated Ledge Entrance', 'Hammer Peg Cave', 'Turtle Rock Isolated Ledge Entrance',
'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)',
'Dark World Shop', 'Dark World Potion Shop'] 'Dark World Shop', 'Dark Potion Shop']
# inverted doesn't like really like - Paradox Top or Tower of Hera # inverted doesn't like really like - Paradox Top or Tower of Hera
LH_DM_Connector_List = { LH_DM_Connector_List = {
@@ -2012,14 +2013,14 @@ LH_DM_Connector_List = {
'Tower of Hera', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', 'Spectacle Rock Cave', 'Tower of Hera', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', 'Spectacle Rock Cave',
'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Paradox Cave (Top)', 'Hookshot Fairy', 'Spike Cave', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Paradox Cave (Top)', 'Hookshot Fairy', 'Spike Cave',
'Dark Death Mountain Fairy', 'Ganons Tower', 'Superbunny Cave (Top)', 'Superbunny Cave (Bottom)', 'Dark Death Mountain Fairy', 'Ganons Tower', 'Superbunny Cave (Top)', 'Superbunny Cave (Bottom)',
'Hookshot Cave', 'Cave Shop (Dark Death Mountain)', 'Turtle Rock'} 'Hookshot Cave', 'Dark Death Mountain Shop', 'Turtle Rock'}
LH_DM_Exit_Forbidden = { LH_DM_Exit_Forbidden = {
'Turtle Rock Isolated Ledge Entrance', 'Mimic Cave', 'Hookshot Cave Back Entrance', 'Turtle Rock Isolated Ledge Entrance', 'Mimic Cave', 'Hookshot Cave Back Entrance',
'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Desert Palace Entrance (South)', 'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Desert Palace Entrance (South)',
'Ice Palace', 'Waterfall of Wishing', 'Kings Grave', 'Dark World Hammer Peg Cave', 'Capacity Upgrade', 'Ice Palace', 'Waterfall of Wishing', 'Kings Grave', 'Hammer Peg Cave', 'Capacity Upgrade',
'Skull Woods Final Section', 'Skull Woods Second Section Door (West)' 'Skull Woods Final Section', 'Skull Woods Second Section Door (West)'
} # omissions from Isolated Starts: 'Desert Palace Entrance (North)', 'Dark World Shop', 'Dark World Potion Shop' } # omissions from Isolated Starts: 'Desert Palace Entrance (North)', 'Dark World Shop', 'Dark Potion Shop'
Connector_List = [['Elder House Exit (East)', 'Elder House Exit (West)'], Connector_List = [['Elder House Exit (East)', 'Elder House Exit (West)'],
['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)'], ['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)'],
@@ -2080,189 +2081,188 @@ Simple_DM_Non_Connectors = {'Old Man Cave Ledge', 'Spiral Cave (Top)', 'Superbun
# They link together underworld regions # They link together underworld regions
mandatory_connections = [('Lost Woods Hideout (top to bottom)', 'Lost Woods Hideout (bottom)'), mandatory_connections = [('Lost Woods Hideout (top to bottom)', 'Lost Woods Hideout (bottom)'),
('Lumberjack Tree (top to bottom)', 'Lumberjack Tree (bottom)'), ('Lumberjack Tree (top to bottom)', 'Lumberjack Tree (bottom)'),
('Kakariko Well (top to bottom)', 'Kakariko Well (bottom)'),
('Kakariko Well (top to back)', 'Kakariko Well (back)'),
('Blinds Hideout N', 'Blinds Hideout (Top)'),
('Bat Cave Door', 'Bat Cave (left)'),
('Sewer Drop', 'Sewers Rat Path'),
('Old Man Cave Dropdown', 'Old Man Cave'),
('Old Man House Front to Back', 'Old Man House Back'),
('Old Man House Back to Front', 'Old Man House'),
('Spectacle Rock Cave Drop', 'Spectacle Rock Cave (Bottom)'),
('Spectacle Rock Cave Peak Drop', 'Spectacle Rock Cave (Bottom)'),
('Death Mountain Return Cave E', 'Death Mountain Return Cave (right)'), ('Death Mountain Return Cave E', 'Death Mountain Return Cave (right)'),
('Death Mountain Return Cave W', 'Death Mountain Return Cave (left)'), ('Death Mountain Return Cave W', 'Death Mountain Return Cave (left)'),
('Old Man Cave Dropdown', 'Old Man Cave'),
('Spectacle Rock Cave Drop', 'Spectacle Rock Cave (Bottom)'),
('Spectacle Rock Cave Peak Drop', 'Spectacle Rock Cave (Bottom)'),
('Old Man House Front to Back', 'Old Man House Back'),
('Old Man House Back to Front', 'Old Man House'),
('Spiral Cave (top to bottom)', 'Spiral Cave (Bottom)'), ('Spiral Cave (top to bottom)', 'Spiral Cave (Bottom)'),
('Light World Death Mountain Shop', 'Light World Death Mountain Shop'),
('Paradox Cave Push Block Reverse', 'Paradox Cave Chest Area'), ('Paradox Cave Push Block Reverse', 'Paradox Cave Chest Area'),
('Paradox Cave Push Block', 'Paradox Cave Front'), ('Paradox Cave Push Block', 'Paradox Cave Front'),
('Paradox Cave Chest Area NE', 'Paradox Cave Bomb Area'), ('Paradox Cave Chest Area NE', 'Paradox Cave Bomb Area'),
('Paradox Cave Bomb Jump', 'Paradox Cave'), ('Paradox Cave Bomb Jump', 'Paradox Cave'),
('Paradox Cave Drop', 'Paradox Cave Chest Area'), ('Paradox Cave Drop', 'Paradox Cave Chest Area'),
('Paradox Shop', 'Paradox Shop'),
('Fairy Ascension Cave Climb', 'Fairy Ascension Cave (Top)'), ('Fairy Ascension Cave Climb', 'Fairy Ascension Cave (Top)'),
('Fairy Ascension Cave Pots', 'Fairy Ascension Cave (Bottom)'), ('Fairy Ascension Cave Pots', 'Fairy Ascension Cave (Bottom)'),
('Fairy Ascension Cave Drop', 'Fairy Ascension Cave (Drop)'), ('Fairy Ascension Cave Drop', 'Fairy Ascension Cave (Drop)'),
('Kakariko Well (top to bottom)', 'Kakariko Well (bottom)'),
('Kakariko Well (top to back)', 'Kakariko Well (back)'),
('Blinds Hideout N', 'Blinds Hideout (Top)'),
('Sewer Drop', 'Sewers Rat Path'),
('Missing Smith', 'Missing Smith'), ('Missing Smith', 'Missing Smith'),
('Bumper Cave Bottom to Top', 'Bumper Cave (top)'), ('Bat Cave Door', 'Bat Cave (left)'),
('Bumper Cave Top To Bottom', 'Bumper Cave (bottom)'),
('Superbunny Cave Climb', 'Superbunny Cave (Top)'),
('Hookshot Cave Front to Middle', 'Hookshot Cave (Middle)'), ('Hookshot Cave Front to Middle', 'Hookshot Cave (Middle)'),
('Hookshot Cave Middle to Front', 'Hookshot Cave (Front)'), ('Hookshot Cave Middle to Front', 'Hookshot Cave (Front)'),
('Hookshot Cave Middle to Back', 'Hookshot Cave (Back)'), ('Hookshot Cave Middle to Back', 'Hookshot Cave (Back)'),
('Hookshot Cave Back to Middle', 'Hookshot Cave (Middle)'), ('Hookshot Cave Back to Middle', 'Hookshot Cave (Middle)'),
('Hookshot Cave Bonk Path', 'Hookshot Cave (Bonk Islands)'), ('Hookshot Cave Bonk Path', 'Hookshot Cave (Bonk Islands)'),
('Hookshot Cave Hook Path', 'Hookshot Cave (Hook Islands)'), ('Hookshot Cave Hook Path', 'Hookshot Cave (Hook Islands)'),
('Superbunny Cave Climb', 'Superbunny Cave (Top)'),
('Bumper Cave Bottom to Top', 'Bumper Cave (top)'),
('Bumper Cave Top To Bottom', 'Bumper Cave (bottom)'),
('Ganon Drop', 'Bottom of Pyramid') ('Ganon Drop', 'Bottom of Pyramid')
] ]
# non-shuffled entrance links # non-shuffled entrance links
default_connections = {'Links House': 'Links House', default_connections = {'Lost Woods Gamble': 'Lost Woods Gamble',
'Links House Exit': 'Links House Area',
'Waterfall of Wishing': 'Waterfall of Wishing',
'Blinds Hideout': 'Blinds Hideout',
'Dam': 'Dam',
'Lumberjack House': 'Lumberjack House',
'Hyrule Castle Secret Entrance Drop': 'Hyrule Castle Secret Entrance',
'Hyrule Castle Secret Entrance Stairs': 'Hyrule Castle Secret Entrance',
'Hyrule Castle Secret Entrance Exit': 'Hyrule Castle Courtyard',
'Bonk Fairy (Light)': 'Bonk Fairy (Light)',
'Lake Hylia Fairy': 'Lake Hylia Healer Fairy',
'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller',
'Light Hype Fairy': 'Swamp Healer Fairy',
'Desert Fairy': 'Desert Healer Fairy',
'Kings Grave': 'Kings Grave',
'Tavern North': 'Tavern',
'Chicken House': 'Chicken House',
'Aginahs Cave': 'Aginahs Cave',
'Sahasrahlas Hut': 'Sahasrahlas Hut',
'Cave Shop (Lake Hylia)': 'Cave Shop (Lake Hylia)',
'Capacity Upgrade': 'Capacity Upgrade',
'Kakariko Well Drop': 'Kakariko Well (top)',
'Kakariko Well Cave': 'Kakariko Well (bottom)',
'Kakariko Well Exit': 'Kakariko Area',
'Blacksmiths Hut': 'Blacksmiths Hut',
'Bat Cave Drop': 'Bat Cave (right)',
'Bat Cave Cave': 'Bat Cave (left)',
'Bat Cave Exit': 'Blacksmith Area',
'Sick Kids House': 'Sick Kids House',
'Elder House (East)': 'Elder House',
'Elder House (West)': 'Elder House',
'Elder House Exit (East)': 'Kakariko Area',
'Elder House Exit (West)': 'Kakariko Area',
'North Fairy Cave Drop': 'North Fairy Cave',
'North Fairy Cave': 'North Fairy Cave',
'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)',
'Snitch Lady (West)': 'Snitch Lady (West)',
'Bush Covered House': 'Bush Covered House',
'Tavern (Front)': 'Tavern (Front)',
'Light World Bomb Hut': 'Light World Bomb Hut',
'Kakariko Shop': 'Kakariko Shop',
'Lost Woods Hideout Drop': 'Lost Woods Hideout (top)', 'Lost Woods Hideout Drop': 'Lost Woods Hideout (top)',
'Lost Woods Hideout Stump': 'Lost Woods Hideout (bottom)', 'Lost Woods Hideout Stump': 'Lost Woods Hideout (bottom)',
'Lost Woods Hideout Exit': 'Lost Woods East Area', 'Lost Woods Hideout Exit': 'Lost Woods East Area',
'Lumberjack House': 'Lumberjack House',
'Lumberjack Tree Tree': 'Lumberjack Tree (top)', 'Lumberjack Tree Tree': 'Lumberjack Tree (top)',
'Lumberjack Tree Cave': 'Lumberjack Tree (bottom)', 'Lumberjack Tree Cave': 'Lumberjack Tree (bottom)',
'Lumberjack Tree Exit': 'Lumberjack Area', 'Lumberjack Tree Exit': 'Lumberjack Area',
'Cave 45': 'Cave 45', 'Death Mountain Return Cave (East)': 'Death Mountain Return Cave (right)',
'Graveyard Cave': 'Graveyard Cave', 'Death Mountain Return Cave Exit (East)': 'West Death Mountain (Bottom)',
'Checkerboard Cave': 'Checkerboard Cave',
'Mini Moldorm Cave': 'Mini Moldorm Cave',
'Long Fairy Cave': 'Long Fairy Cave', # near East Light World Teleporter
'Good Bee Cave': 'Good Bee Cave',
'20 Rupee Cave': '20 Rupee Cave',
'50 Rupee Cave': '50 Rupee Cave',
'Ice Rod Cave': 'Ice Rod Cave',
'Bonk Rock Cave': 'Bonk Rock Cave',
'Library': 'Library',
'Kakariko Gamble Game': 'Kakariko Gamble Game',
'Potion Shop': 'Potion Shop',
'Two Brothers House (East)': 'Two Brothers House',
'Two Brothers House (West)': 'Two Brothers House',
'Two Brothers House Exit (East)': 'Kakariko Suburb Area',
'Two Brothers House Exit (West)': 'Maze Race Ledge',
'Sanctuary': 'Sanctuary Portal',
'Sanctuary Grave': 'Sewer Drop',
'Sanctuary Exit': 'Sanctuary Area',
'Old Man Cave (West)': 'Old Man Cave Ledge',
'Old Man Cave (East)': 'Old Man Cave', 'Old Man Cave (East)': 'Old Man Cave',
'Old Man Cave Exit (West)': 'Mountain Entry Entrance',
'Old Man Cave Exit (East)': 'West Death Mountain (Bottom)', 'Old Man Cave Exit (East)': 'West Death Mountain (Bottom)',
'Spectacle Rock Cave': 'Spectacle Rock Cave (Top)',
'Spectacle Rock Cave Exit (Top)': 'West Death Mountain (Bottom)',
'Spectacle Rock Cave Peak': 'Spectacle Rock Cave (Peak)',
'Spectacle Rock Cave Exit (Peak)': 'West Death Mountain (Bottom)',
'Spectacle Rock Cave (Bottom)': 'Spectacle Rock Cave (Bottom)',
'Spectacle Rock Cave Exit': 'West Death Mountain (Bottom)',
'Old Man House (Bottom)': 'Old Man House', 'Old Man House (Bottom)': 'Old Man House',
'Old Man House Exit (Bottom)': 'West Death Mountain (Bottom)', 'Old Man House Exit (Bottom)': 'West Death Mountain (Bottom)',
'Old Man House (Top)': 'Old Man House Back', 'Old Man House (Top)': 'Old Man House Back',
'Old Man House Exit (Top)': 'West Death Mountain (Bottom)', 'Old Man House Exit (Top)': 'West Death Mountain (Bottom)',
'Death Mountain Return Cave (East)': 'Death Mountain Return Cave (right)',
'Death Mountain Return Cave (West)': 'Death Mountain Return Cave (left)',
'Death Mountain Return Cave Exit (West)': 'Mountain Entry Ledge',
'Death Mountain Return Cave Exit (East)': 'West Death Mountain (Bottom)',
'Spectacle Rock Cave Peak': 'Spectacle Rock Cave (Peak)',
'Spectacle Rock Cave (Bottom)': 'Spectacle Rock Cave (Bottom)',
'Spectacle Rock Cave': 'Spectacle Rock Cave (Top)',
'Spectacle Rock Cave Exit': 'West Death Mountain (Bottom)',
'Spectacle Rock Cave Exit (Top)': 'West Death Mountain (Bottom)',
'Spectacle Rock Cave Exit (Peak)': 'West Death Mountain (Bottom)',
'Paradox Cave (Bottom)': 'Paradox Cave Front',
'Paradox Cave (Middle)': 'Paradox Cave',
'Paradox Cave (Top)': 'Paradox Cave',
'Paradox Cave Exit (Bottom)': 'East Death Mountain (Bottom)',
'Paradox Cave Exit (Middle)': 'East Death Mountain (Bottom)',
'Paradox Cave Exit (Top)': 'East Death Mountain (Top East)',
'Hookshot Fairy': 'Hookshot Fairy',
'Fairy Ascension Cave (Bottom)': 'Fairy Ascension Cave (Bottom)',
'Fairy Ascension Cave (Top)': 'Fairy Ascension Cave (Top)',
'Fairy Ascension Cave Exit (Bottom)': 'Fairy Ascension Plateau',
'Fairy Ascension Cave Exit (Top)': 'Fairy Ascension Ledge',
'Spiral Cave': 'Spiral Cave (Top)', 'Spiral Cave': 'Spiral Cave (Top)',
'Spiral Cave Exit (Top)': 'Spiral Cave Ledge',
'Spiral Cave (Bottom)': 'Spiral Cave (Bottom)', 'Spiral Cave (Bottom)': 'Spiral Cave (Bottom)',
'Spiral Cave Exit': 'East Death Mountain (Bottom)', 'Spiral Cave Exit': 'East Death Mountain (Bottom)',
'Spiral Cave Exit (Top)': 'Spiral Cave Ledge', 'Mimic Cave': 'Mimic Cave',
'Fairy Ascension Cave (Top)': 'Fairy Ascension Cave (Top)',
'Fairy Ascension Cave Exit (Top)': 'Fairy Ascension Ledge',
'Fairy Ascension Cave (Bottom)': 'Fairy Ascension Cave (Bottom)',
'Fairy Ascension Cave Exit (Bottom)': 'Fairy Ascension Plateau',
'Hookshot Fairy': 'Hookshot Fairy',
'Paradox Cave (Top)': 'Paradox Cave',
'Paradox Cave Exit (Top)': 'East Death Mountain (Top East)',
'Paradox Cave (Middle)': 'Paradox Cave',
'Paradox Cave Exit (Middle)': 'East Death Mountain (Bottom)',
'Paradox Cave (Bottom)': 'Paradox Cave Front',
'Paradox Cave Exit (Bottom)': 'East Death Mountain (Bottom)',
'Death Mountain Return Cave (West)': 'Death Mountain Return Cave (left)',
'Death Mountain Return Cave Exit (West)': 'Mountain Entry Ledge',
'Old Man Cave (West)': 'Old Man Cave Ledge',
'Old Man Cave Exit (West)': 'Mountain Entry Entrance',
'Waterfall of Wishing': 'Waterfall of Wishing',
'Fortune Teller (Light)': 'Fortune Teller (Light)',
'Bonk Rock Cave': 'Bonk Rock Cave',
'Sanctuary': 'Sanctuary Portal',
'Sanctuary Grave': 'Sewer Drop',
'Sanctuary Exit': 'Sanctuary Area',
'Graveyard Cave': 'Graveyard Cave',
'Kings Grave': 'Kings Grave',
'North Fairy Cave Drop': 'North Fairy Cave',
'North Fairy Cave': 'North Fairy Cave',
'North Fairy Cave Exit': 'River Bend Area',
'Potion Shop': 'Potion Shop',
'Kakariko Well Drop': 'Kakariko Well (top)',
'Kakariko Well Cave': 'Kakariko Well (bottom)',
'Kakariko Well Exit': 'Kakariko Area',
'Blinds Hideout': 'Blinds Hideout',
'Elder House (West)': 'Elder House',
'Elder House Exit (West)': 'Kakariko Area',
'Elder House (East)': 'Elder House',
'Elder House Exit (East)': 'Kakariko Area',
'Snitch Lady (West)': 'Snitch Lady (West)',
'Snitch Lady (East)': 'Snitch Lady (East)',
'Chicken House': 'Chicken House',
'Sick Kids House': 'Sick Kids House',
'Bush Covered House': 'Bush Covered House',
'Light World Bomb Hut': 'Light World Bomb Hut',
'Kakariko Shop': 'Kakariko Shop',
'Tavern North': 'Tavern',
'Tavern (Front)': 'Tavern (Front)',
'Hyrule Castle Secret Entrance Drop': 'Hyrule Castle Secret Entrance',
'Hyrule Castle Secret Entrance Stairs': 'Hyrule Castle Secret Entrance',
'Hyrule Castle Secret Entrance Exit': 'Hyrule Castle Courtyard',
'Sahasrahlas Hut': 'Sahasrahlas Hut',
'Blacksmiths Hut': 'Blacksmiths Hut',
'Bat Cave Drop': 'Bat Cave (right)',
'Bat Cave Cave': 'Bat Cave (left)',
'Bat Cave Exit': 'Blacksmith Area',
'Two Brothers House (West)': 'Two Brothers House',
'Two Brothers House Exit (West)': 'Maze Race Ledge',
'Two Brothers House (East)': 'Two Brothers House',
'Two Brothers House Exit (East)': 'Kakariko Suburb Area',
'Library': 'Library',
'Kakariko Gamble Game': 'Kakariko Gamble Game',
'Bonk Fairy (Light)': 'Bonk Fairy (Light)',
'Links House': 'Links House',
'Links House Exit': 'Links House Area',
'Lake Hylia Fairy': 'Lake Hylia Healer Fairy',
'Long Fairy Cave': 'Long Fairy Cave',
'Checkerboard Cave': 'Checkerboard Cave',
'Aginahs Cave': 'Aginahs Cave',
'Cave 45': 'Cave 45',
'Light Hype Fairy': 'Light Hype Fairy',
'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller',
'Lake Hylia Shop': 'Lake Hylia Shop',
'Capacity Upgrade': 'Capacity Upgrade',
'Mini Moldorm Cave': 'Mini Moldorm Cave',
'Ice Rod Cave': 'Ice Rod Cave',
'Good Bee Cave': 'Good Bee Cave',
'20 Rupee Cave': '20 Rupee Cave',
'Desert Fairy': 'Desert Healer Fairy',
'50 Rupee Cave': '50 Rupee Cave',
'Dam': 'Dam',
'Pyramid Fairy': 'Pyramid Fairy', 'Dark Lumberjack Shop': 'Dark Lumberjack Shop',
'East Dark World Hint': 'East Dark World Hint',
'Palace of Darkness Hint': 'Palace of Darkness Hint',
'Big Bomb Shop': 'Big Bomb Shop',
'Dark Lake Hylia Shop': 'Dark Lake Hylia Shop',
'Dark Lake Hylia Fairy': 'Dark Lake Hylia Healer Fairy',
'Dark Lake Hylia Ledge Fairy': 'Dark Lake Hylia Ledge Healer Fairy',
'Dark Lake Hylia Ledge Spike Cave': 'Dark Lake Hylia Ledge Spike Cave',
'Dark Lake Hylia Ledge Hint': 'Dark Lake Hylia Ledge Hint',
'Hype Cave': 'Hype Cave',
'Bonk Fairy (Dark)': 'Bonk Fairy (Dark)',
'Brewery': 'Brewery',
'C-Shaped House': 'C-Shaped House',
'Chest Game': 'Chest Game',
'Dark World Hammer Peg Cave': 'Dark World Hammer Peg Cave',
'Bumper Cave (Bottom)': 'Bumper Cave (bottom)',
'Bumper Cave (Top)': 'Bumper Cave (top)',
'Red Shield Shop': 'Red Shield Shop',
'Dark Sanctuary Hint': 'Dark Sanctuary Hint',
'Fortune Teller (Dark)': 'Fortune Teller (Dark)',
'Dark World Shop': 'Village of Outcasts Shop',
'Dark World Lumberjack Shop': 'Dark World Lumberjack Shop',
'Dark World Potion Shop': 'Dark World Potion Shop',
'Archery Game': 'Archery Game',
'Bumper Cave Exit (Top)': 'Bumper Cave Ledge',
'Bumper Cave Exit (Bottom)': 'Bumper Cave Entrance',
'Mire Shed': 'Mire Shed',
'Dark Desert Hint': 'Dark Desert Hint',
'Dark Desert Fairy': 'Dark Desert Healer Fairy',
'Spike Cave': 'Spike Cave',
'Hookshot Cave': 'Hookshot Cave (Front)',
'Superbunny Cave (Top)': 'Superbunny Cave (Top)',
'Cave Shop (Dark Death Mountain)': 'Cave Shop (Dark Death Mountain)',
'Dark Death Mountain Fairy': 'Dark Death Mountain Healer Fairy', 'Dark Death Mountain Fairy': 'Dark Death Mountain Healer Fairy',
'Superbunny Cave (Bottom)': 'Superbunny Cave (Bottom)', 'Spike Cave': 'Spike Cave',
'Superbunny Cave Exit (Top)': 'East Dark Death Mountain (Top)',
'Superbunny Cave Exit (Bottom)': 'East Dark Death Mountain (Bottom)',
'Hookshot Cave Front Exit': 'East Dark Death Mountain (Top)',
'Hookshot Cave Back Exit': 'Dark Death Mountain Floating Island',
'Hookshot Cave Back Entrance': 'Hookshot Cave (Back)', 'Hookshot Cave Back Entrance': 'Hookshot Cave (Back)',
'Mimic Cave': 'Mimic Cave'} 'Hookshot Cave Back Exit': 'Dark Death Mountain Floating Island',
'Hookshot Cave': 'Hookshot Cave (Front)',
'Hookshot Cave Front Exit': 'East Dark Death Mountain (Top)',
'Superbunny Cave (Top)': 'Superbunny Cave (Top)',
'Superbunny Cave Exit (Top)': 'East Dark Death Mountain (Top)',
'Superbunny Cave (Bottom)': 'Superbunny Cave (Bottom)',
'Superbunny Cave Exit (Bottom)': 'East Dark Death Mountain (Bottom)',
'Dark Death Mountain Shop': 'Dark Death Mountain Shop',
'Bumper Cave (Top)': 'Bumper Cave (top)',
'Bumper Cave Exit (Top)': 'Bumper Cave Ledge',
'Bumper Cave (Bottom)': 'Bumper Cave (bottom)',
'Bumper Cave Exit (Bottom)': 'Bumper Cave Entrance',
'Fortune Teller (Dark)': 'Fortune Teller (Dark)',
'Dark Sanctuary Hint': 'Dark Sanctuary Hint',
'Dark Potion Shop': 'Dark Potion Shop',
'Chest Game': 'Chest Game',
'C-Shaped House': 'C-Shaped House',
'Dark World Shop': 'Village of Outcasts Shop',
'Brewery': 'Brewery',
'Red Shield Shop': 'Red Shield Shop',
'Pyramid Fairy': 'Pyramid Fairy',
'Palace of Darkness Hint': 'Palace of Darkness Hint',
'Hammer Peg Cave': 'Hammer Peg Cave',
'Archery Game': 'Archery Game',
'Bonk Fairy (Dark)': 'Bonk Fairy (Dark)',
'Big Bomb Shop': 'Big Bomb Shop',
'Dark Lake Hylia Fairy': 'Dark Lake Hylia Healer Fairy',
'East Dark World Hint': 'East Dark World Hint',
'Mire Shed': 'Mire Shed',
'Mire Hint': 'Mire Hint',
'Mire Fairy': 'Mire Healer Fairy',
'Hype Cave': 'Hype Cave',
'Dark Lake Hylia Shop': 'Dark Lake Hylia Shop',
'Dark Lake Hylia Ledge Fairy': 'Dark Lake Hylia Ledge Healer Fairy',
'Dark Lake Hylia Ledge Hint': 'Dark Lake Hylia Ledge Hint',
'Dark Lake Hylia Ledge Spike Cave': 'Dark Lake Hylia Ledge Spike Cave'}
open_default_connections = {'Pyramid Hole': 'Pyramid', open_default_connections = {'Pyramid Hole': 'Pyramid',
'Pyramid Exit': 'Pyramid Ledge', 'Pyramid Exit': 'Pyramid Ledge',
@@ -2358,7 +2358,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c
'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000), 0x00), 'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000), 0x00),
'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000), 0x00), 'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000), 0x00),
'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Cave Shop (Lake Hylia)': (0x57, (0x0112, 0x35, 0x0022, 0x0c00, 0x0b1a, 0x0c26, 0x0b98, 0x0c6d, 0x0b9f, 0x00, 0x00, 0x0000, 0x0000), 0x00), 'Lake Hylia Shop': (0x57, (0x0112, 0x35, 0x0022, 0x0c00, 0x0b1a, 0x0c26, 0x0b98, 0x0c6d, 0x0b9f, 0x00, 0x00, 0x0000, 0x0000), 0x00),
'Capacity Upgrade': (0x5C, (0x0115, 0x35, 0x0a46, 0x0d36, 0x0c2a, 0x0d88, 0x0ca8, 0x0da3, 0x0caf, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Capacity Upgrade': (0x5C, (0x0115, 0x35, 0x0a46, 0x0d36, 0x0c2a, 0x0d88, 0x0ca8, 0x0da3, 0x0caf, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Kakariko Well Drop': ([0xDB85C, 0xDB85D], None), 'Kakariko Well Drop': ([0xDB85C, 0xDB85D], None),
'Blacksmiths Hut': (0x63, (0x0121, 0x22, 0x010c, 0x081a, 0x0466, 0x0868, 0x04d8, 0x0887, 0x04e3, 0x06, 0xfa, 0x041A, 0x0000), 0x00), 'Blacksmiths Hut': (0x63, (0x0121, 0x22, 0x010c, 0x081a, 0x0466, 0x0868, 0x04d8, 0x0887, 0x04e3, 0x06, 0xfa, 0x041A, 0x0000), 0x00),
@@ -2401,19 +2401,19 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c
'Brewery': (0x47, (0x0106, 0x58, 0x16a8, 0x08e4, 0x013e, 0x0938, 0x01b8, 0x0953, 0x01c3, 0x0a, 0xf6, 0x1AB6, 0x0000), 0x02), 'Brewery': (0x47, (0x0106, 0x58, 0x16a8, 0x08e4, 0x013e, 0x0938, 0x01b8, 0x0953, 0x01c3, 0x0a, 0xf6, 0x1AB6, 0x0000), 0x02),
'C-Shaped House': (0x53, (0x011c, 0x58, 0x09d8, 0x0744, 0x02ce, 0x0797, 0x0348, 0x07b3, 0x0353, 0x0a, 0xf6, 0x0DE8, 0x0000), 0x00), 'C-Shaped House': (0x53, (0x011c, 0x58, 0x09d8, 0x0744, 0x02ce, 0x0797, 0x0348, 0x07b3, 0x0353, 0x0a, 0xf6, 0x0DE8, 0x0000), 0x00),
'Chest Game': (0x46, (0x0106, 0x58, 0x078a, 0x0705, 0x004e, 0x0758, 0x00c8, 0x0774, 0x00d3, 0x09, 0xf7, 0x0B98, 0x0000), 0x00), 'Chest Game': (0x46, (0x0106, 0x58, 0x078a, 0x0705, 0x004e, 0x0758, 0x00c8, 0x0774, 0x00d3, 0x09, 0xf7, 0x0B98, 0x0000), 0x00),
'Dark World Hammer Peg Cave': (0x7E, (0x0127, 0x62, 0x0894, 0x091e, 0x0492, 0x09a6, 0x0508, 0x098b, 0x050f, 0x00, 0x00, 0x0000, 0x0000), 0x20), 'Hammer Peg Cave': (0x7E, (0x0127, 0x62, 0x0894, 0x091e, 0x0492, 0x09a6, 0x0508, 0x098b, 0x050f, 0x00, 0x00, 0x0000, 0x0000), 0x20),
'Red Shield Shop': (0x74, (0x0110, 0x5a, 0x079a, 0x06e8, 0x04d6, 0x0738, 0x0548, 0x0755, 0x0553, 0x08, 0xf8, 0x0AA8, 0x0000), 0x00), 'Red Shield Shop': (0x74, (0x0110, 0x5a, 0x079a, 0x06e8, 0x04d6, 0x0738, 0x0548, 0x0755, 0x0553, 0x08, 0xf8, 0x0AA8, 0x0000), 0x00),
'Dark Sanctuary Hint': (0x59, (0x0112, 0x53, 0x001e, 0x0400, 0x06e2, 0x0446, 0x0758, 0x046d, 0x075f, 0x00, 0x00, 0x0000, 0x0000), 0x00), 'Dark Sanctuary Hint': (0x59, (0x0112, 0x53, 0x001e, 0x0400, 0x06e2, 0x0446, 0x0758, 0x046d, 0x075f, 0x00, 0x00, 0x0000, 0x0000), 0x00),
'Fortune Teller (Dark)': (0x65, (0x0122, 0x51, 0x0610, 0x04b4, 0x027e, 0x0507, 0x02f8, 0x0523, 0x0303, 0x0a, 0xf6, 0x091E, 0x0000), 0x00), 'Fortune Teller (Dark)': (0x65, (0x0122, 0x51, 0x0610, 0x04b4, 0x027e, 0x0507, 0x02f8, 0x0523, 0x0303, 0x0a, 0xf6, 0x091E, 0x0000), 0x00),
'Dark World Shop': (0x5F, (0x010f, 0x58, 0x1058, 0x0814, 0x02be, 0x0868, 0x0338, 0x0883, 0x0343, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark World Shop': (0x5F, (0x010f, 0x58, 0x1058, 0x0814, 0x02be, 0x0868, 0x0338, 0x0883, 0x0343, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Dark World Lumberjack Shop': (0x56, (0x010f, 0x42, 0x041c, 0x0074, 0x04e2, 0x00c7, 0x0558, 0x00e3, 0x055f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark Lumberjack Shop': (0x56, (0x010f, 0x42, 0x041c, 0x0074, 0x04e2, 0x00c7, 0x0558, 0x00e3, 0x055f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Dark World Potion Shop': (0x6E, (0x010f, 0x56, 0x080e, 0x04f4, 0x0c66, 0x0548, 0x0cd8, 0x0563, 0x0ce3, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark Potion Shop': (0x6E, (0x010f, 0x56, 0x080e, 0x04f4, 0x0c66, 0x0548, 0x0cd8, 0x0563, 0x0ce3, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Archery Game': (0x58, (0x0111, 0x69, 0x069e, 0x0ac4, 0x02ea, 0x0b18, 0x0368, 0x0b33, 0x036f, 0x0a, 0xf6, 0x09AC, 0x0000), 0x00), 'Archery Game': (0x58, (0x0111, 0x69, 0x069e, 0x0ac4, 0x02ea, 0x0b18, 0x0368, 0x0b33, 0x036f, 0x0a, 0xf6, 0x09AC, 0x0000), 0x00),
'Mire Shed': (0x5E, (0x010d, 0x70, 0x0384, 0x0c69, 0x001e, 0x0cb6, 0x0098, 0x0cd6, 0x00a3, 0x07, 0xf9, 0x0000, 0x0000), 0x00), 'Mire Shed': (0x5E, (0x010d, 0x70, 0x0384, 0x0c69, 0x001e, 0x0cb6, 0x0098, 0x0cd6, 0x00a3, 0x07, 0xf9, 0x0000, 0x0000), 0x00),
'Dark Desert Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000), 0x00), 'Mire Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000), 0x00),
'Dark Desert Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000), 0x00), 'Mire Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000), 0x00),
'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Cave Shop (Dark Death Mountain)': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00), 'Dark Death Mountain Shop': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000), 0x00), 'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Mimic Cave': (0x4E, (0x010c, 0x05, 0x07e0, 0x0103, 0x0d00, 0x0156, 0x0d78, 0x0172, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00), 'Mimic Cave': (0x4E, (0x010c, 0x05, 0x07e0, 0x0103, 0x0d00, 0x0156, 0x0d78, 0x0172, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Big Bomb Shop': (0x52, (0x011c, 0x6c, 0x0506, 0x0a9a, 0x0832, 0x0ae7, 0x08b8, 0x0b07, 0x08bf, 0x06, 0xfa, 0x0816, 0x0000), 0x00), 'Big Bomb Shop': (0x52, (0x011c, 0x6c, 0x0506, 0x0a9a, 0x0832, 0x0ae7, 0x08b8, 0x0b07, 0x08bf, 0x06, 0xfa, 0x0816, 0x0000), 0x00),
@@ -2493,11 +2493,11 @@ exit_ids = {'Links House Exit': (0x01, 0x00),
'Bonk Fairy (Light)': 0x71, 'Bonk Fairy (Light)': 0x71,
'Bonk Fairy (Dark)': 0x71, 'Bonk Fairy (Dark)': 0x71,
'Lake Hylia Healer Fairy': 0x5E, 'Lake Hylia Healer Fairy': 0x5E,
'Swamp Healer Fairy': 0x5E, 'Light Hype Fairy': 0x5E,
'Desert Healer Fairy': 0x5E, 'Desert Healer Fairy': 0x5E,
'Dark Lake Hylia Healer Fairy': 0x5E, 'Dark Lake Hylia Healer Fairy': 0x5E,
'Dark Lake Hylia Ledge Healer Fairy': 0x5E, 'Dark Lake Hylia Ledge Healer Fairy': 0x5E,
'Dark Desert Healer Fairy': 0x5E, 'Mire Healer Fairy': 0x5E,
'Dark Death Mountain Healer Fairy': 0x5E, 'Dark Death Mountain Healer Fairy': 0x5E,
'Fortune Teller (Light)': 0x65, 'Fortune Teller (Light)': 0x65,
'Lake Hylia Fortune Teller': 0x65, 'Lake Hylia Fortune Teller': 0x65,
@@ -2506,8 +2506,8 @@ exit_ids = {'Links House Exit': (0x01, 0x00),
'Chicken House': 0x4B, 'Chicken House': 0x4B,
'Aginahs Cave': 0x4D, 'Aginahs Cave': 0x4D,
'Sahasrahlas Hut': 0x45, 'Sahasrahlas Hut': 0x45,
'Cave Shop (Lake Hylia)': 0x58, 'Lake Hylia Shop': 0x58,
'Cave Shop (Dark Death Mountain)': 0x58, 'Dark Death Mountain Shop': 0x58,
'Capacity Upgrade': 0x5D, 'Capacity Upgrade': 0x5D,
'Blacksmiths Hut': 0x64, 'Blacksmiths Hut': 0x64,
'Sick Kids House': 0x40, 'Sick Kids House': 0x40,
@@ -2538,21 +2538,21 @@ exit_ids = {'Links House Exit': (0x01, 0x00),
'Big Bomb Shop': 0x53, 'Big Bomb Shop': 0x53,
'Village of Outcasts Shop': 0x60, 'Village of Outcasts Shop': 0x60,
'Dark Lake Hylia Shop': 0x60, 'Dark Lake Hylia Shop': 0x60,
'Dark World Lumberjack Shop': 0x60, 'Dark Lumberjack Shop': 0x60,
'Dark World Potion Shop': 0x60, 'Dark Potion Shop': 0x60,
'Dark Lake Hylia Ledge Spike Cave': 0x70, 'Dark Lake Hylia Ledge Spike Cave': 0x70,
'Dark Lake Hylia Ledge Hint': 0x6A, 'Dark Lake Hylia Ledge Hint': 0x6A,
'Hype Cave': 0x3D, 'Hype Cave': 0x3D,
'Brewery': 0x48, 'Brewery': 0x48,
'C-Shaped House': 0x54, 'C-Shaped House': 0x54,
'Chest Game': 0x47, 'Chest Game': 0x47,
'Dark World Hammer Peg Cave': 0x83, 'Hammer Peg Cave': 0x83,
'Red Shield Shop': 0x57, 'Red Shield Shop': 0x57,
'Dark Sanctuary Hint': 0x5A, 'Dark Sanctuary Hint': 0x5A,
'Fortune Teller (Dark)': 0x66, 'Fortune Teller (Dark)': 0x66,
'Archery Game': 0x59, 'Archery Game': 0x59,
'Mire Shed': 0x5F, 'Mire Shed': 0x5F,
'Dark Desert Hint': 0x62, 'Mire Hint': 0x62,
'Spike Cave': 0x41, 'Spike Cave': 0x41,
'Mimic Cave': 0x4F, 'Mimic Cave': 0x4F,
'Kakariko Well (top)': 0x80, 'Kakariko Well (top)': 0x80,
+4 -4
View File
@@ -3,10 +3,10 @@ from DoorShuffle import link_doors
from Doors import create_doors from Doors import create_doors
from Dungeons import create_dungeons, get_dungeon_item_pool from Dungeons import create_dungeons, get_dungeon_item_pool
from OverworldShuffle import link_overworld from OverworldShuffle import link_overworld
from EntranceShuffle import link_inverted_entrances from EntranceShuffle import link_entrances
from ItemList import generate_itempool, difficulties from ItemList import generate_itempool, difficulties
from Items import ItemFactory from Items import ItemFactory
from Regions import create_regions, mark_light_world_regions, create_dungeon_regions, create_shops from Regions import create_regions, mark_light_dark_world_regions, create_dungeon_regions, create_shops
from RoomData import create_rooms from RoomData import create_rooms
from Rules import set_rules from Rules import set_rules
from test.TestBase import TestBase from test.TestBase import TestBase
@@ -25,7 +25,7 @@ class TestInverted(TestBase):
create_rooms(self.world, 1) create_rooms(self.world, 1)
create_dungeons(self.world, 1) create_dungeons(self.world, 1)
link_overworld(self.world, 1) link_overworld(self.world, 1)
link_inverted_entrances(self.world, 1) link_entrances(self.world, 1)
link_doors(self.world, 1) link_doors(self.world, 1)
generate_itempool(self.world, 1) generate_itempool(self.world, 1)
self.world.required_medallions[1] = ['Ether', 'Quake'] self.world.required_medallions[1] = ['Ether', 'Quake']
@@ -33,5 +33,5 @@ class TestInverted(TestBase):
self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1))
self.world.get_location('Agahnim 1', 1).item = None self.world.get_location('Agahnim 1', 1).item = None
self.world.get_location('Agahnim 2', 1).item = None self.world.get_location('Agahnim 2', 1).item = None
mark_light_world_regions(self.world, 1) mark_light_dark_world_regions(self.world, 1)
set_rules(self.world, 1) set_rules(self.world, 1)
+3 -2
View File
@@ -4,6 +4,7 @@ from BaseClasses import World
from Dungeons import create_dungeons from Dungeons import create_dungeons
from EntranceShuffle import connect_entrance, Inverted_LW_Entrances, Inverted_LW_Dungeon_Entrances, Inverted_LW_Single_Cave_Doors, Inverted_Old_Man_Entrances, Inverted_DW_Entrances, Inverted_DW_Dungeon_Entrances, Inverted_DW_Single_Cave_Doors, \ from EntranceShuffle import connect_entrance, Inverted_LW_Entrances, Inverted_LW_Dungeon_Entrances, Inverted_LW_Single_Cave_Doors, Inverted_Old_Man_Entrances, Inverted_DW_Entrances, Inverted_DW_Dungeon_Entrances, Inverted_DW_Single_Cave_Doors, \
Inverted_LW_Entrances_Must_Exit, Inverted_LW_Dungeon_Entrances_Must_Exit, Inverted_Bomb_Shop_Multi_Cave_Doors, Inverted_Bomb_Shop_Single_Cave_Doors, Inverted_Blacksmith_Single_Cave_Doors, Inverted_Blacksmith_Multi_Cave_Doors Inverted_LW_Entrances_Must_Exit, Inverted_LW_Dungeon_Entrances_Must_Exit, Inverted_Bomb_Shop_Multi_Cave_Doors, Inverted_Bomb_Shop_Single_Cave_Doors, Inverted_Blacksmith_Single_Cave_Doors, Inverted_Blacksmith_Multi_Cave_Doors
from Regions import create_regions
from ItemList import difficulties from ItemList import difficulties
from Rules import set_inverted_big_bomb_rules from Rules import set_inverted_big_bomb_rules
from test.inverted.TestInverted import TestInverted from test.inverted.TestInverted import TestInverted
@@ -20,7 +21,7 @@ class TestInvertedBombRules(TestInverted):
entrance = self.world.get_entrance(entrance_name, 1) entrance = self.world.get_entrance(entrance_name, 1)
entrance.connected_region = None entrance.connected_region = None
self.world.get_region('Big Bomb Shop', 1).entrances = [] self.world.get_region('Big Bomb Shop', 1).entrances = []
connect_entrance(self.world, entrance, 'Links House', 1) connect_entrance(self.world, entrance, 'Big Bomb Shop', 1)
set_inverted_big_bomb_rules(self.world, 1) set_inverted_big_bomb_rules(self.world, 1)
entrance.connected_region.entrances.remove(entrance) entrance.connected_region.entrances.remove(entrance)
entrance.connected_region = None entrance.connected_region = None
@@ -35,7 +36,7 @@ class TestInvertedBombRules(TestInverted):
for entrance_name in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']: for entrance_name in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']:
entrance = self.world.get_entrance(entrance_name, 1) entrance = self.world.get_entrance(entrance_name, 1)
self.world.get_region('Big Bomb Shop', 1).entrances = [] self.world.get_region('Big Bomb Shop', 1).entrances = []
connect_entrance(self.world, entrance, 'Links House', 1) connect_entrance(self.world, entrance, 'Big Bomb Shop', 1)
with self.assertRaises(Exception): with self.assertRaises(Exception):
set_inverted_big_bomb_rules(self.world, 1) set_inverted_big_bomb_rules(self.world, 1)
entrance.connected_region.entrances.remove(entrance) entrance.connected_region.entrances.remove(entrance)
+20 -22
View File
@@ -49,16 +49,15 @@ class TestEntrances(TestInverted):
["Tower of Hera", True, ["Moon Pearl", "Hammer", "Hookshot", "Progressive Glove", "Ocarina"]], ["Tower of Hera", True, ["Moon Pearl", "Hammer", "Hookshot", "Progressive Glove", "Ocarina"]],
["Tower of Hera", True, ["Moon Pearl", "Hammer", "Beat Agahnim 1", "Ocarina", "Hookshot"]], ["Tower of Hera", True, ["Moon Pearl", "Hammer", "Beat Agahnim 1", "Ocarina", "Hookshot"]],
# Agahnim's Tower (Inverted) ["Agahnims Tower", False, []],
["Ganons Tower", False, []], ["Agahnims Tower", False, [], ["Ocarina", "Lamp"]],
["Ganons Tower", False, [], ["Ocarina", "Lamp"]], ["Agahnims Tower", False, [], ["Ocarina", "Progressive Glove"]],
["Ganons Tower", False, [], ["Ocarina", "Progressive Glove"]], ["Agahnims Tower", False, [], ["Moon Pearl", "Lamp"]],
["Ganons Tower", False, [], ["Moon Pearl", "Lamp"]], ["Agahnims Tower", False, [], ["Moon Pearl", "Progressive Glove"]],
["Ganons Tower", False, [], ["Moon Pearl", "Progressive Glove"]], ["Agahnims Tower", True, ["Lamp", "Progressive Glove"]],
["Ganons Tower", True, ["Lamp", "Progressive Glove"]], ["Agahnims Tower", True, ["Ocarina", "Beat Agahnim 1", "Moon Pearl"]],
["Ganons Tower", True, ["Ocarina", "Beat Agahnim 1", "Moon Pearl"]], ["Agahnims Tower", True, ["Ocarina", "Progressive Glove", "Progressive Glove", "Moon Pearl"]],
["Ganons Tower", True, ["Ocarina", "Progressive Glove", "Progressive Glove", "Moon Pearl"]], ["Agahnims Tower", True, ["Ocarina", "Progressive Glove", "Hammer", "Moon Pearl"]],
["Ganons Tower", True, ["Ocarina", "Progressive Glove", "Hammer", "Moon Pearl"]],
["Palace of Darkness", False, []], ["Palace of Darkness", False, []],
["Palace of Darkness", False, [], ["Hammer", "Flippers", "Magic Mirror", "Ocarina"]], ["Palace of Darkness", False, [], ["Hammer", "Flippers", "Magic Mirror", "Ocarina"]],
@@ -105,16 +104,15 @@ class TestEntrances(TestInverted):
["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Hammer", "Moon Pearl", "Ocarina"]], ["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Hammer", "Moon Pearl", "Ocarina"]],
["Turtle Rock", True, ["Quake", "Progressive Sword", "Beat Agahnim 1", "Moon Pearl", "Ocarina"]], ["Turtle Rock", True, ["Quake", "Progressive Sword", "Beat Agahnim 1", "Moon Pearl", "Ocarina"]],
# Ganon's Tower (Inverted) ["Ganons Tower", False, []],
["Agahnims Tower", False, []], ["Ganons Tower", False, [], ["Crystal 1"]],
["Agahnims Tower", False, [], ["Crystal 1"]], ["Ganons Tower", False, [], ["Crystal 2"]],
["Agahnims Tower", False, [], ["Crystal 2"]], ["Ganons Tower", False, [], ["Crystal 3"]],
["Agahnims Tower", False, [], ["Crystal 3"]], ["Ganons Tower", False, [], ["Crystal 4"]],
["Agahnims Tower", False, [], ["Crystal 4"]], ["Ganons Tower", False, [], ["Crystal 5"]],
["Agahnims Tower", False, [], ["Crystal 5"]], ["Ganons Tower", False, [], ["Crystal 6"]],
["Agahnims Tower", False, [], ["Crystal 6"]], ["Ganons Tower", False, [], ["Crystal 7"]],
["Agahnims Tower", False, [], ["Crystal 7"]], ["Ganons Tower", True, ["Beat Agahnim 1", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]],
["Agahnims Tower", True, ["Beat Agahnim 1", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], ["Ganons Tower", True, ["Moon Pearl", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]],
["Agahnims Tower", True, ["Moon Pearl", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], ["Ganons Tower", True, ["Moon Pearl", "Hammer", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]],
["Agahnims Tower", True, ["Moon Pearl", "Hammer", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]],
]) ])
+4 -4
View File
@@ -3,11 +3,11 @@ from DoorShuffle import link_doors
from Doors import create_doors from Doors import create_doors
from Dungeons import create_dungeons, get_dungeon_item_pool from Dungeons import create_dungeons, get_dungeon_item_pool
from OverworldShuffle import link_overworld from OverworldShuffle import link_overworld
from EntranceShuffle import link_inverted_entrances from EntranceShuffle import link_entrances
from ItemList import generate_itempool, difficulties from ItemList import generate_itempool, difficulties
from Items import ItemFactory from Items import ItemFactory
from OverworldGlitchRules import create_owg_connections from OverworldGlitchRules import create_owg_connections
from Regions import create_regions, mark_light_world_regions, create_dungeon_regions, create_shops from Regions import create_regions, mark_light_dark_world_regions, create_dungeon_regions, create_shops
from RoomData import create_rooms from RoomData import create_rooms
from Rules import set_rules from Rules import set_rules
from test.TestBase import TestBase from test.TestBase import TestBase
@@ -27,7 +27,7 @@ class TestInvertedOWG(TestBase):
create_dungeons(self.world, 1) create_dungeons(self.world, 1)
link_overworld(self.world, 1) link_overworld(self.world, 1)
create_owg_connections(self.world, 1) create_owg_connections(self.world, 1)
link_inverted_entrances(self.world, 1) link_entrances(self.world, 1)
link_doors(self.world, 1) link_doors(self.world, 1)
generate_itempool(self.world, 1) generate_itempool(self.world, 1)
self.world.required_medallions[1] = ['Ether', 'Quake'] self.world.required_medallions[1] = ['Ether', 'Quake']
@@ -37,5 +37,5 @@ class TestInvertedOWG(TestBase):
self.world.get_location('Agahnim 2', 1).item = None self.world.get_location('Agahnim 2', 1).item = None
self.world.precollected_items.clear() self.world.precollected_items.clear()
self.world.itempool.append(ItemFactory('Pegasus Boots', 1)) self.world.itempool.append(ItemFactory('Pegasus Boots', 1))
mark_light_world_regions(self.world, 1) mark_light_dark_world_regions(self.world, 1)
set_rules(self.world, 1) set_rules(self.world, 1)
+2 -2
View File
@@ -7,7 +7,7 @@ from EntranceShuffle import link_entrances
from ItemList import difficulties, generate_itempool from ItemList import difficulties, generate_itempool
from Items import ItemFactory from Items import ItemFactory
from OverworldGlitchRules import create_owg_connections from OverworldGlitchRules import create_owg_connections
from Regions import create_regions, create_dungeon_regions, create_shops, mark_dark_world_regions from Regions import create_regions, create_dungeon_regions, create_shops, mark_light_dark_world_regions
from RoomData import create_rooms from RoomData import create_rooms
from Rules import set_rules from Rules import set_rules
from test.TestBase import TestBase from test.TestBase import TestBase
@@ -37,5 +37,5 @@ class TestVanillaOWG(TestBase):
self.world.get_location('Agahnim 2', 1).item = None self.world.get_location('Agahnim 2', 1).item = None
self.world.precollected_items.clear() self.world.precollected_items.clear()
self.world.itempool.append(ItemFactory('Pegasus Boots', 1)) self.world.itempool.append(ItemFactory('Pegasus Boots', 1))
mark_dark_world_regions(self.world, 1) mark_light_dark_world_regions(self.world, 1)
set_rules(self.world, 1) set_rules(self.world, 1)
+1
View File
@@ -104,6 +104,7 @@ def test_loop(tests, entrance_set, exit_set, ctr, shuffle_mode, main_mode, links
{}, {}, {}, {}, {}, True, {}, [], {}) {}, {}, {}, {}, {}, True, {}, [], {})
world.customizer = False world.customizer = False
world.shufflelinks = {1: links} world.shufflelinks = {1: links}
world.shuffletavern = {1: False}
create_regions(world, 1) create_regions(world, 1)
create_dungeon_regions(world, 1) create_dungeon_regions(world, 1)
# print(f'Linking seed {seed}') # print(f'Linking seed {seed}')
+2 -2
View File
@@ -6,7 +6,7 @@ from OverworldShuffle import link_overworld
from EntranceShuffle import link_entrances from EntranceShuffle import link_entrances
from ItemList import difficulties, generate_itempool from ItemList import difficulties, generate_itempool
from Items import ItemFactory from Items import ItemFactory
from Regions import create_regions, create_dungeon_regions, create_shops, mark_dark_world_regions from Regions import create_regions, create_dungeon_regions, create_shops, mark_light_dark_world_regions
from RoomData import create_rooms from RoomData import create_rooms
from Rules import set_rules from Rules import set_rules
from test.TestBase import TestBase from test.TestBase import TestBase
@@ -33,5 +33,5 @@ class TestVanilla(TestBase):
self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1))
self.world.get_location('Agahnim 1', 1).item = None self.world.get_location('Agahnim 1', 1).item = None
self.world.get_location('Agahnim 2', 1).item = None self.world.get_location('Agahnim 2', 1).item = None
mark_dark_world_regions(self.world, 1) mark_light_dark_world_regions(self.world, 1)
set_rules(self.world, 1) set_rules(self.world, 1)