From 2c80a9b8f1c55c84331263bdfe89aa064ebceb32 Mon Sep 17 00:00:00 2001 From: David St-Louis Date: Thu, 18 Apr 2024 12:53:09 -0400 Subject: [PATCH] Heretic: Update to use new Options + logic fixes + Doc fix (#3139) --- worlds/heretic/Locations.py | 22 +- worlds/heretic/Options.py | 43 ++-- worlds/heretic/Regions.py | 19 +- worlds/heretic/Rules.py | 440 ++++++++++++++++---------------- worlds/heretic/__init__.py | 39 +-- worlds/heretic/docs/setup_en.md | 2 +- 6 files changed, 289 insertions(+), 276 deletions(-) diff --git a/worlds/heretic/Locations.py b/worlds/heretic/Locations.py index f9590de7..ff32df7b 100644 --- a/worlds/heretic/Locations.py +++ b/worlds/heretic/Locations.py @@ -1266,7 +1266,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 10, 'doom_type': 79, - 'region': "The River of Fire (E2M3) Main"}, + 'region': "The River of Fire (E2M3) Green"}, 371179: {'name': 'The River of Fire (E2M3) - Green key', 'episode': 2, 'check_sanity': False, @@ -1301,7 +1301,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 122, 'doom_type': 2003, - 'region': "The River of Fire (E2M3) Main"}, + 'region': "The River of Fire (E2M3) Green"}, 371184: {'name': 'The River of Fire (E2M3) - Hellstaff', 'episode': 2, 'check_sanity': False, @@ -1364,7 +1364,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 299, 'doom_type': 32, - 'region': "The River of Fire (E2M3) Main"}, + 'region': "The River of Fire (E2M3) Green"}, 371193: {'name': 'The River of Fire (E2M3) - Morph Ovum', 'episode': 2, 'check_sanity': False, @@ -1385,7 +1385,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 413, 'doom_type': 2002, - 'region': "The River of Fire (E2M3) Main"}, + 'region': "The River of Fire (E2M3) Green"}, 371196: {'name': 'The River of Fire (E2M3) - Firemace 2', 'episode': 2, 'check_sanity': True, @@ -2610,7 +2610,7 @@ location_table: Dict[int, LocationDict] = { 'map': 2, 'index': 172, 'doom_type': 33, - 'region': "The Cesspool (E3M2) Main"}, + 'region': "The Cesspool (E3M2) Yellow"}, 371371: {'name': 'The Cesspool (E3M2) - Bag of Holding 2', 'episode': 3, 'check_sanity': False, @@ -4360,7 +4360,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 297, 'doom_type': 2002, - 'region': "Ambulatory (E4M3) Green"}, + 'region': "Ambulatory (E4M3) Green Lock"}, 371621: {'name': 'Ambulatory (E4M3) - Firemace 2', 'episode': 4, 'check_sanity': False, @@ -6040,7 +6040,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 234, 'doom_type': 85, - 'region': "Quay (E5M3) Blue"}, + 'region': "Quay (E5M3) Cyan"}, 371861: {'name': 'Quay (E5M3) - Map Scroll', 'episode': 5, 'check_sanity': True, @@ -6075,7 +6075,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 239, 'doom_type': 86, - 'region': "Quay (E5M3) Blue"}, + 'region': "Quay (E5M3) Cyan"}, 371866: {'name': 'Quay (E5M3) - Torch', 'episode': 5, 'check_sanity': False, @@ -6089,7 +6089,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 242, 'doom_type': 2002, - 'region': "Quay (E5M3) Blue"}, + 'region': "Quay (E5M3) Cyan"}, 371868: {'name': 'Quay (E5M3) - Firemace 2', 'episode': 5, 'check_sanity': False, @@ -6124,7 +6124,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': 247, 'doom_type': 2002, - 'region': "Quay (E5M3) Blue"}, + 'region': "Quay (E5M3) Cyan"}, 371873: {'name': 'Quay (E5M3) - Bag of Holding 2', 'episode': 5, 'check_sanity': True, @@ -6138,7 +6138,7 @@ location_table: Dict[int, LocationDict] = { 'map': 3, 'index': -1, 'doom_type': -1, - 'region': "Quay (E5M3) Blue"}, + 'region': "Quay (E5M3) Cyan"}, 371875: {'name': 'Courtyard (E5M4) - Blue key', 'episode': 5, 'check_sanity': False, diff --git a/worlds/heretic/Options.py b/worlds/heretic/Options.py index 34255f39..75e2257a 100644 --- a/worlds/heretic/Options.py +++ b/worlds/heretic/Options.py @@ -1,6 +1,5 @@ -import typing - -from Options import AssembleOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool +from Options import PerGameCommonOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool +from dataclasses import dataclass class Goal(Choice): @@ -146,22 +145,22 @@ class Episode5(Toggle): display_name = "Episode 5" -options: typing.Dict[str, AssembleOptions] = { - "start_inventory_from_pool": StartInventoryPool, - "goal": Goal, - "difficulty": Difficulty, - "random_monsters": RandomMonsters, - "random_pickups": RandomPickups, - "random_music": RandomMusic, - "allow_death_logic": AllowDeathLogic, - "pro": Pro, - "check_sanity": CheckSanity, - "start_with_map_scrolls": StartWithMapScrolls, - "reset_level_on_death": ResetLevelOnDeath, - "death_link": DeathLink, - "episode1": Episode1, - "episode2": Episode2, - "episode3": Episode3, - "episode4": Episode4, - "episode5": Episode5 -} +@dataclass +class HereticOptions(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool + goal: Goal + difficulty: Difficulty + random_monsters: RandomMonsters + random_pickups: RandomPickups + random_music: RandomMusic + allow_death_logic: AllowDeathLogic + pro: Pro + check_sanity: CheckSanity + start_with_map_scrolls: StartWithMapScrolls + reset_level_on_death: ResetLevelOnDeath + death_link: DeathLink + episode1: Episode1 + episode2: Episode2 + episode3: Episode3 + episode4: Episode4 + episode5: Episode5 diff --git a/worlds/heretic/Regions.py b/worlds/heretic/Regions.py index a30f0120..81a4c9ce 100644 --- a/worlds/heretic/Regions.py +++ b/worlds/heretic/Regions.py @@ -604,7 +604,8 @@ regions:List[RegionDict] = [ "connections":[ {"target":"Ambulatory (E4M3) Blue","pro":False}, {"target":"Ambulatory (E4M3) Yellow","pro":False}, - {"target":"Ambulatory (E4M3) Green","pro":False}]}, + {"target":"Ambulatory (E4M3) Green","pro":False}, + {"target":"Ambulatory (E4M3) Green Lock","pro":False}]}, {"name":"Ambulatory (E4M3) Blue", "connects_to_hub":False, "episode":4, @@ -619,6 +620,12 @@ regions:List[RegionDict] = [ "connects_to_hub":False, "episode":4, "connections":[{"target":"Ambulatory (E4M3) Main","pro":False}]}, + {"name":"Ambulatory (E4M3) Green Lock", + "connects_to_hub":False, + "episode":4, + "connections":[ + {"target":"Ambulatory (E4M3) Green","pro":False}, + {"target":"Ambulatory (E4M3) Main","pro":False}]}, # Sepulcher (E4M4) {"name":"Sepulcher (E4M4) Main", @@ -767,9 +774,7 @@ regions:List[RegionDict] = [ {"name":"Quay (E5M3) Blue", "connects_to_hub":False, "episode":5, - "connections":[ - {"target":"Quay (E5M3) Green","pro":False}, - {"target":"Quay (E5M3) Main","pro":False}]}, + "connections":[{"target":"Quay (E5M3) Main","pro":False}]}, {"name":"Quay (E5M3) Yellow", "connects_to_hub":False, "episode":5, @@ -779,7 +784,11 @@ regions:List[RegionDict] = [ "episode":5, "connections":[ {"target":"Quay (E5M3) Main","pro":False}, - {"target":"Quay (E5M3) Blue","pro":False}]}, + {"target":"Quay (E5M3) Cyan","pro":False}]}, + {"name":"Quay (E5M3) Cyan", + "connects_to_hub":False, + "episode":5, + "connections":[{"target":"Quay (E5M3) Main","pro":False}]}, # Courtyard (E5M4) {"name":"Courtyard (E5M4) Main", diff --git a/worlds/heretic/Rules.py b/worlds/heretic/Rules.py index 7ef15d79..579fd8b7 100644 --- a/worlds/heretic/Rules.py +++ b/worlds/heretic/Rules.py @@ -7,185 +7,185 @@ if TYPE_CHECKING: from . import HereticWorld -def set_episode1_rules(player, world, pro): +def set_episode1_rules(player, multiworld, pro): # The Docks (E1M1) - set_rule(world.get_entrance("Hub -> The Docks (E1M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Docks (E1M1) Main", player), lambda state: state.has("The Docks (E1M1)", player, 1)) - set_rule(world.get_entrance("The Docks (E1M1) Main -> The Docks (E1M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Docks (E1M1) Main -> The Docks (E1M1) Yellow", player), lambda state: state.has("The Docks (E1M1) - Yellow key", player, 1)) # The Dungeons (E1M2) - set_rule(world.get_entrance("Hub -> The Dungeons (E1M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Dungeons (E1M2) Main", player), lambda state: (state.has("The Dungeons (E1M2)", player, 1)) and (state.has("Dragon Claw", player, 1) or state.has("Ethereal Crossbow", player, 1))) - set_rule(world.get_entrance("The Dungeons (E1M2) Main -> The Dungeons (E1M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Dungeons (E1M2) Main -> The Dungeons (E1M2) Yellow", player), lambda state: state.has("The Dungeons (E1M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Dungeons (E1M2) Main -> The Dungeons (E1M2) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Dungeons (E1M2) Main -> The Dungeons (E1M2) Green", player), lambda state: state.has("The Dungeons (E1M2) - Green key", player, 1)) - set_rule(world.get_entrance("The Dungeons (E1M2) Blue -> The Dungeons (E1M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Dungeons (E1M2) Blue -> The Dungeons (E1M2) Yellow", player), lambda state: state.has("The Dungeons (E1M2) - Blue key", player, 1)) - set_rule(world.get_entrance("The Dungeons (E1M2) Yellow -> The Dungeons (E1M2) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Dungeons (E1M2) Yellow -> The Dungeons (E1M2) Blue", player), lambda state: state.has("The Dungeons (E1M2) - Blue key", player, 1)) # The Gatehouse (E1M3) - set_rule(world.get_entrance("Hub -> The Gatehouse (E1M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Gatehouse (E1M3) Main", player), lambda state: (state.has("The Gatehouse (E1M3)", player, 1)) and (state.has("Ethereal Crossbow", player, 1) or state.has("Dragon Claw", player, 1))) - set_rule(world.get_entrance("The Gatehouse (E1M3) Main -> The Gatehouse (E1M3) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Gatehouse (E1M3) Main -> The Gatehouse (E1M3) Yellow", player), lambda state: state.has("The Gatehouse (E1M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Gatehouse (E1M3) Main -> The Gatehouse (E1M3) Sea", player), lambda state: + set_rule(multiworld.get_entrance("The Gatehouse (E1M3) Main -> The Gatehouse (E1M3) Sea", player), lambda state: state.has("The Gatehouse (E1M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Gatehouse (E1M3) Main -> The Gatehouse (E1M3) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Gatehouse (E1M3) Main -> The Gatehouse (E1M3) Green", player), lambda state: state.has("The Gatehouse (E1M3) - Green key", player, 1)) - set_rule(world.get_entrance("The Gatehouse (E1M3) Green -> The Gatehouse (E1M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Gatehouse (E1M3) Green -> The Gatehouse (E1M3) Main", player), lambda state: state.has("The Gatehouse (E1M3) - Green key", player, 1)) # The Guard Tower (E1M4) - set_rule(world.get_entrance("Hub -> The Guard Tower (E1M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Guard Tower (E1M4) Main", player), lambda state: (state.has("The Guard Tower (E1M4)", player, 1)) and (state.has("Ethereal Crossbow", player, 1) or state.has("Dragon Claw", player, 1))) - set_rule(world.get_entrance("The Guard Tower (E1M4) Main -> The Guard Tower (E1M4) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Guard Tower (E1M4) Main -> The Guard Tower (E1M4) Yellow", player), lambda state: state.has("The Guard Tower (E1M4) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Guard Tower (E1M4) Yellow -> The Guard Tower (E1M4) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Guard Tower (E1M4) Yellow -> The Guard Tower (E1M4) Green", player), lambda state: state.has("The Guard Tower (E1M4) - Green key", player, 1)) - set_rule(world.get_entrance("The Guard Tower (E1M4) Green -> The Guard Tower (E1M4) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Guard Tower (E1M4) Green -> The Guard Tower (E1M4) Yellow", player), lambda state: state.has("The Guard Tower (E1M4) - Green key", player, 1)) # The Citadel (E1M5) - set_rule(world.get_entrance("Hub -> The Citadel (E1M5) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Citadel (E1M5) Main", player), lambda state: (state.has("The Citadel (E1M5)", player, 1) and state.has("Ethereal Crossbow", player, 1)) and (state.has("Dragon Claw", player, 1) or state.has("Gauntlets of the Necromancer", player, 1))) - set_rule(world.get_entrance("The Citadel (E1M5) Main -> The Citadel (E1M5) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Citadel (E1M5) Main -> The Citadel (E1M5) Yellow", player), lambda state: state.has("The Citadel (E1M5) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Citadel (E1M5) Blue -> The Citadel (E1M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Citadel (E1M5) Blue -> The Citadel (E1M5) Green", player), lambda state: state.has("The Citadel (E1M5) - Blue key", player, 1)) - set_rule(world.get_entrance("The Citadel (E1M5) Yellow -> The Citadel (E1M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Citadel (E1M5) Yellow -> The Citadel (E1M5) Green", player), lambda state: state.has("The Citadel (E1M5) - Green key", player, 1)) - set_rule(world.get_entrance("The Citadel (E1M5) Green -> The Citadel (E1M5) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Citadel (E1M5) Green -> The Citadel (E1M5) Blue", player), lambda state: state.has("The Citadel (E1M5) - Blue key", player, 1)) # The Cathedral (E1M6) - set_rule(world.get_entrance("Hub -> The Cathedral (E1M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Cathedral (E1M6) Main", player), lambda state: (state.has("The Cathedral (E1M6)", player, 1) and state.has("Ethereal Crossbow", player, 1)) and (state.has("Gauntlets of the Necromancer", player, 1) or state.has("Dragon Claw", player, 1))) - set_rule(world.get_entrance("The Cathedral (E1M6) Main -> The Cathedral (E1M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Cathedral (E1M6) Main -> The Cathedral (E1M6) Yellow", player), lambda state: state.has("The Cathedral (E1M6) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Cathedral (E1M6) Yellow -> The Cathedral (E1M6) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Cathedral (E1M6) Yellow -> The Cathedral (E1M6) Green", player), lambda state: state.has("The Cathedral (E1M6) - Green key", player, 1)) # The Crypts (E1M7) - set_rule(world.get_entrance("Hub -> The Crypts (E1M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Crypts (E1M7) Main", player), lambda state: (state.has("The Crypts (E1M7)", player, 1) and state.has("Ethereal Crossbow", player, 1)) and (state.has("Gauntlets of the Necromancer", player, 1) or state.has("Dragon Claw", player, 1))) - set_rule(world.get_entrance("The Crypts (E1M7) Main -> The Crypts (E1M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Crypts (E1M7) Main -> The Crypts (E1M7) Yellow", player), lambda state: state.has("The Crypts (E1M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Crypts (E1M7) Main -> The Crypts (E1M7) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Crypts (E1M7) Main -> The Crypts (E1M7) Green", player), lambda state: state.has("The Crypts (E1M7) - Green key", player, 1)) - set_rule(world.get_entrance("The Crypts (E1M7) Yellow -> The Crypts (E1M7) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Crypts (E1M7) Yellow -> The Crypts (E1M7) Green", player), lambda state: state.has("The Crypts (E1M7) - Green key", player, 1)) - set_rule(world.get_entrance("The Crypts (E1M7) Yellow -> The Crypts (E1M7) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Crypts (E1M7) Yellow -> The Crypts (E1M7) Blue", player), lambda state: state.has("The Crypts (E1M7) - Blue key", player, 1)) - set_rule(world.get_entrance("The Crypts (E1M7) Green -> The Crypts (E1M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Crypts (E1M7) Green -> The Crypts (E1M7) Main", player), lambda state: state.has("The Crypts (E1M7) - Green key", player, 1)) # Hell's Maw (E1M8) - set_rule(world.get_entrance("Hub -> Hell's Maw (E1M8) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Hell's Maw (E1M8) Main", player), lambda state: state.has("Hell's Maw (E1M8)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) # The Graveyard (E1M9) - set_rule(world.get_entrance("Hub -> The Graveyard (E1M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Graveyard (E1M9) Main", player), lambda state: state.has("The Graveyard (E1M9)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) - set_rule(world.get_entrance("The Graveyard (E1M9) Main -> The Graveyard (E1M9) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Graveyard (E1M9) Main -> The Graveyard (E1M9) Yellow", player), lambda state: state.has("The Graveyard (E1M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Graveyard (E1M9) Main -> The Graveyard (E1M9) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Graveyard (E1M9) Main -> The Graveyard (E1M9) Green", player), lambda state: state.has("The Graveyard (E1M9) - Green key", player, 1)) - set_rule(world.get_entrance("The Graveyard (E1M9) Main -> The Graveyard (E1M9) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Graveyard (E1M9) Main -> The Graveyard (E1M9) Blue", player), lambda state: state.has("The Graveyard (E1M9) - Blue key", player, 1)) - set_rule(world.get_entrance("The Graveyard (E1M9) Yellow -> The Graveyard (E1M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Graveyard (E1M9) Yellow -> The Graveyard (E1M9) Main", player), lambda state: state.has("The Graveyard (E1M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Graveyard (E1M9) Green -> The Graveyard (E1M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Graveyard (E1M9) Green -> The Graveyard (E1M9) Main", player), lambda state: state.has("The Graveyard (E1M9) - Green key", player, 1)) -def set_episode2_rules(player, world, pro): +def set_episode2_rules(player, multiworld, pro): # The Crater (E2M1) - set_rule(world.get_entrance("Hub -> The Crater (E2M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Crater (E2M1) Main", player), lambda state: state.has("The Crater (E2M1)", player, 1)) - set_rule(world.get_entrance("The Crater (E2M1) Main -> The Crater (E2M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Crater (E2M1) Main -> The Crater (E2M1) Yellow", player), lambda state: state.has("The Crater (E2M1) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Crater (E2M1) Yellow -> The Crater (E2M1) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Crater (E2M1) Yellow -> The Crater (E2M1) Green", player), lambda state: state.has("The Crater (E2M1) - Green key", player, 1)) - set_rule(world.get_entrance("The Crater (E2M1) Green -> The Crater (E2M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Crater (E2M1) Green -> The Crater (E2M1) Yellow", player), lambda state: state.has("The Crater (E2M1) - Green key", player, 1)) # The Lava Pits (E2M2) - set_rule(world.get_entrance("Hub -> The Lava Pits (E2M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Lava Pits (E2M2) Main", player), lambda state: (state.has("The Lava Pits (E2M2)", player, 1)) and (state.has("Ethereal Crossbow", player, 1) or state.has("Dragon Claw", player, 1))) - set_rule(world.get_entrance("The Lava Pits (E2M2) Main -> The Lava Pits (E2M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Lava Pits (E2M2) Main -> The Lava Pits (E2M2) Yellow", player), lambda state: state.has("The Lava Pits (E2M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Lava Pits (E2M2) Yellow -> The Lava Pits (E2M2) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Lava Pits (E2M2) Yellow -> The Lava Pits (E2M2) Green", player), lambda state: state.has("The Lava Pits (E2M2) - Green key", player, 1)) - set_rule(world.get_entrance("The Lava Pits (E2M2) Yellow -> The Lava Pits (E2M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Lava Pits (E2M2) Yellow -> The Lava Pits (E2M2) Main", player), lambda state: state.has("The Lava Pits (E2M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Lava Pits (E2M2) Green -> The Lava Pits (E2M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Lava Pits (E2M2) Green -> The Lava Pits (E2M2) Yellow", player), lambda state: state.has("The Lava Pits (E2M2) - Green key", player, 1)) # The River of Fire (E2M3) - set_rule(world.get_entrance("Hub -> The River of Fire (E2M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The River of Fire (E2M3) Main", player), lambda state: state.has("The River of Fire (E2M3)", player, 1) and state.has("Dragon Claw", player, 1) and state.has("Ethereal Crossbow", player, 1)) - set_rule(world.get_entrance("The River of Fire (E2M3) Main -> The River of Fire (E2M3) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The River of Fire (E2M3) Main -> The River of Fire (E2M3) Yellow", player), lambda state: state.has("The River of Fire (E2M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("The River of Fire (E2M3) Main -> The River of Fire (E2M3) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The River of Fire (E2M3) Main -> The River of Fire (E2M3) Blue", player), lambda state: state.has("The River of Fire (E2M3) - Blue key", player, 1)) - set_rule(world.get_entrance("The River of Fire (E2M3) Main -> The River of Fire (E2M3) Green", player), lambda state: + set_rule(multiworld.get_entrance("The River of Fire (E2M3) Main -> The River of Fire (E2M3) Green", player), lambda state: state.has("The River of Fire (E2M3) - Green key", player, 1)) - set_rule(world.get_entrance("The River of Fire (E2M3) Blue -> The River of Fire (E2M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("The River of Fire (E2M3) Blue -> The River of Fire (E2M3) Main", player), lambda state: state.has("The River of Fire (E2M3) - Blue key", player, 1)) - set_rule(world.get_entrance("The River of Fire (E2M3) Yellow -> The River of Fire (E2M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("The River of Fire (E2M3) Yellow -> The River of Fire (E2M3) Main", player), lambda state: state.has("The River of Fire (E2M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("The River of Fire (E2M3) Green -> The River of Fire (E2M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("The River of Fire (E2M3) Green -> The River of Fire (E2M3) Main", player), lambda state: state.has("The River of Fire (E2M3) - Green key", player, 1)) # The Ice Grotto (E2M4) - set_rule(world.get_entrance("Hub -> The Ice Grotto (E2M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Ice Grotto (E2M4) Main", player), lambda state: (state.has("The Ice Grotto (E2M4)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) and (state.has("Hellstaff", player, 1) or state.has("Firemace", player, 1))) - set_rule(world.get_entrance("The Ice Grotto (E2M4) Main -> The Ice Grotto (E2M4) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Ice Grotto (E2M4) Main -> The Ice Grotto (E2M4) Green", player), lambda state: state.has("The Ice Grotto (E2M4) - Green key", player, 1)) - set_rule(world.get_entrance("The Ice Grotto (E2M4) Main -> The Ice Grotto (E2M4) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Ice Grotto (E2M4) Main -> The Ice Grotto (E2M4) Yellow", player), lambda state: state.has("The Ice Grotto (E2M4) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Ice Grotto (E2M4) Blue -> The Ice Grotto (E2M4) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Ice Grotto (E2M4) Blue -> The Ice Grotto (E2M4) Green", player), lambda state: state.has("The Ice Grotto (E2M4) - Blue key", player, 1)) - set_rule(world.get_entrance("The Ice Grotto (E2M4) Yellow -> The Ice Grotto (E2M4) Magenta", player), lambda state: + set_rule(multiworld.get_entrance("The Ice Grotto (E2M4) Yellow -> The Ice Grotto (E2M4) Magenta", player), lambda state: state.has("The Ice Grotto (E2M4) - Green key", player, 1) and state.has("The Ice Grotto (E2M4) - Blue key", player, 1)) - set_rule(world.get_entrance("The Ice Grotto (E2M4) Green -> The Ice Grotto (E2M4) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Ice Grotto (E2M4) Green -> The Ice Grotto (E2M4) Blue", player), lambda state: state.has("The Ice Grotto (E2M4) - Blue key", player, 1)) # The Catacombs (E2M5) - set_rule(world.get_entrance("Hub -> The Catacombs (E2M5) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Catacombs (E2M5) Main", player), lambda state: (state.has("The Catacombs (E2M5)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -193,17 +193,17 @@ def set_episode2_rules(player, world, pro): (state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("The Catacombs (E2M5) Main -> The Catacombs (E2M5) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Catacombs (E2M5) Main -> The Catacombs (E2M5) Yellow", player), lambda state: state.has("The Catacombs (E2M5) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Catacombs (E2M5) Blue -> The Catacombs (E2M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Catacombs (E2M5) Blue -> The Catacombs (E2M5) Green", player), lambda state: state.has("The Catacombs (E2M5) - Blue key", player, 1)) - set_rule(world.get_entrance("The Catacombs (E2M5) Yellow -> The Catacombs (E2M5) Green", player), lambda state: - state.has("The Catacombs (E2M5) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Catacombs (E2M5) Green -> The Catacombs (E2M5) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Catacombs (E2M5) Yellow -> The Catacombs (E2M5) Green", player), lambda state: + state.has("The Catacombs (E2M5) - Green key", player, 1)) + set_rule(multiworld.get_entrance("The Catacombs (E2M5) Green -> The Catacombs (E2M5) Blue", player), lambda state: state.has("The Catacombs (E2M5) - Blue key", player, 1)) # The Labyrinth (E2M6) - set_rule(world.get_entrance("Hub -> The Labyrinth (E2M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Labyrinth (E2M6) Main", player), lambda state: (state.has("The Labyrinth (E2M6)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -211,17 +211,17 @@ def set_episode2_rules(player, world, pro): (state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("The Labyrinth (E2M6) Main -> The Labyrinth (E2M6) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Labyrinth (E2M6) Main -> The Labyrinth (E2M6) Blue", player), lambda state: state.has("The Labyrinth (E2M6) - Blue key", player, 1)) - set_rule(world.get_entrance("The Labyrinth (E2M6) Main -> The Labyrinth (E2M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Labyrinth (E2M6) Main -> The Labyrinth (E2M6) Yellow", player), lambda state: state.has("The Labyrinth (E2M6) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Labyrinth (E2M6) Main -> The Labyrinth (E2M6) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Labyrinth (E2M6) Main -> The Labyrinth (E2M6) Green", player), lambda state: state.has("The Labyrinth (E2M6) - Green key", player, 1)) - set_rule(world.get_entrance("The Labyrinth (E2M6) Blue -> The Labyrinth (E2M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Labyrinth (E2M6) Blue -> The Labyrinth (E2M6) Main", player), lambda state: state.has("The Labyrinth (E2M6) - Blue key", player, 1)) # The Great Hall (E2M7) - set_rule(world.get_entrance("Hub -> The Great Hall (E2M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Great Hall (E2M7) Main", player), lambda state: (state.has("The Great Hall (E2M7)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -229,19 +229,19 @@ def set_episode2_rules(player, world, pro): state.has("Firemace", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("The Great Hall (E2M7) Main -> The Great Hall (E2M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Great Hall (E2M7) Main -> The Great Hall (E2M7) Yellow", player), lambda state: state.has("The Great Hall (E2M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Great Hall (E2M7) Main -> The Great Hall (E2M7) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Great Hall (E2M7) Main -> The Great Hall (E2M7) Green", player), lambda state: state.has("The Great Hall (E2M7) - Green key", player, 1)) - set_rule(world.get_entrance("The Great Hall (E2M7) Blue -> The Great Hall (E2M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Great Hall (E2M7) Blue -> The Great Hall (E2M7) Yellow", player), lambda state: state.has("The Great Hall (E2M7) - Blue key", player, 1)) - set_rule(world.get_entrance("The Great Hall (E2M7) Yellow -> The Great Hall (E2M7) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Great Hall (E2M7) Yellow -> The Great Hall (E2M7) Blue", player), lambda state: state.has("The Great Hall (E2M7) - Blue key", player, 1)) - set_rule(world.get_entrance("The Great Hall (E2M7) Yellow -> The Great Hall (E2M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Great Hall (E2M7) Yellow -> The Great Hall (E2M7) Main", player), lambda state: state.has("The Great Hall (E2M7) - Yellow key", player, 1)) # The Portals of Chaos (E2M8) - set_rule(world.get_entrance("Hub -> The Portals of Chaos (E2M8) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Portals of Chaos (E2M8) Main", player), lambda state: state.has("The Portals of Chaos (E2M8)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -251,7 +251,7 @@ def set_episode2_rules(player, world, pro): state.has("Hellstaff", player, 1)) # The Glacier (E2M9) - set_rule(world.get_entrance("Hub -> The Glacier (E2M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Glacier (E2M9) Main", player), lambda state: (state.has("The Glacier (E2M9)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -259,51 +259,51 @@ def set_episode2_rules(player, world, pro): state.has("Firemace", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("The Glacier (E2M9) Main -> The Glacier (E2M9) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Glacier (E2M9) Main -> The Glacier (E2M9) Yellow", player), lambda state: state.has("The Glacier (E2M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Glacier (E2M9) Main -> The Glacier (E2M9) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Glacier (E2M9) Main -> The Glacier (E2M9) Blue", player), lambda state: state.has("The Glacier (E2M9) - Blue key", player, 1)) - set_rule(world.get_entrance("The Glacier (E2M9) Main -> The Glacier (E2M9) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Glacier (E2M9) Main -> The Glacier (E2M9) Green", player), lambda state: state.has("The Glacier (E2M9) - Green key", player, 1)) - set_rule(world.get_entrance("The Glacier (E2M9) Blue -> The Glacier (E2M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Glacier (E2M9) Blue -> The Glacier (E2M9) Main", player), lambda state: state.has("The Glacier (E2M9) - Blue key", player, 1)) - set_rule(world.get_entrance("The Glacier (E2M9) Yellow -> The Glacier (E2M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Glacier (E2M9) Yellow -> The Glacier (E2M9) Main", player), lambda state: state.has("The Glacier (E2M9) - Yellow key", player, 1)) -def set_episode3_rules(player, world, pro): +def set_episode3_rules(player, multiworld, pro): # The Storehouse (E3M1) - set_rule(world.get_entrance("Hub -> The Storehouse (E3M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Storehouse (E3M1) Main", player), lambda state: state.has("The Storehouse (E3M1)", player, 1)) - set_rule(world.get_entrance("The Storehouse (E3M1) Main -> The Storehouse (E3M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Storehouse (E3M1) Main -> The Storehouse (E3M1) Yellow", player), lambda state: state.has("The Storehouse (E3M1) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Storehouse (E3M1) Main -> The Storehouse (E3M1) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Storehouse (E3M1) Main -> The Storehouse (E3M1) Green", player), lambda state: state.has("The Storehouse (E3M1) - Green key", player, 1)) - set_rule(world.get_entrance("The Storehouse (E3M1) Yellow -> The Storehouse (E3M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Storehouse (E3M1) Yellow -> The Storehouse (E3M1) Main", player), lambda state: state.has("The Storehouse (E3M1) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Storehouse (E3M1) Green -> The Storehouse (E3M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Storehouse (E3M1) Green -> The Storehouse (E3M1) Main", player), lambda state: state.has("The Storehouse (E3M1) - Green key", player, 1)) # The Cesspool (E3M2) - set_rule(world.get_entrance("Hub -> The Cesspool (E3M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Cesspool (E3M2) Main", player), lambda state: state.has("The Cesspool (E3M2)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1)) - set_rule(world.get_entrance("The Cesspool (E3M2) Main -> The Cesspool (E3M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Cesspool (E3M2) Main -> The Cesspool (E3M2) Yellow", player), lambda state: state.has("The Cesspool (E3M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Cesspool (E3M2) Blue -> The Cesspool (E3M2) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Cesspool (E3M2) Blue -> The Cesspool (E3M2) Green", player), lambda state: state.has("The Cesspool (E3M2) - Blue key", player, 1)) - set_rule(world.get_entrance("The Cesspool (E3M2) Yellow -> The Cesspool (E3M2) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Cesspool (E3M2) Yellow -> The Cesspool (E3M2) Green", player), lambda state: state.has("The Cesspool (E3M2) - Green key", player, 1)) - set_rule(world.get_entrance("The Cesspool (E3M2) Green -> The Cesspool (E3M2) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Cesspool (E3M2) Green -> The Cesspool (E3M2) Blue", player), lambda state: state.has("The Cesspool (E3M2) - Blue key", player, 1)) - set_rule(world.get_entrance("The Cesspool (E3M2) Green -> The Cesspool (E3M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Cesspool (E3M2) Green -> The Cesspool (E3M2) Yellow", player), lambda state: state.has("The Cesspool (E3M2) - Green key", player, 1)) # The Confluence (E3M3) - set_rule(world.get_entrance("Hub -> The Confluence (E3M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Confluence (E3M3) Main", player), lambda state: (state.has("The Confluence (E3M3)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) and @@ -311,19 +311,19 @@ def set_episode3_rules(player, world, pro): state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("The Confluence (E3M3) Main -> The Confluence (E3M3) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Confluence (E3M3) Main -> The Confluence (E3M3) Green", player), lambda state: state.has("The Confluence (E3M3) - Green key", player, 1)) - set_rule(world.get_entrance("The Confluence (E3M3) Main -> The Confluence (E3M3) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Confluence (E3M3) Main -> The Confluence (E3M3) Yellow", player), lambda state: state.has("The Confluence (E3M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Confluence (E3M3) Blue -> The Confluence (E3M3) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Confluence (E3M3) Blue -> The Confluence (E3M3) Green", player), lambda state: state.has("The Confluence (E3M3) - Blue key", player, 1)) - set_rule(world.get_entrance("The Confluence (E3M3) Green -> The Confluence (E3M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Confluence (E3M3) Green -> The Confluence (E3M3) Main", player), lambda state: state.has("The Confluence (E3M3) - Green key", player, 1)) - set_rule(world.get_entrance("The Confluence (E3M3) Green -> The Confluence (E3M3) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Confluence (E3M3) Green -> The Confluence (E3M3) Blue", player), lambda state: state.has("The Confluence (E3M3) - Blue key", player, 1)) # The Azure Fortress (E3M4) - set_rule(world.get_entrance("Hub -> The Azure Fortress (E3M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Azure Fortress (E3M4) Main", player), lambda state: (state.has("The Azure Fortress (E3M4)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -331,13 +331,13 @@ def set_episode3_rules(player, world, pro): (state.has("Firemace", player, 1) or state.has("Phoenix Rod", player, 1) or state.has("Gauntlets of the Necromancer", player, 1))) - set_rule(world.get_entrance("The Azure Fortress (E3M4) Main -> The Azure Fortress (E3M4) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Azure Fortress (E3M4) Main -> The Azure Fortress (E3M4) Green", player), lambda state: state.has("The Azure Fortress (E3M4) - Green key", player, 1)) - set_rule(world.get_entrance("The Azure Fortress (E3M4) Main -> The Azure Fortress (E3M4) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Azure Fortress (E3M4) Main -> The Azure Fortress (E3M4) Yellow", player), lambda state: state.has("The Azure Fortress (E3M4) - Yellow key", player, 1)) # The Ophidian Lair (E3M5) - set_rule(world.get_entrance("Hub -> The Ophidian Lair (E3M5) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Ophidian Lair (E3M5) Main", player), lambda state: (state.has("The Ophidian Lair (E3M5)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -345,13 +345,13 @@ def set_episode3_rules(player, world, pro): (state.has("Gauntlets of the Necromancer", player, 1) or state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1))) - set_rule(world.get_entrance("The Ophidian Lair (E3M5) Main -> The Ophidian Lair (E3M5) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Ophidian Lair (E3M5) Main -> The Ophidian Lair (E3M5) Yellow", player), lambda state: state.has("The Ophidian Lair (E3M5) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Ophidian Lair (E3M5) Main -> The Ophidian Lair (E3M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Ophidian Lair (E3M5) Main -> The Ophidian Lair (E3M5) Green", player), lambda state: state.has("The Ophidian Lair (E3M5) - Green key", player, 1)) # The Halls of Fear (E3M6) - set_rule(world.get_entrance("Hub -> The Halls of Fear (E3M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Halls of Fear (E3M6) Main", player), lambda state: (state.has("The Halls of Fear (E3M6)", player, 1) and state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1) and @@ -359,17 +359,17 @@ def set_episode3_rules(player, world, pro): state.has("Ethereal Crossbow", player, 1)) and (state.has("Gauntlets of the Necromancer", player, 1) or state.has("Phoenix Rod", player, 1))) - set_rule(world.get_entrance("The Halls of Fear (E3M6) Main -> The Halls of Fear (E3M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Halls of Fear (E3M6) Main -> The Halls of Fear (E3M6) Yellow", player), lambda state: state.has("The Halls of Fear (E3M6) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Halls of Fear (E3M6) Blue -> The Halls of Fear (E3M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Halls of Fear (E3M6) Blue -> The Halls of Fear (E3M6) Yellow", player), lambda state: state.has("The Halls of Fear (E3M6) - Blue key", player, 1)) - set_rule(world.get_entrance("The Halls of Fear (E3M6) Yellow -> The Halls of Fear (E3M6) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Halls of Fear (E3M6) Yellow -> The Halls of Fear (E3M6) Blue", player), lambda state: state.has("The Halls of Fear (E3M6) - Blue key", player, 1)) - set_rule(world.get_entrance("The Halls of Fear (E3M6) Yellow -> The Halls of Fear (E3M6) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Halls of Fear (E3M6) Yellow -> The Halls of Fear (E3M6) Green", player), lambda state: state.has("The Halls of Fear (E3M6) - Green key", player, 1)) # The Chasm (E3M7) - set_rule(world.get_entrance("Hub -> The Chasm (E3M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Chasm (E3M7) Main", player), lambda state: (state.has("The Chasm (E3M7)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -377,19 +377,19 @@ def set_episode3_rules(player, world, pro): state.has("Hellstaff", player, 1)) and (state.has("Gauntlets of the Necromancer", player, 1) or state.has("Phoenix Rod", player, 1))) - set_rule(world.get_entrance("The Chasm (E3M7) Main -> The Chasm (E3M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (E3M7) Main -> The Chasm (E3M7) Yellow", player), lambda state: state.has("The Chasm (E3M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Chasm (E3M7) Yellow -> The Chasm (E3M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (E3M7) Yellow -> The Chasm (E3M7) Main", player), lambda state: state.has("The Chasm (E3M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Chasm (E3M7) Yellow -> The Chasm (E3M7) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (E3M7) Yellow -> The Chasm (E3M7) Green", player), lambda state: state.has("The Chasm (E3M7) - Green key", player, 1)) - set_rule(world.get_entrance("The Chasm (E3M7) Yellow -> The Chasm (E3M7) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (E3M7) Yellow -> The Chasm (E3M7) Blue", player), lambda state: state.has("The Chasm (E3M7) - Blue key", player, 1)) - set_rule(world.get_entrance("The Chasm (E3M7) Green -> The Chasm (E3M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (E3M7) Green -> The Chasm (E3M7) Yellow", player), lambda state: state.has("The Chasm (E3M7) - Green key", player, 1)) # D'Sparil'S Keep (E3M8) - set_rule(world.get_entrance("Hub -> D'Sparil'S Keep (E3M8) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> D'Sparil'S Keep (E3M8) Main", player), lambda state: state.has("D'Sparil'S Keep (E3M8)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -399,7 +399,7 @@ def set_episode3_rules(player, world, pro): state.has("Hellstaff", player, 1)) # The Aquifier (E3M9) - set_rule(world.get_entrance("Hub -> The Aquifier (E3M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> The Aquifier (E3M9) Main", player), lambda state: state.has("The Aquifier (E3M9)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -407,23 +407,23 @@ def set_episode3_rules(player, world, pro): state.has("Phoenix Rod", player, 1) and state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1)) - set_rule(world.get_entrance("The Aquifier (E3M9) Main -> The Aquifier (E3M9) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Aquifier (E3M9) Main -> The Aquifier (E3M9) Yellow", player), lambda state: state.has("The Aquifier (E3M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Aquifier (E3M9) Yellow -> The Aquifier (E3M9) Green", player), lambda state: + set_rule(multiworld.get_entrance("The Aquifier (E3M9) Yellow -> The Aquifier (E3M9) Green", player), lambda state: state.has("The Aquifier (E3M9) - Green key", player, 1)) - set_rule(world.get_entrance("The Aquifier (E3M9) Yellow -> The Aquifier (E3M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Aquifier (E3M9) Yellow -> The Aquifier (E3M9) Main", player), lambda state: state.has("The Aquifier (E3M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("The Aquifier (E3M9) Green -> The Aquifier (E3M9) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Aquifier (E3M9) Green -> The Aquifier (E3M9) Yellow", player), lambda state: state.has("The Aquifier (E3M9) - Green key", player, 1)) -def set_episode4_rules(player, world, pro): +def set_episode4_rules(player, multiworld, pro): # Catafalque (E4M1) - set_rule(world.get_entrance("Hub -> Catafalque (E4M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Catafalque (E4M1) Main", player), lambda state: state.has("Catafalque (E4M1)", player, 1)) - set_rule(world.get_entrance("Catafalque (E4M1) Main -> Catafalque (E4M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Catafalque (E4M1) Main -> Catafalque (E4M1) Yellow", player), lambda state: state.has("Catafalque (E4M1) - Yellow key", player, 1)) - set_rule(world.get_entrance("Catafalque (E4M1) Yellow -> Catafalque (E4M1) Green", player), lambda state: + set_rule(multiworld.get_entrance("Catafalque (E4M1) Yellow -> Catafalque (E4M1) Green", player), lambda state: (state.has("Catafalque (E4M1) - Green key", player, 1)) and (state.has("Ethereal Crossbow", player, 1) or state.has("Dragon Claw", player, 1) or state.has("Phoenix Rod", player, 1) or @@ -431,23 +431,23 @@ def set_episode4_rules(player, world, pro): state.has("Hellstaff", player, 1))) # Blockhouse (E4M2) - set_rule(world.get_entrance("Hub -> Blockhouse (E4M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Blockhouse (E4M2) Main", player), lambda state: state.has("Blockhouse (E4M2)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) - set_rule(world.get_entrance("Blockhouse (E4M2) Main -> Blockhouse (E4M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Blockhouse (E4M2) Main -> Blockhouse (E4M2) Yellow", player), lambda state: state.has("Blockhouse (E4M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("Blockhouse (E4M2) Main -> Blockhouse (E4M2) Green", player), lambda state: + set_rule(multiworld.get_entrance("Blockhouse (E4M2) Main -> Blockhouse (E4M2) Green", player), lambda state: state.has("Blockhouse (E4M2) - Green key", player, 1)) - set_rule(world.get_entrance("Blockhouse (E4M2) Main -> Blockhouse (E4M2) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Blockhouse (E4M2) Main -> Blockhouse (E4M2) Blue", player), lambda state: state.has("Blockhouse (E4M2) - Blue key", player, 1)) - set_rule(world.get_entrance("Blockhouse (E4M2) Green -> Blockhouse (E4M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Blockhouse (E4M2) Green -> Blockhouse (E4M2) Main", player), lambda state: state.has("Blockhouse (E4M2) - Green key", player, 1)) - set_rule(world.get_entrance("Blockhouse (E4M2) Blue -> Blockhouse (E4M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Blockhouse (E4M2) Blue -> Blockhouse (E4M2) Main", player), lambda state: state.has("Blockhouse (E4M2) - Blue key", player, 1)) # Ambulatory (E4M3) - set_rule(world.get_entrance("Hub -> Ambulatory (E4M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Ambulatory (E4M3) Main", player), lambda state: (state.has("Ambulatory (E4M3)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -455,15 +455,17 @@ def set_episode4_rules(player, world, pro): (state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Blue", player), lambda state: state.has("Ambulatory (E4M3) - Blue key", player, 1)) - set_rule(world.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Yellow", player), lambda state: state.has("Ambulatory (E4M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Green", player), lambda state: + set_rule(multiworld.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Green", player), lambda state: + state.has("Ambulatory (E4M3) - Green key", player, 1)) + set_rule(multiworld.get_entrance("Ambulatory (E4M3) Main -> Ambulatory (E4M3) Green Lock", player), lambda state: state.has("Ambulatory (E4M3) - Green key", player, 1)) # Sepulcher (E4M4) - set_rule(world.get_entrance("Hub -> Sepulcher (E4M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Sepulcher (E4M4) Main", player), lambda state: (state.has("Sepulcher (E4M4)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -473,7 +475,7 @@ def set_episode4_rules(player, world, pro): state.has("Hellstaff", player, 1))) # Great Stair (E4M5) - set_rule(world.get_entrance("Hub -> Great Stair (E4M5) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Great Stair (E4M5) Main", player), lambda state: (state.has("Great Stair (E4M5)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -481,19 +483,19 @@ def set_episode4_rules(player, world, pro): state.has("Firemace", player, 1)) and (state.has("Hellstaff", player, 1) or state.has("Phoenix Rod", player, 1))) - set_rule(world.get_entrance("Great Stair (E4M5) Main -> Great Stair (E4M5) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Great Stair (E4M5) Main -> Great Stair (E4M5) Yellow", player), lambda state: state.has("Great Stair (E4M5) - Yellow key", player, 1)) - set_rule(world.get_entrance("Great Stair (E4M5) Blue -> Great Stair (E4M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("Great Stair (E4M5) Blue -> Great Stair (E4M5) Green", player), lambda state: state.has("Great Stair (E4M5) - Blue key", player, 1)) - set_rule(world.get_entrance("Great Stair (E4M5) Yellow -> Great Stair (E4M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("Great Stair (E4M5) Yellow -> Great Stair (E4M5) Green", player), lambda state: state.has("Great Stair (E4M5) - Green key", player, 1)) - set_rule(world.get_entrance("Great Stair (E4M5) Green -> Great Stair (E4M5) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Great Stair (E4M5) Green -> Great Stair (E4M5) Blue", player), lambda state: state.has("Great Stair (E4M5) - Blue key", player, 1)) - set_rule(world.get_entrance("Great Stair (E4M5) Green -> Great Stair (E4M5) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Great Stair (E4M5) Green -> Great Stair (E4M5) Yellow", player), lambda state: state.has("Great Stair (E4M5) - Green key", player, 1)) # Halls of the Apostate (E4M6) - set_rule(world.get_entrance("Hub -> Halls of the Apostate (E4M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Halls of the Apostate (E4M6) Main", player), lambda state: (state.has("Halls of the Apostate (E4M6)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -501,19 +503,19 @@ def set_episode4_rules(player, world, pro): state.has("Firemace", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Halls of the Apostate (E4M6) Main -> Halls of the Apostate (E4M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Halls of the Apostate (E4M6) Main -> Halls of the Apostate (E4M6) Yellow", player), lambda state: state.has("Halls of the Apostate (E4M6) - Yellow key", player, 1)) - set_rule(world.get_entrance("Halls of the Apostate (E4M6) Blue -> Halls of the Apostate (E4M6) Green", player), lambda state: + set_rule(multiworld.get_entrance("Halls of the Apostate (E4M6) Blue -> Halls of the Apostate (E4M6) Green", player), lambda state: state.has("Halls of the Apostate (E4M6) - Blue key", player, 1)) - set_rule(world.get_entrance("Halls of the Apostate (E4M6) Yellow -> Halls of the Apostate (E4M6) Green", player), lambda state: + set_rule(multiworld.get_entrance("Halls of the Apostate (E4M6) Yellow -> Halls of the Apostate (E4M6) Green", player), lambda state: state.has("Halls of the Apostate (E4M6) - Green key", player, 1)) - set_rule(world.get_entrance("Halls of the Apostate (E4M6) Green -> Halls of the Apostate (E4M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Halls of the Apostate (E4M6) Green -> Halls of the Apostate (E4M6) Yellow", player), lambda state: state.has("Halls of the Apostate (E4M6) - Green key", player, 1)) - set_rule(world.get_entrance("Halls of the Apostate (E4M6) Green -> Halls of the Apostate (E4M6) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Halls of the Apostate (E4M6) Green -> Halls of the Apostate (E4M6) Blue", player), lambda state: state.has("Halls of the Apostate (E4M6) - Blue key", player, 1)) # Ramparts of Perdition (E4M7) - set_rule(world.get_entrance("Hub -> Ramparts of Perdition (E4M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Ramparts of Perdition (E4M7) Main", player), lambda state: (state.has("Ramparts of Perdition (E4M7)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -521,21 +523,21 @@ def set_episode4_rules(player, world, pro): state.has("Firemace", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Ramparts of Perdition (E4M7) Main -> Ramparts of Perdition (E4M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ramparts of Perdition (E4M7) Main -> Ramparts of Perdition (E4M7) Yellow", player), lambda state: state.has("Ramparts of Perdition (E4M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("Ramparts of Perdition (E4M7) Blue -> Ramparts of Perdition (E4M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ramparts of Perdition (E4M7) Blue -> Ramparts of Perdition (E4M7) Yellow", player), lambda state: state.has("Ramparts of Perdition (E4M7) - Blue key", player, 1)) - set_rule(world.get_entrance("Ramparts of Perdition (E4M7) Yellow -> Ramparts of Perdition (E4M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("Ramparts of Perdition (E4M7) Yellow -> Ramparts of Perdition (E4M7) Main", player), lambda state: state.has("Ramparts of Perdition (E4M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("Ramparts of Perdition (E4M7) Yellow -> Ramparts of Perdition (E4M7) Green", player), lambda state: + set_rule(multiworld.get_entrance("Ramparts of Perdition (E4M7) Yellow -> Ramparts of Perdition (E4M7) Green", player), lambda state: state.has("Ramparts of Perdition (E4M7) - Green key", player, 1)) - set_rule(world.get_entrance("Ramparts of Perdition (E4M7) Yellow -> Ramparts of Perdition (E4M7) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Ramparts of Perdition (E4M7) Yellow -> Ramparts of Perdition (E4M7) Blue", player), lambda state: state.has("Ramparts of Perdition (E4M7) - Blue key", player, 1)) - set_rule(world.get_entrance("Ramparts of Perdition (E4M7) Green -> Ramparts of Perdition (E4M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ramparts of Perdition (E4M7) Green -> Ramparts of Perdition (E4M7) Yellow", player), lambda state: state.has("Ramparts of Perdition (E4M7) - Green key", player, 1)) # Shattered Bridge (E4M8) - set_rule(world.get_entrance("Hub -> Shattered Bridge (E4M8) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Shattered Bridge (E4M8) Main", player), lambda state: state.has("Shattered Bridge (E4M8)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -543,13 +545,13 @@ def set_episode4_rules(player, world, pro): state.has("Phoenix Rod", player, 1) and state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1)) - set_rule(world.get_entrance("Shattered Bridge (E4M8) Main -> Shattered Bridge (E4M8) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Shattered Bridge (E4M8) Main -> Shattered Bridge (E4M8) Yellow", player), lambda state: state.has("Shattered Bridge (E4M8) - Yellow key", player, 1)) - set_rule(world.get_entrance("Shattered Bridge (E4M8) Yellow -> Shattered Bridge (E4M8) Main", player), lambda state: + set_rule(multiworld.get_entrance("Shattered Bridge (E4M8) Yellow -> Shattered Bridge (E4M8) Main", player), lambda state: state.has("Shattered Bridge (E4M8) - Yellow key", player, 1)) # Mausoleum (E4M9) - set_rule(world.get_entrance("Hub -> Mausoleum (E4M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Mausoleum (E4M9) Main", player), lambda state: (state.has("Mausoleum (E4M9)", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Ethereal Crossbow", player, 1) and @@ -557,102 +559,100 @@ def set_episode4_rules(player, world, pro): state.has("Firemace", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Mausoleum (E4M9) Main -> Mausoleum (E4M9) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Mausoleum (E4M9) Main -> Mausoleum (E4M9) Yellow", player), lambda state: state.has("Mausoleum (E4M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("Mausoleum (E4M9) Yellow -> Mausoleum (E4M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Mausoleum (E4M9) Yellow -> Mausoleum (E4M9) Main", player), lambda state: state.has("Mausoleum (E4M9) - Yellow key", player, 1)) -def set_episode5_rules(player, world, pro): +def set_episode5_rules(player, multiworld, pro): # Ochre Cliffs (E5M1) - set_rule(world.get_entrance("Hub -> Ochre Cliffs (E5M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Ochre Cliffs (E5M1) Main", player), lambda state: state.has("Ochre Cliffs (E5M1)", player, 1)) - set_rule(world.get_entrance("Ochre Cliffs (E5M1) Main -> Ochre Cliffs (E5M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ochre Cliffs (E5M1) Main -> Ochre Cliffs (E5M1) Yellow", player), lambda state: state.has("Ochre Cliffs (E5M1) - Yellow key", player, 1)) - set_rule(world.get_entrance("Ochre Cliffs (E5M1) Blue -> Ochre Cliffs (E5M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ochre Cliffs (E5M1) Blue -> Ochre Cliffs (E5M1) Yellow", player), lambda state: state.has("Ochre Cliffs (E5M1) - Blue key", player, 1)) - set_rule(world.get_entrance("Ochre Cliffs (E5M1) Yellow -> Ochre Cliffs (E5M1) Main", player), lambda state: + set_rule(multiworld.get_entrance("Ochre Cliffs (E5M1) Yellow -> Ochre Cliffs (E5M1) Main", player), lambda state: state.has("Ochre Cliffs (E5M1) - Yellow key", player, 1)) - set_rule(world.get_entrance("Ochre Cliffs (E5M1) Yellow -> Ochre Cliffs (E5M1) Green", player), lambda state: + set_rule(multiworld.get_entrance("Ochre Cliffs (E5M1) Yellow -> Ochre Cliffs (E5M1) Green", player), lambda state: state.has("Ochre Cliffs (E5M1) - Green key", player, 1)) - set_rule(world.get_entrance("Ochre Cliffs (E5M1) Yellow -> Ochre Cliffs (E5M1) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Ochre Cliffs (E5M1) Yellow -> Ochre Cliffs (E5M1) Blue", player), lambda state: state.has("Ochre Cliffs (E5M1) - Blue key", player, 1)) - set_rule(world.get_entrance("Ochre Cliffs (E5M1) Green -> Ochre Cliffs (E5M1) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Ochre Cliffs (E5M1) Green -> Ochre Cliffs (E5M1) Yellow", player), lambda state: state.has("Ochre Cliffs (E5M1) - Green key", player, 1)) # Rapids (E5M2) - set_rule(world.get_entrance("Hub -> Rapids (E5M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Rapids (E5M2) Main", player), lambda state: state.has("Rapids (E5M2)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) - set_rule(world.get_entrance("Rapids (E5M2) Main -> Rapids (E5M2) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Rapids (E5M2) Main -> Rapids (E5M2) Yellow", player), lambda state: state.has("Rapids (E5M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("Rapids (E5M2) Yellow -> Rapids (E5M2) Main", player), lambda state: + set_rule(multiworld.get_entrance("Rapids (E5M2) Yellow -> Rapids (E5M2) Main", player), lambda state: state.has("Rapids (E5M2) - Yellow key", player, 1)) - set_rule(world.get_entrance("Rapids (E5M2) Yellow -> Rapids (E5M2) Green", player), lambda state: + set_rule(multiworld.get_entrance("Rapids (E5M2) Yellow -> Rapids (E5M2) Green", player), lambda state: state.has("Rapids (E5M2) - Green key", player, 1)) # Quay (E5M3) - set_rule(world.get_entrance("Hub -> Quay (E5M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Quay (E5M3) Main", player), lambda state: (state.has("Quay (E5M3)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1) or state.has("Firemace", player, 1))) - set_rule(world.get_entrance("Quay (E5M3) Main -> Quay (E5M3) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Quay (E5M3) Main -> Quay (E5M3) Yellow", player), lambda state: state.has("Quay (E5M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("Quay (E5M3) Main -> Quay (E5M3) Green", player), lambda state: + set_rule(multiworld.get_entrance("Quay (E5M3) Main -> Quay (E5M3) Green", player), lambda state: state.has("Quay (E5M3) - Green key", player, 1)) - set_rule(world.get_entrance("Quay (E5M3) Main -> Quay (E5M3) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Quay (E5M3) Main -> Quay (E5M3) Blue", player), lambda state: state.has("Quay (E5M3) - Blue key", player, 1)) - set_rule(world.get_entrance("Quay (E5M3) Blue -> Quay (E5M3) Green", player), lambda state: - state.has("Quay (E5M3) - Blue key", player, 1)) - set_rule(world.get_entrance("Quay (E5M3) Yellow -> Quay (E5M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Quay (E5M3) Yellow -> Quay (E5M3) Main", player), lambda state: state.has("Quay (E5M3) - Yellow key", player, 1)) - set_rule(world.get_entrance("Quay (E5M3) Green -> Quay (E5M3) Main", player), lambda state: + set_rule(multiworld.get_entrance("Quay (E5M3) Green -> Quay (E5M3) Main", player), lambda state: state.has("Quay (E5M3) - Green key", player, 1)) - set_rule(world.get_entrance("Quay (E5M3) Green -> Quay (E5M3) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Quay (E5M3) Green -> Quay (E5M3) Cyan", player), lambda state: state.has("Quay (E5M3) - Blue key", player, 1)) # Courtyard (E5M4) - set_rule(world.get_entrance("Hub -> Courtyard (E5M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Courtyard (E5M4) Main", player), lambda state: (state.has("Courtyard (E5M4)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Courtyard (E5M4) Main -> Courtyard (E5M4) Kakis", player), lambda state: + set_rule(multiworld.get_entrance("Courtyard (E5M4) Main -> Courtyard (E5M4) Kakis", player), lambda state: state.has("Courtyard (E5M4) - Yellow key", player, 1) or state.has("Courtyard (E5M4) - Green key", player, 1)) - set_rule(world.get_entrance("Courtyard (E5M4) Main -> Courtyard (E5M4) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Courtyard (E5M4) Main -> Courtyard (E5M4) Blue", player), lambda state: state.has("Courtyard (E5M4) - Blue key", player, 1)) - set_rule(world.get_entrance("Courtyard (E5M4) Blue -> Courtyard (E5M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Courtyard (E5M4) Blue -> Courtyard (E5M4) Main", player), lambda state: state.has("Courtyard (E5M4) - Blue key", player, 1)) - set_rule(world.get_entrance("Courtyard (E5M4) Kakis -> Courtyard (E5M4) Main", player), lambda state: + set_rule(multiworld.get_entrance("Courtyard (E5M4) Kakis -> Courtyard (E5M4) Main", player), lambda state: state.has("Courtyard (E5M4) - Yellow key", player, 1) or state.has("Courtyard (E5M4) - Green key", player, 1)) # Hydratyr (E5M5) - set_rule(world.get_entrance("Hub -> Hydratyr (E5M5) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Hydratyr (E5M5) Main", player), lambda state: (state.has("Hydratyr (E5M5)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and state.has("Firemace", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Hydratyr (E5M5) Main -> Hydratyr (E5M5) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Hydratyr (E5M5) Main -> Hydratyr (E5M5) Yellow", player), lambda state: state.has("Hydratyr (E5M5) - Yellow key", player, 1)) - set_rule(world.get_entrance("Hydratyr (E5M5) Blue -> Hydratyr (E5M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("Hydratyr (E5M5) Blue -> Hydratyr (E5M5) Green", player), lambda state: state.has("Hydratyr (E5M5) - Blue key", player, 1)) - set_rule(world.get_entrance("Hydratyr (E5M5) Yellow -> Hydratyr (E5M5) Green", player), lambda state: + set_rule(multiworld.get_entrance("Hydratyr (E5M5) Yellow -> Hydratyr (E5M5) Green", player), lambda state: state.has("Hydratyr (E5M5) - Green key", player, 1)) - set_rule(world.get_entrance("Hydratyr (E5M5) Green -> Hydratyr (E5M5) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Hydratyr (E5M5) Green -> Hydratyr (E5M5) Blue", player), lambda state: state.has("Hydratyr (E5M5) - Blue key", player, 1)) # Colonnade (E5M6) - set_rule(world.get_entrance("Hub -> Colonnade (E5M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Colonnade (E5M6) Main", player), lambda state: (state.has("Colonnade (E5M6)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -660,19 +660,19 @@ def set_episode5_rules(player, world, pro): state.has("Gauntlets of the Necromancer", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Colonnade (E5M6) Main -> Colonnade (E5M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Colonnade (E5M6) Main -> Colonnade (E5M6) Yellow", player), lambda state: state.has("Colonnade (E5M6) - Yellow key", player, 1)) - set_rule(world.get_entrance("Colonnade (E5M6) Main -> Colonnade (E5M6) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Colonnade (E5M6) Main -> Colonnade (E5M6) Blue", player), lambda state: state.has("Colonnade (E5M6) - Blue key", player, 1)) - set_rule(world.get_entrance("Colonnade (E5M6) Blue -> Colonnade (E5M6) Main", player), lambda state: + set_rule(multiworld.get_entrance("Colonnade (E5M6) Blue -> Colonnade (E5M6) Main", player), lambda state: state.has("Colonnade (E5M6) - Blue key", player, 1)) - set_rule(world.get_entrance("Colonnade (E5M6) Yellow -> Colonnade (E5M6) Green", player), lambda state: + set_rule(multiworld.get_entrance("Colonnade (E5M6) Yellow -> Colonnade (E5M6) Green", player), lambda state: state.has("Colonnade (E5M6) - Green key", player, 1)) - set_rule(world.get_entrance("Colonnade (E5M6) Green -> Colonnade (E5M6) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Colonnade (E5M6) Green -> Colonnade (E5M6) Yellow", player), lambda state: state.has("Colonnade (E5M6) - Green key", player, 1)) # Foetid Manse (E5M7) - set_rule(world.get_entrance("Hub -> Foetid Manse (E5M7) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Foetid Manse (E5M7) Main", player), lambda state: (state.has("Foetid Manse (E5M7)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -680,15 +680,15 @@ def set_episode5_rules(player, world, pro): state.has("Gauntlets of the Necromancer", player, 1)) and (state.has("Phoenix Rod", player, 1) or state.has("Hellstaff", player, 1))) - set_rule(world.get_entrance("Foetid Manse (E5M7) Main -> Foetid Manse (E5M7) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Foetid Manse (E5M7) Main -> Foetid Manse (E5M7) Yellow", player), lambda state: state.has("Foetid Manse (E5M7) - Yellow key", player, 1)) - set_rule(world.get_entrance("Foetid Manse (E5M7) Yellow -> Foetid Manse (E5M7) Green", player), lambda state: + set_rule(multiworld.get_entrance("Foetid Manse (E5M7) Yellow -> Foetid Manse (E5M7) Green", player), lambda state: state.has("Foetid Manse (E5M7) - Green key", player, 1)) - set_rule(world.get_entrance("Foetid Manse (E5M7) Yellow -> Foetid Manse (E5M7) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Foetid Manse (E5M7) Yellow -> Foetid Manse (E5M7) Blue", player), lambda state: state.has("Foetid Manse (E5M7) - Blue key", player, 1)) # Field of Judgement (E5M8) - set_rule(world.get_entrance("Hub -> Field of Judgement (E5M8) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Field of Judgement (E5M8) Main", player), lambda state: state.has("Field of Judgement (E5M8)", player, 1) and state.has("Ethereal Crossbow", player, 1) and state.has("Dragon Claw", player, 1) and @@ -699,7 +699,7 @@ def set_episode5_rules(player, world, pro): state.has("Bag of Holding", player, 1)) # Skein of D'Sparil (E5M9) - set_rule(world.get_entrance("Hub -> Skein of D'Sparil (E5M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Hub -> Skein of D'Sparil (E5M9) Main", player), lambda state: state.has("Skein of D'Sparil (E5M9)", player, 1) and state.has("Bag of Holding", player, 1) and state.has("Hellstaff", player, 1) and @@ -708,29 +708,29 @@ def set_episode5_rules(player, world, pro): state.has("Ethereal Crossbow", player, 1) and state.has("Gauntlets of the Necromancer", player, 1) and state.has("Firemace", player, 1)) - set_rule(world.get_entrance("Skein of D'Sparil (E5M9) Main -> Skein of D'Sparil (E5M9) Blue", player), lambda state: + set_rule(multiworld.get_entrance("Skein of D'Sparil (E5M9) Main -> Skein of D'Sparil (E5M9) Blue", player), lambda state: state.has("Skein of D'Sparil (E5M9) - Blue key", player, 1)) - set_rule(world.get_entrance("Skein of D'Sparil (E5M9) Main -> Skein of D'Sparil (E5M9) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("Skein of D'Sparil (E5M9) Main -> Skein of D'Sparil (E5M9) Yellow", player), lambda state: state.has("Skein of D'Sparil (E5M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("Skein of D'Sparil (E5M9) Main -> Skein of D'Sparil (E5M9) Green", player), lambda state: + set_rule(multiworld.get_entrance("Skein of D'Sparil (E5M9) Main -> Skein of D'Sparil (E5M9) Green", player), lambda state: state.has("Skein of D'Sparil (E5M9) - Green key", player, 1)) - set_rule(world.get_entrance("Skein of D'Sparil (E5M9) Yellow -> Skein of D'Sparil (E5M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Skein of D'Sparil (E5M9) Yellow -> Skein of D'Sparil (E5M9) Main", player), lambda state: state.has("Skein of D'Sparil (E5M9) - Yellow key", player, 1)) - set_rule(world.get_entrance("Skein of D'Sparil (E5M9) Green -> Skein of D'Sparil (E5M9) Main", player), lambda state: + set_rule(multiworld.get_entrance("Skein of D'Sparil (E5M9) Green -> Skein of D'Sparil (E5M9) Main", player), lambda state: state.has("Skein of D'Sparil (E5M9) - Green key", player, 1)) def set_rules(heretic_world: "HereticWorld", included_episodes, pro): player = heretic_world.player - world = heretic_world.multiworld + multiworld = heretic_world.multiworld if included_episodes[0]: - set_episode1_rules(player, world, pro) + set_episode1_rules(player, multiworld, pro) if included_episodes[1]: - set_episode2_rules(player, world, pro) + set_episode2_rules(player, multiworld, pro) if included_episodes[2]: - set_episode3_rules(player, world, pro) + set_episode3_rules(player, multiworld, pro) if included_episodes[3]: - set_episode4_rules(player, world, pro) + set_episode4_rules(player, multiworld, pro) if included_episodes[4]: - set_episode5_rules(player, world, pro) + set_episode5_rules(player, multiworld, pro) diff --git a/worlds/heretic/__init__.py b/worlds/heretic/__init__.py index b0b2bfce..a0ceed4f 100644 --- a/worlds/heretic/__init__.py +++ b/worlds/heretic/__init__.py @@ -2,9 +2,10 @@ import functools import logging from typing import Any, Dict, List, Set -from BaseClasses import Entrance, CollectionState, Item, ItemClassification, Location, MultiWorld, Region, Tutorial +from BaseClasses import Entrance, CollectionState, Item, Location, MultiWorld, Region, Tutorial from worlds.AutoWorld import WebWorld, World -from . import Items, Locations, Maps, Options, Regions, Rules +from . import Items, Locations, Maps, Regions, Rules +from .Options import HereticOptions logger = logging.getLogger("Heretic") @@ -36,7 +37,8 @@ class HereticWorld(World): """ Heretic is a dark fantasy first-person shooter video game released in December 1994. It was developed by Raven Software. """ - option_definitions = Options.options + options_dataclass = HereticOptions + options: HereticOptions game = "Heretic" web = HereticWeb() data_version = 3 @@ -56,7 +58,7 @@ class HereticWorld(World): "Ochre Cliffs (E5M1)" ] - boss_level_for_espidoes: List[str] = [ + boss_level_for_episode: List[str] = [ "Hell's Maw (E1M8)", "The Portals of Chaos (E2M8)", "D'Sparil'S Keep (E3M8)", @@ -77,27 +79,30 @@ class HereticWorld(World): "Shadowsphere": 1 } - def __init__(self, world: MultiWorld, player: int): + def __init__(self, multiworld: MultiWorld, player: int): self.included_episodes = [1, 1, 1, 0, 0] self.location_count = 0 - super().__init__(world, player) + super().__init__(multiworld, player) def get_episode_count(self): return functools.reduce(lambda count, episode: count + episode, self.included_episodes) def generate_early(self): # Cache which episodes are included - for i in range(5): - self.included_episodes[i] = getattr(self.multiworld, f"episode{i + 1}")[self.player].value + self.included_episodes[0] = self.options.episode1.value + self.included_episodes[1] = self.options.episode2.value + self.included_episodes[2] = self.options.episode3.value + self.included_episodes[3] = self.options.episode4.value + self.included_episodes[4] = self.options.episode5.value # If no episodes selected, select Episode 1 if self.get_episode_count() == 0: self.included_episodes[0] = 1 def create_regions(self): - pro = getattr(self.multiworld, "pro")[self.player].value - check_sanity = getattr(self.multiworld, "check_sanity")[self.player].value + pro = self.options.pro.value + check_sanity = self.options.check_sanity.value # Main regions menu_region = Region("Menu", self.player, self.multiworld) @@ -148,8 +153,8 @@ class HereticWorld(World): def completion_rule(self, state: CollectionState): goal_levels = Maps.map_names - if getattr(self.multiworld, "goal")[self.player].value: - goal_levels = self.boss_level_for_espidoes + if self.options.goal.value: + goal_levels = self.boss_level_for_episode for map_name in goal_levels: if map_name + " - Exit" not in self.location_name_to_id: @@ -167,8 +172,8 @@ class HereticWorld(World): return True def set_rules(self): - pro = getattr(self.multiworld, "pro")[self.player].value - allow_death_logic = getattr(self.multiworld, "allow_death_logic")[self.player].value + pro = self.options.pro.value + allow_death_logic = self.options.allow_death_logic.value Rules.set_rules(self, self.included_episodes, pro) self.multiworld.completion_condition[self.player] = lambda state: self.completion_rule(state) @@ -185,7 +190,7 @@ class HereticWorld(World): def create_items(self): itempool: List[HereticItem] = [] - start_with_map_scrolls: bool = getattr(self.multiworld, "start_with_map_scrolls")[self.player].value + start_with_map_scrolls: bool = self.options.start_with_map_scrolls.value # Items for item_id, item in Items.item_table.items(): @@ -225,7 +230,7 @@ class HereticWorld(World): self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i])) # Give Computer area maps if option selected - if getattr(self.multiworld, "start_with_map_scrolls")[self.player].value: + if self.options.start_with_map_scrolls.value: for item_id, item_dict in Items.item_table.items(): item_episode = item_dict["episode"] if item_episode > 0: @@ -275,7 +280,7 @@ class HereticWorld(World): itempool.append(self.create_item(item_name)) def fill_slot_data(self) -> Dict[str, Any]: - slot_data = self.options.as_dict("difficulty", "random_monsters", "random_pickups", "random_music", "allow_death_logic", "pro", "death_link", "reset_level_on_death", "check_sanity") + slot_data = self.options.as_dict("goal", "difficulty", "random_monsters", "random_pickups", "random_music", "allow_death_logic", "pro", "death_link", "reset_level_on_death", "check_sanity") # Make sure we send proper episode settings slot_data["episode1"] = self.included_episodes[0] diff --git a/worlds/heretic/docs/setup_en.md b/worlds/heretic/docs/setup_en.md index e01d616e..41b7fdab 100644 --- a/worlds/heretic/docs/setup_en.md +++ b/worlds/heretic/docs/setup_en.md @@ -13,7 +13,7 @@ 1. Download [APDOOM.zip](https://github.com/Daivuk/apdoom/releases) and extract it. 2. Copy HERETIC.WAD from your steam install into the extracted folder. You can find the folder in steam by finding the game in your library, - right clicking it and choosing *Manage→Browse Local Files*. + right clicking it and choosing *Manage→Browse Local Files*. The WAD file is in the `/base/` folder. ## Joining a MultiWorld Game