DOOM 1993: implement new game (#1759)

* DOOM 1993: implement new game

* DOOM 1993 - Phar's cleanup to __init__.py
This commit is contained in:
David St-Louis 2023-07-02 11:34:55 -04:00 committed by GitHub
parent ee40312384
commit c321c5d256
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 3891 additions and 0 deletions

View File

@ -0,0 +1,34 @@
# 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',
]

734
worlds/doom_1993/Items.py Normal file
View File

@ -0,0 +1,734 @@
# This file is auto generated. More info: https://github.com/Daivuk/apdoom
from BaseClasses import ItemClassification
from typing import TypedDict, Dict, Set
class ItemDict(TypedDict, total=False):
classification: ItemClassification
count: int
name: str
doom_type: int # Unique numerical id used to spawn the item.
episode: int # Relevant if that item targets a specific level, like keycard or map reveal pickup.
map: int
item_table: Dict[int, ItemDict] = {
350000: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Hangar (E1M1)',
'doom_type': -1,
'episode': 1,
'map': 1},
350001: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Hangar (E1M1) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 1},
350002: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Nuclear Plant (E1M2)',
'doom_type': -1,
'episode': 1,
'map': 2},
350003: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Nuclear Plant (E1M2) - Red keycard',
'doom_type': 13,
'episode': 1,
'map': 2},
350004: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Nuclear Plant (E1M2) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 2},
350005: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Toxin Refinery (E1M3)',
'doom_type': -1,
'episode': 1,
'map': 3},
350006: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Toxin Refinery (E1M3) - Yellow keycard',
'doom_type': 6,
'episode': 1,
'map': 3},
350007: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Toxin Refinery (E1M3) - Blue keycard',
'doom_type': 5,
'episode': 1,
'map': 3},
350008: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Toxin Refinery (E1M3) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 3},
350009: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Command Control (E1M4)',
'doom_type': -1,
'episode': 1,
'map': 4},
350010: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Command Control (E1M4) - Yellow keycard',
'doom_type': 6,
'episode': 1,
'map': 4},
350011: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Command Control (E1M4) - Blue keycard',
'doom_type': 5,
'episode': 1,
'map': 4},
350012: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Command Control (E1M4) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 4},
350013: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Phobos Lab (E1M5)',
'doom_type': -1,
'episode': 1,
'map': 5},
350014: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Phobos Lab (E1M5) - Blue keycard',
'doom_type': 5,
'episode': 1,
'map': 5},
350015: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Phobos Lab (E1M5) - Yellow keycard',
'doom_type': 6,
'episode': 1,
'map': 5},
350016: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Phobos Lab (E1M5) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 5},
350017: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Central Processing (E1M6)',
'doom_type': -1,
'episode': 1,
'map': 6},
350018: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Central Processing (E1M6) - Blue keycard',
'doom_type': 5,
'episode': 1,
'map': 6},
350019: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Central Processing (E1M6) - Red keycard',
'doom_type': 13,
'episode': 1,
'map': 6},
350020: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Central Processing (E1M6) - Yellow keycard',
'doom_type': 6,
'episode': 1,
'map': 6},
350021: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Central Processing (E1M6) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 6},
350022: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Computer Station (E1M7)',
'doom_type': -1,
'episode': 1,
'map': 7},
350023: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Computer Station (E1M7) - Yellow keycard',
'doom_type': 6,
'episode': 1,
'map': 7},
350024: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Computer Station (E1M7) - Blue keycard',
'doom_type': 5,
'episode': 1,
'map': 7},
350025: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Computer Station (E1M7) - Red keycard',
'doom_type': 13,
'episode': 1,
'map': 7},
350026: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Computer Station (E1M7) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 7},
350027: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Phobos Anomaly (E1M8)',
'doom_type': -1,
'episode': 1,
'map': 8},
350028: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Phobos Anomaly (E1M8) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 8},
350029: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Military Base (E1M9)',
'doom_type': -1,
'episode': 1,
'map': 9},
350030: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Military Base (E1M9) - Yellow keycard',
'doom_type': 6,
'episode': 1,
'map': 9},
350031: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Military Base (E1M9) - Red keycard',
'doom_type': 13,
'episode': 1,
'map': 9},
350032: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Military Base (E1M9) - Blue keycard',
'doom_type': 5,
'episode': 1,
'map': 9},
350033: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Military Base (E1M9) - Computer area map',
'doom_type': 2026,
'episode': 1,
'map': 9},
350034: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Anomaly (E2M1)',
'doom_type': -1,
'episode': 2,
'map': 1},
350035: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Anomaly (E2M1) - Blue keycard',
'doom_type': 5,
'episode': 2,
'map': 1},
350036: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Anomaly (E2M1) - Red keycard',
'doom_type': 13,
'episode': 2,
'map': 1},
350037: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Deimos Anomaly (E2M1) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 1},
350038: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Containment Area (E2M2)',
'doom_type': -1,
'episode': 2,
'map': 2},
350039: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Containment Area (E2M2) - Blue keycard',
'doom_type': 5,
'episode': 2,
'map': 2},
350040: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Containment Area (E2M2) - Yellow keycard',
'doom_type': 6,
'episode': 2,
'map': 2},
350041: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Containment Area (E2M2) - Red keycard',
'doom_type': 13,
'episode': 2,
'map': 2},
350042: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Containment Area (E2M2) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 2},
350043: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Refinery (E2M3)',
'doom_type': -1,
'episode': 2,
'map': 3},
350044: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Refinery (E2M3) - Blue keycard',
'doom_type': 5,
'episode': 2,
'map': 3},
350045: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Refinery (E2M3) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 3},
350046: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Lab (E2M4)',
'doom_type': -1,
'episode': 2,
'map': 4},
350047: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Lab (E2M4) - Blue keycard',
'doom_type': 5,
'episode': 2,
'map': 4},
350048: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Deimos Lab (E2M4) - Yellow keycard',
'doom_type': 6,
'episode': 2,
'map': 4},
350049: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Deimos Lab (E2M4) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 4},
350050: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Command Center (E2M5)',
'doom_type': -1,
'episode': 2,
'map': 5},
350051: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Command Center (E2M5) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 5},
350052: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Halls of the Damned (E2M6)',
'doom_type': -1,
'episode': 2,
'map': 6},
350053: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Halls of the Damned (E2M6) - Blue skull key',
'doom_type': 40,
'episode': 2,
'map': 6},
350054: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Halls of the Damned (E2M6) - Yellow skull key',
'doom_type': 39,
'episode': 2,
'map': 6},
350055: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Halls of the Damned (E2M6) - Red skull key',
'doom_type': 38,
'episode': 2,
'map': 6},
350056: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Halls of the Damned (E2M6) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 6},
350057: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Spawning Vats (E2M7)',
'doom_type': -1,
'episode': 2,
'map': 7},
350058: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Spawning Vats (E2M7) - Red keycard',
'doom_type': 13,
'episode': 2,
'map': 7},
350059: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Spawning Vats (E2M7) - Yellow keycard',
'doom_type': 6,
'episode': 2,
'map': 7},
350060: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Spawning Vats (E2M7) - Blue keycard',
'doom_type': 5,
'episode': 2,
'map': 7},
350061: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Spawning Vats (E2M7) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 7},
350062: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Tower of Babel (E2M8)',
'doom_type': -1,
'episode': 2,
'map': 8},
350063: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Tower of Babel (E2M8) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 8},
350064: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Fortress of Mystery (E2M9)',
'doom_type': -1,
'episode': 2,
'map': 9},
350065: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Fortress of Mystery (E2M9) - Blue skull key',
'doom_type': 40,
'episode': 2,
'map': 9},
350066: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Fortress of Mystery (E2M9) - Red skull key',
'doom_type': 38,
'episode': 2,
'map': 9},
350067: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Fortress of Mystery (E2M9) - Yellow skull key',
'doom_type': 39,
'episode': 2,
'map': 9},
350068: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Fortress of Mystery (E2M9) - Computer area map',
'doom_type': 2026,
'episode': 2,
'map': 9},
350069: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Hell Keep (E3M1)',
'doom_type': -1,
'episode': 3,
'map': 1},
350070: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Hell Keep (E3M1) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 1},
350071: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Slough of Despair (E3M2)',
'doom_type': -1,
'episode': 3,
'map': 2},
350072: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Slough of Despair (E3M2) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 2},
350073: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Slough of Despair (E3M2) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 2},
350074: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Pandemonium (E3M3)',
'doom_type': -1,
'episode': 3,
'map': 3},
350075: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Pandemonium (E3M3) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 3},
350076: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Pandemonium (E3M3) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 3},
350077: {'classification': ItemClassification.progression,
'count': 1,
'name': 'House of Pain (E3M4)',
'doom_type': -1,
'episode': 3,
'map': 4},
350078: {'classification': ItemClassification.progression,
'count': 1,
'name': 'House of Pain (E3M4) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 4},
350079: {'classification': ItemClassification.progression,
'count': 1,
'name': 'House of Pain (E3M4) - Yellow skull key',
'doom_type': 39,
'episode': 3,
'map': 4},
350080: {'classification': ItemClassification.progression,
'count': 1,
'name': 'House of Pain (E3M4) - Red skull key',
'doom_type': 38,
'episode': 3,
'map': 4},
350081: {'classification': ItemClassification.filler,
'count': 1,
'name': 'House of Pain (E3M4) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 4},
350082: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Unholy Cathedral (E3M5)',
'doom_type': -1,
'episode': 3,
'map': 5},
350083: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Unholy Cathedral (E3M5) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 5},
350084: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Unholy Cathedral (E3M5) - Yellow skull key',
'doom_type': 39,
'episode': 3,
'map': 5},
350085: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Unholy Cathedral (E3M5) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 5},
350086: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Mt. Erebus (E3M6)',
'doom_type': -1,
'episode': 3,
'map': 6},
350087: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Mt. Erebus (E3M6) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 6},
350088: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Mt. Erebus (E3M6) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 6},
350089: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Limbo (E3M7)',
'doom_type': -1,
'episode': 3,
'map': 7},
350090: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Limbo (E3M7) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 7},
350091: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Limbo (E3M7) - Red skull key',
'doom_type': 38,
'episode': 3,
'map': 7},
350092: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Limbo (E3M7) - Yellow skull key',
'doom_type': 39,
'episode': 3,
'map': 7},
350093: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Limbo (E3M7) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 7},
350094: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Dis (E3M8)',
'doom_type': -1,
'episode': 3,
'map': 8},
350095: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Dis (E3M8) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 8},
350096: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Warrens (E3M9)',
'doom_type': -1,
'episode': 3,
'map': 9},
350097: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Warrens (E3M9) - Blue skull key',
'doom_type': 40,
'episode': 3,
'map': 9},
350098: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Warrens (E3M9) - Red skull key',
'doom_type': 38,
'episode': 3,
'map': 9},
350099: {'classification': ItemClassification.filler,
'count': 1,
'name': 'Warrens (E3M9) - Computer area map',
'doom_type': 2026,
'episode': 3,
'map': 9},
350100: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Shotgun',
'doom_type': 2001,
'episode': -1,
'map': -1},
350101: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Rocket launcher',
'doom_type': 2003,
'episode': -1,
'map': -1},
350102: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Plasma gun',
'doom_type': 2004,
'episode': -1,
'map': -1},
350103: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Chainsaw',
'doom_type': 2005,
'episode': -1,
'map': -1},
350104: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Chaingun',
'doom_type': 2002,
'episode': -1,
'map': -1},
350105: {'classification': ItemClassification.progression,
'count': 1,
'name': 'BFG9000',
'doom_type': 2006,
'episode': -1,
'map': -1},
350106: {'classification': ItemClassification.progression,
'count': 1,
'name': 'Backpack',
'doom_type': 8,
'episode': -1,
'map': -1},
350107: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Armor',
'doom_type': 2018,
'episode': -1,
'map': -1},
350108: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Mega Armor',
'doom_type': 2019,
'episode': -1,
'map': -1},
350109: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Berserk',
'doom_type': 2023,
'episode': -1,
'map': -1},
350110: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Invulnerability',
'doom_type': 2022,
'episode': -1,
'map': -1},
350111: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Partial invisibility',
'doom_type': 2024,
'episode': -1,
'map': -1},
350112: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Supercharge',
'doom_type': 2013,
'episode': -1,
'map': -1},
350113: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Medikit',
'doom_type': 2012,
'episode': -1,
'map': -1},
350114: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Box of bullets',
'doom_type': 2048,
'episode': -1,
'map': -1},
350115: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Box of rockets',
'doom_type': 2046,
'episode': -1,
'map': -1},
350116: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Box of shotgun shells',
'doom_type': 2049,
'episode': -1,
'map': -1},
350117: {'classification': ItemClassification.filler,
'count': 0,
'name': 'Energy cell pack',
'doom_type': 17,
'episode': -1,
'map': -1},
}
item_name_groups: Dict[str, Set[str]] = {
'Ammos': {'Box of bullets', 'Box of rockets', 'Box of shotgun shells', 'Energy cell pack', },
'Keys': {'Central Processing (E1M6) - Blue keycard', 'Central Processing (E1M6) - Red keycard', 'Central Processing (E1M6) - Yellow keycard', 'Command Control (E1M4) - Blue keycard', 'Command Control (E1M4) - Yellow keycard', 'Computer Station (E1M7) - Blue keycard', 'Computer Station (E1M7) - Red keycard', 'Computer Station (E1M7) - Yellow keycard', 'Containment Area (E2M2) - Blue keycard', 'Containment Area (E2M2) - Red keycard', 'Containment Area (E2M2) - Yellow keycard', 'Deimos Anomaly (E2M1) - Blue keycard', 'Deimos Anomaly (E2M1) - Red keycard', 'Deimos Lab (E2M4) - Blue keycard', 'Deimos Lab (E2M4) - Yellow keycard', 'Fortress of Mystery (E2M9) - Blue skull key', 'Fortress of Mystery (E2M9) - Red skull key', 'Fortress of Mystery (E2M9) - Yellow skull key', 'Halls of the Damned (E2M6) - Blue skull key', 'Halls of the Damned (E2M6) - Red skull key', 'Halls of the Damned (E2M6) - Yellow skull key', 'House of Pain (E3M4) - Blue skull key', 'House of Pain (E3M4) - Red skull key', 'House of Pain (E3M4) - Yellow skull key', 'Limbo (E3M7) - Blue skull key', 'Limbo (E3M7) - Red skull key', 'Limbo (E3M7) - Yellow skull key', 'Military Base (E1M9) - Blue keycard', 'Military Base (E1M9) - Red keycard', 'Military Base (E1M9) - Yellow keycard', 'Mt. Erebus (E3M6) - Blue skull key', 'Nuclear Plant (E1M2) - Red keycard', 'Pandemonium (E3M3) - Blue skull key', 'Phobos Lab (E1M5) - Blue keycard', 'Phobos Lab (E1M5) - Yellow keycard', 'Refinery (E2M3) - Blue keycard', 'Slough of Despair (E3M2) - Blue skull key', 'Spawning Vats (E2M7) - Blue keycard', 'Spawning Vats (E2M7) - Red keycard', 'Spawning Vats (E2M7) - Yellow keycard', 'Toxin Refinery (E1M3) - Blue keycard', 'Toxin Refinery (E1M3) - Yellow keycard', 'Unholy Cathedral (E3M5) - Blue skull key', 'Unholy Cathedral (E3M5) - Yellow skull key', 'Warrens (E3M9) - Blue skull key', 'Warrens (E3M9) - Red skull key', },
'Levels': {'Central Processing (E1M6)', 'Command Center (E2M5)', 'Command Control (E1M4)', 'Computer Station (E1M7)', 'Containment Area (E2M2)', 'Deimos Anomaly (E2M1)', 'Deimos Lab (E2M4)', 'Dis (E3M8)', 'Fortress of Mystery (E2M9)', 'Halls of the Damned (E2M6)', 'Hangar (E1M1)', 'Hell Keep (E3M1)', 'House of Pain (E3M4)', 'Limbo (E3M7)', 'Military Base (E1M9)', 'Mt. Erebus (E3M6)', 'Nuclear Plant (E1M2)', 'Pandemonium (E3M3)', 'Phobos Anomaly (E1M8)', 'Phobos Lab (E1M5)', 'Refinery (E2M3)', 'Slough of Despair (E3M2)', 'Spawning Vats (E2M7)', 'Tower of Babel (E2M8)', 'Toxin Refinery (E1M3)', 'Unholy Cathedral (E3M5)', 'Warrens (E3M9)', },
'Powerups': {'Armor', 'Berserk', 'Invulnerability', 'Mega Armor', 'Partial invisibility', 'Supercharge', },
'Weapons': {'BFG9000', 'Chaingun', 'Chainsaw', 'Plasma gun', 'Rocket launcher', 'Shotgun', },
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,87 @@
import typing
from Options import AssembleOptions, Choice, Toggle, DeathLink, DefaultOnToggle
class Difficulty(Choice):
"""
Choose the difficulty option. Those match DOOM's difficulty options.
baby (I'm too young to die.) double ammos, half damage, less monsters or strength.
easy (Hey, not too rough.) less monsters or strength.
medium (Hurt me plenty.) Default.
hard (Ultra-Violence.) More monsters or strength.
nightmare (Nightmare!) Monsters attack more rapidly and respawn.
"""
display_name = "Difficulty"
option_baby = 0
option_easy = 1
option_medium = 2
option_hard = 3
option_nightmare = 4
default = 2
class RandomMonsters(Choice):
"""
Choose how monsters are randomized.
vanilla: No randomization
shuffle: Monsters are shuffled within the level
random_balanced: Monsters are completely randomized, but balanced based on existing ratio in the level. (Small monsters vs medium vs big)
"""
display_name = "Random Monsters"
option_vanilla = 0
option_shuffle = 1
option_random_balanced = 2
default = 1
class RandomPickups(Choice):
"""
Choose how pickups are randomized.
vanilla: No randomization
shuffle: Pickups are shuffled within the level
random_balanced: Pickups are completely randomized, but balanced based on existing ratio in the level. (Small pickups vs Big)
"""
display_name = "Random Pickups"
option_vanilla = 0
option_shuffle = 1
option_random_balanced = 2
default = 1
class AllowDeathLogic(Toggle):
"""Some locations require a timed puzzle that can only be tried once.
After which, if the player failed to get it, the location cannot be checked anymore.
By default, no progression items are placed here. There is a way, hovewer, to still get them:
Get killed in the current map. The map will reset, you can now attempt the puzzle again."""
display_name = "Allow Death Logic"
class Episode1(DefaultOnToggle):
"""Knee-Deep in the Dead.
If none of the episodes are chosen, Episode 1 will be chosen by default."""
display_name = "Episode 1"
class Episode2(DefaultOnToggle):
"""The Shores of Hell
If none of the episodes are chosen, Episode 1 will be chosen by default."""
display_name = "Episode 2"
class Episode3(DefaultOnToggle):
"""Inferno
If none of the episodes are chosen, Episode 1 will be chosen by default."""
display_name = "Episode 3"
options: typing.Dict[str, AssembleOptions] = {
"difficulty": Difficulty,
"random_monsters": RandomMonsters,
"random_pickups": RandomPickups,
"allow_death_logic": AllowDeathLogic,
"death_link": DeathLink,
"episode1": Episode1,
"episode2": Episode2,
"episode3": Episode3
}

View File

@ -0,0 +1,80 @@
# This file is auto generated. More info: https://github.com/Daivuk/apdoom
from typing import List
from BaseClasses import Region, Entrance
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",
]

