From c5b0330223eedcf49b3c4299e424f28045970d58 Mon Sep 17 00:00:00 2001 From: David St-Louis Date: Fri, 24 Nov 2023 12:08:02 -0500 Subject: [PATCH] DOOM II: implement new game (#2255) --- README.md | 2 + worlds/doom_ii/Items.py | 1071 +++++++++ worlds/doom_ii/Locations.py | 3442 +++++++++++++++++++++++++++++ worlds/doom_ii/Maps.py | 39 + worlds/doom_ii/Options.py | 150 ++ worlds/doom_ii/Regions.py | 502 +++++ worlds/doom_ii/Rules.py | 501 +++++ worlds/doom_ii/__init__.py | 267 +++ worlds/doom_ii/docs/en_DOOM II.md | 23 + worlds/doom_ii/docs/setup_en.md | 51 + 10 files changed, 6048 insertions(+) create mode 100644 worlds/doom_ii/Items.py create mode 100644 worlds/doom_ii/Locations.py create mode 100644 worlds/doom_ii/Maps.py create mode 100644 worlds/doom_ii/Options.py create mode 100644 worlds/doom_ii/Regions.py create mode 100644 worlds/doom_ii/Rules.py create mode 100644 worlds/doom_ii/__init__.py create mode 100644 worlds/doom_ii/docs/en_DOOM II.md create mode 100644 worlds/doom_ii/docs/setup_en.md diff --git a/README.md b/README.md index a6a48294..a57f0f98 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ Currently, the following games are supported: * Terraria * Lingo * Pokémon Emerald +* DOOM II + For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/worlds/doom_ii/Items.py b/worlds/doom_ii/Items.py new file mode 100644 index 00000000..fc426cc8 --- /dev/null +++ b/worlds/doom_ii/Items.py @@ -0,0 +1,1071 @@ +# 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. -1 is level item, -2 is level complete item. + episode: int # Relevant if that item targets a specific level, like keycard or map reveal pickup. + map: int + + +item_table: Dict[int, ItemDict] = { + 360000: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Shotgun', + 'doom_type': 2001, + 'episode': -1, + 'map': -1}, + 360001: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Rocket launcher', + 'doom_type': 2003, + 'episode': -1, + 'map': -1}, + 360002: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Plasma gun', + 'doom_type': 2004, + 'episode': -1, + 'map': -1}, + 360003: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Chainsaw', + 'doom_type': 2005, + 'episode': -1, + 'map': -1}, + 360004: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Chaingun', + 'doom_type': 2002, + 'episode': -1, + 'map': -1}, + 360005: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'BFG9000', + 'doom_type': 2006, + 'episode': -1, + 'map': -1}, + 360006: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Super Shotgun', + 'doom_type': 82, + 'episode': -1, + 'map': -1}, + 360007: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Backpack', + 'doom_type': 8, + 'episode': -1, + 'map': -1}, + 360008: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Armor', + 'doom_type': 2018, + 'episode': -1, + 'map': -1}, + 360009: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Mega Armor', + 'doom_type': 2019, + 'episode': -1, + 'map': -1}, + 360010: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Berserk', + 'doom_type': 2023, + 'episode': -1, + 'map': -1}, + 360011: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Invulnerability', + 'doom_type': 2022, + 'episode': -1, + 'map': -1}, + 360012: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Partial invisibility', + 'doom_type': 2024, + 'episode': -1, + 'map': -1}, + 360013: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Supercharge', + 'doom_type': 2013, + 'episode': -1, + 'map': -1}, + 360014: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Megasphere', + 'doom_type': 83, + 'episode': -1, + 'map': -1}, + 360015: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Medikit', + 'doom_type': 2012, + 'episode': -1, + 'map': -1}, + 360016: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Box of bullets', + 'doom_type': 2048, + 'episode': -1, + 'map': -1}, + 360017: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Box of rockets', + 'doom_type': 2046, + 'episode': -1, + 'map': -1}, + 360018: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Box of shotgun shells', + 'doom_type': 2049, + 'episode': -1, + 'map': -1}, + 360019: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Energy cell pack', + 'doom_type': 17, + 'episode': -1, + 'map': -1}, + 360200: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Underhalls (MAP02) - Red keycard', + 'doom_type': 13, + 'episode': 1, + 'map': 2}, + 360201: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Underhalls (MAP02) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 2}, + 360202: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Gantlet (MAP03) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 3}, + 360203: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Gantlet (MAP03) - Red keycard', + 'doom_type': 13, + 'episode': 1, + 'map': 3}, + 360204: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Focus (MAP04) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 4}, + 360205: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Focus (MAP04) - Red keycard', + 'doom_type': 13, + 'episode': 1, + 'map': 4}, + 360206: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Focus (MAP04) - Yellow keycard', + 'doom_type': 6, + 'episode': 1, + 'map': 4}, + 360207: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Waste Tunnels (MAP05) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 5}, + 360208: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Waste Tunnels (MAP05) - Red keycard', + 'doom_type': 13, + 'episode': 1, + 'map': 5}, + 360209: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Waste Tunnels (MAP05) - Yellow keycard', + 'doom_type': 6, + 'episode': 1, + 'map': 5}, + 360210: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Crusher (MAP06) - Red keycard', + 'doom_type': 13, + 'episode': 1, + 'map': 6}, + 360211: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Crusher (MAP06) - Yellow keycard', + 'doom_type': 6, + 'episode': 1, + 'map': 6}, + 360212: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Crusher (MAP06) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 6}, + 360213: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tricks and Traps (MAP08) - Yellow skull key', + 'doom_type': 39, + 'episode': 1, + 'map': 8}, + 360214: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tricks and Traps (MAP08) - Red skull key', + 'doom_type': 38, + 'episode': 1, + 'map': 8}, + 360215: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Pit (MAP09) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 9}, + 360216: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Pit (MAP09) - Yellow keycard', + 'doom_type': 6, + 'episode': 1, + 'map': 9}, + 360217: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Refueling Base (MAP10) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 10}, + 360218: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Refueling Base (MAP10) - Yellow keycard', + 'doom_type': 6, + 'episode': 1, + 'map': 10}, + 360219: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Circle of Death (MAP11) - Red keycard', + 'doom_type': 13, + 'episode': 1, + 'map': 11}, + 360220: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Circle of Death (MAP11) - Blue keycard', + 'doom_type': 5, + 'episode': 1, + 'map': 11}, + 360221: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Factory (MAP12) - Blue keycard', + 'doom_type': 5, + 'episode': 2, + 'map': 1}, + 360222: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Factory (MAP12) - Yellow keycard', + 'doom_type': 6, + 'episode': 2, + 'map': 1}, + 360223: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Downtown (MAP13) - Blue keycard', + 'doom_type': 5, + 'episode': 2, + 'map': 2}, + 360224: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Downtown (MAP13) - Yellow keycard', + 'doom_type': 6, + 'episode': 2, + 'map': 2}, + 360225: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Downtown (MAP13) - Red keycard', + 'doom_type': 13, + 'episode': 2, + 'map': 2}, + 360226: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Inmost Dens (MAP14) - Red skull key', + 'doom_type': 38, + 'episode': 2, + 'map': 3}, + 360227: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Inmost Dens (MAP14) - Blue skull key', + 'doom_type': 40, + 'episode': 2, + 'map': 3}, + 360228: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Industrial Zone (MAP15) - Yellow keycard', + 'doom_type': 6, + 'episode': 2, + 'map': 4}, + 360229: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Industrial Zone (MAP15) - Red keycard', + 'doom_type': 13, + 'episode': 2, + 'map': 4}, + 360230: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Industrial Zone (MAP15) - Blue keycard', + 'doom_type': 5, + 'episode': 2, + 'map': 4}, + 360231: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Suburbs (MAP16) - Blue skull key', + 'doom_type': 40, + 'episode': 2, + 'map': 5}, + 360232: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Suburbs (MAP16) - Red skull key', + 'doom_type': 38, + 'episode': 2, + 'map': 5}, + 360233: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tenements (MAP17) - Red keycard', + 'doom_type': 13, + 'episode': 2, + 'map': 6}, + 360234: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tenements (MAP17) - Blue keycard', + 'doom_type': 5, + 'episode': 2, + 'map': 6}, + 360235: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tenements (MAP17) - Yellow skull key', + 'doom_type': 39, + 'episode': 2, + 'map': 6}, + 360236: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Courtyard (MAP18) - Yellow skull key', + 'doom_type': 39, + 'episode': 2, + 'map': 7}, + 360237: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Courtyard (MAP18) - Blue skull key', + 'doom_type': 40, + 'episode': 2, + 'map': 7}, + 360238: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Citadel (MAP19) - Blue skull key', + 'doom_type': 40, + 'episode': 2, + 'map': 8}, + 360239: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Citadel (MAP19) - Red skull key', + 'doom_type': 38, + 'episode': 2, + 'map': 8}, + 360240: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Citadel (MAP19) - Yellow skull key', + 'doom_type': 39, + 'episode': 2, + 'map': 8}, + 360241: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Nirvana (MAP21) - Yellow skull key', + 'doom_type': 39, + 'episode': 3, + 'map': 1}, + 360242: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Nirvana (MAP21) - Blue skull key', + 'doom_type': 40, + 'episode': 3, + 'map': 1}, + 360243: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Nirvana (MAP21) - Red skull key', + 'doom_type': 38, + 'episode': 3, + 'map': 1}, + 360244: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Catacombs (MAP22) - Blue skull key', + 'doom_type': 40, + 'episode': 3, + 'map': 2}, + 360245: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Catacombs (MAP22) - Red skull key', + 'doom_type': 38, + 'episode': 3, + 'map': 2}, + 360246: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Barrels o Fun (MAP23) - Yellow skull key', + 'doom_type': 39, + 'episode': 3, + 'map': 3}, + 360247: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Chasm (MAP24) - Blue keycard', + 'doom_type': 5, + 'episode': 3, + 'map': 4}, + 360248: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Chasm (MAP24) - Red keycard', + 'doom_type': 13, + 'episode': 3, + 'map': 4}, + 360249: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Bloodfalls (MAP25) - Blue skull key', + 'doom_type': 40, + 'episode': 3, + 'map': 5}, + 360250: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Abandoned Mines (MAP26) - Blue keycard', + 'doom_type': 5, + 'episode': 3, + 'map': 6}, + 360251: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Abandoned Mines (MAP26) - Red keycard', + 'doom_type': 13, + 'episode': 3, + 'map': 6}, + 360252: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Abandoned Mines (MAP26) - Yellow keycard', + 'doom_type': 6, + 'episode': 3, + 'map': 6}, + 360253: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Monster Condo (MAP27) - Yellow skull key', + 'doom_type': 39, + 'episode': 3, + 'map': 7}, + 360254: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Monster Condo (MAP27) - Red skull key', + 'doom_type': 38, + 'episode': 3, + 'map': 7}, + 360255: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Monster Condo (MAP27) - Blue skull key', + 'doom_type': 40, + 'episode': 3, + 'map': 7}, + 360256: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Spirit World (MAP28) - Yellow skull key', + 'doom_type': 39, + 'episode': 3, + 'map': 8}, + 360257: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Spirit World (MAP28) - Red skull key', + 'doom_type': 38, + 'episode': 3, + 'map': 8}, + 360400: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Entryway (MAP01)', + 'doom_type': -1, + 'episode': 1, + 'map': 1}, + 360401: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Entryway (MAP01) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 1}, + 360402: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Entryway (MAP01) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 1}, + 360403: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Underhalls (MAP02)', + 'doom_type': -1, + 'episode': 1, + 'map': 2}, + 360404: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Underhalls (MAP02) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 2}, + 360405: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Underhalls (MAP02) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 2}, + 360406: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Gantlet (MAP03)', + 'doom_type': -1, + 'episode': 1, + 'map': 3}, + 360407: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Gantlet (MAP03) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 3}, + 360408: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Gantlet (MAP03) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 3}, + 360409: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Focus (MAP04)', + 'doom_type': -1, + 'episode': 1, + 'map': 4}, + 360410: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Focus (MAP04) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 4}, + 360411: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Focus (MAP04) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 4}, + 360412: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Waste Tunnels (MAP05)', + 'doom_type': -1, + 'episode': 1, + 'map': 5}, + 360413: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Waste Tunnels (MAP05) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 5}, + 360414: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Waste Tunnels (MAP05) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 5}, + 360415: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Crusher (MAP06)', + 'doom_type': -1, + 'episode': 1, + 'map': 6}, + 360416: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Crusher (MAP06) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 6}, + 360417: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Crusher (MAP06) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 6}, + 360418: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Dead Simple (MAP07)', + 'doom_type': -1, + 'episode': 1, + 'map': 7}, + 360419: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Dead Simple (MAP07) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 7}, + 360420: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Dead Simple (MAP07) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 7}, + 360421: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tricks and Traps (MAP08)', + 'doom_type': -1, + 'episode': 1, + 'map': 8}, + 360422: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tricks and Traps (MAP08) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 8}, + 360423: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Tricks and Traps (MAP08) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 8}, + 360424: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Pit (MAP09)', + 'doom_type': -1, + 'episode': 1, + 'map': 9}, + 360425: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Pit (MAP09) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 9}, + 360426: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Pit (MAP09) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 9}, + 360427: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Refueling Base (MAP10)', + 'doom_type': -1, + 'episode': 1, + 'map': 10}, + 360428: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Refueling Base (MAP10) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 10}, + 360429: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Refueling Base (MAP10) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 10}, + 360430: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Circle of Death (MAP11)', + 'doom_type': -1, + 'episode': 1, + 'map': 11}, + 360431: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Circle of Death (MAP11) - Complete', + 'doom_type': -2, + 'episode': 1, + 'map': 11}, + 360432: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Circle of Death (MAP11) - Computer area map', + 'doom_type': 2026, + 'episode': 1, + 'map': 11}, + 360433: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Factory (MAP12)', + 'doom_type': -1, + 'episode': 2, + 'map': 1}, + 360434: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Factory (MAP12) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 1}, + 360435: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Factory (MAP12) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 1}, + 360436: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Downtown (MAP13)', + 'doom_type': -1, + 'episode': 2, + 'map': 2}, + 360437: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Downtown (MAP13) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 2}, + 360438: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Downtown (MAP13) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 2}, + 360439: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Inmost Dens (MAP14)', + 'doom_type': -1, + 'episode': 2, + 'map': 3}, + 360440: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Inmost Dens (MAP14) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 3}, + 360441: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Inmost Dens (MAP14) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 3}, + 360442: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Industrial Zone (MAP15)', + 'doom_type': -1, + 'episode': 2, + 'map': 4}, + 360443: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Industrial Zone (MAP15) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 4}, + 360444: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Industrial Zone (MAP15) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 4}, + 360445: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Suburbs (MAP16)', + 'doom_type': -1, + 'episode': 2, + 'map': 5}, + 360446: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Suburbs (MAP16) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 5}, + 360447: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Suburbs (MAP16) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 5}, + 360448: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tenements (MAP17)', + 'doom_type': -1, + 'episode': 2, + 'map': 6}, + 360449: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Tenements (MAP17) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 6}, + 360450: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Tenements (MAP17) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 6}, + 360451: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Courtyard (MAP18)', + 'doom_type': -1, + 'episode': 2, + 'map': 7}, + 360452: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Courtyard (MAP18) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 7}, + 360453: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Courtyard (MAP18) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 7}, + 360454: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Citadel (MAP19)', + 'doom_type': -1, + 'episode': 2, + 'map': 8}, + 360455: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Citadel (MAP19) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 8}, + 360456: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Citadel (MAP19) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 8}, + 360457: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Gotcha! (MAP20)', + 'doom_type': -1, + 'episode': 2, + 'map': 9}, + 360458: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Gotcha! (MAP20) - Complete', + 'doom_type': -2, + 'episode': 2, + 'map': 9}, + 360459: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Gotcha! (MAP20) - Computer area map', + 'doom_type': 2026, + 'episode': 2, + 'map': 9}, + 360460: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Nirvana (MAP21)', + 'doom_type': -1, + 'episode': 3, + 'map': 1}, + 360461: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Nirvana (MAP21) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 1}, + 360462: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Nirvana (MAP21) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 1}, + 360463: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Catacombs (MAP22)', + 'doom_type': -1, + 'episode': 3, + 'map': 2}, + 360464: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Catacombs (MAP22) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 2}, + 360465: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Catacombs (MAP22) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 2}, + 360466: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Barrels o Fun (MAP23)', + 'doom_type': -1, + 'episode': 3, + 'map': 3}, + 360467: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Barrels o Fun (MAP23) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 3}, + 360468: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Barrels o Fun (MAP23) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 3}, + 360469: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Chasm (MAP24)', + 'doom_type': -1, + 'episode': 3, + 'map': 4}, + 360470: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Chasm (MAP24) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 4}, + 360471: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Chasm (MAP24) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 4}, + 360472: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Bloodfalls (MAP25)', + 'doom_type': -1, + 'episode': 3, + 'map': 5}, + 360473: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Bloodfalls (MAP25) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 5}, + 360474: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Bloodfalls (MAP25) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 5}, + 360475: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Abandoned Mines (MAP26)', + 'doom_type': -1, + 'episode': 3, + 'map': 6}, + 360476: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Abandoned Mines (MAP26) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 6}, + 360477: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Abandoned Mines (MAP26) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 6}, + 360478: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Monster Condo (MAP27)', + 'doom_type': -1, + 'episode': 3, + 'map': 7}, + 360479: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Monster Condo (MAP27) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 7}, + 360480: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Monster Condo (MAP27) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 7}, + 360481: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Spirit World (MAP28)', + 'doom_type': -1, + 'episode': 3, + 'map': 8}, + 360482: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Spirit World (MAP28) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 8}, + 360483: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Spirit World (MAP28) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 8}, + 360484: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Living End (MAP29)', + 'doom_type': -1, + 'episode': 3, + 'map': 9}, + 360485: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'The Living End (MAP29) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 9}, + 360486: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'The Living End (MAP29) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 9}, + 360487: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Icon of Sin (MAP30)', + 'doom_type': -1, + 'episode': 3, + 'map': 10}, + 360488: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Icon of Sin (MAP30) - Complete', + 'doom_type': -2, + 'episode': 3, + 'map': 10}, + 360489: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Icon of Sin (MAP30) - Computer area map', + 'doom_type': 2026, + 'episode': 3, + 'map': 10}, + 360490: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Wolfenstein2 (MAP31)', + 'doom_type': -1, + 'episode': 4, + 'map': 1}, + 360491: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Wolfenstein2 (MAP31) - Complete', + 'doom_type': -2, + 'episode': 4, + 'map': 1}, + 360492: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Wolfenstein2 (MAP31) - Computer area map', + 'doom_type': 2026, + 'episode': 4, + 'map': 1}, + 360493: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Grosse2 (MAP32)', + 'doom_type': -1, + 'episode': 4, + 'map': 2}, + 360494: {'classification': ItemClassification.progression, + 'count': 1, + 'name': 'Grosse2 (MAP32) - Complete', + 'doom_type': -2, + 'episode': 4, + 'map': 2}, + 360495: {'classification': ItemClassification.filler, + 'count': 1, + 'name': 'Grosse2 (MAP32) - Computer area map', + 'doom_type': 2026, + 'episode': 4, + 'map': 2}, +} + + +item_name_groups: Dict[str, Set[str]] = { + 'Ammos': {'Box of bullets', 'Box of rockets', 'Box of shotgun shells', 'Energy cell pack', }, + 'Computer area maps': {'Barrels o Fun (MAP23) - Computer area map', 'Bloodfalls (MAP25) - Computer area map', 'Circle of Death (MAP11) - Computer area map', 'Dead Simple (MAP07) - Computer area map', 'Downtown (MAP13) - Computer area map', 'Entryway (MAP01) - Computer area map', 'Gotcha! (MAP20) - Computer area map', 'Grosse2 (MAP32) - Computer area map', 'Icon of Sin (MAP30) - Computer area map', 'Industrial Zone (MAP15) - Computer area map', 'Monster Condo (MAP27) - Computer area map', 'Nirvana (MAP21) - Computer area map', 'Refueling Base (MAP10) - Computer area map', 'Suburbs (MAP16) - Computer area map', 'Tenements (MAP17) - Computer area map', 'The Abandoned Mines (MAP26) - Computer area map', 'The Catacombs (MAP22) - Computer area map', 'The Chasm (MAP24) - Computer area map', 'The Citadel (MAP19) - Computer area map', 'The Courtyard (MAP18) - Computer area map', 'The Crusher (MAP06) - Computer area map', 'The Factory (MAP12) - Computer area map', 'The Focus (MAP04) - Computer area map', 'The Gantlet (MAP03) - Computer area map', 'The Inmost Dens (MAP14) - Computer area map', 'The Living End (MAP29) - Computer area map', 'The Pit (MAP09) - Computer area map', 'The Spirit World (MAP28) - Computer area map', 'The Waste Tunnels (MAP05) - Computer area map', 'Tricks and Traps (MAP08) - Computer area map', 'Underhalls (MAP02) - Computer area map', 'Wolfenstein2 (MAP31) - Computer area map', }, + 'Keys': {'Barrels o Fun (MAP23) - Yellow skull key', 'Bloodfalls (MAP25) - Blue skull key', 'Circle of Death (MAP11) - Blue keycard', 'Circle of Death (MAP11) - Red keycard', 'Downtown (MAP13) - Blue keycard', 'Downtown (MAP13) - Red keycard', 'Downtown (MAP13) - Yellow keycard', 'Industrial Zone (MAP15) - Blue keycard', 'Industrial Zone (MAP15) - Red keycard', 'Industrial Zone (MAP15) - Yellow keycard', 'Monster Condo (MAP27) - Blue skull key', 'Monster Condo (MAP27) - Red skull key', 'Monster Condo (MAP27) - Yellow skull key', 'Nirvana (MAP21) - Blue skull key', 'Nirvana (MAP21) - Red skull key', 'Nirvana (MAP21) - Yellow skull key', 'Refueling Base (MAP10) - Blue keycard', 'Refueling Base (MAP10) - Yellow keycard', 'Suburbs (MAP16) - Blue skull key', 'Suburbs (MAP16) - Red skull key', 'Tenements (MAP17) - Blue keycard', 'Tenements (MAP17) - Red keycard', 'Tenements (MAP17) - Yellow skull key', 'The Abandoned Mines (MAP26) - Blue keycard', 'The Abandoned Mines (MAP26) - Red keycard', 'The Abandoned Mines (MAP26) - Yellow keycard', 'The Catacombs (MAP22) - Blue skull key', 'The Catacombs (MAP22) - Red skull key', 'The Chasm (MAP24) - Blue keycard', 'The Chasm (MAP24) - Red keycard', 'The Citadel (MAP19) - Blue skull key', 'The Citadel (MAP19) - Red skull key', 'The Citadel (MAP19) - Yellow skull key', 'The Courtyard (MAP18) - Blue skull key', 'The Courtyard (MAP18) - Yellow skull key', 'The Crusher (MAP06) - Blue keycard', 'The Crusher (MAP06) - Red keycard', 'The Crusher (MAP06) - Yellow keycard', 'The Factory (MAP12) - Blue keycard', 'The Factory (MAP12) - Yellow keycard', 'The Focus (MAP04) - Blue keycard', 'The Focus (MAP04) - Red keycard', 'The Focus (MAP04) - Yellow keycard', 'The Gantlet (MAP03) - Blue keycard', 'The Gantlet (MAP03) - Red keycard', 'The Inmost Dens (MAP14) - Blue skull key', 'The Inmost Dens (MAP14) - Red skull key', 'The Pit (MAP09) - Blue keycard', 'The Pit (MAP09) - Yellow keycard', 'The Spirit World (MAP28) - Red skull key', 'The Spirit World (MAP28) - Yellow skull key', 'The Waste Tunnels (MAP05) - Blue keycard', 'The Waste Tunnels (MAP05) - Red keycard', 'The Waste Tunnels (MAP05) - Yellow keycard', 'Tricks and Traps (MAP08) - Red skull key', 'Tricks and Traps (MAP08) - Yellow skull key', 'Underhalls (MAP02) - Blue keycard', 'Underhalls (MAP02) - Red keycard', }, + 'Levels': {'Barrels o Fun (MAP23)', 'Bloodfalls (MAP25)', 'Circle of Death (MAP11)', 'Dead Simple (MAP07)', 'Downtown (MAP13)', 'Entryway (MAP01)', 'Gotcha! (MAP20)', 'Grosse2 (MAP32)', 'Icon of Sin (MAP30)', 'Industrial Zone (MAP15)', 'Monster Condo (MAP27)', 'Nirvana (MAP21)', 'Refueling Base (MAP10)', 'Suburbs (MAP16)', 'Tenements (MAP17)', 'The Abandoned Mines (MAP26)', 'The Catacombs (MAP22)', 'The Chasm (MAP24)', 'The Citadel (MAP19)', 'The Courtyard (MAP18)', 'The Crusher (MAP06)', 'The Factory (MAP12)', 'The Focus (MAP04)', 'The Gantlet (MAP03)', 'The Inmost Dens (MAP14)', 'The Living End (MAP29)', 'The Pit (MAP09)', 'The Spirit World (MAP28)', 'The Waste Tunnels (MAP05)', 'Tricks and Traps (MAP08)', 'Underhalls (MAP02)', 'Wolfenstein2 (MAP31)', }, + 'Powerups': {'Armor', 'Berserk', 'Invulnerability', 'Mega Armor', 'Megasphere', 'Partial invisibility', 'Supercharge', }, + 'Weapons': {'BFG9000', 'Chaingun', 'Chainsaw', 'Plasma gun', 'Rocket launcher', 'Shotgun', 'Super Shotgun', }, +} diff --git a/worlds/doom_ii/Locations.py b/worlds/doom_ii/Locations.py new file mode 100644 index 00000000..3ce87b8a --- /dev/null +++ b/worlds/doom_ii/Locations.py @@ -0,0 +1,3442 @@ +# 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] = { + 361000: {'name': 'Entryway (MAP01) - Armor', + 'episode': 1, + 'map': 1, + 'index': 17, + 'doom_type': 2018, + 'region': "Entryway (MAP01) Main"}, + 361001: {'name': 'Entryway (MAP01) - Shotgun', + 'episode': 1, + 'map': 1, + 'index': 37, + 'doom_type': 2001, + 'region': "Entryway (MAP01) Main"}, + 361002: {'name': 'Entryway (MAP01) - Rocket launcher', + 'episode': 1, + 'map': 1, + 'index': 52, + 'doom_type': 2003, + 'region': "Entryway (MAP01) Main"}, + 361003: {'name': 'Entryway (MAP01) - Chainsaw', + 'episode': 1, + 'map': 1, + 'index': 68, + 'doom_type': 2005, + 'region': "Entryway (MAP01) Main"}, + 361004: {'name': 'Entryway (MAP01) - Exit', + 'episode': 1, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "Entryway (MAP01) Main"}, + 361005: {'name': 'Underhalls (MAP02) - Red keycard', + 'episode': 1, + 'map': 2, + 'index': 31, + 'doom_type': 13, + 'region': "Underhalls (MAP02) Main"}, + 361006: {'name': 'Underhalls (MAP02) - Blue keycard', + 'episode': 1, + 'map': 2, + 'index': 44, + 'doom_type': 5, + 'region': "Underhalls (MAP02) Red"}, + 361007: {'name': 'Underhalls (MAP02) - Mega Armor', + 'episode': 1, + 'map': 2, + 'index': 116, + 'doom_type': 2019, + 'region': "Underhalls (MAP02) Main"}, + 361008: {'name': 'Underhalls (MAP02) - Super Shotgun', + 'episode': 1, + 'map': 2, + 'index': 127, + 'doom_type': 82, + 'region': "Underhalls (MAP02) Main"}, + 361009: {'name': 'Underhalls (MAP02) - Exit', + 'episode': 1, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "Underhalls (MAP02) Blue"}, + 361010: {'name': 'The Gantlet (MAP03) - Mega Armor', + 'episode': 1, + 'map': 3, + 'index': 5, + 'doom_type': 2019, + 'region': "The Gantlet (MAP03) Main"}, + 361011: {'name': 'The Gantlet (MAP03) - Shotgun', + 'episode': 1, + 'map': 3, + 'index': 6, + 'doom_type': 2001, + 'region': "The Gantlet (MAP03) Main"}, + 361012: {'name': 'The Gantlet (MAP03) - Blue keycard', + 'episode': 1, + 'map': 3, + 'index': 85, + 'doom_type': 5, + 'region': "The Gantlet (MAP03) Main"}, + 361013: {'name': 'The Gantlet (MAP03) - Rocket launcher', + 'episode': 1, + 'map': 3, + 'index': 86, + 'doom_type': 2003, + 'region': "The Gantlet (MAP03) Main"}, + 361014: {'name': 'The Gantlet (MAP03) - Partial invisibility', + 'episode': 1, + 'map': 3, + 'index': 96, + 'doom_type': 2024, + 'region': "The Gantlet (MAP03) Main"}, + 361015: {'name': 'The Gantlet (MAP03) - Supercharge', + 'episode': 1, + 'map': 3, + 'index': 97, + 'doom_type': 2013, + 'region': "The Gantlet (MAP03) Main"}, + 361016: {'name': 'The Gantlet (MAP03) - Mega Armor 2', + 'episode': 1, + 'map': 3, + 'index': 98, + 'doom_type': 2019, + 'region': "The Gantlet (MAP03) Main"}, + 361017: {'name': 'The Gantlet (MAP03) - Red keycard', + 'episode': 1, + 'map': 3, + 'index': 104, + 'doom_type': 13, + 'region': "The Gantlet (MAP03) Blue"}, + 361018: {'name': 'The Gantlet (MAP03) - Chaingun', + 'episode': 1, + 'map': 3, + 'index': 122, + 'doom_type': 2002, + 'region': "The Gantlet (MAP03) Main"}, + 361019: {'name': 'The Gantlet (MAP03) - Backpack', + 'episode': 1, + 'map': 3, + 'index': 146, + 'doom_type': 8, + 'region': "The Gantlet (MAP03) Blue"}, + 361020: {'name': 'The Gantlet (MAP03) - Exit', + 'episode': 1, + 'map': 3, + 'index': -1, + 'doom_type': -1, + 'region': "The Gantlet (MAP03) Red"}, + 361021: {'name': 'The Focus (MAP04) - Super Shotgun', + 'episode': 1, + 'map': 4, + 'index': 4, + 'doom_type': 82, + 'region': "The Focus (MAP04) Main"}, + 361022: {'name': 'The Focus (MAP04) - Blue keycard', + 'episode': 1, + 'map': 4, + 'index': 21, + 'doom_type': 5, + 'region': "The Focus (MAP04) Main"}, + 361023: {'name': 'The Focus (MAP04) - Red keycard', + 'episode': 1, + 'map': 4, + 'index': 32, + 'doom_type': 13, + 'region': "The Focus (MAP04) Blue"}, + 361024: {'name': 'The Focus (MAP04) - Yellow keycard', + 'episode': 1, + 'map': 4, + 'index': 59, + 'doom_type': 6, + 'region': "The Focus (MAP04) Red"}, + 361025: {'name': 'The Focus (MAP04) - Exit', + 'episode': 1, + 'map': 4, + 'index': -1, + 'doom_type': -1, + 'region': "The Focus (MAP04) Yellow"}, + 361026: {'name': 'The Waste Tunnels (MAP05) - Rocket launcher', + 'episode': 1, + 'map': 5, + 'index': 45, + 'doom_type': 2003, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361027: {'name': 'The Waste Tunnels (MAP05) - Super Shotgun', + 'episode': 1, + 'map': 5, + 'index': 46, + 'doom_type': 82, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361028: {'name': 'The Waste Tunnels (MAP05) - Blue keycard', + 'episode': 1, + 'map': 5, + 'index': 50, + 'doom_type': 5, + 'region': "The Waste Tunnels (MAP05) Red"}, + 361029: {'name': 'The Waste Tunnels (MAP05) - Plasma gun', + 'episode': 1, + 'map': 5, + 'index': 53, + 'doom_type': 2004, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361030: {'name': 'The Waste Tunnels (MAP05) - Red keycard', + 'episode': 1, + 'map': 5, + 'index': 55, + 'doom_type': 13, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361031: {'name': 'The Waste Tunnels (MAP05) - Supercharge', + 'episode': 1, + 'map': 5, + 'index': 56, + 'doom_type': 2013, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361032: {'name': 'The Waste Tunnels (MAP05) - Mega Armor', + 'episode': 1, + 'map': 5, + 'index': 57, + 'doom_type': 2019, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361033: {'name': 'The Waste Tunnels (MAP05) - Yellow keycard', + 'episode': 1, + 'map': 5, + 'index': 78, + 'doom_type': 6, + 'region': "The Waste Tunnels (MAP05) Blue"}, + 361034: {'name': 'The Waste Tunnels (MAP05) - Armor', + 'episode': 1, + 'map': 5, + 'index': 151, + 'doom_type': 2018, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361035: {'name': 'The Waste Tunnels (MAP05) - Supercharge 2', + 'episode': 1, + 'map': 5, + 'index': 170, + 'doom_type': 2013, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361036: {'name': 'The Waste Tunnels (MAP05) - Shotgun', + 'episode': 1, + 'map': 5, + 'index': 202, + 'doom_type': 2001, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361037: {'name': 'The Waste Tunnels (MAP05) - Berserk', + 'episode': 1, + 'map': 5, + 'index': 215, + 'doom_type': 2023, + 'region': "The Waste Tunnels (MAP05) Main"}, + 361038: {'name': 'The Waste Tunnels (MAP05) - Exit', + 'episode': 1, + 'map': 5, + 'index': -1, + 'doom_type': -1, + 'region': "The Waste Tunnels (MAP05) Yellow"}, + 361039: {'name': 'The Crusher (MAP06) - Red keycard', + 'episode': 1, + 'map': 6, + 'index': 0, + 'doom_type': 13, + 'region': "The Crusher (MAP06) Blue"}, + 361040: {'name': 'The Crusher (MAP06) - Yellow keycard', + 'episode': 1, + 'map': 6, + 'index': 1, + 'doom_type': 6, + 'region': "The Crusher (MAP06) Red"}, + 361041: {'name': 'The Crusher (MAP06) - Blue keycard', + 'episode': 1, + 'map': 6, + 'index': 36, + 'doom_type': 5, + 'region': "The Crusher (MAP06) Main"}, + 361042: {'name': 'The Crusher (MAP06) - Supercharge', + 'episode': 1, + 'map': 6, + 'index': 55, + 'doom_type': 2013, + 'region': "The Crusher (MAP06) Main"}, + 361043: {'name': 'The Crusher (MAP06) - Plasma gun', + 'episode': 1, + 'map': 6, + 'index': 59, + 'doom_type': 2004, + 'region': "The Crusher (MAP06) Main"}, + 361044: {'name': 'The Crusher (MAP06) - Blue keycard 2', + 'episode': 1, + 'map': 6, + 'index': 74, + 'doom_type': 5, + 'region': "The Crusher (MAP06) Main"}, + 361045: {'name': 'The Crusher (MAP06) - Blue keycard 3', + 'episode': 1, + 'map': 6, + 'index': 75, + 'doom_type': 5, + 'region': "The Crusher (MAP06) Main"}, + 361046: {'name': 'The Crusher (MAP06) - Megasphere', + 'episode': 1, + 'map': 6, + 'index': 94, + 'doom_type': 83, + 'region': "The Crusher (MAP06) Main"}, + 361047: {'name': 'The Crusher (MAP06) - Armor', + 'episode': 1, + 'map': 6, + 'index': 130, + 'doom_type': 2018, + 'region': "The Crusher (MAP06) Main"}, + 361048: {'name': 'The Crusher (MAP06) - Super Shotgun', + 'episode': 1, + 'map': 6, + 'index': 134, + 'doom_type': 82, + 'region': "The Crusher (MAP06) Blue"}, + 361049: {'name': 'The Crusher (MAP06) - Mega Armor', + 'episode': 1, + 'map': 6, + 'index': 222, + 'doom_type': 2019, + 'region': "The Crusher (MAP06) Blue"}, + 361050: {'name': 'The Crusher (MAP06) - Rocket launcher', + 'episode': 1, + 'map': 6, + 'index': 223, + 'doom_type': 2003, + 'region': "The Crusher (MAP06) Blue"}, + 361051: {'name': 'The Crusher (MAP06) - Backpack', + 'episode': 1, + 'map': 6, + 'index': 225, + 'doom_type': 8, + 'region': "The Crusher (MAP06) Blue"}, + 361052: {'name': 'The Crusher (MAP06) - Megasphere 2', + 'episode': 1, + 'map': 6, + 'index': 246, + 'doom_type': 83, + 'region': "The Crusher (MAP06) Blue"}, + 361053: {'name': 'The Crusher (MAP06) - Exit', + 'episode': 1, + 'map': 6, + 'index': -1, + 'doom_type': -1, + 'region': "The Crusher (MAP06) Yellow"}, + 361054: {'name': 'Dead Simple (MAP07) - Megasphere', + 'episode': 1, + 'map': 7, + 'index': 4, + 'doom_type': 83, + 'region': "Dead Simple (MAP07) Main"}, + 361055: {'name': 'Dead Simple (MAP07) - Rocket launcher', + 'episode': 1, + 'map': 7, + 'index': 5, + 'doom_type': 2003, + 'region': "Dead Simple (MAP07) Main"}, + 361056: {'name': 'Dead Simple (MAP07) - Partial invisibility', + 'episode': 1, + 'map': 7, + 'index': 7, + 'doom_type': 2024, + 'region': "Dead Simple (MAP07) Main"}, + 361057: {'name': 'Dead Simple (MAP07) - Super Shotgun', + 'episode': 1, + 'map': 7, + 'index': 8, + 'doom_type': 82, + 'region': "Dead Simple (MAP07) Main"}, + 361058: {'name': 'Dead Simple (MAP07) - Chaingun', + 'episode': 1, + 'map': 7, + 'index': 9, + 'doom_type': 2002, + 'region': "Dead Simple (MAP07) Main"}, + 361059: {'name': 'Dead Simple (MAP07) - Plasma gun', + 'episode': 1, + 'map': 7, + 'index': 10, + 'doom_type': 2004, + 'region': "Dead Simple (MAP07) Main"}, + 361060: {'name': 'Dead Simple (MAP07) - Backpack', + 'episode': 1, + 'map': 7, + 'index': 43, + 'doom_type': 8, + 'region': "Dead Simple (MAP07) Main"}, + 361061: {'name': 'Dead Simple (MAP07) - Berserk', + 'episode': 1, + 'map': 7, + 'index': 44, + 'doom_type': 2023, + 'region': "Dead Simple (MAP07) Main"}, + 361062: {'name': 'Dead Simple (MAP07) - Partial invisibility 2', + 'episode': 1, + 'map': 7, + 'index': 60, + 'doom_type': 2024, + 'region': "Dead Simple (MAP07) Main"}, + 361063: {'name': 'Dead Simple (MAP07) - Partial invisibility 3', + 'episode': 1, + 'map': 7, + 'index': 73, + 'doom_type': 2024, + 'region': "Dead Simple (MAP07) Main"}, + 361064: {'name': 'Dead Simple (MAP07) - Partial invisibility 4', + 'episode': 1, + 'map': 7, + 'index': 74, + 'doom_type': 2024, + 'region': "Dead Simple (MAP07) Main"}, + 361065: {'name': 'Dead Simple (MAP07) - Exit', + 'episode': 1, + 'map': 7, + 'index': -1, + 'doom_type': -1, + 'region': "Dead Simple (MAP07) Main"}, + 361066: {'name': 'Tricks and Traps (MAP08) - Plasma gun', + 'episode': 1, + 'map': 8, + 'index': 14, + 'doom_type': 2004, + 'region': "Tricks and Traps (MAP08) Main"}, + 361067: {'name': 'Tricks and Traps (MAP08) - Rocket launcher', + 'episode': 1, + 'map': 8, + 'index': 17, + 'doom_type': 2003, + 'region': "Tricks and Traps (MAP08) Main"}, + 361068: {'name': 'Tricks and Traps (MAP08) - Armor', + 'episode': 1, + 'map': 8, + 'index': 36, + 'doom_type': 2018, + 'region': "Tricks and Traps (MAP08) Main"}, + 361069: {'name': 'Tricks and Traps (MAP08) - Chaingun', + 'episode': 1, + 'map': 8, + 'index': 48, + 'doom_type': 2002, + 'region': "Tricks and Traps (MAP08) Main"}, + 361070: {'name': 'Tricks and Traps (MAP08) - Shotgun', + 'episode': 1, + 'map': 8, + 'index': 87, + 'doom_type': 2001, + 'region': "Tricks and Traps (MAP08) Main"}, + 361071: {'name': 'Tricks and Traps (MAP08) - Supercharge', + 'episode': 1, + 'map': 8, + 'index': 119, + 'doom_type': 2013, + 'region': "Tricks and Traps (MAP08) Main"}, + 361072: {'name': 'Tricks and Traps (MAP08) - Invulnerability', + 'episode': 1, + 'map': 8, + 'index': 120, + 'doom_type': 2022, + 'region': "Tricks and Traps (MAP08) Main"}, + 361073: {'name': 'Tricks and Traps (MAP08) - Invulnerability 2', + 'episode': 1, + 'map': 8, + 'index': 122, + 'doom_type': 2022, + 'region': "Tricks and Traps (MAP08) Main"}, + 361074: {'name': 'Tricks and Traps (MAP08) - Yellow skull key', + 'episode': 1, + 'map': 8, + 'index': 123, + 'doom_type': 39, + 'region': "Tricks and Traps (MAP08) Main"}, + 361075: {'name': 'Tricks and Traps (MAP08) - Backpack', + 'episode': 1, + 'map': 8, + 'index': 133, + 'doom_type': 8, + 'region': "Tricks and Traps (MAP08) Main"}, + 361076: {'name': 'Tricks and Traps (MAP08) - Backpack 2', + 'episode': 1, + 'map': 8, + 'index': 134, + 'doom_type': 8, + 'region': "Tricks and Traps (MAP08) Main"}, + 361077: {'name': 'Tricks and Traps (MAP08) - Invulnerability 3', + 'episode': 1, + 'map': 8, + 'index': 135, + 'doom_type': 2022, + 'region': "Tricks and Traps (MAP08) Main"}, + 361078: {'name': 'Tricks and Traps (MAP08) - Invulnerability 4', + 'episode': 1, + 'map': 8, + 'index': 136, + 'doom_type': 2022, + 'region': "Tricks and Traps (MAP08) Main"}, + 361079: {'name': 'Tricks and Traps (MAP08) - BFG9000', + 'episode': 1, + 'map': 8, + 'index': 161, + 'doom_type': 2006, + 'region': "Tricks and Traps (MAP08) Main"}, + 361080: {'name': 'Tricks and Traps (MAP08) - Supercharge 2', + 'episode': 1, + 'map': 8, + 'index': 162, + 'doom_type': 2013, + 'region': "Tricks and Traps (MAP08) Main"}, + 361081: {'name': 'Tricks and Traps (MAP08) - Backpack 3', + 'episode': 1, + 'map': 8, + 'index': 163, + 'doom_type': 8, + 'region': "Tricks and Traps (MAP08) Main"}, + 361082: {'name': 'Tricks and Traps (MAP08) - Backpack 4', + 'episode': 1, + 'map': 8, + 'index': 164, + 'doom_type': 8, + 'region': "Tricks and Traps (MAP08) Main"}, + 361083: {'name': 'Tricks and Traps (MAP08) - Chainsaw', + 'episode': 1, + 'map': 8, + 'index': 168, + 'doom_type': 2005, + 'region': "Tricks and Traps (MAP08) Main"}, + 361084: {'name': 'Tricks and Traps (MAP08) - Red skull key', + 'episode': 1, + 'map': 8, + 'index': 176, + 'doom_type': 38, + 'region': "Tricks and Traps (MAP08) Yellow"}, + 361085: {'name': 'Tricks and Traps (MAP08) - Invulnerability 5', + 'episode': 1, + 'map': 8, + 'index': 202, + 'doom_type': 2022, + 'region': "Tricks and Traps (MAP08) Yellow"}, + 361086: {'name': 'Tricks and Traps (MAP08) - Armor 2', + 'episode': 1, + 'map': 8, + 'index': 220, + 'doom_type': 2018, + 'region': "Tricks and Traps (MAP08) Main"}, + 361087: {'name': 'Tricks and Traps (MAP08) - Backpack 5', + 'episode': 1, + 'map': 8, + 'index': 226, + 'doom_type': 8, + 'region': "Tricks and Traps (MAP08) Main"}, + 361088: {'name': 'Tricks and Traps (MAP08) - Partial invisibility', + 'episode': 1, + 'map': 8, + 'index': 235, + 'doom_type': 2024, + 'region': "Tricks and Traps (MAP08) Main"}, + 361089: {'name': 'Tricks and Traps (MAP08) - Exit', + 'episode': 1, + 'map': 8, + 'index': -1, + 'doom_type': -1, + 'region': "Tricks and Traps (MAP08) Red"}, + 361090: {'name': 'The Pit (MAP09) - Berserk', + 'episode': 1, + 'map': 9, + 'index': 5, + 'doom_type': 2023, + 'region': "The Pit (MAP09) Main"}, + 361091: {'name': 'The Pit (MAP09) - Shotgun', + 'episode': 1, + 'map': 9, + 'index': 21, + 'doom_type': 2001, + 'region': "The Pit (MAP09) Main"}, + 361092: {'name': 'The Pit (MAP09) - Mega Armor', + 'episode': 1, + 'map': 9, + 'index': 26, + 'doom_type': 2019, + 'region': "The Pit (MAP09) Main"}, + 361093: {'name': 'The Pit (MAP09) - Supercharge', + 'episode': 1, + 'map': 9, + 'index': 78, + 'doom_type': 2013, + 'region': "The Pit (MAP09) Main"}, + 361094: {'name': 'The Pit (MAP09) - Berserk 2', + 'episode': 1, + 'map': 9, + 'index': 90, + 'doom_type': 2023, + 'region': "The Pit (MAP09) Main"}, + 361095: {'name': 'The Pit (MAP09) - Rocket launcher', + 'episode': 1, + 'map': 9, + 'index': 92, + 'doom_type': 2003, + 'region': "The Pit (MAP09) Main"}, + 361096: {'name': 'The Pit (MAP09) - BFG9000', + 'episode': 1, + 'map': 9, + 'index': 184, + 'doom_type': 2006, + 'region': "The Pit (MAP09) Main"}, + 361097: {'name': 'The Pit (MAP09) - Blue keycard', + 'episode': 1, + 'map': 9, + 'index': 185, + 'doom_type': 5, + 'region': "The Pit (MAP09) Main"}, + 361098: {'name': 'The Pit (MAP09) - Yellow keycard', + 'episode': 1, + 'map': 9, + 'index': 226, + 'doom_type': 6, + 'region': "The Pit (MAP09) Blue"}, + 361099: {'name': 'The Pit (MAP09) - Backpack', + 'episode': 1, + 'map': 9, + 'index': 244, + 'doom_type': 8, + 'region': "The Pit (MAP09) Blue"}, + 361100: {'name': 'The Pit (MAP09) - Computer area map', + 'episode': 1, + 'map': 9, + 'index': 245, + 'doom_type': 2026, + 'region': "The Pit (MAP09) Blue"}, + 361101: {'name': 'The Pit (MAP09) - Supercharge 2', + 'episode': 1, + 'map': 9, + 'index': 250, + 'doom_type': 2013, + 'region': "The Pit (MAP09) Blue"}, + 361102: {'name': 'The Pit (MAP09) - Mega Armor 2', + 'episode': 1, + 'map': 9, + 'index': 251, + 'doom_type': 2019, + 'region': "The Pit (MAP09) Blue"}, + 361103: {'name': 'The Pit (MAP09) - Berserk 3', + 'episode': 1, + 'map': 9, + 'index': 309, + 'doom_type': 2023, + 'region': "The Pit (MAP09) Blue"}, + 361104: {'name': 'The Pit (MAP09) - Armor', + 'episode': 1, + 'map': 9, + 'index': 348, + 'doom_type': 2018, + 'region': "The Pit (MAP09) Main"}, + 361105: {'name': 'The Pit (MAP09) - Exit', + 'episode': 1, + 'map': 9, + 'index': -1, + 'doom_type': -1, + 'region': "The Pit (MAP09) Yellow"}, + 361106: {'name': 'Refueling Base (MAP10) - BFG9000', + 'episode': 1, + 'map': 10, + 'index': 17, + 'doom_type': 2006, + 'region': "Refueling Base (MAP10) Main"}, + 361107: {'name': 'Refueling Base (MAP10) - Supercharge', + 'episode': 1, + 'map': 10, + 'index': 28, + 'doom_type': 2013, + 'region': "Refueling Base (MAP10) Main"}, + 361108: {'name': 'Refueling Base (MAP10) - Plasma gun', + 'episode': 1, + 'map': 10, + 'index': 29, + 'doom_type': 2004, + 'region': "Refueling Base (MAP10) Main"}, + 361109: {'name': 'Refueling Base (MAP10) - Blue keycard', + 'episode': 1, + 'map': 10, + 'index': 50, + 'doom_type': 5, + 'region': "Refueling Base (MAP10) Main"}, + 361110: {'name': 'Refueling Base (MAP10) - Shotgun', + 'episode': 1, + 'map': 10, + 'index': 99, + 'doom_type': 2001, + 'region': "Refueling Base (MAP10) Main"}, + 361111: {'name': 'Refueling Base (MAP10) - Chaingun', + 'episode': 1, + 'map': 10, + 'index': 158, + 'doom_type': 2002, + 'region': "Refueling Base (MAP10) Main"}, + 361112: {'name': 'Refueling Base (MAP10) - Armor', + 'episode': 1, + 'map': 10, + 'index': 172, + 'doom_type': 2018, + 'region': "Refueling Base (MAP10) Main"}, + 361113: {'name': 'Refueling Base (MAP10) - Rocket launcher', + 'episode': 1, + 'map': 10, + 'index': 291, + 'doom_type': 2003, + 'region': "Refueling Base (MAP10) Main"}, + 361114: {'name': 'Refueling Base (MAP10) - Supercharge 2', + 'episode': 1, + 'map': 10, + 'index': 359, + 'doom_type': 2013, + 'region': "Refueling Base (MAP10) Main"}, + 361115: {'name': 'Refueling Base (MAP10) - Backpack', + 'episode': 1, + 'map': 10, + 'index': 368, + 'doom_type': 8, + 'region': "Refueling Base (MAP10) Main"}, + 361116: {'name': 'Refueling Base (MAP10) - Berserk', + 'episode': 1, + 'map': 10, + 'index': 392, + 'doom_type': 2023, + 'region': "Refueling Base (MAP10) Main"}, + 361117: {'name': 'Refueling Base (MAP10) - Mega Armor', + 'episode': 1, + 'map': 10, + 'index': 395, + 'doom_type': 2019, + 'region': "Refueling Base (MAP10) Main"}, + 361118: {'name': 'Refueling Base (MAP10) - Invulnerability', + 'episode': 1, + 'map': 10, + 'index': 396, + 'doom_type': 2022, + 'region': "Refueling Base (MAP10) Main"}, + 361119: {'name': 'Refueling Base (MAP10) - Invulnerability 2', + 'episode': 1, + 'map': 10, + 'index': 398, + 'doom_type': 2022, + 'region': "Refueling Base (MAP10) Main"}, + 361120: {'name': 'Refueling Base (MAP10) - Armor 2', + 'episode': 1, + 'map': 10, + 'index': 400, + 'doom_type': 2018, + 'region': "Refueling Base (MAP10) Main"}, + 361121: {'name': 'Refueling Base (MAP10) - Berserk 2', + 'episode': 1, + 'map': 10, + 'index': 441, + 'doom_type': 2023, + 'region': "Refueling Base (MAP10) Main"}, + 361122: {'name': 'Refueling Base (MAP10) - Partial invisibility', + 'episode': 1, + 'map': 10, + 'index': 470, + 'doom_type': 2024, + 'region': "Refueling Base (MAP10) Main"}, + 361123: {'name': 'Refueling Base (MAP10) - Chainsaw', + 'episode': 1, + 'map': 10, + 'index': 472, + 'doom_type': 2005, + 'region': "Refueling Base (MAP10) Main"}, + 361124: {'name': 'Refueling Base (MAP10) - Yellow keycard', + 'episode': 1, + 'map': 10, + 'index': 473, + 'doom_type': 6, + 'region': "Refueling Base (MAP10) Main"}, + 361125: {'name': 'Refueling Base (MAP10) - Megasphere', + 'episode': 1, + 'map': 10, + 'index': 507, + 'doom_type': 83, + 'region': "Refueling Base (MAP10) Main"}, + 361126: {'name': 'Refueling Base (MAP10) - Exit', + 'episode': 1, + 'map': 10, + 'index': -1, + 'doom_type': -1, + 'region': "Refueling Base (MAP10) Yellow Blue"}, + 361127: {'name': 'Circle of Death (MAP11) - Red keycard', + 'episode': 1, + 'map': 11, + 'index': 1, + 'doom_type': 13, + 'region': "Circle of Death (MAP11) Main"}, + 361128: {'name': 'Circle of Death (MAP11) - Chaingun', + 'episode': 1, + 'map': 11, + 'index': 14, + 'doom_type': 2002, + 'region': "Circle of Death (MAP11) Main"}, + 361129: {'name': 'Circle of Death (MAP11) - Supercharge', + 'episode': 1, + 'map': 11, + 'index': 23, + 'doom_type': 2013, + 'region': "Circle of Death (MAP11) Main"}, + 361130: {'name': 'Circle of Death (MAP11) - Plasma gun', + 'episode': 1, + 'map': 11, + 'index': 30, + 'doom_type': 2004, + 'region': "Circle of Death (MAP11) Main"}, + 361131: {'name': 'Circle of Death (MAP11) - Blue keycard', + 'episode': 1, + 'map': 11, + 'index': 40, + 'doom_type': 5, + 'region': "Circle of Death (MAP11) Main"}, + 361132: {'name': 'Circle of Death (MAP11) - Armor', + 'episode': 1, + 'map': 11, + 'index': 42, + 'doom_type': 2018, + 'region': "Circle of Death (MAP11) Main"}, + 361133: {'name': 'Circle of Death (MAP11) - Shotgun', + 'episode': 1, + 'map': 11, + 'index': 50, + 'doom_type': 2001, + 'region': "Circle of Death (MAP11) Main"}, + 361134: {'name': 'Circle of Death (MAP11) - Mega Armor', + 'episode': 1, + 'map': 11, + 'index': 58, + 'doom_type': 2019, + 'region': "Circle of Death (MAP11) Blue"}, + 361135: {'name': 'Circle of Death (MAP11) - Partial invisibility', + 'episode': 1, + 'map': 11, + 'index': 70, + 'doom_type': 2024, + 'region': "Circle of Death (MAP11) Main"}, + 361136: {'name': 'Circle of Death (MAP11) - Invulnerability', + 'episode': 1, + 'map': 11, + 'index': 83, + 'doom_type': 2022, + 'region': "Circle of Death (MAP11) Red"}, + 361137: {'name': 'Circle of Death (MAP11) - Rocket launcher', + 'episode': 1, + 'map': 11, + 'index': 86, + 'doom_type': 2003, + 'region': "Circle of Death (MAP11) Red"}, + 361138: {'name': 'Circle of Death (MAP11) - Backpack', + 'episode': 1, + 'map': 11, + 'index': 88, + 'doom_type': 8, + 'region': "Circle of Death (MAP11) Red"}, + 361139: {'name': 'Circle of Death (MAP11) - Supercharge 2', + 'episode': 1, + 'map': 11, + 'index': 108, + 'doom_type': 2013, + 'region': "Circle of Death (MAP11) Red"}, + 361140: {'name': 'Circle of Death (MAP11) - BFG9000', + 'episode': 1, + 'map': 11, + 'index': 110, + 'doom_type': 2006, + 'region': "Circle of Death (MAP11) Red"}, + 361141: {'name': 'Circle of Death (MAP11) - Exit', + 'episode': 1, + 'map': 11, + 'index': -1, + 'doom_type': -1, + 'region': "Circle of Death (MAP11) Red"}, + 361142: {'name': 'The Factory (MAP12) - Shotgun', + 'episode': 2, + 'map': 1, + 'index': 14, + 'doom_type': 2001, + 'region': "The Factory (MAP12) Main"}, + 361143: {'name': 'The Factory (MAP12) - Berserk', + 'episode': 2, + 'map': 1, + 'index': 35, + 'doom_type': 2023, + 'region': "The Factory (MAP12) Main"}, + 361144: {'name': 'The Factory (MAP12) - Chaingun', + 'episode': 2, + 'map': 1, + 'index': 38, + 'doom_type': 2002, + 'region': "The Factory (MAP12) Main"}, + 361145: {'name': 'The Factory (MAP12) - Supercharge', + 'episode': 2, + 'map': 1, + 'index': 52, + 'doom_type': 2013, + 'region': "The Factory (MAP12) Main"}, + 361146: {'name': 'The Factory (MAP12) - Blue keycard', + 'episode': 2, + 'map': 1, + 'index': 54, + 'doom_type': 5, + 'region': "The Factory (MAP12) Main"}, + 361147: {'name': 'The Factory (MAP12) - Armor', + 'episode': 2, + 'map': 1, + 'index': 63, + 'doom_type': 2018, + 'region': "The Factory (MAP12) Blue"}, + 361148: {'name': 'The Factory (MAP12) - Backpack', + 'episode': 2, + 'map': 1, + 'index': 70, + 'doom_type': 8, + 'region': "The Factory (MAP12) Blue"}, + 361149: {'name': 'The Factory (MAP12) - Supercharge 2', + 'episode': 2, + 'map': 1, + 'index': 83, + 'doom_type': 2013, + 'region': "The Factory (MAP12) Main"}, + 361150: {'name': 'The Factory (MAP12) - Armor 2', + 'episode': 2, + 'map': 1, + 'index': 92, + 'doom_type': 2018, + 'region': "The Factory (MAP12) Main"}, + 361151: {'name': 'The Factory (MAP12) - Partial invisibility', + 'episode': 2, + 'map': 1, + 'index': 93, + 'doom_type': 2024, + 'region': "The Factory (MAP12) Main"}, + 361152: {'name': 'The Factory (MAP12) - Berserk 2', + 'episode': 2, + 'map': 1, + 'index': 107, + 'doom_type': 2023, + 'region': "The Factory (MAP12) Main"}, + 361153: {'name': 'The Factory (MAP12) - Yellow keycard', + 'episode': 2, + 'map': 1, + 'index': 123, + 'doom_type': 6, + 'region': "The Factory (MAP12) Main"}, + 361154: {'name': 'The Factory (MAP12) - BFG9000', + 'episode': 2, + 'map': 1, + 'index': 135, + 'doom_type': 2006, + 'region': "The Factory (MAP12) Blue"}, + 361155: {'name': 'The Factory (MAP12) - Berserk 3', + 'episode': 2, + 'map': 1, + 'index': 189, + 'doom_type': 2023, + 'region': "The Factory (MAP12) Main"}, + 361156: {'name': 'The Factory (MAP12) - Super Shotgun', + 'episode': 2, + 'map': 1, + 'index': 192, + 'doom_type': 82, + 'region': "The Factory (MAP12) Main"}, + 361157: {'name': 'The Factory (MAP12) - Exit', + 'episode': 2, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "The Factory (MAP12) Yellow"}, + 361158: {'name': 'Downtown (MAP13) - Rocket launcher', + 'episode': 2, + 'map': 2, + 'index': 4, + 'doom_type': 2003, + 'region': "Downtown (MAP13) Main"}, + 361159: {'name': 'Downtown (MAP13) - Shotgun', + 'episode': 2, + 'map': 2, + 'index': 42, + 'doom_type': 2001, + 'region': "Downtown (MAP13) Main"}, + 361160: {'name': 'Downtown (MAP13) - Supercharge', + 'episode': 2, + 'map': 2, + 'index': 73, + 'doom_type': 2013, + 'region': "Downtown (MAP13) Main"}, + 361161: {'name': 'Downtown (MAP13) - Berserk', + 'episode': 2, + 'map': 2, + 'index': 131, + 'doom_type': 2023, + 'region': "Downtown (MAP13) Main"}, + 361162: {'name': 'Downtown (MAP13) - Mega Armor', + 'episode': 2, + 'map': 2, + 'index': 158, + 'doom_type': 2019, + 'region': "Downtown (MAP13) Main"}, + 361163: {'name': 'Downtown (MAP13) - Chaingun', + 'episode': 2, + 'map': 2, + 'index': 183, + 'doom_type': 2002, + 'region': "Downtown (MAP13) Main"}, + 361164: {'name': 'Downtown (MAP13) - Blue keycard', + 'episode': 2, + 'map': 2, + 'index': 195, + 'doom_type': 5, + 'region': "Downtown (MAP13) Main"}, + 361165: {'name': 'Downtown (MAP13) - Yellow keycard', + 'episode': 2, + 'map': 2, + 'index': 201, + 'doom_type': 6, + 'region': "Downtown (MAP13) Red"}, + 361166: {'name': 'Downtown (MAP13) - Berserk 2', + 'episode': 2, + 'map': 2, + 'index': 207, + 'doom_type': 2023, + 'region': "Downtown (MAP13) Red"}, + 361167: {'name': 'Downtown (MAP13) - Plasma gun', + 'episode': 2, + 'map': 2, + 'index': 231, + 'doom_type': 2004, + 'region': "Downtown (MAP13) Main"}, + 361168: {'name': 'Downtown (MAP13) - Partial invisibility', + 'episode': 2, + 'map': 2, + 'index': 249, + 'doom_type': 2024, + 'region': "Downtown (MAP13) Main"}, + 361169: {'name': 'Downtown (MAP13) - Backpack', + 'episode': 2, + 'map': 2, + 'index': 250, + 'doom_type': 8, + 'region': "Downtown (MAP13) Main"}, + 361170: {'name': 'Downtown (MAP13) - Chainsaw', + 'episode': 2, + 'map': 2, + 'index': 257, + 'doom_type': 2005, + 'region': "Downtown (MAP13) Blue"}, + 361171: {'name': 'Downtown (MAP13) - BFG9000', + 'episode': 2, + 'map': 2, + 'index': 258, + 'doom_type': 2006, + 'region': "Downtown (MAP13) Main"}, + 361172: {'name': 'Downtown (MAP13) - Invulnerability', + 'episode': 2, + 'map': 2, + 'index': 269, + 'doom_type': 2022, + 'region': "Downtown (MAP13) Blue"}, + 361173: {'name': 'Downtown (MAP13) - Invulnerability 2', + 'episode': 2, + 'map': 2, + 'index': 280, + 'doom_type': 2022, + 'region': "Downtown (MAP13) Main"}, + 361174: {'name': 'Downtown (MAP13) - Partial invisibility 2', + 'episode': 2, + 'map': 2, + 'index': 281, + 'doom_type': 2024, + 'region': "Downtown (MAP13) Main"}, + 361175: {'name': 'Downtown (MAP13) - Partial invisibility 3', + 'episode': 2, + 'map': 2, + 'index': 282, + 'doom_type': 2024, + 'region': "Downtown (MAP13) Main"}, + 361176: {'name': 'Downtown (MAP13) - Red keycard', + 'episode': 2, + 'map': 2, + 'index': 283, + 'doom_type': 13, + 'region': "Downtown (MAP13) Blue"}, + 361177: {'name': 'Downtown (MAP13) - Berserk 3', + 'episode': 2, + 'map': 2, + 'index': 296, + 'doom_type': 2023, + 'region': "Downtown (MAP13) Yellow"}, + 361178: {'name': 'Downtown (MAP13) - Computer area map', + 'episode': 2, + 'map': 2, + 'index': 298, + 'doom_type': 2026, + 'region': "Downtown (MAP13) Main"}, + 361179: {'name': 'Downtown (MAP13) - Exit', + 'episode': 2, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "Downtown (MAP13) Yellow"}, + 361180: {'name': 'The Inmost Dens (MAP14) - Shotgun', + 'episode': 2, + 'map': 3, + 'index': 13, + 'doom_type': 2001, + 'region': "The Inmost Dens (MAP14) Main"}, + 361181: {'name': 'The Inmost Dens (MAP14) - Supercharge', + 'episode': 2, + 'map': 3, + 'index': 16, + 'doom_type': 2013, + 'region': "The Inmost Dens (MAP14) Main"}, + 361182: {'name': 'The Inmost Dens (MAP14) - Mega Armor', + 'episode': 2, + 'map': 3, + 'index': 22, + 'doom_type': 2019, + 'region': "The Inmost Dens (MAP14) Main"}, + 361183: {'name': 'The Inmost Dens (MAP14) - Berserk', + 'episode': 2, + 'map': 3, + 'index': 78, + 'doom_type': 2023, + 'region': "The Inmost Dens (MAP14) Main"}, + 361184: {'name': 'The Inmost Dens (MAP14) - Chaingun', + 'episode': 2, + 'map': 3, + 'index': 80, + 'doom_type': 2002, + 'region': "The Inmost Dens (MAP14) Main"}, + 361185: {'name': 'The Inmost Dens (MAP14) - Plasma gun', + 'episode': 2, + 'map': 3, + 'index': 81, + 'doom_type': 2004, + 'region': "The Inmost Dens (MAP14) Main"}, + 361186: {'name': 'The Inmost Dens (MAP14) - Red skull key', + 'episode': 2, + 'map': 3, + 'index': 119, + 'doom_type': 38, + 'region': "The Inmost Dens (MAP14) Main"}, + 361187: {'name': 'The Inmost Dens (MAP14) - Rocket launcher', + 'episode': 2, + 'map': 3, + 'index': 123, + 'doom_type': 2003, + 'region': "The Inmost Dens (MAP14) Main"}, + 361188: {'name': 'The Inmost Dens (MAP14) - Blue skull key', + 'episode': 2, + 'map': 3, + 'index': 130, + 'doom_type': 40, + 'region': "The Inmost Dens (MAP14) Red South"}, + 361189: {'name': 'The Inmost Dens (MAP14) - Partial invisibility', + 'episode': 2, + 'map': 3, + 'index': 138, + 'doom_type': 2024, + 'region': "The Inmost Dens (MAP14) Red South"}, + 361190: {'name': 'The Inmost Dens (MAP14) - Exit', + 'episode': 2, + 'map': 3, + 'index': -1, + 'doom_type': -1, + 'region': "The Inmost Dens (MAP14) Blue"}, + 361191: {'name': 'Industrial Zone (MAP15) - Berserk', + 'episode': 2, + 'map': 4, + 'index': 4, + 'doom_type': 2023, + 'region': "Industrial Zone (MAP15) Main"}, + 361192: {'name': 'Industrial Zone (MAP15) - Rocket launcher', + 'episode': 2, + 'map': 4, + 'index': 11, + 'doom_type': 2003, + 'region': "Industrial Zone (MAP15) Main"}, + 361193: {'name': 'Industrial Zone (MAP15) - Shotgun', + 'episode': 2, + 'map': 4, + 'index': 13, + 'doom_type': 2001, + 'region': "Industrial Zone (MAP15) Main"}, + 361194: {'name': 'Industrial Zone (MAP15) - Partial invisibility', + 'episode': 2, + 'map': 4, + 'index': 14, + 'doom_type': 2024, + 'region': "Industrial Zone (MAP15) Main"}, + 361195: {'name': 'Industrial Zone (MAP15) - Backpack', + 'episode': 2, + 'map': 4, + 'index': 24, + 'doom_type': 8, + 'region': "Industrial Zone (MAP15) Main"}, + 361196: {'name': 'Industrial Zone (MAP15) - BFG9000', + 'episode': 2, + 'map': 4, + 'index': 48, + 'doom_type': 2006, + 'region': "Industrial Zone (MAP15) Main"}, + 361197: {'name': 'Industrial Zone (MAP15) - Supercharge', + 'episode': 2, + 'map': 4, + 'index': 56, + 'doom_type': 2013, + 'region': "Industrial Zone (MAP15) Main"}, + 361198: {'name': 'Industrial Zone (MAP15) - Mega Armor', + 'episode': 2, + 'map': 4, + 'index': 57, + 'doom_type': 2019, + 'region': "Industrial Zone (MAP15) Main"}, + 361199: {'name': 'Industrial Zone (MAP15) - Armor', + 'episode': 2, + 'map': 4, + 'index': 59, + 'doom_type': 2018, + 'region': "Industrial Zone (MAP15) Main"}, + 361200: {'name': 'Industrial Zone (MAP15) - Yellow keycard', + 'episode': 2, + 'map': 4, + 'index': 71, + 'doom_type': 6, + 'region': "Industrial Zone (MAP15) Main"}, + 361201: {'name': 'Industrial Zone (MAP15) - Chaingun', + 'episode': 2, + 'map': 4, + 'index': 74, + 'doom_type': 2002, + 'region': "Industrial Zone (MAP15) Main"}, + 361202: {'name': 'Industrial Zone (MAP15) - Plasma gun', + 'episode': 2, + 'map': 4, + 'index': 86, + 'doom_type': 2004, + 'region': "Industrial Zone (MAP15) Yellow West"}, + 361203: {'name': 'Industrial Zone (MAP15) - Partial invisibility 2', + 'episode': 2, + 'map': 4, + 'index': 91, + 'doom_type': 2024, + 'region': "Industrial Zone (MAP15) Yellow West"}, + 361204: {'name': 'Industrial Zone (MAP15) - Computer area map', + 'episode': 2, + 'map': 4, + 'index': 93, + 'doom_type': 2026, + 'region': "Industrial Zone (MAP15) Yellow West"}, + 361205: {'name': 'Industrial Zone (MAP15) - Invulnerability', + 'episode': 2, + 'map': 4, + 'index': 94, + 'doom_type': 2022, + 'region': "Industrial Zone (MAP15) Main"}, + 361206: {'name': 'Industrial Zone (MAP15) - Red keycard', + 'episode': 2, + 'map': 4, + 'index': 100, + 'doom_type': 13, + 'region': "Industrial Zone (MAP15) Main"}, + 361207: {'name': 'Industrial Zone (MAP15) - Backpack 2', + 'episode': 2, + 'map': 4, + 'index': 103, + 'doom_type': 8, + 'region': "Industrial Zone (MAP15) Yellow West"}, + 361208: {'name': 'Industrial Zone (MAP15) - Chainsaw', + 'episode': 2, + 'map': 4, + 'index': 113, + 'doom_type': 2005, + 'region': "Industrial Zone (MAP15) Yellow East"}, + 361209: {'name': 'Industrial Zone (MAP15) - Megasphere', + 'episode': 2, + 'map': 4, + 'index': 125, + 'doom_type': 83, + 'region': "Industrial Zone (MAP15) Yellow East"}, + 361210: {'name': 'Industrial Zone (MAP15) - Berserk 2', + 'episode': 2, + 'map': 4, + 'index': 178, + 'doom_type': 2023, + 'region': "Industrial Zone (MAP15) Yellow East"}, + 361211: {'name': 'Industrial Zone (MAP15) - Blue keycard', + 'episode': 2, + 'map': 4, + 'index': 337, + 'doom_type': 5, + 'region': "Industrial Zone (MAP15) Yellow West"}, + 361212: {'name': 'Industrial Zone (MAP15) - Mega Armor 2', + 'episode': 2, + 'map': 4, + 'index': 361, + 'doom_type': 2019, + 'region': "Industrial Zone (MAP15) Main"}, + 361213: {'name': 'Industrial Zone (MAP15) - Exit', + 'episode': 2, + 'map': 4, + 'index': -1, + 'doom_type': -1, + 'region': "Industrial Zone (MAP15) Blue"}, + 361214: {'name': 'Suburbs (MAP16) - Megasphere', + 'episode': 2, + 'map': 5, + 'index': 7, + 'doom_type': 83, + 'region': "Suburbs (MAP16) Main"}, + 361215: {'name': 'Suburbs (MAP16) - Super Shotgun', + 'episode': 2, + 'map': 5, + 'index': 11, + 'doom_type': 82, + 'region': "Suburbs (MAP16) Main"}, + 361216: {'name': 'Suburbs (MAP16) - Chaingun', + 'episode': 2, + 'map': 5, + 'index': 15, + 'doom_type': 2002, + 'region': "Suburbs (MAP16) Main"}, + 361217: {'name': 'Suburbs (MAP16) - Backpack', + 'episode': 2, + 'map': 5, + 'index': 53, + 'doom_type': 8, + 'region': "Suburbs (MAP16) Main"}, + 361218: {'name': 'Suburbs (MAP16) - Rocket launcher', + 'episode': 2, + 'map': 5, + 'index': 59, + 'doom_type': 2003, + 'region': "Suburbs (MAP16) Main"}, + 361219: {'name': 'Suburbs (MAP16) - Berserk', + 'episode': 2, + 'map': 5, + 'index': 60, + 'doom_type': 2023, + 'region': "Suburbs (MAP16) Main"}, + 361220: {'name': 'Suburbs (MAP16) - Plasma gun', + 'episode': 2, + 'map': 5, + 'index': 62, + 'doom_type': 2004, + 'region': "Suburbs (MAP16) Blue"}, + 361221: {'name': 'Suburbs (MAP16) - Plasma gun 2', + 'episode': 2, + 'map': 5, + 'index': 63, + 'doom_type': 2004, + 'region': "Suburbs (MAP16) Blue"}, + 361222: {'name': 'Suburbs (MAP16) - Plasma gun 3', + 'episode': 2, + 'map': 5, + 'index': 64, + 'doom_type': 2004, + 'region': "Suburbs (MAP16) Blue"}, + 361223: {'name': 'Suburbs (MAP16) - Plasma gun 4', + 'episode': 2, + 'map': 5, + 'index': 65, + 'doom_type': 2004, + 'region': "Suburbs (MAP16) Blue"}, + 361224: {'name': 'Suburbs (MAP16) - BFG9000', + 'episode': 2, + 'map': 5, + 'index': 169, + 'doom_type': 2006, + 'region': "Suburbs (MAP16) Main"}, + 361225: {'name': 'Suburbs (MAP16) - Shotgun', + 'episode': 2, + 'map': 5, + 'index': 182, + 'doom_type': 2001, + 'region': "Suburbs (MAP16) Main"}, + 361226: {'name': 'Suburbs (MAP16) - Supercharge', + 'episode': 2, + 'map': 5, + 'index': 185, + 'doom_type': 2013, + 'region': "Suburbs (MAP16) Main"}, + 361227: {'name': 'Suburbs (MAP16) - Blue skull key', + 'episode': 2, + 'map': 5, + 'index': 186, + 'doom_type': 40, + 'region': "Suburbs (MAP16) Main"}, + 361228: {'name': 'Suburbs (MAP16) - Invulnerability', + 'episode': 2, + 'map': 5, + 'index': 221, + 'doom_type': 2022, + 'region': "Suburbs (MAP16) Main"}, + 361229: {'name': 'Suburbs (MAP16) - Partial invisibility', + 'episode': 2, + 'map': 5, + 'index': 231, + 'doom_type': 2024, + 'region': "Suburbs (MAP16) Main"}, + 361230: {'name': 'Suburbs (MAP16) - Red skull key', + 'episode': 2, + 'map': 5, + 'index': 236, + 'doom_type': 38, + 'region': "Suburbs (MAP16) Blue"}, + 361231: {'name': 'Suburbs (MAP16) - Exit', + 'episode': 2, + 'map': 5, + 'index': -1, + 'doom_type': -1, + 'region': "Suburbs (MAP16) Red"}, + 361232: {'name': 'Tenements (MAP17) - Armor', + 'episode': 2, + 'map': 6, + 'index': 1, + 'doom_type': 2018, + 'region': "Tenements (MAP17) Red"}, + 361233: {'name': 'Tenements (MAP17) - Supercharge', + 'episode': 2, + 'map': 6, + 'index': 7, + 'doom_type': 2013, + 'region': "Tenements (MAP17) Yellow"}, + 361234: {'name': 'Tenements (MAP17) - Shotgun', + 'episode': 2, + 'map': 6, + 'index': 18, + 'doom_type': 2001, + 'region': "Tenements (MAP17) Main"}, + 361235: {'name': 'Tenements (MAP17) - Red keycard', + 'episode': 2, + 'map': 6, + 'index': 34, + 'doom_type': 13, + 'region': "Tenements (MAP17) Main"}, + 361236: {'name': 'Tenements (MAP17) - Blue keycard', + 'episode': 2, + 'map': 6, + 'index': 69, + 'doom_type': 5, + 'region': "Tenements (MAP17) Red"}, + 361237: {'name': 'Tenements (MAP17) - Supercharge 2', + 'episode': 2, + 'map': 6, + 'index': 75, + 'doom_type': 2013, + 'region': "Tenements (MAP17) Blue"}, + 361238: {'name': 'Tenements (MAP17) - Yellow skull key', + 'episode': 2, + 'map': 6, + 'index': 76, + 'doom_type': 39, + 'region': "Tenements (MAP17) Blue"}, + 361239: {'name': 'Tenements (MAP17) - Rocket launcher', + 'episode': 2, + 'map': 6, + 'index': 77, + 'doom_type': 2003, + 'region': "Tenements (MAP17) Blue"}, + 361240: {'name': 'Tenements (MAP17) - Partial invisibility', + 'episode': 2, + 'map': 6, + 'index': 81, + 'doom_type': 2024, + 'region': "Tenements (MAP17) Blue"}, + 361241: {'name': 'Tenements (MAP17) - Chaingun', + 'episode': 2, + 'map': 6, + 'index': 92, + 'doom_type': 2002, + 'region': "Tenements (MAP17) Red"}, + 361242: {'name': 'Tenements (MAP17) - BFG9000', + 'episode': 2, + 'map': 6, + 'index': 102, + 'doom_type': 2006, + 'region': "Tenements (MAP17) Main"}, + 361243: {'name': 'Tenements (MAP17) - Plasma gun', + 'episode': 2, + 'map': 6, + 'index': 114, + 'doom_type': 2004, + 'region': "Tenements (MAP17) Yellow"}, + 361244: {'name': 'Tenements (MAP17) - Mega Armor', + 'episode': 2, + 'map': 6, + 'index': 168, + 'doom_type': 2019, + 'region': "Tenements (MAP17) Red"}, + 361245: {'name': 'Tenements (MAP17) - Armor 2', + 'episode': 2, + 'map': 6, + 'index': 179, + 'doom_type': 2018, + 'region': "Tenements (MAP17) Red"}, + 361246: {'name': 'Tenements (MAP17) - Berserk', + 'episode': 2, + 'map': 6, + 'index': 218, + 'doom_type': 2023, + 'region': "Tenements (MAP17) Red"}, + 361247: {'name': 'Tenements (MAP17) - Backpack', + 'episode': 2, + 'map': 6, + 'index': 261, + 'doom_type': 8, + 'region': "Tenements (MAP17) Blue"}, + 361248: {'name': 'Tenements (MAP17) - Megasphere', + 'episode': 2, + 'map': 6, + 'index': 419, + 'doom_type': 83, + 'region': "Tenements (MAP17) Yellow"}, + 361249: {'name': 'Tenements (MAP17) - Exit', + 'episode': 2, + 'map': 6, + 'index': -1, + 'doom_type': -1, + 'region': "Tenements (MAP17) Yellow"}, + 361250: {'name': 'The Courtyard (MAP18) - Shotgun', + 'episode': 2, + 'map': 7, + 'index': 12, + 'doom_type': 2001, + 'region': "The Courtyard (MAP18) Main"}, + 361251: {'name': 'The Courtyard (MAP18) - Plasma gun', + 'episode': 2, + 'map': 7, + 'index': 36, + 'doom_type': 2004, + 'region': "The Courtyard (MAP18) Main"}, + 361252: {'name': 'The Courtyard (MAP18) - Armor', + 'episode': 2, + 'map': 7, + 'index': 48, + 'doom_type': 2018, + 'region': "The Courtyard (MAP18) Main"}, + 361253: {'name': 'The Courtyard (MAP18) - Berserk', + 'episode': 2, + 'map': 7, + 'index': 52, + 'doom_type': 2023, + 'region': "The Courtyard (MAP18) Main"}, + 361254: {'name': 'The Courtyard (MAP18) - Chaingun', + 'episode': 2, + 'map': 7, + 'index': 95, + 'doom_type': 2002, + 'region': "The Courtyard (MAP18) Main"}, + 361255: {'name': 'The Courtyard (MAP18) - Rocket launcher', + 'episode': 2, + 'map': 7, + 'index': 130, + 'doom_type': 2003, + 'region': "The Courtyard (MAP18) Main"}, + 361256: {'name': 'The Courtyard (MAP18) - Partial invisibility', + 'episode': 2, + 'map': 7, + 'index': 170, + 'doom_type': 2024, + 'region': "The Courtyard (MAP18) Main"}, + 361257: {'name': 'The Courtyard (MAP18) - Partial invisibility 2', + 'episode': 2, + 'map': 7, + 'index': 171, + 'doom_type': 2024, + 'region': "The Courtyard (MAP18) Main"}, + 361258: {'name': 'The Courtyard (MAP18) - Backpack', + 'episode': 2, + 'map': 7, + 'index': 198, + 'doom_type': 8, + 'region': "The Courtyard (MAP18) Main"}, + 361259: {'name': 'The Courtyard (MAP18) - Supercharge', + 'episode': 2, + 'map': 7, + 'index': 218, + 'doom_type': 2013, + 'region': "The Courtyard (MAP18) Main"}, + 361260: {'name': 'The Courtyard (MAP18) - Invulnerability', + 'episode': 2, + 'map': 7, + 'index': 228, + 'doom_type': 2022, + 'region': "The Courtyard (MAP18) Main"}, + 361261: {'name': 'The Courtyard (MAP18) - Invulnerability 2', + 'episode': 2, + 'map': 7, + 'index': 229, + 'doom_type': 2022, + 'region': "The Courtyard (MAP18) Main"}, + 361262: {'name': 'The Courtyard (MAP18) - Yellow skull key', + 'episode': 2, + 'map': 7, + 'index': 254, + 'doom_type': 39, + 'region': "The Courtyard (MAP18) Main"}, + 361263: {'name': 'The Courtyard (MAP18) - Blue skull key', + 'episode': 2, + 'map': 7, + 'index': 268, + 'doom_type': 40, + 'region': "The Courtyard (MAP18) Yellow"}, + 361264: {'name': 'The Courtyard (MAP18) - BFG9000', + 'episode': 2, + 'map': 7, + 'index': 400, + 'doom_type': 2006, + 'region': "The Courtyard (MAP18) Main"}, + 361265: {'name': 'The Courtyard (MAP18) - Computer area map', + 'episode': 2, + 'map': 7, + 'index': 458, + 'doom_type': 2026, + 'region': "The Courtyard (MAP18) Main"}, + 361266: {'name': 'The Courtyard (MAP18) - Super Shotgun', + 'episode': 2, + 'map': 7, + 'index': 461, + 'doom_type': 82, + 'region': "The Courtyard (MAP18) Main"}, + 361267: {'name': 'The Courtyard (MAP18) - Exit', + 'episode': 2, + 'map': 7, + 'index': -1, + 'doom_type': -1, + 'region': "The Courtyard (MAP18) Blue"}, + 361268: {'name': 'The Citadel (MAP19) - Armor', + 'episode': 2, + 'map': 8, + 'index': 64, + 'doom_type': 2018, + 'region': "The Citadel (MAP19) Main"}, + 361269: {'name': 'The Citadel (MAP19) - Chaingun', + 'episode': 2, + 'map': 8, + 'index': 99, + 'doom_type': 2002, + 'region': "The Citadel (MAP19) Main"}, + 361270: {'name': 'The Citadel (MAP19) - Berserk', + 'episode': 2, + 'map': 8, + 'index': 116, + 'doom_type': 2023, + 'region': "The Citadel (MAP19) Main"}, + 361271: {'name': 'The Citadel (MAP19) - Mega Armor', + 'episode': 2, + 'map': 8, + 'index': 127, + 'doom_type': 2019, + 'region': "The Citadel (MAP19) Main"}, + 361272: {'name': 'The Citadel (MAP19) - Supercharge', + 'episode': 2, + 'map': 8, + 'index': 174, + 'doom_type': 2013, + 'region': "The Citadel (MAP19) Main"}, + 361273: {'name': 'The Citadel (MAP19) - Armor 2', + 'episode': 2, + 'map': 8, + 'index': 223, + 'doom_type': 2018, + 'region': "The Citadel (MAP19) Main"}, + 361274: {'name': 'The Citadel (MAP19) - Backpack', + 'episode': 2, + 'map': 8, + 'index': 232, + 'doom_type': 8, + 'region': "The Citadel (MAP19) Main"}, + 361275: {'name': 'The Citadel (MAP19) - Invulnerability', + 'episode': 2, + 'map': 8, + 'index': 315, + 'doom_type': 2022, + 'region': "The Citadel (MAP19) Main"}, + 361276: {'name': 'The Citadel (MAP19) - Blue skull key', + 'episode': 2, + 'map': 8, + 'index': 370, + 'doom_type': 40, + 'region': "The Citadel (MAP19) Main"}, + 361277: {'name': 'The Citadel (MAP19) - Partial invisibility', + 'episode': 2, + 'map': 8, + 'index': 403, + 'doom_type': 2024, + 'region': "The Citadel (MAP19) Main"}, + 361278: {'name': 'The Citadel (MAP19) - Red skull key', + 'episode': 2, + 'map': 8, + 'index': 404, + 'doom_type': 38, + 'region': "The Citadel (MAP19) Main"}, + 361279: {'name': 'The Citadel (MAP19) - Yellow skull key', + 'episode': 2, + 'map': 8, + 'index': 405, + 'doom_type': 39, + 'region': "The Citadel (MAP19) Main"}, + 361280: {'name': 'The Citadel (MAP19) - Computer area map', + 'episode': 2, + 'map': 8, + 'index': 415, + 'doom_type': 2026, + 'region': "The Citadel (MAP19) Main"}, + 361281: {'name': 'The Citadel (MAP19) - Rocket launcher', + 'episode': 2, + 'map': 8, + 'index': 416, + 'doom_type': 2003, + 'region': "The Citadel (MAP19) Main"}, + 361282: {'name': 'The Citadel (MAP19) - Super Shotgun', + 'episode': 2, + 'map': 8, + 'index': 431, + 'doom_type': 82, + 'region': "The Citadel (MAP19) Main"}, + 361283: {'name': 'The Citadel (MAP19) - Exit', + 'episode': 2, + 'map': 8, + 'index': -1, + 'doom_type': -1, + 'region': "The Citadel (MAP19) Red"}, + 361284: {'name': 'Gotcha! (MAP20) - Mega Armor', + 'episode': 2, + 'map': 9, + 'index': 9, + 'doom_type': 2019, + 'region': "Gotcha! (MAP20) Main"}, + 361285: {'name': 'Gotcha! (MAP20) - Rocket launcher', + 'episode': 2, + 'map': 9, + 'index': 10, + 'doom_type': 2003, + 'region': "Gotcha! (MAP20) Main"}, + 361286: {'name': 'Gotcha! (MAP20) - Supercharge', + 'episode': 2, + 'map': 9, + 'index': 12, + 'doom_type': 2013, + 'region': "Gotcha! (MAP20) Main"}, + 361287: {'name': 'Gotcha! (MAP20) - Armor', + 'episode': 2, + 'map': 9, + 'index': 33, + 'doom_type': 2018, + 'region': "Gotcha! (MAP20) Main"}, + 361288: {'name': 'Gotcha! (MAP20) - Megasphere', + 'episode': 2, + 'map': 9, + 'index': 43, + 'doom_type': 83, + 'region': "Gotcha! (MAP20) Main"}, + 361289: {'name': 'Gotcha! (MAP20) - Armor 2', + 'episode': 2, + 'map': 9, + 'index': 47, + 'doom_type': 2018, + 'region': "Gotcha! (MAP20) Main"}, + 361290: {'name': 'Gotcha! (MAP20) - Super Shotgun', + 'episode': 2, + 'map': 9, + 'index': 54, + 'doom_type': 82, + 'region': "Gotcha! (MAP20) Main"}, + 361291: {'name': 'Gotcha! (MAP20) - Plasma gun', + 'episode': 2, + 'map': 9, + 'index': 70, + 'doom_type': 2004, + 'region': "Gotcha! (MAP20) Main"}, + 361292: {'name': 'Gotcha! (MAP20) - Mega Armor 2', + 'episode': 2, + 'map': 9, + 'index': 96, + 'doom_type': 2019, + 'region': "Gotcha! (MAP20) Main"}, + 361293: {'name': 'Gotcha! (MAP20) - Berserk', + 'episode': 2, + 'map': 9, + 'index': 109, + 'doom_type': 2023, + 'region': "Gotcha! (MAP20) Main"}, + 361294: {'name': 'Gotcha! (MAP20) - Supercharge 2', + 'episode': 2, + 'map': 9, + 'index': 119, + 'doom_type': 2013, + 'region': "Gotcha! (MAP20) Main"}, + 361295: {'name': 'Gotcha! (MAP20) - Supercharge 3', + 'episode': 2, + 'map': 9, + 'index': 122, + 'doom_type': 2013, + 'region': "Gotcha! (MAP20) Main"}, + 361296: {'name': 'Gotcha! (MAP20) - BFG9000', + 'episode': 2, + 'map': 9, + 'index': 142, + 'doom_type': 2006, + 'region': "Gotcha! (MAP20) Main"}, + 361297: {'name': 'Gotcha! (MAP20) - Supercharge 4', + 'episode': 2, + 'map': 9, + 'index': 145, + 'doom_type': 2013, + 'region': "Gotcha! (MAP20) Main"}, + 361298: {'name': 'Gotcha! (MAP20) - Exit', + 'episode': 2, + 'map': 9, + 'index': -1, + 'doom_type': -1, + 'region': "Gotcha! (MAP20) Main"}, + 361299: {'name': 'Nirvana (MAP21) - Super Shotgun', + 'episode': 3, + 'map': 1, + 'index': 70, + 'doom_type': 82, + 'region': "Nirvana (MAP21) Main"}, + 361300: {'name': 'Nirvana (MAP21) - Rocket launcher', + 'episode': 3, + 'map': 1, + 'index': 76, + 'doom_type': 2003, + 'region': "Nirvana (MAP21) Main"}, + 361301: {'name': 'Nirvana (MAP21) - Yellow skull key', + 'episode': 3, + 'map': 1, + 'index': 108, + 'doom_type': 39, + 'region': "Nirvana (MAP21) Main"}, + 361302: {'name': 'Nirvana (MAP21) - Backpack', + 'episode': 3, + 'map': 1, + 'index': 109, + 'doom_type': 8, + 'region': "Nirvana (MAP21) Main"}, + 361303: {'name': 'Nirvana (MAP21) - Megasphere', + 'episode': 3, + 'map': 1, + 'index': 112, + 'doom_type': 83, + 'region': "Nirvana (MAP21) Main"}, + 361304: {'name': 'Nirvana (MAP21) - Invulnerability', + 'episode': 3, + 'map': 1, + 'index': 194, + 'doom_type': 2022, + 'region': "Nirvana (MAP21) Yellow"}, + 361305: {'name': 'Nirvana (MAP21) - Blue skull key', + 'episode': 3, + 'map': 1, + 'index': 199, + 'doom_type': 40, + 'region': "Nirvana (MAP21) Yellow"}, + 361306: {'name': 'Nirvana (MAP21) - Red skull key', + 'episode': 3, + 'map': 1, + 'index': 215, + 'doom_type': 38, + 'region': "Nirvana (MAP21) Yellow"}, + 361307: {'name': 'Nirvana (MAP21) - Exit', + 'episode': 3, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "Nirvana (MAP21) Magenta"}, + 361308: {'name': 'The Catacombs (MAP22) - Rocket launcher', + 'episode': 3, + 'map': 2, + 'index': 4, + 'doom_type': 2003, + 'region': "The Catacombs (MAP22) Main"}, + 361309: {'name': 'The Catacombs (MAP22) - Blue skull key', + 'episode': 3, + 'map': 2, + 'index': 5, + 'doom_type': 40, + 'region': "The Catacombs (MAP22) Main"}, + 361310: {'name': 'The Catacombs (MAP22) - Red skull key', + 'episode': 3, + 'map': 2, + 'index': 12, + 'doom_type': 38, + 'region': "The Catacombs (MAP22) Blue"}, + 361311: {'name': 'The Catacombs (MAP22) - Shotgun', + 'episode': 3, + 'map': 2, + 'index': 28, + 'doom_type': 2001, + 'region': "The Catacombs (MAP22) Main"}, + 361312: {'name': 'The Catacombs (MAP22) - Berserk', + 'episode': 3, + 'map': 2, + 'index': 45, + 'doom_type': 2023, + 'region': "The Catacombs (MAP22) Main"}, + 361313: {'name': 'The Catacombs (MAP22) - Plasma gun', + 'episode': 3, + 'map': 2, + 'index': 83, + 'doom_type': 2004, + 'region': "The Catacombs (MAP22) Main"}, + 361314: {'name': 'The Catacombs (MAP22) - Supercharge', + 'episode': 3, + 'map': 2, + 'index': 118, + 'doom_type': 2013, + 'region': "The Catacombs (MAP22) Main"}, + 361315: {'name': 'The Catacombs (MAP22) - Armor', + 'episode': 3, + 'map': 2, + 'index': 119, + 'doom_type': 2018, + 'region': "The Catacombs (MAP22) Main"}, + 361316: {'name': 'The Catacombs (MAP22) - Exit', + 'episode': 3, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "The Catacombs (MAP22) Red"}, + 361317: {'name': 'Barrels o Fun (MAP23) - Shotgun', + 'episode': 3, + 'map': 3, + 'index': 136, + 'doom_type': 2001, + 'region': "Barrels o Fun (MAP23) Main"}, + 361318: {'name': 'Barrels o Fun (MAP23) - Berserk', + 'episode': 3, + 'map': 3, + 'index': 222, + 'doom_type': 2023, + 'region': "Barrels o Fun (MAP23) Main"}, + 361319: {'name': 'Barrels o Fun (MAP23) - Backpack', + 'episode': 3, + 'map': 3, + 'index': 223, + 'doom_type': 8, + 'region': "Barrels o Fun (MAP23) Main"}, + 361320: {'name': 'Barrels o Fun (MAP23) - Computer area map', + 'episode': 3, + 'map': 3, + 'index': 224, + 'doom_type': 2026, + 'region': "Barrels o Fun (MAP23) Main"}, + 361321: {'name': 'Barrels o Fun (MAP23) - Armor', + 'episode': 3, + 'map': 3, + 'index': 249, + 'doom_type': 2018, + 'region': "Barrels o Fun (MAP23) Main"}, + 361322: {'name': 'Barrels o Fun (MAP23) - Rocket launcher', + 'episode': 3, + 'map': 3, + 'index': 264, + 'doom_type': 2003, + 'region': "Barrels o Fun (MAP23) Main"}, + 361323: {'name': 'Barrels o Fun (MAP23) - Megasphere', + 'episode': 3, + 'map': 3, + 'index': 266, + 'doom_type': 83, + 'region': "Barrels o Fun (MAP23) Main"}, + 361324: {'name': 'Barrels o Fun (MAP23) - Supercharge', + 'episode': 3, + 'map': 3, + 'index': 277, + 'doom_type': 2013, + 'region': "Barrels o Fun (MAP23) Main"}, + 361325: {'name': 'Barrels o Fun (MAP23) - Backpack 2', + 'episode': 3, + 'map': 3, + 'index': 301, + 'doom_type': 8, + 'region': "Barrels o Fun (MAP23) Main"}, + 361326: {'name': 'Barrels o Fun (MAP23) - Yellow skull key', + 'episode': 3, + 'map': 3, + 'index': 307, + 'doom_type': 39, + 'region': "Barrels o Fun (MAP23) Main"}, + 361327: {'name': 'Barrels o Fun (MAP23) - BFG9000', + 'episode': 3, + 'map': 3, + 'index': 342, + 'doom_type': 2006, + 'region': "Barrels o Fun (MAP23) Main"}, + 361328: {'name': 'Barrels o Fun (MAP23) - Exit', + 'episode': 3, + 'map': 3, + 'index': -1, + 'doom_type': -1, + 'region': "Barrels o Fun (MAP23) Yellow"}, + 361329: {'name': 'The Chasm (MAP24) - Plasma gun', + 'episode': 3, + 'map': 4, + 'index': 5, + 'doom_type': 2004, + 'region': "The Chasm (MAP24) Main"}, + 361330: {'name': 'The Chasm (MAP24) - Shotgun', + 'episode': 3, + 'map': 4, + 'index': 6, + 'doom_type': 2001, + 'region': "The Chasm (MAP24) Main"}, + 361331: {'name': 'The Chasm (MAP24) - Invulnerability', + 'episode': 3, + 'map': 4, + 'index': 12, + 'doom_type': 2022, + 'region': "The Chasm (MAP24) Main"}, + 361332: {'name': 'The Chasm (MAP24) - Rocket launcher', + 'episode': 3, + 'map': 4, + 'index': 22, + 'doom_type': 2003, + 'region': "The Chasm (MAP24) Main"}, + 361333: {'name': 'The Chasm (MAP24) - Blue keycard', + 'episode': 3, + 'map': 4, + 'index': 23, + 'doom_type': 5, + 'region': "The Chasm (MAP24) Main"}, + 361334: {'name': 'The Chasm (MAP24) - Backpack', + 'episode': 3, + 'map': 4, + 'index': 31, + 'doom_type': 8, + 'region': "The Chasm (MAP24) Main"}, + 361335: {'name': 'The Chasm (MAP24) - Berserk', + 'episode': 3, + 'map': 4, + 'index': 79, + 'doom_type': 2023, + 'region': "The Chasm (MAP24) Main"}, + 361336: {'name': 'The Chasm (MAP24) - Berserk 2', + 'episode': 3, + 'map': 4, + 'index': 155, + 'doom_type': 2023, + 'region': "The Chasm (MAP24) Main"}, + 361337: {'name': 'The Chasm (MAP24) - Armor', + 'episode': 3, + 'map': 4, + 'index': 169, + 'doom_type': 2018, + 'region': "The Chasm (MAP24) Main"}, + 361338: {'name': 'The Chasm (MAP24) - Red keycard', + 'episode': 3, + 'map': 4, + 'index': 261, + 'doom_type': 13, + 'region': "The Chasm (MAP24) Main"}, + 361339: {'name': 'The Chasm (MAP24) - BFG9000', + 'episode': 3, + 'map': 4, + 'index': 295, + 'doom_type': 2006, + 'region': "The Chasm (MAP24) Main"}, + 361340: {'name': 'The Chasm (MAP24) - Super Shotgun', + 'episode': 3, + 'map': 4, + 'index': 353, + 'doom_type': 82, + 'region': "The Chasm (MAP24) Main"}, + 361341: {'name': 'The Chasm (MAP24) - Megasphere', + 'episode': 3, + 'map': 4, + 'index': 355, + 'doom_type': 83, + 'region': "The Chasm (MAP24) Main"}, + 361342: {'name': 'The Chasm (MAP24) - Megasphere 2', + 'episode': 3, + 'map': 4, + 'index': 362, + 'doom_type': 83, + 'region': "The Chasm (MAP24) Main"}, + 361343: {'name': 'The Chasm (MAP24) - Exit', + 'episode': 3, + 'map': 4, + 'index': -1, + 'doom_type': -1, + 'region': "The Chasm (MAP24) Red"}, + 361344: {'name': 'Bloodfalls (MAP25) - Super Shotgun', + 'episode': 3, + 'map': 5, + 'index': 6, + 'doom_type': 82, + 'region': "Bloodfalls (MAP25) Main"}, + 361345: {'name': 'Bloodfalls (MAP25) - Partial invisibility', + 'episode': 3, + 'map': 5, + 'index': 7, + 'doom_type': 2024, + 'region': "Bloodfalls (MAP25) Blue"}, + 361346: {'name': 'Bloodfalls (MAP25) - Megasphere', + 'episode': 3, + 'map': 5, + 'index': 23, + 'doom_type': 83, + 'region': "Bloodfalls (MAP25) Main"}, + 361347: {'name': 'Bloodfalls (MAP25) - BFG9000', + 'episode': 3, + 'map': 5, + 'index': 34, + 'doom_type': 2006, + 'region': "Bloodfalls (MAP25) Blue"}, + 361348: {'name': 'Bloodfalls (MAP25) - Mega Armor', + 'episode': 3, + 'map': 5, + 'index': 103, + 'doom_type': 2019, + 'region': "Bloodfalls (MAP25) Main"}, + 361349: {'name': 'Bloodfalls (MAP25) - Armor', + 'episode': 3, + 'map': 5, + 'index': 104, + 'doom_type': 2018, + 'region': "Bloodfalls (MAP25) Main"}, + 361350: {'name': 'Bloodfalls (MAP25) - Blue skull key', + 'episode': 3, + 'map': 5, + 'index': 106, + 'doom_type': 40, + 'region': "Bloodfalls (MAP25) Main"}, + 361351: {'name': 'Bloodfalls (MAP25) - Chaingun', + 'episode': 3, + 'map': 5, + 'index': 150, + 'doom_type': 2002, + 'region': "Bloodfalls (MAP25) Main"}, + 361352: {'name': 'Bloodfalls (MAP25) - Plasma gun', + 'episode': 3, + 'map': 5, + 'index': 169, + 'doom_type': 2004, + 'region': "Bloodfalls (MAP25) Main"}, + 361353: {'name': 'Bloodfalls (MAP25) - BFG9000 2', + 'episode': 3, + 'map': 5, + 'index': 186, + 'doom_type': 2006, + 'region': "Bloodfalls (MAP25) Main"}, + 361354: {'name': 'Bloodfalls (MAP25) - Rocket launcher', + 'episode': 3, + 'map': 5, + 'index': 236, + 'doom_type': 2003, + 'region': "Bloodfalls (MAP25) Main"}, + 361355: {'name': 'Bloodfalls (MAP25) - Exit', + 'episode': 3, + 'map': 5, + 'index': -1, + 'doom_type': -1, + 'region': "Bloodfalls (MAP25) Blue"}, + 361356: {'name': 'The Abandoned Mines (MAP26) - Blue keycard', + 'episode': 3, + 'map': 6, + 'index': 20, + 'doom_type': 5, + 'region': "The Abandoned Mines (MAP26) Red"}, + 361357: {'name': 'The Abandoned Mines (MAP26) - Super Shotgun', + 'episode': 3, + 'map': 6, + 'index': 21, + 'doom_type': 82, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361358: {'name': 'The Abandoned Mines (MAP26) - Rocket launcher', + 'episode': 3, + 'map': 6, + 'index': 49, + 'doom_type': 2003, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361359: {'name': 'The Abandoned Mines (MAP26) - Mega Armor', + 'episode': 3, + 'map': 6, + 'index': 95, + 'doom_type': 2019, + 'region': "The Abandoned Mines (MAP26) Red"}, + 361360: {'name': 'The Abandoned Mines (MAP26) - Plasma gun', + 'episode': 3, + 'map': 6, + 'index': 107, + 'doom_type': 2004, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361361: {'name': 'The Abandoned Mines (MAP26) - Supercharge', + 'episode': 3, + 'map': 6, + 'index': 154, + 'doom_type': 2013, + 'region': "The Abandoned Mines (MAP26) Red"}, + 361362: {'name': 'The Abandoned Mines (MAP26) - Chaingun', + 'episode': 3, + 'map': 6, + 'index': 155, + 'doom_type': 2002, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361363: {'name': 'The Abandoned Mines (MAP26) - Partial invisibility', + 'episode': 3, + 'map': 6, + 'index': 159, + 'doom_type': 2024, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361364: {'name': 'The Abandoned Mines (MAP26) - Armor', + 'episode': 3, + 'map': 6, + 'index': 170, + 'doom_type': 2018, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361365: {'name': 'The Abandoned Mines (MAP26) - Red keycard', + 'episode': 3, + 'map': 6, + 'index': 182, + 'doom_type': 13, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361366: {'name': 'The Abandoned Mines (MAP26) - Yellow keycard', + 'episode': 3, + 'map': 6, + 'index': 229, + 'doom_type': 6, + 'region': "The Abandoned Mines (MAP26) Blue"}, + 361367: {'name': 'The Abandoned Mines (MAP26) - Backpack', + 'episode': 3, + 'map': 6, + 'index': 254, + 'doom_type': 8, + 'region': "The Abandoned Mines (MAP26) Main"}, + 361368: {'name': 'The Abandoned Mines (MAP26) - Exit', + 'episode': 3, + 'map': 6, + 'index': -1, + 'doom_type': -1, + 'region': "The Abandoned Mines (MAP26) Yellow"}, + 361369: {'name': 'Monster Condo (MAP27) - Rocket launcher', + 'episode': 3, + 'map': 7, + 'index': 4, + 'doom_type': 2003, + 'region': "Monster Condo (MAP27) Main"}, + 361370: {'name': 'Monster Condo (MAP27) - Partial invisibility', + 'episode': 3, + 'map': 7, + 'index': 51, + 'doom_type': 2024, + 'region': "Monster Condo (MAP27) Main"}, + 361371: {'name': 'Monster Condo (MAP27) - Plasma gun', + 'episode': 3, + 'map': 7, + 'index': 58, + 'doom_type': 2004, + 'region': "Monster Condo (MAP27) Main"}, + 361372: {'name': 'Monster Condo (MAP27) - Invulnerability', + 'episode': 3, + 'map': 7, + 'index': 60, + 'doom_type': 2022, + 'region': "Monster Condo (MAP27) Main"}, + 361373: {'name': 'Monster Condo (MAP27) - Armor', + 'episode': 3, + 'map': 7, + 'index': 86, + 'doom_type': 2018, + 'region': "Monster Condo (MAP27) Main"}, + 361374: {'name': 'Monster Condo (MAP27) - Backpack', + 'episode': 3, + 'map': 7, + 'index': 105, + 'doom_type': 8, + 'region': "Monster Condo (MAP27) Main"}, + 361375: {'name': 'Monster Condo (MAP27) - Invulnerability 2', + 'episode': 3, + 'map': 7, + 'index': 107, + 'doom_type': 2022, + 'region': "Monster Condo (MAP27) Main"}, + 361376: {'name': 'Monster Condo (MAP27) - Partial invisibility 2', + 'episode': 3, + 'map': 7, + 'index': 122, + 'doom_type': 2024, + 'region': "Monster Condo (MAP27) Main"}, + 361377: {'name': 'Monster Condo (MAP27) - Supercharge', + 'episode': 3, + 'map': 7, + 'index': 236, + 'doom_type': 2013, + 'region': "Monster Condo (MAP27) Main"}, + 361378: {'name': 'Monster Condo (MAP27) - Armor 2', + 'episode': 3, + 'map': 7, + 'index': 239, + 'doom_type': 2018, + 'region': "Monster Condo (MAP27) Main"}, + 361379: {'name': 'Monster Condo (MAP27) - Chaingun', + 'episode': 3, + 'map': 7, + 'index': 251, + 'doom_type': 2002, + 'region': "Monster Condo (MAP27) Main"}, + 361380: {'name': 'Monster Condo (MAP27) - BFG9000', + 'episode': 3, + 'map': 7, + 'index': 279, + 'doom_type': 2006, + 'region': "Monster Condo (MAP27) Main"}, + 361381: {'name': 'Monster Condo (MAP27) - Backpack 2', + 'episode': 3, + 'map': 7, + 'index': 285, + 'doom_type': 8, + 'region': "Monster Condo (MAP27) Main"}, + 361382: {'name': 'Monster Condo (MAP27) - Backpack 3', + 'episode': 3, + 'map': 7, + 'index': 286, + 'doom_type': 8, + 'region': "Monster Condo (MAP27) Main"}, + 361383: {'name': 'Monster Condo (MAP27) - Backpack 4', + 'episode': 3, + 'map': 7, + 'index': 287, + 'doom_type': 8, + 'region': "Monster Condo (MAP27) Main"}, + 361384: {'name': 'Monster Condo (MAP27) - Yellow skull key', + 'episode': 3, + 'map': 7, + 'index': 310, + 'doom_type': 39, + 'region': "Monster Condo (MAP27) Main"}, + 361385: {'name': 'Monster Condo (MAP27) - Red skull key', + 'episode': 3, + 'map': 7, + 'index': 364, + 'doom_type': 38, + 'region': "Monster Condo (MAP27) Blue"}, + 361386: {'name': 'Monster Condo (MAP27) - Supercharge 2', + 'episode': 3, + 'map': 7, + 'index': 365, + 'doom_type': 2013, + 'region': "Monster Condo (MAP27) Blue"}, + 361387: {'name': 'Monster Condo (MAP27) - Blue skull key', + 'episode': 3, + 'map': 7, + 'index': 382, + 'doom_type': 40, + 'region': "Monster Condo (MAP27) Yellow"}, + 361388: {'name': 'Monster Condo (MAP27) - Supercharge 3', + 'episode': 3, + 'map': 7, + 'index': 392, + 'doom_type': 2013, + 'region': "Monster Condo (MAP27) Yellow"}, + 361389: {'name': 'Monster Condo (MAP27) - Computer area map', + 'episode': 3, + 'map': 7, + 'index': 393, + 'doom_type': 2026, + 'region': "Monster Condo (MAP27) Yellow"}, + 361390: {'name': 'Monster Condo (MAP27) - Berserk', + 'episode': 3, + 'map': 7, + 'index': 394, + 'doom_type': 2023, + 'region': "Monster Condo (MAP27) Yellow"}, + 361391: {'name': 'Monster Condo (MAP27) - Supercharge 4', + 'episode': 3, + 'map': 7, + 'index': 414, + 'doom_type': 2013, + 'region': "Monster Condo (MAP27) Yellow"}, + 361392: {'name': 'Monster Condo (MAP27) - Supercharge 5', + 'episode': 3, + 'map': 7, + 'index': 424, + 'doom_type': 2013, + 'region': "Monster Condo (MAP27) Yellow"}, + 361393: {'name': 'Monster Condo (MAP27) - Computer area map 2', + 'episode': 3, + 'map': 7, + 'index': 425, + 'doom_type': 2026, + 'region': "Monster Condo (MAP27) Yellow"}, + 361394: {'name': 'Monster Condo (MAP27) - Berserk 2', + 'episode': 3, + 'map': 7, + 'index': 426, + 'doom_type': 2023, + 'region': "Monster Condo (MAP27) Yellow"}, + 361395: {'name': 'Monster Condo (MAP27) - Partial invisibility 3', + 'episode': 3, + 'map': 7, + 'index': 454, + 'doom_type': 2024, + 'region': "Monster Condo (MAP27) Yellow"}, + 361396: {'name': 'Monster Condo (MAP27) - Invulnerability 3', + 'episode': 3, + 'map': 7, + 'index': 455, + 'doom_type': 2022, + 'region': "Monster Condo (MAP27) Yellow"}, + 361397: {'name': 'Monster Condo (MAP27) - Chainsaw', + 'episode': 3, + 'map': 7, + 'index': 460, + 'doom_type': 2005, + 'region': "Monster Condo (MAP27) Main"}, + 361398: {'name': 'Monster Condo (MAP27) - Super Shotgun', + 'episode': 3, + 'map': 7, + 'index': 470, + 'doom_type': 82, + 'region': "Monster Condo (MAP27) Main"}, + 361399: {'name': 'Monster Condo (MAP27) - Exit', + 'episode': 3, + 'map': 7, + 'index': -1, + 'doom_type': -1, + 'region': "Monster Condo (MAP27) Red"}, + 361400: {'name': 'The Spirit World (MAP28) - Armor', + 'episode': 3, + 'map': 8, + 'index': 19, + 'doom_type': 2018, + 'region': "The Spirit World (MAP28) Main"}, + 361401: {'name': 'The Spirit World (MAP28) - Chainsaw', + 'episode': 3, + 'map': 8, + 'index': 66, + 'doom_type': 2005, + 'region': "The Spirit World (MAP28) Main"}, + 361402: {'name': 'The Spirit World (MAP28) - Invulnerability', + 'episode': 3, + 'map': 8, + 'index': 76, + 'doom_type': 2022, + 'region': "The Spirit World (MAP28) Main"}, + 361403: {'name': 'The Spirit World (MAP28) - Yellow skull key', + 'episode': 3, + 'map': 8, + 'index': 87, + 'doom_type': 39, + 'region': "The Spirit World (MAP28) Main"}, + 361404: {'name': 'The Spirit World (MAP28) - Supercharge', + 'episode': 3, + 'map': 8, + 'index': 95, + 'doom_type': 2013, + 'region': "The Spirit World (MAP28) Main"}, + 361405: {'name': 'The Spirit World (MAP28) - Chaingun', + 'episode': 3, + 'map': 8, + 'index': 96, + 'doom_type': 2002, + 'region': "The Spirit World (MAP28) Main"}, + 361406: {'name': 'The Spirit World (MAP28) - Rocket launcher', + 'episode': 3, + 'map': 8, + 'index': 124, + 'doom_type': 2003, + 'region': "The Spirit World (MAP28) Main"}, + 361407: {'name': 'The Spirit World (MAP28) - Backpack', + 'episode': 3, + 'map': 8, + 'index': 155, + 'doom_type': 8, + 'region': "The Spirit World (MAP28) Main"}, + 361408: {'name': 'The Spirit World (MAP28) - Backpack 2', + 'episode': 3, + 'map': 8, + 'index': 156, + 'doom_type': 8, + 'region': "The Spirit World (MAP28) Main"}, + 361409: {'name': 'The Spirit World (MAP28) - Backpack 3', + 'episode': 3, + 'map': 8, + 'index': 157, + 'doom_type': 8, + 'region': "The Spirit World (MAP28) Main"}, + 361410: {'name': 'The Spirit World (MAP28) - Backpack 4', + 'episode': 3, + 'map': 8, + 'index': 158, + 'doom_type': 8, + 'region': "The Spirit World (MAP28) Main"}, + 361411: {'name': 'The Spirit World (MAP28) - Berserk', + 'episode': 3, + 'map': 8, + 'index': 159, + 'doom_type': 2023, + 'region': "The Spirit World (MAP28) Main"}, + 361412: {'name': 'The Spirit World (MAP28) - Plasma gun', + 'episode': 3, + 'map': 8, + 'index': 163, + 'doom_type': 2004, + 'region': "The Spirit World (MAP28) Main"}, + 361413: {'name': 'The Spirit World (MAP28) - Invulnerability 2', + 'episode': 3, + 'map': 8, + 'index': 179, + 'doom_type': 2022, + 'region': "The Spirit World (MAP28) Main"}, + 361414: {'name': 'The Spirit World (MAP28) - Invulnerability 3', + 'episode': 3, + 'map': 8, + 'index': 180, + 'doom_type': 2022, + 'region': "The Spirit World (MAP28) Main"}, + 361415: {'name': 'The Spirit World (MAP28) - BFG9000', + 'episode': 3, + 'map': 8, + 'index': 181, + 'doom_type': 2006, + 'region': "The Spirit World (MAP28) Main"}, + 361416: {'name': 'The Spirit World (MAP28) - Megasphere', + 'episode': 3, + 'map': 8, + 'index': 183, + 'doom_type': 83, + 'region': "The Spirit World (MAP28) Main"}, + 361417: {'name': 'The Spirit World (MAP28) - Megasphere 2', + 'episode': 3, + 'map': 8, + 'index': 185, + 'doom_type': 83, + 'region': "The Spirit World (MAP28) Main"}, + 361418: {'name': 'The Spirit World (MAP28) - Invulnerability 4', + 'episode': 3, + 'map': 8, + 'index': 186, + 'doom_type': 2022, + 'region': "The Spirit World (MAP28) Main"}, + 361419: {'name': 'The Spirit World (MAP28) - Invulnerability 5', + 'episode': 3, + 'map': 8, + 'index': 195, + 'doom_type': 2022, + 'region': "The Spirit World (MAP28) Main"}, + 361420: {'name': 'The Spirit World (MAP28) - Super Shotgun', + 'episode': 3, + 'map': 8, + 'index': 214, + 'doom_type': 82, + 'region': "The Spirit World (MAP28) Main"}, + 361421: {'name': 'The Spirit World (MAP28) - Red skull key', + 'episode': 3, + 'map': 8, + 'index': 216, + 'doom_type': 38, + 'region': "The Spirit World (MAP28) Yellow"}, + 361422: {'name': 'The Spirit World (MAP28) - Exit', + 'episode': 3, + 'map': 8, + 'index': -1, + 'doom_type': -1, + 'region': "The Spirit World (MAP28) Red"}, + 361423: {'name': 'The Living End (MAP29) - Chaingun', + 'episode': 3, + 'map': 9, + 'index': 85, + 'doom_type': 2002, + 'region': "The Living End (MAP29) Main"}, + 361424: {'name': 'The Living End (MAP29) - Plasma gun', + 'episode': 3, + 'map': 9, + 'index': 124, + 'doom_type': 2004, + 'region': "The Living End (MAP29) Main"}, + 361425: {'name': 'The Living End (MAP29) - Backpack', + 'episode': 3, + 'map': 9, + 'index': 179, + 'doom_type': 8, + 'region': "The Living End (MAP29) Main"}, + 361426: {'name': 'The Living End (MAP29) - Super Shotgun', + 'episode': 3, + 'map': 9, + 'index': 195, + 'doom_type': 82, + 'region': "The Living End (MAP29) Main"}, + 361427: {'name': 'The Living End (MAP29) - Mega Armor', + 'episode': 3, + 'map': 9, + 'index': 216, + 'doom_type': 2019, + 'region': "The Living End (MAP29) Main"}, + 361428: {'name': 'The Living End (MAP29) - Armor', + 'episode': 3, + 'map': 9, + 'index': 224, + 'doom_type': 2018, + 'region': "The Living End (MAP29) Main"}, + 361429: {'name': 'The Living End (MAP29) - Backpack 2', + 'episode': 3, + 'map': 9, + 'index': 235, + 'doom_type': 8, + 'region': "The Living End (MAP29) Main"}, + 361430: {'name': 'The Living End (MAP29) - Supercharge', + 'episode': 3, + 'map': 9, + 'index': 237, + 'doom_type': 2013, + 'region': "The Living End (MAP29) Main"}, + 361431: {'name': 'The Living End (MAP29) - Berserk', + 'episode': 3, + 'map': 9, + 'index': 241, + 'doom_type': 2023, + 'region': "The Living End (MAP29) Main"}, + 361432: {'name': 'The Living End (MAP29) - Berserk 2', + 'episode': 3, + 'map': 9, + 'index': 263, + 'doom_type': 2023, + 'region': "The Living End (MAP29) Main"}, + 361433: {'name': 'The Living End (MAP29) - Exit', + 'episode': 3, + 'map': 9, + 'index': -1, + 'doom_type': -1, + 'region': "The Living End (MAP29) Main"}, + 361434: {'name': 'Icon of Sin (MAP30) - Supercharge', + 'episode': 3, + 'map': 10, + 'index': 25, + 'doom_type': 2013, + 'region': "Icon of Sin (MAP30) Main"}, + 361435: {'name': 'Icon of Sin (MAP30) - Supercharge 2', + 'episode': 3, + 'map': 10, + 'index': 26, + 'doom_type': 2013, + 'region': "Icon of Sin (MAP30) Main"}, + 361436: {'name': 'Icon of Sin (MAP30) - Supercharge 3', + 'episode': 3, + 'map': 10, + 'index': 28, + 'doom_type': 2013, + 'region': "Icon of Sin (MAP30) Main"}, + 361437: {'name': 'Icon of Sin (MAP30) - Invulnerability', + 'episode': 3, + 'map': 10, + 'index': 29, + 'doom_type': 2022, + 'region': "Icon of Sin (MAP30) Main"}, + 361438: {'name': 'Icon of Sin (MAP30) - Invulnerability 2', + 'episode': 3, + 'map': 10, + 'index': 30, + 'doom_type': 2022, + 'region': "Icon of Sin (MAP30) Main"}, + 361439: {'name': 'Icon of Sin (MAP30) - Invulnerability 3', + 'episode': 3, + 'map': 10, + 'index': 31, + 'doom_type': 2022, + 'region': "Icon of Sin (MAP30) Main"}, + 361440: {'name': 'Icon of Sin (MAP30) - Invulnerability 4', + 'episode': 3, + 'map': 10, + 'index': 32, + 'doom_type': 2022, + 'region': "Icon of Sin (MAP30) Main"}, + 361441: {'name': 'Icon of Sin (MAP30) - BFG9000', + 'episode': 3, + 'map': 10, + 'index': 40, + 'doom_type': 2006, + 'region': "Icon of Sin (MAP30) Main"}, + 361442: {'name': 'Icon of Sin (MAP30) - Chaingun', + 'episode': 3, + 'map': 10, + 'index': 41, + 'doom_type': 2002, + 'region': "Icon of Sin (MAP30) Main"}, + 361443: {'name': 'Icon of Sin (MAP30) - Chainsaw', + 'episode': 3, + 'map': 10, + 'index': 42, + 'doom_type': 2005, + 'region': "Icon of Sin (MAP30) Main"}, + 361444: {'name': 'Icon of Sin (MAP30) - Plasma gun', + 'episode': 3, + 'map': 10, + 'index': 43, + 'doom_type': 2004, + 'region': "Icon of Sin (MAP30) Main"}, + 361445: {'name': 'Icon of Sin (MAP30) - Rocket launcher', + 'episode': 3, + 'map': 10, + 'index': 44, + 'doom_type': 2003, + 'region': "Icon of Sin (MAP30) Main"}, + 361446: {'name': 'Icon of Sin (MAP30) - Shotgun', + 'episode': 3, + 'map': 10, + 'index': 45, + 'doom_type': 2001, + 'region': "Icon of Sin (MAP30) Main"}, + 361447: {'name': 'Icon of Sin (MAP30) - Super Shotgun', + 'episode': 3, + 'map': 10, + 'index': 46, + 'doom_type': 82, + 'region': "Icon of Sin (MAP30) Main"}, + 361448: {'name': 'Icon of Sin (MAP30) - Backpack', + 'episode': 3, + 'map': 10, + 'index': 47, + 'doom_type': 8, + 'region': "Icon of Sin (MAP30) Main"}, + 361449: {'name': 'Icon of Sin (MAP30) - Megasphere', + 'episode': 3, + 'map': 10, + 'index': 64, + 'doom_type': 83, + 'region': "Icon of Sin (MAP30) Main"}, + 361450: {'name': 'Icon of Sin (MAP30) - Megasphere 2', + 'episode': 3, + 'map': 10, + 'index': 85, + 'doom_type': 83, + 'region': "Icon of Sin (MAP30) Main"}, + 361451: {'name': 'Icon of Sin (MAP30) - Berserk', + 'episode': 3, + 'map': 10, + 'index': 94, + 'doom_type': 2023, + 'region': "Icon of Sin (MAP30) Main"}, + 361452: {'name': 'Icon of Sin (MAP30) - Exit', + 'episode': 3, + 'map': 10, + 'index': -1, + 'doom_type': -1, + 'region': "Icon of Sin (MAP30) Main"}, + 361453: {'name': 'Wolfenstein2 (MAP31) - Rocket launcher', + 'episode': 4, + 'map': 1, + 'index': 110, + 'doom_type': 2003, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361454: {'name': 'Wolfenstein2 (MAP31) - Shotgun', + 'episode': 4, + 'map': 1, + 'index': 139, + 'doom_type': 2001, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361455: {'name': 'Wolfenstein2 (MAP31) - Berserk', + 'episode': 4, + 'map': 1, + 'index': 263, + 'doom_type': 2023, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361456: {'name': 'Wolfenstein2 (MAP31) - Supercharge', + 'episode': 4, + 'map': 1, + 'index': 278, + 'doom_type': 2013, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361457: {'name': 'Wolfenstein2 (MAP31) - Chaingun', + 'episode': 4, + 'map': 1, + 'index': 305, + 'doom_type': 2002, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361458: {'name': 'Wolfenstein2 (MAP31) - Super Shotgun', + 'episode': 4, + 'map': 1, + 'index': 308, + 'doom_type': 82, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361459: {'name': 'Wolfenstein2 (MAP31) - Partial invisibility', + 'episode': 4, + 'map': 1, + 'index': 309, + 'doom_type': 2024, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361460: {'name': 'Wolfenstein2 (MAP31) - Megasphere', + 'episode': 4, + 'map': 1, + 'index': 310, + 'doom_type': 83, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361461: {'name': 'Wolfenstein2 (MAP31) - Backpack', + 'episode': 4, + 'map': 1, + 'index': 311, + 'doom_type': 8, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361462: {'name': 'Wolfenstein2 (MAP31) - Backpack 2', + 'episode': 4, + 'map': 1, + 'index': 312, + 'doom_type': 8, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361463: {'name': 'Wolfenstein2 (MAP31) - Backpack 3', + 'episode': 4, + 'map': 1, + 'index': 313, + 'doom_type': 8, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361464: {'name': 'Wolfenstein2 (MAP31) - Backpack 4', + 'episode': 4, + 'map': 1, + 'index': 314, + 'doom_type': 8, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361465: {'name': 'Wolfenstein2 (MAP31) - BFG9000', + 'episode': 4, + 'map': 1, + 'index': 315, + 'doom_type': 2006, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361466: {'name': 'Wolfenstein2 (MAP31) - Plasma gun', + 'episode': 4, + 'map': 1, + 'index': 316, + 'doom_type': 2004, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361467: {'name': 'Wolfenstein2 (MAP31) - Exit', + 'episode': 4, + 'map': 1, + 'index': -1, + 'doom_type': -1, + 'region': "Wolfenstein2 (MAP31) Main"}, + 361468: {'name': 'Grosse2 (MAP32) - Plasma gun', + 'episode': 4, + 'map': 2, + 'index': 33, + 'doom_type': 2004, + 'region': "Grosse2 (MAP32) Main"}, + 361469: {'name': 'Grosse2 (MAP32) - Rocket launcher', + 'episode': 4, + 'map': 2, + 'index': 57, + 'doom_type': 2003, + 'region': "Grosse2 (MAP32) Main"}, + 361470: {'name': 'Grosse2 (MAP32) - Invulnerability', + 'episode': 4, + 'map': 2, + 'index': 70, + 'doom_type': 2022, + 'region': "Grosse2 (MAP32) Main"}, + 361471: {'name': 'Grosse2 (MAP32) - Super Shotgun', + 'episode': 4, + 'map': 2, + 'index': 74, + 'doom_type': 82, + 'region': "Grosse2 (MAP32) Main"}, + 361472: {'name': 'Grosse2 (MAP32) - BFG9000', + 'episode': 4, + 'map': 2, + 'index': 75, + 'doom_type': 2006, + 'region': "Grosse2 (MAP32) Main"}, + 361473: {'name': 'Grosse2 (MAP32) - Megasphere', + 'episode': 4, + 'map': 2, + 'index': 78, + 'doom_type': 83, + 'region': "Grosse2 (MAP32) Main"}, + 361474: {'name': 'Grosse2 (MAP32) - Chaingun', + 'episode': 4, + 'map': 2, + 'index': 79, + 'doom_type': 2002, + 'region': "Grosse2 (MAP32) Main"}, + 361475: {'name': 'Grosse2 (MAP32) - Chaingun 2', + 'episode': 4, + 'map': 2, + 'index': 80, + 'doom_type': 2002, + 'region': "Grosse2 (MAP32) Main"}, + 361476: {'name': 'Grosse2 (MAP32) - Chaingun 3', + 'episode': 4, + 'map': 2, + 'index': 81, + 'doom_type': 2002, + 'region': "Grosse2 (MAP32) Main"}, + 361477: {'name': 'Grosse2 (MAP32) - Berserk', + 'episode': 4, + 'map': 2, + 'index': 82, + 'doom_type': 2023, + 'region': "Grosse2 (MAP32) Main"}, + 361478: {'name': 'Grosse2 (MAP32) - Exit', + 'episode': 4, + 'map': 2, + 'index': -1, + 'doom_type': -1, + 'region': "Grosse2 (MAP32) Main"}, +} + + +location_name_groups: Dict[str, Set[str]] = { + 'Barrels o Fun (MAP23)': { + 'Barrels o Fun (MAP23) - Armor', + 'Barrels o Fun (MAP23) - BFG9000', + 'Barrels o Fun (MAP23) - Backpack', + 'Barrels o Fun (MAP23) - Backpack 2', + 'Barrels o Fun (MAP23) - Berserk', + 'Barrels o Fun (MAP23) - Computer area map', + 'Barrels o Fun (MAP23) - Exit', + 'Barrels o Fun (MAP23) - Megasphere', + 'Barrels o Fun (MAP23) - Rocket launcher', + 'Barrels o Fun (MAP23) - Shotgun', + 'Barrels o Fun (MAP23) - Supercharge', + 'Barrels o Fun (MAP23) - Yellow skull key', + }, + 'Bloodfalls (MAP25)': { + 'Bloodfalls (MAP25) - Armor', + 'Bloodfalls (MAP25) - BFG9000', + 'Bloodfalls (MAP25) - BFG9000 2', + 'Bloodfalls (MAP25) - Blue skull key', + 'Bloodfalls (MAP25) - Chaingun', + 'Bloodfalls (MAP25) - Exit', + 'Bloodfalls (MAP25) - Mega Armor', + 'Bloodfalls (MAP25) - Megasphere', + 'Bloodfalls (MAP25) - Partial invisibility', + 'Bloodfalls (MAP25) - Plasma gun', + 'Bloodfalls (MAP25) - Rocket launcher', + 'Bloodfalls (MAP25) - Super Shotgun', + }, + 'Circle of Death (MAP11)': { + 'Circle of Death (MAP11) - Armor', + 'Circle of Death (MAP11) - BFG9000', + 'Circle of Death (MAP11) - Backpack', + 'Circle of Death (MAP11) - Blue keycard', + 'Circle of Death (MAP11) - Chaingun', + 'Circle of Death (MAP11) - Exit', + 'Circle of Death (MAP11) - Invulnerability', + 'Circle of Death (MAP11) - Mega Armor', + 'Circle of Death (MAP11) - Partial invisibility', + 'Circle of Death (MAP11) - Plasma gun', + 'Circle of Death (MAP11) - Red keycard', + 'Circle of Death (MAP11) - Rocket launcher', + 'Circle of Death (MAP11) - Shotgun', + 'Circle of Death (MAP11) - Supercharge', + 'Circle of Death (MAP11) - Supercharge 2', + }, + 'Dead Simple (MAP07)': { + 'Dead Simple (MAP07) - Backpack', + 'Dead Simple (MAP07) - Berserk', + 'Dead Simple (MAP07) - Chaingun', + 'Dead Simple (MAP07) - Exit', + 'Dead Simple (MAP07) - Megasphere', + 'Dead Simple (MAP07) - Partial invisibility', + 'Dead Simple (MAP07) - Partial invisibility 2', + 'Dead Simple (MAP07) - Partial invisibility 3', + 'Dead Simple (MAP07) - Partial invisibility 4', + 'Dead Simple (MAP07) - Plasma gun', + 'Dead Simple (MAP07) - Rocket launcher', + 'Dead Simple (MAP07) - Super Shotgun', + }, + 'Downtown (MAP13)': { + 'Downtown (MAP13) - BFG9000', + 'Downtown (MAP13) - Backpack', + 'Downtown (MAP13) - Berserk', + 'Downtown (MAP13) - Berserk 2', + 'Downtown (MAP13) - Berserk 3', + 'Downtown (MAP13) - Blue keycard', + 'Downtown (MAP13) - Chaingun', + 'Downtown (MAP13) - Chainsaw', + 'Downtown (MAP13) - Computer area map', + 'Downtown (MAP13) - Exit', + 'Downtown (MAP13) - Invulnerability', + 'Downtown (MAP13) - Invulnerability 2', + 'Downtown (MAP13) - Mega Armor', + 'Downtown (MAP13) - Partial invisibility', + 'Downtown (MAP13) - Partial invisibility 2', + 'Downtown (MAP13) - Partial invisibility 3', + 'Downtown (MAP13) - Plasma gun', + 'Downtown (MAP13) - Red keycard', + 'Downtown (MAP13) - Rocket launcher', + 'Downtown (MAP13) - Shotgun', + 'Downtown (MAP13) - Supercharge', + 'Downtown (MAP13) - Yellow keycard', + }, + 'Entryway (MAP01)': { + 'Entryway (MAP01) - Armor', + 'Entryway (MAP01) - Chainsaw', + 'Entryway (MAP01) - Exit', + 'Entryway (MAP01) - Rocket launcher', + 'Entryway (MAP01) - Shotgun', + }, + 'Gotcha! (MAP20)': { + 'Gotcha! (MAP20) - Armor', + 'Gotcha! (MAP20) - Armor 2', + 'Gotcha! (MAP20) - BFG9000', + 'Gotcha! (MAP20) - Berserk', + 'Gotcha! (MAP20) - Exit', + 'Gotcha! (MAP20) - Mega Armor', + 'Gotcha! (MAP20) - Mega Armor 2', + 'Gotcha! (MAP20) - Megasphere', + 'Gotcha! (MAP20) - Plasma gun', + 'Gotcha! (MAP20) - Rocket launcher', + 'Gotcha! (MAP20) - Super Shotgun', + 'Gotcha! (MAP20) - Supercharge', + 'Gotcha! (MAP20) - Supercharge 2', + 'Gotcha! (MAP20) - Supercharge 3', + 'Gotcha! (MAP20) - Supercharge 4', + }, + 'Grosse2 (MAP32)': { + 'Grosse2 (MAP32) - BFG9000', + 'Grosse2 (MAP32) - Berserk', + 'Grosse2 (MAP32) - Chaingun', + 'Grosse2 (MAP32) - Chaingun 2', + 'Grosse2 (MAP32) - Chaingun 3', + 'Grosse2 (MAP32) - Exit', + 'Grosse2 (MAP32) - Invulnerability', + 'Grosse2 (MAP32) - Megasphere', + 'Grosse2 (MAP32) - Plasma gun', + 'Grosse2 (MAP32) - Rocket launcher', + 'Grosse2 (MAP32) - Super Shotgun', + }, + 'Icon of Sin (MAP30)': { + 'Icon of Sin (MAP30) - BFG9000', + 'Icon of Sin (MAP30) - Backpack', + 'Icon of Sin (MAP30) - Berserk', + 'Icon of Sin (MAP30) - Chaingun', + 'Icon of Sin (MAP30) - Chainsaw', + 'Icon of Sin (MAP30) - Exit', + 'Icon of Sin (MAP30) - Invulnerability', + 'Icon of Sin (MAP30) - Invulnerability 2', + 'Icon of Sin (MAP30) - Invulnerability 3', + 'Icon of Sin (MAP30) - Invulnerability 4', + 'Icon of Sin (MAP30) - Megasphere', + 'Icon of Sin (MAP30) - Megasphere 2', + 'Icon of Sin (MAP30) - Plasma gun', + 'Icon of Sin (MAP30) - Rocket launcher', + 'Icon of Sin (MAP30) - Shotgun', + 'Icon of Sin (MAP30) - Super Shotgun', + 'Icon of Sin (MAP30) - Supercharge', + 'Icon of Sin (MAP30) - Supercharge 2', + 'Icon of Sin (MAP30) - Supercharge 3', + }, + 'Industrial Zone (MAP15)': { + 'Industrial Zone (MAP15) - Armor', + 'Industrial Zone (MAP15) - BFG9000', + 'Industrial Zone (MAP15) - Backpack', + 'Industrial Zone (MAP15) - Backpack 2', + 'Industrial Zone (MAP15) - Berserk', + 'Industrial Zone (MAP15) - Berserk 2', + 'Industrial Zone (MAP15) - Blue keycard', + 'Industrial Zone (MAP15) - Chaingun', + 'Industrial Zone (MAP15) - Chainsaw', + 'Industrial Zone (MAP15) - Computer area map', + 'Industrial Zone (MAP15) - Exit', + 'Industrial Zone (MAP15) - Invulnerability', + 'Industrial Zone (MAP15) - Mega Armor', + 'Industrial Zone (MAP15) - Mega Armor 2', + 'Industrial Zone (MAP15) - Megasphere', + 'Industrial Zone (MAP15) - Partial invisibility', + 'Industrial Zone (MAP15) - Partial invisibility 2', + 'Industrial Zone (MAP15) - Plasma gun', + 'Industrial Zone (MAP15) - Red keycard', + 'Industrial Zone (MAP15) - Rocket launcher', + 'Industrial Zone (MAP15) - Shotgun', + 'Industrial Zone (MAP15) - Supercharge', + 'Industrial Zone (MAP15) - Yellow keycard', + }, + 'Monster Condo (MAP27)': { + 'Monster Condo (MAP27) - Armor', + 'Monster Condo (MAP27) - Armor 2', + 'Monster Condo (MAP27) - BFG9000', + 'Monster Condo (MAP27) - Backpack', + 'Monster Condo (MAP27) - Backpack 2', + 'Monster Condo (MAP27) - Backpack 3', + 'Monster Condo (MAP27) - Backpack 4', + 'Monster Condo (MAP27) - Berserk', + 'Monster Condo (MAP27) - Berserk 2', + 'Monster Condo (MAP27) - Blue skull key', + 'Monster Condo (MAP27) - Chaingun', + 'Monster Condo (MAP27) - Chainsaw', + 'Monster Condo (MAP27) - Computer area map', + 'Monster Condo (MAP27) - Computer area map 2', + 'Monster Condo (MAP27) - Exit', + 'Monster Condo (MAP27) - Invulnerability', + 'Monster Condo (MAP27) - Invulnerability 2', + 'Monster Condo (MAP27) - Invulnerability 3', + 'Monster Condo (MAP27) - Partial invisibility', + 'Monster Condo (MAP27) - Partial invisibility 2', + 'Monster Condo (MAP27) - Partial invisibility 3', + 'Monster Condo (MAP27) - Plasma gun', + 'Monster Condo (MAP27) - Red skull key', + 'Monster Condo (MAP27) - Rocket launcher', + 'Monster Condo (MAP27) - Super Shotgun', + 'Monster Condo (MAP27) - Supercharge', + 'Monster Condo (MAP27) - Supercharge 2', + 'Monster Condo (MAP27) - Supercharge 3', + 'Monster Condo (MAP27) - Supercharge 4', + 'Monster Condo (MAP27) - Supercharge 5', + 'Monster Condo (MAP27) - Yellow skull key', + }, + 'Nirvana (MAP21)': { + 'Nirvana (MAP21) - Backpack', + 'Nirvana (MAP21) - Blue skull key', + 'Nirvana (MAP21) - Exit', + 'Nirvana (MAP21) - Invulnerability', + 'Nirvana (MAP21) - Megasphere', + 'Nirvana (MAP21) - Red skull key', + 'Nirvana (MAP21) - Rocket launcher', + 'Nirvana (MAP21) - Super Shotgun', + 'Nirvana (MAP21) - Yellow skull key', + }, + 'Refueling Base (MAP10)': { + 'Refueling Base (MAP10) - Armor', + 'Refueling Base (MAP10) - Armor 2', + 'Refueling Base (MAP10) - BFG9000', + 'Refueling Base (MAP10) - Backpack', + 'Refueling Base (MAP10) - Berserk', + 'Refueling Base (MAP10) - Berserk 2', + 'Refueling Base (MAP10) - Blue keycard', + 'Refueling Base (MAP10) - Chaingun', + 'Refueling Base (MAP10) - Chainsaw', + 'Refueling Base (MAP10) - Exit', + 'Refueling Base (MAP10) - Invulnerability', + 'Refueling Base (MAP10) - Invulnerability 2', + 'Refueling Base (MAP10) - Mega Armor', + 'Refueling Base (MAP10) - Megasphere', + 'Refueling Base (MAP10) - Partial invisibility', + 'Refueling Base (MAP10) - Plasma gun', + 'Refueling Base (MAP10) - Rocket launcher', + 'Refueling Base (MAP10) - Shotgun', + 'Refueling Base (MAP10) - Supercharge', + 'Refueling Base (MAP10) - Supercharge 2', + 'Refueling Base (MAP10) - Yellow keycard', + }, + 'Suburbs (MAP16)': { + 'Suburbs (MAP16) - BFG9000', + 'Suburbs (MAP16) - Backpack', + 'Suburbs (MAP16) - Berserk', + 'Suburbs (MAP16) - Blue skull key', + 'Suburbs (MAP16) - Chaingun', + 'Suburbs (MAP16) - Exit', + 'Suburbs (MAP16) - Invulnerability', + 'Suburbs (MAP16) - Megasphere', + 'Suburbs (MAP16) - Partial invisibility', + 'Suburbs (MAP16) - Plasma gun', + 'Suburbs (MAP16) - Plasma gun 2', + 'Suburbs (MAP16) - Plasma gun 3', + 'Suburbs (MAP16) - Plasma gun 4', + 'Suburbs (MAP16) - Red skull key', + 'Suburbs (MAP16) - Rocket launcher', + 'Suburbs (MAP16) - Shotgun', + 'Suburbs (MAP16) - Super Shotgun', + 'Suburbs (MAP16) - Supercharge', + }, + 'Tenements (MAP17)': { + 'Tenements (MAP17) - Armor', + 'Tenements (MAP17) - Armor 2', + 'Tenements (MAP17) - BFG9000', + 'Tenements (MAP17) - Backpack', + 'Tenements (MAP17) - Berserk', + 'Tenements (MAP17) - Blue keycard', + 'Tenements (MAP17) - Chaingun', + 'Tenements (MAP17) - Exit', + 'Tenements (MAP17) - Mega Armor', + 'Tenements (MAP17) - Megasphere', + 'Tenements (MAP17) - Partial invisibility', + 'Tenements (MAP17) - Plasma gun', + 'Tenements (MAP17) - Red keycard', + 'Tenements (MAP17) - Rocket launcher', + 'Tenements (MAP17) - Shotgun', + 'Tenements (MAP17) - Supercharge', + 'Tenements (MAP17) - Supercharge 2', + 'Tenements (MAP17) - Yellow skull key', + }, + 'The Abandoned Mines (MAP26)': { + 'The Abandoned Mines (MAP26) - Armor', + 'The Abandoned Mines (MAP26) - Backpack', + 'The Abandoned Mines (MAP26) - Blue keycard', + 'The Abandoned Mines (MAP26) - Chaingun', + 'The Abandoned Mines (MAP26) - Exit', + 'The Abandoned Mines (MAP26) - Mega Armor', + 'The Abandoned Mines (MAP26) - Partial invisibility', + 'The Abandoned Mines (MAP26) - Plasma gun', + 'The Abandoned Mines (MAP26) - Red keycard', + 'The Abandoned Mines (MAP26) - Rocket launcher', + 'The Abandoned Mines (MAP26) - Super Shotgun', + 'The Abandoned Mines (MAP26) - Supercharge', + 'The Abandoned Mines (MAP26) - Yellow keycard', + }, + 'The Catacombs (MAP22)': { + 'The Catacombs (MAP22) - Armor', + 'The Catacombs (MAP22) - Berserk', + 'The Catacombs (MAP22) - Blue skull key', + 'The Catacombs (MAP22) - Exit', + 'The Catacombs (MAP22) - Plasma gun', + 'The Catacombs (MAP22) - Red skull key', + 'The Catacombs (MAP22) - Rocket launcher', + 'The Catacombs (MAP22) - Shotgun', + 'The Catacombs (MAP22) - Supercharge', + }, + 'The Chasm (MAP24)': { + 'The Chasm (MAP24) - Armor', + 'The Chasm (MAP24) - BFG9000', + 'The Chasm (MAP24) - Backpack', + 'The Chasm (MAP24) - Berserk', + 'The Chasm (MAP24) - Berserk 2', + 'The Chasm (MAP24) - Blue keycard', + 'The Chasm (MAP24) - Exit', + 'The Chasm (MAP24) - Invulnerability', + 'The Chasm (MAP24) - Megasphere', + 'The Chasm (MAP24) - Megasphere 2', + 'The Chasm (MAP24) - Plasma gun', + 'The Chasm (MAP24) - Red keycard', + 'The Chasm (MAP24) - Rocket launcher', + 'The Chasm (MAP24) - Shotgun', + 'The Chasm (MAP24) - Super Shotgun', + }, + 'The Citadel (MAP19)': { + 'The Citadel (MAP19) - Armor', + 'The Citadel (MAP19) - Armor 2', + 'The Citadel (MAP19) - Backpack', + 'The Citadel (MAP19) - Berserk', + 'The Citadel (MAP19) - Blue skull key', + 'The Citadel (MAP19) - Chaingun', + 'The Citadel (MAP19) - Computer area map', + 'The Citadel (MAP19) - Exit', + 'The Citadel (MAP19) - Invulnerability', + 'The Citadel (MAP19) - Mega Armor', + 'The Citadel (MAP19) - Partial invisibility', + 'The Citadel (MAP19) - Red skull key', + 'The Citadel (MAP19) - Rocket launcher', + 'The Citadel (MAP19) - Super Shotgun', + 'The Citadel (MAP19) - Supercharge', + 'The Citadel (MAP19) - Yellow skull key', + }, + 'The Courtyard (MAP18)': { + 'The Courtyard (MAP18) - Armor', + 'The Courtyard (MAP18) - BFG9000', + 'The Courtyard (MAP18) - Backpack', + 'The Courtyard (MAP18) - Berserk', + 'The Courtyard (MAP18) - Blue skull key', + 'The Courtyard (MAP18) - Chaingun', + 'The Courtyard (MAP18) - Computer area map', + 'The Courtyard (MAP18) - Exit', + 'The Courtyard (MAP18) - Invulnerability', + 'The Courtyard (MAP18) - Invulnerability 2', + 'The Courtyard (MAP18) - Partial invisibility', + 'The Courtyard (MAP18) - Partial invisibility 2', + 'The Courtyard (MAP18) - Plasma gun', + 'The Courtyard (MAP18) - Rocket launcher', + 'The Courtyard (MAP18) - Shotgun', + 'The Courtyard (MAP18) - Super Shotgun', + 'The Courtyard (MAP18) - Supercharge', + 'The Courtyard (MAP18) - Yellow skull key', + }, + 'The Crusher (MAP06)': { + 'The Crusher (MAP06) - Armor', + 'The Crusher (MAP06) - Backpack', + 'The Crusher (MAP06) - Blue keycard', + 'The Crusher (MAP06) - Blue keycard 2', + 'The Crusher (MAP06) - Blue keycard 3', + 'The Crusher (MAP06) - Exit', + 'The Crusher (MAP06) - Mega Armor', + 'The Crusher (MAP06) - Megasphere', + 'The Crusher (MAP06) - Megasphere 2', + 'The Crusher (MAP06) - Plasma gun', + 'The Crusher (MAP06) - Red keycard', + 'The Crusher (MAP06) - Rocket launcher', + 'The Crusher (MAP06) - Super Shotgun', + 'The Crusher (MAP06) - Supercharge', + 'The Crusher (MAP06) - Yellow keycard', + }, + 'The Factory (MAP12)': { + 'The Factory (MAP12) - Armor', + 'The Factory (MAP12) - Armor 2', + 'The Factory (MAP12) - BFG9000', + 'The Factory (MAP12) - Backpack', + 'The Factory (MAP12) - Berserk', + 'The Factory (MAP12) - Berserk 2', + 'The Factory (MAP12) - Berserk 3', + 'The Factory (MAP12) - Blue keycard', + 'The Factory (MAP12) - Chaingun', + 'The Factory (MAP12) - Exit', + 'The Factory (MAP12) - Partial invisibility', + 'The Factory (MAP12) - Shotgun', + 'The Factory (MAP12) - Super Shotgun', + 'The Factory (MAP12) - Supercharge', + 'The Factory (MAP12) - Supercharge 2', + 'The Factory (MAP12) - Yellow keycard', + }, + 'The Focus (MAP04)': { + 'The Focus (MAP04) - Blue keycard', + 'The Focus (MAP04) - Exit', + 'The Focus (MAP04) - Red keycard', + 'The Focus (MAP04) - Super Shotgun', + 'The Focus (MAP04) - Yellow keycard', + }, + 'The Gantlet (MAP03)': { + 'The Gantlet (MAP03) - Backpack', + 'The Gantlet (MAP03) - Blue keycard', + 'The Gantlet (MAP03) - Chaingun', + 'The Gantlet (MAP03) - Exit', + 'The Gantlet (MAP03) - Mega Armor', + 'The Gantlet (MAP03) - Mega Armor 2', + 'The Gantlet (MAP03) - Partial invisibility', + 'The Gantlet (MAP03) - Red keycard', + 'The Gantlet (MAP03) - Rocket launcher', + 'The Gantlet (MAP03) - Shotgun', + 'The Gantlet (MAP03) - Supercharge', + }, + 'The Inmost Dens (MAP14)': { + 'The Inmost Dens (MAP14) - Berserk', + 'The Inmost Dens (MAP14) - Blue skull key', + 'The Inmost Dens (MAP14) - Chaingun', + 'The Inmost Dens (MAP14) - Exit', + 'The Inmost Dens (MAP14) - Mega Armor', + 'The Inmost Dens (MAP14) - Partial invisibility', + 'The Inmost Dens (MAP14) - Plasma gun', + 'The Inmost Dens (MAP14) - Red skull key', + 'The Inmost Dens (MAP14) - Rocket launcher', + 'The Inmost Dens (MAP14) - Shotgun', + 'The Inmost Dens (MAP14) - Supercharge', + }, + 'The Living End (MAP29)': { + 'The Living End (MAP29) - Armor', + 'The Living End (MAP29) - Backpack', + 'The Living End (MAP29) - Backpack 2', + 'The Living End (MAP29) - Berserk', + 'The Living End (MAP29) - Berserk 2', + 'The Living End (MAP29) - Chaingun', + 'The Living End (MAP29) - Exit', + 'The Living End (MAP29) - Mega Armor', + 'The Living End (MAP29) - Plasma gun', + 'The Living End (MAP29) - Super Shotgun', + 'The Living End (MAP29) - Supercharge', + }, + 'The Pit (MAP09)': { + 'The Pit (MAP09) - Armor', + 'The Pit (MAP09) - BFG9000', + 'The Pit (MAP09) - Backpack', + 'The Pit (MAP09) - Berserk', + 'The Pit (MAP09) - Berserk 2', + 'The Pit (MAP09) - Berserk 3', + 'The Pit (MAP09) - Blue keycard', + 'The Pit (MAP09) - Computer area map', + 'The Pit (MAP09) - Exit', + 'The Pit (MAP09) - Mega Armor', + 'The Pit (MAP09) - Mega Armor 2', + 'The Pit (MAP09) - Rocket launcher', + 'The Pit (MAP09) - Shotgun', + 'The Pit (MAP09) - Supercharge', + 'The Pit (MAP09) - Supercharge 2', + 'The Pit (MAP09) - Yellow keycard', + }, + 'The Spirit World (MAP28)': { + 'The Spirit World (MAP28) - Armor', + 'The Spirit World (MAP28) - BFG9000', + 'The Spirit World (MAP28) - Backpack', + 'The Spirit World (MAP28) - Backpack 2', + 'The Spirit World (MAP28) - Backpack 3', + 'The Spirit World (MAP28) - Backpack 4', + 'The Spirit World (MAP28) - Berserk', + 'The Spirit World (MAP28) - Chaingun', + 'The Spirit World (MAP28) - Chainsaw', + 'The Spirit World (MAP28) - Exit', + 'The Spirit World (MAP28) - Invulnerability', + 'The Spirit World (MAP28) - Invulnerability 2', + 'The Spirit World (MAP28) - Invulnerability 3', + 'The Spirit World (MAP28) - Invulnerability 4', + 'The Spirit World (MAP28) - Invulnerability 5', + 'The Spirit World (MAP28) - Megasphere', + 'The Spirit World (MAP28) - Megasphere 2', + 'The Spirit World (MAP28) - Plasma gun', + 'The Spirit World (MAP28) - Red skull key', + 'The Spirit World (MAP28) - Rocket launcher', + 'The Spirit World (MAP28) - Super Shotgun', + 'The Spirit World (MAP28) - Supercharge', + 'The Spirit World (MAP28) - Yellow skull key', + }, + 'The Waste Tunnels (MAP05)': { + 'The Waste Tunnels (MAP05) - Armor', + 'The Waste Tunnels (MAP05) - Berserk', + 'The Waste Tunnels (MAP05) - Blue keycard', + 'The Waste Tunnels (MAP05) - Exit', + 'The Waste Tunnels (MAP05) - Mega Armor', + 'The Waste Tunnels (MAP05) - Plasma gun', + 'The Waste Tunnels (MAP05) - Red keycard', + 'The Waste Tunnels (MAP05) - Rocket launcher', + 'The Waste Tunnels (MAP05) - Shotgun', + 'The Waste Tunnels (MAP05) - Super Shotgun', + 'The Waste Tunnels (MAP05) - Supercharge', + 'The Waste Tunnels (MAP05) - Supercharge 2', + 'The Waste Tunnels (MAP05) - Yellow keycard', + }, + 'Tricks and Traps (MAP08)': { + 'Tricks and Traps (MAP08) - Armor', + 'Tricks and Traps (MAP08) - Armor 2', + 'Tricks and Traps (MAP08) - BFG9000', + 'Tricks and Traps (MAP08) - Backpack', + 'Tricks and Traps (MAP08) - Backpack 2', + 'Tricks and Traps (MAP08) - Backpack 3', + 'Tricks and Traps (MAP08) - Backpack 4', + 'Tricks and Traps (MAP08) - Backpack 5', + 'Tricks and Traps (MAP08) - Chaingun', + 'Tricks and Traps (MAP08) - Chainsaw', + 'Tricks and Traps (MAP08) - Exit', + 'Tricks and Traps (MAP08) - Invulnerability', + 'Tricks and Traps (MAP08) - Invulnerability 2', + 'Tricks and Traps (MAP08) - Invulnerability 3', + 'Tricks and Traps (MAP08) - Invulnerability 4', + 'Tricks and Traps (MAP08) - Invulnerability 5', + 'Tricks and Traps (MAP08) - Partial invisibility', + 'Tricks and Traps (MAP08) - Plasma gun', + 'Tricks and Traps (MAP08) - Red skull key', + 'Tricks and Traps (MAP08) - Rocket launcher', + 'Tricks and Traps (MAP08) - Shotgun', + 'Tricks and Traps (MAP08) - Supercharge', + 'Tricks and Traps (MAP08) - Supercharge 2', + 'Tricks and Traps (MAP08) - Yellow skull key', + }, + 'Underhalls (MAP02)': { + 'Underhalls (MAP02) - Blue keycard', + 'Underhalls (MAP02) - Exit', + 'Underhalls (MAP02) - Mega Armor', + 'Underhalls (MAP02) - Red keycard', + 'Underhalls (MAP02) - Super Shotgun', + }, + 'Wolfenstein2 (MAP31)': { + 'Wolfenstein2 (MAP31) - BFG9000', + 'Wolfenstein2 (MAP31) - Backpack', + 'Wolfenstein2 (MAP31) - Backpack 2', + 'Wolfenstein2 (MAP31) - Backpack 3', + 'Wolfenstein2 (MAP31) - Backpack 4', + 'Wolfenstein2 (MAP31) - Berserk', + 'Wolfenstein2 (MAP31) - Chaingun', + 'Wolfenstein2 (MAP31) - Exit', + 'Wolfenstein2 (MAP31) - Megasphere', + 'Wolfenstein2 (MAP31) - Partial invisibility', + 'Wolfenstein2 (MAP31) - Plasma gun', + 'Wolfenstein2 (MAP31) - Rocket launcher', + 'Wolfenstein2 (MAP31) - Shotgun', + 'Wolfenstein2 (MAP31) - Super Shotgun', + 'Wolfenstein2 (MAP31) - Supercharge', + }, +} + + +death_logic_locations = [ + "Entryway (MAP01) - Armor", +] diff --git a/worlds/doom_ii/Maps.py b/worlds/doom_ii/Maps.py new file mode 100644 index 00000000..cf41939f --- /dev/null +++ b/worlds/doom_ii/Maps.py @@ -0,0 +1,39 @@ +# This file is auto generated. More info: https://github.com/Daivuk/apdoom + +from typing import List + + +map_names: List[str] = [ + 'Entryway (MAP01)', + 'Underhalls (MAP02)', + 'The Gantlet (MAP03)', + 'The Focus (MAP04)', + 'The Waste Tunnels (MAP05)', + 'The Crusher (MAP06)', + 'Dead Simple (MAP07)', + 'Tricks and Traps (MAP08)', + 'The Pit (MAP09)', + 'Refueling Base (MAP10)', + 'Circle of Death (MAP11)', + 'The Factory (MAP12)', + 'Downtown (MAP13)', + 'The Inmost Dens (MAP14)', + 'Industrial Zone (MAP15)', + 'Suburbs (MAP16)', + 'Tenements (MAP17)', + 'The Courtyard (MAP18)', + 'The Citadel (MAP19)', + 'Gotcha! (MAP20)', + 'Nirvana (MAP21)', + 'The Catacombs (MAP22)', + 'Barrels o Fun (MAP23)', + 'The Chasm (MAP24)', + 'Bloodfalls (MAP25)', + 'The Abandoned Mines (MAP26)', + 'Monster Condo (MAP27)', + 'The Spirit World (MAP28)', + 'The Living End (MAP29)', + 'Icon of Sin (MAP30)', + 'Wolfenstein2 (MAP31)', + 'Grosse2 (MAP32)', +] diff --git a/worlds/doom_ii/Options.py b/worlds/doom_ii/Options.py new file mode 100644 index 00000000..cc39512a --- /dev/null +++ b/worlds/doom_ii/Options.py @@ -0,0 +1,150 @@ +import typing + +from Options import PerGameCommonOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool +from dataclasses import dataclass + + +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) + random_chaotic: Monsters are completely randomized, but balanced based on existing ratio in the entire game. + """ + display_name = "Random Monsters" + option_vanilla = 0 + option_shuffle = 1 + option_random_balanced = 2 + option_random_chaotic = 3 + default = 2 + + +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 RandomMusic(Choice): + """ + Level musics will be randomized. + vanilla: No randomization + shuffle_selected: Selected episodes' levels will be shuffled + shuffle_game: All the music will be shuffled + """ + display_name = "Random Music" + option_vanilla = 0 + option_shuffle_selected = 1 + option_shuffle_game = 2 + default = 0 + + +class FlipLevels(Choice): + """ + Flip levels on one axis. + vanilla: No flipping + flipped: All levels are flipped + random: Random levels are flipped + """ + display_name = "Flip Levels" + option_vanilla = 0 + option_flipped = 1 + option_randomly_flipped = 2 + default = 0 + + +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 Pro(Toggle): + """Include difficult tricks into rules. Mostly employed by speed runners. + i.e.: Leaps across to a locked area, trigger a switch behind a window at the right angle, etc.""" + display_name = "Pro Doom" + + +class StartWithComputerAreaMaps(Toggle): + """Give the player all Computer Area Map items from the start.""" + display_name = "Start With Computer Area Maps" + + +class ResetLevelOnDeath(DefaultOnToggle): + """When dying, levels are reset and monsters respawned. But inventory and checks are kept. + Turning this setting off is considered easy mode. Good for new players that don't know the levels well.""" + display_message="Reset level on death" + + +class Episode1(DefaultOnToggle): + """Subterranean and Outpost. + If none of the episodes are chosen, Episode 1 will be chosen by default.""" + display_name = "Episode 1" + + +class Episode2(DefaultOnToggle): + """City. + If none of the episodes are chosen, Episode 1 will be chosen by default.""" + display_name = "Episode 2" + + +class Episode3(DefaultOnToggle): + """Hell. + If none of the episodes are chosen, Episode 1 will be chosen by default.""" + display_name = "Episode 3" + + +class SecretLevels(Toggle): + """Secret levels. + This is too short to be an episode. It's additive. + Another episode will have to be selected along with this one. + Otherwise episode 1 will be added.""" + display_name = "Secret Levels" + + +@dataclass +class DOOM2Options(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool + difficulty: Difficulty + random_monsters: RandomMonsters + random_pickups: RandomPickups + random_music: RandomMusic + flip_levels: FlipLevels + allow_death_logic: AllowDeathLogic + pro: Pro + start_with_computer_area_maps: StartWithComputerAreaMaps + death_link: DeathLink + reset_level_on_death: ResetLevelOnDeath + episode1: Episode1 + episode2: Episode2 + episode3: Episode3 + episode4: SecretLevels diff --git a/worlds/doom_ii/Regions.py b/worlds/doom_ii/Regions.py new file mode 100644 index 00000000..3d81d7ab --- /dev/null +++ b/worlds/doom_ii/Regions.py @@ -0,0 +1,502 @@ +# This file is auto generated. More info: https://github.com/Daivuk/apdoom + +from typing import List +from BaseClasses import TypedDict + +class ConnectionDict(TypedDict, total=False): + target: str + pro: bool + +class RegionDict(TypedDict, total=False): + name: str + connects_to_hub: bool + episode: int + connections: List[ConnectionDict] + + +regions:List[RegionDict] = [ + # Entryway (MAP01) + {"name":"Entryway (MAP01) Main", + "connects_to_hub":True, + "episode":1, + "connections":[]}, + + # Underhalls (MAP02) + {"name":"Underhalls (MAP02) Main", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"Underhalls (MAP02) Red","pro":False}]}, + {"name":"Underhalls (MAP02) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Underhalls (MAP02) Red","pro":False}]}, + {"name":"Underhalls (MAP02) Red", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"Underhalls (MAP02) Blue","pro":False}, + {"target":"Underhalls (MAP02) Main","pro":False}]}, + + # The Gantlet (MAP03) + {"name":"The Gantlet (MAP03) Main", + "connects_to_hub":True, + "episode":1, + "connections":[ + {"target":"The Gantlet (MAP03) Blue","pro":False}, + {"target":"The Gantlet (MAP03) Blue Pro Jump","pro":True}]}, + {"name":"The Gantlet (MAP03) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"The Gantlet (MAP03) Main","pro":False}, + {"target":"The Gantlet (MAP03) Red","pro":False}, + {"target":"The Gantlet (MAP03) Blue Pro Jump","pro":False}]}, + {"name":"The Gantlet (MAP03) Red", + "connects_to_hub":False, + "episode":1, + "connections":[]}, + {"name":"The Gantlet (MAP03) Blue Pro Jump", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Gantlet (MAP03) Blue","pro":False}]}, + + # The Focus (MAP04) + {"name":"The Focus (MAP04) Main", + "connects_to_hub":True, + "episode":1, + "connections":[ + {"target":"The Focus (MAP04) Red","pro":False}, + {"target":"The Focus (MAP04) Blue","pro":False}]}, + {"name":"The Focus (MAP04) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Focus (MAP04) Main","pro":False}]}, + {"name":"The Focus (MAP04) Yellow", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Focus (MAP04) Red","pro":False}]}, + {"name":"The Focus (MAP04) Red", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"The Focus (MAP04) Yellow","pro":False}, + {"target":"The Focus (MAP04) Main","pro":False}]}, + + # The Waste Tunnels (MAP05) + {"name":"The Waste Tunnels (MAP05) Main", + "connects_to_hub":True, + "episode":1, + "connections":[ + {"target":"The Waste Tunnels (MAP05) Red","pro":False}, + {"target":"The Waste Tunnels (MAP05) Blue","pro":False}]}, + {"name":"The Waste Tunnels (MAP05) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"The Waste Tunnels (MAP05) Yellow","pro":False}, + {"target":"The Waste Tunnels (MAP05) Main","pro":False}]}, + {"name":"The Waste Tunnels (MAP05) Yellow", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Waste Tunnels (MAP05) Blue","pro":False}]}, + {"name":"The Waste Tunnels (MAP05) Red", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Waste Tunnels (MAP05) Main","pro":False}]}, + + # The Crusher (MAP06) + {"name":"The Crusher (MAP06) Main", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"The Crusher (MAP06) Blue","pro":False}]}, + {"name":"The Crusher (MAP06) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"The Crusher (MAP06) Red","pro":False}, + {"target":"The Crusher (MAP06) Main","pro":False}]}, + {"name":"The Crusher (MAP06) Yellow", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Crusher (MAP06) Red","pro":False}]}, + {"name":"The Crusher (MAP06) Red", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"The Crusher (MAP06) Yellow","pro":False}, + {"target":"The Crusher (MAP06) Blue","pro":False}, + {"target":"The Crusher (MAP06) Main","pro":False}]}, + + # Dead Simple (MAP07) + {"name":"Dead Simple (MAP07) Main", + "connects_to_hub":True, + "episode":1, + "connections":[]}, + + # Tricks and Traps (MAP08) + {"name":"Tricks and Traps (MAP08) Main", + "connects_to_hub":True, + "episode":1, + "connections":[ + {"target":"Tricks and Traps (MAP08) Red","pro":False}, + {"target":"Tricks and Traps (MAP08) Yellow","pro":False}]}, + {"name":"Tricks and Traps (MAP08) Yellow", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Tricks and Traps (MAP08) Main","pro":False}]}, + {"name":"Tricks and Traps (MAP08) Red", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Tricks and Traps (MAP08) Main","pro":False}]}, + + # The Pit (MAP09) + {"name":"The Pit (MAP09) Main", + "connects_to_hub":True, + "episode":1, + "connections":[ + {"target":"The Pit (MAP09) Yellow","pro":False}, + {"target":"The Pit (MAP09) Blue","pro":False}]}, + {"name":"The Pit (MAP09) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[]}, + {"name":"The Pit (MAP09) Yellow", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"The Pit (MAP09) Main","pro":False}]}, + + # Refueling Base (MAP10) + {"name":"Refueling Base (MAP10) Main", + "connects_to_hub":True, + "episode":1, + "connections":[{"target":"Refueling Base (MAP10) Yellow","pro":False}]}, + {"name":"Refueling Base (MAP10) Yellow", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"Refueling Base (MAP10) Main","pro":False}, + {"target":"Refueling Base (MAP10) Yellow Blue","pro":False}]}, + {"name":"Refueling Base (MAP10) Yellow Blue", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Refueling Base (MAP10) Yellow","pro":False}]}, + + # Circle of Death (MAP11) + {"name":"Circle of Death (MAP11) Main", + "connects_to_hub":True, + "episode":1, + "connections":[ + {"target":"Circle of Death (MAP11) Blue","pro":False}, + {"target":"Circle of Death (MAP11) Red","pro":False}]}, + {"name":"Circle of Death (MAP11) Blue", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Circle of Death (MAP11) Main","pro":False}]}, + {"name":"Circle of Death (MAP11) Red", + "connects_to_hub":False, + "episode":1, + "connections":[{"target":"Circle of Death (MAP11) Main","pro":False}]}, + + # The Factory (MAP12) + {"name":"The Factory (MAP12) Main", + "connects_to_hub":True, + "episode":2, + "connections":[ + {"target":"The Factory (MAP12) Yellow","pro":False}, + {"target":"The Factory (MAP12) Blue","pro":False}]}, + {"name":"The Factory (MAP12) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"The Factory (MAP12) Main","pro":False}]}, + {"name":"The Factory (MAP12) Yellow", + "connects_to_hub":False, + "episode":2, + "connections":[]}, + + # Downtown (MAP13) + {"name":"Downtown (MAP13) Main", + "connects_to_hub":True, + "episode":2, + "connections":[ + {"target":"Downtown (MAP13) Yellow","pro":False}, + {"target":"Downtown (MAP13) Red","pro":False}, + {"target":"Downtown (MAP13) Blue","pro":False}]}, + {"name":"Downtown (MAP13) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Downtown (MAP13) Main","pro":False}]}, + {"name":"Downtown (MAP13) Yellow", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Downtown (MAP13) Main","pro":False}]}, + {"name":"Downtown (MAP13) Red", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Downtown (MAP13) Main","pro":False}]}, + + # The Inmost Dens (MAP14) + {"name":"The Inmost Dens (MAP14) Main", + "connects_to_hub":True, + "episode":2, + "connections":[{"target":"The Inmost Dens (MAP14) Red","pro":False}]}, + {"name":"The Inmost Dens (MAP14) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"The Inmost Dens (MAP14) Main","pro":False}, + {"target":"The Inmost Dens (MAP14) Red East","pro":False}]}, + {"name":"The Inmost Dens (MAP14) Red", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"The Inmost Dens (MAP14) Main","pro":False}, + {"target":"The Inmost Dens (MAP14) Red South","pro":False}, + {"target":"The Inmost Dens (MAP14) Red East","pro":False}]}, + {"name":"The Inmost Dens (MAP14) Red East", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"The Inmost Dens (MAP14) Blue","pro":False}, + {"target":"The Inmost Dens (MAP14) Main","pro":False}]}, + {"name":"The Inmost Dens (MAP14) Red South", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"The Inmost Dens (MAP14) Main","pro":False}]}, + + # Industrial Zone (MAP15) + {"name":"Industrial Zone (MAP15) Main", + "connects_to_hub":True, + "episode":2, + "connections":[ + {"target":"Industrial Zone (MAP15) Yellow East","pro":False}, + {"target":"Industrial Zone (MAP15) Yellow West","pro":False}]}, + {"name":"Industrial Zone (MAP15) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Industrial Zone (MAP15) Yellow East","pro":False}]}, + {"name":"Industrial Zone (MAP15) Yellow East", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"Industrial Zone (MAP15) Blue","pro":False}, + {"target":"Industrial Zone (MAP15) Main","pro":False}]}, + {"name":"Industrial Zone (MAP15) Yellow West", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Industrial Zone (MAP15) Main","pro":False}]}, + + # Suburbs (MAP16) + {"name":"Suburbs (MAP16) Main", + "connects_to_hub":True, + "episode":2, + "connections":[ + {"target":"Suburbs (MAP16) Red","pro":False}, + {"target":"Suburbs (MAP16) Blue","pro":False}]}, + {"name":"Suburbs (MAP16) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Suburbs (MAP16) Main","pro":False}]}, + {"name":"Suburbs (MAP16) Red", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Suburbs (MAP16) Main","pro":False}]}, + + # Tenements (MAP17) + {"name":"Tenements (MAP17) Main", + "connects_to_hub":True, + "episode":2, + "connections":[{"target":"Tenements (MAP17) Red","pro":False}]}, + {"name":"Tenements (MAP17) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"Tenements (MAP17) Red","pro":False}]}, + {"name":"Tenements (MAP17) Yellow", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"Tenements (MAP17) Red","pro":False}, + {"target":"Tenements (MAP17) Blue","pro":False}]}, + {"name":"Tenements (MAP17) Red", + "connects_to_hub":False, + "episode":2, + "connections":[ + {"target":"Tenements (MAP17) Yellow","pro":False}, + {"target":"Tenements (MAP17) Blue","pro":False}, + {"target":"Tenements (MAP17) Main","pro":False}]}, + + # The Courtyard (MAP18) + {"name":"The Courtyard (MAP18) Main", + "connects_to_hub":True, + "episode":2, + "connections":[ + {"target":"The Courtyard (MAP18) Yellow","pro":False}, + {"target":"The Courtyard (MAP18) Blue","pro":False}]}, + {"name":"The Courtyard (MAP18) Blue", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"The Courtyard (MAP18) Main","pro":False}]}, + {"name":"The Courtyard (MAP18) Yellow", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"The Courtyard (MAP18) Main","pro":False}]}, + + # The Citadel (MAP19) + {"name":"The Citadel (MAP19) Main", + "connects_to_hub":True, + "episode":2, + "connections":[{"target":"The Citadel (MAP19) Red","pro":False}]}, + {"name":"The Citadel (MAP19) Red", + "connects_to_hub":False, + "episode":2, + "connections":[{"target":"The Citadel (MAP19) Main","pro":False}]}, + + # Gotcha! (MAP20) + {"name":"Gotcha! (MAP20) Main", + "connects_to_hub":True, + "episode":2, + "connections":[]}, + + # Nirvana (MAP21) + {"name":"Nirvana (MAP21) Main", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"Nirvana (MAP21) Yellow","pro":False}]}, + {"name":"Nirvana (MAP21) Yellow", + "connects_to_hub":False, + "episode":3, + "connections":[ + {"target":"Nirvana (MAP21) Main","pro":False}, + {"target":"Nirvana (MAP21) Magenta","pro":False}]}, + {"name":"Nirvana (MAP21) Magenta", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Nirvana (MAP21) Yellow","pro":False}]}, + + # The Catacombs (MAP22) + {"name":"The Catacombs (MAP22) Main", + "connects_to_hub":True, + "episode":3, + "connections":[ + {"target":"The Catacombs (MAP22) Blue","pro":False}, + {"target":"The Catacombs (MAP22) Red","pro":False}]}, + {"name":"The Catacombs (MAP22) Blue", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Catacombs (MAP22) Main","pro":False}]}, + {"name":"The Catacombs (MAP22) Red", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Catacombs (MAP22) Main","pro":False}]}, + + # Barrels o Fun (MAP23) + {"name":"Barrels o Fun (MAP23) Main", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"Barrels o Fun (MAP23) Yellow","pro":False}]}, + {"name":"Barrels o Fun (MAP23) Yellow", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Barrels o Fun (MAP23) Main","pro":False}]}, + + # The Chasm (MAP24) + {"name":"The Chasm (MAP24) Main", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"The Chasm (MAP24) Red","pro":False}]}, + {"name":"The Chasm (MAP24) Red", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Chasm (MAP24) Main","pro":False}]}, + + # Bloodfalls (MAP25) + {"name":"Bloodfalls (MAP25) Main", + "connects_to_hub":True, + "episode":3, + "connections":[{"target":"Bloodfalls (MAP25) Blue","pro":False}]}, + {"name":"Bloodfalls (MAP25) Blue", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Bloodfalls (MAP25) Main","pro":False}]}, + + # The Abandoned Mines (MAP26) + {"name":"The Abandoned Mines (MAP26) Main", + "connects_to_hub":True, + "episode":3, + "connections":[ + {"target":"The Abandoned Mines (MAP26) Yellow","pro":False}, + {"target":"The Abandoned Mines (MAP26) Red","pro":False}, + {"target":"The Abandoned Mines (MAP26) Blue","pro":False}]}, + {"name":"The Abandoned Mines (MAP26) Blue", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Abandoned Mines (MAP26) Main","pro":False}]}, + {"name":"The Abandoned Mines (MAP26) Yellow", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Abandoned Mines (MAP26) Main","pro":False}]}, + {"name":"The Abandoned Mines (MAP26) Red", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Abandoned Mines (MAP26) Main","pro":False}]}, + + # Monster Condo (MAP27) + {"name":"Monster Condo (MAP27) Main", + "connects_to_hub":True, + "episode":3, + "connections":[ + {"target":"Monster Condo (MAP27) Yellow","pro":False}, + {"target":"Monster Condo (MAP27) Red","pro":False}, + {"target":"Monster Condo (MAP27) Blue","pro":False}]}, + {"name":"Monster Condo (MAP27) Blue", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Monster Condo (MAP27) Main","pro":False}]}, + {"name":"Monster Condo (MAP27) Yellow", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Monster Condo (MAP27) Main","pro":False}]}, + {"name":"Monster Condo (MAP27) Red", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"Monster Condo (MAP27) Main","pro":False}]}, + + # The Spirit World (MAP28) + {"name":"The Spirit World (MAP28) Main", + "connects_to_hub":True, + "episode":3, + "connections":[ + {"target":"The Spirit World (MAP28) Yellow","pro":False}, + {"target":"The Spirit World (MAP28) Red","pro":False}]}, + {"name":"The Spirit World (MAP28) Yellow", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Spirit World (MAP28) Main","pro":False}]}, + {"name":"The Spirit World (MAP28) Red", + "connects_to_hub":False, + "episode":3, + "connections":[{"target":"The Spirit World (MAP28) Main","pro":False}]}, + + # The Living End (MAP29) + {"name":"The Living End (MAP29) Main", + "connects_to_hub":True, + "episode":3, + "connections":[]}, + + # Icon of Sin (MAP30) + {"name":"Icon of Sin (MAP30) Main", + "connects_to_hub":True, + "episode":3, + "connections":[]}, + + # Wolfenstein2 (MAP31) + {"name":"Wolfenstein2 (MAP31) Main", + "connects_to_hub":True, + "episode":4, + "connections":[]}, + + # Grosse2 (MAP32) + {"name":"Grosse2 (MAP32) Main", + "connects_to_hub":True, + "episode":4, + "connections":[]}, +] diff --git a/worlds/doom_ii/Rules.py b/worlds/doom_ii/Rules.py new file mode 100644 index 00000000..89f3a10f --- /dev/null +++ b/worlds/doom_ii/Rules.py @@ -0,0 +1,501 @@ +# 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 DOOM2World + + +def set_episode1_rules(player, world, pro): + # Entryway (MAP01) + set_rule(world.get_entrance("Hub -> Entryway (MAP01) Main", player), lambda state: + state.has("Entryway (MAP01)", player, 1)) + set_rule(world.get_entrance("Hub -> Entryway (MAP01) Main", player), lambda state: + state.has("Entryway (MAP01)", player, 1)) + + # Underhalls (MAP02) + set_rule(world.get_entrance("Hub -> Underhalls (MAP02) Main", player), lambda state: + state.has("Underhalls (MAP02)", player, 1)) + set_rule(world.get_entrance("Hub -> Underhalls (MAP02) Main", player), lambda state: + state.has("Underhalls (MAP02)", player, 1)) + set_rule(world.get_entrance("Hub -> Underhalls (MAP02) Main", player), lambda state: + state.has("Underhalls (MAP02)", player, 1)) + set_rule(world.get_entrance("Underhalls (MAP02) Main -> Underhalls (MAP02) Red", player), lambda state: + state.has("Underhalls (MAP02) - Red keycard", player, 1)) + set_rule(world.get_entrance("Underhalls (MAP02) Blue -> Underhalls (MAP02) Red", player), lambda state: + state.has("Underhalls (MAP02) - Blue keycard", player, 1)) + set_rule(world.get_entrance("Underhalls (MAP02) Red -> Underhalls (MAP02) Blue", player), lambda state: + state.has("Underhalls (MAP02) - Blue keycard", player, 1)) + + # The Gantlet (MAP03) + set_rule(world.get_entrance("Hub -> The Gantlet (MAP03) Main", player), lambda state: + (state.has("The Gantlet (MAP03)", player, 1)) and + (state.has("Shotgun", player, 1) or + state.has("Chaingun", player, 1) or + state.has("Super Shotgun", player, 1))) + set_rule(world.get_entrance("The Gantlet (MAP03) Main -> The Gantlet (MAP03) Blue", player), lambda state: + state.has("The Gantlet (MAP03) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Gantlet (MAP03) Blue -> The Gantlet (MAP03) Red", player), lambda state: + state.has("The Gantlet (MAP03) - Red keycard", player, 1)) + + # The Focus (MAP04) + set_rule(world.get_entrance("Hub -> The Focus (MAP04) Main", player), lambda state: + (state.has("The Focus (MAP04)", player, 1)) and + (state.has("Shotgun", player, 1) or + state.has("Chaingun", player, 1) or + state.has("Super Shotgun", player, 1))) + set_rule(world.get_entrance("The Focus (MAP04) Main -> The Focus (MAP04) Red", player), lambda state: + state.has("The Focus (MAP04) - Red keycard", player, 1)) + set_rule(world.get_entrance("The Focus (MAP04) Main -> The Focus (MAP04) Blue", player), lambda state: + state.has("The Focus (MAP04) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Focus (MAP04) Yellow -> The Focus (MAP04) Red", player), lambda state: + state.has("The Focus (MAP04) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Focus (MAP04) Red -> The Focus (MAP04) Yellow", player), lambda state: + state.has("The Focus (MAP04) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Focus (MAP04) Red -> The Focus (MAP04) Main", player), lambda state: + state.has("The Focus (MAP04) - Red keycard", player, 1)) + + # The Waste Tunnels (MAP05) + set_rule(world.get_entrance("Hub -> The Waste Tunnels (MAP05) Main", player), lambda state: + (state.has("The Waste Tunnels (MAP05)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Waste Tunnels (MAP05) Main -> The Waste Tunnels (MAP05) Red", player), lambda state: + state.has("The Waste Tunnels (MAP05) - Red keycard", player, 1)) + set_rule(world.get_entrance("The Waste Tunnels (MAP05) Main -> The Waste Tunnels (MAP05) Blue", player), lambda state: + state.has("The Waste Tunnels (MAP05) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Waste Tunnels (MAP05) Blue -> The Waste Tunnels (MAP05) Yellow", player), lambda state: + state.has("The Waste Tunnels (MAP05) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Waste Tunnels (MAP05) Blue -> The Waste Tunnels (MAP05) Main", player), lambda state: + state.has("The Waste Tunnels (MAP05) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Waste Tunnels (MAP05) Yellow -> The Waste Tunnels (MAP05) Blue", player), lambda state: + state.has("The Waste Tunnels (MAP05) - Yellow keycard", player, 1)) + + # The Crusher (MAP06) + set_rule(world.get_entrance("Hub -> The Crusher (MAP06) Main", player), lambda state: + (state.has("The Crusher (MAP06)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Crusher (MAP06) Main -> The Crusher (MAP06) Blue", player), lambda state: + state.has("The Crusher (MAP06) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Crusher (MAP06) Blue -> The Crusher (MAP06) Red", player), lambda state: + state.has("The Crusher (MAP06) - Red keycard", player, 1)) + set_rule(world.get_entrance("The Crusher (MAP06) Blue -> The Crusher (MAP06) Main", player), lambda state: + state.has("The Crusher (MAP06) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Crusher (MAP06) Yellow -> The Crusher (MAP06) Red", player), lambda state: + state.has("The Crusher (MAP06) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Crusher (MAP06) Red -> The Crusher (MAP06) Yellow", player), lambda state: + state.has("The Crusher (MAP06) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Crusher (MAP06) Red -> The Crusher (MAP06) Blue", player), lambda state: + state.has("The Crusher (MAP06) - Red keycard", player, 1)) + + # Dead Simple (MAP07) + set_rule(world.get_entrance("Hub -> Dead Simple (MAP07) Main", player), lambda state: + (state.has("Dead Simple (MAP07)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + + # Tricks and Traps (MAP08) + set_rule(world.get_entrance("Hub -> Tricks and Traps (MAP08) Main", player), lambda state: + (state.has("Tricks and Traps (MAP08)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Tricks and Traps (MAP08) Main -> Tricks and Traps (MAP08) Red", player), lambda state: + state.has("Tricks and Traps (MAP08) - Red skull key", player, 1)) + set_rule(world.get_entrance("Tricks and Traps (MAP08) Main -> Tricks and Traps (MAP08) Yellow", player), lambda state: + state.has("Tricks and Traps (MAP08) - Yellow skull key", player, 1)) + + # The Pit (MAP09) + set_rule(world.get_entrance("Hub -> The Pit (MAP09) Main", player), lambda state: + (state.has("The Pit (MAP09)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Pit (MAP09) Main -> The Pit (MAP09) Yellow", player), lambda state: + state.has("The Pit (MAP09) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Pit (MAP09) Main -> The Pit (MAP09) Blue", player), lambda state: + state.has("The Pit (MAP09) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Pit (MAP09) Yellow -> The Pit (MAP09) Main", player), lambda state: + state.has("The Pit (MAP09) - Yellow keycard", player, 1)) + + # Refueling Base (MAP10) + set_rule(world.get_entrance("Hub -> Refueling Base (MAP10) Main", player), lambda state: + (state.has("Refueling Base (MAP10)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Refueling Base (MAP10) Main -> Refueling Base (MAP10) Yellow", player), lambda state: + state.has("Refueling Base (MAP10) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("Refueling Base (MAP10) Yellow -> Refueling Base (MAP10) Yellow Blue", player), lambda state: + state.has("Refueling Base (MAP10) - Blue keycard", player, 1)) + + # Circle of Death (MAP11) + set_rule(world.get_entrance("Hub -> Circle of Death (MAP11) Main", player), lambda state: + (state.has("Circle of Death (MAP11)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Circle of Death (MAP11) Main -> Circle of Death (MAP11) Blue", player), lambda state: + state.has("Circle of Death (MAP11) - Blue keycard", player, 1)) + set_rule(world.get_entrance("Circle of Death (MAP11) Main -> Circle of Death (MAP11) Red", player), lambda state: + state.has("Circle of Death (MAP11) - Red keycard", player, 1)) + + +def set_episode2_rules(player, world, pro): + # The Factory (MAP12) + set_rule(world.get_entrance("Hub -> The Factory (MAP12) Main", player), lambda state: + (state.has("The Factory (MAP12)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Factory (MAP12) Main -> The Factory (MAP12) Yellow", player), lambda state: + state.has("The Factory (MAP12) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Factory (MAP12) Main -> The Factory (MAP12) Blue", player), lambda state: + state.has("The Factory (MAP12) - Blue keycard", player, 1)) + + # Downtown (MAP13) + set_rule(world.get_entrance("Hub -> Downtown (MAP13) Main", player), lambda state: + (state.has("Downtown (MAP13)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Downtown (MAP13) Main -> Downtown (MAP13) Yellow", player), lambda state: + state.has("Downtown (MAP13) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("Downtown (MAP13) Main -> Downtown (MAP13) Red", player), lambda state: + state.has("Downtown (MAP13) - Red keycard", player, 1)) + set_rule(world.get_entrance("Downtown (MAP13) Main -> Downtown (MAP13) Blue", player), lambda state: + state.has("Downtown (MAP13) - Blue keycard", player, 1)) + + # The Inmost Dens (MAP14) + set_rule(world.get_entrance("Hub -> The Inmost Dens (MAP14) Main", player), lambda state: + (state.has("The Inmost Dens (MAP14)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Inmost Dens (MAP14) Main -> The Inmost Dens (MAP14) Red", player), lambda state: + state.has("The Inmost Dens (MAP14) - Red skull key", player, 1)) + set_rule(world.get_entrance("The Inmost Dens (MAP14) Blue -> The Inmost Dens (MAP14) Red East", player), lambda state: + state.has("The Inmost Dens (MAP14) - Blue skull key", player, 1)) + set_rule(world.get_entrance("The Inmost Dens (MAP14) Red -> The Inmost Dens (MAP14) Main", player), lambda state: + state.has("The Inmost Dens (MAP14) - Red skull key", player, 1)) + set_rule(world.get_entrance("The Inmost Dens (MAP14) Red East -> The Inmost Dens (MAP14) Blue", player), lambda state: + state.has("The Inmost Dens (MAP14) - Blue skull key", player, 1)) + + # Industrial Zone (MAP15) + set_rule(world.get_entrance("Hub -> Industrial Zone (MAP15) Main", player), lambda state: + (state.has("Industrial Zone (MAP15)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Industrial Zone (MAP15) Main -> Industrial Zone (MAP15) Yellow East", player), lambda state: + state.has("Industrial Zone (MAP15) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("Industrial Zone (MAP15) Main -> Industrial Zone (MAP15) Yellow West", player), lambda state: + state.has("Industrial Zone (MAP15) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("Industrial Zone (MAP15) Blue -> Industrial Zone (MAP15) Yellow East", player), lambda state: + state.has("Industrial Zone (MAP15) - Blue keycard", player, 1)) + set_rule(world.get_entrance("Industrial Zone (MAP15) Yellow East -> Industrial Zone (MAP15) Blue", player), lambda state: + state.has("Industrial Zone (MAP15) - Blue keycard", player, 1)) + + # Suburbs (MAP16) + set_rule(world.get_entrance("Hub -> Suburbs (MAP16) Main", player), lambda state: + (state.has("Suburbs (MAP16)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Suburbs (MAP16) Main -> Suburbs (MAP16) Red", player), lambda state: + state.has("Suburbs (MAP16) - Red skull key", player, 1)) + set_rule(world.get_entrance("Suburbs (MAP16) Main -> Suburbs (MAP16) Blue", player), lambda state: + state.has("Suburbs (MAP16) - Blue skull key", player, 1)) + + # Tenements (MAP17) + set_rule(world.get_entrance("Hub -> Tenements (MAP17) Main", player), lambda state: + (state.has("Tenements (MAP17)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Tenements (MAP17) Main -> Tenements (MAP17) Red", player), lambda state: + state.has("Tenements (MAP17) - Red keycard", player, 1)) + set_rule(world.get_entrance("Tenements (MAP17) Red -> Tenements (MAP17) Yellow", player), lambda state: + state.has("Tenements (MAP17) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("Tenements (MAP17) Red -> Tenements (MAP17) Blue", player), lambda state: + state.has("Tenements (MAP17) - Blue keycard", player, 1)) + + # The Courtyard (MAP18) + set_rule(world.get_entrance("Hub -> The Courtyard (MAP18) Main", player), lambda state: + (state.has("The Courtyard (MAP18)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Courtyard (MAP18) Main -> The Courtyard (MAP18) Yellow", player), lambda state: + state.has("The Courtyard (MAP18) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("The Courtyard (MAP18) Main -> The Courtyard (MAP18) Blue", player), lambda state: + state.has("The Courtyard (MAP18) - Blue skull key", player, 1)) + set_rule(world.get_entrance("The Courtyard (MAP18) Blue -> The Courtyard (MAP18) Main", player), lambda state: + state.has("The Courtyard (MAP18) - Blue skull key", player, 1)) + set_rule(world.get_entrance("The Courtyard (MAP18) Yellow -> The Courtyard (MAP18) Main", player), lambda state: + state.has("The Courtyard (MAP18) - Yellow skull key", player, 1)) + + # The Citadel (MAP19) + set_rule(world.get_entrance("Hub -> The Citadel (MAP19) Main", player), lambda state: + (state.has("The Citadel (MAP19)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("The Citadel (MAP19) Main -> The Citadel (MAP19) Red", player), lambda state: + (state.has("The Citadel (MAP19) - Red skull key", player, 1)) and (state.has("The Citadel (MAP19) - Blue skull key", player, 1) or + state.has("The Citadel (MAP19) - Yellow skull key", player, 1))) + set_rule(world.get_entrance("The Citadel (MAP19) Red -> The Citadel (MAP19) Main", player), lambda state: + (state.has("The Citadel (MAP19) - Red skull key", player, 1)) and (state.has("The Citadel (MAP19) - Yellow skull key", player, 1) or + state.has("The Citadel (MAP19) - Blue skull key", player, 1))) + + # Gotcha! (MAP20) + set_rule(world.get_entrance("Hub -> Gotcha! (MAP20) Main", player), lambda state: + (state.has("Gotcha! (MAP20)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + + +def set_episode3_rules(player, world, pro): + # Nirvana (MAP21) + set_rule(world.get_entrance("Hub -> Nirvana (MAP21) Main", player), lambda state: + (state.has("Nirvana (MAP21)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Nirvana (MAP21) Main -> Nirvana (MAP21) Yellow", player), lambda state: + state.has("Nirvana (MAP21) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("Nirvana (MAP21) Yellow -> Nirvana (MAP21) Main", player), lambda state: + state.has("Nirvana (MAP21) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("Nirvana (MAP21) Yellow -> Nirvana (MAP21) Magenta", player), lambda state: + state.has("Nirvana (MAP21) - Red skull key", player, 1) and + state.has("Nirvana (MAP21) - Blue skull key", player, 1)) + set_rule(world.get_entrance("Nirvana (MAP21) Magenta -> Nirvana (MAP21) Yellow", player), lambda state: + state.has("Nirvana (MAP21) - Red skull key", player, 1) and + state.has("Nirvana (MAP21) - Blue skull key", player, 1)) + + # The Catacombs (MAP22) + set_rule(world.get_entrance("Hub -> The Catacombs (MAP22) Main", player), lambda state: + (state.has("The Catacombs (MAP22)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("BFG9000", player, 1) or + state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1))) + set_rule(world.get_entrance("The Catacombs (MAP22) Main -> The Catacombs (MAP22) Blue", player), lambda state: + state.has("The Catacombs (MAP22) - Blue skull key", player, 1)) + set_rule(world.get_entrance("The Catacombs (MAP22) Main -> The Catacombs (MAP22) Red", player), lambda state: + state.has("The Catacombs (MAP22) - Red skull key", player, 1)) + set_rule(world.get_entrance("The Catacombs (MAP22) Red -> The Catacombs (MAP22) Main", player), lambda state: + state.has("The Catacombs (MAP22) - Red skull key", player, 1)) + + # Barrels o Fun (MAP23) + set_rule(world.get_entrance("Hub -> Barrels o Fun (MAP23) Main", player), lambda state: + (state.has("Barrels o Fun (MAP23)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + set_rule(world.get_entrance("Barrels o Fun (MAP23) Main -> Barrels o Fun (MAP23) Yellow", player), lambda state: + state.has("Barrels o Fun (MAP23) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("Barrels o Fun (MAP23) Yellow -> Barrels o Fun (MAP23) Main", player), lambda state: + state.has("Barrels o Fun (MAP23) - Yellow skull key", player, 1)) + + # The Chasm (MAP24) + set_rule(world.get_entrance("Hub -> The Chasm (MAP24) Main", player), lambda state: + state.has("The Chasm (MAP24)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Super Shotgun", player, 1)) + set_rule(world.get_entrance("The Chasm (MAP24) Main -> The Chasm (MAP24) Red", player), lambda state: + state.has("The Chasm (MAP24) - Red keycard", player, 1)) + set_rule(world.get_entrance("The Chasm (MAP24) Red -> The Chasm (MAP24) Main", player), lambda state: + state.has("The Chasm (MAP24) - Red keycard", player, 1)) + + # Bloodfalls (MAP25) + set_rule(world.get_entrance("Hub -> Bloodfalls (MAP25) Main", player), lambda state: + state.has("Bloodfalls (MAP25)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Super Shotgun", player, 1)) + set_rule(world.get_entrance("Bloodfalls (MAP25) Main -> Bloodfalls (MAP25) Blue", player), lambda state: + state.has("Bloodfalls (MAP25) - Blue skull key", player, 1)) + set_rule(world.get_entrance("Bloodfalls (MAP25) Blue -> Bloodfalls (MAP25) Main", player), lambda state: + state.has("Bloodfalls (MAP25) - Blue skull key", player, 1)) + + # The Abandoned Mines (MAP26) + set_rule(world.get_entrance("Hub -> The Abandoned Mines (MAP26) Main", player), lambda state: + state.has("The Abandoned Mines (MAP26)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("Super Shotgun", player, 1)) + set_rule(world.get_entrance("The Abandoned Mines (MAP26) Main -> The Abandoned Mines (MAP26) Yellow", player), lambda state: + state.has("The Abandoned Mines (MAP26) - Yellow keycard", player, 1)) + set_rule(world.get_entrance("The Abandoned Mines (MAP26) Main -> The Abandoned Mines (MAP26) Red", player), lambda state: + state.has("The Abandoned Mines (MAP26) - Red keycard", player, 1)) + set_rule(world.get_entrance("The Abandoned Mines (MAP26) Main -> The Abandoned Mines (MAP26) Blue", player), lambda state: + state.has("The Abandoned Mines (MAP26) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Abandoned Mines (MAP26) Blue -> The Abandoned Mines (MAP26) Main", player), lambda state: + state.has("The Abandoned Mines (MAP26) - Blue keycard", player, 1)) + set_rule(world.get_entrance("The Abandoned Mines (MAP26) Yellow -> The Abandoned Mines (MAP26) Main", player), lambda state: + state.has("The Abandoned Mines (MAP26) - Yellow keycard", player, 1)) + + # Monster Condo (MAP27) + set_rule(world.get_entrance("Hub -> Monster Condo (MAP27) Main", player), lambda state: + state.has("Monster Condo (MAP27)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Super Shotgun", player, 1)) + set_rule(world.get_entrance("Monster Condo (MAP27) Main -> Monster Condo (MAP27) Yellow", player), lambda state: + state.has("Monster Condo (MAP27) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("Monster Condo (MAP27) Main -> Monster Condo (MAP27) Red", player), lambda state: + state.has("Monster Condo (MAP27) - Red skull key", player, 1)) + set_rule(world.get_entrance("Monster Condo (MAP27) Main -> Monster Condo (MAP27) Blue", player), lambda state: + state.has("Monster Condo (MAP27) - Blue skull key", player, 1)) + set_rule(world.get_entrance("Monster Condo (MAP27) Red -> Monster Condo (MAP27) Main", player), lambda state: + state.has("Monster Condo (MAP27) - Red skull key", player, 1)) + + # The Spirit World (MAP28) + set_rule(world.get_entrance("Hub -> The Spirit World (MAP28) Main", player), lambda state: + state.has("The Spirit World (MAP28)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Super Shotgun", player, 1)) + set_rule(world.get_entrance("The Spirit World (MAP28) Main -> The Spirit World (MAP28) Yellow", player), lambda state: + state.has("The Spirit World (MAP28) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("The Spirit World (MAP28) Main -> The Spirit World (MAP28) Red", player), lambda state: + state.has("The Spirit World (MAP28) - Red skull key", player, 1)) + set_rule(world.get_entrance("The Spirit World (MAP28) Yellow -> The Spirit World (MAP28) Main", player), lambda state: + state.has("The Spirit World (MAP28) - Yellow skull key", player, 1)) + set_rule(world.get_entrance("The Spirit World (MAP28) Red -> The Spirit World (MAP28) Main", player), lambda state: + state.has("The Spirit World (MAP28) - Red skull key", player, 1)) + + # The Living End (MAP29) + set_rule(world.get_entrance("Hub -> The Living End (MAP29) Main", player), lambda state: + state.has("The Living End (MAP29)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Super Shotgun", player, 1)) + + # Icon of Sin (MAP30) + set_rule(world.get_entrance("Hub -> Icon of Sin (MAP30) Main", player), lambda state: + state.has("Icon of Sin (MAP30)", player, 1) and + state.has("Rocket launcher", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Plasma gun", player, 1) and + state.has("BFG9000", player, 1) and + state.has("Super Shotgun", player, 1)) + + +def set_episode4_rules(player, world, pro): + # Wolfenstein2 (MAP31) + set_rule(world.get_entrance("Hub -> Wolfenstein2 (MAP31) Main", player), lambda state: + (state.has("Wolfenstein2 (MAP31)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + + # Grosse2 (MAP32) + set_rule(world.get_entrance("Hub -> Grosse2 (MAP32) Main", player), lambda state: + (state.has("Grosse2 (MAP32)", player, 1) and + state.has("Shotgun", player, 1) and + state.has("Chaingun", player, 1) and + state.has("Super Shotgun", player, 1)) and + (state.has("Rocket launcher", player, 1) or + state.has("Plasma gun", player, 1) or + state.has("BFG9000", player, 1))) + + +def set_rules(doom_ii_world: "DOOM2World", included_episodes, pro): + player = doom_ii_world.player + world = doom_ii_world.multiworld + + if included_episodes[0]: + set_episode1_rules(player, world, pro) + if included_episodes[1]: + set_episode2_rules(player, world, pro) + if included_episodes[2]: + set_episode3_rules(player, world, pro) + if included_episodes[3]: + set_episode4_rules(player, world, pro) diff --git a/worlds/doom_ii/__init__.py b/worlds/doom_ii/__init__.py new file mode 100644 index 00000000..22dee2ab --- /dev/null +++ b/worlds/doom_ii/__init__.py @@ -0,0 +1,267 @@ +import functools +import logging +from typing import Any, Dict, List + +from BaseClasses import Entrance, CollectionState, Item, Location, MultiWorld, Region, Tutorial +from worlds.AutoWorld import WebWorld, World +from . import Items, Locations, Maps, Regions, Rules +from .Options import DOOM2Options + +logger = logging.getLogger("DOOM II") + +DOOM_TYPE_LEVEL_COMPLETE = -2 +DOOM_TYPE_COMPUTER_AREA_MAP = 2026 + + +class DOOM2Location(Location): + game: str = "DOOM II" + + +class DOOM2Item(Item): + game: str = "DOOM II" + + +class DOOM2Web(WebWorld): + tutorials = [Tutorial( + "Multiworld Setup Guide", + "A guide to setting up the DOOM II randomizer connected to an Archipelago Multiworld", + "English", + "setup_en.md", + "setup/en", + ["Daivuk"] + )] + theme = "dirt" + + +class DOOM2World(World): + """ + Doom II, also known as Doom II: Hell on Earth, is a first-person shooter game by id Software. + It was released for MS-DOS in 1994. + Compared to its predecessor, Doom II features larger levels, new enemies, a new "super shotgun" weapon + """ + options_dataclass = DOOM2Options + options: DOOM2Options + game = "DOOM II" + web = DOOM2Web() + data_version = 3 + 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] = [ + "Entryway (MAP01)", + "The Factory (MAP12)", + "Nirvana (MAP21)" + ] + + # Item ratio that scales depending on episode count. These are the ratio for 3 episode. In DOOM1. + # The ratio have been tweaked seem, and feel good. + 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, 0] + self.location_count = 0 + + super().__init__(world, player) + + def get_episode_count(self): + # Don't include 4th, those are secret levels they are additive + return sum(self.included_episodes[:3]) + + def generate_early(self): + # Cache which episodes are included + self.included_episodes[0] = self.options.episode1.value + self.included_episodes[1] = self.options.episode2.value + self.included_episodes[2] = self.options.episode3.value + self.included_episodes[3] = self.options.episode4.value # 4th episode are secret levels + + # If no episodes selected, select Episode 1 + if self.get_episode_count() == 0: + self.included_episodes[0] = 1 + + def create_regions(self): + pro = self.options.pro.value + + # Main regions + menu_region = Region("Menu", self.player, self.multiworld) + hub_region = Region("Hub", self.player, self.multiworld) + self.multiworld.regions += [menu_region, hub_region] + menu_region.add_exits(["Hub"]) + + # Create regions and locations + main_regions = [] + connections = [] + for region_dict in Regions.regions: + if not self.included_episodes[region_dict["episode"] - 1]: + continue + + region_name = region_dict["name"] + if region_dict["connects_to_hub"]: + main_regions.append(region_name) + + region = Region(region_name, self.player, self.multiworld) + region.add_locations({ + loc["name"]: loc_id + for loc_id, loc in Locations.location_table.items() + if loc["region"] == region_name and self.included_episodes[loc["episode"] - 1] + }, DOOM2Location) + + self.multiworld.regions.append(region) + + for connection_dict in region_dict["connections"]: + # Check if it's a pro-only connection + if connection_dict["pro"] and not pro: + continue + connections.append((region, connection_dict["target"])) + + # Connect main regions to Hub + hub_region.add_exits(main_regions) + + # Do the other connections between regions (They are not all both ways) + for connection in connections: + source = connection[0] + target = self.multiworld.get_region(connection[1], self.player) + + entrance = Entrance(self.player, f"{source.name} -> {target.name}", source) + source.exits.append(entrance) + entrance.connect(target) + + # Sum locations for items creation + self.location_count = len(self.multiworld.get_locations(self.player)) + + def completion_rule(self, state: CollectionState): + for map_name in Maps.map_names: + if map_name + " - Exit" not in self.location_name_to_id: + continue + + # Exit location names are in form: Entryway (MAP01) - Exit + loc = Locations.location_table[self.location_name_to_id[map_name + " - Exit"]] + if not self.included_episodes[loc["episode"] - 1]: + continue + + # Map complete item names are in form: Entryway (MAP01) - Complete + if not state.has(map_name + " - Complete", self.player, 1): + return False + + return True + + def set_rules(self): + pro = self.options.pro.value + allow_death_logic = self.options.allow_death_logic.value + + Rules.set_rules(self, self.included_episodes, pro) + self.multiworld.completion_condition[self.player] = lambda state: self.completion_rule(state) + + # 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 allow_death_logic: + for death_logic_location in Locations.death_logic_locations: + self.multiworld.exclude_locations[self.player].value.add(death_logic_location) + + def create_item(self, name: str) -> DOOM2Item: + item_id: int = self.item_name_to_id[name] + return DOOM2Item(name, Items.item_table[item_id]["classification"], item_id, self.player) + + def create_items(self): + itempool: List[DOOM2Item] = [] + start_with_computer_area_maps: bool = self.options.start_with_computer_area_maps.value + + # Items + for item_id, item in Items.item_table.items(): + if item["doom_type"] == DOOM_TYPE_LEVEL_COMPLETE: + continue # We'll fill it manually later + + if item["doom_type"] == DOOM_TYPE_COMPUTER_AREA_MAP and start_with_computer_area_maps: + continue # We'll fill it manually, and we will put fillers in place + + if item["episode"] != -1 and not self.included_episodes[item["episode"] - 1]: + continue + + count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 + itempool += [self.create_item(item["name"]) for _ in range(count)] + + # Place end level items in locked locations + for map_name in Maps.map_names: + loc_name = map_name + " - Exit" + item_name = map_name + " - Complete" + + if loc_name not in self.location_name_to_id: + continue + + if item_name not in self.item_name_to_id: + continue + + loc = Locations.location_table[self.location_name_to_id[loc_name]] + if not self.included_episodes[loc["episode"] - 1]: + continue + + self.multiworld.get_location(loc_name, self.player).place_locked_item(self.create_item(item_name)) + self.location_count -= 1 + + # Give starting levels right away + for i in range(len(self.starting_level_for_episode)): + if self.included_episodes[i]: + self.multiworld.push_precollected(self.create_item(self.starting_level_for_episode[i])) + + # Give Computer area maps if option selected + if start_with_computer_area_maps: + for item_id, item_dict in Items.item_table.items(): + item_episode = item_dict["episode"] + if item_episode > 0: + if item_dict["doom_type"] == DOOM_TYPE_COMPUTER_AREA_MAP and self.included_episodes[item_episode - 1]: + self.multiworld.push_precollected(self.create_item(item_dict["name"])) + + # Fill the rest starting with powerups, then fillers + self.create_ratioed_items("Armor", itempool) + self.create_ratioed_items("Mega Armor", itempool) + self.create_ratioed_items("Berserk", itempool) + self.create_ratioed_items("Invulnerability", itempool) + self.create_ratioed_items("Partial invisibility", itempool) + self.create_ratioed_items("Supercharge", itempool) + + while len(itempool) < self.location_count: + itempool.append(self.create_item(self.get_filler_item_name())) + + # add itempool to multiworld + self.multiworld.itempool += itempool + + def get_filler_item_name(self): + return self.multiworld.random.choice([ + "Medikit", + "Box of bullets", + "Box of rockets", + "Box of shotgun shells", + "Energy cell pack" + ]) + + def create_ratioed_items(self, item_name: str, itempool: List[DOOM2Item]): + remaining_loc = self.location_count - len(itempool) + ep_count = self.get_episode_count() + + # Was balanced based on DOOM 1993's first 3 episodes + count = min(remaining_loc, max(1, int(round(self.items_ratio[item_name] * ep_count / 3)))) + if count == 0: + logger.warning("Warning, no ", item_name, " will be placed.") + return + + for i in range(count): + itempool.append(self.create_item(item_name)) + + def fill_slot_data(self) -> Dict[str, Any]: + return self.options.as_dict("difficulty", "random_monsters", "random_pickups", "random_music", "flip_levels", "allow_death_logic", "pro", "death_link", "reset_level_on_death", "episode1", "episode2", "episode3", "episode4") diff --git a/worlds/doom_ii/docs/en_DOOM II.md b/worlds/doom_ii/docs/en_DOOM II.md new file mode 100644 index 00000000..d561745b --- /dev/null +++ b/worlds/doom_ii/docs/en_DOOM II.md @@ -0,0 +1,23 @@ +# DOOM II + +## 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. + +## What is a "check" in DOOM II? + +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 II? + +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_ii/docs/setup_en.md b/worlds/doom_ii/docs/setup_en.md new file mode 100644 index 00000000..321d440e --- /dev/null +++ b/worlds/doom_ii/docs/setup_en.md @@ -0,0 +1,51 @@ +# DOOM II Randomizer Setup + +## Required Software + +- [DOOM II (e.g. Steam version)](https://store.steampowered.com/app/2300/DOOM_II/) +- [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 DOOM2.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 apdoom-launcher.exe +2. Select `DOOM II` from the drop-down +3. Enter the Archipelago server address, slot name, and password (if you have one) +4. Press "Launch DOOM" +5. 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. + +### Hinting + +To hint from in-game, use the chat (Default key: 'T'). Hinting from DOOM II can be difficult because names are rather long and contain special characters. For example: +``` +!hint Underhalls (MAP02) - Red keycard +``` +The game has a hint helper implemented, where you can simply type this: +``` +!hint map02 red +``` +For this to work, include the map short name (`MAP01`), followed by one of the keywords: `map`, `blue`, `yellow`, `red`. + +## 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.