Refactor OWG rules to use lists rather than generators
This commit is contained in:
@@ -4,261 +4,296 @@ Helper functions to deliver entrance/exit/region sets to OWG rules.
|
||||
|
||||
from BaseClasses import Entrance
|
||||
|
||||
# Cave regions that superbunny can get through - but only with a sword.
|
||||
sword_required_superbunny_mirror_regions = ["Spiral Cave (Top)"]
|
||||
|
||||
def get_sword_required_superbunny_mirror_regions():
|
||||
"""
|
||||
Cave regions that superbunny can get through - but only with a sword.
|
||||
"""
|
||||
yield 'Spiral Cave (Top)'
|
||||
# Cave regions that superbunny can get through - but only with boots.
|
||||
boots_required_superbunny_mirror_regions = ["Two Brothers House"]
|
||||
|
||||
def get_boots_required_superbunny_mirror_regions():
|
||||
"""
|
||||
Cave regions that superbunny can get through - but only with boots.
|
||||
"""
|
||||
yield 'Two Brothers House'
|
||||
# Cave locations that superbunny can access - but only with boots.
|
||||
boots_required_superbunny_mirror_locations = [
|
||||
"Sahasrahla's Hut - Left",
|
||||
"Sahasrahla's Hut - Middle",
|
||||
"Sahasrahla's Hut - Right",
|
||||
]
|
||||
|
||||
def get_boots_required_superbunny_mirror_locations():
|
||||
"""
|
||||
Cave locations that superbunny can access - but only with boots.
|
||||
"""
|
||||
yield 'Sahasrahla\'s Hut - Left'
|
||||
yield 'Sahasrahla\'s Hut - Middle'
|
||||
yield 'Sahasrahla\'s Hut - Right'
|
||||
# Entrances that can't be superbunny-mirrored into.
|
||||
invalid_mirror_bunny_entrances = [
|
||||
"Skull Woods Final Section",
|
||||
"Hype Cave",
|
||||
"Bonk Fairy (Dark)",
|
||||
"Thieves Town",
|
||||
"Hammer Peg Cave",
|
||||
"Brewery",
|
||||
"Hookshot Cave",
|
||||
"Dark Lake Hylia Ledge Fairy",
|
||||
"Dark Lake Hylia Ledge Spike Cave",
|
||||
"Palace of Darkness",
|
||||
"Misery Mire",
|
||||
"Turtle Rock",
|
||||
"Bonk Rock Cave",
|
||||
"Bonk Fairy (Light)",
|
||||
"50 Rupee Cave",
|
||||
"20 Rupee Cave",
|
||||
"Checkerboard Cave",
|
||||
"Light Hype Fairy",
|
||||
"Waterfall of Wishing",
|
||||
"Light World Bomb Hut",
|
||||
"Mini Moldorm Cave",
|
||||
"Ice Rod Cave",
|
||||
"Sanctuary Grave",
|
||||
"Kings Grave",
|
||||
"Sanctuary Grave",
|
||||
"Hyrule Castle Secret Entrance Drop",
|
||||
"Skull Woods Second Section Hole",
|
||||
"Skull Woods First Section Hole (North)",
|
||||
]
|
||||
|
||||
# Interior locations that can be accessed with superbunny state.
|
||||
superbunny_accessible_locations = [
|
||||
"Waterfall of Wishing - Left",
|
||||
"Waterfall of Wishing - Right",
|
||||
"King's Tomb",
|
||||
"Floodgate",
|
||||
"Floodgate Chest",
|
||||
"Cave 45",
|
||||
"Bonk Rock Cave",
|
||||
"Brewery",
|
||||
"C-Shaped House",
|
||||
"Chest Game",
|
||||
"Mire Shed - Left",
|
||||
"Mire Shed - Right",
|
||||
"Secret Passage",
|
||||
"Ice Rod Cave",
|
||||
"Pyramid Fairy - Left",
|
||||
"Pyramid Fairy - Right",
|
||||
"Superbunny Cave - Top",
|
||||
"Superbunny Cave - Bottom",
|
||||
"Blind's Hideout - Left",
|
||||
"Blind's Hideout - Right",
|
||||
"Blind's Hideout - Far Left",
|
||||
"Blind's Hideout - Far Right",
|
||||
"Kakariko Well - Left",
|
||||
"Kakariko Well - Middle",
|
||||
"Kakariko Well - Right",
|
||||
"Kakariko Well - Bottom",
|
||||
"Kakariko Tavern",
|
||||
"Library",
|
||||
"Spiral Cave",
|
||||
] + boots_required_superbunny_mirror_locations
|
||||
|
||||
|
||||
def get_invalid_mirror_bunny_entrances():
|
||||
"""
|
||||
Entrances that can't be superbunny-mirrored into.
|
||||
"""
|
||||
yield 'Skull Woods Final Section'
|
||||
yield 'Hype Cave'
|
||||
yield 'Bonk Fairy (Dark)'
|
||||
yield 'Thieves Town'
|
||||
yield 'Hammer Peg Cave'
|
||||
yield 'Brewery'
|
||||
yield 'Hookshot Cave'
|
||||
yield 'Dark Lake Hylia Ledge Fairy'
|
||||
yield 'Dark Lake Hylia Ledge Spike Cave'
|
||||
yield 'Palace of Darkness'
|
||||
yield 'Misery Mire'
|
||||
yield 'Turtle Rock'
|
||||
yield 'Bonk Rock Cave'
|
||||
yield 'Bonk Fairy (Light)'
|
||||
yield '50 Rupee Cave'
|
||||
yield '20 Rupee Cave'
|
||||
yield 'Checkerboard Cave'
|
||||
yield 'Light Hype Fairy'
|
||||
yield 'Waterfall of Wishing'
|
||||
yield 'Light World Bomb Hut'
|
||||
yield 'Mini Moldorm Cave'
|
||||
yield 'Ice Rod Cave'
|
||||
yield 'Sanctuary Grave'
|
||||
yield 'Kings Grave'
|
||||
yield 'Sanctuary Grave'
|
||||
yield 'Hyrule Castle Secret Entrance Drop'
|
||||
yield 'Skull Woods Second Section Hole'
|
||||
yield 'Skull Woods First Section Hole (North)'
|
||||
# Entrances that can be reached with full equipment using overworld glitches and don't need to be an exit.
|
||||
# The following are still be mandatory exits:
|
||||
# Open:
|
||||
# Turtle Rock Isolated Ledge Entrance
|
||||
# Skull Woods Second Section Door (West) (or Skull Woods Final Section)
|
||||
# Inverted:
|
||||
# Two Brothers House (West)
|
||||
# Desert Palace Entrance (East)
|
||||
|
||||
|
||||
def get_superbunny_accessible_locations():
|
||||
"""
|
||||
Interior locations that can be accessed with superbunny state.
|
||||
"""
|
||||
non_mandatory_exits = [
|
||||
"Bumper Cave (Top)",
|
||||
"Death Mountain Return Cave (West)",
|
||||
"Hookshot Cave Back Entrance",
|
||||
]
|
||||
|
||||
yield 'Waterfall of Wishing - Left'
|
||||
yield 'Waterfall of Wishing - Right'
|
||||
yield 'King\'s Tomb'
|
||||
yield 'Floodgate'
|
||||
yield 'Floodgate Chest'
|
||||
yield 'Cave 45'
|
||||
yield 'Bonk Rock Cave'
|
||||
yield 'Brewery'
|
||||
yield 'C-Shaped House'
|
||||
yield 'Chest Game'
|
||||
yield 'Mire Shed - Left'
|
||||
yield 'Mire Shed - Right'
|
||||
yield 'Secret Passage'
|
||||
yield 'Ice Rod Cave'
|
||||
yield 'Pyramid Fairy - Left'
|
||||
yield 'Pyramid Fairy - Right'
|
||||
yield 'Superbunny Cave - Top'
|
||||
yield 'Superbunny Cave - Bottom'
|
||||
yield 'Blind\'s Hideout - Left'
|
||||
yield 'Blind\'s Hideout - Right'
|
||||
yield 'Blind\'s Hideout - Far Left'
|
||||
yield 'Blind\'s Hideout - Far Right'
|
||||
yield 'Kakariko Well - Left'
|
||||
yield 'Kakariko Well - Middle'
|
||||
yield 'Kakariko Well - Right'
|
||||
yield 'Kakariko Well - Bottom'
|
||||
yield 'Kakariko Tavern'
|
||||
yield 'Library'
|
||||
yield 'Spiral Cave'
|
||||
for location in get_boots_required_superbunny_mirror_locations():
|
||||
yield location
|
||||
inverted_non_mandatory_exits = [
|
||||
"Desert Palace Entrance (North)",
|
||||
"Desert Palace Entrance (West)",
|
||||
"Agahnims Tower",
|
||||
"Hyrule Castle Entrance (West)",
|
||||
"Hyrule Castle Entrance (East)",
|
||||
] + non_mandatory_exits
|
||||
|
||||
open_non_mandatory_exits_ = [
|
||||
"Dark Death Mountain Ledge (West)",
|
||||
"Dark Death Mountain Ledge (East)",
|
||||
"Mimic Cave",
|
||||
"Desert Palace Entrance (East)",
|
||||
] + non_mandatory_exits
|
||||
|
||||
|
||||
def get_non_mandatory_exits(inverted):
|
||||
"""
|
||||
Entrances that can be reached with full equipment using overworld glitches and don't need to be an exit.
|
||||
The following are still be mandatory exits:
|
||||
# Special Light World region exits that require boots clips.
|
||||
|
||||
Open:
|
||||
Turtle Rock Isolated Ledge Entrance
|
||||
Skull Woods Second Section Door (West) (or Skull Woods Final Section)
|
||||
inverted_boots_clip_exits_lw = [
|
||||
("Light World DMA Clip Spot", "Light World", "West Death Mountain (Bottom)"),
|
||||
("Hera Ascent", "West Death Mountain (Bottom)", "West Death Mountain (Top)"),
|
||||
("Death Mountain Return Ledge Clip Spot", "Light World", "Death Mountain Return Ledge"),
|
||||
("Death Mountain Entrance Clip Spot", "Light World", "Death Mountain Entrance"),
|
||||
("Death Mountain Glitched Bridge", "West Death Mountain (Bottom)", "East Death Mountain (Top)"),
|
||||
("Zora Descent Clip Spot", "East Death Mountain (Top)", "Zoras Domain"),
|
||||
("Desert Northern Cliffs", "Light World", "Desert Northern Cliffs"),
|
||||
("Desert Ledge Dropdown", "Desert Northern Cliffs", "Desert Ledge"),
|
||||
("Desert Palace Entrance Dropdown", "Desert Northern Cliffs", "Desert Palace Entrance (North) Spot"),
|
||||
("Lake Hylia Island Clip Spot", "Light World", "Lake Hylia Island"),
|
||||
("Death Mountain Descent", "West Death Mountain (Bottom)", "Light World"),
|
||||
("Kings Grave Clip Spot", "West Death Mountain (Bottom)", "Kings Grave Area"),
|
||||
("Maze Race Clip Spot", "Light World", "Maze Race Ledge"),
|
||||
]
|
||||
|
||||
Inverted:
|
||||
Two Brothers House (West)
|
||||
Desert Palace Entrance (East)
|
||||
"""
|
||||
open_boots_clip_exits_lw = [
|
||||
("Graveyard Ledge Clip Spot", "West Death Mountain (Bottom)", "Graveyard Ledge"),
|
||||
("Desert Ledge (Northeast) Dropdown", "Desert Northern Cliffs", "Desert Checkerboard Ledge"),
|
||||
("Spectacle Rock Clip Spot", "West Death Mountain (Top)", "Spectacle Rock"),
|
||||
("Bombos Tablet Clip Spot", "Light World", "Bombos Tablet Ledge"),
|
||||
("Floating Island Clip Spot", "East Death Mountain (Top)", "Death Mountain Floating Island"),
|
||||
("Cave 45 Clip Spot", "Light World", "Cave 45 Ledge"),
|
||||
] + inverted_boots_clip_exits_lw
|
||||
|
||||
yield 'Bumper Cave (Top)'
|
||||
yield 'Death Mountain Return Cave (West)'
|
||||
yield 'Hookshot Cave Back Entrance'
|
||||
# Special Dark World region exits that require boots clips.
|
||||
boots_clip_exits_dw = [
|
||||
("Dark World DMA Clip Spot", "West Dark World", "West Dark Death Mountain (Bottom)"),
|
||||
("Bumper Cave Ledge Clip Spot", "West Dark World", "Bumper Cave Ledge"),
|
||||
("Bumper Cave Entrance Clip Spot", "West Dark World", "Bumper Cave Entrance"),
|
||||
("Catfish Descent", "Dark Death Mountain (Top)", "Catfish Area"),
|
||||
("Hammer Pegs River Clip Spot", "East Dark World", "Hammer Peg Area"),
|
||||
("Dark Lake Hylia Ledge Clip Spot", "East Dark World", "Southeast Dark World"),
|
||||
("Dark Desert Cliffs Clip Spot", "South Dark World", "Dark Desert"),
|
||||
("DW Floating Island Clip Spot", "East Dark Death Mountain (Bottom)", "Dark Death Mountain Floating Island"),
|
||||
]
|
||||
|
||||
if inverted:
|
||||
yield 'Desert Palace Entrance (North)'
|
||||
yield 'Desert Palace Entrance (West)'
|
||||
yield 'Agahnims Tower'
|
||||
yield 'Hyrule Castle Entrance (West)'
|
||||
yield 'Hyrule Castle Entrance (East)'
|
||||
else:
|
||||
yield 'Dark Death Mountain Ledge (West)'
|
||||
yield 'Dark Death Mountain Ledge (East)'
|
||||
yield 'Mimic Cave'
|
||||
yield 'Desert Palace Entrance (East)'
|
||||
open_boots_clip_exits_dw = [
|
||||
("Dark Death Mountain Descent", "West Dark Death Mountain (Bottom)", "West Dark World"),
|
||||
("Ganons Tower Ascent", "West Dark Death Mountain (Bottom)", "Dark Death Mountain (Top)"),
|
||||
("Dark Death Mountain Glitched Bridge", "West Dark Death Mountain (Bottom)", "Dark Death Mountain (Top)"),
|
||||
("Turtle Rock (Top) Clip Spot", "Dark Death Mountain (Top)", "Turtle Rock (Top)"),
|
||||
] + boots_clip_exits_dw
|
||||
|
||||
inverted_boots_clip_exits_dw = [
|
||||
("Dark Desert Teleporter Clip Spot", "Dark Desert", "Dark Desert Ledge")
|
||||
] + boots_clip_exits_dw
|
||||
|
||||
|
||||
def get_boots_clip_exits_lw(inverted = False):
|
||||
"""
|
||||
Special Light World region exits that require boots clips.
|
||||
"""
|
||||
|
||||
yield ('Bat Cave River Clip Spot', 'Light World', 'Bat Cave Ledge')
|
||||
yield ('Light World DMA Clip Spot', 'Light World', 'West Death Mountain (Bottom)')
|
||||
yield ('Hera Ascent', 'West Death Mountain (Bottom)', 'West Death Mountain (Top)')
|
||||
yield ('Death Mountain Return Ledge Clip Spot', 'Light World', 'Death Mountain Return Ledge')
|
||||
yield ('Death Mountain Entrance Clip Spot', 'Light World', 'Death Mountain Entrance')
|
||||
yield ('Death Mountain Glitched Bridge', 'West Death Mountain (Bottom)', 'East Death Mountain (Top)')
|
||||
yield ('Zora Descent Clip Spot', 'East Death Mountain (Top)', 'Zoras Domain')
|
||||
yield ('Desert Northern Cliffs', 'Light World', 'Desert Northern Cliffs')
|
||||
yield ('Desert Ledge Dropdown', 'Desert Northern Cliffs', 'Desert Ledge')
|
||||
yield ('Desert Palace Entrance Dropdown', 'Desert Northern Cliffs', 'Desert Palace Entrance (North) Spot')
|
||||
yield ('Lake Hylia Island Clip Spot', 'Light World', 'Lake Hylia Island')
|
||||
yield ('Death Mountain Descent', 'West Death Mountain (Bottom)', 'Light World')
|
||||
yield ('Kings Grave Clip Spot', 'West Death Mountain (Bottom)', 'Kings Grave Area')
|
||||
|
||||
if not inverted:
|
||||
yield ('Graveyard Ledge Clip Spot', 'West Death Mountain (Bottom)', 'Graveyard Ledge')
|
||||
yield ('Desert Ledge (Northeast) Dropdown', 'Desert Northern Cliffs', 'Desert Checkerboard Ledge')
|
||||
yield ('Spectacle Rock Clip Spot', 'West Death Mountain (Top)', 'Spectacle Rock')
|
||||
yield ('Bombos Tablet Clip Spot', 'Light World', 'Bombos Tablet Ledge')
|
||||
yield ('Floating Island Clip Spot', 'East Death Mountain (Top)', 'Death Mountain Floating Island')
|
||||
yield ('Cave 45 Clip Spot', 'Light World', 'Cave 45 Ledge')
|
||||
# Dark World drop-down ledges that require glitched speed.
|
||||
glitched_speed_drops_dw = [
|
||||
("Dark Death Mountain Ledge Clip Spot", "Dark Death Mountain (Top)", "Dark Death Mountain Ledge")
|
||||
]
|
||||
|
||||
|
||||
def get_boots_clip_exits_dw(inverted):
|
||||
"""
|
||||
Special Dark World region exits that require boots clips.
|
||||
"""
|
||||
# Out of bounds transitions using the mirror
|
||||
mirror_clip_spots_dw = [
|
||||
("Dark Death Mountain Bunny Descent Mirror Spot", "West Dark Death Mountain (Bottom)", "West Dark World"),
|
||||
(
|
||||
"Dark Death Mountain Bunny Mirror To East Jump",
|
||||
"West Dark Death Mountain (Bottom)",
|
||||
"East Dark Death Mountain (Bottom)",
|
||||
),
|
||||
("Desert East Mirror Clip", "Dark Desert", "Desert Palace Mouth"),
|
||||
]
|
||||
|
||||
yield ('Dark World DMA Clip Spot', 'West Dark World', 'West Dark Death Mountain (Bottom)')
|
||||
yield ('Bumper Cave Ledge Clip Spot', 'West Dark World', 'Bumper Cave Ledge')
|
||||
yield ('Bumper Cave Entrance Clip Spot', 'West Dark World', 'Bumper Cave Entrance')
|
||||
yield ('Catfish Descent', 'Dark Death Mountain (Top)', 'Catfish Area')
|
||||
yield ('Hammer Pegs River Clip Spot', 'East Dark World', 'Hammer Peg Area')
|
||||
yield ('Dark Lake Hylia Ledge Clip Spot', 'East Dark World', 'Southeast Dark World')
|
||||
yield ('Dark Desert Cliffs Clip Spot', 'South Dark World', 'Dark Desert')
|
||||
yield ('DW Floating Island Clip Spot', 'East Dark Death Mountain (Bottom)', 'Dark Death Mountain Floating Island')
|
||||
# Mirror shenanigans placing a mirror portal with a broken camera
|
||||
mirror_offset_spots_dw = [("Dark Death Mountain Offset Mirror", "West Dark Death Mountain (Bottom)", "East Dark World")]
|
||||
|
||||
if not inverted:
|
||||
yield ('Dark Death Mountain Descent', 'West Dark Death Mountain (Bottom)', 'West Dark World')
|
||||
yield ('Ganons Tower Ascent', 'West Dark Death Mountain (Bottom)', 'Dark Death Mountain (Top)') # This only gets you to the GT entrance
|
||||
yield ('Dark Death Mountain Glitched Bridge', 'West Dark Death Mountain (Bottom)', 'Dark Death Mountain (Top)')
|
||||
yield ('Turtle Rock (Top) Clip Spot', 'Dark Death Mountain (Top)', 'Turtle Rock (Top)')
|
||||
else:
|
||||
yield ('Dark Desert Teleporter Clip Spot', 'Dark Desert', 'Dark Desert Ledge')
|
||||
# Mirror shenanigans placing a mirror portal with a broken camera
|
||||
|
||||
|
||||
def get_glitched_speed_drops_dw(inverted = False):
|
||||
"""
|
||||
Dark World drop-down ledges that require glitched speed.
|
||||
"""
|
||||
yield ('Dark Death Mountain Ledge Clip Spot', 'Dark Death Mountain (Top)', 'Dark Death Mountain Ledge')
|
||||
|
||||
|
||||
def get_mirror_clip_spots_dw():
|
||||
"""
|
||||
Out of bounds transitions using the mirror
|
||||
"""
|
||||
yield ('Dark Death Mountain Bunny Descent Mirror Spot', 'West Dark Death Mountain (Bottom)', 'West Dark World')
|
||||
yield ('Dark Death Mountain Bunny Mirror To East Jump', 'West Dark Death Mountain (Bottom)', 'East Dark Death Mountain (Bottom)')
|
||||
yield ('Desert East Mirror Clip', 'Dark Desert', 'Desert Palace Mouth')
|
||||
|
||||
|
||||
def get_mirror_offset_spots_dw():
|
||||
"""
|
||||
Mirror shenanigans placing a mirror portal with a broken camera
|
||||
"""
|
||||
yield ('Dark Death Mountain Offset Mirror', 'West Dark Death Mountain (Bottom)', 'East Dark World')
|
||||
|
||||
|
||||
def get_mirror_offset_spots_lw(player):
|
||||
"""
|
||||
Mirror shenanigans placing a mirror portal with a broken camera
|
||||
"""
|
||||
yield ('Death Mountain Offset Mirror', 'West Death Mountain (Bottom)', 'Light World')
|
||||
yield ('Death Mountain Uncle Offset Mirror', 'West Death Mountain (Bottom)', 'Hyrule Castle Secret Entrance Area')
|
||||
yield ('Death Mountain Castle Ledge Offset Mirror', 'West Death Mountain (Bottom)', 'Hyrule Castle Ledge')
|
||||
mirror_offset_spots_lw = [
|
||||
("Death Mountain Offset Mirror", "West Death Mountain (Bottom)", "Light World"),
|
||||
("Death Mountain Uncle Offset Mirror", "West Death Mountain (Bottom)", "Hyrule Castle Secret Entrance Area"),
|
||||
("Death Mountain Castle Ledge Offset Mirror", "West Death Mountain (Bottom)", "Hyrule Castle Ledge"),
|
||||
]
|
||||
|
||||
|
||||
def create_owg_connections(world, player):
|
||||
"""
|
||||
Add OWG transitions to player's world without logic
|
||||
"""
|
||||
create_no_logic_connections(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted'))
|
||||
create_no_logic_connections(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted'))
|
||||
|
||||
# Glitched speed drops.
|
||||
create_no_logic_connections(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted'))
|
||||
|
||||
# Mirror clip spots.
|
||||
if world.mode[player] != 'inverted':
|
||||
create_no_logic_connections(player, world, get_mirror_clip_spots_dw())
|
||||
create_no_logic_connections(player, world, get_mirror_offset_spots_dw())
|
||||
if world.mode[player] == "inverted":
|
||||
connections = (
|
||||
inverted_boots_clip_exits_dw
|
||||
+ inverted_boots_clip_exits_lw
|
||||
+ glitched_speed_drops_dw
|
||||
+ mirror_offset_spots_lw
|
||||
)
|
||||
else:
|
||||
create_no_logic_connections(player, world, get_mirror_offset_spots_lw(player))
|
||||
connections = (
|
||||
open_boots_clip_exits_dw
|
||||
+ open_boots_clip_exits_lw
|
||||
+ glitched_speed_drops_dw
|
||||
+ mirror_clip_spots_dw
|
||||
+ mirror_offset_spots_dw
|
||||
)
|
||||
|
||||
create_no_logic_connections(player, world, connections)
|
||||
|
||||
|
||||
def overworld_glitches_rules(world, player):
|
||||
# Boots-accessible locations.
|
||||
set_owg_rules(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted'), lambda state: state.can_boots_clip_lw(player))
|
||||
set_owg_rules(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted'), lambda state: state.can_boots_clip_dw(player))
|
||||
inverted = world.mode[player] == "inverted"
|
||||
|
||||
# Boots-accessible locations.
|
||||
set_owg_rules(
|
||||
player,
|
||||
world,
|
||||
inverted_boots_clip_exits_lw if inverted else open_boots_clip_exits_lw,
|
||||
lambda state: state.can_boots_clip_lw(player),
|
||||
)
|
||||
set_owg_rules(
|
||||
player,
|
||||
world,
|
||||
inverted_boots_clip_exits_dw if inverted else open_boots_clip_exits_dw,
|
||||
lambda state: state.can_boots_clip_dw(player),
|
||||
)
|
||||
# Glitched speed drops.
|
||||
set_owg_rules(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted'), lambda state: state.can_get_glitched_speed_dw(player))
|
||||
set_owg_rules(
|
||||
player,
|
||||
world,
|
||||
glitched_speed_drops_dw,
|
||||
lambda state: state.can_get_glitched_speed_dw(player),
|
||||
)
|
||||
# Dark Death Mountain Ledge Clip Spot also accessible with mirror.
|
||||
if world.mode[player] != 'inverted':
|
||||
add_alternate_rule(world.get_entrance('Dark Death Mountain Ledge Clip Spot', player), lambda state: state.has_Mirror(player))
|
||||
if not inverted:
|
||||
add_alternate_rule(
|
||||
world.get_entrance("Dark Death Mountain Ledge Clip Spot", player), lambda state: state.has_Mirror(player)
|
||||
)
|
||||
|
||||
# Mirror clip spots.
|
||||
if world.mode[player] != 'inverted':
|
||||
set_owg_rules(player, world, get_mirror_clip_spots_dw(), lambda state: state.has_Mirror(player))
|
||||
set_owg_rules(player, world, get_mirror_offset_spots_dw(), lambda state: state.has_Mirror(player) and state.can_boots_clip_lw(player))
|
||||
if inverted:
|
||||
set_owg_rules(
|
||||
player,
|
||||
world,
|
||||
mirror_offset_spots_lw,
|
||||
lambda state: state.has_Mirror(player) and state.can_boots_clip_dw(player),
|
||||
)
|
||||
else:
|
||||
set_owg_rules(player, world, get_mirror_offset_spots_lw(player), lambda state: state.has_Mirror(player) and state.can_boots_clip_dw(player))
|
||||
|
||||
set_owg_rules(player, world, mirror_clip_spots_dw, lambda state: state.has_Mirror(player))
|
||||
set_owg_rules(
|
||||
player,
|
||||
world,
|
||||
mirror_offset_spots_dw,
|
||||
lambda state: state.has_Mirror(player) and state.can_boots_clip_lw(player),
|
||||
)
|
||||
|
||||
# Regions that require the boots and some other stuff.
|
||||
if world.mode[player] != 'inverted':
|
||||
world.get_entrance('Turtle Rock Teleporter', player).access_rule = lambda state: (state.can_boots_clip_lw(player) or state.can_lift_heavy_rocks(player)) and state.has('Hammer', player)
|
||||
add_alternate_rule(world.get_entrance('Waterfall Fairy Access', player), lambda state: state.has_Pearl(player) or state.has_Boots(player)) # assumes access to Waterwalk ability (boots case)
|
||||
else:
|
||||
add_alternate_rule(world.get_entrance('Waterfall Fairy Access', player), lambda state: state.has_Pearl(player))
|
||||
if not inverted:
|
||||
world.get_entrance("Turtle Rock Teleporter", player).access_rule = lambda state: (
|
||||
state.can_boots_clip_lw(player) or state.can_lift_heavy_rocks(player)
|
||||
) and state.has("Hammer", player)
|
||||
|
||||
world.get_entrance('Dark Desert Teleporter', player).access_rule = lambda state: (state.can_flute(player) or state.can_boots_clip_dw(player)) and state.can_lift_heavy_rocks(player)
|
||||
add_alternate_rule(world.get_entrance('Dark Witch Rock (North)', player), lambda state: state.can_boots_clip_dw(player))
|
||||
add_alternate_rule(world.get_entrance('Broken Bridge Pass (Top)', player), lambda state: state.can_boots_clip_dw(player))
|
||||
add_alternate_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.can_boots_clip_lw(player)) # assumes access to Waterwalk ability
|
||||
add_alternate_rule(
|
||||
world.get_entrance("Waterfall Fairy Access", player),
|
||||
lambda state: state.has_Pearl(player) or state.has_Boots(player),
|
||||
) # assumes access to Waterwalk ability (boots case)
|
||||
else:
|
||||
add_alternate_rule(world.get_entrance("Waterfall Fairy Access", player), lambda state: state.has_Pearl(player))
|
||||
|
||||
world.get_entrance("Dark Desert Teleporter", player).access_rule = lambda state: (
|
||||
state.can_flute(player) or state.can_boots_clip_dw(player)
|
||||
) and state.can_lift_heavy_rocks(player)
|
||||
|
||||
add_alternate_rule(
|
||||
world.get_entrance("Dark Witch Rock (North)", player), lambda state: state.can_boots_clip_dw(player)
|
||||
)
|
||||
add_alternate_rule(
|
||||
world.get_entrance("Broken Bridge Pass (Top)", player), lambda state: state.can_boots_clip_dw(player)
|
||||
)
|
||||
add_alternate_rule(
|
||||
world.get_location("Zora's Ledge", player), lambda state: state.can_boots_clip_lw(player)
|
||||
) # assumes access to Waterwalk ability
|
||||
|
||||
# This is doable even with bad enemies
|
||||
add_alternate_rule(world.get_location("Hobo", player), lambda state: state.can_boots_clip_lw(player))
|
||||
|
||||
|
||||
|
||||
def add_alternate_rule(entrance, rule):
|
||||
|
||||
Reference in New Issue
Block a user