DOOM 1993: Better region logics/rules, balancing, level exits (#1973)

This commit is contained in:
David St-Louis 2023-07-21 20:22:24 -04:00 committed by GitHub
parent 21228f9c63
commit 8015734fcf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 1083 additions and 349 deletions

View File

@ -1,34 +0,0 @@
# This file is auto generated. More info: https://github.com/Daivuk/apdoom
from typing import List
events: List[str] = [
'Hangar (E1M1) - Complete',
'Nuclear Plant (E1M2) - Complete',
'Toxin Refinery (E1M3) - Complete',
'Command Control (E1M4) - Complete',
'Phobos Lab (E1M5) - Complete',
'Central Processing (E1M6) - Complete',
'Computer Station (E1M7) - Complete',
'Phobos Anomaly (E1M8) - Complete',
'Military Base (E1M9) - Complete',
'Deimos Anomaly (E2M1) - Complete',
'Containment Area (E2M2) - Complete',
'Refinery (E2M3) - Complete',
'Deimos Lab (E2M4) - Complete',
'Command Center (E2M5) - Complete',
'Halls of the Damned (E2M6) - Complete',
'Spawning Vats (E2M7) - Complete',
'Tower of Babel (E2M8) - Complete',
'Fortress of Mystery (E2M9) - Complete',
'Hell Keep (E3M1) - Complete',
'Slough of Despair (E3M2) - Complete',
'Pandemonium (E3M3) - Complete',
'House of Pain (E3M4) - Complete',
'Unholy Cathedral (E3M5) - Complete',
'Mt. Erebus (E3M6) - Complete',
'Limbo (E3M7) - Complete',
'Dis (E3M8) - Complete',
'Warrens (E3M9) - Complete',
]

View File

@ -8,7 +8,7 @@ class ItemDict(TypedDict, total=False):
classification: ItemClassification
count: int
name: str
doom_type: int # Unique numerical id used to spawn the item.
doom_type: int # Unique numerical id used to spawn the item. -1 is level item, -2 is level complete item.
episode: int # Relevant if that item targets a specific level, like keycard or map reveal pickup.
map: int
@ -722,6 +722,168 @@ item_table: Dict[int, ItemDict] = {
'doom_type': 17,
'episode': -1,
'map': -1},
350118: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Hangar (E1M1) - Complete',
'doom_type': -2,
'episode': 1,
'map': 1},
350119: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Nuclear Plant (E1M2) - Complete',
'doom_type': -2,
'episode': 1,
'map': 2},
350120: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Toxin Refinery (E1M3) - Complete',
'doom_type': -2,
'episode': 1,
'map': 3},
350121: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Command Control (E1M4) - Complete',
'doom_type': -2,
'episode': 1,
'map': 4},
350122: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Phobos Lab (E1M5) - Complete',
'doom_type': -2,
'episode': 1,
'map': 5},
350123: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Central Processing (E1M6) - Complete',
'doom_type': -2,
'episode': 1,
'map': 6},
350124: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Computer Station (E1M7) - Complete',
'doom_type': -2,
'episode': 1,
'map': 7},
350125: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Phobos Anomaly (E1M8) - Complete',
'doom_type': -2,
'episode': 1,
'map': 8},
350126: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Military Base (E1M9) - Complete',
'doom_type': -2,
'episode': 1,
'map': 9},
350127: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Anomaly (E2M1) - Complete',
'doom_type': -2,
'episode': 2,
'map': 1},
350128: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Containment Area (E2M2) - Complete',
'doom_type': -2,
'episode': 2,
'map': 2},
350129: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Refinery (E2M3) - Complete',
'doom_type': -2,
'episode': 2,
'map': 3},
350130: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Lab (E2M4) - Complete',
'doom_type': -2,
'episode': 2,
'map': 4},
350131: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Command Center (E2M5) - Complete',
'doom_type': -2,
'episode': 2,
'map': 5},
350132: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Halls of the Damned (E2M6) - Complete',
'doom_type': -2,
'episode': 2,
'map': 6},
350133: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Spawning Vats (E2M7) - Complete',
'doom_type': -2,
'episode': 2,
'map': 7},
350134: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Tower of Babel (E2M8) - Complete',
'doom_type': -2,
'episode': 2,
'map': 8},
350135: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Fortress of Mystery (E2M9) - Complete',
'doom_type': -2,
'episode': 2,
'map': 9},
350136: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Hell Keep (E3M1) - Complete',
'doom_type': -2,
'episode': 3,
'map': 1},
350137: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Slough of Despair (E3M2) - Complete',
'doom_type': -2,
'episode': 3,
'map': 2},
350138: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Pandemonium (E3M3) - Complete',
'doom_type': -2,
'episode': 3,
'map': 3},
350139: {'classification': ItemClassification.progression,
'count': 1,
'name': 'House of Pain (E3M4) - Complete',
'doom_type': -2,
'episode': 3,
'map': 4},
350140: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Unholy Cathedral (E3M5) - Complete',
'doom_type': -2,
'episode': 3,
'map': 5},
350141: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Mt. Erebus (E3M6) - Complete',
'doom_type': -2,
'episode': 3,
'map': 6},
350142: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Limbo (E3M7) - Complete',
'doom_type': -2,
'episode': 3,
'map': 7},
350143: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Dis (E3M8) - Complete',
'doom_type': -2,
'episode': 3,
'map': 8},
350144: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Warrens (E3M9) - Complete',
'doom_type': -2,
'episode': 3,
'map': 9},
}

View File

