maybe broken stuff oh boy

This commit is contained in:
qadan 2020-02-08 12:29:55 -04:00
parent bcb509937a
commit c20fe90c0f
4 changed files with 264 additions and 173 deletions

View File

@ -2922,6 +2922,7 @@ mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia Central
('Spiral Cave Mirror Spot', 'Spiral Cave Ledge'), ('Spiral Cave Mirror Spot', 'Spiral Cave Ledge'),
('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'), ('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'),
('Cave 45 Mirror Spot', 'Cave 45 Ledge'), ('Cave 45 Mirror Spot', 'Cave 45 Ledge'),
('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge')
('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'),
('Swamp Palace Moat', 'Swamp Palace (First Room)'), ('Swamp Palace Moat', 'Swamp Palace (First Room)'),

195
OWGSets.py Normal file
View File

@ -0,0 +1,195 @@
class OWGSets(self):
'''
Helper class to deliver entrance/exit/region sets to OWG rules.
'''
def get_immediately_accessible_entrances(self):
'''
Entrances that are available with no items at all.
At this point, these are fake flipper spots.
'''
return [
'Hobo Bridge',
'Zoras River',
'Lake Hylia Island Mirror Spot',
'Capacity Upgrade',
]
def get_lw_boots_accessible_entrances(self, world, player):
'''
Light World entrances that can be accessed with boots clips.
'''
entrances = [
'Bat Cave Drop Ledge',
'Desert Ledge Return Rocks',
'Desert Palace Entrance (West)',
'Desert Palace Entrance (North)',
'Flute Spot 1',
'Broken Bridge (East)',
'Death Mountain Drop',
'Old Man Cave (East)',
'Old Man House (Bottom)',
'Old Man House (Top)',
'Death Mountain Return Cave (East)',
'Spectacle Rock Cave',
'Spectacle Rock Cave Peak',
'Spectacle Rock Cave (Bottom)',
'Spectacle Rock Mirror Spot',
'Broken Bridge (West)',
'Broken Bridge (East)',
'East Death Mountain Drop',
'Spiral Cave Ledge Drop',
'Fairy Ascension Drop',
'Fairy Ascension Cave (Bottom)',
'East Death Mountain (Top)',
'Death Mountain (Top)',
'Spectacle Rock Drop',
'Death Mountain Return Cave (West)',
'Paradox Cave (Bottom)',
'Paradox Cave (Middle)',
'Hookshot Fairy',
'Spiral Cave (Bottom)',
'Paradox Cave (Top)',
'Spiral Cave Ledge Access',
'Fairy Ascension Ledge',
'Cave 45 Mirror Spot',
'Graveyard Ledge Mirror Spot',
'Bumper Cave Ledge Mirror Spot',
'Desert Ledge (Northeast) Mirror Spot',
'Desert Ledge Mirror Spot',
'Desert Palace Entrance (North) Mirror Spot',
'East Death Mountain (Top) Mirror Spot',
'Spiral Cave Mirror Spot',
'Fairy Ascension Mirror Spot',
'Floating Island Mirror Spot',
]
if world.mode[player] != 'inverted':
entrances.append('Cave 45')
entrances.append('Graveyard Cave')
return entrances
def get_lw_boots_accessible_locations(self):
'''
Light World locations that can be reached using boots clips.
'''
return [
'Lake Hylia Island',
'Desert Ledge',
'Spectacle Rock',
'Floating Island',
]
def get_dw_boots_accessible_entrances(self):
'''
Dark World entrances that can be accessed with boots clips.
'''
return [
'Northeast Dark World Broken Bridge Pass',
'Peg Area Rocks',
'Grassy Lawn Pegs',
'West Dark World Gap',
'Bumper Cave Ledge Drop',
'Turtle Rock Drop',
'Floating Island Drop',
'Dark Death Mountain Drop (East)',
'Village of Outcasts Drop',
'Dark Lake Hylia Ledge',
'Hype Cave',
'Dark World Potion Shop',
'Big Bomb Shop',
'Archery Game',
'Brewery',
'C-Shaped House',
'Chest Game',
'Thieves Town',
'Kings Grave Mirror Spot',
'Bumper Cave Entrance Rock',
'Red Shield Shop',
'Dark Sanctuary Hint',
'Fortune Teller (Dark)',
'Dark World Lumberjack Shop',
'Misery Mire',
'Mire Shed',
'Dark Desert Hint',
'Dark Desert Fairy',
]
def get_dw_boots_accessible_locations(self):
'''
Dark World locations accessible using boots clips.
'''
return [
'Catfish',
'Dark Blacksmith Ruins',
'Bumper Cave Ledge',
]
def get_dw_bunny_inaccessible_locations(self):
'''
Locations that the bunny cannot access.
'''
return [
'Thieves Town',
'Graveyard Ledge Mirror Spot',
'Kings Grave Mirror Spot',
'Bumper Cave Entrance Rock',
'Brewery',
'Village of Outcasts Pegs',
'Village of Outcasts Eastern Rocks',
'Dark Lake Hylia Drop (South)',
'Hype Cave',
'Village of Outcasts Heavy Rock',
'East Dark World Bridge',
'Bonk Fairy (Dark)',
]
def get_dmd_and_bunny_regions(self):
'''
Dark World regions accessible using Link and Bunny DMD methods.
'''
return [
'West Dark World',
'South Dark World',
'Northeast Dark World',
]
def get_dmd_non_bunny_regions(self):
'''
Dark World regions accessible using only Link DMD methods.
'''
return [
'Dark Desert',
'East Dark World',
]
def get_mirror_hookshot_accessible_dw_locations(self, world, player):
'''
Locations accessible potentially using weird mirror hookshot boots setups.
'''
locations = [
'Pyramid Fairy',
'Pyramid Entrance',
'Pyramid Drop',
]
locations.extend(world.get_region('Dark Death Mountain Ledge', player).locations)
return locations
def sword_required_superbunny_mirror_regions(self):
'''
Cave regions that superbunny can get through - but only with a sword.
'''
return [
'Mini Moldorm Cave',
'Spiral Cave (Top)',
]

