From 26cf4c3c9fc9113048f2f714f000dfb6a6cf2500 Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Fri, 21 Feb 2025 14:45:33 -0800 Subject: [PATCH 1/3] id Tech 1: Logic fixes and updates for all games --- worlds/doom_1993/Locations.py | 12 +- worlds/doom_1993/Regions.py | 53 ++++-- worlds/doom_1993/Rules.py | 64 +++---- worlds/doom_ii/Items.py | 26 +-- worlds/doom_ii/Locations.py | 316 +++++++++++++++++----------------- worlds/doom_ii/Maps.py | 6 +- worlds/doom_ii/Regions.py | 147 ++++++++++++---- worlds/doom_ii/Rules.py | 207 +++++++++++----------- worlds/heretic/Items.py | 24 +-- worlds/heretic/Locations.py | 276 ++++++++++++++--------------- worlds/heretic/Maps.py | 4 +- worlds/heretic/Regions.py | 38 ++-- worlds/heretic/Rules.py | 40 +++-- 13 files changed, 669 insertions(+), 544 deletions(-) diff --git a/worlds/doom_1993/Locations.py b/worlds/doom_1993/Locations.py index 90a6916cd716..5a9dd399b193 100644 --- a/worlds/doom_1993/Locations.py +++ b/worlds/doom_1993/Locations.py @@ -126,7 +126,7 @@ class LocationDict(TypedDict, total=False): 'map': 3, 'index': 64, 'doom_type': 2001, - 'region': "Toxin Refinery (E1M3) Main"}, + 'region': "Toxin Refinery (E1M3) Start"}, 351019: {'name': 'Toxin Refinery (E1M3) - Shotgun 2', 'episode': 1, 'map': 3, @@ -234,7 +234,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 107, 'doom_type': 8, - 'region': "Command Control (E1M4) Main"}, + 'region': "Command Control (E1M4) Start"}, 351037: {'name': 'Command Control (E1M4) - Shotgun', 'episode': 1, 'map': 4, @@ -504,7 +504,7 @@ class LocationDict(TypedDict, total=False): 'map': 7, 'index': 122, 'doom_type': 2001, - 'region': "Computer Station (E1M7) Main"}, + 'region': "Computer Station (E1M7) Start"}, 351082: {'name': 'Computer Station (E1M7) - Rocket launcher', 'episode': 1, 'map': 7, @@ -912,7 +912,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 109, 'doom_type': 2001, - 'region': "Deimos Lab (E2M4) Main"}, + 'region': "Deimos Lab (E2M4) Start"}, 351150: {'name': 'Deimos Lab (E2M4) - Mega Armor', 'episode': 2, 'map': 4, @@ -1242,7 +1242,7 @@ class LocationDict(TypedDict, total=False): 'map': 8, 'index': 36, 'doom_type': 2019, - 'region': "Tower of Babel (E2M8) Main"}, + 'region': "Tower of Babel (E2M8) Start"}, 351205: {'name': 'Fortress of Mystery (E2M9) - Supercharge', 'episode': 2, 'map': 9, @@ -1638,7 +1638,7 @@ class LocationDict(TypedDict, total=False): 'map': 5, 'index': 187, 'doom_type': 2001, - 'region': "Unholy Cathedral (E3M5) Main"}, + 'region': "Unholy Cathedral (E3M5) Start"}, 351271: {'name': 'Unholy Cathedral (E3M5) - Shotgun 2', 'episode': 3, 'map': 5, diff --git a/worlds/doom_1993/Regions.py b/worlds/doom_1993/Regions.py index c32f7b470101..b01f5a22939c 100644 --- a/worlds/doom_1993/Regions.py +++ b/worlds/doom_1993/Regions.py @@ -33,9 +33,11 @@ class RegionDict(TypedDict, total=False): # Toxin Refinery (E1M3) {"name":"Toxin Refinery (E1M3) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":1, - "connections":[{"target":"Toxin Refinery (E1M3) Blue","pro":False}]}, + "connections":[ + {"target":"Toxin Refinery (E1M3) Blue","pro":False}, + {"target":"Toxin Refinery (E1M3) Start","pro":False}]}, {"name":"Toxin Refinery (E1M3) Blue", "connects_to_hub":False, "episode":1, @@ -46,15 +48,20 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":1, "connections":[{"target":"Toxin Refinery (E1M3) Blue","pro":False}]}, + {"name":"Toxin Refinery (E1M3) Start", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"Toxin Refinery (E1M3) Main","pro":False}]}, # Command Control (E1M4) {"name":"Command Control (E1M4) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":1, "connections":[ {"target":"Command Control (E1M4) Blue","pro":False}, {"target":"Command Control (E1M4) Yellow","pro":False}, - {"target":"Command Control (E1M4) Ledge","pro":True}]}, + {"target":"Command Control (E1M4) Ledge","pro":True}, + {"target":"Command Control (E1M4) Start","pro":False}]}, {"name":"Command Control (E1M4) Blue", "connects_to_hub":False, "episode":1, @@ -72,6 +79,10 @@ class RegionDict(TypedDict, total=False): {"target":"Command Control (E1M4) Main","pro":False}, {"target":"Command Control (E1M4) Blue","pro":False}, {"target":"Command Control (E1M4) Yellow","pro":False}]}, + {"name":"Command Control (E1M4) Start", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"Command Control (E1M4) Main","pro":False}]}, # Phobos Lab (E1M5) {"name":"Phobos Lab (E1M5) Main", @@ -126,11 +137,12 @@ class RegionDict(TypedDict, total=False): # Computer Station (E1M7) {"name":"Computer Station (E1M7) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":1, "connections":[ {"target":"Computer Station (E1M7) Red","pro":False}, - {"target":"Computer Station (E1M7) Yellow","pro":False}]}, + {"target":"Computer Station (E1M7) Yellow","pro":False}, + {"target":"Computer Station (E1M7) Start","pro":False}]}, {"name":"Computer Station (E1M7) Blue", "connects_to_hub":False, "episode":1, @@ -150,6 +162,10 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":1, "connections":[{"target":"Computer Station (E1M7) Yellow","pro":False}]}, + {"name":"Computer Station (E1M7) Start", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"Computer Station (E1M7) Main","pro":False}]}, # Phobos Anomaly (E1M8) {"name":"Phobos Anomaly (E1M8) Main", @@ -238,9 +254,11 @@ class RegionDict(TypedDict, total=False): # Deimos Lab (E2M4) {"name":"Deimos Lab (E2M4) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":2, - "connections":[{"target":"Deimos Lab (E2M4) Blue","pro":False}]}, + "connections":[ + {"target":"Deimos Lab (E2M4) Blue","pro":False}, + {"target":"Deimos Lab (E2M4) Start","pro":False}]}, {"name":"Deimos Lab (E2M4) Blue", "connects_to_hub":False, "episode":2, @@ -251,6 +269,10 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":2, "connections":[{"target":"Deimos Lab (E2M4) Blue","pro":False}]}, + {"name":"Deimos Lab (E2M4) Start", + "connects_to_hub":True, + "episode":2, + "connections":[{"target":"Deimos Lab (E2M4) Main","pro":False}]}, # Command Center (E2M5) {"name":"Command Center (E2M5) Main", @@ -314,9 +336,13 @@ class RegionDict(TypedDict, total=False): # Tower of Babel (E2M8) {"name":"Tower of Babel (E2M8) Main", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Tower of Babel (E2M8) Start","pro":False}]}, + {"name":"Tower of Babel (E2M8) Start", "connects_to_hub":True, "episode":2, - "connections":[]}, + "connections":[{"target":"Tower of Babel (E2M8) Main","pro":False}]}, # Fortress of Mystery (E2M9) {"name":"Fortress of Mystery (E2M9) Main", @@ -392,11 +418,12 @@ class RegionDict(TypedDict, total=False): # Unholy Cathedral (E3M5) {"name":"Unholy Cathedral (E3M5) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":3, "connections":[ {"target":"Unholy Cathedral (E3M5) Yellow","pro":False}, - {"target":"Unholy Cathedral (E3M5) Blue","pro":False}]}, + {"target":"Unholy Cathedral (E3M5) Blue","pro":False}, + {"target":"Unholy Cathedral (E3M5) Start","pro":False}]}, {"name":"Unholy Cathedral (E3M5) Blue", "connects_to_hub":False, "episode":3, @@ -405,6 +432,10 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":3, "connections":[{"target":"Unholy Cathedral (E3M5) Main","pro":False}]}, + {"name":"Unholy Cathedral (E3M5) Start", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"Unholy Cathedral (E3M5) Main","pro":False}]}, # Mt. Erebus (E3M6) {"name":"Mt. Erebus (E3M6) Main", diff --git a/worlds/doom_1993/Rules.py b/worlds/doom_1993/Rules.py index 89b09ff9f250..e113a87da0f3 100644 --- a/worlds/doom_1993/Rules.py +++ b/worlds/doom_1993/Rules.py @@ -23,10 +23,6 @@ def set_episode1_rules(player, multiworld, pro): state.has("Nuclear Plant (E1M2) - Red keycard", player, 1)) # Toxin Refinery (E1M3) - set_rule(multiworld.get_entrance("Hub -> Toxin Refinery (E1M3) Main", player), lambda state: - (state.has("Toxin Refinery (E1M3)", player, 1)) and - (state.has("Shotgun", player, 1) or - state.has("Chaingun", player, 1))) set_rule(multiworld.get_entrance("Toxin Refinery (E1M3) Main -> Toxin Refinery (E1M3) Blue", player), lambda state: state.has("Toxin Refinery (E1M3) - Blue keycard", player, 1)) set_rule(multiworld.get_entrance("Toxin Refinery (E1M3) Blue -> Toxin Refinery (E1M3) Yellow", player), lambda state: @@ -35,12 +31,13 @@ def set_episode1_rules(player, multiworld, pro): state.has("Toxin Refinery (E1M3) - Blue keycard", player, 1)) set_rule(multiworld.get_entrance("Toxin Refinery (E1M3) Yellow -> Toxin Refinery (E1M3) Blue", player), lambda state: state.has("Toxin Refinery (E1M3) - Yellow keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Toxin Refinery (E1M3) Start", player), lambda state: + state.has("Toxin Refinery (E1M3)", player, 1)) + set_rule(multiworld.get_entrance("Toxin Refinery (E1M3) Start -> Toxin Refinery (E1M3) Main", player), lambda state: + state.has("Shotgun", player, 1) or + state.has("Chaingun", player, 1)) # Command Control (E1M4) - set_rule(multiworld.get_entrance("Hub -> Command Control (E1M4) Main", player), lambda state: - state.has("Command Control (E1M4)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1)) set_rule(multiworld.get_entrance("Command Control (E1M4) Main -> Command Control (E1M4) Blue", player), lambda state: state.has("Command Control (E1M4) - Blue keycard", player, 1) or state.has("Command Control (E1M4) - Yellow keycard", player, 1)) @@ -50,6 +47,11 @@ def set_episode1_rules(player, multiworld, pro): set_rule(multiworld.get_entrance("Command Control (E1M4) Blue -> Command Control (E1M4) Main", player), lambda state: state.has("Command Control (E1M4) - Yellow keycard", player, 1) or state.has("Command Control (E1M4) - Blue keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Command Control (E1M4) Start", player), lambda state: + state.has("Command Control (E1M4)", player, 1)) + set_rule(multiworld.get_entrance("Command Control (E1M4) Start -> Command Control (E1M4) Main", player), lambda state: + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1)) # Phobos Lab (E1M5) set_rule(multiworld.get_entrance("Hub -> Phobos Lab (E1M5) Main", player), lambda state: @@ -83,11 +85,6 @@ def set_episode1_rules(player, multiworld, pro): state.has("Central Processing (E1M6) - Yellow keycard", player, 1)) # Computer Station (E1M7) - set_rule(multiworld.get_entrance("Hub -> Computer Station (E1M7) Main", player), lambda state: - state.has("Computer Station (E1M7)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Rocket launcher", player, 1)) set_rule(multiworld.get_entrance("Computer Station (E1M7) Main -> Computer Station (E1M7) Red", player), lambda state: state.has("Computer Station (E1M7) - Red keycard", player, 1)) set_rule(multiworld.get_entrance("Computer Station (E1M7) Main -> Computer Station (E1M7) Yellow", player), lambda state: @@ -103,6 +100,12 @@ def set_episode1_rules(player, multiworld, pro): state.has("Computer Station (E1M7) - Red keycard", player, 1)) set_rule(multiworld.get_entrance("Computer Station (E1M7) Courtyard -> Computer Station (E1M7) Yellow", player), lambda state: state.has("Computer Station (E1M7) - Yellow keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Computer Station (E1M7) Start", player), lambda state: + state.has("Computer Station (E1M7)", player, 1)) + set_rule(multiworld.get_entrance("Computer Station (E1M7) Start -> Computer Station (E1M7) Main", player), lambda state: + state.has("Shotgun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Chaingun", player, 1)) # Phobos Anomaly (E1M8) set_rule(multiworld.get_entrance("Hub -> Phobos Anomaly (E1M8) Start", player), lambda state: @@ -172,15 +175,16 @@ def set_episode2_rules(player, multiworld, pro): state.has("Refinery (E2M3) - Blue keycard", player, 1)) # Deimos Lab (E2M4) - set_rule(multiworld.get_entrance("Hub -> Deimos Lab (E2M4) Main", player), lambda state: - state.has("Deimos Lab (E2M4)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Plasma gun", player, 1)) set_rule(multiworld.get_entrance("Deimos Lab (E2M4) Main -> Deimos Lab (E2M4) Blue", player), lambda state: state.has("Deimos Lab (E2M4) - Blue keycard", player, 1)) set_rule(multiworld.get_entrance("Deimos Lab (E2M4) Blue -> Deimos Lab (E2M4) Yellow", player), lambda state: state.has("Deimos Lab (E2M4) - Yellow keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Deimos Lab (E2M4) Start", player), lambda state: + state.has("Deimos Lab (E2M4)", player, 1)) + set_rule(multiworld.get_entrance("Deimos Lab (E2M4) Start -> Deimos Lab (E2M4) Main", player), lambda state: + state.has("Shotgun", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("Chaingun", player, 1)) # Command Center (E2M5) set_rule(multiworld.get_entrance("Hub -> Command Center (E2M5) Main", player), lambda state: @@ -238,11 +242,11 @@ def set_episode2_rules(player, multiworld, pro): state.has("Spawning Vats (E2M7) - Red keycard", player, 1)) # Tower of Babel (E2M8) - set_rule(multiworld.get_entrance("Hub -> Tower of Babel (E2M8) Main", player), lambda state: - (state.has("Tower of Babel (E2M8)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1)) and - (state.has("Rocket launcher", player, 1) or + set_rule(multiworld.get_entrance("Hub -> Tower of Babel (E2M8) Start", player), lambda state: + state.has("Tower of Babel (E2M8)", player, 1)) + set_rule(multiworld.get_entrance("Tower of Babel (E2M8) Start -> Tower of Babel (E2M8) Main", player), lambda state: + (state.has("Chaingun", player, 1) and + state.has("Shotgun", player, 1)) and (state.has("Rocket launcher", player, 1) or state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1))) @@ -321,13 +325,6 @@ def set_episode3_rules(player, multiworld, pro): state.has("House of Pain (E3M4) - Yellow skull key", player, 1)) # Unholy Cathedral (E3M5) - set_rule(multiworld.get_entrance("Hub -> Unholy Cathedral (E3M5) Main", player), lambda state: - (state.has("Unholy Cathedral (E3M5)", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) set_rule(multiworld.get_entrance("Unholy Cathedral (E3M5) Main -> Unholy Cathedral (E3M5) Yellow", player), lambda state: state.has("Unholy Cathedral (E3M5) - Yellow skull key", player, 1)) set_rule(multiworld.get_entrance("Unholy Cathedral (E3M5) Main -> Unholy Cathedral (E3M5) Blue", player), lambda state: @@ -336,6 +333,13 @@ def set_episode3_rules(player, multiworld, pro): state.has("Unholy Cathedral (E3M5) - Blue skull key", player, 1)) set_rule(multiworld.get_entrance("Unholy Cathedral (E3M5) Yellow -> Unholy Cathedral (E3M5) Main", player), lambda state: state.has("Unholy Cathedral (E3M5) - Yellow skull key", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Unholy Cathedral (E3M5) Start", player), lambda state: + state.has("Unholy Cathedral (E3M5)", player, 1)) + set_rule(multiworld.get_entrance("Unholy Cathedral (E3M5) Start -> Unholy Cathedral (E3M5) Main", player), lambda state: + (state.has("Chaingun", player, 1) and + state.has("Shotgun", player, 1)) and (state.has("Plasma gun", player, 1) or + state.has("Rocket launcher", player, 1) or + state.has("BFG9000", player, 1))) # Mt. Erebus (E3M6) set_rule(multiworld.get_entrance("Hub -> Mt. Erebus (E3M6) Main", player), lambda state: diff --git a/worlds/doom_ii/Items.py b/worlds/doom_ii/Items.py index fc426cc883f2..87846ae57434 100644 --- a/worlds/doom_ii/Items.py +++ b/worlds/doom_ii/Items.py @@ -412,7 +412,7 @@ class ItemDict(TypedDict, total=False): 'map': 2}, 360246: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Barrels o Fun (MAP23) - Yellow skull key', + 'name': "Barrels o' Fun (MAP23) - Yellow skull key", 'doom_type': 39, 'episode': 3, 'map': 3}, @@ -880,19 +880,19 @@ class ItemDict(TypedDict, total=False): 'map': 2}, 360466: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Barrels o Fun (MAP23)', + 'name': "Barrels o' Fun (MAP23)", 'doom_type': -1, 'episode': 3, 'map': 3}, 360467: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Barrels o Fun (MAP23) - Complete', + 'name': "Barrels o' Fun (MAP23) - Complete", 'doom_type': -2, 'episode': 3, 'map': 3}, 360468: {'classification': ItemClassification.filler, 'count': 1, - 'name': 'Barrels o Fun (MAP23) - Computer area map', + 'name': "Barrels o' Fun (MAP23) - Computer area map", 'doom_type': 2026, 'episode': 3, 'map': 3}, @@ -1024,37 +1024,37 @@ class ItemDict(TypedDict, total=False): 'map': 10}, 360490: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Wolfenstein2 (MAP31)', + 'name': 'Wolfenstein (MAP31)', 'doom_type': -1, 'episode': 4, 'map': 1}, 360491: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Wolfenstein2 (MAP31) - Complete', + 'name': 'Wolfenstein (MAP31) - Complete', 'doom_type': -2, 'episode': 4, 'map': 1}, 360492: {'classification': ItemClassification.filler, 'count': 1, - 'name': 'Wolfenstein2 (MAP31) - Computer area map', + 'name': 'Wolfenstein (MAP31) - Computer area map', 'doom_type': 2026, 'episode': 4, 'map': 1}, 360493: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Grosse2 (MAP32)', + 'name': 'Grosse (MAP32)', 'doom_type': -1, 'episode': 4, 'map': 2}, 360494: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'Grosse2 (MAP32) - Complete', + 'name': 'Grosse (MAP32) - Complete', 'doom_type': -2, 'episode': 4, 'map': 2}, 360495: {'classification': ItemClassification.filler, 'count': 1, - 'name': 'Grosse2 (MAP32) - Computer area map', + 'name': 'Grosse (MAP32) - Computer area map', 'doom_type': 2026, 'episode': 4, 'map': 2}, @@ -1063,9 +1063,9 @@ class ItemDict(TypedDict, total=False): item_name_groups: Dict[str, Set[str]] = { 'Ammos': {'Box of bullets', 'Box of rockets', 'Box of shotgun shells', 'Energy cell pack', }, - 'Computer area maps': {'Barrels o Fun (MAP23) - Computer area map', 'Bloodfalls (MAP25) - Computer area map', 'Circle of Death (MAP11) - Computer area map', 'Dead Simple (MAP07) - Computer area map', 'Downtown (MAP13) - Computer area map', 'Entryway (MAP01) - Computer area map', 'Gotcha! (MAP20) - Computer area map', 'Grosse2 (MAP32) - Computer area map', 'Icon of Sin (MAP30) - Computer area map', 'Industrial Zone (MAP15) - Computer area map', 'Monster Condo (MAP27) - Computer area map', 'Nirvana (MAP21) - Computer area map', 'Refueling Base (MAP10) - Computer area map', 'Suburbs (MAP16) - Computer area map', 'Tenements (MAP17) - Computer area map', 'The Abandoned Mines (MAP26) - Computer area map', 'The Catacombs (MAP22) - Computer area map', 'The Chasm (MAP24) - Computer area map', 'The Citadel (MAP19) - Computer area map', 'The Courtyard (MAP18) - Computer area map', 'The Crusher (MAP06) - Computer area map', 'The Factory (MAP12) - Computer area map', 'The Focus (MAP04) - Computer area map', 'The Gantlet (MAP03) - Computer area map', 'The Inmost Dens (MAP14) - Computer area map', 'The Living End (MAP29) - Computer area map', 'The Pit (MAP09) - Computer area map', 'The Spirit World (MAP28) - Computer area map', 'The Waste Tunnels (MAP05) - Computer area map', 'Tricks and Traps (MAP08) - Computer area map', 'Underhalls (MAP02) - Computer area map', 'Wolfenstein2 (MAP31) - Computer area map', }, - 'Keys': {'Barrels o Fun (MAP23) - Yellow skull key', 'Bloodfalls (MAP25) - Blue skull key', 'Circle of Death (MAP11) - Blue keycard', 'Circle of Death (MAP11) - Red keycard', 'Downtown (MAP13) - Blue keycard', 'Downtown (MAP13) - Red keycard', 'Downtown (MAP13) - Yellow keycard', 'Industrial Zone (MAP15) - Blue keycard', 'Industrial Zone (MAP15) - Red keycard', 'Industrial Zone (MAP15) - Yellow keycard', 'Monster Condo (MAP27) - Blue skull key', 'Monster Condo (MAP27) - Red skull key', 'Monster Condo (MAP27) - Yellow skull key', 'Nirvana (MAP21) - Blue skull key', 'Nirvana (MAP21) - Red skull key', 'Nirvana (MAP21) - Yellow skull key', 'Refueling Base (MAP10) - Blue keycard', 'Refueling Base (MAP10) - Yellow keycard', 'Suburbs (MAP16) - Blue skull key', 'Suburbs (MAP16) - Red skull key', 'Tenements (MAP17) - Blue keycard', 'Tenements (MAP17) - Red keycard', 'Tenements (MAP17) - Yellow skull key', 'The Abandoned Mines (MAP26) - Blue keycard', 'The Abandoned Mines (MAP26) - Red keycard', 'The Abandoned Mines (MAP26) - Yellow keycard', 'The Catacombs (MAP22) - Blue skull key', 'The Catacombs (MAP22) - Red skull key', 'The Chasm (MAP24) - Blue keycard', 'The Chasm (MAP24) - Red keycard', 'The Citadel (MAP19) - Blue skull key', 'The Citadel (MAP19) - Red skull key', 'The Citadel (MAP19) - Yellow skull key', 'The Courtyard (MAP18) - Blue skull key', 'The Courtyard (MAP18) - Yellow skull key', 'The Crusher (MAP06) - Blue keycard', 'The Crusher (MAP06) - Red keycard', 'The Crusher (MAP06) - Yellow keycard', 'The Factory (MAP12) - Blue keycard', 'The Factory (MAP12) - Yellow keycard', 'The Focus (MAP04) - Blue keycard', 'The Focus (MAP04) - Red keycard', 'The Focus (MAP04) - Yellow keycard', 'The Gantlet (MAP03) - Blue keycard', 'The Gantlet (MAP03) - Red keycard', 'The Inmost Dens (MAP14) - Blue skull key', 'The Inmost Dens (MAP14) - Red skull key', 'The Pit (MAP09) - Blue keycard', 'The Pit (MAP09) - Yellow keycard', 'The Spirit World (MAP28) - Red skull key', 'The Spirit World (MAP28) - Yellow skull key', 'The Waste Tunnels (MAP05) - Blue keycard', 'The Waste Tunnels (MAP05) - Red keycard', 'The Waste Tunnels (MAP05) - Yellow keycard', 'Tricks and Traps (MAP08) - Red skull key', 'Tricks and Traps (MAP08) - Yellow skull key', 'Underhalls (MAP02) - Blue keycard', 'Underhalls (MAP02) - Red keycard', }, - 'Levels': {'Barrels o Fun (MAP23)', 'Bloodfalls (MAP25)', 'Circle of Death (MAP11)', 'Dead Simple (MAP07)', 'Downtown (MAP13)', 'Entryway (MAP01)', 'Gotcha! (MAP20)', 'Grosse2 (MAP32)', 'Icon of Sin (MAP30)', 'Industrial Zone (MAP15)', 'Monster Condo (MAP27)', 'Nirvana (MAP21)', 'Refueling Base (MAP10)', 'Suburbs (MAP16)', 'Tenements (MAP17)', 'The Abandoned Mines (MAP26)', 'The Catacombs (MAP22)', 'The Chasm (MAP24)', 'The Citadel (MAP19)', 'The Courtyard (MAP18)', 'The Crusher (MAP06)', 'The Factory (MAP12)', 'The Focus (MAP04)', 'The Gantlet (MAP03)', 'The Inmost Dens (MAP14)', 'The Living End (MAP29)', 'The Pit (MAP09)', 'The Spirit World (MAP28)', 'The Waste Tunnels (MAP05)', 'Tricks and Traps (MAP08)', 'Underhalls (MAP02)', 'Wolfenstein2 (MAP31)', }, + 'Computer area maps': {"Barrels o' Fun (MAP23) - Computer area map", 'Bloodfalls (MAP25) - Computer area map', 'Circle of Death (MAP11) - Computer area map', 'Dead Simple (MAP07) - Computer area map', 'Downtown (MAP13) - Computer area map', 'Entryway (MAP01) - Computer area map', 'Gotcha! (MAP20) - Computer area map', 'Grosse (MAP32) - Computer area map', 'Icon of Sin (MAP30) - Computer area map', 'Industrial Zone (MAP15) - Computer area map', 'Monster Condo (MAP27) - Computer area map', 'Nirvana (MAP21) - Computer area map', 'Refueling Base (MAP10) - Computer area map', 'Suburbs (MAP16) - Computer area map', 'Tenements (MAP17) - Computer area map', 'The Abandoned Mines (MAP26) - Computer area map', 'The Catacombs (MAP22) - Computer area map', 'The Chasm (MAP24) - Computer area map', 'The Citadel (MAP19) - Computer area map', 'The Courtyard (MAP18) - Computer area map', 'The Crusher (MAP06) - Computer area map', 'The Factory (MAP12) - Computer area map', 'The Focus (MAP04) - Computer area map', 'The Gantlet (MAP03) - Computer area map', 'The Inmost Dens (MAP14) - Computer area map', 'The Living End (MAP29) - Computer area map', 'The Pit (MAP09) - Computer area map', 'The Spirit World (MAP28) - Computer area map', 'The Waste Tunnels (MAP05) - Computer area map', 'Tricks and Traps (MAP08) - Computer area map', 'Underhalls (MAP02) - Computer area map', 'Wolfenstein (MAP31) - Computer area map', }, + 'Keys': {"Barrels o' Fun (MAP23) - Yellow skull key", 'Bloodfalls (MAP25) - Blue skull key', 'Circle of Death (MAP11) - Blue keycard', 'Circle of Death (MAP11) - Red keycard', 'Downtown (MAP13) - Blue keycard', 'Downtown (MAP13) - Red keycard', 'Downtown (MAP13) - Yellow keycard', 'Industrial Zone (MAP15) - Blue keycard', 'Industrial Zone (MAP15) - Red keycard', 'Industrial Zone (MAP15) - Yellow keycard', 'Monster Condo (MAP27) - Blue skull key', 'Monster Condo (MAP27) - Red skull key', 'Monster Condo (MAP27) - Yellow skull key', 'Nirvana (MAP21) - Blue skull key', 'Nirvana (MAP21) - Red skull key', 'Nirvana (MAP21) - Yellow skull key', 'Refueling Base (MAP10) - Blue keycard', 'Refueling Base (MAP10) - Yellow keycard', 'Suburbs (MAP16) - Blue skull key', 'Suburbs (MAP16) - Red skull key', 'Tenements (MAP17) - Blue keycard', 'Tenements (MAP17) - Red keycard', 'Tenements (MAP17) - Yellow skull key', 'The Abandoned Mines (MAP26) - Blue keycard', 'The Abandoned Mines (MAP26) - Red keycard', 'The Abandoned Mines (MAP26) - Yellow keycard', 'The Catacombs (MAP22) - Blue skull key', 'The Catacombs (MAP22) - Red skull key', 'The Chasm (MAP24) - Blue keycard', 'The Chasm (MAP24) - Red keycard', 'The Citadel (MAP19) - Blue skull key', 'The Citadel (MAP19) - Red skull key', 'The Citadel (MAP19) - Yellow skull key', 'The Courtyard (MAP18) - Blue skull key', 'The Courtyard (MAP18) - Yellow skull key', 'The Crusher (MAP06) - Blue keycard', 'The Crusher (MAP06) - Red keycard', 'The Crusher (MAP06) - Yellow keycard', 'The Factory (MAP12) - Blue keycard', 'The Factory (MAP12) - Yellow keycard', 'The Focus (MAP04) - Blue keycard', 'The Focus (MAP04) - Red keycard', 'The Focus (MAP04) - Yellow keycard', 'The Gantlet (MAP03) - Blue keycard', 'The Gantlet (MAP03) - Red keycard', 'The Inmost Dens (MAP14) - Blue skull key', 'The Inmost Dens (MAP14) - Red skull key', 'The Pit (MAP09) - Blue keycard', 'The Pit (MAP09) - Yellow keycard', 'The Spirit World (MAP28) - Red skull key', 'The Spirit World (MAP28) - Yellow skull key', 'The Waste Tunnels (MAP05) - Blue keycard', 'The Waste Tunnels (MAP05) - Red keycard', 'The Waste Tunnels (MAP05) - Yellow keycard', 'Tricks and Traps (MAP08) - Red skull key', 'Tricks and Traps (MAP08) - Yellow skull key', 'Underhalls (MAP02) - Blue keycard', 'Underhalls (MAP02) - Red keycard', }, + 'Levels': {"Barrels o' Fun (MAP23)", 'Bloodfalls (MAP25)', 'Circle of Death (MAP11)', 'Dead Simple (MAP07)', 'Downtown (MAP13)', 'Entryway (MAP01)', 'Gotcha! (MAP20)', 'Grosse (MAP32)', 'Icon of Sin (MAP30)', 'Industrial Zone (MAP15)', 'Monster Condo (MAP27)', 'Nirvana (MAP21)', 'Refueling Base (MAP10)', 'Suburbs (MAP16)', 'Tenements (MAP17)', 'The Abandoned Mines (MAP26)', 'The Catacombs (MAP22)', 'The Chasm (MAP24)', 'The Citadel (MAP19)', 'The Courtyard (MAP18)', 'The Crusher (MAP06)', 'The Factory (MAP12)', 'The Focus (MAP04)', 'The Gantlet (MAP03)', 'The Inmost Dens (MAP14)', 'The Living End (MAP29)', 'The Pit (MAP09)', 'The Spirit World (MAP28)', 'The Waste Tunnels (MAP05)', 'Tricks and Traps (MAP08)', 'Underhalls (MAP02)', 'Wolfenstein (MAP31)', }, 'Powerups': {'Armor', 'Berserk', 'Invulnerability', 'Mega Armor', 'Megasphere', 'Partial invisibility', 'Supercharge', }, 'Weapons': {'BFG9000', 'Chaingun', 'Chainsaw', 'Plasma gun', 'Rocket launcher', 'Shotgun', 'Super Shotgun', }, } diff --git a/worlds/doom_ii/Locations.py b/worlds/doom_ii/Locations.py index 376f19446f21..7aa2311b7642 100644 --- a/worlds/doom_ii/Locations.py +++ b/worlds/doom_ii/Locations.py @@ -180,7 +180,7 @@ class LocationDict(TypedDict, total=False): 'map': 5, 'index': 46, 'doom_type': 82, - 'region': "The Waste Tunnels (MAP05) Main"}, + 'region': "The Waste Tunnels (MAP05) Start"}, 361028: {'name': 'The Waste Tunnels (MAP05) - Blue keycard', 'episode': 1, 'map': 5, @@ -234,7 +234,7 @@ class LocationDict(TypedDict, total=False): 'map': 5, 'index': 202, 'doom_type': 2001, - 'region': "The Waste Tunnels (MAP05) Main"}, + 'region': "The Waste Tunnels (MAP05) Start"}, 361037: {'name': 'The Waste Tunnels (MAP05) - Berserk', 'episode': 1, 'map': 5, @@ -360,7 +360,7 @@ class LocationDict(TypedDict, total=False): 'map': 7, 'index': 8, 'doom_type': 82, - 'region': "Dead Simple (MAP07) Main"}, + 'region': "Dead Simple (MAP07) Start"}, 361058: {'name': 'Dead Simple (MAP07) - Chaingun', 'episode': 1, 'map': 7, @@ -378,7 +378,7 @@ class LocationDict(TypedDict, total=False): 'map': 7, 'index': 43, 'doom_type': 8, - 'region': "Dead Simple (MAP07) Main"}, + 'region': "Dead Simple (MAP07) Start"}, 361061: {'name': 'Dead Simple (MAP07) - Berserk', 'episode': 1, 'map': 7, @@ -570,7 +570,7 @@ class LocationDict(TypedDict, total=False): 'map': 9, 'index': 26, 'doom_type': 2019, - 'region': "The Pit (MAP09) Main"}, + 'region': "The Pit (MAP09) Start"}, 361093: {'name': 'The Pit (MAP09) - Supercharge', 'episode': 1, 'map': 9, @@ -678,7 +678,7 @@ class LocationDict(TypedDict, total=False): 'map': 10, 'index': 99, 'doom_type': 2001, - 'region': "Refueling Base (MAP10) Main"}, + 'region': "Refueling Base (MAP10) Start"}, 361111: {'name': 'Refueling Base (MAP10) - Chaingun', 'episode': 1, 'map': 10, @@ -846,31 +846,31 @@ class LocationDict(TypedDict, total=False): 'map': 11, 'index': 88, 'doom_type': 8, - 'region': "Circle of Death (MAP11) Red"}, + 'region': "Circle of Death (MAP11) Ending"}, 361139: {'name': 'Circle of Death (MAP11) - Supercharge 2', 'episode': 1, 'map': 11, 'index': 108, 'doom_type': 2013, - 'region': "Circle of Death (MAP11) Red"}, + 'region': "Circle of Death (MAP11) Ending"}, 361140: {'name': 'Circle of Death (MAP11) - BFG9000', 'episode': 1, 'map': 11, 'index': 110, 'doom_type': 2006, - 'region': "Circle of Death (MAP11) Red"}, + 'region': "Circle of Death (MAP11) Ending"}, 361141: {'name': 'Circle of Death (MAP11) - Exit', 'episode': 1, 'map': 11, 'index': -1, 'doom_type': -1, - 'region': "Circle of Death (MAP11) Red"}, + 'region': "Circle of Death (MAP11) Ending"}, 361142: {'name': 'The Factory (MAP12) - Shotgun', 'episode': 2, 'map': 1, 'index': 14, 'doom_type': 2001, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Outdoors"}, 361143: {'name': 'The Factory (MAP12) - Berserk', 'episode': 2, 'map': 1, @@ -888,13 +888,13 @@ class LocationDict(TypedDict, total=False): 'map': 1, 'index': 52, 'doom_type': 2013, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Indoors"}, 361146: {'name': 'The Factory (MAP12) - Blue keycard', 'episode': 2, 'map': 1, 'index': 54, 'doom_type': 5, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Indoors"}, 361147: {'name': 'The Factory (MAP12) - Armor', 'episode': 2, 'map': 1, @@ -912,31 +912,31 @@ class LocationDict(TypedDict, total=False): 'map': 1, 'index': 83, 'doom_type': 2013, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Indoors"}, 361150: {'name': 'The Factory (MAP12) - Armor 2', 'episode': 2, 'map': 1, 'index': 92, 'doom_type': 2018, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Outdoors"}, 361151: {'name': 'The Factory (MAP12) - Partial invisibility', 'episode': 2, 'map': 1, 'index': 93, 'doom_type': 2024, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Outdoors"}, 361152: {'name': 'The Factory (MAP12) - Berserk 2', 'episode': 2, 'map': 1, 'index': 107, 'doom_type': 2023, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Indoors"}, 361153: {'name': 'The Factory (MAP12) - Yellow keycard', 'episode': 2, 'map': 1, 'index': 123, 'doom_type': 6, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Indoors"}, 361154: {'name': 'The Factory (MAP12) - BFG9000', 'episode': 2, 'map': 1, @@ -954,7 +954,7 @@ class LocationDict(TypedDict, total=False): 'map': 1, 'index': 192, 'doom_type': 82, - 'region': "The Factory (MAP12) Main"}, + 'region': "The Factory (MAP12) Indoors"}, 361157: {'name': 'The Factory (MAP12) - Exit', 'episode': 2, 'map': 1, @@ -1812,7 +1812,7 @@ class LocationDict(TypedDict, total=False): 'map': 1, 'index': 70, 'doom_type': 82, - 'region': "Nirvana (MAP21) Main"}, + 'region': "Nirvana (MAP21) Start"}, 361300: {'name': 'Nirvana (MAP21) - Rocket launcher', 'episode': 3, 'map': 1, @@ -1884,7 +1884,7 @@ class LocationDict(TypedDict, total=False): 'map': 2, 'index': 28, 'doom_type': 2001, - 'region': "The Catacombs (MAP22) Main"}, + 'region': "The Catacombs (MAP22) Early"}, 361312: {'name': 'The Catacombs (MAP22) - Berserk', 'episode': 3, 'map': 2, @@ -1896,103 +1896,103 @@ class LocationDict(TypedDict, total=False): 'map': 2, 'index': 83, 'doom_type': 2004, - 'region': "The Catacombs (MAP22) Main"}, + 'region': "The Catacombs (MAP22) Early"}, 361314: {'name': 'The Catacombs (MAP22) - Supercharge', 'episode': 3, 'map': 2, 'index': 118, 'doom_type': 2013, - 'region': "The Catacombs (MAP22) Main"}, + 'region': "The Catacombs (MAP22) Early"}, 361315: {'name': 'The Catacombs (MAP22) - Armor', 'episode': 3, 'map': 2, 'index': 119, 'doom_type': 2018, - 'region': "The Catacombs (MAP22) Main"}, + 'region': "The Catacombs (MAP22) Early"}, 361316: {'name': 'The Catacombs (MAP22) - Exit', 'episode': 3, 'map': 2, 'index': -1, 'doom_type': -1, 'region': "The Catacombs (MAP22) Red"}, - 361317: {'name': 'Barrels o Fun (MAP23) - Shotgun', + 361317: {'name': "Barrels o' Fun (MAP23) - Shotgun", 'episode': 3, 'map': 3, 'index': 136, 'doom_type': 2001, - 'region': "Barrels o Fun (MAP23) Main"}, - 361318: {'name': 'Barrels o Fun (MAP23) - Berserk', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361318: {'name': "Barrels o' Fun (MAP23) - Berserk", 'episode': 3, 'map': 3, 'index': 222, 'doom_type': 2023, - 'region': "Barrels o Fun (MAP23) Main"}, - 361319: {'name': 'Barrels o Fun (MAP23) - Backpack', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361319: {'name': "Barrels o' Fun (MAP23) - Backpack", 'episode': 3, 'map': 3, 'index': 223, 'doom_type': 8, - 'region': "Barrels o Fun (MAP23) Main"}, - 361320: {'name': 'Barrels o Fun (MAP23) - Computer area map', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361320: {'name': "Barrels o' Fun (MAP23) - Computer area map", 'episode': 3, 'map': 3, 'index': 224, 'doom_type': 2026, - 'region': "Barrels o Fun (MAP23) Main"}, - 361321: {'name': 'Barrels o Fun (MAP23) - Armor', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361321: {'name': "Barrels o' Fun (MAP23) - Armor", 'episode': 3, 'map': 3, 'index': 249, 'doom_type': 2018, - 'region': "Barrels o Fun (MAP23) Main"}, - 361322: {'name': 'Barrels o Fun (MAP23) - Rocket launcher', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361322: {'name': "Barrels o' Fun (MAP23) - Rocket launcher", 'episode': 3, 'map': 3, 'index': 264, 'doom_type': 2003, - 'region': "Barrels o Fun (MAP23) Main"}, - 361323: {'name': 'Barrels o Fun (MAP23) - Megasphere', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361323: {'name': "Barrels o' Fun (MAP23) - Megasphere", 'episode': 3, 'map': 3, 'index': 266, 'doom_type': 83, - 'region': "Barrels o Fun (MAP23) Main"}, - 361324: {'name': 'Barrels o Fun (MAP23) - Supercharge', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361324: {'name': "Barrels o' Fun (MAP23) - Supercharge", 'episode': 3, 'map': 3, 'index': 277, 'doom_type': 2013, - 'region': "Barrels o Fun (MAP23) Main"}, - 361325: {'name': 'Barrels o Fun (MAP23) - Backpack 2', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361325: {'name': "Barrels o' Fun (MAP23) - Backpack 2", 'episode': 3, 'map': 3, 'index': 301, 'doom_type': 8, - 'region': "Barrels o Fun (MAP23) Main"}, - 361326: {'name': 'Barrels o Fun (MAP23) - Yellow skull key', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361326: {'name': "Barrels o' Fun (MAP23) - Yellow skull key", 'episode': 3, 'map': 3, 'index': 307, 'doom_type': 39, - 'region': "Barrels o Fun (MAP23) Main"}, - 361327: {'name': 'Barrels o Fun (MAP23) - BFG9000', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361327: {'name': "Barrels o' Fun (MAP23) - BFG9000", 'episode': 3, 'map': 3, 'index': 342, 'doom_type': 2006, - 'region': "Barrels o Fun (MAP23) Main"}, - 361328: {'name': 'Barrels o Fun (MAP23) - Exit', + 'region': "Barrels o' Fun (MAP23) Main"}, + 361328: {'name': "Barrels o' Fun (MAP23) - Exit", 'episode': 3, 'map': 3, 'index': -1, 'doom_type': -1, - 'region': "Barrels o Fun (MAP23) Yellow"}, + 'region': "Barrels o' Fun (MAP23) Yellow"}, 361329: {'name': 'The Chasm (MAP24) - Plasma gun', 'episode': 3, 'map': 4, 'index': 5, 'doom_type': 2004, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361330: {'name': 'The Chasm (MAP24) - Shotgun', 'episode': 3, 'map': 4, @@ -2004,7 +2004,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 12, 'doom_type': 2022, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361332: {'name': 'The Chasm (MAP24) - Rocket launcher', 'episode': 3, 'map': 4, @@ -2022,7 +2022,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 31, 'doom_type': 8, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361335: {'name': 'The Chasm (MAP24) - Berserk', 'episode': 3, 'map': 4, @@ -2034,19 +2034,19 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 155, 'doom_type': 2023, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361337: {'name': 'The Chasm (MAP24) - Armor', 'episode': 3, 'map': 4, 'index': 169, 'doom_type': 2018, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361338: {'name': 'The Chasm (MAP24) - Red keycard', 'episode': 3, 'map': 4, 'index': 261, 'doom_type': 13, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361339: {'name': 'The Chasm (MAP24) - BFG9000', 'episode': 3, 'map': 4, @@ -2064,7 +2064,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 355, 'doom_type': 83, - 'region': "The Chasm (MAP24) Main"}, + 'region': "The Chasm (MAP24) Blue"}, 361342: {'name': 'The Chasm (MAP24) - Megasphere 2', 'episode': 3, 'map': 4, @@ -2082,7 +2082,7 @@ class LocationDict(TypedDict, total=False): 'map': 5, 'index': 6, 'doom_type': 82, - 'region': "Bloodfalls (MAP25) Main"}, + 'region': "Bloodfalls (MAP25) Start"}, 361345: {'name': 'Bloodfalls (MAP25) - Partial invisibility', 'episode': 3, 'map': 5, @@ -2664,55 +2664,55 @@ class LocationDict(TypedDict, total=False): 'map': 10, 'index': 40, 'doom_type': 2006, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361442: {'name': 'Icon of Sin (MAP30) - Chaingun', 'episode': 3, 'map': 10, 'index': 41, 'doom_type': 2002, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361443: {'name': 'Icon of Sin (MAP30) - Chainsaw', 'episode': 3, 'map': 10, 'index': 42, 'doom_type': 2005, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361444: {'name': 'Icon of Sin (MAP30) - Plasma gun', 'episode': 3, 'map': 10, 'index': 43, 'doom_type': 2004, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361445: {'name': 'Icon of Sin (MAP30) - Rocket launcher', 'episode': 3, 'map': 10, 'index': 44, 'doom_type': 2003, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361446: {'name': 'Icon of Sin (MAP30) - Shotgun', 'episode': 3, 'map': 10, 'index': 45, 'doom_type': 2001, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361447: {'name': 'Icon of Sin (MAP30) - Super Shotgun', 'episode': 3, 'map': 10, 'index': 46, 'doom_type': 82, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361448: {'name': 'Icon of Sin (MAP30) - Backpack', 'episode': 3, 'map': 10, 'index': 47, 'doom_type': 8, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361449: {'name': 'Icon of Sin (MAP30) - Megasphere', 'episode': 3, 'map': 10, 'index': 64, 'doom_type': 83, - 'region': "Icon of Sin (MAP30) Main"}, + 'region': "Icon of Sin (MAP30) Start"}, 361450: {'name': 'Icon of Sin (MAP30) - Megasphere 2', 'episode': 3, 'map': 10, @@ -2731,179 +2731,179 @@ class LocationDict(TypedDict, total=False): 'index': -1, 'doom_type': -1, 'region': "Icon of Sin (MAP30) Main"}, - 361453: {'name': 'Wolfenstein2 (MAP31) - Rocket launcher', + 361453: {'name': 'Wolfenstein (MAP31) - Rocket launcher', 'episode': 4, 'map': 1, 'index': 110, 'doom_type': 2003, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361454: {'name': 'Wolfenstein2 (MAP31) - Shotgun', + 'region': "Wolfenstein (MAP31) Main"}, + 361454: {'name': 'Wolfenstein (MAP31) - Shotgun', 'episode': 4, 'map': 1, 'index': 139, 'doom_type': 2001, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361455: {'name': 'Wolfenstein2 (MAP31) - Berserk', + 'region': "Wolfenstein (MAP31) Main"}, + 361455: {'name': 'Wolfenstein (MAP31) - Berserk', 'episode': 4, 'map': 1, 'index': 263, 'doom_type': 2023, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361456: {'name': 'Wolfenstein2 (MAP31) - Supercharge', + 'region': "Wolfenstein (MAP31) Main"}, + 361456: {'name': 'Wolfenstein (MAP31) - Supercharge', 'episode': 4, 'map': 1, 'index': 278, 'doom_type': 2013, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361457: {'name': 'Wolfenstein2 (MAP31) - Chaingun', + 'region': "Wolfenstein (MAP31) Main"}, + 361457: {'name': 'Wolfenstein (MAP31) - Chaingun', 'episode': 4, 'map': 1, 'index': 305, 'doom_type': 2002, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361458: {'name': 'Wolfenstein2 (MAP31) - Super Shotgun', + 'region': "Wolfenstein (MAP31) Main"}, + 361458: {'name': 'Wolfenstein (MAP31) - Super Shotgun', 'episode': 4, 'map': 1, 'index': 308, 'doom_type': 82, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361459: {'name': 'Wolfenstein2 (MAP31) - Partial invisibility', + 'region': "Wolfenstein (MAP31) Main"}, + 361459: {'name': 'Wolfenstein (MAP31) - Partial invisibility', 'episode': 4, 'map': 1, 'index': 309, 'doom_type': 2024, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361460: {'name': 'Wolfenstein2 (MAP31) - Megasphere', + 'region': "Wolfenstein (MAP31) Main"}, + 361460: {'name': 'Wolfenstein (MAP31) - Megasphere', 'episode': 4, 'map': 1, 'index': 310, 'doom_type': 83, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361461: {'name': 'Wolfenstein2 (MAP31) - Backpack', + 'region': "Wolfenstein (MAP31) Main"}, + 361461: {'name': 'Wolfenstein (MAP31) - Backpack', 'episode': 4, 'map': 1, 'index': 311, 'doom_type': 8, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361462: {'name': 'Wolfenstein2 (MAP31) - Backpack 2', + 'region': "Wolfenstein (MAP31) Main"}, + 361462: {'name': 'Wolfenstein (MAP31) - Backpack 2', 'episode': 4, 'map': 1, 'index': 312, 'doom_type': 8, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361463: {'name': 'Wolfenstein2 (MAP31) - Backpack 3', + 'region': "Wolfenstein (MAP31) Main"}, + 361463: {'name': 'Wolfenstein (MAP31) - Backpack 3', 'episode': 4, 'map': 1, 'index': 313, 'doom_type': 8, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361464: {'name': 'Wolfenstein2 (MAP31) - Backpack 4', + 'region': "Wolfenstein (MAP31) Main"}, + 361464: {'name': 'Wolfenstein (MAP31) - Backpack 4', 'episode': 4, 'map': 1, 'index': 314, 'doom_type': 8, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361465: {'name': 'Wolfenstein2 (MAP31) - BFG9000', + 'region': "Wolfenstein (MAP31) Main"}, + 361465: {'name': 'Wolfenstein (MAP31) - BFG9000', 'episode': 4, 'map': 1, 'index': 315, 'doom_type': 2006, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361466: {'name': 'Wolfenstein2 (MAP31) - Plasma gun', + 'region': "Wolfenstein (MAP31) Main"}, + 361466: {'name': 'Wolfenstein (MAP31) - Plasma gun', 'episode': 4, 'map': 1, 'index': 316, 'doom_type': 2004, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361467: {'name': 'Wolfenstein2 (MAP31) - Exit', + 'region': "Wolfenstein (MAP31) Main"}, + 361467: {'name': 'Wolfenstein (MAP31) - Exit', 'episode': 4, 'map': 1, 'index': -1, 'doom_type': -1, - 'region': "Wolfenstein2 (MAP31) Main"}, - 361468: {'name': 'Grosse2 (MAP32) - Plasma gun', + 'region': "Wolfenstein (MAP31) Main"}, + 361468: {'name': 'Grosse (MAP32) - Plasma gun', 'episode': 4, 'map': 2, 'index': 33, 'doom_type': 2004, - 'region': "Grosse2 (MAP32) Main"}, - 361469: {'name': 'Grosse2 (MAP32) - Rocket launcher', + 'region': "Grosse (MAP32) Main"}, + 361469: {'name': 'Grosse (MAP32) - Rocket launcher', 'episode': 4, 'map': 2, 'index': 57, 'doom_type': 2003, - 'region': "Grosse2 (MAP32) Main"}, - 361470: {'name': 'Grosse2 (MAP32) - Invulnerability', + 'region': "Grosse (MAP32) Start"}, + 361470: {'name': 'Grosse (MAP32) - Invulnerability', 'episode': 4, 'map': 2, 'index': 70, 'doom_type': 2022, - 'region': "Grosse2 (MAP32) Main"}, - 361471: {'name': 'Grosse2 (MAP32) - Super Shotgun', + 'region': "Grosse (MAP32) Main"}, + 361471: {'name': 'Grosse (MAP32) - Super Shotgun', 'episode': 4, 'map': 2, 'index': 74, 'doom_type': 82, - 'region': "Grosse2 (MAP32) Main"}, - 361472: {'name': 'Grosse2 (MAP32) - BFG9000', + 'region': "Grosse (MAP32) Main"}, + 361472: {'name': 'Grosse (MAP32) - BFG9000', 'episode': 4, 'map': 2, 'index': 75, 'doom_type': 2006, - 'region': "Grosse2 (MAP32) Main"}, - 361473: {'name': 'Grosse2 (MAP32) - Megasphere', + 'region': "Grosse (MAP32) Main"}, + 361473: {'name': 'Grosse (MAP32) - Megasphere', 'episode': 4, 'map': 2, 'index': 78, 'doom_type': 83, - 'region': "Grosse2 (MAP32) Main"}, - 361474: {'name': 'Grosse2 (MAP32) - Chaingun', + 'region': "Grosse (MAP32) Main"}, + 361474: {'name': 'Grosse (MAP32) - Chaingun', 'episode': 4, 'map': 2, 'index': 79, 'doom_type': 2002, - 'region': "Grosse2 (MAP32) Main"}, - 361475: {'name': 'Grosse2 (MAP32) - Chaingun 2', + 'region': "Grosse (MAP32) Main"}, + 361475: {'name': 'Grosse (MAP32) - Chaingun 2', 'episode': 4, 'map': 2, 'index': 80, 'doom_type': 2002, - 'region': "Grosse2 (MAP32) Main"}, - 361476: {'name': 'Grosse2 (MAP32) - Chaingun 3', + 'region': "Grosse (MAP32) Main"}, + 361476: {'name': 'Grosse (MAP32) - Chaingun 3', 'episode': 4, 'map': 2, 'index': 81, 'doom_type': 2002, - 'region': "Grosse2 (MAP32) Main"}, - 361477: {'name': 'Grosse2 (MAP32) - Berserk', + 'region': "Grosse (MAP32) Main"}, + 361477: {'name': 'Grosse (MAP32) - Berserk', 'episode': 4, 'map': 2, 'index': 82, 'doom_type': 2023, - 'region': "Grosse2 (MAP32) Main"}, - 361478: {'name': 'Grosse2 (MAP32) - Exit', + 'region': "Grosse (MAP32) Start"}, + 361478: {'name': 'Grosse (MAP32) - Exit', 'episode': 4, 'map': 2, 'index': -1, 'doom_type': -1, - 'region': "Grosse2 (MAP32) Main"}, + 'region': "Grosse (MAP32) Main"}, } location_name_groups: Dict[str, Set[str]] = { - 'Barrels o Fun (MAP23)': { - 'Barrels o Fun (MAP23) - Armor', - 'Barrels o Fun (MAP23) - BFG9000', - 'Barrels o Fun (MAP23) - Backpack', - 'Barrels o Fun (MAP23) - Backpack 2', - 'Barrels o Fun (MAP23) - Berserk', - 'Barrels o Fun (MAP23) - Computer area map', - 'Barrels o Fun (MAP23) - Exit', - 'Barrels o Fun (MAP23) - Megasphere', - 'Barrels o Fun (MAP23) - Rocket launcher', - 'Barrels o Fun (MAP23) - Shotgun', - 'Barrels o Fun (MAP23) - Supercharge', - 'Barrels o Fun (MAP23) - Yellow skull key', + "Barrels o' Fun (MAP23)": { + "Barrels o' Fun (MAP23) - Armor", + "Barrels o' Fun (MAP23) - BFG9000", + "Barrels o' Fun (MAP23) - Backpack", + "Barrels o' Fun (MAP23) - Backpack 2", + "Barrels o' Fun (MAP23) - Berserk", + "Barrels o' Fun (MAP23) - Computer area map", + "Barrels o' Fun (MAP23) - Exit", + "Barrels o' Fun (MAP23) - Megasphere", + "Barrels o' Fun (MAP23) - Rocket launcher", + "Barrels o' Fun (MAP23) - Shotgun", + "Barrels o' Fun (MAP23) - Supercharge", + "Barrels o' Fun (MAP23) - Yellow skull key", }, 'Bloodfalls (MAP25)': { 'Bloodfalls (MAP25) - Armor', @@ -2998,18 +2998,18 @@ class LocationDict(TypedDict, total=False): 'Gotcha! (MAP20) - Supercharge 3', 'Gotcha! (MAP20) - Supercharge 4', }, - 'Grosse2 (MAP32)': { - 'Grosse2 (MAP32) - BFG9000', - 'Grosse2 (MAP32) - Berserk', - 'Grosse2 (MAP32) - Chaingun', - 'Grosse2 (MAP32) - Chaingun 2', - 'Grosse2 (MAP32) - Chaingun 3', - 'Grosse2 (MAP32) - Exit', - 'Grosse2 (MAP32) - Invulnerability', - 'Grosse2 (MAP32) - Megasphere', - 'Grosse2 (MAP32) - Plasma gun', - 'Grosse2 (MAP32) - Rocket launcher', - 'Grosse2 (MAP32) - Super Shotgun', + 'Grosse (MAP32)': { + 'Grosse (MAP32) - BFG9000', + 'Grosse (MAP32) - Berserk', + 'Grosse (MAP32) - Chaingun', + 'Grosse (MAP32) - Chaingun 2', + 'Grosse (MAP32) - Chaingun 3', + 'Grosse (MAP32) - Exit', + 'Grosse (MAP32) - Invulnerability', + 'Grosse (MAP32) - Megasphere', + 'Grosse (MAP32) - Plasma gun', + 'Grosse (MAP32) - Rocket launcher', + 'Grosse (MAP32) - Super Shotgun', }, 'Icon of Sin (MAP30)': { 'Icon of Sin (MAP30) - BFG9000', @@ -3417,22 +3417,22 @@ class LocationDict(TypedDict, total=False): 'Underhalls (MAP02) - Red keycard', 'Underhalls (MAP02) - Super Shotgun', }, - 'Wolfenstein2 (MAP31)': { - 'Wolfenstein2 (MAP31) - BFG9000', - 'Wolfenstein2 (MAP31) - Backpack', - 'Wolfenstein2 (MAP31) - Backpack 2', - 'Wolfenstein2 (MAP31) - Backpack 3', - 'Wolfenstein2 (MAP31) - Backpack 4', - 'Wolfenstein2 (MAP31) - Berserk', - 'Wolfenstein2 (MAP31) - Chaingun', - 'Wolfenstein2 (MAP31) - Exit', - 'Wolfenstein2 (MAP31) - Megasphere', - 'Wolfenstein2 (MAP31) - Partial invisibility', - 'Wolfenstein2 (MAP31) - Plasma gun', - 'Wolfenstein2 (MAP31) - Rocket launcher', - 'Wolfenstein2 (MAP31) - Shotgun', - 'Wolfenstein2 (MAP31) - Super Shotgun', - 'Wolfenstein2 (MAP31) - Supercharge', + 'Wolfenstein (MAP31)': { + 'Wolfenstein (MAP31) - BFG9000', + 'Wolfenstein (MAP31) - Backpack', + 'Wolfenstein (MAP31) - Backpack 2', + 'Wolfenstein (MAP31) - Backpack 3', + 'Wolfenstein (MAP31) - Backpack 4', + 'Wolfenstein (MAP31) - Berserk', + 'Wolfenstein (MAP31) - Chaingun', + 'Wolfenstein (MAP31) - Exit', + 'Wolfenstein (MAP31) - Megasphere', + 'Wolfenstein (MAP31) - Partial invisibility', + 'Wolfenstein (MAP31) - Plasma gun', + 'Wolfenstein (MAP31) - Rocket launcher', + 'Wolfenstein (MAP31) - Shotgun', + 'Wolfenstein (MAP31) - Super Shotgun', + 'Wolfenstein (MAP31) - Supercharge', }, } diff --git a/worlds/doom_ii/Maps.py b/worlds/doom_ii/Maps.py index cf41939fa513..d1a42917daad 100644 --- a/worlds/doom_ii/Maps.py +++ b/worlds/doom_ii/Maps.py @@ -26,7 +26,7 @@ 'Gotcha! (MAP20)', 'Nirvana (MAP21)', 'The Catacombs (MAP22)', - 'Barrels o Fun (MAP23)', + "Barrels o' Fun (MAP23)", 'The Chasm (MAP24)', 'Bloodfalls (MAP25)', 'The Abandoned Mines (MAP26)', @@ -34,6 +34,6 @@ 'The Spirit World (MAP28)', 'The Living End (MAP29)', 'Icon of Sin (MAP30)', - 'Wolfenstein2 (MAP31)', - 'Grosse2 (MAP32)', + 'Wolfenstein (MAP31)', + 'Grosse (MAP32)', ] diff --git a/worlds/doom_ii/Regions.py b/worlds/doom_ii/Regions.py index 3d81d7abb84e..855740dac4d9 100644 --- a/worlds/doom_ii/Regions.py +++ b/worlds/doom_ii/Regions.py @@ -84,11 +84,12 @@ class RegionDict(TypedDict, total=False): # The Waste Tunnels (MAP05) {"name":"The Waste Tunnels (MAP05) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":1, "connections":[ {"target":"The Waste Tunnels (MAP05) Red","pro":False}, - {"target":"The Waste Tunnels (MAP05) Blue","pro":False}]}, + {"target":"The Waste Tunnels (MAP05) Blue","pro":False}, + {"target":"The Waste Tunnels (MAP05) Start","pro":False}]}, {"name":"The Waste Tunnels (MAP05) Blue", "connects_to_hub":False, "episode":1, @@ -103,6 +104,10 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":1, "connections":[{"target":"The Waste Tunnels (MAP05) Main","pro":False}]}, + {"name":"The Waste Tunnels (MAP05) Start", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"The Waste Tunnels (MAP05) Main","pro":False}]}, # The Crusher (MAP06) {"name":"The Crusher (MAP06) Main", @@ -129,9 +134,13 @@ class RegionDict(TypedDict, total=False): # Dead Simple (MAP07) {"name":"Dead Simple (MAP07) Main", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Dead Simple (MAP07) Start","pro":False}]}, + {"name":"Dead Simple (MAP07) Start", "connects_to_hub":True, "episode":1, - "connections":[]}, + "connections":[{"target":"Dead Simple (MAP07) Main","pro":False}]}, # Tricks and Traps (MAP08) {"name":"Tricks and Traps (MAP08) Main", @@ -151,11 +160,12 @@ class RegionDict(TypedDict, total=False): # The Pit (MAP09) {"name":"The Pit (MAP09) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":1, "connections":[ {"target":"The Pit (MAP09) Yellow","pro":False}, - {"target":"The Pit (MAP09) Blue","pro":False}]}, + {"target":"The Pit (MAP09) Blue","pro":False}, + {"target":"The Pit (MAP09) Start","pro":False}]}, {"name":"The Pit (MAP09) Blue", "connects_to_hub":False, "episode":1, @@ -164,12 +174,18 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":1, "connections":[{"target":"The Pit (MAP09) Main","pro":False}]}, + {"name":"The Pit (MAP09) Start", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"The Pit (MAP09) Main","pro":False}]}, # Refueling Base (MAP10) {"name":"Refueling Base (MAP10) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":1, - "connections":[{"target":"Refueling Base (MAP10) Yellow","pro":False}]}, + "connections":[ + {"target":"Refueling Base (MAP10) Yellow","pro":False}, + {"target":"Refueling Base (MAP10) Start","pro":False}]}, {"name":"Refueling Base (MAP10) Yellow", "connects_to_hub":False, "episode":1, @@ -180,6 +196,10 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":1, "connections":[{"target":"Refueling Base (MAP10) Yellow","pro":False}]}, + {"name":"Refueling Base (MAP10) Start", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"Refueling Base (MAP10) Main","pro":False}]}, # Circle of Death (MAP11) {"name":"Circle of Death (MAP11) Main", @@ -187,31 +207,49 @@ class RegionDict(TypedDict, total=False): "episode":1, "connections":[ {"target":"Circle of Death (MAP11) Blue","pro":False}, - {"target":"Circle of Death (MAP11) Red","pro":False}]}, + {"target":"Circle of Death (MAP11) Red","pro":False}, + {"target":"Circle of Death (MAP11) Ending","pro":True}]}, {"name":"Circle of Death (MAP11) Blue", "connects_to_hub":False, "episode":1, "connections":[{"target":"Circle of Death (MAP11) Main","pro":False}]}, {"name":"Circle of Death (MAP11) Red", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"Circle of Death (MAP11) Main","pro":False}, + {"target":"Circle of Death (MAP11) Ending","pro":False}]}, + {"name":"Circle of Death (MAP11) Ending", "connects_to_hub":False, "episode":1, "connections":[{"target":"Circle of Death (MAP11) Main","pro":False}]}, # The Factory (MAP12) - {"name":"The Factory (MAP12) Main", - "connects_to_hub":True, + {"name":"The Factory (MAP12) Indoors", + "connects_to_hub":False, "episode":2, "connections":[ {"target":"The Factory (MAP12) Yellow","pro":False}, - {"target":"The Factory (MAP12) Blue","pro":False}]}, + {"target":"The Factory (MAP12) Blue","pro":False}, + {"target":"The Factory (MAP12) Main","pro":False}]}, {"name":"The Factory (MAP12) Blue", "connects_to_hub":False, "episode":2, - "connections":[{"target":"The Factory (MAP12) Main","pro":False}]}, + "connections":[{"target":"The Factory (MAP12) Indoors","pro":False}]}, {"name":"The Factory (MAP12) Yellow", "connects_to_hub":False, "episode":2, "connections":[]}, + {"name":"The Factory (MAP12) Outdoors", + "connects_to_hub":True, + "episode":2, + "connections":[{"target":"The Factory (MAP12) Main","pro":False}]}, + {"name":"The Factory (MAP12) Main", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"The Factory (MAP12) Indoors","pro":False}, + {"target":"The Factory (MAP12) Outdoors","pro":False}]}, # Downtown (MAP13) {"name":"Downtown (MAP13) Main", @@ -291,7 +329,8 @@ class RegionDict(TypedDict, total=False): "episode":2, "connections":[ {"target":"Suburbs (MAP16) Red","pro":False}, - {"target":"Suburbs (MAP16) Blue","pro":False}]}, + {"target":"Suburbs (MAP16) Blue","pro":False}, + {"target":"Suburbs (MAP16) Pro Exit","pro":True}]}, {"name":"Suburbs (MAP16) Blue", "connects_to_hub":False, "episode":2, @@ -300,6 +339,10 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":2, "connections":[{"target":"Suburbs (MAP16) Main","pro":False}]}, + {"name":"Suburbs (MAP16) Pro Exit", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Suburbs (MAP16) Red","pro":False}]}, # Tenements (MAP17) {"name":"Tenements (MAP17) Main", @@ -358,7 +401,7 @@ class RegionDict(TypedDict, total=False): # Nirvana (MAP21) {"name":"Nirvana (MAP21) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":3, "connections":[{"target":"Nirvana (MAP21) Yellow","pro":False}]}, {"name":"Nirvana (MAP21) Yellow", @@ -366,19 +409,29 @@ class RegionDict(TypedDict, total=False): "episode":3, "connections":[ {"target":"Nirvana (MAP21) Main","pro":False}, - {"target":"Nirvana (MAP21) Magenta","pro":False}]}, + {"target":"Nirvana (MAP21) Magenta","pro":False}, + {"target":"Nirvana (MAP21) Pro Magenta","pro":True}]}, {"name":"Nirvana (MAP21) Magenta", "connects_to_hub":False, "episode":3, "connections":[{"target":"Nirvana (MAP21) Yellow","pro":False}]}, + {"name":"Nirvana (MAP21) Start", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"Nirvana (MAP21) Main","pro":False}]}, + {"name":"Nirvana (MAP21) Pro Magenta", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Nirvana (MAP21) Magenta","pro":False}]}, # The Catacombs (MAP22) {"name":"The Catacombs (MAP22) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":3, "connections":[ {"target":"The Catacombs (MAP22) Blue","pro":False}, - {"target":"The Catacombs (MAP22) Red","pro":False}]}, + {"target":"The Catacombs (MAP22) Red","pro":False}, + {"target":"The Catacombs (MAP22) Early","pro":False}]}, {"name":"The Catacombs (MAP22) Blue", "connects_to_hub":False, "episode":3, @@ -387,36 +440,58 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":3, "connections":[{"target":"The Catacombs (MAP22) Main","pro":False}]}, + {"name":"The Catacombs (MAP22) Early", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"The Catacombs (MAP22) Main","pro":False}]}, - # Barrels o Fun (MAP23) - {"name":"Barrels o Fun (MAP23) Main", + # Barrels o' Fun (MAP23) + {"name":"Barrels o' Fun (MAP23) Main", "connects_to_hub":True, "episode":3, - "connections":[{"target":"Barrels o Fun (MAP23) Yellow","pro":False}]}, - {"name":"Barrels o Fun (MAP23) Yellow", + "connections":[{"target":"Barrels o' Fun (MAP23) Yellow","pro":False}]}, + {"name":"Barrels o' Fun (MAP23) Yellow", "connects_to_hub":False, "episode":3, - "connections":[{"target":"Barrels o Fun (MAP23) Main","pro":False}]}, + "connections":[{"target":"Barrels o' Fun (MAP23) Main","pro":False}]}, # The Chasm (MAP24) {"name":"The Chasm (MAP24) Main", "connects_to_hub":True, "episode":3, - "connections":[{"target":"The Chasm (MAP24) Red","pro":False}]}, + "connections":[ + {"target":"The Chasm (MAP24) Blue","pro":False}, + {"target":"The Chasm (MAP24) Blue Pro","pro":True}]}, {"name":"The Chasm (MAP24) Red", "connects_to_hub":False, "episode":3, - "connections":[{"target":"The Chasm (MAP24) Main","pro":False}]}, + "connections":[{"target":"The Chasm (MAP24) Blue","pro":False}]}, + {"name":"The Chasm (MAP24) Blue", + "connects_to_hub":False, + "episode":3, + "connections":[ + {"target":"The Chasm (MAP24) Red","pro":False}, + {"target":"The Chasm (MAP24) Main","pro":False}]}, + {"name":"The Chasm (MAP24) Blue Pro", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Chasm (MAP24) Blue","pro":False}]}, # Bloodfalls (MAP25) {"name":"Bloodfalls (MAP25) Main", - "connects_to_hub":True, + "connects_to_hub":False, "episode":3, - "connections":[{"target":"Bloodfalls (MAP25) Blue","pro":False}]}, + "connections":[ + {"target":"Bloodfalls (MAP25) Blue","pro":False}, + {"target":"Bloodfalls (MAP25) Start","pro":False}]}, {"name":"Bloodfalls (MAP25) Blue", "connects_to_hub":False, "episode":3, "connections":[{"target":"Bloodfalls (MAP25) Main","pro":False}]}, + {"name":"Bloodfalls (MAP25) Start", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"Bloodfalls (MAP25) Main","pro":False}]}, # The Abandoned Mines (MAP26) {"name":"The Abandoned Mines (MAP26) Main", @@ -484,19 +559,27 @@ class RegionDict(TypedDict, total=False): # Icon of Sin (MAP30) {"name":"Icon of Sin (MAP30) Main", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Icon of Sin (MAP30) Start","pro":False}]}, + {"name":"Icon of Sin (MAP30) Start", "connects_to_hub":True, "episode":3, - "connections":[]}, + "connections":[{"target":"Icon of Sin (MAP30) Main","pro":False}]}, - # Wolfenstein2 (MAP31) - {"name":"Wolfenstein2 (MAP31) Main", + # Wolfenstein (MAP31) + {"name":"Wolfenstein (MAP31) Main", "connects_to_hub":True, "episode":4, "connections":[]}, - # Grosse2 (MAP32) - {"name":"Grosse2 (MAP32) Main", + # Grosse (MAP32) + {"name":"Grosse (MAP32) Main", + "connects_to_hub":False, + "episode":4, + "connections":[{"target":"Grosse (MAP32) Start","pro":False}]}, + {"name":"Grosse (MAP32) Start", "connects_to_hub":True, "episode":4, - "connections":[]}, + "connections":[{"target":"Grosse (MAP32) Main","pro":False}]}, ] diff --git a/worlds/doom_ii/Rules.py b/worlds/doom_ii/Rules.py index 139733c0eac8..c6913991aadb 100644 --- a/worlds/doom_ii/Rules.py +++ b/worlds/doom_ii/Rules.py @@ -53,14 +53,6 @@ def set_episode1_rules(player, multiworld, pro): state.has("The Focus (MAP04) - Red keycard", player, 1)) # The Waste Tunnels (MAP05) - set_rule(multiworld.get_entrance("Hub -> The Waste Tunnels (MAP05) Main", player), lambda state: - (state.has("The Waste Tunnels (MAP05)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) set_rule(multiworld.get_entrance("The Waste Tunnels (MAP05) Main -> The Waste Tunnels (MAP05) Red", player), lambda state: state.has("The Waste Tunnels (MAP05) - Red keycard", player, 1)) set_rule(multiworld.get_entrance("The Waste Tunnels (MAP05) Main -> The Waste Tunnels (MAP05) Blue", player), lambda state: @@ -71,18 +63,22 @@ def set_episode1_rules(player, multiworld, pro): state.has("The Waste Tunnels (MAP05) - Blue keycard", player, 1)) set_rule(multiworld.get_entrance("The Waste Tunnels (MAP05) Yellow -> The Waste Tunnels (MAP05) Blue", player), lambda state: state.has("The Waste Tunnels (MAP05) - Yellow keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> The Waste Tunnels (MAP05) Start", player), lambda state: + state.has("The Waste Tunnels (MAP05)", player, 1)) + set_rule(multiworld.get_entrance("The Waste Tunnels (MAP05) Start -> The Waste Tunnels (MAP05) Main", player), lambda state: + (state.has("Shotgun", player, 1) and + state.has("Super Shotgun", player, 1)) and (state.has("Chaingun", player, 1) or + state.has("Plasma gun", player, 1))) # The Crusher (MAP06) set_rule(multiworld.get_entrance("Hub -> The Crusher (MAP06) Main", player), lambda state: (state.has("The Crusher (MAP06)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) + state.has("Shotgun", player, 1)) and + (state.has("Plasma gun", player, 1) or + state.has("Chaingun", player, 1))) set_rule(multiworld.get_entrance("The Crusher (MAP06) Main -> The Crusher (MAP06) Blue", player), lambda state: - state.has("The Crusher (MAP06) - Blue keycard", player, 1)) + state.has("The Crusher (MAP06) - Blue keycard", player, 1) and + state.has("Super Shotgun", player, 1)) set_rule(multiworld.get_entrance("The Crusher (MAP06) Blue -> The Crusher (MAP06) Red", player), lambda state: state.has("The Crusher (MAP06) - Red keycard", player, 1)) set_rule(multiworld.get_entrance("The Crusher (MAP06) Blue -> The Crusher (MAP06) Main", player), lambda state: @@ -95,14 +91,14 @@ def set_episode1_rules(player, multiworld, pro): state.has("The Crusher (MAP06) - Red keycard", player, 1)) # Dead Simple (MAP07) - set_rule(multiworld.get_entrance("Hub -> Dead Simple (MAP07) Main", player), lambda state: - (state.has("Dead Simple (MAP07)", player, 1) and - state.has("Shotgun", player, 1) and + set_rule(multiworld.get_entrance("Hub -> Dead Simple (MAP07) Start", player), lambda state: + state.has("Dead Simple (MAP07)", player, 1)) + set_rule(multiworld.get_entrance("Dead Simple (MAP07) Start -> Dead Simple (MAP07) Main", player), lambda state: + (state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or + state.has("Super Shotgun", player, 1)) and (state.has("BFG9000", player, 1) or state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) + state.has("Rocket launcher", player, 1))) # Tricks and Traps (MAP08) set_rule(multiworld.get_entrance("Hub -> Tricks and Traps (MAP08) Main", player), lambda state: @@ -119,34 +115,34 @@ def set_episode1_rules(player, multiworld, pro): state.has("Tricks and Traps (MAP08) - Yellow skull key", player, 1)) # The Pit (MAP09) - set_rule(multiworld.get_entrance("Hub -> The Pit (MAP09) Main", player), lambda state: - (state.has("The Pit (MAP09)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) set_rule(multiworld.get_entrance("The Pit (MAP09) Main -> The Pit (MAP09) Yellow", player), lambda state: state.has("The Pit (MAP09) - Yellow keycard", player, 1)) set_rule(multiworld.get_entrance("The Pit (MAP09) Main -> The Pit (MAP09) Blue", player), lambda state: state.has("The Pit (MAP09) - Blue keycard", player, 1)) set_rule(multiworld.get_entrance("The Pit (MAP09) Yellow -> The Pit (MAP09) Main", player), lambda state: state.has("The Pit (MAP09) - Yellow keycard", player, 1)) - - # Refueling Base (MAP10) - set_rule(multiworld.get_entrance("Hub -> Refueling Base (MAP10) Main", player), lambda state: - (state.has("Refueling Base (MAP10)", player, 1) and - state.has("Shotgun", player, 1) and + set_rule(multiworld.get_entrance("Hub -> The Pit (MAP09) Start", player), lambda state: + state.has("The Pit (MAP09)", player, 1)) + set_rule(multiworld.get_entrance("The Pit (MAP09) Start -> The Pit (MAP09) Main", player), lambda state: + (state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or + state.has("Super Shotgun", player, 1)) and (state.has("BFG9000", player, 1) or state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) + state.has("Rocket launcher", player, 1))) + + # Refueling Base (MAP10) set_rule(multiworld.get_entrance("Refueling Base (MAP10) Main -> Refueling Base (MAP10) Yellow", player), lambda state: state.has("Refueling Base (MAP10) - Yellow keycard", player, 1)) set_rule(multiworld.get_entrance("Refueling Base (MAP10) Yellow -> Refueling Base (MAP10) Yellow Blue", player), lambda state: state.has("Refueling Base (MAP10) - Blue keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Refueling Base (MAP10) Start", player), lambda state: + state.has("Refueling Base (MAP10)", player, 1)) + set_rule(multiworld.get_entrance("Refueling Base (MAP10) Start -> Refueling Base (MAP10) Main", player), lambda state: + (state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and (state.has("BFG9000", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("Rocket launcher", player, 1))) # Circle of Death (MAP11) set_rule(multiworld.get_entrance("Hub -> Circle of Death (MAP11) Main", player), lambda state: @@ -165,18 +161,19 @@ def set_episode1_rules(player, multiworld, pro): def set_episode2_rules(player, multiworld, pro): # The Factory (MAP12) - set_rule(multiworld.get_entrance("Hub -> The Factory (MAP12) Main", player), lambda state: - (state.has("The Factory (MAP12)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) - set_rule(multiworld.get_entrance("The Factory (MAP12) Main -> The Factory (MAP12) Yellow", player), lambda state: + set_rule(multiworld.get_entrance("The Factory (MAP12) Indoors -> The Factory (MAP12) Yellow", player), lambda state: state.has("The Factory (MAP12) - Yellow keycard", player, 1)) - set_rule(multiworld.get_entrance("The Factory (MAP12) Main -> The Factory (MAP12) Blue", player), lambda state: + set_rule(multiworld.get_entrance("The Factory (MAP12) Indoors -> The Factory (MAP12) Blue", player), lambda state: state.has("The Factory (MAP12) - Blue keycard", player, 1)) + set_rule(multiworld.get_entrance("Hub -> The Factory (MAP12) Outdoors", player), lambda state: + state.has("The Factory (MAP12)", player, 1)) + set_rule(multiworld.get_entrance("The Factory (MAP12) Outdoors -> The Factory (MAP12) Main", player), lambda state: + state.has("Super Shotgun", player, 1) or + state.has("Plasma gun", player, 1)) + set_rule(multiworld.get_entrance("The Factory (MAP12) Main -> The Factory (MAP12) Indoors", player), lambda state: + (state.has("Super Shotgun", player, 1) and + state.has("Chaingun", player, 1)) and (state.has("BFG9000", player, 1) or + state.has("Plasma gun", player, 1))) # Downtown (MAP13) set_rule(multiworld.get_entrance("Hub -> Downtown (MAP13) Main", player), lambda state: @@ -307,54 +304,56 @@ def set_episode2_rules(player, multiworld, pro): def set_episode3_rules(player, multiworld, pro): # Nirvana (MAP21) - set_rule(multiworld.get_entrance("Hub -> Nirvana (MAP21) Main", player), lambda state: - (state.has("Nirvana (MAP21)", player, 1) and - state.has("Shotgun", player, 1) and + set_rule(multiworld.get_entrance("Nirvana (MAP21) Main -> Nirvana (MAP21) Yellow", player), lambda state: + (state.has("Super Shotgun", player, 1) and state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or + state.has("Nirvana (MAP21) - Yellow skull key", player, 1)) and (state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1))) - set_rule(multiworld.get_entrance("Nirvana (MAP21) Main -> Nirvana (MAP21) Yellow", player), lambda state: - state.has("Nirvana (MAP21) - Yellow skull key", player, 1)) set_rule(multiworld.get_entrance("Nirvana (MAP21) Yellow -> Nirvana (MAP21) Main", player), lambda state: state.has("Nirvana (MAP21) - Yellow skull key", player, 1)) set_rule(multiworld.get_entrance("Nirvana (MAP21) Yellow -> Nirvana (MAP21) Magenta", player), lambda state: state.has("Nirvana (MAP21) - Red skull key", player, 1) and state.has("Nirvana (MAP21) - Blue skull key", player, 1)) - set_rule(multiworld.get_entrance("Nirvana (MAP21) Magenta -> Nirvana (MAP21) Yellow", player), lambda state: - state.has("Nirvana (MAP21) - Red skull key", player, 1) and - state.has("Nirvana (MAP21) - Blue skull key", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Nirvana (MAP21) Start", player), lambda state: + state.has("Nirvana (MAP21)", player, 1)) + set_rule(multiworld.get_entrance("Nirvana (MAP21) Start -> Nirvana (MAP21) Main", player), lambda state: + state.has("Super Shotgun", player, 1) or + state.has("Plasma gun", player, 1)) + set_rule(multiworld.get_entrance("Nirvana (MAP21) Pro Magenta -> Nirvana (MAP21) Magenta", player), lambda state: + state.has("Nirvana (MAP21) - Red skull key", player, 1)) # The Catacombs (MAP22) - set_rule(multiworld.get_entrance("Hub -> The Catacombs (MAP22) Main", player), lambda state: - (state.has("The Catacombs (MAP22)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("BFG9000", player, 1) or - state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1))) set_rule(multiworld.get_entrance("The Catacombs (MAP22) Main -> The Catacombs (MAP22) Blue", player), lambda state: state.has("The Catacombs (MAP22) - Blue skull key", player, 1)) set_rule(multiworld.get_entrance("The Catacombs (MAP22) Main -> The Catacombs (MAP22) Red", player), lambda state: state.has("The Catacombs (MAP22) - Red skull key", player, 1)) set_rule(multiworld.get_entrance("The Catacombs (MAP22) Red -> The Catacombs (MAP22) Main", player), lambda state: state.has("The Catacombs (MAP22) - Red skull key", player, 1)) + set_rule(multiworld.get_entrance("Hub -> The Catacombs (MAP22) Early", player), lambda state: + (state.has("The Catacombs (MAP22)", player, 1)) and + (state.has("Shotgun", player, 1) or + state.has("Super Shotgun", player, 1) or + state.has("Plasma gun", player, 1))) + set_rule(multiworld.get_entrance("The Catacombs (MAP22) Early -> The Catacombs (MAP22) Main", player), lambda state: + (state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and (state.has("BFG9000", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("Rocket launcher", player, 1))) - # Barrels o Fun (MAP23) - set_rule(multiworld.get_entrance("Hub -> Barrels o Fun (MAP23) Main", player), lambda state: - (state.has("Barrels o Fun (MAP23)", player, 1) and + # Barrels o' Fun (MAP23) + set_rule(multiworld.get_entrance("Hub -> Barrels o' Fun (MAP23) Main", player), lambda state: + (state.has("Barrels o' Fun (MAP23)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and state.has("Super Shotgun", player, 1)) and (state.has("Rocket launcher", player, 1) or state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1))) - set_rule(multiworld.get_entrance("Barrels o Fun (MAP23) Main -> Barrels o Fun (MAP23) Yellow", player), lambda state: - state.has("Barrels o Fun (MAP23) - Yellow skull key", player, 1)) - set_rule(multiworld.get_entrance("Barrels o Fun (MAP23) Yellow -> Barrels o Fun (MAP23) Main", player), lambda state: - state.has("Barrels o Fun (MAP23) - Yellow skull key", player, 1)) + set_rule(multiworld.get_entrance("Barrels o' Fun (MAP23) Main -> Barrels o' Fun (MAP23) Yellow", player), lambda state: + state.has("Barrels o' Fun (MAP23) - Yellow skull key", player, 1)) + set_rule(multiworld.get_entrance("Barrels o' Fun (MAP23) Yellow -> Barrels o' Fun (MAP23) Main", player), lambda state: + state.has("Barrels o' Fun (MAP23) - Yellow skull key", player, 1)) # The Chasm (MAP24) set_rule(multiworld.get_entrance("Hub -> The Chasm (MAP24) Main", player), lambda state: @@ -365,24 +364,26 @@ def set_episode3_rules(player, multiworld, pro): state.has("Plasma gun", player, 1) and state.has("BFG9000", player, 1) and state.has("Super Shotgun", player, 1)) - set_rule(multiworld.get_entrance("The Chasm (MAP24) Main -> The Chasm (MAP24) Red", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (MAP24) Main -> The Chasm (MAP24) Blue", player), lambda state: + state.has("The Chasm (MAP24) - Blue keycard", player, 1)) + set_rule(multiworld.get_entrance("The Chasm (MAP24) Red -> The Chasm (MAP24) Blue", player), lambda state: state.has("The Chasm (MAP24) - Red keycard", player, 1)) - set_rule(multiworld.get_entrance("The Chasm (MAP24) Red -> The Chasm (MAP24) Main", player), lambda state: + set_rule(multiworld.get_entrance("The Chasm (MAP24) Blue -> The Chasm (MAP24) Red", player), lambda state: state.has("The Chasm (MAP24) - Red keycard", player, 1)) # Bloodfalls (MAP25) - set_rule(multiworld.get_entrance("Hub -> Bloodfalls (MAP25) Main", player), lambda state: - state.has("Bloodfalls (MAP25)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Rocket launcher", player, 1) and - state.has("Plasma gun", player, 1) and - state.has("BFG9000", player, 1) and - state.has("Super Shotgun", player, 1)) set_rule(multiworld.get_entrance("Bloodfalls (MAP25) Main -> Bloodfalls (MAP25) Blue", player), lambda state: - state.has("Bloodfalls (MAP25) - Blue skull key", player, 1)) + (state.has("Bloodfalls (MAP25) - Blue skull key", player, 1)) and (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) set_rule(multiworld.get_entrance("Bloodfalls (MAP25) Blue -> Bloodfalls (MAP25) Main", player), lambda state: state.has("Bloodfalls (MAP25) - Blue skull key", player, 1)) + set_rule(multiworld.get_entrance("Hub -> Bloodfalls (MAP25) Start", player), lambda state: + state.has("Bloodfalls (MAP25)", player, 1)) + set_rule(multiworld.get_entrance("Bloodfalls (MAP25) Start -> Bloodfalls (MAP25) Main", player), lambda state: + state.has("Super Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Shotgun", player, 1)) # The Abandoned Mines (MAP26) set_rule(multiworld.get_entrance("Hub -> The Abandoned Mines (MAP26) Main", player), lambda state: @@ -451,36 +452,34 @@ def set_episode3_rules(player, multiworld, pro): state.has("Super Shotgun", player, 1)) # Icon of Sin (MAP30) - set_rule(multiworld.get_entrance("Hub -> Icon of Sin (MAP30) Main", player), lambda state: - state.has("Icon of Sin (MAP30)", player, 1) and - state.has("Rocket launcher", player, 1) and + set_rule(multiworld.get_entrance("Hub -> Icon of Sin (MAP30) Start", player), lambda state: + state.has("Icon of Sin (MAP30)", player, 1)) + set_rule(multiworld.get_entrance("Icon of Sin (MAP30) Start -> Icon of Sin (MAP30) Main", player), lambda state: state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and + state.has("Rocket launcher", player, 1) and state.has("Plasma gun", player, 1) and + state.has("Chaingun", player, 1) and state.has("BFG9000", player, 1) and state.has("Super Shotgun", player, 1)) def set_episode4_rules(player, multiworld, pro): - # Wolfenstein2 (MAP31) - set_rule(multiworld.get_entrance("Hub -> Wolfenstein2 (MAP31) Main", player), lambda state: - (state.has("Wolfenstein2 (MAP31)", player, 1) and - state.has("Shotgun", player, 1) and - state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or - state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) + # Wolfenstein (MAP31) + set_rule(multiworld.get_entrance("Hub -> Wolfenstein (MAP31) Main", player), lambda state: + (state.has("Wolfenstein (MAP31)", player, 1) and + state.has("Chaingun", player, 1)) and + (state.has("Shotgun", player, 1) or + state.has("Super Shotgun", player, 1))) - # Grosse2 (MAP32) - set_rule(multiworld.get_entrance("Hub -> Grosse2 (MAP32) Main", player), lambda state: - (state.has("Grosse2 (MAP32)", player, 1) and - state.has("Shotgun", player, 1) and + # Grosse (MAP32) + set_rule(multiworld.get_entrance("Hub -> Grosse (MAP32) Start", player), lambda state: + state.has("Grosse (MAP32)", player, 1)) + set_rule(multiworld.get_entrance("Grosse (MAP32) Start -> Grosse (MAP32) Main", player), lambda state: + (state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and - state.has("Super Shotgun", player, 1)) and - (state.has("Rocket launcher", player, 1) or + state.has("Super Shotgun", player, 1)) and (state.has("BFG9000", player, 1) or state.has("Plasma gun", player, 1) or - state.has("BFG9000", player, 1))) + state.has("Rocket launcher", player, 1))) def set_rules(doom_ii_world: "DOOM2World", included_episodes, pro): diff --git a/worlds/heretic/Items.py b/worlds/heretic/Items.py index a0907a3a3040..ffa461f36bb2 100644 --- a/worlds/heretic/Items.py +++ b/worlds/heretic/Items.py @@ -514,19 +514,19 @@ class ItemDict(TypedDict, total=False): 'map': 7}, 370259: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'The Aquifier (E3M9) - Blue key', + 'name': 'The Aquifer (E3M9) - Blue key', 'doom_type': 79, 'episode': 3, 'map': 9}, 370260: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'The Aquifier (E3M9) - Green key', + 'name': 'The Aquifer (E3M9) - Green key', 'doom_type': 73, 'episode': 3, 'map': 9}, 370261: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'The Aquifier (E3M9) - Yellow key', + 'name': 'The Aquifer (E3M9) - Yellow key', 'doom_type': 80, 'episode': 3, 'map': 9}, @@ -1234,37 +1234,37 @@ class ItemDict(TypedDict, total=False): 'map': 7}, 370475: {'classification': ItemClassification.progression, 'count': 1, - 'name': "D'Sparil'S Keep (E3M8)", + 'name': "D'Sparil's Keep (E3M8)", 'doom_type': -1, 'episode': 3, 'map': 8}, 370476: {'classification': ItemClassification.progression, 'count': 1, - 'name': "D'Sparil'S Keep (E3M8) - Complete", + 'name': "D'Sparil's Keep (E3M8) - Complete", 'doom_type': -2, 'episode': 3, 'map': 8}, 370477: {'classification': ItemClassification.filler, 'count': 1, - 'name': "D'Sparil'S Keep (E3M8) - Map Scroll", + 'name': "D'Sparil's Keep (E3M8) - Map Scroll", 'doom_type': 35, 'episode': 3, 'map': 8}, 370478: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'The Aquifier (E3M9)', + 'name': 'The Aquifer (E3M9)', 'doom_type': -1, 'episode': 3, 'map': 9}, 370479: {'classification': ItemClassification.progression, 'count': 1, - 'name': 'The Aquifier (E3M9) - Complete', + 'name': 'The Aquifer (E3M9) - Complete', 'doom_type': -2, 'episode': 3, 'map': 9}, 370480: {'classification': ItemClassification.filler, 'count': 1, - 'name': 'The Aquifier (E3M9) - Map Scroll', + 'name': 'The Aquifer (E3M9) - Map Scroll', 'doom_type': 35, 'episode': 3, 'map': 9}, @@ -1599,8 +1599,8 @@ class ItemDict(TypedDict, total=False): 'Ammos': {'Crystal Geode', 'Energy Orb', 'Greater Runes', 'Inferno Orb', 'Pile of Mace Spheres', 'Quiver of Ethereal Arrows', }, 'Armors': {'Enchanted Shield', 'Silver Shield', }, 'Artifacts': {'Chaos Device', 'Morph Ovum', 'Mystic Urn', 'Quartz Flask', 'Ring of Invincibility', 'Shadowsphere', 'Timebomb of the Ancients', 'Tome of Power', 'Torch', }, - 'Keys': {'Ambulatory (E4M3) - Blue key', 'Ambulatory (E4M3) - Green key', 'Ambulatory (E4M3) - Yellow key', 'Blockhouse (E4M2) - Blue key', 'Blockhouse (E4M2) - Green key', 'Blockhouse (E4M2) - Yellow key', 'Catafalque (E4M1) - Green key', 'Catafalque (E4M1) - Yellow key', 'Colonnade (E5M6) - Blue key', 'Colonnade (E5M6) - Green key', 'Colonnade (E5M6) - Yellow key', 'Courtyard (E5M4) - Blue key', 'Courtyard (E5M4) - Green key', 'Courtyard (E5M4) - Yellow key', 'Foetid Manse (E5M7) - Blue key', 'Foetid Manse (E5M7) - Green key', 'Foetid Manse (E5M7) - Yellow key', 'Great Stair (E4M5) - Blue key', 'Great Stair (E4M5) - Green key', 'Great Stair (E4M5) - Yellow key', 'Halls of the Apostate (E4M6) - Blue key', 'Halls of the Apostate (E4M6) - Green key', 'Halls of the Apostate (E4M6) - Yellow key', 'Hydratyr (E5M5) - Blue key', 'Hydratyr (E5M5) - Green key', 'Hydratyr (E5M5) - Yellow key', 'Mausoleum (E4M9) - Yellow key', 'Ochre Cliffs (E5M1) - Blue key', 'Ochre Cliffs (E5M1) - Green key', 'Ochre Cliffs (E5M1) - Yellow key', 'Quay (E5M3) - Blue key', 'Quay (E5M3) - Green key', 'Quay (E5M3) - Yellow key', 'Ramparts of Perdition (E4M7) - Blue key', 'Ramparts of Perdition (E4M7) - Green key', 'Ramparts of Perdition (E4M7) - Yellow key', 'Rapids (E5M2) - Green key', 'Rapids (E5M2) - Yellow key', 'Shattered Bridge (E4M8) - Yellow key', "Skein of D'Sparil (E5M9) - Blue key", "Skein of D'Sparil (E5M9) - Green key", "Skein of D'Sparil (E5M9) - Yellow key", 'The Aquifier (E3M9) - Blue key', 'The Aquifier (E3M9) - Green key', 'The Aquifier (E3M9) - Yellow key', 'The Azure Fortress (E3M4) - Green key', 'The Azure Fortress (E3M4) - Yellow key', 'The Catacombs (E2M5) - Blue key', 'The Catacombs (E2M5) - Green key', 'The Catacombs (E2M5) - Yellow key', 'The Cathedral (E1M6) - Green key', 'The Cathedral (E1M6) - Yellow key', 'The Cesspool (E3M2) - Blue key', 'The Cesspool (E3M2) - Green key', 'The Cesspool (E3M2) - Yellow key', 'The Chasm (E3M7) - Blue key', 'The Chasm (E3M7) - Green key', 'The Chasm (E3M7) - Yellow key', 'The Citadel (E1M5) - Blue key', 'The Citadel (E1M5) - Green key', 'The Citadel (E1M5) - Yellow key', 'The Confluence (E3M3) - Blue key', 'The Confluence (E3M3) - Green key', 'The Confluence (E3M3) - Yellow key', 'The Crater (E2M1) - Green key', 'The Crater (E2M1) - Yellow key', 'The Crypts (E1M7) - Blue key', 'The Crypts (E1M7) - Green key', 'The Crypts (E1M7) - Yellow key', 'The Docks (E1M1) - Yellow key', 'The Dungeons (E1M2) - Blue key', 'The Dungeons (E1M2) - Green key', 'The Dungeons (E1M2) - Yellow key', 'The Gatehouse (E1M3) - Green key', 'The Gatehouse (E1M3) - Yellow key', 'The Glacier (E2M9) - Blue key', 'The Glacier (E2M9) - Green key', 'The Glacier (E2M9) - Yellow key', 'The Graveyard (E1M9) - Blue key', 'The Graveyard (E1M9) - Green key', 'The Graveyard (E1M9) - Yellow key', 'The Great Hall (E2M7) - Blue key', 'The Great Hall (E2M7) - Green key', 'The Great Hall (E2M7) - Yellow key', 'The Guard Tower (E1M4) - Green key', 'The Guard Tower (E1M4) - Yellow key', 'The Halls of Fear (E3M6) - Blue key', 'The Halls of Fear (E3M6) - Green key', 'The Halls of Fear (E3M6) - Yellow key', 'The Ice Grotto (E2M4) - Blue key', 'The Ice Grotto (E2M4) - Green key', 'The Ice Grotto (E2M4) - Yellow key', 'The Labyrinth (E2M6) - Blue key', 'The Labyrinth (E2M6) - Green key', 'The Labyrinth (E2M6) - Yellow key', 'The Lava Pits (E2M2) - Green key', 'The Lava Pits (E2M2) - Yellow key', 'The Ophidian Lair (E3M5) - Green key', 'The Ophidian Lair (E3M5) - Yellow key', 'The River of Fire (E2M3) - Blue key', 'The River of Fire (E2M3) - Green key', 'The River of Fire (E2M3) - Yellow key', 'The Storehouse (E3M1) - Green key', 'The Storehouse (E3M1) - Yellow key', }, - 'Levels': {'Ambulatory (E4M3)', 'Blockhouse (E4M2)', 'Catafalque (E4M1)', 'Colonnade (E5M6)', 'Courtyard (E5M4)', "D'Sparil'S Keep (E3M8)", 'Field of Judgement (E5M8)', 'Foetid Manse (E5M7)', 'Great Stair (E4M5)', 'Halls of the Apostate (E4M6)', "Hell's Maw (E1M8)", 'Hydratyr (E5M5)', 'Mausoleum (E4M9)', 'Ochre Cliffs (E5M1)', 'Quay (E5M3)', 'Ramparts of Perdition (E4M7)', 'Rapids (E5M2)', 'Sepulcher (E4M4)', 'Shattered Bridge (E4M8)', "Skein of D'Sparil (E5M9)", 'The Aquifier (E3M9)', 'The Azure Fortress (E3M4)', 'The Catacombs (E2M5)', 'The Cathedral (E1M6)', 'The Cesspool (E3M2)', 'The Chasm (E3M7)', 'The Citadel (E1M5)', 'The Confluence (E3M3)', 'The Crater (E2M1)', 'The Crypts (E1M7)', 'The Docks (E1M1)', 'The Dungeons (E1M2)', 'The Gatehouse (E1M3)', 'The Glacier (E2M9)', 'The Graveyard (E1M9)', 'The Great Hall (E2M7)', 'The Guard Tower (E1M4)', 'The Halls of Fear (E3M6)', 'The Ice Grotto (E2M4)', 'The Labyrinth (E2M6)', 'The Lava Pits (E2M2)', 'The Ophidian Lair (E3M5)', 'The Portals of Chaos (E2M8)', 'The River of Fire (E2M3)', 'The Storehouse (E3M1)', }, - 'Map Scrolls': {'Ambulatory (E4M3) - Map Scroll', 'Blockhouse (E4M2) - Map Scroll', 'Catafalque (E4M1) - Map Scroll', 'Colonnade (E5M6) - Map Scroll', 'Courtyard (E5M4) - Map Scroll', "D'Sparil'S Keep (E3M8) - Map Scroll", 'Field of Judgement (E5M8) - Map Scroll', 'Foetid Manse (E5M7) - Map Scroll', 'Great Stair (E4M5) - Map Scroll', 'Halls of the Apostate (E4M6) - Map Scroll', "Hell's Maw (E1M8) - Map Scroll", 'Hydratyr (E5M5) - Map Scroll', 'Mausoleum (E4M9) - Map Scroll', 'Ochre Cliffs (E5M1) - Map Scroll', 'Quay (E5M3) - Map Scroll', 'Ramparts of Perdition (E4M7) - Map Scroll', 'Rapids (E5M2) - Map Scroll', 'Sepulcher (E4M4) - Map Scroll', 'Shattered Bridge (E4M8) - Map Scroll', "Skein of D'Sparil (E5M9) - Map Scroll", 'The Aquifier (E3M9) - Map Scroll', 'The Azure Fortress (E3M4) - Map Scroll', 'The Catacombs (E2M5) - Map Scroll', 'The Cathedral (E1M6) - Map Scroll', 'The Cesspool (E3M2) - Map Scroll', 'The Chasm (E3M7) - Map Scroll', 'The Citadel (E1M5) - Map Scroll', 'The Confluence (E3M3) - Map Scroll', 'The Crater (E2M1) - Map Scroll', 'The Crypts (E1M7) - Map Scroll', 'The Docks (E1M1) - Map Scroll', 'The Dungeons (E1M2) - Map Scroll', 'The Gatehouse (E1M3) - Map Scroll', 'The Glacier (E2M9) - Map Scroll', 'The Graveyard (E1M9) - Map Scroll', 'The Great Hall (E2M7) - Map Scroll', 'The Guard Tower (E1M4) - Map Scroll', 'The Halls of Fear (E3M6) - Map Scroll', 'The Ice Grotto (E2M4) - Map Scroll', 'The Labyrinth (E2M6) - Map Scroll', 'The Lava Pits (E2M2) - Map Scroll', 'The Ophidian Lair (E3M5) - Map Scroll', 'The Portals of Chaos (E2M8) - Map Scroll', 'The River of Fire (E2M3) - Map Scroll', 'The Storehouse (E3M1) - Map Scroll', }, + 'Keys': {'Ambulatory (E4M3) - Blue key', 'Ambulatory (E4M3) - Green key', 'Ambulatory (E4M3) - Yellow key', 'Blockhouse (E4M2) - Blue key', 'Blockhouse (E4M2) - Green key', 'Blockhouse (E4M2) - Yellow key', 'Catafalque (E4M1) - Green key', 'Catafalque (E4M1) - Yellow key', 'Colonnade (E5M6) - Blue key', 'Colonnade (E5M6) - Green key', 'Colonnade (E5M6) - Yellow key', 'Courtyard (E5M4) - Blue key', 'Courtyard (E5M4) - Green key', 'Courtyard (E5M4) - Yellow key', 'Foetid Manse (E5M7) - Blue key', 'Foetid Manse (E5M7) - Green key', 'Foetid Manse (E5M7) - Yellow key', 'Great Stair (E4M5) - Blue key', 'Great Stair (E4M5) - Green key', 'Great Stair (E4M5) - Yellow key', 'Halls of the Apostate (E4M6) - Blue key', 'Halls of the Apostate (E4M6) - Green key', 'Halls of the Apostate (E4M6) - Yellow key', 'Hydratyr (E5M5) - Blue key', 'Hydratyr (E5M5) - Green key', 'Hydratyr (E5M5) - Yellow key', 'Mausoleum (E4M9) - Yellow key', 'Ochre Cliffs (E5M1) - Blue key', 'Ochre Cliffs (E5M1) - Green key', 'Ochre Cliffs (E5M1) - Yellow key', 'Quay (E5M3) - Blue key', 'Quay (E5M3) - Green key', 'Quay (E5M3) - Yellow key', 'Ramparts of Perdition (E4M7) - Blue key', 'Ramparts of Perdition (E4M7) - Green key', 'Ramparts of Perdition (E4M7) - Yellow key', 'Rapids (E5M2) - Green key', 'Rapids (E5M2) - Yellow key', 'Shattered Bridge (E4M8) - Yellow key', "Skein of D'Sparil (E5M9) - Blue key", "Skein of D'Sparil (E5M9) - Green key", "Skein of D'Sparil (E5M9) - Yellow key", 'The Aquifer (E3M9) - Blue key', 'The Aquifer (E3M9) - Green key', 'The Aquifer (E3M9) - Yellow key', 'The Azure Fortress (E3M4) - Green key', 'The Azure Fortress (E3M4) - Yellow key', 'The Catacombs (E2M5) - Blue key', 'The Catacombs (E2M5) - Green key', 'The Catacombs (E2M5) - Yellow key', 'The Cathedral (E1M6) - Green key', 'The Cathedral (E1M6) - Yellow key', 'The Cesspool (E3M2) - Blue key', 'The Cesspool (E3M2) - Green key', 'The Cesspool (E3M2) - Yellow key', 'The Chasm (E3M7) - Blue key', 'The Chasm (E3M7) - Green key', 'The Chasm (E3M7) - Yellow key', 'The Citadel (E1M5) - Blue key', 'The Citadel (E1M5) - Green key', 'The Citadel (E1M5) - Yellow key', 'The Confluence (E3M3) - Blue key', 'The Confluence (E3M3) - Green key', 'The Confluence (E3M3) - Yellow key', 'The Crater (E2M1) - Green key', 'The Crater (E2M1) - Yellow key', 'The Crypts (E1M7) - Blue key', 'The Crypts (E1M7) - Green key', 'The Crypts (E1M7) - Yellow key', 'The Docks (E1M1) - Yellow key', 'The Dungeons (E1M2) - Blue key', 'The Dungeons (E1M2) - Green key', 'The Dungeons (E1M2) - Yellow key', 'The Gatehouse (E1M3) - Green key', 'The Gatehouse (E1M3) - Yellow key', 'The Glacier (E2M9) - Blue key', 'The Glacier (E2M9) - Green key', 'The Glacier (E2M9) - Yellow key', 'The Graveyard (E1M9) - Blue key', 'The Graveyard (E1M9) - Green key', 'The Graveyard (E1M9) - Yellow key', 'The Great Hall (E2M7) - Blue key', 'The Great Hall (E2M7) - Green key', 'The Great Hall (E2M7) - Yellow key', 'The Guard Tower (E1M4) - Green key', 'The Guard Tower (E1M4) - Yellow key', 'The Halls of Fear (E3M6) - Blue key', 'The Halls of Fear (E3M6) - Green key', 'The Halls of Fear (E3M6) - Yellow key', 'The Ice Grotto (E2M4) - Blue key', 'The Ice Grotto (E2M4) - Green key', 'The Ice Grotto (E2M4) - Yellow key', 'The Labyrinth (E2M6) - Blue key', 'The Labyrinth (E2M6) - Green key', 'The Labyrinth (E2M6) - Yellow key', 'The Lava Pits (E2M2) - Green key', 'The Lava Pits (E2M2) - Yellow key', 'The Ophidian Lair (E3M5) - Green key', 'The Ophidian Lair (E3M5) - Yellow key', 'The River of Fire (E2M3) - Blue key', 'The River of Fire (E2M3) - Green key', 'The River of Fire (E2M3) - Yellow key', 'The Storehouse (E3M1) - Green key', 'The Storehouse (E3M1) - Yellow key', }, + 'Levels': {'Ambulatory (E4M3)', 'Blockhouse (E4M2)', 'Catafalque (E4M1)', 'Colonnade (E5M6)', 'Courtyard (E5M4)', "D'Sparil's Keep (E3M8)", 'Field of Judgement (E5M8)', 'Foetid Manse (E5M7)', 'Great Stair (E4M5)', 'Halls of the Apostate (E4M6)', "Hell's Maw (E1M8)", 'Hydratyr (E5M5)', 'Mausoleum (E4M9)', 'Ochre Cliffs (E5M1)', 'Quay (E5M3)', 'Ramparts of Perdition (E4M7)', 'Rapids (E5M2)', 'Sepulcher (E4M4)', 'Shattered Bridge (E4M8)', "Skein of D'Sparil (E5M9)", 'The Aquifer (E3M9)', 'The Azure Fortress (E3M4)', 'The Catacombs (E2M5)', 'The Cathedral (E1M6)', 'The Cesspool (E3M2)', 'The Chasm (E3M7)', 'The Citadel (E1M5)', 'The Confluence (E3M3)', 'The Crater (E2M1)', 'The Crypts (E1M7)', 'The Docks (E1M1)', 'The Dungeons (E1M2)', 'The Gatehouse (E1M3)', 'The Glacier (E2M9)', 'The Graveyard (E1M9)', 'The Great Hall (E2M7)', 'The Guard Tower (E1M4)', 'The Halls of Fear (E3M6)', 'The Ice Grotto (E2M4)', 'The Labyrinth (E2M6)', 'The Lava Pits (E2M2)', 'The Ophidian Lair (E3M5)', 'The Portals of Chaos (E2M8)', 'The River of Fire (E2M3)', 'The Storehouse (E3M1)', }, + 'Map Scrolls': {'Ambulatory (E4M3) - Map Scroll', 'Blockhouse (E4M2) - Map Scroll', 'Catafalque (E4M1) - Map Scroll', 'Colonnade (E5M6) - Map Scroll', 'Courtyard (E5M4) - Map Scroll', "D'Sparil's Keep (E3M8) - Map Scroll", 'Field of Judgement (E5M8) - Map Scroll', 'Foetid Manse (E5M7) - Map Scroll', 'Great Stair (E4M5) - Map Scroll', 'Halls of the Apostate (E4M6) - Map Scroll', "Hell's Maw (E1M8) - Map Scroll", 'Hydratyr (E5M5) - Map Scroll', 'Mausoleum (E4M9) - Map Scroll', 'Ochre Cliffs (E5M1) - Map Scroll', 'Quay (E5M3) - Map Scroll', 'Ramparts of Perdition (E4M7) - Map Scroll', 'Rapids (E5M2) - Map Scroll', 'Sepulcher (E4M4) - Map Scroll', 'Shattered Bridge (E4M8) - Map Scroll', "Skein of D'Sparil (E5M9) - Map Scroll", 'The Aquifer (E3M9) - Map Scroll', 'The Azure Fortress (E3M4) - Map Scroll', 'The Catacombs (E2M5) - Map Scroll', 'The Cathedral (E1M6) - Map Scroll', 'The Cesspool (E3M2) - Map Scroll', 'The Chasm (E3M7) - Map Scroll', 'The Citadel (E1M5) - Map Scroll', 'The Confluence (E3M3) - Map Scroll', 'The Crater (E2M1) - Map Scroll', 'The Crypts (E1M7) - Map Scroll', 'The Docks (E1M1) - Map Scroll', 'The Dungeons (E1M2) - Map Scroll', 'The Gatehouse (E1M3) - Map Scroll', 'The Glacier (E2M9) - Map Scroll', 'The Graveyard (E1M9) - Map Scroll', 'The Great Hall (E2M7) - Map Scroll', 'The Guard Tower (E1M4) - Map Scroll', 'The Halls of Fear (E3M6) - Map Scroll', 'The Ice Grotto (E2M4) - Map Scroll', 'The Labyrinth (E2M6) - Map Scroll', 'The Lava Pits (E2M2) - Map Scroll', 'The Ophidian Lair (E3M5) - Map Scroll', 'The Portals of Chaos (E2M8) - Map Scroll', 'The River of Fire (E2M3) - Map Scroll', 'The Storehouse (E3M1) - Map Scroll', }, 'Weapons': {'Dragon Claw', 'Ethereal Crossbow', 'Firemace', 'Gauntlets of the Necromancer', 'Hellstaff', 'Phoenix Rod', }, } diff --git a/worlds/heretic/Locations.py b/worlds/heretic/Locations.py index ff32df7b34c5..8c0814cf119e 100644 --- a/worlds/heretic/Locations.py +++ b/worlds/heretic/Locations.py @@ -3633,300 +3633,300 @@ class LocationDict(TypedDict, total=False): 'index': -1, 'doom_type': -1, 'region': "The Chasm (E3M7) Blue"}, - 371517: {'name': "D'Sparil'S Keep (E3M8) - Phoenix Rod", + 371517: {'name': "D'Sparil's Keep (E3M8) - Phoenix Rod", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 55, 'doom_type': 2003, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371518: {'name': "D'Sparil'S Keep (E3M8) - Ethereal Crossbow", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371518: {'name': "D'Sparil's Keep (E3M8) - Ethereal Crossbow", 'episode': 3, 'check_sanity': True, 'map': 8, 'index': 56, 'doom_type': 2001, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371519: {'name': "D'Sparil'S Keep (E3M8) - Dragon Claw", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371519: {'name': "D'Sparil's Keep (E3M8) - Dragon Claw", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 57, 'doom_type': 53, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371520: {'name': "D'Sparil'S Keep (E3M8) - Gauntlets of the Necromancer", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371520: {'name': "D'Sparil's Keep (E3M8) - Gauntlets of the Necromancer", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 58, 'doom_type': 2005, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371521: {'name': "D'Sparil'S Keep (E3M8) - Hellstaff", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371521: {'name': "D'Sparil's Keep (E3M8) - Hellstaff", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 59, 'doom_type': 2004, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371522: {'name': "D'Sparil'S Keep (E3M8) - Bag of Holding", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371522: {'name': "D'Sparil's Keep (E3M8) - Bag of Holding", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 63, 'doom_type': 8, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371523: {'name': "D'Sparil'S Keep (E3M8) - Mystic Urn", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371523: {'name': "D'Sparil's Keep (E3M8) - Mystic Urn", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 64, 'doom_type': 32, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371524: {'name': "D'Sparil'S Keep (E3M8) - Ring of Invincibility", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371524: {'name': "D'Sparil's Keep (E3M8) - Ring of Invincibility", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 65, 'doom_type': 84, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371525: {'name': "D'Sparil'S Keep (E3M8) - Shadowsphere", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371525: {'name': "D'Sparil's Keep (E3M8) - Shadowsphere", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 66, 'doom_type': 75, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371526: {'name': "D'Sparil'S Keep (E3M8) - Silver Shield", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371526: {'name': "D'Sparil's Keep (E3M8) - Silver Shield", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 67, 'doom_type': 85, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371527: {'name': "D'Sparil'S Keep (E3M8) - Enchanted Shield", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371527: {'name': "D'Sparil's Keep (E3M8) - Enchanted Shield", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 68, 'doom_type': 31, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371528: {'name': "D'Sparil'S Keep (E3M8) - Tome of Power", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371528: {'name': "D'Sparil's Keep (E3M8) - Tome of Power", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': 69, 'doom_type': 86, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371529: {'name': "D'Sparil'S Keep (E3M8) - Tome of Power 2", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371529: {'name': "D'Sparil's Keep (E3M8) - Tome of Power 2", 'episode': 3, 'check_sanity': True, 'map': 8, 'index': 70, 'doom_type': 86, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371530: {'name': "D'Sparil'S Keep (E3M8) - Chaos Device", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371530: {'name': "D'Sparil's Keep (E3M8) - Chaos Device", 'episode': 3, 'check_sanity': True, 'map': 8, 'index': 71, 'doom_type': 36, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371531: {'name': "D'Sparil'S Keep (E3M8) - Tome of Power 3", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371531: {'name': "D'Sparil's Keep (E3M8) - Tome of Power 3", 'episode': 3, 'check_sanity': True, 'map': 8, 'index': 245, 'doom_type': 86, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371532: {'name': "D'Sparil'S Keep (E3M8) - Exit", + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371532: {'name': "D'Sparil's Keep (E3M8) - Exit", 'episode': 3, 'check_sanity': False, 'map': 8, 'index': -1, 'doom_type': -1, - 'region': "D'Sparil'S Keep (E3M8) Main"}, - 371533: {'name': 'The Aquifier (E3M9) - Blue key', + 'region': "D'Sparil's Keep (E3M8) Main"}, + 371533: {'name': 'The Aquifer (E3M9) - Blue key', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 12, 'doom_type': 79, - 'region': "The Aquifier (E3M9) Green"}, - 371534: {'name': 'The Aquifier (E3M9) - Green key', + 'region': "The Aquifer (E3M9) Green"}, + 371534: {'name': 'The Aquifer (E3M9) - Green key', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 13, 'doom_type': 73, - 'region': "The Aquifier (E3M9) Yellow"}, - 371535: {'name': 'The Aquifier (E3M9) - Yellow key', + 'region': "The Aquifer (E3M9) Yellow"}, + 371535: {'name': 'The Aquifer (E3M9) - Yellow key', 'episode': 3, 'check_sanity': True, 'map': 9, 'index': 14, 'doom_type': 80, - 'region': "The Aquifier (E3M9) Main"}, - 371536: {'name': 'The Aquifier (E3M9) - Ethereal Crossbow', + 'region': "The Aquifer (E3M9) Main"}, + 371536: {'name': 'The Aquifer (E3M9) - Ethereal Crossbow', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 141, 'doom_type': 2001, - 'region': "The Aquifier (E3M9) Main"}, - 371537: {'name': 'The Aquifier (E3M9) - Phoenix Rod', + 'region': "The Aquifer (E3M9) Main"}, + 371537: {'name': 'The Aquifer (E3M9) - Phoenix Rod', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 142, 'doom_type': 2003, - 'region': "The Aquifier (E3M9) Yellow"}, - 371538: {'name': 'The Aquifier (E3M9) - Dragon Claw', + 'region': "The Aquifer (E3M9) Yellow"}, + 371538: {'name': 'The Aquifer (E3M9) - Dragon Claw', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 143, 'doom_type': 53, - 'region': "The Aquifier (E3M9) Green"}, - 371539: {'name': 'The Aquifier (E3M9) - Hellstaff', + 'region': "The Aquifer (E3M9) Green"}, + 371539: {'name': 'The Aquifer (E3M9) - Hellstaff', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 144, 'doom_type': 2004, - 'region': "The Aquifier (E3M9) Green"}, - 371540: {'name': 'The Aquifier (E3M9) - Gauntlets of the Necromancer', + 'region': "The Aquifer (E3M9) Green"}, + 371540: {'name': 'The Aquifer (E3M9) - Gauntlets of the Necromancer', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 145, 'doom_type': 2005, - 'region': "The Aquifier (E3M9) Green"}, - 371541: {'name': 'The Aquifier (E3M9) - Ring of Invincibility', + 'region': "The Aquifer (E3M9) Green"}, + 371541: {'name': 'The Aquifer (E3M9) - Ring of Invincibility', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 148, 'doom_type': 84, - 'region': "The Aquifier (E3M9) Yellow"}, - 371542: {'name': 'The Aquifier (E3M9) - Mystic Urn', + 'region': "The Aquifer (E3M9) Yellow"}, + 371542: {'name': 'The Aquifer (E3M9) - Mystic Urn', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 149, 'doom_type': 32, - 'region': "The Aquifier (E3M9) Green"}, - 371543: {'name': 'The Aquifier (E3M9) - Silver Shield', + 'region': "The Aquifer (E3M9) Green"}, + 371543: {'name': 'The Aquifer (E3M9) - Silver Shield', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 151, 'doom_type': 85, - 'region': "The Aquifier (E3M9) Main"}, - 371544: {'name': 'The Aquifier (E3M9) - Tome of Power', + 'region': "The Aquifer (E3M9) Main"}, + 371544: {'name': 'The Aquifer (E3M9) - Tome of Power', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 152, 'doom_type': 86, - 'region': "The Aquifier (E3M9) Main"}, - 371545: {'name': 'The Aquifier (E3M9) - Bag of Holding', + 'region': "The Aquifer (E3M9) Main"}, + 371545: {'name': 'The Aquifer (E3M9) - Bag of Holding', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 153, 'doom_type': 8, - 'region': "The Aquifier (E3M9) Yellow"}, - 371546: {'name': 'The Aquifier (E3M9) - Morph Ovum', + 'region': "The Aquifer (E3M9) Yellow"}, + 371546: {'name': 'The Aquifer (E3M9) - Morph Ovum', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 154, 'doom_type': 30, - 'region': "The Aquifier (E3M9) Green"}, - 371547: {'name': 'The Aquifier (E3M9) - Map Scroll', + 'region': "The Aquifer (E3M9) Green"}, + 371547: {'name': 'The Aquifer (E3M9) - Map Scroll', 'episode': 3, 'check_sanity': True, 'map': 9, 'index': 155, 'doom_type': 35, - 'region': "The Aquifier (E3M9) Green"}, - 371548: {'name': 'The Aquifier (E3M9) - Chaos Device', + 'region': "The Aquifer (E3M9) Green"}, + 371548: {'name': 'The Aquifer (E3M9) - Chaos Device', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 156, 'doom_type': 36, - 'region': "The Aquifier (E3M9) Yellow"}, - 371549: {'name': 'The Aquifier (E3M9) - Enchanted Shield', + 'region': "The Aquifer (E3M9) Yellow"}, + 371549: {'name': 'The Aquifer (E3M9) - Enchanted Shield', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 157, 'doom_type': 31, - 'region': "The Aquifier (E3M9) Green"}, - 371550: {'name': 'The Aquifier (E3M9) - Tome of Power 2', + 'region': "The Aquifer (E3M9) Green"}, + 371550: {'name': 'The Aquifer (E3M9) - Tome of Power 2', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 158, 'doom_type': 86, - 'region': "The Aquifier (E3M9) Green"}, - 371551: {'name': 'The Aquifier (E3M9) - Torch', + 'region': "The Aquifer (E3M9) Green"}, + 371551: {'name': 'The Aquifer (E3M9) - Torch', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 159, 'doom_type': 33, - 'region': "The Aquifier (E3M9) Main"}, - 371552: {'name': 'The Aquifier (E3M9) - Shadowsphere', + 'region': "The Aquifer (E3M9) Main"}, + 371552: {'name': 'The Aquifer (E3M9) - Shadowsphere', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 160, 'doom_type': 75, - 'region': "The Aquifier (E3M9) Green"}, - 371553: {'name': 'The Aquifier (E3M9) - Silver Shield 2', + 'region': "The Aquifer (E3M9) Green"}, + 371553: {'name': 'The Aquifer (E3M9) - Silver Shield 2', 'episode': 3, 'check_sanity': True, 'map': 9, 'index': 374, 'doom_type': 85, - 'region': "The Aquifier (E3M9) Green"}, - 371554: {'name': 'The Aquifier (E3M9) - Firemace', + 'region': "The Aquifer (E3M9) Green"}, + 371554: {'name': 'The Aquifer (E3M9) - Firemace', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 478, 'doom_type': 2002, - 'region': "The Aquifier (E3M9) Green"}, - 371555: {'name': 'The Aquifier (E3M9) - Firemace 2', + 'region': "The Aquifer (E3M9) Green"}, + 371555: {'name': 'The Aquifer (E3M9) - Firemace 2', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 526, 'doom_type': 2002, - 'region': "The Aquifier (E3M9) Green"}, - 371556: {'name': 'The Aquifier (E3M9) - Firemace 3', + 'region': "The Aquifer (E3M9) Green"}, + 371556: {'name': 'The Aquifer (E3M9) - Firemace 3', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': 527, 'doom_type': 2002, - 'region': "The Aquifier (E3M9) Green"}, - 371557: {'name': 'The Aquifier (E3M9) - Firemace 4', + 'region': "The Aquifer (E3M9) Green"}, + 371557: {'name': 'The Aquifer (E3M9) - Firemace 4', 'episode': 3, 'check_sanity': True, 'map': 9, 'index': 528, 'doom_type': 2002, - 'region': "The Aquifier (E3M9) Yellow"}, - 371558: {'name': 'The Aquifier (E3M9) - Exit', + 'region': "The Aquifer (E3M9) Yellow"}, + 371558: {'name': 'The Aquifer (E3M9) - Exit', 'episode': 3, 'check_sanity': False, 'map': 9, 'index': -1, 'doom_type': -1, - 'region': "The Aquifier (E3M9) Blue"}, + 'region': "The Aquifer (E3M9) Blue"}, 371559: {'name': 'Catafalque (E4M1) - Yellow key', 'episode': 4, 'check_sanity': False, @@ -5963,7 +5963,7 @@ class LocationDict(TypedDict, total=False): 'map': 3, 'index': 213, 'doom_type': 2005, - 'region': "Quay (E5M3) Main"}, + 'region': "Quay (E5M3) Blue"}, 371850: {'name': 'Quay (E5M3) - Dragon Claw', 'episode': 5, 'check_sanity': False, @@ -6145,7 +6145,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 3, 'doom_type': 79, - 'region': "Courtyard (E5M4) Main"}, + 'region': "Courtyard (E5M4) Green"}, 371876: {'name': 'Courtyard (E5M4) - Yellow key', 'episode': 5, 'check_sanity': False, @@ -6159,7 +6159,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 21, 'doom_type': 73, - 'region': "Courtyard (E5M4) Kakis"}, + 'region': "Courtyard (E5M4) Yellow"}, 371878: {'name': 'Courtyard (E5M4) - Gauntlets of the Necromancer', 'episode': 5, 'check_sanity': False, @@ -6187,14 +6187,14 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 87, 'doom_type': 2004, - 'region': "Courtyard (E5M4) Kakis"}, + 'region': "Courtyard (E5M4) Yellow"}, 371882: {'name': 'Courtyard (E5M4) - Phoenix Rod', 'episode': 5, 'check_sanity': False, 'map': 4, 'index': 88, 'doom_type': 2003, - 'region': "Courtyard (E5M4) Main"}, + 'region': "Courtyard (E5M4) Green"}, 371883: {'name': 'Courtyard (E5M4) - Morph Ovum', 'episode': 5, 'check_sanity': False, @@ -6229,7 +6229,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 104, 'doom_type': 84, - 'region': "Courtyard (E5M4) Kakis"}, + 'region': "Courtyard (E5M4) Yellow"}, 371888: {'name': 'Courtyard (E5M4) - Shadowsphere', 'episode': 5, 'check_sanity': False, @@ -6250,14 +6250,14 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 107, 'doom_type': 35, - 'region': "Courtyard (E5M4) Kakis"}, + 'region': "Courtyard (E5M4) Yellow"}, 371891: {'name': 'Courtyard (E5M4) - Chaos Device', 'episode': 5, 'check_sanity': False, 'map': 4, 'index': 108, 'doom_type': 36, - 'region': "Courtyard (E5M4) Main"}, + 'region': "Courtyard (E5M4) Green"}, 371892: {'name': 'Courtyard (E5M4) - Tome of Power', 'episode': 5, 'check_sanity': False, @@ -6278,7 +6278,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 111, 'doom_type': 86, - 'region': "Courtyard (E5M4) Kakis"}, + 'region': "Courtyard (E5M4) Yellow"}, 371895: {'name': 'Courtyard (E5M4) - Torch', 'episode': 5, 'check_sanity': False, @@ -6299,7 +6299,7 @@ class LocationDict(TypedDict, total=False): 'map': 4, 'index': 219, 'doom_type': 85, - 'region': "Courtyard (E5M4) Kakis"}, + 'region': "Courtyard (E5M4) Yellow"}, 371898: {'name': 'Courtyard (E5M4) - Bag of Holding 3', 'episode': 5, 'check_sanity': False, @@ -7247,23 +7247,23 @@ class LocationDict(TypedDict, total=False): 'Courtyard (E5M4) - Torch', 'Courtyard (E5M4) - Yellow key', }, - "D'Sparil'S Keep (E3M8)": { - "D'Sparil'S Keep (E3M8) - Bag of Holding", - "D'Sparil'S Keep (E3M8) - Chaos Device", - "D'Sparil'S Keep (E3M8) - Dragon Claw", - "D'Sparil'S Keep (E3M8) - Enchanted Shield", - "D'Sparil'S Keep (E3M8) - Ethereal Crossbow", - "D'Sparil'S Keep (E3M8) - Exit", - "D'Sparil'S Keep (E3M8) - Gauntlets of the Necromancer", - "D'Sparil'S Keep (E3M8) - Hellstaff", - "D'Sparil'S Keep (E3M8) - Mystic Urn", - "D'Sparil'S Keep (E3M8) - Phoenix Rod", - "D'Sparil'S Keep (E3M8) - Ring of Invincibility", - "D'Sparil'S Keep (E3M8) - Shadowsphere", - "D'Sparil'S Keep (E3M8) - Silver Shield", - "D'Sparil'S Keep (E3M8) - Tome of Power", - "D'Sparil'S Keep (E3M8) - Tome of Power 2", - "D'Sparil'S Keep (E3M8) - Tome of Power 3", + "D'Sparil's Keep (E3M8)": { + "D'Sparil's Keep (E3M8) - Bag of Holding", + "D'Sparil's Keep (E3M8) - Chaos Device", + "D'Sparil's Keep (E3M8) - Dragon Claw", + "D'Sparil's Keep (E3M8) - Enchanted Shield", + "D'Sparil's Keep (E3M8) - Ethereal Crossbow", + "D'Sparil's Keep (E3M8) - Exit", + "D'Sparil's Keep (E3M8) - Gauntlets of the Necromancer", + "D'Sparil's Keep (E3M8) - Hellstaff", + "D'Sparil's Keep (E3M8) - Mystic Urn", + "D'Sparil's Keep (E3M8) - Phoenix Rod", + "D'Sparil's Keep (E3M8) - Ring of Invincibility", + "D'Sparil's Keep (E3M8) - Shadowsphere", + "D'Sparil's Keep (E3M8) - Silver Shield", + "D'Sparil's Keep (E3M8) - Tome of Power", + "D'Sparil's Keep (E3M8) - Tome of Power 2", + "D'Sparil's Keep (E3M8) - Tome of Power 3", }, 'Field of Judgement (E5M8)': { 'Field of Judgement (E5M8) - Bag of Holding', @@ -7641,33 +7641,33 @@ class LocationDict(TypedDict, total=False): "Skein of D'Sparil (E5M9) - Torch", "Skein of D'Sparil (E5M9) - Yellow key", }, - 'The Aquifier (E3M9)': { - 'The Aquifier (E3M9) - Bag of Holding', - 'The Aquifier (E3M9) - Blue key', - 'The Aquifier (E3M9) - Chaos Device', - 'The Aquifier (E3M9) - Dragon Claw', - 'The Aquifier (E3M9) - Enchanted Shield', - 'The Aquifier (E3M9) - Ethereal Crossbow', - 'The Aquifier (E3M9) - Exit', - 'The Aquifier (E3M9) - Firemace', - 'The Aquifier (E3M9) - Firemace 2', - 'The Aquifier (E3M9) - Firemace 3', - 'The Aquifier (E3M9) - Firemace 4', - 'The Aquifier (E3M9) - Gauntlets of the Necromancer', - 'The Aquifier (E3M9) - Green key', - 'The Aquifier (E3M9) - Hellstaff', - 'The Aquifier (E3M9) - Map Scroll', - 'The Aquifier (E3M9) - Morph Ovum', - 'The Aquifier (E3M9) - Mystic Urn', - 'The Aquifier (E3M9) - Phoenix Rod', - 'The Aquifier (E3M9) - Ring of Invincibility', - 'The Aquifier (E3M9) - Shadowsphere', - 'The Aquifier (E3M9) - Silver Shield', - 'The Aquifier (E3M9) - Silver Shield 2', - 'The Aquifier (E3M9) - Tome of Power', - 'The Aquifier (E3M9) - Tome of Power 2', - 'The Aquifier (E3M9) - Torch', - 'The Aquifier (E3M9) - Yellow key', + 'The Aquifer (E3M9)': { + 'The Aquifer (E3M9) - Bag of Holding', + 'The Aquifer (E3M9) - Blue key', + 'The Aquifer (E3M9) - Chaos Device', + 'The Aquifer (E3M9) - Dragon Claw', + 'The Aquifer (E3M9) - Enchanted Shield', + 'The Aquifer (E3M9) - Ethereal Crossbow', + 'The Aquifer (E3M9) - Exit', + 'The Aquifer (E3M9) - Firemace', + 'The Aquifer (E3M9) - Firemace 2', + 'The Aquifer (E3M9) - Firemace 3', + 'The Aquifer (E3M9) - Firemace 4', + 'The Aquifer (E3M9) - Gauntlets of the Necromancer', + 'The Aquifer (E3M9) - Green key', + 'The Aquifer (E3M9) - Hellstaff', + 'The Aquifer (E3M9) - Map Scroll', + 'The Aquifer (E3M9) - Morph Ovum', + 'The Aquifer (E3M9) - Mystic Urn', + 'The Aquifer (E3M9) - Phoenix Rod', + 'The Aquifer (E3M9) - Ring of Invincibility', + 'The Aquifer (E3M9) - Shadowsphere', + 'The Aquifer (E3M9) - Silver Shield', + 'The Aquifer (E3M9) - Silver Shield 2', + 'The Aquifer (E3M9) - Tome of Power', + 'The Aquifer (E3M9) - Tome of Power 2', + 'The Aquifer (E3M9) - Torch', + 'The Aquifer (E3M9) - Yellow key', }, 'The Azure Fortress (E3M4)': { 'The Azure Fortress (E3M4) - Bag of Holding', diff --git a/worlds/heretic/Maps.py b/worlds/heretic/Maps.py index 716de2904144..6e9b3df24665 100644 --- a/worlds/heretic/Maps.py +++ b/worlds/heretic/Maps.py @@ -29,8 +29,8 @@ 'The Ophidian Lair (E3M5)', 'The Halls of Fear (E3M6)', 'The Chasm (E3M7)', - "D'Sparil'S Keep (E3M8)", - 'The Aquifier (E3M9)', + "D'Sparil's Keep (E3M8)", + 'The Aquifer (E3M9)', 'Catafalque (E4M1)', 'Blockhouse (E4M2)', 'Ambulatory (E4M3)', diff --git a/worlds/heretic/Regions.py b/worlds/heretic/Regions.py index 81a4c9ce49dc..1d35db5e7a9d 100644 --- a/worlds/heretic/Regions.py +++ b/worlds/heretic/Regions.py @@ -520,34 +520,34 @@ class RegionDict(TypedDict, total=False): "episode":3, "connections":[{"target":"The Chasm (E3M7) Yellow","pro":False}]}, - # D'Sparil'S Keep (E3M8) - {"name":"D'Sparil'S Keep (E3M8) Main", + # D'Sparil's Keep (E3M8) + {"name":"D'Sparil's Keep (E3M8) Main", "connects_to_hub":True, "episode":3, "connections":[]}, - # The Aquifier (E3M9) - {"name":"The Aquifier (E3M9) Main", + # The Aquifer (E3M9) + {"name":"The Aquifer (E3M9) Main", "connects_to_hub":True, "episode":3, - "connections":[{"target":"The Aquifier (E3M9) Yellow","pro":False}]}, - {"name":"The Aquifier (E3M9) Blue", + "connections":[{"target":"The Aquifer (E3M9) Yellow","pro":False}]}, + {"name":"The Aquifer (E3M9) Blue", "connects_to_hub":False, "episode":3, "connections":[]}, - {"name":"The Aquifier (E3M9) Yellow", + {"name":"The Aquifer (E3M9) Yellow", "connects_to_hub":False, "episode":3, "connections":[ - {"target":"The Aquifier (E3M9) Green","pro":False}, - {"target":"The Aquifier (E3M9) Main","pro":False}]}, - {"name":"The Aquifier (E3M9) Green", + {"target":"The Aquifer (E3M9) Green","pro":False}, + {"target":"The Aquifer (E3M9) Main","pro":False}]}, + {"name":"The Aquifer (E3M9) Green", "connects_to_hub":False, "episode":3, "connections":[ - {"target":"The Aquifier (E3M9) Yellow","pro":False}, - {"target":"The Aquifier (E3M9) Main","pro":False}, - {"target":"The Aquifier (E3M9) Blue","pro":False}]}, + {"target":"The Aquifer (E3M9) Yellow","pro":False}, + {"target":"The Aquifer (E3M9) Main","pro":False}, + {"target":"The Aquifer (E3M9) Blue","pro":False}]}, # Catafalque (E4M1) {"name":"Catafalque (E4M1) Main", @@ -795,16 +795,22 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":True, "episode":5, "connections":[ - {"target":"Courtyard (E5M4) Kakis","pro":False}, + {"target":"Courtyard (E5M4) Yellow","pro":False}, {"target":"Courtyard (E5M4) Blue","pro":False}]}, {"name":"Courtyard (E5M4) Blue", "connects_to_hub":False, "episode":5, "connections":[{"target":"Courtyard (E5M4) Main","pro":False}]}, - {"name":"Courtyard (E5M4) Kakis", + {"name":"Courtyard (E5M4) Yellow", "connects_to_hub":False, "episode":5, - "connections":[{"target":"Courtyard (E5M4) Main","pro":False}]}, + "connections":[ + {"target":"Courtyard (E5M4) Main","pro":False}, + {"target":"Courtyard (E5M4) Green","pro":False}]}, + {"name":"Courtyard (E5M4) Green", + "connects_to_hub":False, + "episode":5, + "connections":[{"target":"Courtyard (E5M4) Yellow","pro":False}]}, # Hydratyr (E5M5) {"name":"Hydratyr (E5M5) Main", diff --git a/worlds/heretic/Rules.py b/worlds/heretic/Rules.py index 579fd8b77179..241527d3096a 100644 --- a/worlds/heretic/Rules.py +++ b/worlds/heretic/Rules.py @@ -388,9 +388,9 @@ def set_episode3_rules(player, multiworld, pro): 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(multiworld.get_entrance("Hub -> D'Sparil'S Keep (E3M8) Main", player), lambda state: - state.has("D'Sparil'S Keep (E3M8)", player, 1) and + # D'Sparil's Keep (E3M8) + 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 state.has("Dragon Claw", player, 1) and @@ -398,23 +398,23 @@ def set_episode3_rules(player, multiworld, pro): state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1)) - # The Aquifier (E3M9) - set_rule(multiworld.get_entrance("Hub -> The Aquifier (E3M9) Main", player), lambda state: - state.has("The Aquifier (E3M9)", player, 1) and + # The Aquifer (E3M9) + set_rule(multiworld.get_entrance("Hub -> The Aquifer (E3M9) Main", player), lambda state: + state.has("The Aquifer (E3M9)", 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) and state.has("Phoenix Rod", player, 1) and state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1)) - 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(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(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(multiworld.get_entrance("The Aquifier (E3M9) Green -> The Aquifier (E3M9) Yellow", player), lambda state: - state.has("The Aquifier (E3M9) - Green key", player, 1)) + set_rule(multiworld.get_entrance("The Aquifer (E3M9) Main -> The Aquifer (E3M9) Yellow", player), lambda state: + state.has("The Aquifer (E3M9) - Yellow key", player, 1)) + set_rule(multiworld.get_entrance("The Aquifer (E3M9) Yellow -> The Aquifer (E3M9) Green", player), lambda state: + state.has("The Aquifer (E3M9) - Green key", player, 1)) + set_rule(multiworld.get_entrance("The Aquifer (E3M9) Yellow -> The Aquifer (E3M9) Main", player), lambda state: + state.has("The Aquifer (E3M9) - Yellow key", player, 1)) + set_rule(multiworld.get_entrance("The Aquifer (E3M9) Green -> The Aquifer (E3M9) Yellow", player), lambda state: + state.has("The Aquifer (E3M9) - Green key", player, 1)) def set_episode4_rules(player, multiworld, pro): @@ -623,15 +623,17 @@ def set_episode5_rules(player, multiworld, pro): (state.has("Phoenix Rod", player, 1) or state.has("Firemace", player, 1) or state.has("Hellstaff", player, 1))) - 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(multiworld.get_entrance("Courtyard (E5M4) Main -> Courtyard (E5M4) Yellow", player), lambda state: + state.has("Courtyard (E5M4) - Yellow key", player, 1)) set_rule(multiworld.get_entrance("Courtyard (E5M4) Main -> Courtyard (E5M4) Blue", player), lambda state: state.has("Courtyard (E5M4) - Blue key", player, 1)) set_rule(multiworld.get_entrance("Courtyard (E5M4) Blue -> Courtyard (E5M4) Main", player), lambda state: state.has("Courtyard (E5M4) - Blue key", player, 1)) - set_rule(multiworld.get_entrance("Courtyard (E5M4) Kakis -> Courtyard (E5M4) Main", player), lambda state: - state.has("Courtyard (E5M4) - Yellow key", player, 1) or + set_rule(multiworld.get_entrance("Courtyard (E5M4) Yellow -> Courtyard (E5M4) Main", player), lambda state: + state.has("Courtyard (E5M4) - Yellow key", player, 1)) + set_rule(multiworld.get_entrance("Courtyard (E5M4) Yellow -> Courtyard (E5M4) Green", player), lambda state: + state.has("Courtyard (E5M4) - Green key", player, 1)) + set_rule(multiworld.get_entrance("Courtyard (E5M4) Green -> Courtyard (E5M4) Yellow", player), lambda state: state.has("Courtyard (E5M4) - Green key", player, 1)) # Hydratyr (E5M5) From 69b50792098a8163ec4e478685a700fa823094d3 Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Fri, 21 Feb 2025 16:52:12 -0800 Subject: [PATCH 2/3] id Tech 1: Add special cases for some problematic solo episodes --- worlds/doom_1993/__init__.py | 34 ++++++++++++++++++++++------------ worlds/doom_ii/__init__.py | 26 +++++++++++++++++--------- worlds/heretic/__init__.py | 32 ++++++++++++++++++++------------ 3 files changed, 59 insertions(+), 33 deletions(-) diff --git a/worlds/doom_1993/__init__.py b/worlds/doom_1993/__init__.py index b6138ae07103..d4189464e07d 100644 --- a/worlds/doom_1993/__init__.py +++ b/worlds/doom_1993/__init__.py @@ -50,14 +50,14 @@ class DOOM1993World(World): location_name_to_id = {data["name"]: loc_id for loc_id, data in Locations.location_table.items()} location_name_groups = Locations.location_name_groups - starting_level_for_episode: List[str] = [ - "Hangar (E1M1)", - "Deimos Anomaly (E2M1)", - "Hell Keep (E3M1)", - "Hell Beneath (E4M1)" - ] + starting_level_for_episode: Dict[int, str] = { + 1: "Hangar (E1M1)", + 2: "Deimos Anomaly (E2M1)", + 3: "Hell Keep (E3M1)", + 4: "Hell Beneath (E4M1)" + } - boss_level_for_espidoes: List[str] = [ + boss_level_for_episode: List[str] = [ "Phobos Anomaly (E1M8)", "Tower of Babel (E2M8)", "Dis (E3M8)", @@ -82,6 +82,7 @@ class DOOM1993World(World): def __init__(self, multiworld: MultiWorld, player: int): self.included_episodes = [1, 1, 1, 0] self.location_count = 0 + self.starting_levels = [] super().__init__(multiworld, player) @@ -99,6 +100,16 @@ def generate_early(self): if self.get_episode_count() == 0: self.included_episodes[0] = 1 + self.starting_levels = [level_name for (episode, level_name) in self.starting_level_for_episode.items() + if self.included_episodes[episode - 1]] + + # Solo Episode 3 presents a problem, because Hell Keep has only two locations. + # We have to give the player Slough of Despair (E3M2), and also mark a weapon early. + if self.get_episode_count() == 1 and self.included_episodes[2]: + early_weapon = self.random.choice(["Shotgun", "Chaingun"]) + self.multiworld.early_items[self.player][early_weapon] = 1 + self.starting_levels.append("Slough of Despair (E3M2)") + def create_regions(self): pro = self.options.pro.value @@ -152,7 +163,7 @@ def create_regions(self): def completion_rule(self, state: CollectionState): goal_levels = Maps.map_names if self.options.goal.value: - goal_levels = self.boss_level_for_espidoes + goal_levels = self.boss_level_for_episode for map_name in goal_levels: if map_name + " - Exit" not in self.location_name_to_id: @@ -201,7 +212,7 @@ def create_items(self): if item["episode"] != -1 and not self.included_episodes[item["episode"] - 1]: continue - count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 + count = item["count"] if item["name"] not in self.starting_levels else item["count"] - 1 itempool += [self.create_item(item["name"]) for _ in range(count)] # Place end level items in locked locations @@ -223,9 +234,8 @@ def create_items(self): self.location_count -= 1 # Give starting levels right away - for i in range(len(self.included_episodes)): - if self.included_episodes[i]: - self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i])) + for map_name in self.starting_levels: + self.multiworld.push_precollected(self.create_item(map_name)) # Give Computer area maps if option selected if self.options.start_with_computer_area_maps.value: diff --git a/worlds/doom_ii/__init__.py b/worlds/doom_ii/__init__.py index 32c3cbd5a2c1..afc573fbdbd2 100644 --- a/worlds/doom_ii/__init__.py +++ b/worlds/doom_ii/__init__.py @@ -51,11 +51,11 @@ class DOOM2World(World): location_name_to_id = {data["name"]: loc_id for loc_id, data in Locations.location_table.items()} location_name_groups = Locations.location_name_groups - starting_level_for_episode: List[str] = [ - "Entryway (MAP01)", - "The Factory (MAP12)", - "Nirvana (MAP21)" - ] + starting_level_for_episode: Dict[int, str] = { + 1: "Entryway (MAP01)", + 2: "The Factory (MAP12)", + 3: "Nirvana (MAP21)" + } # Item ratio that scales depending on episode count. These are the ratio for 3 episode. In DOOM1. # The ratio have been tweaked seem, and feel good. @@ -77,6 +77,7 @@ class DOOM2World(World): def __init__(self, multiworld: MultiWorld, player: int): self.included_episodes = [1, 1, 1, 0] self.location_count = 0 + self.starting_levels = [] super().__init__(multiworld, player) @@ -95,6 +96,14 @@ def generate_early(self): if self.get_episode_count() == 0: self.included_episodes[0] = 1 + self.starting_levels = [level_name for (episode, level_name) in self.starting_level_for_episode.items() + if self.included_episodes[episode - 1]] + + # If soloing MAP21-MAP30, we need to mark a weapon as early to help generation succeed + if self.get_episode_count() == 1 and self.included_episodes[2]: + early_weapon = self.random.choice(["Super Shotgun", "Plasma gun"]) + self.multiworld.early_items[self.player][early_weapon] = 1 + def create_regions(self): pro = self.options.pro.value @@ -193,7 +202,7 @@ def create_items(self): if item["episode"] != -1 and not self.included_episodes[item["episode"] - 1]: continue - count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 + count = item["count"] if item["name"] not in self.starting_levels else item["count"] - 1 itempool += [self.create_item(item["name"]) for _ in range(count)] # Place end level items in locked locations @@ -215,9 +224,8 @@ def create_items(self): self.location_count -= 1 # Give starting levels right away - for i in range(len(self.starting_level_for_episode)): - if self.included_episodes[i]: - self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i])) + for map_name in self.starting_levels: + self.multiworld.push_precollected(self.create_item(map_name)) # Give Computer area maps if option selected if start_with_computer_area_maps: diff --git a/worlds/heretic/__init__.py b/worlds/heretic/__init__.py index bc0a54698a59..0af17b4cd78d 100644 --- a/worlds/heretic/__init__.py +++ b/worlds/heretic/__init__.py @@ -49,18 +49,18 @@ class HereticWorld(World): location_name_to_id = {data["name"]: loc_id for loc_id, data in Locations.location_table.items()} location_name_groups = Locations.location_name_groups - starting_level_for_episode: List[str] = [ - "The Docks (E1M1)", - "The Crater (E2M1)", - "The Storehouse (E3M1)", - "Catafalque (E4M1)", - "Ochre Cliffs (E5M1)" - ] + starting_level_for_episode: Dict[int, str] = { + 1: "The Docks (E1M1)", + 2: "The Crater (E2M1)", + 3: "The Storehouse (E3M1)", + 4: "Catafalque (E4M1)", + 5: "Ochre Cliffs (E5M1)" + } boss_level_for_episode: List[str] = [ "Hell's Maw (E1M8)", "The Portals of Chaos (E2M8)", - "D'Sparil'S Keep (E3M8)", + "D'Sparil's Keep (E3M8)", "Shattered Bridge (E4M8)", "Field of Judgement (E5M8)" ] @@ -82,6 +82,7 @@ class HereticWorld(World): def __init__(self, multiworld: MultiWorld, player: int): self.included_episodes = [1, 1, 1, 0, 0] self.location_count = 0 + self.starting_levels = [] super().__init__(multiworld, player) @@ -100,6 +101,14 @@ def generate_early(self): if self.get_episode_count() == 0: self.included_episodes[0] = 1 + self.starting_levels = [level_name for (episode, level_name) in self.starting_level_for_episode.items() + if self.included_episodes[episode - 1]] + + # For Solo Episode 1, place the Yellow Key for E1M1 early. + # Gives the generator five potential placements (plus the forced key) instead of only two. + if self.get_episode_count() == 1 and self.included_episodes[0]: + self.multiworld.early_items[self.player]["The Docks (E1M1) - Yellow key"] = 1 + def create_regions(self): pro = self.options.pro.value check_sanity = self.options.check_sanity.value @@ -203,7 +212,7 @@ def create_items(self): if item["episode"] != -1 and not self.included_episodes[item["episode"] - 1]: continue - count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 + count = item["count"] if item["name"] not in self.starting_levels else item["count"] - 1 itempool += [self.create_item(item["name"]) for _ in range(count)] # Place end level items in locked locations @@ -225,9 +234,8 @@ def create_items(self): self.location_count -= 1 # Give starting levels right away - for i in range(len(self.included_episodes)): - if self.included_episodes[i]: - self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i])) + for map_name in self.starting_levels: + self.multiworld.push_precollected(self.create_item(map_name)) # Give Computer area maps if option selected if self.options.start_with_map_scrolls.value: From 530ce611409ff355db6b01ddfb6eb131d968d3d8 Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Fri, 21 Feb 2025 19:32:01 -0800 Subject: [PATCH 3/3] Add redundant connections to nominally pro-only regions --- worlds/doom_ii/Regions.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/worlds/doom_ii/Regions.py b/worlds/doom_ii/Regions.py index 855740dac4d9..d953da01cb43 100644 --- a/worlds/doom_ii/Regions.py +++ b/worlds/doom_ii/Regions.py @@ -338,7 +338,9 @@ class RegionDict(TypedDict, total=False): {"name":"Suburbs (MAP16) Red", "connects_to_hub":False, "episode":2, - "connections":[{"target":"Suburbs (MAP16) Main","pro":False}]}, + "connections":[ + {"target":"Suburbs (MAP16) Main","pro":False}, + {"target":"Suburbs (MAP16) Pro Exit","pro":False}]}, {"name":"Suburbs (MAP16) Pro Exit", "connects_to_hub":False, "episode":2, @@ -414,7 +416,9 @@ class RegionDict(TypedDict, total=False): {"name":"Nirvana (MAP21) Magenta", "connects_to_hub":False, "episode":3, - "connections":[{"target":"Nirvana (MAP21) Yellow","pro":False}]}, + "connections":[ + {"target":"Nirvana (MAP21) Yellow","pro":False}, + {"target":"Nirvana (MAP21) Pro Magenta","pro":False}]}, {"name":"Nirvana (MAP21) Start", "connects_to_hub":True, "episode":3, @@ -471,7 +475,8 @@ class RegionDict(TypedDict, total=False): "episode":3, "connections":[ {"target":"The Chasm (MAP24) Red","pro":False}, - {"target":"The Chasm (MAP24) Main","pro":False}]}, + {"target":"The Chasm (MAP24) Main","pro":False}, + {"target":"The Chasm (MAP24) Blue Pro","pro":False}]}, {"name":"The Chasm (MAP24) Blue Pro", "connects_to_hub":False, "episode":3,