140
worlds/doom_1993/Rules.py Normal file
View File

@ -0,0 +1,140 @@
# This file is auto generated. More info: https://github.com/Daivuk/apdoom
from typing import TYPE_CHECKING
from worlds.generic.Rules import set_rule
if TYPE_CHECKING:
from . import DOOM1993World
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))
# 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)))
# 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))
# 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))
# 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)))
# 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)))
# 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))
# 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)))
# 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)))
# 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)))
# 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)))
# 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))
# 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))
# 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))
# 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)))
# 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)))
# 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)))
# 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)))
# 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)))
# 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))
# 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))
# 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))
# 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)))
# 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))
# 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)))
# 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)))
# 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)))

View File

@ -0,0 +1,234 @@
import functools
import logging
from typing import Any, Dict, List
from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region, Tutorial
from worlds.AutoWorld import WebWorld, World
from . import Events, Items, Locations, Options, Regions, Rules
logger = logging.getLogger("DOOM 1993")
class DOOM1993Location(Location):
game: str = "DOOM 1993"
class DOOM1993Item(Item):
game: str = "DOOM 1993"
class DOOM1993Web(WebWorld):
tutorials = [Tutorial(
"Multiworld Setup Guide",
"A guide to setting up the DOOM 1993 randomizer connected to an Archipelago Multiworld",
"English",
"setup_en.md",
"setup/en",
["Daivuk"]
)]
theme = "dirt"
class DOOM1993World(World):
"""
Developed by id Software, and originally released in 1993, DOOM pioneered and popularized the first-person shooter,
setting a standard for all FPS games.
"""
option_definitions = Options.options
game = "DOOM 1993"
web = DOOM1993Web()
data_version = 1
required_client_version = (0, 3, 9)
item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()}
item_name_groups = Items.item_name_groups
location_name_to_id = {data["name"]: loc_id for loc_id, data in Locations.location_table.items()}
location_name_groups = Locations.location_name_groups
starting_level_for_episode: List[str] = [
"Hangar (E1M1)",
"Deimos Anomaly (E2M1)",
"Hell Keep (E3M1)"
]
# Item ratio that scales depending on episode count. These are the ratio for 3 episode.
items_ratio: Dict[str, float] = {
"Armor": 41,
"Mega Armor": 25,
"Berserk": 12,
"Invulnerability": 10,
"Partial invisibility": 18,
"Supercharge": 28,
"Medikit": 15,
"Box of bullets": 13,
"Box of rockets": 13,
"Box of shotgun shells": 13,
"Energy cell pack": 10
}
def __init__(self, world: MultiWorld, player: int):
self.included_episodes = [1, 1, 1]
self.location_count = 0
super().__init__(world, player)
def get_episode_count(self):
return functools.reduce(lambda count, episode: count + episode, self.included_episodes)
def generate_early(self):
# Cache which episodes are included
for i in range(3):
self.included_episodes[i] = getattr(self.multiworld, f"episode{i + 1}")[self.player].value
# If no episodes selected, select Episode 1
if self.get_episode_count() == 0:
self.included_episodes[0] = 1
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"])
# Create regions and locations
for region_name in Regions.regions:
region = Region(region_name, self.player, self.multiworld)
region.add_locations({
loc["name"]: (loc_id if loc["index"] != -1 else None)
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)
# 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:
continue
loc = Locations.location_table[self.location_name_to_id[event]]
if not self.included_episodes[loc["episode"] - 1]:
continue
if not state.has(event, self.player, 1):
return False
return True
def set_rules(self):
Rules.set_rules(self)
self.multiworld.completion_condition[self.player] = lambda state: self.completion_rule(state)
# 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)
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))
self.location_count -= 1
def create_items(self):
is_only_first_episode: bool = self.get_episode_count() == 1 and self.included_episodes[0]
itempool: List[DOOM1993Item] = []
# Items
for item_id, item in Items.item_table.items():
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
if item["name"] in {"Warrens (E3M9) - Blue skull key", "Halls of the Damned (E2M6) - Yellow skull key"}:
continue
count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1
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:
continue
loc = Locations.location_table[self.location_name_to_id[event]]
if not self.included_episodes[loc["episode"] - 1]:
continue
self.multiworld.get_location(event, self.player).place_locked_item(self.create_event(event))
self.location_count -= 1
# Special case for E2M6 and E3M8, where you enter a normal door then get stuck behind with a key door.
# We need to put the key in the locations available behind this door.
if self.included_episodes[1]:
self.place_locked_item_in_locations("Halls of the Damned (E2M6) - Yellow skull key", [
"Halls of the Damned (E2M6) - Yellow skull key",
"Halls of the Damned (E2M6) - Partial invisibility 2"
])
if self.included_episodes[2]:
self.place_locked_item_in_locations("Warrens (E3M9) - Blue skull key", [
"Warrens (E3M9) - Rocket launcher",
"Warrens (E3M9) - Rocket launcher 2",
"Warrens (E3M9) - Partial invisibility",
"Warrens (E3M9) - Invulnerability",
"Warrens (E3M9) - Supercharge",
"Warrens (E3M9) - Berserk",
"Warrens (E3M9) - Chaingun"
])
# Give starting levels right away
for i in range(len(self.included_episodes)):
if self.included_episodes[i]:
self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i]))
# Fill the rest starting with weapons, powerups then fillers
self.create_ratioed_items("Armor", itempool)
self.create_ratioed_items("Mega Armor", itempool)
self.create_ratioed_items("Berserk", itempool)
self.create_ratioed_items("Invulnerability", itempool)
self.create_ratioed_items("Partial invisibility", itempool)
self.create_ratioed_items("Supercharge", itempool)
while len(itempool) < self.location_count:
itempool.append(self.create_item(self.get_filler_item_name()))
# add itempool to multiworld
self.multiworld.itempool += itempool
def get_filler_item_name(self):
return self.multiworld.random.choice([
"Medikit",
"Box of bullets",
"Box of rockets",
"Box of shotgun shells",
"Energy cell pack"
])
def create_ratioed_items(self, item_name: str, itempool: List[DOOM1993Item]):
remaining_loc = self.location_count - len(itempool)
ep_count = self.get_episode_count()
# Was balanced for 3 episodes
count = min(remaining_loc, max(1, int(round(self.items_ratio[item_name] * ep_count / 3))))
if count == 0:
logger.warning("Warning, no ", item_name, " will be placed.")
return
for i in range(count):
itempool.append(self.create_item(item_name))
def fill_slot_data(self) -> Dict[str, Any]:
return {name: getattr(self.multiworld, name)[self.player].value for name in self.option_definitions}

