From 60ab767ba934c750361a5711979b6a6a98bf9ea1 Mon Sep 17 00:00:00 2001 From: Daivuk Date: Sat, 15 Apr 2023 08:04:54 -0400 Subject: [PATCH] DOOM 1993: implement new game --- worlds/doom_1993/Events.py | 34 + worlds/doom_1993/Items.py | 734 +++++++ worlds/doom_1993/Locations.py | 2521 +++++++++++++++++++++++++ worlds/doom_1993/Options.py | 87 + worlds/doom_1993/Regions.py | 80 + worlds/doom_1993/Rules.py | 140 ++ worlds/doom_1993/__init__.py | 287 +++ worlds/doom_1993/docs/en_DOOM 1993.md | 23 + worlds/doom_1993/docs/setup_en.md | 38 + 9 files changed, 3944 insertions(+) create mode 100644 worlds/doom_1993/Events.py create mode 100644 worlds/doom_1993/Items.py create mode 100644 worlds/doom_1993/Locations.py create mode 100644 worlds/doom_1993/Options.py create mode 100644 worlds/doom_1993/Regions.py create mode 100644 worlds/doom_1993/Rules.py create mode 100644 worlds/doom_1993/__init__.py create mode 100644 worlds/doom_1993/docs/en_DOOM 1993.md create mode 100644 worlds/doom_1993/docs/setup_en.md diff --git a/worlds/doom_1993/Events.py b/worlds/doom_1993/Events.py new file mode 100644 index 000000000000..0c451138a386 --- /dev/null +++ b/worlds/doom_1993/Events.py @@ -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', +] diff --git a/worlds/doom_1993/Items.py b/worlds/doom_1993/Items.py new file mode 100644 index 000000000000..fe662aeeeba7 --- /dev/null +++ b/worlds/doom_1993/Items.py @@ -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', }, +} diff --git a/worlds/doom_1993/Locations.py b/worlds/doom_1993/Locations.py new file mode 100644 index 000000000000..67abef16949c --- /dev/null +++ b/worlds/doom_1993/Locations.py @@ -0,0 +1,2521 @@ +# This file is auto generated. More info: https://github.com/Daivuk/apdoom + +from typing import Dict, TypedDict, List, Set + + +class LocationDict(TypedDict, total=False): + name: str + episode: int + map: int + index: int # Thing index as it is stored in the wad file. + doom_type: int # In case index end up unreliable, we can use doom type. Maps have often only one of each important things. + region: str + + +location_table: Dict[int, LocationDict] = { + 351000: {'name': 'Hangar (E1M1) - Mega Armor', + 'episode': 1, + 'map': 1, + 'index': 13, + 'doom_type': 2019, + 'region': "Hangar (E1M1) Main"}, + 351001: {'name': 'Hangar (E1M1) - Armor', + 'episode': 1, + 'map': 1, + 'index': 68, + 'doom_type': 2018, + 'region': "Hangar (E1M1) Main"}, + 351002: {'name': 'Hangar (E1M1) - Shotgun', + 'episode': 1, + 'map': 1, + 'index': 98, + 'doom_type': 2001, + 'region': "Hangar (E1M1) Main"}, + 351003: {'name': 'Nuclear Plant (E1M2) - Chainsaw', + 'episode': 1, + 'map': 2, + 'index': 4, + 'doom_type': 2005, + 'region': "Nuclear Plant (E1M2) Red"}, + 351004: {'name': 'Nuclear Plant (E1M2) - Shotgun', + 'episode': 1, + 'map': 2, + 'index': 5, + 'doom_type': 2001, + 'region': "Nuclear Plant (E1M2) Main"}, + 351005: {'name': 'Nuclear Plant (E1M2) - Armor', + 'episode': 1, + 'map': 2, + 'index': 20, + 'doom_type': 2018, + 'region': "Nuclear Plant (E1M2) Main"}, + 351006: {'name': 'Nuclear Plant (E1M2) - Supercharge', + 'episode': 1, + 'map': 2, + 'index': 22, + 'doom_type': 2013, + 'region': "Nuclear Plant (E1M2) Main"}, + 351007: {'name': 'Nuclear Plant (E1M2) - Chaingun', + 'episode': 1, + 'map': 2, + 'index': 25, + 'doom_type': 2002, + 'region': "Nuclear Plant (E1M2) Main"}, + 351008: {'name': 'Nuclear Plant (E1M2) - Red keycard', + 'episode': 1, + 'map': 2, + 'index': 41, + 'doom_type': 13, + 'region': "Nuclear Plant (E1M2) Main"}, + 351009: {'name': 'Nuclear Plant (E1M2) - Armor 2', + 'episode': 1, + 'map': 2, + 'index': 43, + 'doom_type': 2018, + 'region': "Nuclear Plant (E1M2) Main"}, + 351010: {'name': 'Nuclear Plant (E1M2) - Mega Armor', + 'episode': 1, + 'map': 2, + 'index': 53, + 'doom_type': 2019, + 'region': "Nuclear Plant (E1M2) Red"}, + 351011: {'name': 'Nuclear Plant (E1M2) - Armor 3', + 'episode': 1, + 'map': 2, + 'index': 119, + 'doom_type': 2018, + 'region': "Nuclear Plant (E1M2) Red"}, + 351012: {'name': 'Nuclear Plant (E1M2) - Backpack', + 'episode': 1, + 'map': 2, + 'index': 139, + 'doom_type': 8, + 'region': "Nuclear Plant (E1M2) Main"}, + 351013: {'name': 'Nuclear Plant (E1M2) - Backpack 2', + 'episode': 1, + 'map': 2, + 'index': 200, + 'doom_type': 8, + 'region': "Nuclear Plant (E1M2) Red"}, + 351014: {'name': 'Toxin Refinery (E1M3) - Armor', + 'episode': 1, + 'map': 3, + 'index': 8, + 'doom_type': 2018, + 'region': "Toxin Refinery (E1M3) Main"}, + 351015: {'name': 'Toxin Refinery (E1M3) - Supercharge', + 'episode': 1, + 'map': 3, + 'index': 9, + 'doom_type': 2013, + 'region': "Toxin Refinery (E1M3) Main"}, + 351016: {'name': 'Toxin Refinery (E1M3) - Yellow keycard', + 'episode': 1, + 'map': 3, + 'index': 18, + 'doom_type': 6, + 'region': "Toxin Refinery (E1M3) Main"}, + 351017: {'name': 'Toxin Refinery (E1M3) - Blue keycard', + 'episode': 1, + 'map': 3, + 'index': 19, + 'doom_type': 5, + 'region': "Toxin Refinery (E1M3) Main"}, + 351018: {'name': 'Toxin Refinery (E1M3) - Shotgun', + 'episode': 1, + 'map': 3, + 'index': 64, + 'doom_type': 2001, + 'region': "Toxin Refinery (E1M3) Main"}, + 351019: {'name': 'Toxin Refinery (E1M3) - Shotgun 2', + 'episode': 1, + 'map': 3, + 'index': 77, + 'doom_type': 2001, + 'region': "Toxin Refinery (E1M3) Main"}, + 351020: {'name': 'Toxin Refinery (E1M3) - Armor 2', + 'episode': 1, + 'map': 3, + 'index': 85, + 'doom_type': 2018, + 'region': "Toxin Refinery (E1M3) Main"}, + 351021: {'name': 'Toxin Refinery (E1M3) - Rocket launcher', + 'episode': 1, + 'map': 3, + 'index': 107, + 'doom_type': 2003, + 'region': "Toxin Refinery (E1M3) Main"}, + 351022: {'name': 'Toxin Refinery (E1M3) - Chaingun', + 'episode': 1, + 'map': 3, + 'index': 109, + 'doom_type': 2002, + 'region': "Toxin Refinery (E1M3) Main"}, + 351023: {'name': 'Toxin Refinery (E1M3) - Backpack', + 'episode': 1, + 'map': 3, + 'index': 112, + 'doom_type': 8, + 'region': "Toxin Refinery (E1M3) Main"}, + 351024: {'name': 'Toxin Refinery (E1M3) - Supercharge 2', + 'episode': 1, + 'map': 3, + 'index': 259, + 'doom_type': 2013, + 'region': "Toxin Refinery (E1M3) Yellow"}, + 351025: {'name': 'Toxin Refinery (E1M3) - Partial invisibility', + 'episode': 1, + 'map': 3, + 'index': 260, + 'doom_type': 2024, + 'region': "Toxin Refinery (E1M3) Yellow"}, + 351026: {'name': 'Toxin Refinery (E1M3) - Chainsaw', + 'episode': 1, + 'map': 3, + 'index': 261, + 'doom_type': 2005, + 'region': "Toxin Refinery (E1M3) Blue"}, + 351027: {'name': 'Toxin Refinery (E1M3) - Mega Armor', + 'episode': 1, + 'map': 3, + 'index': 265, + 'doom_type': 2019, + 'region': "Toxin Refinery (E1M3) Yellow"}, + 351028: {'name': 'Toxin Refinery (E1M3) - Armor 3', + 'episode': 1, + 'map': 3, + 'index': 323, + 'doom_type': 2018, + 'region': "Toxin Refinery (E1M3) Blue"}, + 351029: {'name': 'Command Control (E1M4) - Chaingun', + 'episode': 1, + 'map': 4, + 'index': 11, + 'doom_type': 2002, + 'region': "Command Control (E1M4) Main"}, + 351030: {'name': 'Command Control (E1M4) - Armor', + 'episode': 1, + 'map': 4, + 'index': 39, + 'doom_type': 2018, + 'region': "Command Control (E1M4) Blue Yellow"}, + 351031: {'name': 'Command Control (E1M4) - Yellow keycard', + 'episode': 1, + 'map': 4, + 'index': 61, + 'doom_type': 6, + 'region': "Command Control (E1M4) Blue Yellow"}, + 351032: {'name': 'Command Control (E1M4) - Blue keycard', + 'episode': 1, + 'map': 4, + 'index': 62, + 'doom_type': 5, + 'region': "Command Control (E1M4) Main"}, + 351033: {'name': 'Command Control (E1M4) - Supercharge', + 'episode': 1, + 'map': 4, + 'index': 63, + 'doom_type': 2013, + 'region': "Command Control (E1M4) Main"}, + 351034: {'name': 'Command Control (E1M4) - Rocket launcher', + 'episode': 1, + 'map': 4, + 'index': 64, + 'doom_type': 2003, + 'region': "Command Control (E1M4) Main"}, + 351035: {'name': 'Command Control (E1M4) - Mega Armor', + 'episode': 1, + 'map': 4, + 'index': 100, + 'doom_type': 2019, + 'region': "Command Control (E1M4) Blue Yellow"}, + 351036: {'name': 'Command Control (E1M4) - Backpack', + 'episode': 1, + 'map': 4, + 'index': 107, + 'doom_type': 8, + 'region': "Command Control (E1M4) Main"}, + 351037: {'name': 'Command Control (E1M4) - Shotgun', + 'episode': 1, + 'map': 4, + 'index': 129, + 'doom_type': 2001, + 'region': "Command Control (E1M4) Main"}, + 351038: {'name': 'Phobos Lab (E1M5) - Blue keycard', + 'episode': 1, + 'map': 5, + 'index': 4, + 'doom_type': 5, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351039: {'name': 'Phobos Lab (E1M5) - Yellow keycard', + 'episode': 1, + 'map': 5, + 'index': 10, + 'doom_type': 6, + 'region': "Phobos Lab (E1M5) Main"}, + 351040: {'name': 'Phobos Lab (E1M5) - Mega Armor', + 'episode': 1, + 'map': 5, + 'index': 11, + 'doom_type': 2019, + 'region': "Phobos Lab (E1M5) Main"}, + 351041: {'name': 'Phobos Lab (E1M5) - Rocket launcher', + 'episode': 1, + 'map': 5, + 'index': 60, + 'doom_type': 2003, + 'region': "Phobos Lab (E1M5) Main"}, + 351042: {'name': 'Phobos Lab (E1M5) - Shotgun', + 'episode': 1, + 'map': 5, + 'index': 75, + 'doom_type': 2001, + 'region': "Phobos Lab (E1M5) Main"}, + 351043: {'name': 'Phobos Lab (E1M5) - Shotgun 2', + 'episode': 1, + 'map': 5, + 'index': 83, + 'doom_type': 2001, + 'region': "Phobos Lab (E1M5) Main"}, + 351044: {'name': 'Phobos Lab (E1M5) - Chainsaw', + 'episode': 1, + 'map': 5, + 'index': 167, + 'doom_type': 2005, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351045: {'name': 'Phobos Lab (E1M5) - Supercharge', + 'episode': 1, + 'map': 5, + 'index': 169, + 'doom_type': 2013, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351046: {'name': 'Phobos Lab (E1M5) - Chaingun', + 'episode': 1, + 'map': 5, + 'index': 173, + 'doom_type': 2002, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351047: {'name': 'Phobos Lab (E1M5) - Backpack', + 'episode': 1, + 'map': 5, + 'index': 174, + 'doom_type': 8, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351048: {'name': 'Phobos Lab (E1M5) - Computer area map', + 'episode': 1, + 'map': 5, + 'index': 176, + 'doom_type': 2026, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351049: {'name': 'Phobos Lab (E1M5) - Mega Armor 2', + 'episode': 1, + 'map': 5, + 'index': 206, + 'doom_type': 2019, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351050: {'name': 'Phobos Lab (E1M5) - Shotgun 3', + 'episode': 1, + 'map': 5, + 'index': 208, + 'doom_type': 2001, + 'region': "Phobos Lab (E1M5) Main"}, + 351051: {'name': 'Phobos Lab (E1M5) - Armor', + 'episode': 1, + 'map': 5, + 'index': 279, + 'doom_type': 2018, + 'region': "Phobos Lab (E1M5) Main"}, + 351052: {'name': 'Phobos Lab (E1M5) - Armor 2', + 'episode': 1, + 'map': 5, + 'index': 280, + 'doom_type': 2018, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351053: {'name': 'Phobos Lab (E1M5) - Partial invisibility', + 'episode': 1, + 'map': 5, + 'index': 282, + 'doom_type': 2024, + 'region': "Phobos Lab (E1M5) Yellow"}, + 351054: {'name': 'Central Processing (E1M6) - Supercharge', + 'episode': 1, + 'map': 6, + 'index': 4, + 'doom_type': 2013, + 'region': "Central Processing (E1M6) Red"}, + 351055: {'name': 'Central Processing (E1M6) - Blue keycard', + 'episode': 1, + 'map': 6, + 'index': 5, + 'doom_type': 5, + 'region': "Central Processing (E1M6) Red"}, + 351056: {'name': 'Central Processing (E1M6) - Red keycard', + 'episode': 1, + 'map': 6, + 'index': 9, + 'doom_type': 13, + 'region': "Central Processing (E1M6) Main"}, + 351057: {'name': 'Central Processing (E1M6) - Yellow keycard', + 'episode': 1, + 'map': 6, + 'index': 10, + 'doom_type': 6, + 'region': "Central Processing (E1M6) Blue"}, + 351058: {'name': 'Central Processing (E1M6) - Partial invisibility', + 'episode': 1, + 'map': 6, + 'index': 22, + 'doom_type': 2024, + 'region': "Central Processing (E1M6) Main"}, + 351059: {'name': 'Central Processing (E1M6) - Chaingun', + 'episode': 1, + 'map': 6, + 'index': 23, + 'doom_type': 2002, + 'region': "Central Processing (E1M6) Main"}, + 351060: {'name': 'Central Processing (E1M6) - Backpack', + 'episode': 1, + 'map': 6, + 'index': 24, + 'doom_type': 8, + 'region': "Central Processing (E1M6) Main"}, + 351061: {'name': 'Central Processing (E1M6) - Rocket launcher', + 'episode': 1, + 'map': 6, + 'index': 63, + 'doom_type': 2003, + 'region': "Central Processing (E1M6) Main"}, + 351062: {'name': 'Central Processing (E1M6) - Shotgun', + 'episode': 1, + 'map': 6, + 'index': 64, + 'doom_type': 2001, + 'region': "Central Processing (E1M6) Main"}, + 351063: {'name': 'Central Processing (E1M6) - Mega Armor', + 'episode': 1, + 'map': 6, + 'index': 81, + 'doom_type': 2019, + 'region': "Central Processing (E1M6) Red"}, + 351064: {'name': 'Central Processing (E1M6) - Armor', + 'episode': 1, + 'map': 6, + 'index': 82, + 'doom_type': 2018, + 'region': "Central Processing (E1M6) Main"}, + 351065: {'name': 'Central Processing (E1M6) - Backpack 2', + 'episode': 1, + 'map': 6, + 'index': 123, + 'doom_type': 8, + 'region': "Central Processing (E1M6) Blue"}, + 351066: {'name': 'Central Processing (E1M6) - Computer area map', + 'episode': 1, + 'map': 6, + 'index': 124, + 'doom_type': 2026, + 'region': "Central Processing (E1M6) Blue"}, + 351067: {'name': 'Central Processing (E1M6) - Partial invisibility 2', + 'episode': 1, + 'map': 6, + 'index': 131, + 'doom_type': 2024, + 'region': "Central Processing (E1M6) Red"}, + 351068: {'name': 'Central Processing (E1M6) - Armor 2', + 'episode': 1, + 'map': 6, + 'index': 214, + 'doom_type': 2018, + 'region': "Central Processing (E1M6) Blue"}, + 351069: {'name': 'Central Processing (E1M6) - Armor 3', + 'episode': 1, + 'map': 6, + 'index': 291, + 'doom_type': 2018, + 'region': "Central Processing (E1M6) Blue Yellow"}, + 351070: {'name': 'Central Processing (E1M6) - Armor 4', + 'episode': 1, + 'map': 6, + 'index': 381, + 'doom_type': 2018, + 'region': "Central Processing (E1M6) Main"}, + 351071: {'name': 'Central Processing (E1M6) - Supercharge 2', + 'episode': 1, + 'map': 6, + 'index': 392, + 'doom_type': 2013, + 'region': "Central Processing (E1M6) Blue"}, + 351072: {'name': 'Central Processing (E1M6) - Backpack 3', + 'episode': 1, + 'map': 6, + 'index': 395, + 'doom_type': 8, + 'region': "Central Processing (E1M6) Blue"}, + 351073: {'name': 'Computer Station (E1M7) - Chaingun', + 'episode': 1, + 'map': 7, + 'index': 18, + 'doom_type': 2002, + 'region': "Computer Station (E1M7) Yellow"}, + 351074: {'name': 'Computer Station (E1M7) - Computer area map', + 'episode': 1, + 'map': 7, + 'index': 20, + 'doom_type': 2026, + 'region': "Computer Station (E1M7) Yellow"}, + 351075: {'name': 'Computer Station (E1M7) - Supercharge', + 'episode': 1, + 'map': 7, + 'index': 21, + 'doom_type': 2013, + 'region': "Computer Station (E1M7) Yellow"}, + 351076: {'name': 'Computer Station (E1M7) - Yellow keycard', + 'episode': 1, + 'map': 7, + 'index': 25, + 'doom_type': 6, + 'region': "Computer Station (E1M7) Main"}, + 351077: {'name': 'Computer Station (E1M7) - Blue keycard', + 'episode': 1, + 'map': 7, + 'index': 26, + 'doom_type': 5, + 'region': "Computer Station (E1M7) Red"}, + 351078: {'name': 'Computer Station (E1M7) - Red keycard', + 'episode': 1, + 'map': 7, + 'index': 27, + 'doom_type': 13, + 'region': "Computer Station (E1M7) Yellow"}, + 351079: {'name': 'Computer Station (E1M7) - Chainsaw', + 'episode': 1, + 'map': 7, + 'index': 53, + 'doom_type': 2005, + 'region': "Computer Station (E1M7) Yellow"}, + 351080: {'name': 'Computer Station (E1M7) - Shotgun', + 'episode': 1, + 'map': 7, + 'index': 87, + 'doom_type': 2001, + 'region': "Computer Station (E1M7) Blue"}, + 351081: {'name': 'Computer Station (E1M7) - Shotgun 2', + 'episode': 1, + 'map': 7, + 'index': 122, + 'doom_type': 2001, + 'region': "Computer Station (E1M7) Main"}, + 351082: {'name': 'Computer Station (E1M7) - Rocket launcher', + 'episode': 1, + 'map': 7, + 'index': 309, + 'doom_type': 2003, + 'region': "Computer Station (E1M7) Yellow"}, + 351083: {'name': 'Computer Station (E1M7) - Armor', + 'episode': 1, + 'map': 7, + 'index': 310, + 'doom_type': 2018, + 'region': "Computer Station (E1M7) Main"}, + 351084: {'name': 'Computer Station (E1M7) - Armor 2', + 'episode': 1, + 'map': 7, + 'index': 311, + 'doom_type': 2018, + 'region': "Computer Station (E1M7) Yellow"}, + 351085: {'name': 'Computer Station (E1M7) - Mega Armor', + 'episode': 1, + 'map': 7, + 'index': 312, + 'doom_type': 2019, + 'region': "Computer Station (E1M7) Yellow"}, + 351086: {'name': 'Computer Station (E1M7) - Backpack', + 'episode': 1, + 'map': 7, + 'index': 314, + 'doom_type': 8, + 'region': "Computer Station (E1M7) Yellow"}, + 351087: {'name': 'Computer Station (E1M7) - Partial invisibility', + 'episode': 1, + 'map': 7, + 'index': 337, + 'doom_type': 2024, + 'region': "Computer Station (E1M7) Yellow Red"}, + 351088: {'name': 'Phobos Anomaly (E1M8) - Supercharge', + 'episode': 1, + 'map': 8, + 'index': 15, + 'doom_type': 2013, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351089: {'name': 'Phobos Anomaly (E1M8) - Shotgun', + 'episode': 1, + 'map': 8, + 'index': 49, + 'doom_type': 2001, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351090: {'name': 'Phobos Anomaly (E1M8) - Shotgun 2', + 'episode': 1, + 'map': 8, + 'index': 52, + 'doom_type': 2001, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351091: {'name': 'Phobos Anomaly (E1M8) - Armor', + 'episode': 1, + 'map': 8, + 'index': 53, + 'doom_type': 2018, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351092: {'name': 'Phobos Anomaly (E1M8) - Chaingun', + 'episode': 1, + 'map': 8, + 'index': 65, + 'doom_type': 2002, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351093: {'name': 'Phobos Anomaly (E1M8) - Partial invisibility', + 'episode': 1, + 'map': 8, + 'index': 70, + 'doom_type': 2024, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351094: {'name': 'Phobos Anomaly (E1M8) - Computer area map', + 'episode': 1, + 'map': 8, + 'index': 94, + 'doom_type': 2026, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351095: {'name': 'Military Base (E1M9) - Yellow keycard', + 'episode': 1, + 'map': 9, + 'index': 13, + 'doom_type': 6, + 'region': "Military Base (E1M9) Main"}, + 351096: {'name': 'Military Base (E1M9) - Red keycard', + 'episode': 1, + 'map': 9, + 'index': 20, + 'doom_type': 13, + 'region': "Military Base (E1M9) Yellow"}, + 351097: {'name': 'Military Base (E1M9) - Chaingun', + 'episode': 1, + 'map': 9, + 'index': 87, + 'doom_type': 2002, + 'region': "Military Base (E1M9) Main"}, + 351098: {'name': 'Military Base (E1M9) - Armor', + 'episode': 1, + 'map': 9, + 'index': 139, + 'doom_type': 2018, + 'region': "Military Base (E1M9) Main"}, + 351099: {'name': 'Military Base (E1M9) - Rocket launcher', + 'episode': 1, + 'map': 9, + 'index': 172, + 'doom_type': 2003, + 'region': "Military Base (E1M9) Main"}, + 351100: {'name': 'Military Base (E1M9) - Blue keycard', + 'episode': 1, + 'map': 9, + 'index': 188, + 'doom_type': 5, + 'region': "Military Base (E1M9) Red"}, + 351101: {'name': 'Military Base (E1M9) - Backpack', + 'episode': 1, + 'map': 9, + 'index': 222, + 'doom_type': 8, + 'region': "Military Base (E1M9) Blue"}, + 351102: {'name': 'Military Base (E1M9) - Shotgun', + 'episode': 1, + 'map': 9, + 'index': 223, + 'doom_type': 2001, + 'region': "Military Base (E1M9) Blue"}, + 351103: {'name': 'Military Base (E1M9) - Chainsaw', + 'episode': 1, + 'map': 9, + 'index': 225, + 'doom_type': 2005, + 'region': "Military Base (E1M9) Blue"}, + 351104: {'name': 'Deimos Anomaly (E2M1) - Plasma gun', + 'episode': 2, + 'map': 1, + 'index': 44, + 'doom_type': 2004, + 'region': "Deimos Anomaly (E2M1) Main"}, + 351105: {'name': 'Deimos Anomaly (E2M1) - Blue keycard', + 'episode': 2, + 'map': 1, + 'index': 51, + 'doom_type': 5, + 'region': "Deimos Anomaly (E2M1) Main"}, + 351106: {'name': 'Deimos Anomaly (E2M1) - Shotgun', + 'episode': 2, + 'map': 1, + 'index': 54, + 'doom_type': 2001, + 'region': "Deimos Anomaly (E2M1) Main"}, + 351107: {'name': 'Deimos Anomaly (E2M1) - Armor', + 'episode': 2, + 'map': 1, + 'index': 57, + 'doom_type': 2018, + 'region': "Deimos Anomaly (E2M1) Main"}, + 351108: {'name': 'Deimos Anomaly (E2M1) - Red keycard', + 'episode': 2, + 'map': 1, + 'index': 83, + 'doom_type': 13, + 'region': "Deimos Anomaly (E2M1) Main"}, + 351109: {'name': 'Deimos Anomaly (E2M1) - Computer area map', + 'episode': 2, + 'map': 1, + 'index': 84, + 'doom_type': 2026, + 'region': "Deimos Anomaly (E2M1) Red"}, + 351110: {'name': 'Deimos Anomaly (E2M1) - Mega Armor', + 'episode': 2, + 'map': 1, + 'index': 86, + 'doom_type': 2019, + 'region': "Deimos Anomaly (E2M1) Red"}, + 351111: {'name': 'Deimos Anomaly (E2M1) - Shotgun 2', + 'episode': 2, + 'map': 1, + 'index': 99, + 'doom_type': 2001, + 'region': "Deimos Anomaly (E2M1) Main"}, + 351112: {'name': 'Containment Area (E2M2) - Chaingun', + 'episode': 2, + 'map': 2, + 'index': 8, + 'doom_type': 2002, + 'region': "Containment Area (E2M2) Yellow"}, + 351113: {'name': 'Containment Area (E2M2) - Armor', + 'episode': 2, + 'map': 2, + 'index': 9, + 'doom_type': 2018, + 'region': "Containment Area (E2M2) Main"}, + 351114: {'name': 'Containment Area (E2M2) - Armor 2', + 'episode': 2, + 'map': 2, + 'index': 20, + 'doom_type': 2018, + 'region': "Containment Area (E2M2) Main"}, + 351115: {'name': 'Containment Area (E2M2) - Backpack', + 'episode': 2, + 'map': 2, + 'index': 66, + 'doom_type': 8, + 'region': "Containment Area (E2M2) Main"}, + 351116: {'name': 'Containment Area (E2M2) - Supercharge', + 'episode': 2, + 'map': 2, + 'index': 80, + 'doom_type': 2013, + 'region': "Containment Area (E2M2) Main"}, + 351117: {'name': 'Containment Area (E2M2) - Chainsaw', + 'episode': 2, + 'map': 2, + 'index': 81, + 'doom_type': 2005, + 'region': "Containment Area (E2M2) Main"}, + 351118: {'name': 'Containment Area (E2M2) - Armor 3', + 'episode': 2, + 'map': 2, + 'index': 100, + 'doom_type': 2018, + 'region': "Containment Area (E2M2) Main"}, + 351119: {'name': 'Containment Area (E2M2) - Computer area map', + 'episode': 2, + 'map': 2, + 'index': 109, + 'doom_type': 2026, + 'region': "Containment Area (E2M2) Main"}, + 351120: {'name': 'Containment Area (E2M2) - Mega Armor', + 'episode': 2, + 'map': 2, + 'index': 125, + 'doom_type': 2019, + 'region': "Containment Area (E2M2) Main"}, + 351121: {'name': 'Containment Area (E2M2) - Plasma gun', + 'episode': 2, + 'map': 2, + 'index': 127, + 'doom_type': 2004, + 'region': "Containment Area (E2M2) Main"}, + 351122: {'name': 'Containment Area (E2M2) - Rocket launcher', + 'episode': 2, + 'map': 2, + 'index': 138, + 'doom_type': 2003, + 'region': "Containment Area (E2M2) Yellow"}, + 351123: {'name': 'Containment Area (E2M2) - Blue keycard', + 'episode': 2, + 'map': 2, + 'index': 143, + 'doom_type': 5, + 'region': "Containment Area (E2M2) Main"}, + 351124: {'name': 'Containment Area (E2M2) - Yellow keycard', + 'episode': 2, + 'map': 2, + 'index': 144, + 'doom_type': 6, + 'region': "Containment Area (E2M2) Main"}, + 351125: {'name': 'Containment Area (E2M2) - Red keycard', + 'episode': 2, + 'map': 2, + 'index': 153, + 'doom_type': 13, + 'region': "Containment Area (E2M2) Blue"}, + 351126: {'name': 'Containment Area (E2M2) - Shotgun', + 'episode': 2, + 'map': 2, + 'index': 160, + 'doom_type': 2001, + 'region': "Containment Area (E2M2) Main"}, + 351127: {'name': 'Containment Area (E2M2) - Shotgun 2', + 'episode': 2, + 'map': 2, + 'index': 161, + 'doom_type': 2001, + 'region': "Containment Area (E2M2) Main"}, + 351128: {'name': 'Containment Area (E2M2) - Armor 4', + 'episode': 2, + 'map': 2, + 'index': 165, + 'doom_type': 2018, + 'region': "Containment Area (E2M2) Main"}, + 351129: {'name': 'Containment Area (E2M2) - Berserk', + 'episode': 2, + 'map': 2, + 'index': 250, + 'doom_type': 2023, + 'region': "Containment Area (E2M2) Main"}, + 351130: {'name': 'Containment Area (E2M2) - Backpack 2', + 'episode': 2, + 'map': 2, + 'index': 291, + 'doom_type': 8, + 'region': "Containment Area (E2M2) Yellow"}, + 351131: {'name': 'Refinery (E2M3) - Plasma gun', + 'episode': 2, + 'map': 3, + 'index': 12, + 'doom_type': 2004, + 'region': "Refinery (E2M3) Main"}, + 351132: {'name': 'Refinery (E2M3) - Backpack', + 'episode': 2, + 'map': 3, + 'index': 37, + 'doom_type': 8, + 'region': "Refinery (E2M3) Main"}, + 351133: {'name': 'Refinery (E2M3) - Mega Armor', + 'episode': 2, + 'map': 3, + 'index': 40, + 'doom_type': 2019, + 'region': "Refinery (E2M3) Main"}, + 351134: {'name': 'Refinery (E2M3) - Armor', + 'episode': 2, + 'map': 3, + 'index': 57, + 'doom_type': 2018, + 'region': "Refinery (E2M3) Main"}, + 351135: {'name': 'Refinery (E2M3) - Partial invisibility', + 'episode': 2, + 'map': 3, + 'index': 67, + 'doom_type': 2024, + 'region': "Refinery (E2M3) Blue"}, + 351136: {'name': 'Refinery (E2M3) - Supercharge', + 'episode': 2, + 'map': 3, + 'index': 87, + 'doom_type': 2013, + 'region': "Refinery (E2M3) Blue"}, + 351137: {'name': 'Refinery (E2M3) - Blue keycard', + 'episode': 2, + 'map': 3, + 'index': 90, + 'doom_type': 5, + 'region': "Refinery (E2M3) Main"}, + 351138: {'name': 'Refinery (E2M3) - Partial invisibility 2', + 'episode': 2, + 'map': 3, + 'index': 110, + 'doom_type': 2024, + 'region': "Refinery (E2M3) Main"}, + 351139: {'name': 'Refinery (E2M3) - Shotgun', + 'episode': 2, + 'map': 3, + 'index': 113, + 'doom_type': 2001, + 'region': "Refinery (E2M3) Main"}, + 351140: {'name': 'Refinery (E2M3) - Berserk', + 'episode': 2, + 'map': 3, + 'index': 221, + 'doom_type': 2023, + 'region': "Refinery (E2M3) Main"}, + 351141: {'name': 'Refinery (E2M3) - Chaingun', + 'episode': 2, + 'map': 3, + 'index': 223, + 'doom_type': 2002, + 'region': "Refinery (E2M3) Main"}, + 351142: {'name': 'Deimos Lab (E2M4) - Armor', + 'episode': 2, + 'map': 4, + 'index': 7, + 'doom_type': 2018, + 'region': "Deimos Lab (E2M4) Main"}, + 351143: {'name': 'Deimos Lab (E2M4) - Partial invisibility', + 'episode': 2, + 'map': 4, + 'index': 8, + 'doom_type': 2024, + 'region': "Deimos Lab (E2M4) Main"}, + 351144: {'name': 'Deimos Lab (E2M4) - Computer area map', + 'episode': 2, + 'map': 4, + 'index': 39, + 'doom_type': 2026, + 'region': "Deimos Lab (E2M4) Main"}, + 351145: {'name': 'Deimos Lab (E2M4) - Armor 2', + 'episode': 2, + 'map': 4, + 'index': 40, + 'doom_type': 2018, + 'region': "Deimos Lab (E2M4) Main"}, + 351146: {'name': 'Deimos Lab (E2M4) - Blue keycard', + 'episode': 2, + 'map': 4, + 'index': 74, + 'doom_type': 5, + 'region': "Deimos Lab (E2M4) Main"}, + 351147: {'name': 'Deimos Lab (E2M4) - Yellow keycard', + 'episode': 2, + 'map': 4, + 'index': 86, + 'doom_type': 6, + 'region': "Deimos Lab (E2M4) Blue"}, + 351148: {'name': 'Deimos Lab (E2M4) - Supercharge', + 'episode': 2, + 'map': 4, + 'index': 107, + 'doom_type': 2013, + 'region': "Deimos Lab (E2M4) Blue Yellow"}, + 351149: {'name': 'Deimos Lab (E2M4) - Shotgun', + 'episode': 2, + 'map': 4, + 'index': 109, + 'doom_type': 2001, + 'region': "Deimos Lab (E2M4) Main"}, + 351150: {'name': 'Deimos Lab (E2M4) - Mega Armor', + 'episode': 2, + 'map': 4, + 'index': 129, + 'doom_type': 2019, + 'region': "Deimos Lab (E2M4) Blue Yellow"}, + 351151: {'name': 'Deimos Lab (E2M4) - Plasma gun', + 'episode': 2, + 'map': 4, + 'index': 130, + 'doom_type': 2004, + 'region': "Deimos Lab (E2M4) Blue Yellow"}, + 351152: {'name': 'Deimos Lab (E2M4) - Backpack', + 'episode': 2, + 'map': 4, + 'index': 159, + 'doom_type': 8, + 'region': "Deimos Lab (E2M4) Main"}, + 351153: {'name': 'Deimos Lab (E2M4) - Berserk', + 'episode': 2, + 'map': 4, + 'index': 174, + 'doom_type': 2023, + 'region': "Deimos Lab (E2M4) Main"}, + 351154: {'name': 'Deimos Lab (E2M4) - Partial invisibility 2', + 'episode': 2, + 'map': 4, + 'index': 175, + 'doom_type': 2024, + 'region': "Deimos Lab (E2M4) Main"}, + 351155: {'name': 'Deimos Lab (E2M4) - Armor 3', + 'episode': 2, + 'map': 4, + 'index': 186, + 'doom_type': 2018, + 'region': "Deimos Lab (E2M4) Main"}, + 351156: {'name': 'Deimos Lab (E2M4) - Chaingun', + 'episode': 2, + 'map': 4, + 'index': 189, + 'doom_type': 2002, + 'region': "Deimos Lab (E2M4) Main"}, + 351157: {'name': 'Deimos Lab (E2M4) - Supercharge 2', + 'episode': 2, + 'map': 4, + 'index': 244, + 'doom_type': 2013, + 'region': "Deimos Lab (E2M4) Main"}, + 351158: {'name': 'Command Center (E2M5) - Backpack', + 'episode': 2, + 'map': 5, + 'index': 3, + 'doom_type': 8, + 'region': "Command Center (E2M5) Main"}, + 351159: {'name': 'Command Center (E2M5) - Mega Armor', + 'episode': 2, + 'map': 5, + 'index': 53, + 'doom_type': 2019, + 'region': "Command Center (E2M5) Main"}, + 351160: {'name': 'Command Center (E2M5) - Berserk', + 'episode': 2, + 'map': 5, + 'index': 57, + 'doom_type': 2023, + 'region': "Command Center (E2M5) Main"}, + 351161: {'name': 'Command Center (E2M5) - Chaingun', + 'episode': 2, + 'map': 5, + 'index': 69, + 'doom_type': 2002, + 'region': "Command Center (E2M5) Main"}, + 351162: {'name': 'Command Center (E2M5) - Chainsaw', + 'episode': 2, + 'map': 5, + 'index': 79, + 'doom_type': 2005, + 'region': "Command Center (E2M5) Main"}, + 351163: {'name': 'Command Center (E2M5) - Plasma gun', + 'episode': 2, + 'map': 5, + 'index': 109, + 'doom_type': 2004, + 'region': "Command Center (E2M5) Main"}, + 351164: {'name': 'Command Center (E2M5) - Computer area map', + 'episode': 2, + 'map': 5, + 'index': 176, + 'doom_type': 2026, + 'region': "Command Center (E2M5) Main"}, + 351165: {'name': 'Command Center (E2M5) - Armor', + 'episode': 2, + 'map': 5, + 'index': 197, + 'doom_type': 2018, + 'region': "Command Center (E2M5) Main"}, + 351166: {'name': 'Command Center (E2M5) - Armor 2', + 'episode': 2, + 'map': 5, + 'index': 233, + 'doom_type': 2018, + 'region': "Command Center (E2M5) Main"}, + 351167: {'name': 'Command Center (E2M5) - Partial invisibility', + 'episode': 2, + 'map': 5, + 'index': 256, + 'doom_type': 2024, + 'region': "Command Center (E2M5) Main"}, + 351168: {'name': 'Halls of the Damned (E2M6) - Berserk', + 'episode': 2, + 'map': 6, + 'index': 10, + 'doom_type': 2023, + 'region': "Halls of the Damned (E2M6) Main"}, + 351169: {'name': 'Halls of the Damned (E2M6) - Blue skull key', + 'episode': 2, + 'map': 6, + 'index': 13, + 'doom_type': 40, + 'region': "Halls of the Damned (E2M6) Main"}, + 351170: {'name': 'Halls of the Damned (E2M6) - Backpack', + 'episode': 2, + 'map': 6, + 'index': 26, + 'doom_type': 8, + 'region': "Halls of the Damned (E2M6) Main"}, + 351171: {'name': 'Halls of the Damned (E2M6) - Mega Armor', + 'episode': 2, + 'map': 6, + 'index': 39, + 'doom_type': 2019, + 'region': "Halls of the Damned (E2M6) Main"}, + 351172: {'name': 'Halls of the Damned (E2M6) - Computer area map', + 'episode': 2, + 'map': 6, + 'index': 48, + 'doom_type': 2026, + 'region': "Halls of the Damned (E2M6) Yellow"}, + 351173: {'name': 'Halls of the Damned (E2M6) - Armor', + 'episode': 2, + 'map': 6, + 'index': 49, + 'doom_type': 2018, + 'region': "Halls of the Damned (E2M6) Main"}, + 351174: {'name': 'Halls of the Damned (E2M6) - Partial invisibility', + 'episode': 2, + 'map': 6, + 'index': 57, + 'doom_type': 2024, + 'region': "Halls of the Damned (E2M6) Main"}, + 351175: {'name': 'Halls of the Damned (E2M6) - Yellow skull key', + 'episode': 2, + 'map': 6, + 'index': 125, + 'doom_type': 39, + 'region': "Halls of the Damned (E2M6) Main"}, + 351176: {'name': 'Halls of the Damned (E2M6) - Supercharge', + 'episode': 2, + 'map': 6, + 'index': 142, + 'doom_type': 2013, + 'region': "Halls of the Damned (E2M6) Yellow"}, + 351177: {'name': 'Halls of the Damned (E2M6) - Chaingun', + 'episode': 2, + 'map': 6, + 'index': 143, + 'doom_type': 2002, + 'region': "Halls of the Damned (E2M6) Main"}, + 351178: {'name': 'Halls of the Damned (E2M6) - Plasma gun', + 'episode': 2, + 'map': 6, + 'index': 173, + 'doom_type': 2004, + 'region': "Halls of the Damned (E2M6) Main"}, + 351179: {'name': 'Halls of the Damned (E2M6) - Partial invisibility 2', + 'episode': 2, + 'map': 6, + 'index': 217, + 'doom_type': 2024, + 'region': "Halls of the Damned (E2M6) Main"}, + 351180: {'name': 'Halls of the Damned (E2M6) - Red skull key', + 'episode': 2, + 'map': 6, + 'index': 220, + 'doom_type': 38, + 'region': "Halls of the Damned (E2M6) Main"}, + 351181: {'name': 'Halls of the Damned (E2M6) - Shotgun', + 'episode': 2, + 'map': 6, + 'index': 230, + 'doom_type': 2001, + 'region': "Halls of the Damned (E2M6) Main"}, + 351182: {'name': 'Halls of the Damned (E2M6) - Rocket launcher', + 'episode': 2, + 'map': 6, + 'index': 232, + 'doom_type': 2003, + 'region': "Halls of the Damned (E2M6) Main"}, + 351183: {'name': 'Halls of the Damned (E2M6) - Chainsaw', + 'episode': 2, + 'map': 6, + 'index': 286, + 'doom_type': 2005, + 'region': "Halls of the Damned (E2M6) Main"}, + 351184: {'name': 'Halls of the Damned (E2M6) - Partial invisibility 3', + 'episode': 2, + 'map': 6, + 'index': 320, + 'doom_type': 2024, + 'region': "Halls of the Damned (E2M6) Main"}, + 351185: {'name': 'Spawning Vats (E2M7) - Rocket launcher', + 'episode': 2, + 'map': 7, + 'index': 29, + 'doom_type': 2003, + 'region': "Spawning Vats (E2M7) Main"}, + 351186: {'name': 'Spawning Vats (E2M7) - Backpack', + 'episode': 2, + 'map': 7, + 'index': 49, + 'doom_type': 8, + 'region': "Spawning Vats (E2M7) Blue"}, + 351187: {'name': 'Spawning Vats (E2M7) - Partial invisibility', + 'episode': 2, + 'map': 7, + 'index': 79, + 'doom_type': 2024, + 'region': "Spawning Vats (E2M7) Main"}, + 351188: {'name': 'Spawning Vats (E2M7) - Mega Armor', + 'episode': 2, + 'map': 7, + 'index': 94, + 'doom_type': 2019, + 'region': "Spawning Vats (E2M7) Main"}, + 351189: {'name': 'Spawning Vats (E2M7) - Chaingun', + 'episode': 2, + 'map': 7, + 'index': 128, + 'doom_type': 2002, + 'region': "Spawning Vats (E2M7) Blue"}, + 351190: {'name': 'Spawning Vats (E2M7) - Armor', + 'episode': 2, + 'map': 7, + 'index': 131, + 'doom_type': 2018, + 'region': "Spawning Vats (E2M7) Main"}, + 351191: {'name': 'Spawning Vats (E2M7) - Red keycard', + 'episode': 2, + 'map': 7, + 'index': 140, + 'doom_type': 13, + 'region': "Spawning Vats (E2M7) Yellow"}, + 351192: {'name': 'Spawning Vats (E2M7) - Yellow keycard', + 'episode': 2, + 'map': 7, + 'index': 141, + 'doom_type': 6, + 'region': "Spawning Vats (E2M7) Blue"}, + 351193: {'name': 'Spawning Vats (E2M7) - Blue keycard', + 'episode': 2, + 'map': 7, + 'index': 142, + 'doom_type': 5, + 'region': "Spawning Vats (E2M7) Main"}, + 351194: {'name': 'Spawning Vats (E2M7) - Invulnerability', + 'episode': 2, + 'map': 7, + 'index': 146, + 'doom_type': 2022, + 'region': "Spawning Vats (E2M7) Main"}, + 351195: {'name': 'Spawning Vats (E2M7) - Berserk', + 'episode': 2, + 'map': 7, + 'index': 160, + 'doom_type': 2023, + 'region': "Spawning Vats (E2M7) Main"}, + 351196: {'name': 'Spawning Vats (E2M7) - Chainsaw', + 'episode': 2, + 'map': 7, + 'index': 174, + 'doom_type': 2005, + 'region': "Spawning Vats (E2M7) Main"}, + 351197: {'name': 'Spawning Vats (E2M7) - Supercharge', + 'episode': 2, + 'map': 7, + 'index': 199, + 'doom_type': 2013, + 'region': "Spawning Vats (E2M7) Blue Red"}, + 351198: {'name': 'Spawning Vats (E2M7) - Invulnerability 2', + 'episode': 2, + 'map': 7, + 'index': 200, + 'doom_type': 2022, + 'region': "Spawning Vats (E2M7) Main"}, + 351199: {'name': 'Spawning Vats (E2M7) - Computer area map', + 'episode': 2, + 'map': 7, + 'index': 201, + 'doom_type': 2026, + 'region': "Spawning Vats (E2M7) Main"}, + 351200: {'name': 'Spawning Vats (E2M7) - Plasma gun', + 'episode': 2, + 'map': 7, + 'index': 203, + 'doom_type': 2004, + 'region': "Spawning Vats (E2M7) Main"}, + 351201: {'name': 'Tower of Babel (E2M8) - Rocket launcher', + 'episode': 2, + 'map': 8, + 'index': 16, + 'doom_type': 2003, + 'region': "Tower of Babel (E2M8) Main"}, + 351202: {'name': 'Tower of Babel (E2M8) - Supercharge', + 'episode': 2, + 'map': 8, + 'index': 17, + 'doom_type': 2013, + 'region': "Tower of Babel (E2M8) Main"}, + 351203: {'name': 'Tower of Babel (E2M8) - Supercharge 2', + 'episode': 2, + 'map': 8, + 'index': 18, + 'doom_type': 2013, + 'region': "Tower of Babel (E2M8) Main"}, + 351204: {'name': 'Tower of Babel (E2M8) - Mega Armor', + 'episode': 2, + 'map': 8, + 'index': 36, + 'doom_type': 2019, + 'region': "Tower of Babel (E2M8) Main"}, + 351205: {'name': 'Fortress of Mystery (E2M9) - Supercharge', + 'episode': 2, + 'map': 9, + 'index': 18, + 'doom_type': 2013, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351206: {'name': 'Fortress of Mystery (E2M9) - Blue skull key', + 'episode': 2, + 'map': 9, + 'index': 27, + 'doom_type': 40, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351207: {'name': 'Fortress of Mystery (E2M9) - Red skull key', + 'episode': 2, + 'map': 9, + 'index': 28, + 'doom_type': 38, + 'region': "Fortress of Mystery (E2M9) Blue"}, + 351208: {'name': 'Fortress of Mystery (E2M9) - Yellow skull key', + 'episode': 2, + 'map': 9, + 'index': 29, + 'doom_type': 39, + 'region': "Fortress of Mystery (E2M9) Red"}, + 351209: {'name': 'Fortress of Mystery (E2M9) - Backpack', + 'episode': 2, + 'map': 9, + 'index': 30, + 'doom_type': 8, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351210: {'name': 'Fortress of Mystery (E2M9) - Chaingun', + 'episode': 2, + 'map': 9, + 'index': 31, + 'doom_type': 2002, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351211: {'name': 'Fortress of Mystery (E2M9) - Plasma gun', + 'episode': 2, + 'map': 9, + 'index': 32, + 'doom_type': 2004, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351212: {'name': 'Fortress of Mystery (E2M9) - Rocket launcher', + 'episode': 2, + 'map': 9, + 'index': 33, + 'doom_type': 2003, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351213: {'name': 'Fortress of Mystery (E2M9) - Shotgun', + 'episode': 2, + 'map': 9, + 'index': 34, + 'doom_type': 2001, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351214: {'name': 'Fortress of Mystery (E2M9) - Chainsaw', + 'episode': 2, + 'map': 9, + 'index': 35, + 'doom_type': 2005, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351215: {'name': 'Fortress of Mystery (E2M9) - Computer area map', + 'episode': 2, + 'map': 9, + 'index': 36, + 'doom_type': 2026, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351216: {'name': 'Fortress of Mystery (E2M9) - Mega Armor', + 'episode': 2, + 'map': 9, + 'index': 44, + 'doom_type': 2019, + 'region': "Fortress of Mystery (E2M9) Main"}, + 351217: {'name': 'Hell Keep (E3M1) - Shotgun', + 'episode': 3, + 'map': 1, + 'index': 20, + 'doom_type': 2001, + 'region': "Hell Keep (E3M1) Main"}, + 351218: {'name': 'Hell Keep (E3M1) - Rocket launcher', + 'episode': 3, + 'map': 1, + 'index': 46, + 'doom_type': 2003, + 'region': "Hell Keep (E3M1) Narrow"}, + 351219: {'name': 'Slough of Despair (E3M2) - Chaingun', + 'episode': 3, + 'map': 2, + 'index': 32, + 'doom_type': 2002, + 'region': "Slough of Despair (E3M2) Main"}, + 351220: {'name': 'Slough of Despair (E3M2) - Berserk', + 'episode': 3, + 'map': 2, + 'index': 37, + 'doom_type': 2023, + 'region': "Slough of Despair (E3M2) Main"}, + 351221: {'name': 'Slough of Despair (E3M2) - Mega Armor', + 'episode': 3, + 'map': 2, + 'index': 76, + 'doom_type': 2019, + 'region': "Slough of Despair (E3M2) Main"}, + 351222: {'name': 'Slough of Despair (E3M2) - Armor', + 'episode': 3, + 'map': 2, + 'index': 77, + 'doom_type': 2018, + 'region': "Slough of Despair (E3M2) Main"}, + 351223: {'name': 'Slough of Despair (E3M2) - Rocket launcher', + 'episode': 3, + 'map': 2, + 'index': 80, + 'doom_type': 2003, + 'region': "Slough of Despair (E3M2) Main"}, + 351224: {'name': 'Slough of Despair (E3M2) - Plasma gun', + 'episode': 3, + 'map': 2, + 'index': 88, + 'doom_type': 2004, + 'region': "Slough of Despair (E3M2) Main"}, + 351225: {'name': 'Slough of Despair (E3M2) - Computer area map', + 'episode': 3, + 'map': 2, + 'index': 154, + 'doom_type': 2026, + 'region': "Slough of Despair (E3M2) Main"}, + 351226: {'name': 'Slough of Despair (E3M2) - Blue skull key', + 'episode': 3, + 'map': 2, + 'index': 181, + 'doom_type': 40, + 'region': "Slough of Despair (E3M2) Main"}, + 351227: {'name': 'Slough of Despair (E3M2) - Supercharge', + 'episode': 3, + 'map': 2, + 'index': 182, + 'doom_type': 2013, + 'region': "Slough of Despair (E3M2) Main"}, + 351228: {'name': 'Pandemonium (E3M3) - Berserk', + 'episode': 3, + 'map': 3, + 'index': 11, + 'doom_type': 2023, + 'region': "Pandemonium (E3M3) Main"}, + 351229: {'name': 'Pandemonium (E3M3) - Chaingun', + 'episode': 3, + 'map': 3, + 'index': 14, + 'doom_type': 2002, + 'region': "Pandemonium (E3M3) Main"}, + 351230: {'name': 'Pandemonium (E3M3) - BFG9000', + 'episode': 3, + 'map': 3, + 'index': 22, + 'doom_type': 2006, + 'region': "Pandemonium (E3M3) Main"}, + 351231: {'name': 'Pandemonium (E3M3) - Supercharge', + 'episode': 3, + 'map': 3, + 'index': 23, + 'doom_type': 2013, + 'region': "Pandemonium (E3M3) Main"}, + 351232: {'name': 'Pandemonium (E3M3) - Invulnerability', + 'episode': 3, + 'map': 3, + 'index': 26, + 'doom_type': 2022, + 'region': "Pandemonium (E3M3) Main"}, + 351233: {'name': 'Pandemonium (E3M3) - Blue skull key', + 'episode': 3, + 'map': 3, + 'index': 49, + 'doom_type': 40, + 'region': "Pandemonium (E3M3) Main"}, + 351234: {'name': 'Pandemonium (E3M3) - Mega Armor', + 'episode': 3, + 'map': 3, + 'index': 66, + 'doom_type': 2019, + 'region': "Pandemonium (E3M3) Main"}, + 351235: {'name': 'Pandemonium (E3M3) - Shotgun', + 'episode': 3, + 'map': 3, + 'index': 73, + 'doom_type': 2001, + 'region': "Pandemonium (E3M3) Main"}, + 351236: {'name': 'Pandemonium (E3M3) - Armor', + 'episode': 3, + 'map': 3, + 'index': 85, + 'doom_type': 2018, + 'region': "Pandemonium (E3M3) Main"}, + 351237: {'name': 'Pandemonium (E3M3) - Backpack', + 'episode': 3, + 'map': 3, + 'index': 88, + 'doom_type': 8, + 'region': "Pandemonium (E3M3) Main"}, + 351238: {'name': 'Pandemonium (E3M3) - Computer area map', + 'episode': 3, + 'map': 3, + 'index': 92, + 'doom_type': 2026, + 'region': "Pandemonium (E3M3) Main"}, + 351239: {'name': 'Pandemonium (E3M3) - Mega Armor 2', + 'episode': 3, + 'map': 3, + 'index': 113, + 'doom_type': 2019, + 'region': "Pandemonium (E3M3) Main"}, + 351240: {'name': 'Pandemonium (E3M3) - Shotgun 2', + 'episode': 3, + 'map': 3, + 'index': 118, + 'doom_type': 2001, + 'region': "Pandemonium (E3M3) Main"}, + 351241: {'name': 'Pandemonium (E3M3) - Rocket launcher', + 'episode': 3, + 'map': 3, + 'index': 183, + 'doom_type': 2003, + 'region': "Pandemonium (E3M3) Main"}, + 351242: {'name': 'House of Pain (E3M4) - Shotgun', + 'episode': 3, + 'map': 4, + 'index': 5, + 'doom_type': 2001, + 'region': "House of Pain (E3M4) Main"}, + 351243: {'name': 'House of Pain (E3M4) - Berserk', + 'episode': 3, + 'map': 4, + 'index': 15, + 'doom_type': 2023, + 'region': "House of Pain (E3M4) Main"}, + 351244: {'name': 'House of Pain (E3M4) - Mega Armor', + 'episode': 3, + 'map': 4, + 'index': 17, + 'doom_type': 2019, + 'region': "House of Pain (E3M4) Main"}, + 351245: {'name': 'House of Pain (E3M4) - Chaingun', + 'episode': 3, + 'map': 4, + 'index': 46, + 'doom_type': 2002, + 'region': "House of Pain (E3M4) Main"}, + 351246: {'name': 'House of Pain (E3M4) - Invulnerability', + 'episode': 3, + 'map': 4, + 'index': 51, + 'doom_type': 2022, + 'region': "House of Pain (E3M4) Main"}, + 351247: {'name': 'House of Pain (E3M4) - Blue skull key', + 'episode': 3, + 'map': 4, + 'index': 87, + 'doom_type': 40, + 'region': "House of Pain (E3M4) Main"}, + 351248: {'name': 'House of Pain (E3M4) - Armor', + 'episode': 3, + 'map': 4, + 'index': 100, + 'doom_type': 2018, + 'region': "House of Pain (E3M4) Main"}, + 351249: {'name': 'House of Pain (E3M4) - Yellow skull key', + 'episode': 3, + 'map': 4, + 'index': 114, + 'doom_type': 39, + 'region': "House of Pain (E3M4) Blue"}, + 351250: {'name': 'House of Pain (E3M4) - Invulnerability 2', + 'episode': 3, + 'map': 4, + 'index': 121, + 'doom_type': 2022, + 'region': "House of Pain (E3M4) Blue"}, + 351251: {'name': 'House of Pain (E3M4) - Red skull key', + 'episode': 3, + 'map': 4, + 'index': 134, + 'doom_type': 38, + 'region': "House of Pain (E3M4) Blue Yellow"}, + 351252: {'name': 'House of Pain (E3M4) - Backpack', + 'episode': 3, + 'map': 4, + 'index': 160, + 'doom_type': 8, + 'region': "House of Pain (E3M4) Blue 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"}, + 351254: {'name': 'House of Pain (E3M4) - Partial invisibility', + 'episode': 3, + 'map': 4, + 'index': 182, + 'doom_type': 2024, + 'region': "House of Pain (E3M4) Blue"}, + 351255: {'name': 'House of Pain (E3M4) - BFG9000', + 'episode': 3, + 'map': 4, + 'index': 206, + 'doom_type': 2006, + 'region': "House of Pain (E3M4) Blue"}, + 351256: {'name': 'House of Pain (E3M4) - Supercharge', + 'episode': 3, + 'map': 4, + 'index': 220, + 'doom_type': 2013, + 'region': "House of Pain (E3M4) Blue"}, + 351257: {'name': 'House of Pain (E3M4) - Armor 2', + 'episode': 3, + 'map': 4, + 'index': 242, + 'doom_type': 2018, + 'region': "House of Pain (E3M4) Main"}, + 351258: {'name': 'House of Pain (E3M4) - Rocket launcher', + 'episode': 3, + 'map': 4, + 'index': 243, + 'doom_type': 2003, + 'region': "House of Pain (E3M4) Main"}, + 351259: {'name': 'House of Pain (E3M4) - Armor 3', + 'episode': 3, + 'map': 4, + 'index': 318, + 'doom_type': 2018, + 'region': "House of Pain (E3M4) Blue"}, + 351260: {'name': 'Unholy Cathedral (E3M5) - Blue skull key', + 'episode': 3, + 'map': 5, + 'index': 54, + 'doom_type': 40, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351261: {'name': 'Unholy Cathedral (E3M5) - Chaingun', + 'episode': 3, + 'map': 5, + 'index': 55, + 'doom_type': 2002, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351262: {'name': 'Unholy Cathedral (E3M5) - Plasma gun', + 'episode': 3, + 'map': 5, + 'index': 86, + 'doom_type': 2004, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351263: {'name': 'Unholy Cathedral (E3M5) - Supercharge', + 'episode': 3, + 'map': 5, + 'index': 87, + 'doom_type': 2013, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351264: {'name': 'Unholy Cathedral (E3M5) - Yellow skull key', + 'episode': 3, + 'map': 5, + 'index': 89, + 'doom_type': 39, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351265: {'name': 'Unholy Cathedral (E3M5) - Invulnerability', + 'episode': 3, + 'map': 5, + 'index': 90, + 'doom_type': 2022, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351266: {'name': 'Unholy Cathedral (E3M5) - Berserk', + 'episode': 3, + 'map': 5, + 'index': 126, + 'doom_type': 2023, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351267: {'name': 'Unholy Cathedral (E3M5) - Partial invisibility', + 'episode': 3, + 'map': 5, + 'index': 129, + 'doom_type': 2024, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351268: {'name': 'Unholy Cathedral (E3M5) - Chainsaw', + 'episode': 3, + 'map': 5, + 'index': 133, + 'doom_type': 2005, + 'region': "Unholy Cathedral (E3M5) Yellow"}, + 351269: {'name': 'Unholy Cathedral (E3M5) - BFG9000', + 'episode': 3, + 'map': 5, + 'index': 180, + 'doom_type': 2006, + 'region': "Unholy Cathedral (E3M5) Blue"}, + 351270: {'name': 'Unholy Cathedral (E3M5) - Shotgun', + 'episode': 3, + 'map': 5, + 'index': 187, + 'doom_type': 2001, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351271: {'name': 'Unholy Cathedral (E3M5) - Shotgun 2', + 'episode': 3, + 'map': 5, + 'index': 190, + 'doom_type': 2001, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351272: {'name': 'Unholy Cathedral (E3M5) - Rocket launcher', + 'episode': 3, + 'map': 5, + 'index': 218, + 'doom_type': 2003, + 'region': "Unholy Cathedral (E3M5) Main"}, + 351273: {'name': 'Unholy Cathedral (E3M5) - Supercharge 2', + 'episode': 3, + 'map': 5, + 'index': 285, + 'doom_type': 2013, + 'region': "Unholy Cathedral (E3M5) Yellow"}, + 351274: {'name': 'Mt. Erebus (E3M6) - Mega Armor', + 'episode': 3, + 'map': 6, + 'index': 38, + 'doom_type': 2019, + 'region': "Mt. Erebus (E3M6) Main"}, + 351275: {'name': 'Mt. Erebus (E3M6) - Armor', + 'episode': 3, + 'map': 6, + 'index': 53, + 'doom_type': 2018, + 'region': "Mt. Erebus (E3M6) Main"}, + 351276: {'name': 'Mt. Erebus (E3M6) - Backpack', + 'episode': 3, + 'map': 6, + 'index': 90, + 'doom_type': 8, + 'region': "Mt. Erebus (E3M6) Main"}, + 351277: {'name': 'Mt. Erebus (E3M6) - Invulnerability', + 'episode': 3, + 'map': 6, + 'index': 100, + 'doom_type': 2022, + 'region': "Mt. Erebus (E3M6) Main"}, + 351278: {'name': 'Mt. Erebus (E3M6) - Chaingun', + 'episode': 3, + 'map': 6, + 'index': 103, + 'doom_type': 2002, + 'region': "Mt. Erebus (E3M6) Main"}, + 351279: {'name': 'Mt. Erebus (E3M6) - Shotgun', + 'episode': 3, + 'map': 6, + 'index': 104, + 'doom_type': 2001, + 'region': "Mt. Erebus (E3M6) Main"}, + 351280: {'name': 'Mt. Erebus (E3M6) - Rocket launcher', + 'episode': 3, + 'map': 6, + 'index': 105, + 'doom_type': 2003, + 'region': "Mt. Erebus (E3M6) Main"}, + 351281: {'name': 'Mt. Erebus (E3M6) - Plasma gun', + 'episode': 3, + 'map': 6, + 'index': 168, + 'doom_type': 2004, + 'region': "Mt. Erebus (E3M6) Main"}, + 351282: {'name': 'Mt. Erebus (E3M6) - Armor 2', + 'episode': 3, + 'map': 6, + 'index': 180, + 'doom_type': 2018, + 'region': "Mt. Erebus (E3M6) Main"}, + 351283: {'name': 'Mt. Erebus (E3M6) - Berserk', + 'episode': 3, + 'map': 6, + 'index': 206, + 'doom_type': 2023, + 'region': "Mt. Erebus (E3M6) Main"}, + 351284: {'name': 'Mt. Erebus (E3M6) - Invulnerability 2', + 'episode': 3, + 'map': 6, + 'index': 207, + 'doom_type': 2022, + 'region': "Mt. Erebus (E3M6) Main"}, + 351285: {'name': 'Mt. Erebus (E3M6) - Supercharge', + 'episode': 3, + 'map': 6, + 'index': 249, + 'doom_type': 2013, + 'region': "Mt. Erebus (E3M6) Main"}, + 351286: {'name': 'Mt. Erebus (E3M6) - Blue skull key', + 'episode': 3, + 'map': 6, + 'index': 250, + 'doom_type': 40, + 'region': "Mt. Erebus (E3M6) Main"}, + 351287: {'name': 'Mt. Erebus (E3M6) - Blue skull key 2', + 'episode': 3, + 'map': 6, + 'index': 251, + 'doom_type': 40, + 'region': "Mt. Erebus (E3M6) Main"}, + 351288: {'name': 'Mt. Erebus (E3M6) - Computer area map', + 'episode': 3, + 'map': 6, + 'index': 267, + 'doom_type': 2026, + 'region': "Mt. Erebus (E3M6) Main"}, + 351289: {'name': 'Mt. Erebus (E3M6) - Chainsaw', + 'episode': 3, + 'map': 6, + 'index': 273, + 'doom_type': 2005, + 'region': "Mt. Erebus (E3M6) Main"}, + 351290: {'name': 'Mt. Erebus (E3M6) - Supercharge 2', + 'episode': 3, + 'map': 6, + 'index': 326, + 'doom_type': 2013, + 'region': "Mt. Erebus (E3M6) Main"}, + 351291: {'name': 'Limbo (E3M7) - Blue skull key', + 'episode': 3, + 'map': 7, + 'index': 22, + 'doom_type': 40, + 'region': "Limbo (E3M7) Main"}, + 351292: {'name': 'Limbo (E3M7) - Supercharge', + 'episode': 3, + 'map': 7, + 'index': 49, + 'doom_type': 2013, + 'region': "Limbo (E3M7) Main"}, + 351293: {'name': 'Limbo (E3M7) - Rocket launcher', + 'episode': 3, + 'map': 7, + 'index': 51, + 'doom_type': 2003, + 'region': "Limbo (E3M7) Main"}, + 351294: {'name': 'Limbo (E3M7) - Red skull key', + 'episode': 3, + 'map': 7, + 'index': 57, + 'doom_type': 38, + 'region': "Limbo (E3M7) Blue"}, + 351295: {'name': 'Limbo (E3M7) - Backpack', + 'episode': 3, + 'map': 7, + 'index': 60, + 'doom_type': 8, + 'region': "Limbo (E3M7) Main"}, + 351296: {'name': 'Limbo (E3M7) - Plasma gun', + 'episode': 3, + 'map': 7, + 'index': 65, + 'doom_type': 2004, + 'region': "Limbo (E3M7) Red"}, + 351297: {'name': 'Limbo (E3M7) - Armor', + 'episode': 3, + 'map': 7, + 'index': 67, + 'doom_type': 2018, + 'region': "Limbo (E3M7) Red"}, + 351298: {'name': 'Limbo (E3M7) - Yellow skull key', + 'episode': 3, + 'map': 7, + 'index': 69, + 'doom_type': 39, + 'region': "Limbo (E3M7) Red"}, + 351299: {'name': 'Limbo (E3M7) - Armor 2', + 'episode': 3, + 'map': 7, + 'index': 83, + 'doom_type': 2018, + 'region': "Limbo (E3M7) Main"}, + 351300: {'name': 'Limbo (E3M7) - Mega Armor', + 'episode': 3, + 'map': 7, + 'index': 112, + 'doom_type': 2019, + 'region': "Limbo (E3M7) Main"}, + 351301: {'name': 'Limbo (E3M7) - BFG9000', + 'episode': 3, + 'map': 7, + 'index': 128, + 'doom_type': 2006, + 'region': "Limbo (E3M7) Blue"}, + 351302: {'name': 'Dis (E3M8) - Rocket launcher', + 'episode': 3, + 'map': 8, + 'index': 7, + 'doom_type': 2003, + 'region': "Dis (E3M8) Main"}, + 351303: {'name': 'Dis (E3M8) - Plasma gun', + 'episode': 3, + 'map': 8, + 'index': 8, + 'doom_type': 2004, + 'region': "Dis (E3M8) Main"}, + 351304: {'name': 'Dis (E3M8) - Mega Armor', + 'episode': 3, + 'map': 8, + 'index': 34, + 'doom_type': 2019, + 'region': "Dis (E3M8) Main"}, + 351305: {'name': 'Warrens (E3M9) - Shotgun', + 'episode': 3, + 'map': 9, + 'index': 20, + 'doom_type': 2001, + 'region': "Warrens (E3M9) Main"}, + 351306: {'name': 'Warrens (E3M9) - Rocket launcher', + 'episode': 3, + 'map': 9, + 'index': 46, + 'doom_type': 2003, + 'region': "Warrens (E3M9) Main"}, + 351307: {'name': 'Warrens (E3M9) - Rocket launcher 2', + 'episode': 3, + 'map': 9, + 'index': 99, + 'doom_type': 2003, + 'region': "Warrens (E3M9) Main"}, + 351308: {'name': 'Warrens (E3M9) - Supercharge', + 'episode': 3, + 'map': 9, + 'index': 101, + 'doom_type': 2013, + 'region': "Warrens (E3M9) Main"}, + 351309: {'name': 'Warrens (E3M9) - Blue skull key', + 'episode': 3, + 'map': 9, + 'index': 108, + 'doom_type': 40, + 'region': "Warrens (E3M9) Main"}, + 351310: {'name': 'Warrens (E3M9) - Berserk', + 'episode': 3, + 'map': 9, + 'index': 114, + 'doom_type': 2023, + 'region': "Warrens (E3M9) Main"}, + 351311: {'name': 'Warrens (E3M9) - Invulnerability', + 'episode': 3, + 'map': 9, + 'index': 120, + 'doom_type': 2022, + 'region': "Warrens (E3M9) Main"}, + 351312: {'name': 'Warrens (E3M9) - Partial invisibility', + 'episode': 3, + 'map': 9, + 'index': 121, + 'doom_type': 2024, + 'region': "Warrens (E3M9) Main"}, + 351313: {'name': 'Warrens (E3M9) - Chaingun', + 'episode': 3, + 'map': 9, + 'index': 122, + 'doom_type': 2002, + 'region': "Warrens (E3M9) Main"}, + 351314: {'name': 'Warrens (E3M9) - Plasma gun', + 'episode': 3, + 'map': 9, + 'index': 135, + 'doom_type': 2004, + 'region': "Warrens (E3M9) Main"}, + 351315: {'name': 'Warrens (E3M9) - Invulnerability 2', + 'episode': 3, + 'map': 9, + 'index': 138, + 'doom_type': 2022, + 'region': "Warrens (E3M9) Main"}, + 351316: {'name': 'Warrens (E3M9) - Armor', + 'episode': 3, + 'map': 9, + 'index': 139, + 'doom_type': 2018, + 'region': "Warrens (E3M9) Main"}, + 351317: {'name': 'Warrens (E3M9) - Chainsaw', + 'episode': 3, + 'map': 9, + 'index': 140, + 'doom_type': 2005, + 'region': "Warrens (E3M9) Main"}, + 351318: {'name': 'Warrens (E3M9) - BFG9000', + 'episode': 3, + 'map': 9, + 'index': 141, + 'doom_type': 2006, + 'region': "Warrens (E3M9) Main"}, + 351319: {'name': 'Warrens (E3M9) - Red skull key', + 'episode': 3, + 'map': 9, + 'index': 143, + 'doom_type': 38, + 'region': "Warrens (E3M9) Main"}, + 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', + 'episode': 1, + 'map': 6, + 'index': -1, + 'doom_type': -1, + 'region': "Central Processing (E1M6) Blue Yellow"}, + 351322: {'name': 'Command Center (E2M5) - Complete', + 'episode': 2, + 'map': 5, + 'index': -1, + 'doom_type': -1, + 'region': "Command Center (E2M5) Main"}, + 351323: {'name': 'Command Control (E1M4) - Complete', + 'episode': 1, + 'map': 4, + 'index': -1, + 'doom_type': -1, + 'region': "Command Control (E1M4) Main"}, + 351324: {'name': 'Computer Station (E1M7) - Complete', + 'episode': 1, + 'map': 7, + 'index': -1, + 'doom_type': -1, + 'region': "Computer Station (E1M7) Blue"}, + 351325: {'name': 'Containment Area (E2M2) - Complete', + 'episode': 2, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "Containment Area (E2M2) Red"}, + 351326: {'name': 'Deimos Anomaly (E2M1) - Complete', + 'episode': 2, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "Deimos Anomaly (E2M1) Blue"}, + 351327: {'name': 'Deimos Lab (E2M4) - Complete', + 'episode': 2, + 'map': 4, + 'index': -1, + 'doom_type': -1, + 'region': "Deimos Lab (E2M4) Blue Yellow"}, + 351328: {'name': 'Dis (E3M8) - Complete', + 'episode': 3, + 'map': 8, + 'index': -1, + 'doom_type': -1, + 'region': "Dis (E3M8) Main"}, + 351329: {'name': 'Fortress of Mystery (E2M9) - Complete', + 'episode': 2, + 'map': 9, + 'index': -1, + 'doom_type': -1, + 'region': "Fortress of Mystery (E2M9) Yellow"}, + 351330: {'name': 'Halls of the Damned (E2M6) - Complete', + 'episode': 2, + 'map': 6, + 'index': -1, + 'doom_type': -1, + 'region': "Halls of the Damned (E2M6) Blue Yellow Red"}, + 351331: {'name': 'Hangar (E1M1) - Complete', + 'episode': 1, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "Hangar (E1M1) Main"}, + 351332: {'name': 'Hell Keep (E3M1) - Complete', + 'episode': 3, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "Hell Keep (E3M1) Narrow"}, + 351333: {'name': 'House of Pain (E3M4) - Complete', + 'episode': 3, + 'map': 4, + 'index': -1, + 'doom_type': -1, + 'region': "House of Pain (E3M4) Blue Red"}, + 351334: {'name': 'Limbo (E3M7) - Complete', + 'episode': 3, + 'map': 7, + 'index': -1, + 'doom_type': -1, + 'region': "Limbo (E3M7) Yellow Red"}, + 351335: {'name': 'Military Base (E1M9) - Complete', + 'episode': 1, + 'map': 9, + 'index': -1, + 'doom_type': -1, + 'region': "Military Base (E1M9) Blue"}, + 351336: {'name': 'Mt. Erebus (E3M6) - Complete', + 'episode': 3, + 'map': 6, + 'index': -1, + 'doom_type': -1, + 'region': "Mt. Erebus (E3M6) Blue"}, + 351337: {'name': 'Nuclear Plant (E1M2) - Complete', + 'episode': 1, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "Nuclear Plant (E1M2) Red"}, + 351338: {'name': 'Pandemonium (E3M3) - Complete', + 'episode': 3, + 'map': 3, + 'index': -1, + 'doom_type': -1, + 'region': "Pandemonium (E3M3) Blue"}, + 351339: {'name': 'Phobos Anomaly (E1M8) - Complete', + 'episode': 1, + 'map': 8, + 'index': -1, + 'doom_type': -1, + 'region': "Phobos Anomaly (E1M8) Main"}, + 351340: {'name': 'Phobos Lab (E1M5) - Complete', + 'episode': 1, + 'map': 5, + 'index': -1, + 'doom_type': -1, + 'region': "Phobos Lab (E1M5) Blue Yellow"}, + 351341: {'name': 'Refinery (E2M3) - Complete', + 'episode': 2, + 'map': 3, + 'index': -1, + 'doom_type': -1, + 'region': "Refinery (E2M3) Blue"}, + 351342: {'name': 'Slough of Despair (E3M2) - Complete', + 'episode': 3, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "Slough of Despair (E3M2) Blue"}, + 351343: {'name': 'Spawning Vats (E2M7) - Complete', + 'episode': 2, + 'map': 7, + 'index': -1, + 'doom_type': -1, + 'region': "Spawning Vats (E2M7) Red"}, + 351344: {'name': 'Tower of Babel (E2M8) - Complete', + 'episode': 2, + 'map': 8, + 'index': -1, + 'doom_type': -1, + 'region': "Tower of Babel (E2M8) Main"}, + 351345: {'name': 'Toxin Refinery (E1M3) - Complete', + 'episode': 1, + 'map': 3, + 'index': -1, + 'doom_type': -1, + 'region': "Toxin Refinery (E1M3) Blue"}, + 351346: {'name': 'Unholy Cathedral (E3M5) - Complete', + 'episode': 3, + 'map': 5, + 'index': -1, + 'doom_type': -1, + 'region': "Unholy Cathedral (E3M5) Blue"}, + 351347: {'name': 'Warrens (E3M9) - Complete', + 'episode': 3, + 'map': 9, + 'index': -1, + 'doom_type': -1, + 'region': "Warrens (E3M9) Red"}, +} + + +location_name_groups: Dict[str, Set[str]] = { + 'Central Processing (E1M6)': { + 'Central Processing (E1M6) - Armor', + 'Central Processing (E1M6) - Armor 2', + 'Central Processing (E1M6) - Armor 3', + 'Central Processing (E1M6) - Armor 4', + 'Central Processing (E1M6) - Backpack', + 'Central Processing (E1M6) - Backpack 2', + '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) - Mega Armor', + 'Central Processing (E1M6) - Partial invisibility', + 'Central Processing (E1M6) - Partial invisibility 2', + 'Central Processing (E1M6) - Red keycard', + 'Central Processing (E1M6) - Rocket launcher', + 'Central Processing (E1M6) - Shotgun', + 'Central Processing (E1M6) - Supercharge', + 'Central Processing (E1M6) - Supercharge 2', + 'Central Processing (E1M6) - Yellow keycard', + }, + 'Command Center (E2M5)': { + 'Command Center (E2M5) - Armor', + 'Command Center (E2M5) - Armor 2', + 'Command Center (E2M5) - Backpack', + '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) - Mega Armor', + 'Command Center (E2M5) - Partial invisibility', + 'Command Center (E2M5) - Plasma gun', + }, + 'Command Control (E1M4)': { + 'Command Control (E1M4) - Armor', + 'Command Control (E1M4) - Backpack', + 'Command Control (E1M4) - Blue keycard', + 'Command Control (E1M4) - Chaingun', + 'Command Control (E1M4) - Complete', + 'Command Control (E1M4) - Mega Armor', + 'Command Control (E1M4) - Rocket launcher', + 'Command Control (E1M4) - Shotgun', + 'Command Control (E1M4) - Supercharge', + 'Command Control (E1M4) - Yellow keycard', + }, + 'Computer Station (E1M7)': { + 'Computer Station (E1M7) - Armor', + 'Computer Station (E1M7) - Armor 2', + 'Computer Station (E1M7) - Backpack', + '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) - Mega Armor', + 'Computer Station (E1M7) - Partial invisibility', + 'Computer Station (E1M7) - Red keycard', + 'Computer Station (E1M7) - Rocket launcher', + 'Computer Station (E1M7) - Shotgun', + 'Computer Station (E1M7) - Shotgun 2', + 'Computer Station (E1M7) - Supercharge', + 'Computer Station (E1M7) - Yellow keycard', + }, + 'Containment Area (E2M2)': { + 'Containment Area (E2M2) - Armor', + 'Containment Area (E2M2) - Armor 2', + 'Containment Area (E2M2) - Armor 3', + 'Containment Area (E2M2) - Armor 4', + 'Containment Area (E2M2) - Backpack', + 'Containment Area (E2M2) - Backpack 2', + 'Containment Area (E2M2) - Berserk', + '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) - Mega Armor', + 'Containment Area (E2M2) - Plasma gun', + 'Containment Area (E2M2) - Red keycard', + 'Containment Area (E2M2) - Rocket launcher', + 'Containment Area (E2M2) - Shotgun', + 'Containment Area (E2M2) - Shotgun 2', + 'Containment Area (E2M2) - Supercharge', + 'Containment Area (E2M2) - Yellow keycard', + }, + '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) - Mega Armor', + 'Deimos Anomaly (E2M1) - Plasma gun', + 'Deimos Anomaly (E2M1) - Red keycard', + 'Deimos Anomaly (E2M1) - Shotgun', + 'Deimos Anomaly (E2M1) - Shotgun 2', + }, + 'Deimos Lab (E2M4)': { + 'Deimos Lab (E2M4) - Armor', + 'Deimos Lab (E2M4) - Armor 2', + 'Deimos Lab (E2M4) - Armor 3', + 'Deimos Lab (E2M4) - Backpack', + '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) - Mega Armor', + 'Deimos Lab (E2M4) - Partial invisibility', + 'Deimos Lab (E2M4) - Partial invisibility 2', + 'Deimos Lab (E2M4) - Plasma gun', + 'Deimos Lab (E2M4) - Shotgun', + 'Deimos Lab (E2M4) - Supercharge', + 'Deimos Lab (E2M4) - Supercharge 2', + 'Deimos Lab (E2M4) - Yellow keycard', + }, + 'Dis (E3M8)': { + 'Dis (E3M8) - Complete', + 'Dis (E3M8) - Mega Armor', + 'Dis (E3M8) - Plasma gun', + 'Dis (E3M8) - Rocket launcher', + }, + 'Fortress of Mystery (E2M9)': { + 'Fortress of Mystery (E2M9) - Backpack', + '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) - Mega Armor', + 'Fortress of Mystery (E2M9) - Plasma gun', + 'Fortress of Mystery (E2M9) - Red skull key', + 'Fortress of Mystery (E2M9) - Rocket launcher', + 'Fortress of Mystery (E2M9) - Shotgun', + 'Fortress of Mystery (E2M9) - Supercharge', + 'Fortress of Mystery (E2M9) - Yellow skull key', + }, + 'Halls of the Damned (E2M6)': { + 'Halls of the Damned (E2M6) - Armor', + 'Halls of the Damned (E2M6) - Backpack', + 'Halls of the Damned (E2M6) - Berserk', + '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) - Mega Armor', + 'Halls of the Damned (E2M6) - Partial invisibility', + 'Halls of the Damned (E2M6) - Partial invisibility 2', + 'Halls of the Damned (E2M6) - Partial invisibility 3', + 'Halls of the Damned (E2M6) - Plasma gun', + 'Halls of the Damned (E2M6) - Red skull key', + 'Halls of the Damned (E2M6) - Rocket launcher', + 'Halls of the Damned (E2M6) - Shotgun', + 'Halls of the Damned (E2M6) - Supercharge', + 'Halls of the Damned (E2M6) - Yellow skull key', + }, + 'Hangar (E1M1)': { + 'Hangar (E1M1) - Armor', + 'Hangar (E1M1) - Complete', + 'Hangar (E1M1) - Mega Armor', + 'Hangar (E1M1) - Shotgun', + }, + 'Hell Keep (E3M1)': { + 'Hell Keep (E3M1) - Complete', + 'Hell Keep (E3M1) - Rocket launcher', + 'Hell Keep (E3M1) - Shotgun', + }, + 'House of Pain (E3M4)': { + 'House of Pain (E3M4) - Armor', + 'House of Pain (E3M4) - Armor 2', + 'House of Pain (E3M4) - Armor 3', + 'House of Pain (E3M4) - BFG9000', + 'House of Pain (E3M4) - Backpack', + '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) - Invulnerability', + 'House of Pain (E3M4) - Invulnerability 2', + 'House of Pain (E3M4) - Mega Armor', + 'House of Pain (E3M4) - Mega Armor 2', + 'House of Pain (E3M4) - Partial invisibility', + 'House of Pain (E3M4) - Red skull key', + 'House of Pain (E3M4) - Rocket launcher', + 'House of Pain (E3M4) - Shotgun', + 'House of Pain (E3M4) - Supercharge', + 'House of Pain (E3M4) - Yellow skull key', + }, + 'Limbo (E3M7)': { + 'Limbo (E3M7) - Armor', + 'Limbo (E3M7) - Armor 2', + 'Limbo (E3M7) - BFG9000', + 'Limbo (E3M7) - Backpack', + 'Limbo (E3M7) - Blue skull key', + 'Limbo (E3M7) - Complete', + 'Limbo (E3M7) - Mega Armor', + 'Limbo (E3M7) - Plasma gun', + 'Limbo (E3M7) - Red skull key', + 'Limbo (E3M7) - Rocket launcher', + 'Limbo (E3M7) - Supercharge', + 'Limbo (E3M7) - Yellow skull key', + }, + 'Military Base (E1M9)': { + 'Military Base (E1M9) - Armor', + 'Military Base (E1M9) - Backpack', + 'Military Base (E1M9) - Blue keycard', + 'Military Base (E1M9) - Chaingun', + 'Military Base (E1M9) - Chainsaw', + 'Military Base (E1M9) - Complete', + 'Military Base (E1M9) - Red keycard', + 'Military Base (E1M9) - Rocket launcher', + 'Military Base (E1M9) - Shotgun', + 'Military Base (E1M9) - Yellow keycard', + }, + 'Mt. Erebus (E3M6)': { + 'Mt. Erebus (E3M6) - Armor', + 'Mt. Erebus (E3M6) - Armor 2', + 'Mt. Erebus (E3M6) - Backpack', + 'Mt. Erebus (E3M6) - Berserk', + 'Mt. Erebus (E3M6) - Blue skull key', + '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) - Invulnerability', + 'Mt. Erebus (E3M6) - Invulnerability 2', + 'Mt. Erebus (E3M6) - Mega Armor', + 'Mt. Erebus (E3M6) - Plasma gun', + 'Mt. Erebus (E3M6) - Rocket launcher', + 'Mt. Erebus (E3M6) - Shotgun', + 'Mt. Erebus (E3M6) - Supercharge', + 'Mt. Erebus (E3M6) - Supercharge 2', + }, + 'Nuclear Plant (E1M2)': { + 'Nuclear Plant (E1M2) - Armor', + 'Nuclear Plant (E1M2) - Armor 2', + 'Nuclear Plant (E1M2) - Armor 3', + 'Nuclear Plant (E1M2) - Backpack', + 'Nuclear Plant (E1M2) - Backpack 2', + 'Nuclear Plant (E1M2) - Chaingun', + 'Nuclear Plant (E1M2) - Chainsaw', + 'Nuclear Plant (E1M2) - Complete', + 'Nuclear Plant (E1M2) - Mega Armor', + 'Nuclear Plant (E1M2) - Red keycard', + 'Nuclear Plant (E1M2) - Shotgun', + 'Nuclear Plant (E1M2) - Supercharge', + }, + 'Pandemonium (E3M3)': { + 'Pandemonium (E3M3) - Armor', + 'Pandemonium (E3M3) - BFG9000', + 'Pandemonium (E3M3) - Backpack', + 'Pandemonium (E3M3) - Berserk', + 'Pandemonium (E3M3) - Blue skull key', + 'Pandemonium (E3M3) - Chaingun', + 'Pandemonium (E3M3) - Complete', + 'Pandemonium (E3M3) - Computer area map', + 'Pandemonium (E3M3) - Invulnerability', + 'Pandemonium (E3M3) - Mega Armor', + 'Pandemonium (E3M3) - Mega Armor 2', + 'Pandemonium (E3M3) - Rocket launcher', + 'Pandemonium (E3M3) - Shotgun', + 'Pandemonium (E3M3) - Shotgun 2', + 'Pandemonium (E3M3) - Supercharge', + }, + 'Phobos Anomaly (E1M8)': { + 'Phobos Anomaly (E1M8) - Armor', + 'Phobos Anomaly (E1M8) - Chaingun', + 'Phobos Anomaly (E1M8) - Complete', + 'Phobos Anomaly (E1M8) - Computer area map', + 'Phobos Anomaly (E1M8) - Partial invisibility', + 'Phobos Anomaly (E1M8) - Shotgun', + 'Phobos Anomaly (E1M8) - Shotgun 2', + 'Phobos Anomaly (E1M8) - Supercharge', + }, + 'Phobos Lab (E1M5)': { + 'Phobos Lab (E1M5) - Armor', + 'Phobos Lab (E1M5) - Armor 2', + 'Phobos Lab (E1M5) - Backpack', + '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) - Mega Armor', + 'Phobos Lab (E1M5) - Mega Armor 2', + 'Phobos Lab (E1M5) - Partial invisibility', + 'Phobos Lab (E1M5) - Rocket launcher', + 'Phobos Lab (E1M5) - Shotgun', + 'Phobos Lab (E1M5) - Shotgun 2', + 'Phobos Lab (E1M5) - Shotgun 3', + 'Phobos Lab (E1M5) - Supercharge', + 'Phobos Lab (E1M5) - Yellow keycard', + }, + 'Refinery (E2M3)': { + 'Refinery (E2M3) - Armor', + 'Refinery (E2M3) - Backpack', + 'Refinery (E2M3) - Berserk', + 'Refinery (E2M3) - Blue keycard', + 'Refinery (E2M3) - Chaingun', + 'Refinery (E2M3) - Complete', + 'Refinery (E2M3) - Mega Armor', + 'Refinery (E2M3) - Partial invisibility', + 'Refinery (E2M3) - Partial invisibility 2', + 'Refinery (E2M3) - Plasma gun', + 'Refinery (E2M3) - Shotgun', + 'Refinery (E2M3) - Supercharge', + }, + 'Slough of Despair (E3M2)': { + 'Slough of Despair (E3M2) - Armor', + '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) - Mega Armor', + 'Slough of Despair (E3M2) - Plasma gun', + 'Slough of Despair (E3M2) - Rocket launcher', + 'Slough of Despair (E3M2) - Supercharge', + }, + 'Spawning Vats (E2M7)': { + 'Spawning Vats (E2M7) - Armor', + 'Spawning Vats (E2M7) - Backpack', + 'Spawning Vats (E2M7) - Berserk', + '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) - Invulnerability', + 'Spawning Vats (E2M7) - Invulnerability 2', + 'Spawning Vats (E2M7) - Mega Armor', + 'Spawning Vats (E2M7) - Partial invisibility', + 'Spawning Vats (E2M7) - Plasma gun', + 'Spawning Vats (E2M7) - Red keycard', + 'Spawning Vats (E2M7) - Rocket launcher', + 'Spawning Vats (E2M7) - Supercharge', + 'Spawning Vats (E2M7) - Yellow keycard', + }, + 'Tower of Babel (E2M8)': { + 'Tower of Babel (E2M8) - Complete', + 'Tower of Babel (E2M8) - Mega Armor', + 'Tower of Babel (E2M8) - Rocket launcher', + 'Tower of Babel (E2M8) - Supercharge', + 'Tower of Babel (E2M8) - Supercharge 2', + }, + 'Toxin Refinery (E1M3)': { + 'Toxin Refinery (E1M3) - Armor', + 'Toxin Refinery (E1M3) - Armor 2', + 'Toxin Refinery (E1M3) - Armor 3', + 'Toxin Refinery (E1M3) - Backpack', + 'Toxin Refinery (E1M3) - Blue keycard', + 'Toxin Refinery (E1M3) - Chaingun', + 'Toxin Refinery (E1M3) - Chainsaw', + 'Toxin Refinery (E1M3) - Complete', + 'Toxin Refinery (E1M3) - Mega Armor', + 'Toxin Refinery (E1M3) - Partial invisibility', + 'Toxin Refinery (E1M3) - Rocket launcher', + 'Toxin Refinery (E1M3) - Shotgun', + 'Toxin Refinery (E1M3) - Shotgun 2', + 'Toxin Refinery (E1M3) - Supercharge', + 'Toxin Refinery (E1M3) - Supercharge 2', + 'Toxin Refinery (E1M3) - Yellow keycard', + }, + 'Unholy Cathedral (E3M5)': { + 'Unholy Cathedral (E3M5) - BFG9000', + 'Unholy Cathedral (E3M5) - Berserk', + 'Unholy Cathedral (E3M5) - Blue skull key', + 'Unholy Cathedral (E3M5) - Chaingun', + 'Unholy Cathedral (E3M5) - Chainsaw', + 'Unholy Cathedral (E3M5) - Complete', + 'Unholy Cathedral (E3M5) - Invulnerability', + 'Unholy Cathedral (E3M5) - Partial invisibility', + 'Unholy Cathedral (E3M5) - Plasma gun', + 'Unholy Cathedral (E3M5) - Rocket launcher', + 'Unholy Cathedral (E3M5) - Shotgun', + 'Unholy Cathedral (E3M5) - Shotgun 2', + 'Unholy Cathedral (E3M5) - Supercharge', + 'Unholy Cathedral (E3M5) - Supercharge 2', + 'Unholy Cathedral (E3M5) - Yellow skull key', + }, + 'Warrens (E3M9)': { + 'Warrens (E3M9) - Armor', + 'Warrens (E3M9) - BFG9000', + 'Warrens (E3M9) - Berserk', + 'Warrens (E3M9) - Blue skull key', + 'Warrens (E3M9) - Chaingun', + 'Warrens (E3M9) - Chainsaw', + 'Warrens (E3M9) - Complete', + 'Warrens (E3M9) - Invulnerability', + 'Warrens (E3M9) - Invulnerability 2', + 'Warrens (E3M9) - Partial invisibility', + 'Warrens (E3M9) - Plasma gun', + 'Warrens (E3M9) - Red skull key', + 'Warrens (E3M9) - Rocket launcher', + 'Warrens (E3M9) - Rocket launcher 2', + 'Warrens (E3M9) - Shotgun', + 'Warrens (E3M9) - Supercharge', + 'Warrens (E3M9) - Supercharge 2', + }, +} + + +death_logic_locations = [ + "Command Control (E1M4) - Supercharge", + "Command Control (E1M4) - Mega Armor", + "Containment Area (E2M2) - Supercharge", + "House of Pain (E3M4) - Chaingun", + "House of Pain (E3M4) - Invulnerability", + "Pandemonium (E3M3) - Mega Armor", + "Unholy Cathedral (E3M5) - BFG9000", +] diff --git a/worlds/doom_1993/Options.py b/worlds/doom_1993/Options.py new file mode 100644 index 000000000000..4e4c24f20c98 --- /dev/null +++ b/worlds/doom_1993/Options.py @@ -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 +} diff --git a/worlds/doom_1993/Regions.py b/worlds/doom_1993/Regions.py new file mode 100644 index 000000000000..d3d395bbbcdc --- /dev/null +++ b/worlds/doom_1993/Regions.py @@ -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", +] diff --git a/worlds/doom_1993/Rules.py b/worlds/doom_1993/Rules.py new file mode 100644 index 000000000000..094703161b20 --- /dev/null +++ b/worlds/doom_1993/Rules.py @@ -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))) + diff --git a/worlds/doom_1993/__init__.py b/worlds/doom_1993/__init__.py new file mode 100644 index 000000000000..c147f1822110 --- /dev/null +++ b/worlds/doom_1993/__init__.py @@ -0,0 +1,287 @@ +from __future__ import annotations + +import logging +from typing import List, Dict, Any, Set + +from BaseClasses import LocationProgressType, Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld +from worlds.AutoWorld import World, WebWorld + +from . import Items, Locations, Options, Rules, Events, Regions + + +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 + self.item_count = 0 + + super().__init__(world, player) + + + def get_episode_count(self): + count = 0 + for ep in self.included_episodes: + if ep: + count +=1 + return count + + + def generate_early(self): + # Cache which episodes are included + for i in range(0, 3): + self.included_episodes[i] = getattr(self.multiworld, "episode" + str(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 + self.multiworld.regions.append(Region("Menu", self.player, self.multiworld)) + self.multiworld.regions.append(Region("Mars", self.player, self.multiworld)) + + # Maps' regions + for region_name in Regions.regions: + self.multiworld.regions.append(Region(region_name, self.player, self.multiworld)) + + # Add locations to regions + for loc_id in Locations.location_table: + loc = Locations.location_table[loc_id] + if not self.included_episodes[loc["episode"] - 1]: + continue + if loc["index"] == -1: + loc_id = None + self.create_location(loc_id, loc, self.multiworld.get_region(loc["region"], self.player)) + self.location_count += 1 + + # Create exits + self.multiworld.get_region("Menu", self.player).exits.append(Entrance(self.player, "Menu -> Mars", self.multiworld.get_region("Menu", self.player))) + self.multiworld.get_entrance("Menu -> Mars", self.player).connect(self.multiworld.get_region("Mars", self.player)) + + # Rest of regions + for region_name in Regions.regions: + self.create_2way_exit("Mars", region_name) + + + def create_2way_exit(self, region1_name, region2_name): + region1 = self.multiworld.get_region(region1_name, self.player) + region2 = self.multiworld.get_region(region2_name, self.player) + + entrance1 = Entrance(self.player, region1_name + " -> " + region2_name, region1) + entrance2 = Entrance(self.player, region2_name + " -> " + region1_name, region2) + + region1.exits.append(entrance1) + region2.exits.append(entrance2) + + entrance1.connect(region2) + entrance2.connect(region1) + + + def completion_rule(self, state): + for event in Events.events: + if not (event 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) + + + def create_item(self, name: str) -> DOOM1993Item: + item_id: int = self.item_name_to_id[name] + doom_1993_item = DOOM1993Item(name, Items.item_table[item_id]["classification"], item_id, player=self.player) + return doom_1993_item + + + def create_item_with_classification(self, name: str, classification: ItemClassification) -> DOOM1993Item: + item_id: int = self.item_name_to_id[name] + doom_1993_item = DOOM1993Item(name, classification, item_id, player=self.player) + return doom_1993_item + + + 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 = self.get_episode_count() == 1 and self.included_episodes[0] + + # 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"] == "BFG9000" or item["name"] == "Plasma Gun") and is_only_first_episode: + continue # Don't include those guns in first episode + count = item["count"] + if str(item["name"]) in self.starting_level_for_episode: + count -= 1 + for i in range(0, count): + classification = item["classification"] + doom_1993_item = self.create_item_with_classification(item["name"], classification) + # See create_regions + if item["name"] != "Warrens (E3M9) - Blue skull key" and \ + item["name"] != "Halls of the Damned (E2M6) - Yellow skull key": + self.multiworld.itempool += [doom_1993_item] + self.item_count += 1 + + # Place end level items in locked locations + for event in Events.events: + if not event 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( + DOOM1993Item(event, ItemClassification.progression, None, player=self.player)) + 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") + self.create_ratioed_items("Mega Armor") + self.create_ratioed_items("Berserk") + self.create_ratioed_items("Invulnerability") + self.create_ratioed_items("Partial invisibility") + self.create_ratioed_items("Supercharge") + + remaining_loc = self.location_count - self.item_count + fillers = [ + "Medikit", + "Box of bullets", + "Box of rockets", + "Box of shotgun shells", + "Energy cell pack" + ] + while remaining_loc > 0: + remaining_loc -= 1 + item = self.create_item_with_classification(self.multiworld.random.choice(fillers), ItemClassification.filler) + self.multiworld.itempool.append(item) + self.item_count += 1 + + + def create_ratioed_items(self, item_name): + remaining_loc = self.location_count - self.item_count + ep_count = self.get_episode_count() + count = min(remaining_loc, max(1, int(round(self.items_ratio[item_name] * ep_count / 3)))) # Was balanced for 3 episodes + if count == 0: + logger.warning("Warning, no ", item_name, " will be placed.") + for i in range(count): + classification = Items.item_table[self.item_name_to_id[item_name]]['classification'] + item = self.create_item_with_classification(item_name, classification) + self.multiworld.itempool.append(item) + self.item_count += 1 + + + def fill_slot_data(self) -> Dict[str, Any]: + slot_data = {} + + for option_name in self.option_definitions: + option = getattr(self.multiworld, option_name)[self.player] + slot_data[option_name] = option.value + + return slot_data + + + def create_location(self, loc_id, loc, region): + loc_name = loc["name"] + doom1993_location = DOOM1993Location(self.player, loc_name, loc_id, region) + + # 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 not getattr(self.multiworld, "allow_death_logic")[self.player].value and loc_name in Locations.death_logic_locations: + doom1993_location.progress_type = LocationProgressType.EXCLUDED + + region.locations.append(doom1993_location) diff --git a/worlds/doom_1993/docs/en_DOOM 1993.md b/worlds/doom_1993/docs/en_DOOM 1993.md new file mode 100644 index 000000000000..0419741bc308 --- /dev/null +++ b/worlds/doom_1993/docs/en_DOOM 1993.md @@ -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. diff --git a/worlds/doom_1993/docs/setup_en.md b/worlds/doom_1993/docs/setup_en.md new file mode 100644 index 000000000000..5afe6d3e26e4 --- /dev/null +++ b/worlds/doom_1993/docs/setup_en.md @@ -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.