@ -198,13 +198,13 @@ location_table: Dict[int, LocationDict] = {
'map': 4,
'index': 39,
'doom_type': 2018,
'region': "Command Control (E1M4) Blue Yellow"},
'region': "Command Control (E1M4) Blue"},
351031: {'name': 'Command Control (E1M4) - Yellow keycard',
'episode': 1,
'map': 4,
'index': 61,
'doom_type': 6,
'region': "Command Control (E1M4) Blue Yellow"},
'region': "Command Control (E1M4) Blue"},
351032: {'name': 'Command Control (E1M4) - Blue keycard',
'episode': 1,
'map': 4,
@ -228,7 +228,7 @@ location_table: Dict[int, LocationDict] = {
'map': 4,
'index': 100,
'doom_type': 2019,
'region': "Command Control (E1M4) Blue Yellow"},
'region': "Command Control (E1M4) Main"},
351036: {'name': 'Command Control (E1M4) - Backpack',
'episode': 1,
'map': 4,
@ -246,7 +246,7 @@ location_table: Dict[int, LocationDict] = {
'map': 5,
'index': 4,
'doom_type': 5,
'region': "Phobos Lab (E1M5) Yellow"},
'region': "Phobos Lab (E1M5) Green"},
351039: {'name': 'Phobos Lab (E1M5) - Yellow keycard',
'episode': 1,
'map': 5,
@ -294,19 +294,19 @@ location_table: Dict[int, LocationDict] = {
'map': 5,
'index': 173,
'doom_type': 2002,
'region': "Phobos Lab (E1M5) Yellow"},
'region': "Phobos Lab (E1M5) Green"},
351047: {'name': 'Phobos Lab (E1M5) - Backpack',
'episode': 1,
'map': 5,
'index': 174,
'doom_type': 8,
'region': "Phobos Lab (E1M5) Yellow"},
'region': "Phobos Lab (E1M5) Green"},
351048: {'name': 'Phobos Lab (E1M5) - Computer area map',
'episode': 1,
'map': 5,
'index': 176,
'doom_type': 2026,
'region': "Phobos Lab (E1M5) Yellow"},
'region': "Phobos Lab (E1M5) Green"},
351049: {'name': 'Phobos Lab (E1M5) - Mega Armor 2',
'episode': 1,
'map': 5,
@ -330,7 +330,7 @@ location_table: Dict[int, LocationDict] = {
'map': 5,
'index': 280,
'doom_type': 2018,
'region': "Phobos Lab (E1M5) Yellow"},
'region': "Phobos Lab (E1M5) Green"},
351053: {'name': 'Phobos Lab (E1M5) - Partial invisibility',
'episode': 1,
'map': 5,
@ -432,7 +432,7 @@ location_table: Dict[int, LocationDict] = {
'map': 6,
'index': 291,
'doom_type': 2018,
'region': "Central Processing (E1M6) Blue Yellow"},
'region': "Central Processing (E1M6) Yellow"},
351070: {'name': 'Central Processing (E1M6) - Armor 4',
'episode': 1,
'map': 6,
@ -444,13 +444,13 @@ location_table: Dict[int, LocationDict] = {
'map': 6,
'index': 392,
'doom_type': 2013,
'region': "Central Processing (E1M6) Blue"},
'region': "Central Processing (E1M6) Nukage"},
351072: {'name': 'Central Processing (E1M6) - Backpack 3',
'episode': 1,
'map': 6,
'index': 395,
'doom_type': 8,
'region': "Central Processing (E1M6) Blue"},
'region': "Central Processing (E1M6) Nukage"},
351073: {'name': 'Computer Station (E1M7) - Chaingun',
'episode': 1,
'map': 7,
@ -540,7 +540,7 @@ location_table: Dict[int, LocationDict] = {
'map': 7,
'index': 337,
'doom_type': 2024,
'region': "Computer Station (E1M7) Yellow Red"},
'region': "Computer Station (E1M7) Courtyard"},
351088: {'name': 'Phobos Anomaly (E1M8) - Supercharge',
'episode': 1,
'map': 8,
@ -906,7 +906,7 @@ location_table: Dict[int, LocationDict] = {
'map': 4,
'index': 107,
'doom_type': 2013,
'region': "Deimos Lab (E2M4) Blue Yellow"},
'region': "Deimos Lab (E2M4) Yellow"},
351149: {'name': 'Deimos Lab (E2M4) - Shotgun',
'episode': 2,
'map': 4,
@ -918,13 +918,13 @@ location_table: Dict[int, LocationDict] = {
'map': 4,
'index': 129,
'doom_type': 2019,
'region': "Deimos Lab (E2M4) Blue Yellow"},
'region': "Deimos Lab (E2M4) Yellow"},
351151: {'name': 'Deimos Lab (E2M4) - Plasma gun',
'episode': 2,
'map': 4,
'index': 130,
'doom_type': 2004,
'region': "Deimos Lab (E2M4) Blue Yellow"},
'region': "Deimos Lab (E2M4) Yellow"},
351152: {'name': 'Deimos Lab (E2M4) - Backpack',
'episode': 2,
'map': 4,
@ -1068,7 +1068,7 @@ location_table: Dict[int, LocationDict] = {
'map': 6,
'index': 125,
'doom_type': 39,
'region': "Halls of the Damned (E2M6) Main"},
'region': "Halls of the Damned (E2M6) One way Yellow"},
351176: {'name': 'Halls of the Damned (E2M6) - Supercharge',
'episode': 2,
'map': 6,
@ -1092,7 +1092,7 @@ location_table: Dict[int, LocationDict] = {
'map': 6,
'index': 217,
'doom_type': 2024,
'region': "Halls of the Damned (E2M6) Main"},
'region': "Halls of the Damned (E2M6) One way Yellow"},
351180: {'name': 'Halls of the Damned (E2M6) - Red skull key',
'episode': 2,
'map': 6,
@ -1200,7 +1200,7 @@ location_table: Dict[int, LocationDict] = {
'map': 7,
'index': 199,
'doom_type': 2013,
'region': "Spawning Vats (E2M7) Blue Red"},
'region': "Spawning Vats (E2M7) Entrance Secret"},
351198: {'name': 'Spawning Vats (E2M7) - Invulnerability 2',
'episode': 2,
'map': 7,
@ -1524,19 +1524,19 @@ location_table: Dict[int, LocationDict] = {
'map': 4,
'index': 134,
'doom_type': 38,
'region': "House of Pain (E3M4) Blue Yellow"},
'region': "House of Pain (E3M4) Yellow"},
351252: {'name': 'House of Pain (E3M4) - Backpack',
'episode': 3,
'map': 4,
'index': 160,
'doom_type': 8,
'region': "House of Pain (E3M4) Blue Red"},
'region': "House of Pain (E3M4) Red"},
351253: {'name': 'House of Pain (E3M4) - Mega Armor 2',
'episode': 3,
'map': 4,
'index': 170,
'doom_type': 2019,
'region': "House of Pain (E3M4) Blue Red"},
'region': "House of Pain (E3M4) Red"},
351254: {'name': 'House of Pain (E3M4) - Partial invisibility',
'episode': 3,
'map': 4,
@ -1854,253 +1854,253 @@ location_table: Dict[int, LocationDict] = {
'map': 9,
'index': 46,
'doom_type': 2003,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351307: {'name': 'Warrens (E3M9) - Rocket launcher 2',
'episode': 3,
'map': 9,
'index': 99,
'doom_type': 2003,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351308: {'name': 'Warrens (E3M9) - Supercharge',
'episode': 3,
'map': 9,
'index': 101,
'doom_type': 2013,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351309: {'name': 'Warrens (E3M9) - Blue skull key',
'episode': 3,
'map': 9,
'index': 108,
'doom_type': 40,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351310: {'name': 'Warrens (E3M9) - Berserk',
'episode': 3,
'map': 9,
'index': 114,
'doom_type': 2023,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351311: {'name': 'Warrens (E3M9) - Invulnerability',
'episode': 3,
'map': 9,
'index': 120,
'doom_type': 2022,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351312: {'name': 'Warrens (E3M9) - Partial invisibility',
'episode': 3,
'map': 9,
'index': 121,
'doom_type': 2024,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351313: {'name': 'Warrens (E3M9) - Chaingun',
'episode': 3,
'map': 9,
'index': 122,
'doom_type': 2002,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue"},
351314: {'name': 'Warrens (E3M9) - Plasma gun',
'episode': 3,
'map': 9,
'index': 135,
'doom_type': 2004,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue trigger"},
351315: {'name': 'Warrens (E3M9) - Invulnerability 2',
'episode': 3,
'map': 9,
'index': 138,
'doom_type': 2022,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue trigger"},
351316: {'name': 'Warrens (E3M9) - Armor',
'episode': 3,
'map': 9,
'index': 139,
'doom_type': 2018,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue trigger"},
351317: {'name': 'Warrens (E3M9) - Chainsaw',
'episode': 3,
'map': 9,
'index': 140,
'doom_type': 2005,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue trigger"},
351318: {'name': 'Warrens (E3M9) - BFG9000',
'episode': 3,
'map': 9,
'index': 141,
'doom_type': 2006,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue trigger"},
351319: {'name': 'Warrens (E3M9) - Red skull key',
'episode': 3,
'map': 9,
'index': 143,
'doom_type': 38,
'region': "Warrens (E3M9) Main"},
'region': "Warrens (E3M9) Blue trigger"},
351320: {'name': 'Warrens (E3M9) - Supercharge 2',
'episode': 3,
'map': 9,
'index': 188,
'doom_type': 2013,
'region': "Warrens (E3M9) Main"},
351321: {'name': 'Central Processing (E1M6) - Complete',
'region': "Warrens (E3M9) Blue trigger"},
351321: {'name': 'Central Processing (E1M6) - Exit',
'episode': 1,
'map': 6,
'index': -1,
'doom_type': -1,
'region': "Central Processing (E1M6) Blue Yellow"},
351322: {'name': 'Command Center (E2M5) - Complete',
'region': "Central Processing (E1M6) Main"},
351322: {'name': 'Command Center (E2M5) - Exit',
'episode': 2,
'map': 5,
'index': -1,
'doom_type': -1,
'region': "Command Center (E2M5) Main"},
351323: {'name': 'Command Control (E1M4) - Complete',
351323: {'name': 'Command Control (E1M4) - Exit',
'episode': 1,
'map': 4,
'index': -1,
'doom_type': -1,
'region': "Command Control (E1M4) Main"},
351324: {'name': 'Computer Station (E1M7) - Complete',
351324: {'name': 'Computer Station (E1M7) - Exit',
'episode': 1,
'map': 7,
'index': -1,
'doom_type': -1,
'region': "Computer Station (E1M7) Blue"},
351325: {'name': 'Containment Area (E2M2) - Complete',
'region': "Computer Station (E1M7) Main"},
351325: {'name': 'Containment Area (E2M2) - Exit',
'episode': 2,
'map': 2,
'index': -1,
'doom_type': -1,
'region': "Containment Area (E2M2) Red"},
351326: {'name': 'Deimos Anomaly (E2M1) - Complete',
'region': "Containment Area (E2M2) Main"},
351326: {'name': 'Deimos Anomaly (E2M1) - Exit',
'episode': 2,
'map': 1,
'index': -1,
'doom_type': -1,
'region': "Deimos Anomaly (E2M1) Blue"},
351327: {'name': 'Deimos Lab (E2M4) - Complete',
'region': "Deimos Anomaly (E2M1) Main"},
351327: {'name': 'Deimos Lab (E2M4) - Exit',
'episode': 2,
'map': 4,
'index': -1,
'doom_type': -1,
'region': "Deimos Lab (E2M4) Blue Yellow"},
351328: {'name': 'Dis (E3M8) - Complete',
'region': "Deimos Lab (E2M4) Yellow"},
351328: {'name': 'Dis (E3M8) - Exit',
'episode': 3,
'map': 8,
'index': -1,
'doom_type': -1,
'region': "Dis (E3M8) Main"},
351329: {'name': 'Fortress of Mystery (E2M9) - Complete',
351329: {'name': 'Fortress of Mystery (E2M9) - Exit',
'episode': 2,
'map': 9,
'index': -1,
'doom_type': -1,
'region': "Fortress of Mystery (E2M9) Yellow"},
351330: {'name': 'Halls of the Damned (E2M6) - Complete',
'region': "Fortress of Mystery (E2M9) Main"},
351330: {'name': 'Halls of the Damned (E2M6) - Exit',
'episode': 2,
'map': 6,
'index': -1,
'doom_type': -1,
'region': "Halls of the Damned (E2M6) Blue Yellow Red"},
351331: {'name': 'Hangar (E1M1) - Complete',
'region': "Halls of the Damned (E2M6) Main"},
351331: {'name': 'Hangar (E1M1) - Exit',
'episode': 1,
'map': 1,
'index': -1,
'doom_type': -1,
'region': "Hangar (E1M1) Main"},
351332: {'name': 'Hell Keep (E3M1) - Complete',
351332: {'name': 'Hell Keep (E3M1) - Exit',
'episode': 3,
'map': 1,
'index': -1,
'doom_type': -1,
'region': "Hell Keep (E3M1) Narrow"},
351333: {'name': 'House of Pain (E3M4) - Complete',
'region': "Hell Keep (E3M1) Main"},
351333: {'name': 'House of Pain (E3M4) - Exit',
'episode': 3,
'map': 4,
'index': -1,
'doom_type': -1,
'region': "House of Pain (E3M4) Blue Red"},
351334: {'name': 'Limbo (E3M7) - Complete',
'region': "House of Pain (E3M4) Main"},
351334: {'name': 'Limbo (E3M7) - Exit',
'episode': 3,
'map': 7,
'index': -1,
'doom_type': -1,
'region': "Limbo (E3M7) Yellow Red"},
351335: {'name': 'Military Base (E1M9) - Complete',
'region': "Limbo (E3M7) Main"},
351335: {'name': 'Military Base (E1M9) - Exit',
'episode': 1,
'map': 9,
'index': -1,
'doom_type': -1,
'region': "Military Base (E1M9) Blue"},
351336: {'name': 'Mt. Erebus (E3M6) - Complete',
'region': "Military Base (E1M9) Main"},
351336: {'name': 'Mt. Erebus (E3M6) - Exit',
'episode': 3,
'map': 6,
'index': -1,
'doom_type': -1,
'region': "Mt. Erebus (E3M6) Blue"},
351337: {'name': 'Nuclear Plant (E1M2) - Complete',
'region': "Mt. Erebus (E3M6) Main"},
351337: {'name': 'Nuclear Plant (E1M2) - Exit',
'episode': 1,
'map': 2,
'index': -1,
'doom_type': -1,
'region': "Nuclear Plant (E1M2) Red"},
351338: {'name': 'Pandemonium (E3M3) - Complete',
'region': "Nuclear Plant (E1M2) Main"},
351338: {'name': 'Pandemonium (E3M3) - Exit',
'episode': 3,
'map': 3,
'index': -1,
'doom_type': -1,
'region': "Pandemonium (E3M3) Blue"},
351339: {'name': 'Phobos Anomaly (E1M8) - Complete',
'region': "Pandemonium (E3M3) Main"},
351339: {'name': 'Phobos Anomaly (E1M8) - Exit',
'episode': 1,
'map': 8,
'index': -1,
'doom_type': -1,
'region': "Phobos Anomaly (E1M8) Main"},
351340: {'name': 'Phobos Lab (E1M5) - Complete',
'region': "Phobos Anomaly (E1M8) Start"},
351340: {'name': 'Phobos Lab (E1M5) - Exit',
'episode': 1,
'map': 5,
'index': -1,
'doom_type': -1,
'region': "Phobos Lab (E1M5) Blue Yellow"},
351341: {'name': 'Refinery (E2M3) - Complete',
'region': "Phobos Lab (E1M5) Main"},
351341: {'name': 'Refinery (E2M3) - Exit',
'episode': 2,
'map': 3,
'index': -1,
'doom_type': -1,
'region': "Refinery (E2M3) Blue"},
351342: {'name': 'Slough of Despair (E3M2) - Complete',
'region': "Refinery (E2M3) Main"},
351342: {'name': 'Slough of Despair (E3M2) - Exit',
'episode': 3,
'map': 2,
'index': -1,
'doom_type': -1,
'region': "Slough of Despair (E3M2) Blue"},
351343: {'name': 'Spawning Vats (E2M7) - Complete',
'region': "Slough of Despair (E3M2) Main"},
351343: {'name': 'Spawning Vats (E2M7) - Exit',
'episode': 2,
'map': 7,
'index': -1,
'doom_type': -1,
'region': "Spawning Vats (E2M7) Red"},
351344: {'name': 'Tower of Babel (E2M8) - Complete',
'region': "Spawning Vats (E2M7) Main"},
351344: {'name': 'Tower of Babel (E2M8) - Exit',
'episode': 2,
'map': 8,
'index': -1,
'doom_type': -1,
'region': "Tower of Babel (E2M8) Main"},
351345: {'name': 'Toxin Refinery (E1M3) - Complete',
351345: {'name': 'Toxin Refinery (E1M3) - Exit',
'episode': 1,
'map': 3,
'index': -1,
'doom_type': -1,
'region': "Toxin Refinery (E1M3) Blue"},
351346: {'name': 'Unholy Cathedral (E3M5) - Complete',
'region': "Toxin Refinery (E1M3) Main"},
351346: {'name': 'Unholy Cathedral (E3M5) - Exit',
'episode': 3,
'map': 5,
'index': -1,
'doom_type': -1,
'region': "Unholy Cathedral (E3M5) Blue"},
351347: {'name': 'Warrens (E3M9) - Complete',
'region': "Unholy Cathedral (E3M5) Main"},
351347: {'name': 'Warrens (E3M9) - Exit',
'episode': 3,
'map': 9,
'index': -1,
'doom_type': -1,
'region': "Warrens (E3M9) Red"},
'region': "Warrens (E3M9) Main"},
}
@ -2115,8 +2115,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Central Processing (E1M6) - Backpack 3',
'Central Processing (E1M6) - Blue keycard',
'Central Processing (E1M6) - Chaingun',
'Central Processing (E1M6) - Complete',
'Central Processing (E1M6) - Computer area map',
'Central Processing (E1M6) - Exit',
'Central Processing (E1M6) - Mega Armor',
'Central Processing (E1M6) - Partial invisibility',
'Central Processing (E1M6) - Partial invisibility 2',
@ -2134,8 +2134,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Command Center (E2M5) - Berserk',
'Command Center (E2M5) - Chaingun',
'Command Center (E2M5) - Chainsaw',
'Command Center (E2M5) - Complete',
'Command Center (E2M5) - Computer area map',
'Command Center (E2M5) - Exit',
'Command Center (E2M5) - Mega Armor',
'Command Center (E2M5) - Partial invisibility',
'Command Center (E2M5) - Plasma gun',
@ -2145,7 +2145,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Command Control (E1M4) - Backpack',
'Command Control (E1M4) - Blue keycard',
'Command Control (E1M4) - Chaingun',
'Command Control (E1M4) - Complete',
'Command Control (E1M4) - Exit',
'Command Control (E1M4) - Mega Armor',
'Command Control (E1M4) - Rocket launcher',
'Command Control (E1M4) - Shotgun',
@ -2159,8 +2159,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Computer Station (E1M7) - Blue keycard',
'Computer Station (E1M7) - Chaingun',
'Computer Station (E1M7) - Chainsaw',
'Computer Station (E1M7) - Complete',
'Computer Station (E1M7) - Computer area map',
'Computer Station (E1M7) - Exit',
'Computer Station (E1M7) - Mega Armor',
'Computer Station (E1M7) - Partial invisibility',
'Computer Station (E1M7) - Red keycard',
@ -2181,8 +2181,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Containment Area (E2M2) - Blue keycard',
'Containment Area (E2M2) - Chaingun',
'Containment Area (E2M2) - Chainsaw',
'Containment Area (E2M2) - Complete',
'Containment Area (E2M2) - Computer area map',
'Containment Area (E2M2) - Exit',
'Containment Area (E2M2) - Mega Armor',
'Containment Area (E2M2) - Plasma gun',
'Containment Area (E2M2) - Red keycard',
@ -2195,8 +2195,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Deimos Anomaly (E2M1)': {
'Deimos Anomaly (E2M1) - Armor',
'Deimos Anomaly (E2M1) - Blue keycard',
'Deimos Anomaly (E2M1) - Complete',
'Deimos Anomaly (E2M1) - Computer area map',
'Deimos Anomaly (E2M1) - Exit',
'Deimos Anomaly (E2M1) - Mega Armor',
'Deimos Anomaly (E2M1) - Plasma gun',
'Deimos Anomaly (E2M1) - Red keycard',
@ -2211,8 +2211,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Deimos Lab (E2M4) - Berserk',
'Deimos Lab (E2M4) - Blue keycard',
'Deimos Lab (E2M4) - Chaingun',
'Deimos Lab (E2M4) - Complete',
'Deimos Lab (E2M4) - Computer area map',
'Deimos Lab (E2M4) - Exit',
'Deimos Lab (E2M4) - Mega Armor',
'Deimos Lab (E2M4) - Partial invisibility',
'Deimos Lab (E2M4) - Partial invisibility 2',
@ -2223,7 +2223,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Deimos Lab (E2M4) - Yellow keycard',
},
'Dis (E3M8)': {
'Dis (E3M8) - Complete',
'Dis (E3M8) - Exit',
'Dis (E3M8) - Mega Armor',
'Dis (E3M8) - Plasma gun',
'Dis (E3M8) - Rocket launcher',
@ -2233,8 +2233,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Fortress of Mystery (E2M9) - Blue skull key',
'Fortress of Mystery (E2M9) - Chaingun',
'Fortress of Mystery (E2M9) - Chainsaw',
'Fortress of Mystery (E2M9) - Complete',
'Fortress of Mystery (E2M9) - Computer area map',
'Fortress of Mystery (E2M9) - Exit',
'Fortress of Mystery (E2M9) - Mega Armor',
'Fortress of Mystery (E2M9) - Plasma gun',
'Fortress of Mystery (E2M9) - Red skull key',
@ -2250,8 +2250,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Halls of the Damned (E2M6) - Blue skull key',
'Halls of the Damned (E2M6) - Chaingun',
'Halls of the Damned (E2M6) - Chainsaw',
'Halls of the Damned (E2M6) - Complete',
'Halls of the Damned (E2M6) - Computer area map',
'Halls of the Damned (E2M6) - Exit',
'Halls of the Damned (E2M6) - Mega Armor',
'Halls of the Damned (E2M6) - Partial invisibility',
'Halls of the Damned (E2M6) - Partial invisibility 2',
@ -2265,12 +2265,12 @@ location_name_groups: Dict[str, Set[str]] = {
},
'Hangar (E1M1)': {
'Hangar (E1M1) - Armor',
'Hangar (E1M1) - Complete',
'Hangar (E1M1) - Exit',
'Hangar (E1M1) - Mega Armor',
'Hangar (E1M1) - Shotgun',
},
'Hell Keep (E3M1)': {
'Hell Keep (E3M1) - Complete',
'Hell Keep (E3M1) - Exit',
'Hell Keep (E3M1) - Rocket launcher',
'Hell Keep (E3M1) - Shotgun',
},
@ -2283,7 +2283,7 @@ location_name_groups: Dict[str, Set[str]] = {
'House of Pain (E3M4) - Berserk',
'House of Pain (E3M4) - Blue skull key',
'House of Pain (E3M4) - Chaingun',
'House of Pain (E3M4) - Complete',
'House of Pain (E3M4) - Exit',
'House of Pain (E3M4) - Invulnerability',
'House of Pain (E3M4) - Invulnerability 2',
'House of Pain (E3M4) - Mega Armor',
@ -2301,7 +2301,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Limbo (E3M7) - BFG9000',
'Limbo (E3M7) - Backpack',
'Limbo (E3M7) - Blue skull key',
'Limbo (E3M7) - Complete',
'Limbo (E3M7) - Exit',
'Limbo (E3M7) - Mega Armor',
'Limbo (E3M7) - Plasma gun',
'Limbo (E3M7) - Red skull key',
@ -2315,7 +2315,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Military Base (E1M9) - Blue keycard',
'Military Base (E1M9) - Chaingun',
'Military Base (E1M9) - Chainsaw',
'Military Base (E1M9) - Complete',
'Military Base (E1M9) - Exit',
'Military Base (E1M9) - Red keycard',
'Military Base (E1M9) - Rocket launcher',
'Military Base (E1M9) - Shotgun',
@ -2330,8 +2330,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Mt. Erebus (E3M6) - Blue skull key 2',
'Mt. Erebus (E3M6) - Chaingun',
'Mt. Erebus (E3M6) - Chainsaw',
'Mt. Erebus (E3M6) - Complete',
'Mt. Erebus (E3M6) - Computer area map',
'Mt. Erebus (E3M6) - Exit',
'Mt. Erebus (E3M6) - Invulnerability',
'Mt. Erebus (E3M6) - Invulnerability 2',
'Mt. Erebus (E3M6) - Mega Armor',
@ -2349,7 +2349,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Nuclear Plant (E1M2) - Backpack 2',
'Nuclear Plant (E1M2) - Chaingun',
'Nuclear Plant (E1M2) - Chainsaw',
'Nuclear Plant (E1M2) - Complete',
'Nuclear Plant (E1M2) - Exit',
'Nuclear Plant (E1M2) - Mega Armor',
'Nuclear Plant (E1M2) - Red keycard',
'Nuclear Plant (E1M2) - Shotgun',
@ -2362,8 +2362,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Pandemonium (E3M3) - Berserk',
'Pandemonium (E3M3) - Blue skull key',
'Pandemonium (E3M3) - Chaingun',
'Pandemonium (E3M3) - Complete',
'Pandemonium (E3M3) - Computer area map',
'Pandemonium (E3M3) - Exit',
'Pandemonium (E3M3) - Invulnerability',
'Pandemonium (E3M3) - Mega Armor',
'Pandemonium (E3M3) - Mega Armor 2',
@ -2375,8 +2375,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Phobos Anomaly (E1M8)': {
'Phobos Anomaly (E1M8) - Armor',
'Phobos Anomaly (E1M8) - Chaingun',
'Phobos Anomaly (E1M8) - Complete',
'Phobos Anomaly (E1M8) - Computer area map',
'Phobos Anomaly (E1M8) - Exit',
'Phobos Anomaly (E1M8) - Partial invisibility',
'Phobos Anomaly (E1M8) - Shotgun',
'Phobos Anomaly (E1M8) - Shotgun 2',
@ -2389,8 +2389,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Phobos Lab (E1M5) - Blue keycard',
'Phobos Lab (E1M5) - Chaingun',
'Phobos Lab (E1M5) - Chainsaw',
'Phobos Lab (E1M5) - Complete',
'Phobos Lab (E1M5) - Computer area map',
'Phobos Lab (E1M5) - Exit',
'Phobos Lab (E1M5) - Mega Armor',
'Phobos Lab (E1M5) - Mega Armor 2',
'Phobos Lab (E1M5) - Partial invisibility',
@ -2407,7 +2407,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Refinery (E2M3) - Berserk',
'Refinery (E2M3) - Blue keycard',
'Refinery (E2M3) - Chaingun',
'Refinery (E2M3) - Complete',
'Refinery (E2M3) - Exit',
'Refinery (E2M3) - Mega Armor',
'Refinery (E2M3) - Partial invisibility',
'Refinery (E2M3) - Partial invisibility 2',
@ -2420,8 +2420,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Slough of Despair (E3M2) - Berserk',
'Slough of Despair (E3M2) - Blue skull key',
'Slough of Despair (E3M2) - Chaingun',
'Slough of Despair (E3M2) - Complete',
'Slough of Despair (E3M2) - Computer area map',
'Slough of Despair (E3M2) - Exit',
'Slough of Despair (E3M2) - Mega Armor',
'Slough of Despair (E3M2) - Plasma gun',
'Slough of Despair (E3M2) - Rocket launcher',
@ -2434,8 +2434,8 @@ location_name_groups: Dict[str, Set[str]] = {
'Spawning Vats (E2M7) - Blue keycard',
'Spawning Vats (E2M7) - Chaingun',
'Spawning Vats (E2M7) - Chainsaw',
'Spawning Vats (E2M7) - Complete',
'Spawning Vats (E2M7) - Computer area map',
'Spawning Vats (E2M7) - Exit',
'Spawning Vats (E2M7) - Invulnerability',
'Spawning Vats (E2M7) - Invulnerability 2',
'Spawning Vats (E2M7) - Mega Armor',
@ -2447,7 +2447,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Spawning Vats (E2M7) - Yellow keycard',
},
'Tower of Babel (E2M8)': {
'Tower of Babel (E2M8) - Complete',
'Tower of Babel (E2M8) - Exit',
'Tower of Babel (E2M8) - Mega Armor',
'Tower of Babel (E2M8) - Rocket launcher',
'Tower of Babel (E2M8) - Supercharge',
@ -2461,7 +2461,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Toxin Refinery (E1M3) - Blue keycard',
'Toxin Refinery (E1M3) - Chaingun',
'Toxin Refinery (E1M3) - Chainsaw',
'Toxin Refinery (E1M3) - Complete',
'Toxin Refinery (E1M3) - Exit',
'Toxin Refinery (E1M3) - Mega Armor',
'Toxin Refinery (E1M3) - Partial invisibility',
'Toxin Refinery (E1M3) - Rocket launcher',
@ -2477,7 +2477,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Unholy Cathedral (E3M5) - Blue skull key',
'Unholy Cathedral (E3M5) - Chaingun',
'Unholy Cathedral (E3M5) - Chainsaw',
'Unholy Cathedral (E3M5) - Complete',
'Unholy Cathedral (E3M5) - Exit',
'Unholy Cathedral (E3M5) - Invulnerability',
'Unholy Cathedral (E3M5) - Partial invisibility',
'Unholy Cathedral (E3M5) - Plasma gun',
@ -2495,7 +2495,7 @@ location_name_groups: Dict[str, Set[str]] = {
'Warrens (E3M9) - Blue skull key',
'Warrens (E3M9) - Chaingun',
'Warrens (E3M9) - Chainsaw',
'Warrens (E3M9) - Complete',
'Warrens (E3M9) - Exit',
'Warrens (E3M9) - Invulnerability',
'Warrens (E3M9) - Invulnerability 2',
'Warrens (E3M9) - Partial invisibility',
@ -2514,8 +2514,9 @@ death_logic_locations = [
"Command Control (E1M4) - Supercharge",
"Command Control (E1M4) - Mega Armor",
"Containment Area (E2M2) - Supercharge",
"Pandemonium (E3M3) - Mega Armor",
"House of Pain (E3M4) - Chaingun",
"House of Pain (E3M4) - Invulnerability",
"Pandemonium (E3M3) - Mega Armor",
"Unholy Cathedral (E3M5) - BFG9000",
"Mt. Erebus (E3M6) - Chainsaw",
]

34
worlds/doom_1993/Maps.py Normal file
View File

@ -0,0 +1,34 @@
# This file is auto generated. More info: https://github.com/Daivuk/apdoom
from typing import List
map_names: List[str] = [
'Hangar (E1M1)',
'Nuclear Plant (E1M2)',
'Toxin Refinery (E1M3)',
'Command Control (E1M4)',
'Phobos Lab (E1M5)',
'Central Processing (E1M6)',
'Computer Station (E1M7)',
'Phobos Anomaly (E1M8)',
'Military Base (E1M9)',
'Deimos Anomaly (E2M1)',
'Containment Area (E2M2)',
'Refinery (E2M3)',
'Deimos Lab (E2M4)',
'Command Center (E2M5)',
'Halls of the Damned (E2M6)',
'Spawning Vats (E2M7)',
'Tower of Babel (E2M8)',
'Fortress of Mystery (E2M9)',
'Hell Keep (E3M1)',
'Slough of Despair (E3M2)',
'Pandemonium (E3M3)',
'House of Pain (E3M4)',
'Unholy Cathedral (E3M5)',
'Mt. Erebus (E3M6)',
'Limbo (E3M7)',
'Dis (E3M8)',
'Warrens (E3M9)',
]

View File

@ -57,6 +57,11 @@ class AllowDeathLogic(Toggle):
display_name = "Allow Death Logic"
class StartWithComputerAreaMaps(Toggle):
"""Give the player all Computer Area Map items from the start."""
display_name = "Start With Computer Area Maps"
class Episode1(DefaultOnToggle):
"""Knee-Deep in the Dead.
If none of the episodes are chosen, Episode 1 will be chosen by default."""
@ -80,6 +85,7 @@ options: typing.Dict[str, AssembleOptions] = {
"random_monsters": RandomMonsters,
"random_pickups": RandomPickups,
"allow_death_logic": AllowDeathLogic,
"start_with_computer_area_maps": StartWithComputerAreaMaps,
"death_link": DeathLink,
"episode1": Episode1,
"episode2": Episode2,

View File

@ -1,80 +1,358 @@
# This file is auto generated. More info: https://github.com/Daivuk/apdoom
from typing import List
from BaseClasses import Region, Entrance
from BaseClasses import TypedDict
regions:List[Region] = [
"Central Processing (E1M6) Blue",
"Central Processing (E1M6) Blue Yellow",
"Central Processing (E1M6) Main",
"Central Processing (E1M6) Red",
"Command Center (E2M5) Main",
"Command Control (E1M4) Blue Yellow",
"Command Control (E1M4) Main",
"Computer Station (E1M7) Blue",
"Computer Station (E1M7) Main",
"Computer Station (E1M7) Red",
"Computer Station (E1M7) Yellow",
"Computer Station (E1M7) Yellow Red",
"Containment Area (E2M2) Blue",
"Containment Area (E2M2) Main",
"Containment Area (E2M2) Red",
"Containment Area (E2M2) Yellow",
"Deimos Anomaly (E2M1) Blue",
"Deimos Anomaly (E2M1) Main",
"Deimos Anomaly (E2M1) Red",
"Deimos Lab (E2M4) Blue",
"Deimos Lab (E2M4) Blue Yellow",
"Deimos Lab (E2M4) Main",
"Dis (E3M8) Main",
"Fortress of Mystery (E2M9) Blue",
"Fortress of Mystery (E2M9) Main",
"Fortress of Mystery (E2M9) Red",
"Fortress of Mystery (E2M9) Yellow",
"Halls of the Damned (E2M6) Blue Yellow Red",
"Halls of the Damned (E2M6) Main",
"Halls of the Damned (E2M6) Yellow",
"Hangar (E1M1) Main",
"Hell Keep (E3M1) Main",
"Hell Keep (E3M1) Narrow",
"House of Pain (E3M4) Blue",
"House of Pain (E3M4) Blue Red",
"House of Pain (E3M4) Blue Yellow",
"House of Pain (E3M4) Main",
"Limbo (E3M7) Blue",
"Limbo (E3M7) Main",
"Limbo (E3M7) Red",
"Limbo (E3M7) Yellow Red",
"Military Base (E1M9) Blue",
"Military Base (E1M9) Main",
"Military Base (E1M9) Red",
"Military Base (E1M9) Yellow",
"Mt. Erebus (E3M6) Blue",
"Mt. Erebus (E3M6) Main",
"Nuclear Plant (E1M2) Main",
"Nuclear Plant (E1M2) Red",
"Pandemonium (E3M3) Blue",
"Pandemonium (E3M3) Main",
"Phobos Anomaly (E1M8) Main",
"Phobos Lab (E1M5) Blue Yellow",
"Phobos Lab (E1M5) Main",
"Phobos Lab (E1M5) Yellow",
"Refinery (E2M3) Blue",
"Refinery (E2M3) Main",
"Slough of Despair (E3M2) Blue",
"Slough of Despair (E3M2) Main",
"Spawning Vats (E2M7) Blue",
"Spawning Vats (E2M7) Blue Red",
"Spawning Vats (E2M7) Main",
"Spawning Vats (E2M7) Red",
"Spawning Vats (E2M7) Yellow",
"Tower of Babel (E2M8) Main",
"Toxin Refinery (E1M3) Blue",
"Toxin Refinery (E1M3) Main",
"Toxin Refinery (E1M3) Yellow",
"Unholy Cathedral (E3M5) Blue",
"Unholy Cathedral (E3M5) Main",
"Unholy Cathedral (E3M5) Yellow",
"Warrens (E3M9) Main",
"Warrens (E3M9) Red",
class RegionDict(TypedDict, total=False):
name: str
connects_to_hub: bool
connections: List[str]
regions:List[RegionDict] = [
# Hangar (E1M1)
{"name":"Hangar (E1M1) Main",
"connects_to_hub":True,
"connections":[]},
# Nuclear Plant (E1M2)
{"name":"Nuclear Plant (E1M2) Main",
"connects_to_hub":True,
"connections":["Nuclear Plant (E1M2) Red"]},
{"name":"Nuclear Plant (E1M2) Red",
"connects_to_hub":False,
"connections":["Nuclear Plant (E1M2) Main"]},
# Toxin Refinery (E1M3)
{"name":"Toxin Refinery (E1M3) Main",
"connects_to_hub":True,
"connections":["Toxin Refinery (E1M3) Blue"]},
{"name":"Toxin Refinery (E1M3) Blue",
"connects_to_hub":False,
"connections":[
"Toxin Refinery (E1M3) Yellow",
"Toxin Refinery (E1M3) Main"]},
{"name":"Toxin Refinery (E1M3) Yellow",
"connects_to_hub":False,
"connections":["Toxin Refinery (E1M3) Blue"]},
# Command Control (E1M4)
{"name":"Command Control (E1M4) Main",
"connects_to_hub":True,
"connections":[
"Command Control (E1M4) Blue",
"Command Control (E1M4) Yellow"]},
{"name":"Command Control (E1M4) Blue",
"connects_to_hub":False,
"connections":["Command Control (E1M4) Main"]},
{"name":"Command Control (E1M4) Yellow",
"connects_to_hub":False,
"connections":["Command Control (E1M4) Main"]},
# Phobos Lab (E1M5)
{"name":"Phobos Lab (E1M5) Main",
"connects_to_hub":True,
"connections":["Phobos Lab (E1M5) Yellow"]},
{"name":"Phobos Lab (E1M5) Yellow",
"connects_to_hub":False,
"connections":[
"Phobos Lab (E1M5) Main",
"Phobos Lab (E1M5) Blue",
"Phobos Lab (E1M5) Green"]},
{"name":"Phobos Lab (E1M5) Blue",
"connects_to_hub":False,
"connections":[
"Phobos Lab (E1M5) Green",
"Phobos Lab (E1M5) Yellow"]},
{"name":"Phobos Lab (E1M5) Green",
"connects_to_hub":False,
"connections":[
"Phobos Lab (E1M5) Main",
"Phobos Lab (E1M5) Blue"]},
# Central Processing (E1M6)
{"name":"Central Processing (E1M6) Main",
"connects_to_hub":True,
"connections":[
"Central Processing (E1M6) Yellow",
"Central Processing (E1M6) Red",
"Central Processing (E1M6) Blue",
"Central Processing (E1M6) Nukage"]},
{"name":"Central Processing (E1M6) Red",
"connects_to_hub":False,
"connections":["Central Processing (E1M6) Main"]},
{"name":"Central Processing (E1M6) Blue",
"connects_to_hub":False,
"connections":["Central Processing (E1M6) Main"]},
{"name":"Central Processing (E1M6) Yellow",
"connects_to_hub":False,
"connections":["Central Processing (E1M6) Main"]},
{"name":"Central Processing (E1M6) Nukage",
"connects_to_hub":False,
"connections":["Central Processing (E1M6) Yellow"]},
# Computer Station (E1M7)
{"name":"Computer Station (E1M7) Main",
"connects_to_hub":True,
"connections":[
"Computer Station (E1M7) Red",
"Computer Station (E1M7) Yellow"]},
{"name":"Computer Station (E1M7) Blue",
"connects_to_hub":False,
"connections":["Computer Station (E1M7) Yellow"]},
{"name":"Computer Station (E1M7) Red",
"connects_to_hub":False,
"connections":["Computer Station (E1M7) Main"]},
{"name":"Computer Station (E1M7) Yellow",
"connects_to_hub":False,
"connections":[
"Computer Station (E1M7) Blue",
"Computer Station (E1M7) Courtyard",
"Computer Station (E1M7) Main"]},
{"name":"Computer Station (E1M7) Courtyard",
"connects_to_hub":False,
"connections":["Computer Station (E1M7) Yellow"]},
# Phobos Anomaly (E1M8)
{"name":"Phobos Anomaly (E1M8) Main",
"connects_to_hub":False,
"connections":[]},
{"name":"Phobos Anomaly (E1M8) Start",
"connects_to_hub":True,
"connections":["Phobos Anomaly (E1M8) Main"]},
# Military Base (E1M9)
{"name":"Military Base (E1M9) Main",
"connects_to_hub":True,
"connections":[
"Military Base (E1M9) Blue",
"Military Base (E1M9) Yellow",
"Military Base (E1M9) Red"]},
{"name":"Military Base (E1M9) Blue",
"connects_to_hub":False,
"connections":["Military Base (E1M9) Main"]},
{"name":"Military Base (E1M9) Red",
"connects_to_hub":False,
"connections":["Military Base (E1M9) Main"]},
{"name":"Military Base (E1M9) Yellow",
"connects_to_hub":False,
"connections":["Military Base (E1M9) Main"]},
# Deimos Anomaly (E2M1)
{"name":"Deimos Anomaly (E2M1) Main",
"connects_to_hub":True,
"connections":[
"Deimos Anomaly (E2M1) Red",
"Deimos Anomaly (E2M1) Blue"]},
{"name":"Deimos Anomaly (E2M1) Blue",
"connects_to_hub":False,
"connections":["Deimos Anomaly (E2M1) Main"]},
{"name":"Deimos Anomaly (E2M1) Red",
"connects_to_hub":False,
"connections":["Deimos Anomaly (E2M1) Main"]},
# Containment Area (E2M2)
{"name":"Containment Area (E2M2) Main",
"connects_to_hub":True,
"connections":[
"Containment Area (E2M2) Yellow",
"Containment Area (E2M2) Blue",
"Containment Area (E2M2) Red"]},
{"name":"Containment Area (E2M2) Blue",
"connects_to_hub":False,
"connections":["Containment Area (E2M2) Main"]},
{"name":"Containment Area (E2M2) Red",
"connects_to_hub":False,
"connections":["Containment Area (E2M2) Main"]},
{"name":"Containment Area (E2M2) Yellow",
"connects_to_hub":False,
"connections":["Containment Area (E2M2) Main"]},
# Refinery (E2M3)
{"name":"Refinery (E2M3) Main",
"connects_to_hub":True,
"connections":["Refinery (E2M3) Blue"]},
{"name":"Refinery (E2M3) Blue",
"connects_to_hub":False,
"connections":["Refinery (E2M3) Main"]},
# Deimos Lab (E2M4)
{"name":"Deimos Lab (E2M4) Main",
"connects_to_hub":True,
"connections":["Deimos Lab (E2M4) Blue"]},
{"name":"Deimos Lab (E2M4) Blue",
"connects_to_hub":False,
"connections":[
"Deimos Lab (E2M4) Main",
"Deimos Lab (E2M4) Yellow"]},
{"name":"Deimos Lab (E2M4) Yellow",
"connects_to_hub":False,
"connections":["Deimos Lab (E2M4) Blue"]},
# Command Center (E2M5)
{"name":"Command Center (E2M5) Main",
"connects_to_hub":True,
"connections":[]},
# Halls of the Damned (E2M6)
{"name":"Halls of the Damned (E2M6) Main",
"connects_to_hub":True,
"connections":[
"Halls of the Damned (E2M6) Blue Yellow Red",
"Halls of the Damned (E2M6) Yellow",
"Halls of the Damned (E2M6) One way Yellow"]},
{"name":"Halls of the Damned (E2M6) Yellow",
"connects_to_hub":False,
"connections":["Halls of the Damned (E2M6) Main"]},
{"name":"Halls of the Damned (E2M6) Blue Yellow Red",
"connects_to_hub":False,
"connections":["Halls of the Damned (E2M6) Main"]},
{"name":"Halls of the Damned (E2M6) One way Yellow",
"connects_to_hub":False,
"connections":["Halls of the Damned (E2M6) Main"]},
# Spawning Vats (E2M7)
{"name":"Spawning Vats (E2M7) Main",
"connects_to_hub":True,
"connections":[
"Spawning Vats (E2M7) Blue",
"Spawning Vats (E2M7) Entrance Secret",
"Spawning Vats (E2M7) Red",
"Spawning Vats (E2M7) Yellow"]},
{"name":"Spawning Vats (E2M7) Blue",
"connects_to_hub":False,
"connections":["Spawning Vats (E2M7) Main"]},
{"name":"Spawning Vats (E2M7) Yellow",
"connects_to_hub":False,
"connections":["Spawning Vats (E2M7) Main"]},
{"name":"Spawning Vats (E2M7) Red",
"connects_to_hub":False,
"connections":["Spawning Vats (E2M7) Main"]},
{"name":"Spawning Vats (E2M7) Entrance Secret",
"connects_to_hub":False,
"connections":["Spawning Vats (E2M7) Main"]},
# Tower of Babel (E2M8)
{"name":"Tower of Babel (E2M8) Main",
"connects_to_hub":True,
"connections":[]},
# Fortress of Mystery (E2M9)
{"name":"Fortress of Mystery (E2M9) Main",
"connects_to_hub":True,
"connections":[
"Fortress of Mystery (E2M9) Blue",
"Fortress of Mystery (E2M9) Red",
"Fortress of Mystery (E2M9) Yellow"]},
{"name":"Fortress of Mystery (E2M9) Blue",
"connects_to_hub":False,
"connections":["Fortress of Mystery (E2M9) Main"]},
{"name":"Fortress of Mystery (E2M9) Red",
"connects_to_hub":False,
"connections":["Fortress of Mystery (E2M9) Main"]},
{"name":"Fortress of Mystery (E2M9) Yellow",
"connects_to_hub":False,
"connections":["Fortress of Mystery (E2M9) Main"]},
# Hell Keep (E3M1)
{"name":"Hell Keep (E3M1) Main",
"connects_to_hub":True,
"connections":["Hell Keep (E3M1) Narrow"]},
{"name":"Hell Keep (E3M1) Narrow",
"connects_to_hub":False,
"connections":["Hell Keep (E3M1) Main"]},
# Slough of Despair (E3M2)
{"name":"Slough of Despair (E3M2) Main",
"connects_to_hub":True,
"connections":["Slough of Despair (E3M2) Blue"]},
{"name":"Slough of Despair (E3M2) Blue",
"connects_to_hub":False,
"connections":["Slough of Despair (E3M2) Main"]},
# Pandemonium (E3M3)
{"name":"Pandemonium (E3M3) Main",
"connects_to_hub":True,
"connections":["Pandemonium (E3M3) Blue"]},
{"name":"Pandemonium (E3M3) Blue",
"connects_to_hub":False,
"connections":["Pandemonium (E3M3) Main"]},
# House of Pain (E3M4)
{"name":"House of Pain (E3M4) Main",
"connects_to_hub":True,
"connections":["House of Pain (E3M4) Blue"]},
{"name":"House of Pain (E3M4) Blue",
"connects_to_hub":False,
"connections":[
"House of Pain (E3M4) Main",
"House of Pain (E3M4) Yellow",
"House of Pain (E3M4) Red"]},
{"name":"House of Pain (E3M4) Red",
"connects_to_hub":False,
"connections":["House of Pain (E3M4) Blue"]},
{"name":"House of Pain (E3M4) Yellow",
"connects_to_hub":False,
"connections":["House of Pain (E3M4) Blue"]},
# Unholy Cathedral (E3M5)
{"name":"Unholy Cathedral (E3M5) Main",
"connects_to_hub":True,
"connections":[
"Unholy Cathedral (E3M5) Yellow",
"Unholy Cathedral (E3M5) Blue"]},
{"name":"Unholy Cathedral (E3M5) Blue",
"connects_to_hub":False,
"connections":["Unholy Cathedral (E3M5) Main"]},
{"name":"Unholy Cathedral (E3M5) Yellow",
"connects_to_hub":False,
"connections":["Unholy Cathedral (E3M5) Main"]},
# Mt. Erebus (E3M6)
{"name":"Mt. Erebus (E3M6) Main",
"connects_to_hub":True,
"connections":["Mt. Erebus (E3M6) Blue"]},
{"name":"Mt. Erebus (E3M6) Blue",
"connects_to_hub":False,
"connections":["Mt. Erebus (E3M6) Main"]},
# Limbo (E3M7)
{"name":"Limbo (E3M7) Main",
"connects_to_hub":True,
"connections":[
"Limbo (E3M7) Red",
"Limbo (E3M7) Blue"]},
{"name":"Limbo (E3M7) Blue",
"connects_to_hub":False,
"connections":["Limbo (E3M7) Main"]},
{"name":"Limbo (E3M7) Red",
"connects_to_hub":False,
"connections":[
"Limbo (E3M7) Main",
"Limbo (E3M7) Yellow"]},
{"name":"Limbo (E3M7) Yellow",
"connects_to_hub":False,
"connections":["Limbo (E3M7) Red"]},
# Dis (E3M8)
{"name":"Dis (E3M8) Main",
"connects_to_hub":True,
"connections":[]},
# Warrens (E3M9)
{"name":"Warrens (E3M9) Main",
"connects_to_hub":True,
"connections":[
"Warrens (E3M9) Red",
"Warrens (E3M9) Blue",
"Warrens (E3M9) Blue trigger"]},
{"name":"Warrens (E3M9) Red",
"connects_to_hub":False,
"connections":["Warrens (E3M9) Main"]},
{"name":"Warrens (E3M9) Blue",
"connects_to_hub":False,
"connections":["Warrens (E3M9) Main"]},
{"name":"Warrens (E3M9) Blue trigger",
"connects_to_hub":False,
"connections":["Warrens (E3M9) Main"]},
]

View File

@ -11,130 +11,374 @@ def set_rules(doom_1993_world: "DOOM1993World"):
player = doom_1993_world.player
world = doom_1993_world.multiworld
# Hangar (E1M1) - E1M1
set_rule(world.get_entrance("Mars -> Hangar (E1M1) Main", player), lambda state: state.has("Hangar (E1M1)", player, 1))
# Hangar (E1M1)
set_rule(world.get_entrance("Hub -> Hangar (E1M1) Main", player), lambda state:
state.has("Hangar (E1M1)", player, 1))
# Nuclear Plant (E1M2) - E1M2
set_rule(world.get_entrance("Mars -> Nuclear Plant (E1M2) Main", player), lambda state: state.has("Nuclear Plant (E1M2)", player, 1) and state.has("Shotgun", player, 1))
set_rule(world.get_entrance("Mars -> Nuclear Plant (E1M2) Red", player), lambda state: state.has("Nuclear Plant (E1M2)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Nuclear Plant (E1M2) - Red keycard", player, 1)))
# Nuclear Plant (E1M2)
set_rule(world.get_entrance("Hub -> Nuclear Plant (E1M2) Main", player), lambda state:
(state.has("Nuclear Plant (E1M2)", player, 1)) and
(state.has("Shotgun", player, 1) or
state.has("Chaingun", player, 1)))
set_rule(world.get_entrance("Nuclear Plant (E1M2) Main -> Nuclear Plant (E1M2) Red", player), lambda state:
state.has("Nuclear Plant (E1M2) - Red keycard", player, 1))
set_rule(world.get_entrance("Nuclear Plant (E1M2) Red -> Nuclear Plant (E1M2) Main", player), lambda state:
state.has("Nuclear Plant (E1M2) - Red keycard", player, 1))
# Toxin Refinery (E1M3) - E1M3
set_rule(world.get_entrance("Mars -> Toxin Refinery (E1M3) Blue", player), lambda state: state.has("Toxin Refinery (E1M3)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Toxin Refinery (E1M3) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Toxin Refinery (E1M3) Main", player), lambda state: state.has("Toxin Refinery (E1M3)", player, 1) and state.has("Shotgun", player, 1))
set_rule(world.get_entrance("Mars -> Toxin Refinery (E1M3) Yellow", player), lambda state: state.has("Toxin Refinery (E1M3)", player, 1) and state.has("Shotgun", player, 1)and state.has("Toxin Refinery (E1M3) - Blue keycard", player, 1)and state.has("Toxin Refinery (E1M3) - Yellow keycard", player, 1))
# Toxin Refinery (E1M3)
set_rule(world.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(world.get_entrance("Toxin Refinery (E1M3) Main -> Toxin Refinery (E1M3) Blue", player), lambda state:
state.has("Toxin Refinery (E1M3) - Blue keycard", player, 1))
set_rule(world.get_entrance("Toxin Refinery (E1M3) Blue -> Toxin Refinery (E1M3) Yellow", player), lambda state:
state.has("Toxin Refinery (E1M3) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Toxin Refinery (E1M3) Blue -> Toxin Refinery (E1M3) Main", player), lambda state:
state.has("Toxin Refinery (E1M3) - Blue keycard", player, 1))
set_rule(world.get_entrance("Toxin Refinery (E1M3) Yellow -> Toxin Refinery (E1M3) Blue", player), lambda state:
state.has("Toxin Refinery (E1M3) - Yellow keycard", player, 1))
# Command Control (E1M4) - E1M4
set_rule(world.get_entrance("Mars -> Command Control (E1M4) Blue Yellow", player), lambda state: state.has("Command Control (E1M4)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Command Control (E1M4) - Blue keycard", player, 1) or state.has("Command Control (E1M4) - Yellow keycard", player, 1)))
set_rule(world.get_entrance("Mars -> 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))
# Command Control (E1M4)
set_rule(world.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(world.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))
set_rule(world.get_entrance("Command Control (E1M4) Main -> Command Control (E1M4) Yellow", player), lambda state:
state.has("Command Control (E1M4) - Blue keycard", player, 1) or
state.has("Command Control (E1M4) - Yellow keycard", player, 1))
set_rule(world.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(world.get_entrance("Command Control (E1M4) Yellow -> 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))
# Phobos Lab (E1M5) - E1M5
set_rule(world.get_entrance("Mars -> Phobos Lab (E1M5) Blue Yellow", player), lambda state: state.has("Phobos Lab (E1M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Phobos Lab (E1M5) - Yellow keycard", player, 1) or state.has("Phobos Lab (E1M5) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Phobos Lab (E1M5) Main", player), lambda state: state.has("Phobos Lab (E1M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Phobos Lab (E1M5) Yellow", player), lambda state: state.has("Phobos Lab (E1M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Phobos Lab (E1M5) - Yellow keycard", player, 1)))
# Phobos Lab (E1M5)
set_rule(world.get_entrance("Hub -> Phobos Lab (E1M5) Main", player), lambda state:
state.has("Phobos Lab (E1M5)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Phobos Lab (E1M5) Main -> Phobos Lab (E1M5) Yellow", player), lambda state:
state.has("Phobos Lab (E1M5) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Phobos Lab (E1M5) Yellow -> Phobos Lab (E1M5) Blue", player), lambda state:
state.has("Phobos Lab (E1M5) - Blue keycard", player, 1))
set_rule(world.get_entrance("Phobos Lab (E1M5) Blue -> Phobos Lab (E1M5) Green", player), lambda state:
state.has("Phobos Lab (E1M5) - Blue keycard", player, 1))
set_rule(world.get_entrance("Phobos Lab (E1M5) Green -> Phobos Lab (E1M5) Blue", player), lambda state:
state.has("Phobos Lab (E1M5) - Blue keycard", player, 1))
# Central Processing (E1M6) - E1M6
set_rule(world.get_entrance("Mars -> Central Processing (E1M6) Blue", player), lambda state: state.has("Central Processing (E1M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Central Processing (E1M6) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Central Processing (E1M6) Blue Yellow", player), lambda state: state.has("Central Processing (E1M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Central Processing (E1M6) - Yellow keycard", player, 1) or state.has("Central Processing (E1M6) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Central Processing (E1M6) Main", player), lambda state: state.has("Central Processing (E1M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Central Processing (E1M6) Red", player), lambda state: state.has("Central Processing (E1M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Central Processing (E1M6) - Red keycard", player, 1)))
# Central Processing (E1M6)
set_rule(world.get_entrance("Hub -> Central Processing (E1M6) Main", player), lambda state:
state.has("Central Processing (E1M6)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Rocket launcher", player, 1))
set_rule(world.get_entrance("Central Processing (E1M6) Main -> Central Processing (E1M6) Yellow", player), lambda state:
state.has("Central Processing (E1M6) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Central Processing (E1M6) Main -> Central Processing (E1M6) Red", player), lambda state:
state.has("Central Processing (E1M6) - Red keycard", player, 1))
set_rule(world.get_entrance("Central Processing (E1M6) Main -> Central Processing (E1M6) Blue", player), lambda state:
state.has("Central Processing (E1M6) - Blue keycard", player, 1))
set_rule(world.get_entrance("Central Processing (E1M6) Main -> Central Processing (E1M6) Nukage", player), lambda state:
state.has("Central Processing (E1M6) - Blue keycard", player, 1))
set_rule(world.get_entrance("Central Processing (E1M6) Yellow -> Central Processing (E1M6) Main", player), lambda state:
state.has("Central Processing (E1M6) - Yellow keycard", player, 1))
# Computer Station (E1M7) - E1M7
set_rule(world.get_entrance("Mars -> Computer Station (E1M7) Blue", 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("Computer Station (E1M7) - Blue keycard", player, 1)and state.has("Computer Station (E1M7) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Mars -> 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))
set_rule(world.get_entrance("Mars -> Computer Station (E1M7) Red", 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("Computer Station (E1M7) - Red keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Computer Station (E1M7) Yellow", 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("Computer Station (E1M7) - Yellow keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Computer Station (E1M7) Yellow Red", 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("Computer Station (E1M7) - Yellow keycard", player, 1)and state.has("Computer Station (E1M7) - Red keycard", player, 1))
# Computer Station (E1M7)
set_rule(world.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(world.get_entrance("Computer Station (E1M7) Main -> Computer Station (E1M7) Red", player), lambda state:
state.has("Computer Station (E1M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Computer Station (E1M7) Main -> Computer Station (E1M7) Yellow", player), lambda state:
state.has("Computer Station (E1M7) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Computer Station (E1M7) Blue -> Computer Station (E1M7) Yellow", player), lambda state:
state.has("Computer Station (E1M7) - Blue keycard", player, 1))
set_rule(world.get_entrance("Computer Station (E1M7) Red -> Computer Station (E1M7) Main", player), lambda state:
state.has("Computer Station (E1M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Computer Station (E1M7) Yellow -> Computer Station (E1M7) Blue", player), lambda state:
state.has("Computer Station (E1M7) - Blue keycard", player, 1))
set_rule(world.get_entrance("Computer Station (E1M7) Yellow -> Computer Station (E1M7) Courtyard", player), lambda state:
state.has("Computer Station (E1M7) - Yellow keycard", player, 1) and
state.has("Computer Station (E1M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Computer Station (E1M7) Courtyard -> Computer Station (E1M7) Yellow", player), lambda state:
state.has("Computer Station (E1M7) - Yellow keycard", player, 1))
# Phobos Anomaly (E1M8) - E1M8
set_rule(world.get_entrance("Mars -> Phobos Anomaly (E1M8) Main", player), lambda state: state.has("Phobos Anomaly (E1M8)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Rocket launcher", player, 1) or state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1)))
# Phobos Anomaly (E1M8)
set_rule(world.get_entrance("Hub -> Phobos Anomaly (E1M8) Start", player), lambda state:
(state.has("Phobos Anomaly (E1M8)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1)) and
(state.has("Rocket launcher", player, 1) or
state.has("Plasma gun", player, 1) or
state.has("BFG9000", player, 1)))
# Military Base (E1M9) - E1M9
set_rule(world.get_entrance("Mars -> Military Base (E1M9) Blue", player), lambda state: state.has("Military Base (E1M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Military Base (E1M9) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Military Base (E1M9) Main", player), lambda state: state.has("Military Base (E1M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Military Base (E1M9) Red", player), lambda state: state.has("Military Base (E1M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Military Base (E1M9) - Red keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Military Base (E1M9) Yellow", player), lambda state: state.has("Military Base (E1M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Military Base (E1M9) - Yellow keycard", player, 1)))
# Military Base (E1M9)
set_rule(world.get_entrance("Hub -> Military Base (E1M9) Main", player), lambda state:
state.has("Military Base (E1M9)", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Shotgun", player, 1))
set_rule(world.get_entrance("Military Base (E1M9) Main -> Military Base (E1M9) Blue", player), lambda state:
state.has("Military Base (E1M9) - Blue keycard", player, 1))
set_rule(world.get_entrance("Military Base (E1M9) Main -> Military Base (E1M9) Yellow", player), lambda state:
state.has("Military Base (E1M9) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Military Base (E1M9) Main -> Military Base (E1M9) Red", player), lambda state:
state.has("Military Base (E1M9) - Red keycard", player, 1))
set_rule(world.get_entrance("Military Base (E1M9) Blue -> Military Base (E1M9) Main", player), lambda state:
state.has("Military Base (E1M9) - Blue keycard", player, 1))
set_rule(world.get_entrance("Military Base (E1M9) Yellow -> Military Base (E1M9) Main", player), lambda state:
state.has("Military Base (E1M9) - Yellow keycard", player, 1))
# Deimos Anomaly (E2M1) - E2M1
set_rule(world.get_entrance("Mars -> Deimos Anomaly (E2M1) Blue", player), lambda state: state.has("Deimos Anomaly (E2M1)", player, 1) and (state.has("Deimos Anomaly (E2M1) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Deimos Anomaly (E2M1) Main", player), lambda state: state.has("Deimos Anomaly (E2M1)", player, 1))
set_rule(world.get_entrance("Mars -> Deimos Anomaly (E2M1) Red", player), lambda state: state.has("Deimos Anomaly (E2M1)", player, 1) and (state.has("Deimos Anomaly (E2M1) - Red keycard", player, 1)))
# Deimos Anomaly (E2M1)
set_rule(world.get_entrance("Hub -> Deimos Anomaly (E2M1) Main", player), lambda state:
state.has("Deimos Anomaly (E2M1)", player, 1))
set_rule(world.get_entrance("Deimos Anomaly (E2M1) Main -> Deimos Anomaly (E2M1) Red", player), lambda state:
state.has("Deimos Anomaly (E2M1) - Red keycard", player, 1))
set_rule(world.get_entrance("Deimos Anomaly (E2M1) Main -> Deimos Anomaly (E2M1) Blue", player), lambda state:
state.has("Deimos Anomaly (E2M1) - Blue keycard", player, 1))
set_rule(world.get_entrance("Deimos Anomaly (E2M1) Blue -> Deimos Anomaly (E2M1) Main", player), lambda state:
state.has("Deimos Anomaly (E2M1) - Blue keycard", player, 1))
set_rule(world.get_entrance("Deimos Anomaly (E2M1) Red -> Deimos Anomaly (E2M1) Main", player), lambda state:
state.has("Deimos Anomaly (E2M1) - Red keycard", player, 1))
# Containment Area (E2M2) - E2M2
set_rule(world.get_entrance("Mars -> Containment Area (E2M2) Blue", player), lambda state: state.has("Containment Area (E2M2)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Containment Area (E2M2) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Containment Area (E2M2) Main", player), lambda state: state.has("Containment Area (E2M2)", player, 1) and state.has("Shotgun", player, 1))
set_rule(world.get_entrance("Mars -> Containment Area (E2M2) Red", player), lambda state: state.has("Containment Area (E2M2)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Containment Area (E2M2) - Red keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Containment Area (E2M2) Yellow", player), lambda state: state.has("Containment Area (E2M2)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Containment Area (E2M2) - Yellow keycard", player, 1)))
# Containment Area (E2M2)
set_rule(world.get_entrance("Hub -> Containment Area (E2M2) Main", player), lambda state:
(state.has("Containment Area (E2M2)", player, 1) and
state.has("Shotgun", player, 1)) and
(state.has("Chaingun", player, 1) or
state.has("Plasma gun", player, 1)))
set_rule(world.get_entrance("Containment Area (E2M2) Main -> Containment Area (E2M2) Yellow", player), lambda state:
state.has("Containment Area (E2M2) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Containment Area (E2M2) Main -> Containment Area (E2M2) Blue", player), lambda state:
state.has("Containment Area (E2M2) - Blue keycard", player, 1))
set_rule(world.get_entrance("Containment Area (E2M2) Main -> Containment Area (E2M2) Red", player), lambda state:
state.has("Containment Area (E2M2) - Red keycard", player, 1))
set_rule(world.get_entrance("Containment Area (E2M2) Blue -> Containment Area (E2M2) Main", player), lambda state:
state.has("Containment Area (E2M2) - Blue keycard", player, 1))
set_rule(world.get_entrance("Containment Area (E2M2) Red -> Containment Area (E2M2) Main", player), lambda state:
state.has("Containment Area (E2M2) - Red keycard", player, 1))
# Refinery (E2M3) - E2M3
set_rule(world.get_entrance("Mars -> Refinery (E2M3) Blue", player), lambda state: state.has("Refinery (E2M3)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Refinery (E2M3) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Refinery (E2M3) Main", player), lambda state: state.has("Refinery (E2M3)", player, 1) and state.has("Shotgun", player, 1))
# Refinery (E2M3)
set_rule(world.get_entrance("Hub -> Refinery (E2M3) Main", player), lambda state:
(state.has("Refinery (E2M3)", player, 1) and
state.has("Shotgun", player, 1)) and
(state.has("Chaingun", player, 1) or
state.has("Plasma gun", player, 1)))
set_rule(world.get_entrance("Refinery (E2M3) Main -> Refinery (E2M3) Blue", player), lambda state:
state.has("Refinery (E2M3) - Blue keycard", player, 1))
set_rule(world.get_entrance("Refinery (E2M3) Blue -> Refinery (E2M3) Main", player), lambda state:
state.has("Refinery (E2M3) - Blue keycard", player, 1))
# Deimos Lab (E2M4) - E2M4
set_rule(world.get_entrance("Mars -> Deimos Lab (E2M4) Blue", 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("Deimos Lab (E2M4) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Deimos Lab (E2M4) Blue Yellow", 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("Deimos Lab (E2M4) - Blue keycard", player, 1)and state.has("Deimos Lab (E2M4) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Mars -> 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))
# Deimos Lab (E2M4)
set_rule(world.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(world.get_entrance("Deimos Lab (E2M4) Main -> Deimos Lab (E2M4) Blue", player), lambda state:
state.has("Deimos Lab (E2M4) - Blue keycard", player, 1))
set_rule(world.get_entrance("Deimos Lab (E2M4) Blue -> Deimos Lab (E2M4) Yellow", player), lambda state:
state.has("Deimos Lab (E2M4) - Yellow keycard", player, 1))
# Command Center (E2M5) - E2M5
set_rule(world.get_entrance("Mars -> Command Center (E2M5) Main", player), lambda state: state.has("Command Center (E2M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
# Command Center (E2M5)
set_rule(world.get_entrance("Hub -> Command Center (E2M5) Main", player), lambda state:
state.has("Command Center (E2M5)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Plasma gun", player, 1))
# Halls of the Damned (E2M6) - E2M6
set_rule(world.get_entrance("Mars -> Halls of the Damned (E2M6) Blue Yellow Red", player), lambda state: state.has("Halls of the Damned (E2M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1)and state.has("Halls of the Damned (E2M6) - Red skull key", player, 1)and state.has("Halls of the Damned (E2M6) - Blue skull key", player, 1)and state.has("Halls of the Damned (E2M6) - Yellow skull key", player, 1))
set_rule(world.get_entrance("Mars -> Halls of the Damned (E2M6) Main", player), lambda state: state.has("Halls of the Damned (E2M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Halls of the Damned (E2M6) Yellow", player), lambda state: state.has("Halls of the Damned (E2M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Halls of the Damned (E2M6) - Yellow skull key", player, 1)))
# Halls of the Damned (E2M6)
set_rule(world.get_entrance("Hub -> Halls of the Damned (E2M6) Main", player), lambda state:
state.has("Halls of the Damned (E2M6)", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Plasma gun", player, 1))
set_rule(world.get_entrance("Halls of the Damned (E2M6) Main -> Halls of the Damned (E2M6) Blue Yellow Red", player), lambda state:
state.has("Halls of the Damned (E2M6) - Blue skull key", player, 1) and
state.has("Halls of the Damned (E2M6) - Yellow skull key", player, 1) and
state.has("Halls of the Damned (E2M6) - Red skull key", player, 1))
set_rule(world.get_entrance("Halls of the Damned (E2M6) Main -> Halls of the Damned (E2M6) Yellow", player), lambda state:
state.has("Halls of the Damned (E2M6) - Yellow skull key", player, 1))
set_rule(world.get_entrance("Halls of the Damned (E2M6) Blue Yellow Red -> Halls of the Damned (E2M6) Main", player), lambda state:
state.has("Halls of the Damned (E2M6) - Blue skull key", player, 1) and
state.has("Halls of the Damned (E2M6) - Yellow skull key", player, 1) and
state.has("Halls of the Damned (E2M6) - Red skull key", player, 1))
set_rule(world.get_entrance("Halls of the Damned (E2M6) One way Yellow -> Halls of the Damned (E2M6) Main", player), lambda state:
state.has("Halls of the Damned (E2M6) - Yellow skull key", player, 1))
# Spawning Vats (E2M7) - E2M7
set_rule(world.get_entrance("Mars -> Spawning Vats (E2M7) Blue", player), lambda state: state.has("Spawning Vats (E2M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Spawning Vats (E2M7) - Blue keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Spawning Vats (E2M7) Blue Red", player), lambda state: state.has("Spawning Vats (E2M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1)and state.has("Spawning Vats (E2M7) - Blue keycard", player, 1)and state.has("Spawning Vats (E2M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Mars -> Spawning Vats (E2M7) Main", player), lambda state: state.has("Spawning Vats (E2M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Spawning Vats (E2M7) Red", player), lambda state: state.has("Spawning Vats (E2M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Spawning Vats (E2M7) - Red keycard", player, 1)))
set_rule(world.get_entrance("Mars -> Spawning Vats (E2M7) Yellow", player), lambda state: state.has("Spawning Vats (E2M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Spawning Vats (E2M7) - Yellow keycard", player, 1)))
# Spawning Vats (E2M7)
set_rule(world.get_entrance("Hub -> Spawning Vats (E2M7) Main", player), lambda state:
state.has("Spawning Vats (E2M7)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Plasma gun", player, 1) and
state.has("Rocket launcher", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Main -> Spawning Vats (E2M7) Blue", player), lambda state:
state.has("Spawning Vats (E2M7) - Blue keycard", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Main -> Spawning Vats (E2M7) Entrance Secret", player), lambda state:
state.has("Spawning Vats (E2M7) - Blue keycard", player, 1) and
state.has("Spawning Vats (E2M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Main -> Spawning Vats (E2M7) Red", player), lambda state:
state.has("Spawning Vats (E2M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Main -> Spawning Vats (E2M7) Yellow", player), lambda state:
state.has("Spawning Vats (E2M7) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Yellow -> Spawning Vats (E2M7) Main", player), lambda state:
state.has("Spawning Vats (E2M7) - Yellow keycard", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Red -> Spawning Vats (E2M7) Main", player), lambda state:
state.has("Spawning Vats (E2M7) - Red keycard", player, 1))
set_rule(world.get_entrance("Spawning Vats (E2M7) Entrance Secret -> Spawning Vats (E2M7) Main", player), lambda state:
state.has("Spawning Vats (E2M7) - Blue keycard", player, 1) and
state.has("Spawning Vats (E2M7) - Red keycard", player, 1))
# Tower of Babel (E2M8) - E2M8
set_rule(world.get_entrance("Mars -> 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 state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1)))
# Tower of Babel (E2M8)
set_rule(world.get_entrance("Hub -> Tower of Babel (E2M8) Main", player), lambda state:
state.has("Tower of Babel (E2M8)", player, 1))
# Fortress of Mystery (E2M9) - E2M9
set_rule(world.get_entrance("Mars -> Fortress of Mystery (E2M9) Blue", player), lambda state: state.has("Fortress of Mystery (E2M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Fortress of Mystery (E2M9) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Fortress of Mystery (E2M9) Main", player), lambda state: state.has("Fortress of Mystery (E2M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Fortress of Mystery (E2M9) Red", player), lambda state: state.has("Fortress of Mystery (E2M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Fortress of Mystery (E2M9) - Red skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Fortress of Mystery (E2M9) Yellow", player), lambda state: state.has("Fortress of Mystery (E2M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Fortress of Mystery (E2M9) - Yellow skull key", player, 1)))
# Fortress of Mystery (E2M9)
set_rule(world.get_entrance("Hub -> Fortress of Mystery (E2M9) Main", player), lambda state:
(state.has("Fortress of Mystery (E2M9)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1)) and
(state.has("Rocket launcher", player, 1) or
state.has("Plasma gun", player, 1) or
state.has("BFG9000", player, 1)))
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Main -> Fortress of Mystery (E2M9) Blue", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Blue skull key", player, 1))
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Main -> Fortress of Mystery (E2M9) Red", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Red skull key", player, 1))
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Main -> Fortress of Mystery (E2M9) Yellow", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Yellow skull key", player, 1))
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Blue -> Fortress of Mystery (E2M9) Main", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Blue skull key", player, 1))
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Red -> Fortress of Mystery (E2M9) Main", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Red skull key", player, 1))
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Yellow -> Fortress of Mystery (E2M9) Main", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Yellow skull key", player, 1))
# Hell Keep (E3M1) - E3M1
set_rule(world.get_entrance("Mars -> Hell Keep (E3M1) Main", player), lambda state: state.has("Hell Keep (E3M1)", player, 1))
set_rule(world.get_entrance("Mars -> Hell Keep (E3M1) Narrow", player), lambda state: state.has("Hell Keep (E3M1)", player, 1) and (state.has("Shotgun", player, 1) or state.has("Chaingun", player, 1)))
# Hell Keep (E3M1)
set_rule(world.get_entrance("Hub -> Hell Keep (E3M1) Main", player), lambda state:
state.has("Hell Keep (E3M1)", player, 1))
set_rule(world.get_entrance("Hell Keep (E3M1) Main -> Hell Keep (E3M1) Narrow", player), lambda state:
state.has("Chaingun", player, 1) or
state.has("Shotgun", player, 1))
# Slough of Despair (E3M2) - E3M2
set_rule(world.get_entrance("Mars -> Slough of Despair (E3M2) Blue", player), lambda state: state.has("Slough of Despair (E3M2)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Slough of Despair (E3M2) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Slough of Despair (E3M2) Main", player), lambda state: state.has("Slough of Despair (E3M2)", player, 1) and state.has("Shotgun", player, 1))
# Slough of Despair (E3M2)
set_rule(world.get_entrance("Hub -> Slough of Despair (E3M2) Main", player), lambda state:
(state.has("Slough of Despair (E3M2)", player, 1)) and
(state.has("Shotgun", player, 1) or
state.has("Chaingun", player, 1)))
set_rule(world.get_entrance("Slough of Despair (E3M2) Main -> Slough of Despair (E3M2) Blue", player), lambda state:
state.has("Slough of Despair (E3M2) - Blue skull key", player, 1))
set_rule(world.get_entrance("Slough of Despair (E3M2) Blue -> Slough of Despair (E3M2) Main", player), lambda state:
state.has("Slough of Despair (E3M2) - Blue skull key", player, 1))
# Pandemonium (E3M3) - E3M3
set_rule(world.get_entrance("Mars -> Pandemonium (E3M3) Blue", player), lambda state: state.has("Pandemonium (E3M3)", player, 1) and state.has("Shotgun", player, 1) and (state.has("Pandemonium (E3M3) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Pandemonium (E3M3) Main", player), lambda state: state.has("Pandemonium (E3M3)", player, 1) and state.has("Shotgun", player, 1))
# Pandemonium (E3M3)
set_rule(world.get_entrance("Hub -> Pandemonium (E3M3) Main", player), lambda state:
(state.has("Pandemonium (E3M3)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1)) and
(state.has("Rocket launcher", player, 1) or
state.has("Plasma gun", player, 1) or
state.has("BFG9000", player, 1)))
set_rule(world.get_entrance("Pandemonium (E3M3) Main -> Pandemonium (E3M3) Blue", player), lambda state:
state.has("Pandemonium (E3M3) - Blue skull key", player, 1))
set_rule(world.get_entrance("Pandemonium (E3M3) Blue -> Pandemonium (E3M3) Main", player), lambda state:
state.has("Pandemonium (E3M3) - Blue skull key", player, 1))
# House of Pain (E3M4) - E3M4
set_rule(world.get_entrance("Mars -> House of Pain (E3M4) Blue", player), lambda state: state.has("House of Pain (E3M4)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("House of Pain (E3M4) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> House of Pain (E3M4) Blue Red", player), lambda state: state.has("House of Pain (E3M4)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1)and state.has("House of Pain (E3M4) - Red skull key", player, 1)and state.has("House of Pain (E3M4) - Blue skull key", player, 1))
set_rule(world.get_entrance("Mars -> House of Pain (E3M4) Blue Yellow", player), lambda state: state.has("House of Pain (E3M4)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1)and state.has("House of Pain (E3M4) - Yellow skull key", player, 1)and state.has("House of Pain (E3M4) - Blue skull key", player, 1))
set_rule(world.get_entrance("Mars -> House of Pain (E3M4) Main", player), lambda state: state.has("House of Pain (E3M4)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
# House of Pain (E3M4)
set_rule(world.get_entrance("Hub -> House of Pain (E3M4) Main", player), lambda state:
(state.has("House of Pain (E3M4)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1)) and
(state.has("Rocket launcher", player, 1) or
state.has("Plasma gun", player, 1) or
state.has("BFG9000", player, 1)))
set_rule(world.get_entrance("House of Pain (E3M4) Main -> House of Pain (E3M4) Blue", player), lambda state:
state.has("House of Pain (E3M4) - Blue skull key", player, 1))
set_rule(world.get_entrance("House of Pain (E3M4) Blue -> House of Pain (E3M4) Main", player), lambda state:
state.has("House of Pain (E3M4) - Blue skull key", player, 1))
set_rule(world.get_entrance("House of Pain (E3M4) Blue -> House of Pain (E3M4) Yellow", player), lambda state:
state.has("House of Pain (E3M4) - Yellow skull key", player, 1))
set_rule(world.get_entrance("House of Pain (E3M4) Blue -> House of Pain (E3M4) Red", player), lambda state:
state.has("House of Pain (E3M4) - Red skull key", player, 1))
set_rule(world.get_entrance("House of Pain (E3M4) Red -> House of Pain (E3M4) Blue", player), lambda state:
state.has("House of Pain (E3M4) - Red skull key", player, 1))
set_rule(world.get_entrance("House of Pain (E3M4) Yellow -> House of Pain (E3M4) Blue", player), lambda state:
state.has("House of Pain (E3M4) - Yellow skull key", player, 1))
# Unholy Cathedral (E3M5) - E3M5
set_rule(world.get_entrance("Mars -> Unholy Cathedral (E3M5) Blue", player), lambda state: state.has("Unholy Cathedral (E3M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Unholy Cathedral (E3M5) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Unholy Cathedral (E3M5) Main", player), lambda state: state.has("Unholy Cathedral (E3M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Unholy Cathedral (E3M5) Yellow", player), lambda state: state.has("Unholy Cathedral (E3M5)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Unholy Cathedral (E3M5) - Yellow skull key", player, 1)))
# Unholy Cathedral (E3M5)
set_rule(world.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(world.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(world.get_entrance("Unholy Cathedral (E3M5) Main -> Unholy Cathedral (E3M5) Blue", player), lambda state:
state.has("Unholy Cathedral (E3M5) - Blue skull key", player, 1))
set_rule(world.get_entrance("Unholy Cathedral (E3M5) Blue -> Unholy Cathedral (E3M5) Main", player), lambda state:
state.has("Unholy Cathedral (E3M5) - Blue skull key", player, 1))
set_rule(world.get_entrance("Unholy Cathedral (E3M5) Yellow -> Unholy Cathedral (E3M5) Main", player), lambda state:
state.has("Unholy Cathedral (E3M5) - Yellow skull key", player, 1))
# Mt. Erebus (E3M6) - E3M6
set_rule(world.get_entrance("Mars -> Mt. Erebus (E3M6) Blue", player), lambda state: state.has("Mt. Erebus (E3M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Mt. Erebus (E3M6) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Mt. Erebus (E3M6) Main", player), lambda state: state.has("Mt. Erebus (E3M6)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
# Mt. Erebus (E3M6)
set_rule(world.get_entrance("Hub -> Mt. Erebus (E3M6) Main", player), lambda state:
state.has("Mt. Erebus (E3M6)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mt. Erebus (E3M6) Main -> Mt. Erebus (E3M6) Blue", player), lambda state:
state.has("Mt. Erebus (E3M6) - Blue skull key", player, 1))
set_rule(world.get_entrance("Mt. Erebus (E3M6) Blue -> Mt. Erebus (E3M6) Main", player), lambda state:
state.has("Mt. Erebus (E3M6) - Blue skull key", player, 1))
# Limbo (E3M7) - E3M7
set_rule(world.get_entrance("Mars -> Limbo (E3M7) Blue", player), lambda state: state.has("Limbo (E3M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Limbo (E3M7) - Blue skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Limbo (E3M7) Main", player), lambda state: state.has("Limbo (E3M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1))
set_rule(world.get_entrance("Mars -> Limbo (E3M7) Red", player), lambda state: state.has("Limbo (E3M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Limbo (E3M7) - Red skull key", player, 1)))
set_rule(world.get_entrance("Mars -> Limbo (E3M7) Yellow Red", player), lambda state: state.has("Limbo (E3M7)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Limbo (E3M7) - Yellow skull key", player, 1) or state.has("Limbo (E3M7) - Red skull key", player, 1)))
# Limbo (E3M7)
set_rule(world.get_entrance("Hub -> Limbo (E3M7) Main", player), lambda state:
(state.has("Limbo (E3M7)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1)) and
(state.has("Rocket launcher", player, 1) or
state.has("Plasma gun", player, 1) or
state.has("BFG9000", player, 1)))
set_rule(world.get_entrance("Limbo (E3M7) Main -> Limbo (E3M7) Red", player), lambda state:
state.has("Limbo (E3M7) - Red skull key", player, 1))
set_rule(world.get_entrance("Limbo (E3M7) Main -> Limbo (E3M7) Blue", player), lambda state:
state.has("Limbo (E3M7) - Blue skull key", player, 1))
set_rule(world.get_entrance("Limbo (E3M7) Red -> Limbo (E3M7) Yellow", player), lambda state:
state.has("Limbo (E3M7) - Yellow skull key", player, 1))
# Dis (E3M8) - E3M8
set_rule(world.get_entrance("Mars -> Dis (E3M8) Main", player), lambda state: state.has("Dis (E3M8)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Rocket launcher", player, 1) or state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1)))
# Dis (E3M8)
set_rule(world.get_entrance("Hub -> Dis (E3M8) Main", player), lambda state:
(state.has("Dis (E3M8)", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Shotgun", player, 1)) and
(state.has("Plasma gun", player, 1) or
state.has("BFG9000", player, 1) or
state.has("Rocket launcher", player, 1)))
# Warrens (E3M9) - E3M9
set_rule(world.get_entrance("Mars -> Warrens (E3M9) Main", player), lambda state: state.has("Warrens (E3M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Rocket launcher", player, 1) or state.has("Plasma gun", player, 1) or state.has("BFG9000", player, 1)))
set_rule(world.get_entrance("Mars -> Warrens (E3M9) Red", player), lambda state: state.has("Warrens (E3M9)", player, 1) and state.has("Shotgun", player, 1) and state.has("Chaingun", player, 1) and (state.has("Warrens (E3M9) - Red skull key", player, 1)))
# Warrens (E3M9)
set_rule(world.get_entrance("Hub -> Warrens (E3M9) Main", player), lambda state:
(state.has("Warrens (E3M9)", player, 1) and
state.has("Shotgun", player, 1) and
state.has("Chaingun", player, 1) and
state.has("Plasma gun", player, 1)) and
(state.has("Rocket launcher", player, 1) or
state.has("BFG9000", player, 1)))
set_rule(world.get_entrance("Warrens (E3M9) Main -> Warrens (E3M9) Red", player), lambda state:
state.has("Warrens (E3M9) - Red skull key", player, 1))
set_rule(world.get_entrance("Warrens (E3M9) Main -> Warrens (E3M9) Blue trigger", player), lambda state:
state.has("Warrens (E3M9) - Blue skull key", player, 1))
set_rule(world.get_entrance("Warrens (E3M9) Red -> Warrens (E3M9) Main", player), lambda state:
state.has("Warrens (E3M9) - Red skull key", player, 1))
set_rule(world.get_entrance("Warrens (E3M9) Blue -> Warrens (E3M9) Main", player), lambda state:
state.has("Warrens (E3M9) - Blue skull key", player, 1))
set_rule(world.get_entrance("Warrens (E3M9) Blue trigger -> Warrens (E3M9) Main", player), lambda state:
state.has("Warrens (E3M9) - Blue skull key", player, 1))

View File

@ -2,12 +2,15 @@ import functools
import logging
from typing import Any, Dict, List
from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region, Tutorial
from BaseClasses import Entrance, CollectionState, Item, ItemClassification, Location, MultiWorld, Region, Tutorial
from worlds.AutoWorld import WebWorld, World
from . import Events, Items, Locations, Options, Regions, Rules
from . import Items, Locations, Maps, Options, Regions, Rules
logger = logging.getLogger("DOOM 1993")
DOOM_TYPE_LEVEL_COMPLETE = -2
DOOM_TYPE_COMPUTER_AREA_MAP = 2026
class DOOM1993Location(Location):
game: str = "DOOM 1993"
@ -37,7 +40,7 @@ class DOOM1993World(World):
option_definitions = Options.options
game = "DOOM 1993"
web = DOOM1993Web()
data_version = 1
data_version = 2
required_client_version = (0, 3, 9)
item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()}
@ -88,36 +91,59 @@ class DOOM1993World(World):
def create_regions(self):
# Main regions
menu_region = Region("Menu", self.player, self.multiworld)
mars_region = Region("Mars", self.player, self.multiworld)
self.multiworld.regions += [menu_region, mars_region]
menu_region.add_exits(["Mars"])
hub_region = Region("Hub", self.player, self.multiworld)
self.multiworld.regions += [menu_region, hub_region]
menu_region.add_exits(["Hub"])
# Create regions and locations
for region_name in Regions.regions:
main_regions = []
connections = []
for region_dict in Regions.regions:
region_name = region_dict["name"]
if region_dict["connects_to_hub"]:
main_regions.append(region_name)
region = Region(region_name, self.player, self.multiworld)
region.add_locations({
loc["name"]: (loc_id if loc["index"] != -1 else None)
loc["name"]: loc_id
for loc_id, loc in Locations.location_table.items()
if loc["region"] == region_name and self.included_episodes[loc["episode"] - 1]
}, DOOM1993Location)
self.multiworld.regions.append(region)
# Link all regions to Mars
mars_region.add_exits(Regions.regions)
for connection in region_dict["connections"]:
connections.append((region, connection))
# Connect main regions to Hub
hub_region.add_exits(main_regions)
# Do the other connections between regions (They are not all both ways)
for connection in connections:
source = connection[0]
target = self.multiworld.get_region(connection[1], self.player)
entrance = Entrance(self.player, f"{source.name} -> {target.name}", source)
source.exits.append(entrance)
entrance.connect(target)
# Sum locations for items creation
self.location_count = len(self.multiworld.get_locations(self.player))
def completion_rule(self, state: CollectionState):
for event in Events.events:
if event not in self.location_name_to_id:
for map_name in Maps.map_names:
if map_name + " - Exit" not in self.location_name_to_id:
continue
loc = Locations.location_table[self.location_name_to_id[event]]
# Exit location names are in form: Hangar (E1M1) - Exit
loc = Locations.location_table[self.location_name_to_id[map_name + " - Exit"]]
if not self.included_episodes[loc["episode"] - 1]:
continue
if not state.has(event, self.player, 1):
# Map complete item names are in form: Hangar (E1M1) - Complete
if not state.has(map_name + " - Complete", self.player, 1):
return False
return True
def set_rules(self):
@ -126,16 +152,14 @@ class DOOM1993World(World):
# Forbid progression items to locations that can be missed and can't be picked up. (e.g. One-time timed
# platform) Unless the user allows for it.
if getattr(self.multiworld, "allow_death_logic")[self.player]:
self.multiworld.exclude_locations[self.player] += set(Locations.death_logic_locations)
if not getattr(self.multiworld, "allow_death_logic")[self.player].value:
for death_logic_location in Locations.death_logic_locations:
self.multiworld.exclude_locations[self.player].value.add(death_logic_location)
def create_item(self, name: str) -> DOOM1993Item:
item_id: int = self.item_name_to_id[name]
return DOOM1993Item(name, Items.item_table[item_id]["classification"], item_id, self.player)
def create_event(self, name: str) -> DOOM1993Item:
return DOOM1993Item(name, ItemClassification.progression, None, self.player)
def place_locked_item_in_locations(self, item_name, locations):
location = self.multiworld.random.choice(locations)
self.multiworld.get_location(location, self.player).place_locked_item(self.create_item(item_name))
@ -144,14 +168,21 @@ class DOOM1993World(World):
def create_items(self):
is_only_first_episode: bool = self.get_episode_count() == 1 and self.included_episodes[0]
itempool: List[DOOM1993Item] = []
start_with_computer_area_maps: bool = getattr(self.multiworld, "start_with_computer_area_maps")[self.player].value
# Items
for item_id, item in Items.item_table.items():
if item["doom_type"] == DOOM_TYPE_LEVEL_COMPLETE:
continue # We'll fill it manually later
if item["doom_type"] == DOOM_TYPE_COMPUTER_AREA_MAP and start_with_computer_area_maps:
continue # We'll fill it manually, and we will put fillers in place
if item["episode"] != -1 and not self.included_episodes[item["episode"] - 1]:
continue
if item["name"] in {"BFG9000", "Plasma Gun"} and is_only_first_episode:
continue # Don't include those guns in first episode
continue # Don't include those guns if only first episode
if item["name"] in {"Warrens (E3M9) - Blue skull key", "Halls of the Damned (E2M6) - Yellow skull key"}:
continue
@ -160,15 +191,21 @@ class DOOM1993World(World):
itempool += [self.create_item(item["name"]) for _ in range(count)]
# Place end level items in locked locations
for event in Events.events:
if event not in self.location_name_to_id:
for map_name in Maps.map_names:
loc_name = map_name + " - Exit"
item_name = map_name + " - Complete"
if loc_name not in self.location_name_to_id:
continue
loc = Locations.location_table[self.location_name_to_id[event]]
if item_name not in self.item_name_to_id:
continue
loc = Locations.location_table[self.location_name_to_id[loc_name]]
if not self.included_episodes[loc["episode"] - 1]:
continue
self.multiworld.get_location(event, self.player).place_locked_item(self.create_event(event))
self.multiworld.get_location(loc_name, self.player).place_locked_item(self.create_item(item_name))
self.location_count -= 1
# Special case for E2M6 and E3M8, where you enter a normal door then get stuck behind with a key door.
@ -194,7 +231,13 @@ class DOOM1993World(World):
if self.included_episodes[i]:
self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i]))
# Fill the rest starting with weapons, powerups then fillers
# Give Computer area maps if option selected
if getattr(self.multiworld, "start_with_computer_area_maps")[self.player].value:
for item_id, item_dict in Items.item_table.items():
if item_dict["doom_type"] == DOOM_TYPE_COMPUTER_AREA_MAP:
self.multiworld.push_precollected(self.create_item(item_dict["name"]))
# Fill the rest starting with powerups, then fillers
self.create_ratioed_items("Armor", itempool)
self.create_ratioed_items("Mega Armor", itempool)
self.create_ratioed_items("Berserk", itempool)