View File

@ -0,0 +1,23 @@
# DOOM 1993
## Where is the settings page?
The [player settings page](../player-settings) contains the options needed to configure your game session.
## What does randomization do to this game?
Guns, keycards, and level unlocks have been randomized. Typically, you will end up playing different levels out of order to find your keycards and level unlocks and eventually complete your game.
Maps can be selected on a level select screen. You can exit a level at any time by visiting the hub station at the beginning of each level. The state of each level is saved and restored upon re-entering the level.
## What is the goal?
The goal is to complete every level in the episodes you have chosen to play.
## What is a "check" in The DOOM 1993?
Guns, keycards, and powerups have been replaced with Archipelago checks. The switch at the end of each level is also a check.
## What "items" can you unlock in DOOM 1993?
Keycards and level unlocks are your main progression items. Gun unlocks and some upgrades are your useful items. Temporary powerups, ammo, healing, and armor are filler items.

View File

@ -0,0 +1,38 @@
# DOOM 1993 Randomizer Setup
## Required Software
- [DOOM 1993 (e.g. Steam version)](https://store.steampowered.com/app/2280/DOOM_1993/)
- [Archipelago Crispy DOOM](https://github.com/Daivuk/apdoom/releases)
## Optional Software
- [ArchipelagoTextClient](https://github.com/ArchipelagoMW/Archipelago/releases)
## Installing AP Doom
1. Download [APDOOM.zip](https://github.com/Daivuk/apdoom/releases) and extract it.
2. Copy DOOM.WAD from your steam install into the extracted folder.
You can find the folder in steam by finding the game in your library,
right clicking it and choosing *Manage→Browse Local Files*.
## Joining a MultiWorld Game
1. Launch APDoomLauncher.exe
2. Enter the Archipelago server address, slot name, and password (if you have one)
3. Press "Launch DOOM"
4. Enjoy!
To continue a game, follow the same connection steps.
Connecting with a different seed won't erase your progress in other seeds.
## Archipelago Text Client
We recommend having Archipelago's Text Client open on the side to keep track of what items you receive and send.
APDOOM has in-game messages,
but they disappear quickly and there's no reasonable way to check your message history in-game.
## Auto-Tracking
APDOOM has a functional map tracker integrated into the level select screen.
It tells you which levels you have unlocked, which keys you have for each level, which levels have been completed,
and how many of the checks you have completed in each level.