Skip to content

Commit 1eaf304

Browse files
Alchavqwint
authored andcommitted
LTTP: ToH Crystal Switch Logic (ArchipelagoMW#3172)
1 parent 690c92d commit 1eaf304

File tree

5 files changed

+26
-11
lines changed

5 files changed

+26
-11
lines changed

worlds/alttp/Rules.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
can_shoot_arrows, has_beam_sword, has_crystals,
1919
has_fire_source, has_hearts, has_melee_weapon,
2020
has_misery_mire_medallion, has_sword, has_turtle_rock_medallion,
21-
has_triforce_pieces, can_use_bombs, can_bomb_or_bonk)
21+
has_triforce_pieces, can_use_bombs, can_bomb_or_bonk,
22+
can_activate_crystal_switch)
2223
from .UnderworldGlitchRules import underworld_glitches_rules
2324

2425

@@ -357,8 +358,10 @@ def global_rules(multiworld: MultiWorld, player: int):
357358
if not (multiworld.small_key_shuffle[player] and multiworld.big_key_shuffle[player]):
358359
add_rule(multiworld.get_location('Desert Palace - Prize', player), lambda state: state.multiworld.get_region('Desert Palace Main (Outer)', player).can_reach(state))
359360

360-
set_rule(multiworld.get_entrance('Tower of Hera Small Key Door', player), lambda state: state._lttp_has_key('Small Key (Tower of Hera)', player) or location_item_name(state, 'Tower of Hera - Big Key Chest', player) == ('Small Key (Tower of Hera)', player))
361-
set_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: state.has('Big Key (Tower of Hera)', player))
361+
set_rule(multiworld.get_location('Tower of Hera - Basement Cage', player), lambda state: can_activate_crystal_switch(state, player))
362+
set_rule(multiworld.get_location('Tower of Hera - Map Chest', player), lambda state: can_activate_crystal_switch(state, player))
363+
set_rule(multiworld.get_entrance('Tower of Hera Small Key Door', player), lambda state: can_activate_crystal_switch(state, player) and (state._lttp_has_key('Small Key (Tower of Hera)', player) or location_item_name(state, 'Tower of Hera - Big Key Chest', player) == ('Small Key (Tower of Hera)', player)))
364+
set_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: can_activate_crystal_switch(state, player) and state.has('Big Key (Tower of Hera)', player))
362365
if multiworld.enemy_shuffle[player]:
363366
add_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: can_kill_most_things(state, player, 3))
364367
else:

worlds/alttp/StateHelpers.py

+7
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ def can_bomb_or_bonk(state: CollectionState, player: int) -> bool:
106106
return state.has("Pegasus Boots", player) or can_use_bombs(state, player)
107107

108108

109+
def can_activate_crystal_switch(state: CollectionState, player: int) -> bool:
110+
return (has_melee_weapon(state, player) or can_use_bombs(state, player) or can_shoot_arrows(state, player)
111+
or state.has_any(["Hookshot", "Cane of Somaria", "Cane of Byrna", "Fire Rod", "Ice Rod", "Blue Boomerang",
112+
"Red Boomerang"], player))
113+
114+
109115
def can_kill_most_things(state: CollectionState, player: int, enemies: int = 5) -> bool:
110116
if state.multiworld.enemy_shuffle[player]:
111117
# I don't fully understand Enemizer's logic for placing enemies in spots where they need to be killable, if any.
@@ -173,6 +179,7 @@ def can_melt_things(state: CollectionState, player: int) -> bool:
173179
def has_misery_mire_medallion(state: CollectionState, player: int) -> bool:
174180
return state.has(state.multiworld.worlds[player].required_medallions[0], player)
175181

182+
176183
def has_turtle_rock_medallion(state: CollectionState, player: int) -> bool:
177184
return state.has(state.multiworld.worlds[player].required_medallions[1], player)
178185

worlds/alttp/test/dungeons/TestTowerOfHera.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ def testTowerOfHera(self):
99
["Tower of Hera - Big Key Chest", False, []],
1010
["Tower of Hera - Big Key Chest", False, [], ['Small Key (Tower of Hera)']],
1111
["Tower of Hera - Big Key Chest", False, [], ['Lamp', 'Fire Rod']],
12-
["Tower of Hera - Big Key Chest", True, ['Small Key (Tower of Hera)', 'Lamp']],
12+
["Tower of Hera - Big Key Chest", True, ['Small Key (Tower of Hera)', 'Lamp', 'Bomb Upgrade (50)']],
1313
["Tower of Hera - Big Key Chest", True, ['Small Key (Tower of Hera)', 'Fire Rod']],
1414

15-
["Tower of Hera - Basement Cage", True, []],
15+
["Tower of Hera - Basement Cage", False, []],
16+
["Tower of Hera - Basement Cage", True, ['Bomb Upgrade (50)']],
17+
["Tower of Hera - Basement Cage", True, ['Progressive Sword']],
1618

17-
["Tower of Hera - Map Chest", True, []],
19+
["Tower of Hera - Map Chest", False, []],
20+
["Tower of Hera - Map Chest", True, ['Bomb Upgrade (50)']],
21+
["Tower of Hera - Map Chest", True, ['Progressive Sword']],
1822

1923
["Tower of Hera - Compass Chest", False, []],
2024
["Tower of Hera - Compass Chest", False, [], ['Big Key (Tower of Hera)']],

worlds/alttp/test/inverted_owg/TestDungeons.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ def testFirstDungeonChests(self):
4141

4242
["Tower of Hera - Basement Cage", False, []],
4343
["Tower of Hera - Basement Cage", False, [], ['Moon Pearl']],
44-
["Tower of Hera - Basement Cage", True, ['Pegasus Boots', 'Moon Pearl']],
44+
["Tower of Hera - Basement Cage", True, ['Pegasus Boots', 'Moon Pearl', 'Bomb Upgrade (50)']],
45+
["Tower of Hera - Basement Cage", True, ['Pegasus Boots', 'Moon Pearl', 'Progressive Sword']],
4546

4647
["Castle Tower - Room 03", False, []],
4748
["Castle Tower - Room 03", False, [], ['Bomb Upgrade (+5)', 'Bomb Upgrade (+10)', 'Bomb Upgrade (50)', 'Progressive Sword', 'Hammer', 'Progressive Bow', 'Fire Rod', 'Ice Rod', 'Cane of Somaria', 'Cane of Byrna']],

worlds/alttp/test/owg/TestDungeons.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ def testFirstDungeonChests(self):
3434
["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Flute", "Lamp"]],
3535
["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Magic Mirror", "Hammer"]],
3636
["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Magic Mirror", "Hookshot"]],
37-
["Tower of Hera - Basement Cage", True, ['Pegasus Boots']],
38-
["Tower of Hera - Basement Cage", True, ["Flute", "Magic Mirror"]],
39-
["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror"]],
37+
["Tower of Hera - Basement Cage", True, ['Pegasus Boots', 'Bomb Upgrade (50)']],
38+
["Tower of Hera - Basement Cage", True, ["Flute", "Magic Mirror", 'Bomb Upgrade (50)']],
39+
["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror", 'Bomb Upgrade (50)']],
4040
["Tower of Hera - Basement Cage", True, ["Flute", "Hookshot", "Hammer"]],
41-
["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror"]],
41+
["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror", 'Bomb Upgrade (50)']],
4242

4343
["Castle Tower - Room 03", False, []],
4444
["Castle Tower - Room 03", False, ['Progressive Sword'], ['Progressive Sword', 'Cape', 'Beat Agahnim 1']],

0 commit comments

Comments
 (0)