Skip to content

Commit

Permalink
Extra logic changes and early exits @codemann8
Browse files Browse the repository at this point in the history
  • Loading branch information
KrisDavie authored Jan 5, 2025
1 parent c3b8347 commit 757b244
Showing 1 changed file with 21 additions and 18 deletions.
39 changes: 21 additions & 18 deletions UnderworldGlitchRules.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ def create_hmg_entrances_regions(world, player):
ip_clip_entrance = Entrance(player, "Ice Bomb Drop Clip", ip_bomb_top_reg)
ip_bomb_top_reg.exits.append(ip_clip_entrance)


def connect_hmg_entrances_regions(world, player):
for spots in [
kikiskip_spots,
Expand Down Expand Up @@ -174,23 +173,21 @@ def dungeon_reentry_rules(
def underworld_glitches_rules(world, player):
def mire_clip(state):
torches = world.get_region("Mire Torches Top", player)
return state.can_reach(torches, player) and (
state.can_dash_clip(torches, player)
return (state.can_dash_clip(torches, player)
or (state.can_bomb_clip(torches, player) and state.has_fire_source(player))
)
) and state.can_reach(torches, player)

def hera_clip(state):
hera = world.get_region("Hera 4F", player)
return state.can_reach(hera) and (
state.can_bomb_clip(hera, player) or state.can_dash_clip(hera, player)
)
return (state.can_bomb_clip(hera, player) or state.can_dash_clip(hera, player)) \
and state.has("Flippers", player) and state.can_reach(hera) and mire_clip(state)

# We use these plus functool.partial because lambdas don't work in loops properly.
def bomb_clip(state, region, player):
return state.can_reach(region, player) and state.can_bomb_clip(region, player)
return state.can_bomb_clip(region, player) and state.can_reach(region, player)

def dash_clip(state, region, player):
return state.can_reach(region, player) and state.can_dash_clip(region, player)
return state.can_dash_clip(region, player) and state.can_reach(region, player)
# Bomb clips
for clip in (
kikiskip_spots
Expand Down Expand Up @@ -237,18 +234,24 @@ def dash_clip(state, region, player):
# Allow mire big key to be used in Hera
Rules.add_rule(
world.get_entrance("Hera Startile Corner NW", player),
lambda state: mire_clip(state) and state.has("Big Key (Misery Mire)", player),
lambda state: state.has("Big Key (Misery Mire)", player) and mire_clip(state),
combine="or",
)
Rules.add_rule(
world.get_location("Tower of Hera - Big Chest", player),
lambda state: mire_clip(state) and state.has("Big Key (Misery Mire)", player),
lambda state: state.has("Big Key (Misery Mire)", player) and mire_clip(state),
combine="or",
)
# This uses the mire clip because it's always expected to come from mire
Rules.set_rule(
world.get_entrance("Hera to Swamp Clip", player),
lambda state: mire_clip(state) and state.has("Flippers", player),
lambda state: state.has("Flippers", player) and mire_clip(state),
)
Rules.add_rule(
world.get_location("Swamp Palace - Big Chest", player),
lambda state: (state.has("Big Key (Misery Mire)", player) or state.has("Big Key (Tower of Hera)", player)) \
and state.has("Flippers", player) and mire_clip(state),
combine="or",
)
# We need to set _all_ swamp doors to be openable with mire keys, otherwise the small key can't be behind them - 6 keys because of Pots
# Flippers required for all of these doors to prevent locks when flooding
Expand All @@ -267,9 +270,9 @@ def dash_clip(state, region, player):
]:
Rules.add_rule(
world.get_entrance(door, player),
lambda state: mire_clip(state)
lambda state: state.has("Flippers", player)
and state.has("Small Key (Misery Mire)", player, count=6)
and state.has("Flippers", player),
and mire_clip(state),
combine="or",
)

Expand Down Expand Up @@ -297,16 +300,16 @@ def dash_clip(state, region, player):
)
),
}
inverted = world.mode[player] == "inverted"
inverted_dm = world.mode[player] == "inverted"

def hera_rule(state):
return (state.has("Moon Pearl", player) or not inverted) and rule_map.get(
return (state.has("Moon Pearl", player) or not inverted_dm) and rule_map.get(
world.get_entrance("Tower of Hera", player).connected_region.name,
lambda state: False,
)(state)

def gt_rule(state):
return (state.has("Moon Pearl", player) or inverted) and rule_map.get(
return (state.has("Moon Pearl", player) or inverted_dm) and rule_map.get(
world.get_entrance(("Ganons Tower"), player).connected_region.name,
lambda state: False,
)(state)
Expand All @@ -315,8 +318,8 @@ def mirrorless_moat_rule(state):
return (
state.can_reach("Old Man S&Q", "Entrance", player)
and state.has("Flippers", player)
and mire_clip(state)
and (hera_rule(state) or gt_rule(state))
and mire_clip(state)
)

Rules.add_rule(
Expand Down

0 comments on commit 757b244

Please sign in to comment.