View File

@ -156,8 +156,9 @@ def create_regions(world, player):
create_dw_region(player, 'Northeast Dark World', ['Catfish'], ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass']), create_dw_region(player, 'Northeast Dark World', ['Catfish'], ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass']),
create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'), create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'),
create_cave_region(player, 'East Dark World Hint', 'a storyteller'), create_cave_region(player, 'East Dark World Hint', 'a storyteller'),
create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game', 'Bombos Tablet'], ['Dark Lake Hylia Drop (South)', 'Hype Cave', 'Swamp Palace', 'Village of Outcasts Heavy Rock', 'Maze Race Mirror Spot', create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game'], ['Dark Lake Hylia Drop (South)', 'Hype Cave', 'Swamp Palace', 'Village of Outcasts Heavy Rock', 'Maze Race Mirror Spot',
'Cave 45 Mirror Spot', 'East Dark World Bridge', 'Big Bomb Shop', 'Archery Game', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Shop']), 'Cave 45 Mirror Spot', 'East Dark World Bridge', 'Big Bomb Shop', 'Archery Game', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Shop', 'Bombos Tablet Mirror Spot']),
create_lw_region(player, 'Bombos Tablet Ledge', ['Bombos Tablet'])
create_cave_region(player, 'Big Bomb Shop', 'the bomb shop'), create_cave_region(player, 'Big Bomb Shop', 'the bomb shop'),
create_cave_region(player, 'Archery Game', 'a game of skill'), create_cave_region(player, 'Archery Game', 'a game of skill'),
create_dw_region(player, 'Dark Lake Hylia', None, ['Lake Hylia Island Mirror Spot', 'East Dark World Pier', 'Dark Lake Hylia Ledge']), create_dw_region(player, 'Dark Lake Hylia', None, ['Lake Hylia Island Mirror Spot', 'East Dark World Pier', 'Dark Lake Hylia Ledge']),

236
Rules.py
View File

@ -1,5 +1,6 @@
import collections import collections
import logging import logging
import OWGSets
from BaseClasses import CollectionState from BaseClasses import CollectionState
@ -405,7 +406,7 @@ def default_rules(world, player):
set_rule(world.get_entrance('Hyrule Castle Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Hyrule Castle Ledge Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Hyrule Castle Main Gate', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Hyrule Castle Main Gate', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: (state.has_Pearl(player) and state.has('Flippers', player) or state.has_Mirror(player))) # Overworld Bunny Revival set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: (state.has_Pearl(player) and state.has('Flippers', player) or state.has_Mirror(player))) # Overworld Bunny Revival
set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player) and state.has_Mirror(player)) set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
set_rule(world.get_entrance('Dark Lake Hylia Drop (South)', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # ToDo any fake flipper set up? set_rule(world.get_entrance('Dark Lake Hylia Drop (South)', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # ToDo any fake flipper set up?
set_rule(world.get_entrance('Dark Lake Hylia Ledge Fairy', player), lambda state: state.has_Pearl(player)) # bomb required set_rule(world.get_entrance('Dark Lake Hylia Ledge Fairy', player), lambda state: state.has_Pearl(player)) # bomb required
set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player))
@ -418,6 +419,7 @@ def default_rules(world, player):
set_rule(world.get_entrance('Skull Woods Second Section Hole', player), lambda state: state.has_Pearl(player)) # bunny cannot lift bush set_rule(world.get_entrance('Skull Woods Second Section Hole', player), lambda state: state.has_Pearl(player)) # bunny cannot lift bush
set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Cave 45 Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Cave 45 Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Bombos Tablet Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('East Dark World Bridge', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) set_rule(world.get_entrance('East Dark World Bridge', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player))
set_rule(world.get_entrance('Lake Hylia Island Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player) and state.has('Flippers', player)) set_rule(world.get_entrance('Lake Hylia Island Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player) and state.has('Flippers', player))
set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player))
@ -714,117 +716,68 @@ def add_conditional_lamps(world, player):
def overworld_glitches_rules(world, player): def overworld_glitches_rules(world, player):
# spots that are immediately accessible due to fake flippering # @TODO: Waterfall fairy and Zora ledge could use some logic to determine
set_rule(world.get_entrance('Hobo Bridge', player), lambda state: True) # if we can water walk and/or stored water walk in; currently it's omitted
set_rule(world.get_entrance('Zoras River', player), lambda state: True) # in case no interiors provide a water walk, but one could be kicking
set_rule(world.get_entrance('Lake Hylia Island Mirror Spot', player), lambda state: True) # around. We could detect a path to determine if one can be stored.
set_rule(world.get_entrance('Capacity Upgrade', player), lambda state: True)
# boots-accessible stuff # Spots that are immediately accessible.
lw_boots_accessible_entrances = [ for entrance in OWGSets.get_immediately_accessible_entrances():
'Bat Cave Drop Ledge', set_rule(world.get_entrance(entrance, player), lambda state: True)
'Desert Ledge Return Rocks',
'Desert Palace Entrance (West)', # Boots-accessible locations.
'Desert Palace Entrance (North)', needs_boots = lambda state: state.has_Boots(player)
'Flute Spot 1', needs_boots_and_pearl = lambda state: state.has_Boots(player) and state.has_Pearl(player)
'Broken Bridge (East)', for entrance in OWGSets.get_lw_boots_accessible_entrances(world, player):
'Death Mountain Drop', add_rule(world.get_entrance(entrance, player), needs_boots_and_pearl if world.mode[player] == 'inverted' else needs_boots, 'or')
'Old Man Cave (East)', for location in OWGSets.get_lw_boots_accessible_locations():
'Old Man House (Bottom)', add_rule(world.get_location(location, player), needs_boots_and_pearl if world.mode[player] == 'inverted' else needs_boots, 'or')
'Old Man House (Top)', for entrance in OWGSets.get_dw_boots_accessible_entrances():
'Death Mountain Return Cave (East)', add_rule(world.get_entrance(entrance, player), needs_boots_and_pearl if world.mode[player] != 'inverted' else needs_boots, 'or')
'Spectacle Rock Cave', for location in OWGSets.get_dw_boots_accessible_locations():
'Spectacle Rock Cave Peak', add_rule(world.get_location(location, player), needs_boots_and_pearl if world.mode[player] != 'inverted' else needs_boots, 'or')
'Spectacle Rock Cave (Bottom)',
'Spectacle Rock Mirror Spot', # Boots-accessible regions due to DMD.
'Broken Bridge (West)', if world.mode[player] != 'inverted':
'Broken Bridge (East)', # DMD with and without bunny.
'East Death Mountain Drop', can_bunny_dmd = lambda state: world.get_region('Death Mountain').can_reach(state, player) and state.has_Mirror(player)
'Spiral Cave Ledge Drop', for dmd_bunny_region in OWGSets.get_dmd_and_bunny_regions():
'Fairy Ascension Drop', region = world.get_region(dmd_bunny_region, player)
'Fairy Ascension Cave (Bottom)', region.can_reach_private = lambda state: region.can_reach(state) or (needs_boots_and_pearl or can_bunny_dmd)
'East Death Mountain (Top)', for non_dmd_bunny_region in OWGSets.get_dmd_non_bunny_regions():
'Death Mountain (Top)', region = world.get_region(non_dmd_bunny_region, player)
'Spectacle Rock Drop', region.can_reach_private = lambda state: region.can_reach(state) or (needs_boots_and_pearl)
'Death Mountain Return Cave (West)', edmb = world.get_region('Dark Death Mountain (East Bottom)', player)
'Paradox Cave (Bottom)', edmb.can_reach_private = lambda state: edmb.can_reach(state) or can_bunny_dmd
'Paradox Cave (Middle)',
'Hookshot Fairy', # Set up some mirror-accessible DW entrances.
'Spiral Cave (Bottom)', boots_and_mirror = lambda state: state.has_Boots(player) and state.has_Mirror(player)
'Paradox Cave (Top)', for spot in world.get_region('West Dark World', player).exits + world.get_region('South Dark World', player).exits:
'Spiral Cave Ledge Access', if spot.name not in OWGSets.get_dw_bunny_inaccessible_locations():
'Fairy Ascension Ledge', add_rule(world.get_entrance(spot, player), boots_and_mirror, 'or')
'Cave 45 Mirror Spot', for spot in world.get_region('Dark Death Mountain (East Bottom)', player).locations:
'Graveyard Ledge Mirror Spot', add_rule(world.get_location(spot, player), boots_and_mirror, 'or')
'Bumper Cave Ledge Mirror Spot', # DW entrances accessible with mirror and hookshot.
'Desert Ledge (Northeast) Mirror Spot', for spot in OWGSets.get_mirror_hookshot_accessible_dw_locations(world, player):
'Desert Ledge Mirror Spot', add_rule(world.get_entrance(spot, player), lambda state: state.has_Boots(player) and state.has_Mirror(player) and state.has('Hookshot', player), 'or')
'Desert Palace Entrance (North) Mirror Spot', # DW entrances accessible with mirror and titans.
'East Death Mountain (Top) Mirror Spot', boots_mirror_titans = lambda state: state.has_Boots(player) and state.has_Mirror(player) and state.can_lift_heavy_rocks(player)
'Spiral Cave Mirror Spot', add_rule(world.get_entrance('Mire Shed', player), boots_mirror_titans, 'or')
'Fairy Ascension Mirror Spot', # Plus the mirror superbunny version.
'Floating Island Mirror Spot', add_rule(world.get_entrance('Mire Shed', player), lambda state: state.has('Ocarina', player) and state.has_Mirror(player) and state.can_lift_heavy_rocks(player), 'or')
] add_rule(world.get_location('Frog', player), boots_mirror_titans, 'or')
lw_boots_accessible_locations = [
'Lake Hylia Island', # Locations that you can superbunny mirror into, but need a sword to clear.
'Desert Ledge', superbunny_mirror_weapon = lambda state: state.has_Mirror(player) and state.has_sword(player)
'Spectacle Rock', mini_moldorm_cave = world.get_region('Mini Moldorm Cave', player)
'Floating Island', for superbunny_mirror_weapon_region in OWGSets.get_sword_required_superbunny_mirror_regions():
] region = world.get_region(superbunny_mirror_weapon_region, player)
dw_boots_accessible_entrances = [ if check_is_dark_world(region):
'Northeast Dark World Broken Bridge Pass', for spot in region.locations:
'Peg Area Rocks', add_rule(world.get_location(spot, player), superbunny_mirror_weapon, 'or')
'Grassy Lawn Pegs',
'West Dark World Gap', # Regions that require the boots and some other stuff.
'Bumper Cave Ledge Drop',
'Turtle Rock Drop',
'Floating Island Drop',
'Dark Death Mountain Drop (East)',
'Village of Outcasts Drop',
'Dark Lake Hylia Ledge',
'Hype Cave',
'Dark World Potion Shop',
'Big Bomb Shop',
'Archery Game',
'Brewery',
'C-Shaped House',
'Chest Game',
'Thieves Town',
'Kings Grave Mirror Spot',
'Bumper Cave Entrance Rock',
'Red Shield Shop',
'Dark Sanctuary Hint',
'Fortune Teller (Dark)',
'Dark World Lumberjack Shop',
'Misery Mire',
'Mire Shed',
'Dark Desert Hint',
'Dark Desert Fairy',
]
dw_boots_accessible_locations = [
'Catfish',
'Dark Blacksmith Ruins',
'Bumper Cave Ledge',
]
dw_bunny_inaccessible_locations = [
'Thieves Town',
'Graveyard Ledge Mirror Spot',
'Kings Grave Mirror Spot',
'Bumper Cave Entrance Rock',
'Brewery',
'Village of Outcasts Pegs',
'Village of Outcasts Eastern Rocks',
'Dark Lake Hylia Drop (South)',
'Hype Cave',
'Village of Outcasts Heavy Rock',
'East Dark World Bridge',
'Bonk Fairy (Dark)',
]
# set up boots-accessible regions
if world.mode[player] != 'inverted': if world.mode[player] != 'inverted':
lw_boots_accessible_entrances.append('Cave 45')
lw_boots_accessible_entrances.append('Graveyard Cave')
# couple other random spots
set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player) and (state.has_Mirror(player) or state.has_Boots(player))) set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player) and (state.has_Mirror(player) or state.has_Boots(player)))
set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player) and (state.has_Mirror(player) or state.has_Boots(player))) set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player) and (state.has_Mirror(player) or state.has_Boots(player)))
set_rule(world.get_entrance('Dark Desert Teleporter', player), lambda state: state.has('Ocarina', player) or (state.has_Boots(player) and state.can_lift_heavy_rocks(player))) set_rule(world.get_entrance('Dark Desert Teleporter', player), lambda state: state.has('Ocarina', player) or (state.has_Boots(player) and state.can_lift_heavy_rocks(player)))
@ -837,66 +790,7 @@ def overworld_glitches_rules(world, player):
else: else:
add_rule(world.get_entrance('South Dark World Teleporter', player), lambda state: state.has_Boots(player) and state.can_lift_rocks(player), 'or') add_rule(world.get_entrance('South Dark World Teleporter', player), lambda state: state.has_Boots(player) and state.can_lift_rocks(player), 'or')
# ton of boots-accessible locations. # Add darkness conditions.
needs_boots = lambda state: state.has_Boots(player)
needs_boots_and_pearl = lambda state: state.has_Boots(player) and state.has_Pearl(player)
for entrance in lw_boots_accessible_entrances:
add_rule(world.get_entrance(entrance, player), needs_boots_and_pearl if world.mode[player] == 'inverted' else needs_boots, 'or')
for location in lw_boots_accessible_locations:
add_rule(world.get_location(location, player), needs_boots_and_pearl if world.mode[player] == 'inverted' else needs_boots, 'or')
for entrance in dw_boots_accessible_entrances:
add_rule(world.get_entrance(entrance, player), needs_boots_and_pearl if world.mode[player] != 'inverted' else needs_boots, 'or')
for location in dw_boots_accessible_locations:
add_rule(world.get_location(location, player), needs_boots_and_pearl if world.mode[player] != 'inverted' else needs_boots, 'or')
# standard dmd rules, also feat. bunny
if world.mode[player] != 'inverted':
can_bunny_dmd = lambda state: world.get_region('Death Mountain').can_reach(state, player) and state.has_Mirror(player)
wdw = world.get_region('West Dark World', player)
wdw.can_reach_private = lambda state: wdw.can_reach(state) or (needs_boots_and_pearl or can_bunny_dmd)
sdw = world.get_region('South Dark World', player)
sdw.can_reach_private = lambda state: sdw.can_reach(state) or (needs_boots_and_pearl or can_bunny_dmd)
dd = world.get_region('Dark Desert', player)
dd.can_reach_private = lambda state: dd.can_reach(state) or needs_boots_and_pearl
nedw = world.get_region('Northeast Dark World', player)
nedw.can_reach_private = lambda state: nedw.can_reach(state) or (needs_boots_and_pearl or can_bunny_dmd)
edw = world.get_region('East Dark World', player)
edw.can_reach_private = lambda state: edw.can_reach(state) or needs_boots_and_pearl
edmb = world.get_region('Dark Death Mountain (East Bottom)', player)
edmb.can_reach_private = lambda state: edmb.can_reach(state) or can_bunny_dmd
# set up some mirror-accessible dw entrances.
boots_and_mirror = lambda state: state.has_Boots(player) and state.has_Mirror(player)
for spot in world.get_region('West Dark World', player).exits + world.get_region('South Dark World', player).exits:
if spot.name not in dw_bunny_inaccessible_locations:
add_rule(world.get_entrance(spot, player), boots_and_mirror, 'or')
for spot in world.get_region('Dark Death Mountain (East Bottom)', player).locations:
add_rule(world.get_location(spot, player), boots_and_mirror, 'or')
# dw entrances accessible with mirror and hookshot
mirror_hookshot_accessible_dw_locations = [
'Pyramid Fairy',
'Pyramid Entrance',
'Pyramid Drop',
]
mirror_hookshot_accessible_dw_locations.extend(world.get_region('Dark Death Mountain Ledge', player).locations)
for spot in mirror_hookshot_accessible_dw_locations:
add_rule(world.get_entrance(spot, player), lambda state: state.has_Boots(player) and state.has_Mirror(player) and state.has('Hookshot', player), 'or')
# dw entrances accessible with mirror and titans
boots_mirror_titans = lambda state: state.has_Boots(player) and state.has_Mirror(player) and state.can_lift_heavy_rocks(player)
add_rule(world.get_entrance('Mire Shed', player), boots_mirror_titans, 'or')
# plus the mirror superbunny version
add_rule(world.get_entrance('Mire Shed', player), lambda state: state.has('Ocarina', player) and state.has_Mirror(player) and state.can_lift_heavy_rocks(player), 'or')
add_rule(world.get_location('Frog', player), boots_mirror_titans, 'or')
# also, you can do mini moldorm cave and spiral cave - but requiring a sword.
superbunny_mirror_weapon = lambda state: state.has_Mirror(player) and state.has_sword(player)
mini_moldorm_cave = world.get_region('Mini Moldorm Cave', player)
if check_is_dark_world(mini_moldorm_cave):
for spot in mini_moldorm_cave.locations:
add_rule(world.get_location(spot, player), superbunny_mirror_weapon, 'or')
if check_is_dark_world(world.get_region('Spiral Cave (Top)', player)):
add_rule(world.get_location('Spiral Cave', player), superbunny_mirror_weapon, 'or')
# add darkness condition.
add_conditional_lamps(world, player) add_conditional_lamps(world, player)
@ -1531,7 +1425,7 @@ def set_inverted_bunny_rules(world, player):
# Note spiral cave may be technically passible, but it would be too absurd to require since OHKO mode is a thing. # Note spiral cave may be technically passible, but it would be too absurd to require since OHKO mode is a thing.
bunny_impassable_caves = ['Bumper Cave', 'Two Brothers House', 'Hookshot Cave', 'Skull Woods First Section (Right)', 'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)', 'Turtle Rock (Entrance)', 'Turtle Rock (Second Section)', 'Turtle Rock (Big Chest)', 'Skull Woods Second Section (Drop)', bunny_impassable_caves = ['Bumper Cave', 'Two Brothers House', 'Hookshot Cave', 'Skull Woods First Section (Right)', 'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)', 'Turtle Rock (Entrance)', 'Turtle Rock (Second Section)', 'Turtle Rock (Big Chest)', 'Skull Woods Second Section (Drop)',
'Turtle Rock (Eye Bridge)', 'Sewers', 'Pyramid', 'Spiral Cave (Top)', 'Desert Palace Main (Inner)', 'Fairy Ascension Cave (Drop)', 'The Sky'] 'Turtle Rock (Eye Bridge)', 'Sewers', 'Pyramid', 'Spiral Cave (Top)', 'Desert Palace Main (Inner)', 'Fairy Ascension Cave (Drop)', 'The Sky']
bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', 'Bombos Tablet', 'Ether Tablet', 'Purple Chest'] bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', 'Bombos Tablet Ledge', 'Ether Tablet', 'Purple Chest']
invalid_mirror_bunny_entrances_lw = ['Bonk Rock Cave', 'Bonk Fairy (Light)', 'Blinds Hideout', '50 Rupee Cave', '20 Rupee Cave', 'Checkerboard Cave', 'Light Hype Fairy', 'Waterfall of Wishing', 'Light World Bomb Hut', 'Mini Moldorm Cave', 'Ice Rod Cave', 'Hyrule Castle Secret Entrance Stairs', 'Sanctuary Grave', 'Kings Grave', 'Tower of Hera'] invalid_mirror_bunny_entrances_lw = ['Bonk Rock Cave', 'Bonk Fairy (Light)', 'Blinds Hideout', '50 Rupee Cave', '20 Rupee Cave', 'Checkerboard Cave', 'Light Hype Fairy', 'Waterfall of Wishing', 'Light World Bomb Hut', 'Mini Moldorm Cave', 'Ice Rod Cave', 'Hyrule Castle Secret Entrance Stairs', 'Sanctuary Grave', 'Kings Grave', 'Tower of Hera']
def path_to_access_rule(path, entrance): def path_to_access_rule(path, entrance):