diff --git a/worlds/doom_1993/Items.py b/worlds/doom_1993/Items.py index fe5576c4dfc4..3c5124d4d57b 100644 --- a/worlds/doom_1993/Items.py +++ b/worlds/doom_1993/Items.py @@ -1165,6 +1165,7 @@ class ItemDict(TypedDict, total=False): item_name_groups: Dict[str, Set[str]] = { 'Ammos': {'Box of bullets', 'Box of rockets', 'Box of shotgun shells', 'Energy cell pack', }, + 'Computer area maps': {'Against Thee Wickedly (E4M6) - Computer area map', 'And Hell Followed (E4M7) - Computer area map', 'Central Processing (E1M6) - Computer area map', 'Command Center (E2M5) - Computer area map', 'Command Control (E1M4) - Computer area map', 'Computer Station (E1M7) - Computer area map', 'Containment Area (E2M2) - Computer area map', 'Deimos Anomaly (E2M1) - Computer area map', 'Deimos Lab (E2M4) - Computer area map', 'Dis (E3M8) - Computer area map', 'Fear (E4M9) - Computer area map', 'Fortress of Mystery (E2M9) - Computer area map', 'Halls of the Damned (E2M6) - Computer area map', 'Hangar (E1M1) - Computer area map', 'Hell Beneath (E4M1) - Computer area map', 'Hell Keep (E3M1) - Computer area map', 'House of Pain (E3M4) - Computer area map', 'Limbo (E3M7) - Computer area map', 'Military Base (E1M9) - Computer area map', 'Mt. Erebus (E3M6) - Computer area map', 'Nuclear Plant (E1M2) - Computer area map', 'Pandemonium (E3M3) - Computer area map', 'Perfect Hatred (E4M2) - Computer area map', 'Phobos Anomaly (E1M8) - Computer area map', 'Phobos Lab (E1M5) - Computer area map', 'Refinery (E2M3) - Computer area map', 'Sever the Wicked (E4M3) - Computer area map', 'Slough of Despair (E3M2) - Computer area map', 'Spawning Vats (E2M7) - Computer area map', 'They Will Repent (E4M5) - Computer area map', 'Tower of Babel (E2M8) - Computer area map', 'Toxin Refinery (E1M3) - Computer area map', 'Unholy Cathedral (E3M5) - Computer area map', 'Unruly Evil (E4M4) - Computer area map', 'Unto the Cruel (E4M8) - Computer area map', 'Warrens (E3M9) - Computer area map', }, 'Keys': {'Against Thee Wickedly (E4M6) - Blue skull key', 'Against Thee Wickedly (E4M6) - Red skull key', 'Against Thee Wickedly (E4M6) - Yellow skull key', 'And Hell Followed (E4M7) - Blue skull key', 'And Hell Followed (E4M7) - Red skull key', 'And Hell Followed (E4M7) - Yellow skull key', 'Central Processing (E1M6) - Blue keycard', 'Central Processing (E1M6) - Red keycard', 'Central Processing (E1M6) - Yellow keycard', 'Command Control (E1M4) - Blue keycard', 'Command Control (E1M4) - Yellow keycard', 'Computer Station (E1M7) - Blue keycard', 'Computer Station (E1M7) - Red keycard', 'Computer Station (E1M7) - Yellow keycard', 'Containment Area (E2M2) - Blue keycard', 'Containment Area (E2M2) - Red keycard', 'Containment Area (E2M2) - Yellow keycard', 'Deimos Anomaly (E2M1) - Blue keycard', 'Deimos Anomaly (E2M1) - Red keycard', 'Deimos Lab (E2M4) - Blue keycard', 'Deimos Lab (E2M4) - Yellow keycard', 'Fear (E4M9) - Yellow skull key', 'Fortress of Mystery (E2M9) - Blue skull key', 'Fortress of Mystery (E2M9) - Red skull key', 'Fortress of Mystery (E2M9) - Yellow skull key', 'Halls of the Damned (E2M6) - Blue skull key', 'Halls of the Damned (E2M6) - Red skull key', 'Halls of the Damned (E2M6) - Yellow skull key', 'Hell Beneath (E4M1) - Blue skull key', 'Hell Beneath (E4M1) - Red skull key', 'House of Pain (E3M4) - Blue skull key', 'House of Pain (E3M4) - Red skull key', 'House of Pain (E3M4) - Yellow skull key', 'Limbo (E3M7) - Blue skull key', 'Limbo (E3M7) - Red skull key', 'Limbo (E3M7) - Yellow skull key', 'Military Base (E1M9) - Blue keycard', 'Military Base (E1M9) - Red keycard', 'Military Base (E1M9) - Yellow keycard', 'Mt. Erebus (E3M6) - Blue skull key', 'Nuclear Plant (E1M2) - Red keycard', 'Pandemonium (E3M3) - Blue skull key', 'Perfect Hatred (E4M2) - Blue skull key', 'Perfect Hatred (E4M2) - Yellow skull key', 'Phobos Lab (E1M5) - Blue keycard', 'Phobos Lab (E1M5) - Yellow keycard', 'Refinery (E2M3) - Blue keycard', 'Sever the Wicked (E4M3) - Blue skull key', 'Sever the Wicked (E4M3) - Red skull key', 'Slough of Despair (E3M2) - Blue skull key', 'Spawning Vats (E2M7) - Blue keycard', 'Spawning Vats (E2M7) - Red keycard', 'Spawning Vats (E2M7) - Yellow keycard', 'They Will Repent (E4M5) - Blue skull key', 'They Will Repent (E4M5) - Red skull key', 'They Will Repent (E4M5) - Yellow skull key', 'Toxin Refinery (E1M3) - Blue keycard', 'Toxin Refinery (E1M3) - Yellow keycard', 'Unholy Cathedral (E3M5) - Blue skull key', 'Unholy Cathedral (E3M5) - Yellow skull key', 'Unruly Evil (E4M4) - Red skull key', 'Unto the Cruel (E4M8) - Red skull key', 'Unto the Cruel (E4M8) - Yellow skull key', 'Warrens (E3M9) - Blue skull key', 'Warrens (E3M9) - Red skull key', }, 'Levels': {'Against Thee Wickedly (E4M6)', 'And Hell Followed (E4M7)', 'Central Processing (E1M6)', 'Command Center (E2M5)', 'Command Control (E1M4)', 'Computer Station (E1M7)', 'Containment Area (E2M2)', 'Deimos Anomaly (E2M1)', 'Deimos Lab (E2M4)', 'Dis (E3M8)', 'Fear (E4M9)', 'Fortress of Mystery (E2M9)', 'Halls of the Damned (E2M6)', 'Hangar (E1M1)', 'Hell Beneath (E4M1)', 'Hell Keep (E3M1)', 'House of Pain (E3M4)', 'Limbo (E3M7)', 'Military Base (E1M9)', 'Mt. Erebus (E3M6)', 'Nuclear Plant (E1M2)', 'Pandemonium (E3M3)', 'Perfect Hatred (E4M2)', 'Phobos Anomaly (E1M8)', 'Phobos Lab (E1M5)', 'Refinery (E2M3)', 'Sever the Wicked (E4M3)', 'Slough of Despair (E3M2)', 'Spawning Vats (E2M7)', 'They Will Repent (E4M5)', 'Tower of Babel (E2M8)', 'Toxin Refinery (E1M3)', 'Unholy Cathedral (E3M5)', 'Unruly Evil (E4M4)', 'Unto the Cruel (E4M8)', 'Warrens (E3M9)', }, 'Powerups': {'Armor', 'Berserk', 'Invulnerability', 'Mega Armor', 'Partial invisibility', 'Supercharge', }, diff --git a/worlds/doom_1993/Locations.py b/worlds/doom_1993/Locations.py index 778efb4661a8..2cbb9b9d150e 100644 --- a/worlds/doom_1993/Locations.py +++ b/worlds/doom_1993/Locations.py @@ -1968,7 +1968,7 @@ class LocationDict(TypedDict, total=False): 'map': 2, 'index': -1, 'doom_type': -1, - 'region': "Containment Area (E2M2) Red"}, + 'region': "Containment Area (E2M2) Red Exit"}, 351326: {'name': 'Deimos Anomaly (E2M1) - Exit', 'episode': 2, 'map': 1, diff --git a/worlds/doom_1993/Options.py b/worlds/doom_1993/Options.py index 72bb7c3aea4e..59f7bcef49a2 100644 --- a/worlds/doom_1993/Options.py +++ b/worlds/doom_1993/Options.py @@ -1,6 +1,18 @@ import typing -from Options import AssembleOptions, Choice, Toggle, DeathLink, DefaultOnToggle +from Options import AssembleOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool + + +class Goal(Choice): + """ + Choose the main goal. + complete_all_levels: All levels of the selected episodes + complete_boss_levels: Boss levels (E#M8) of selected episodes + """ + display_name = "Goal" + option_complete_all_levels = 0 + option_complete_boss_levels = 1 + default = 0 class Difficulty(Choice): @@ -27,11 +39,13 @@ class RandomMonsters(Choice): 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 = 1 @@ -49,6 +63,34 @@ class RandomPickups(Choice): 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 + randomly_flipped: 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. @@ -56,12 +98,24 @@ class AllowDeathLogic(Toggle): 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_name="Reset Level on Death" + + class Episode1(DefaultOnToggle): """Knee-Deep in the Dead. If none of the episodes are chosen, Episode 1 will be chosen by default.""" @@ -87,12 +141,18 @@ class Episode4(Toggle): options: typing.Dict[str, AssembleOptions] = { + "start_inventory_from_pool": StartInventoryPool, + "goal": Goal, "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, diff --git a/worlds/doom_1993/Regions.py b/worlds/doom_1993/Regions.py index 602c29f5bd83..f013bdceaf07 100644 --- a/worlds/doom_1993/Regions.py +++ b/worlds/doom_1993/Regions.py @@ -3,11 +3,15 @@ from typing import List from BaseClasses import TypedDict -class RegionDict(TypedDict, total=False): +class ConnectionDict(TypedDict, total=False): + target: str + pro: bool + +class RegionDict(TypedDict, total=False): name: str connects_to_hub: bool episode: int - connections: List[str] + connections: List[ConnectionDict] regions:List[RegionDict] = [ @@ -21,121 +25,131 @@ class RegionDict(TypedDict, total=False): {"name":"Nuclear Plant (E1M2) Main", "connects_to_hub":True, "episode":1, - "connections":["Nuclear Plant (E1M2) Red"]}, + "connections":[{"target":"Nuclear Plant (E1M2) Red","pro":False}]}, {"name":"Nuclear Plant (E1M2) Red", "connects_to_hub":False, "episode":1, - "connections":["Nuclear Plant (E1M2) Main"]}, + "connections":[{"target":"Nuclear Plant (E1M2) Main","pro":False}]}, # Toxin Refinery (E1M3) {"name":"Toxin Refinery (E1M3) Main", "connects_to_hub":True, "episode":1, - "connections":["Toxin Refinery (E1M3) Blue"]}, + "connections":[{"target":"Toxin Refinery (E1M3) Blue","pro":False}]}, {"name":"Toxin Refinery (E1M3) Blue", "connects_to_hub":False, "episode":1, "connections":[ - "Toxin Refinery (E1M3) Yellow", - "Toxin Refinery (E1M3) Main"]}, + {"target":"Toxin Refinery (E1M3) Yellow","pro":False}, + {"target":"Toxin Refinery (E1M3) Main","pro":False}]}, {"name":"Toxin Refinery (E1M3) Yellow", "connects_to_hub":False, "episode":1, - "connections":["Toxin Refinery (E1M3) Blue"]}, + "connections":[{"target":"Toxin Refinery (E1M3) Blue","pro":False}]}, # Command Control (E1M4) {"name":"Command Control (E1M4) Main", "connects_to_hub":True, "episode":1, "connections":[ - "Command Control (E1M4) Blue", - "Command Control (E1M4) Yellow"]}, + {"target":"Command Control (E1M4) Blue","pro":False}, + {"target":"Command Control (E1M4) Yellow","pro":False}, + {"target":"Command Control (E1M4) Ledge","pro":True}]}, {"name":"Command Control (E1M4) Blue", "connects_to_hub":False, "episode":1, - "connections":["Command Control (E1M4) Main"]}, + "connections":[ + {"target":"Command Control (E1M4) Ledge","pro":False}, + {"target":"Command Control (E1M4) Main","pro":False}]}, {"name":"Command Control (E1M4) Yellow", "connects_to_hub":False, "episode":1, - "connections":["Command Control (E1M4) Main"]}, + "connections":[{"target":"Command Control (E1M4) Main","pro":False}]}, + {"name":"Command Control (E1M4) Ledge", + "connects_to_hub":False, + "episode":1, + "connections":[ + {"target":"Command Control (E1M4) Main","pro":False}, + {"target":"Command Control (E1M4) Blue","pro":False}, + {"target":"Command Control (E1M4) Yellow","pro":False}]}, # Phobos Lab (E1M5) {"name":"Phobos Lab (E1M5) Main", "connects_to_hub":True, "episode":1, - "connections":["Phobos Lab (E1M5) Yellow"]}, + "connections":[{"target":"Phobos Lab (E1M5) Yellow","pro":False}]}, {"name":"Phobos Lab (E1M5) Yellow", "connects_to_hub":False, "episode":1, "connections":[ - "Phobos Lab (E1M5) Main", - "Phobos Lab (E1M5) Blue", - "Phobos Lab (E1M5) Green"]}, + {"target":"Phobos Lab (E1M5) Main","pro":False}, + {"target":"Phobos Lab (E1M5) Blue","pro":False}, + {"target":"Phobos Lab (E1M5) Green","pro":False}]}, {"name":"Phobos Lab (E1M5) Blue", "connects_to_hub":False, "episode":1, "connections":[ - "Phobos Lab (E1M5) Green", - "Phobos Lab (E1M5) Yellow"]}, + {"target":"Phobos Lab (E1M5) Green","pro":False}, + {"target":"Phobos Lab (E1M5) Yellow","pro":False}]}, {"name":"Phobos Lab (E1M5) Green", "connects_to_hub":False, "episode":1, "connections":[ - "Phobos Lab (E1M5) Main", - "Phobos Lab (E1M5) Blue"]}, + {"target":"Phobos Lab (E1M5) Main","pro":False}, + {"target":"Phobos Lab (E1M5) Blue","pro":False}]}, # Central Processing (E1M6) {"name":"Central Processing (E1M6) Main", "connects_to_hub":True, "episode":1, "connections":[ - "Central Processing (E1M6) Yellow", - "Central Processing (E1M6) Red", - "Central Processing (E1M6) Blue", - "Central Processing (E1M6) Nukage"]}, + {"target":"Central Processing (E1M6) Yellow","pro":False}, + {"target":"Central Processing (E1M6) Red","pro":False}, + {"target":"Central Processing (E1M6) Blue","pro":False}, + {"target":"Central Processing (E1M6) Nukage","pro":False}]}, {"name":"Central Processing (E1M6) Red", "connects_to_hub":False, "episode":1, - "connections":["Central Processing (E1M6) Main"]}, + "connections":[{"target":"Central Processing (E1M6) Main","pro":False}]}, {"name":"Central Processing (E1M6) Blue", "connects_to_hub":False, "episode":1, - "connections":["Central Processing (E1M6) Main"]}, + "connections":[{"target":"Central Processing (E1M6) Main","pro":False}]}, {"name":"Central Processing (E1M6) Yellow", "connects_to_hub":False, "episode":1, - "connections":["Central Processing (E1M6) Main"]}, + "connections":[{"target":"Central Processing (E1M6) Main","pro":False}]}, {"name":"Central Processing (E1M6) Nukage", "connects_to_hub":False, "episode":1, - "connections":["Central Processing (E1M6) Yellow"]}, + "connections":[{"target":"Central Processing (E1M6) Yellow","pro":False}]}, # Computer Station (E1M7) {"name":"Computer Station (E1M7) Main", "connects_to_hub":True, "episode":1, "connections":[ - "Computer Station (E1M7) Red", - "Computer Station (E1M7) Yellow"]}, + {"target":"Computer Station (E1M7) Red","pro":False}, + {"target":"Computer Station (E1M7) Yellow","pro":False}]}, {"name":"Computer Station (E1M7) Blue", "connects_to_hub":False, "episode":1, - "connections":["Computer Station (E1M7) Yellow"]}, + "connections":[{"target":"Computer Station (E1M7) Yellow","pro":False}]}, {"name":"Computer Station (E1M7) Red", "connects_to_hub":False, "episode":1, - "connections":["Computer Station (E1M7) Main"]}, + "connections":[{"target":"Computer Station (E1M7) Main","pro":False}]}, {"name":"Computer Station (E1M7) Yellow", "connects_to_hub":False, "episode":1, "connections":[ - "Computer Station (E1M7) Blue", - "Computer Station (E1M7) Courtyard", - "Computer Station (E1M7) Main"]}, + {"target":"Computer Station (E1M7) Blue","pro":False}, + {"target":"Computer Station (E1M7) Courtyard","pro":False}, + {"target":"Computer Station (E1M7) Main","pro":False}]}, {"name":"Computer Station (E1M7) Courtyard", "connects_to_hub":False, "episode":1, - "connections":["Computer Station (E1M7) Yellow"]}, + "connections":[{"target":"Computer Station (E1M7) Yellow","pro":False}]}, # Phobos Anomaly (E1M8) {"name":"Phobos Anomaly (E1M8) Main", @@ -145,91 +159,98 @@ class RegionDict(TypedDict, total=False): {"name":"Phobos Anomaly (E1M8) Start", "connects_to_hub":True, "episode":1, - "connections":["Phobos Anomaly (E1M8) Main"]}, + "connections":[{"target":"Phobos Anomaly (E1M8) Main","pro":False}]}, # Military Base (E1M9) {"name":"Military Base (E1M9) Main", "connects_to_hub":True, "episode":1, "connections":[ - "Military Base (E1M9) Blue", - "Military Base (E1M9) Yellow", - "Military Base (E1M9) Red"]}, + {"target":"Military Base (E1M9) Blue","pro":False}, + {"target":"Military Base (E1M9) Yellow","pro":False}, + {"target":"Military Base (E1M9) Red","pro":False}]}, {"name":"Military Base (E1M9) Blue", "connects_to_hub":False, "episode":1, - "connections":["Military Base (E1M9) Main"]}, + "connections":[{"target":"Military Base (E1M9) Main","pro":False}]}, {"name":"Military Base (E1M9) Red", "connects_to_hub":False, "episode":1, - "connections":["Military Base (E1M9) Main"]}, + "connections":[{"target":"Military Base (E1M9) Main","pro":False}]}, {"name":"Military Base (E1M9) Yellow", "connects_to_hub":False, "episode":1, - "connections":["Military Base (E1M9) Main"]}, + "connections":[{"target":"Military Base (E1M9) Main","pro":False}]}, # Deimos Anomaly (E2M1) {"name":"Deimos Anomaly (E2M1) Main", "connects_to_hub":True, "episode":2, "connections":[ - "Deimos Anomaly (E2M1) Red", - "Deimos Anomaly (E2M1) Blue"]}, + {"target":"Deimos Anomaly (E2M1) Red","pro":False}, + {"target":"Deimos Anomaly (E2M1) Blue","pro":False}]}, {"name":"Deimos Anomaly (E2M1) Blue", "connects_to_hub":False, "episode":2, - "connections":["Deimos Anomaly (E2M1) Main"]}, + "connections":[{"target":"Deimos Anomaly (E2M1) Main","pro":False}]}, {"name":"Deimos Anomaly (E2M1) Red", "connects_to_hub":False, "episode":2, - "connections":["Deimos Anomaly (E2M1) Main"]}, + "connections":[{"target":"Deimos Anomaly (E2M1) Main","pro":False}]}, # Containment Area (E2M2) {"name":"Containment Area (E2M2) Main", "connects_to_hub":True, "episode":2, "connections":[ - "Containment Area (E2M2) Yellow", - "Containment Area (E2M2) Blue", - "Containment Area (E2M2) Red"]}, + {"target":"Containment Area (E2M2) Yellow","pro":False}, + {"target":"Containment Area (E2M2) Blue","pro":False}, + {"target":"Containment Area (E2M2) Red","pro":False}, + {"target":"Containment Area (E2M2) Red Exit","pro":True}]}, {"name":"Containment Area (E2M2) Blue", "connects_to_hub":False, "episode":2, - "connections":["Containment Area (E2M2) Main"]}, + "connections":[{"target":"Containment Area (E2M2) Main","pro":False}]}, {"name":"Containment Area (E2M2) Red", "connects_to_hub":False, "episode":2, - "connections":["Containment Area (E2M2) Main"]}, + "connections":[ + {"target":"Containment Area (E2M2) Main","pro":False}, + {"target":"Containment Area (E2M2) Red Exit","pro":False}]}, {"name":"Containment Area (E2M2) Yellow", "connects_to_hub":False, "episode":2, - "connections":["Containment Area (E2M2) Main"]}, + "connections":[{"target":"Containment Area (E2M2) Main","pro":False}]}, + {"name":"Containment Area (E2M2) Red Exit", + "connects_to_hub":False, + "episode":2, + "connections":[]}, # Refinery (E2M3) {"name":"Refinery (E2M3) Main", "connects_to_hub":True, "episode":2, - "connections":["Refinery (E2M3) Blue"]}, + "connections":[{"target":"Refinery (E2M3) Blue","pro":False}]}, {"name":"Refinery (E2M3) Blue", "connects_to_hub":False, "episode":2, - "connections":["Refinery (E2M3) Main"]}, + "connections":[{"target":"Refinery (E2M3) Main","pro":False}]}, # Deimos Lab (E2M4) {"name":"Deimos Lab (E2M4) Main", "connects_to_hub":True, "episode":2, - "connections":["Deimos Lab (E2M4) Blue"]}, + "connections":[{"target":"Deimos Lab (E2M4) Blue","pro":False}]}, {"name":"Deimos Lab (E2M4) Blue", "connects_to_hub":False, "episode":2, "connections":[ - "Deimos Lab (E2M4) Main", - "Deimos Lab (E2M4) Yellow"]}, + {"target":"Deimos Lab (E2M4) Main","pro":False}, + {"target":"Deimos Lab (E2M4) Yellow","pro":False}]}, {"name":"Deimos Lab (E2M4) Yellow", "connects_to_hub":False, "episode":2, - "connections":["Deimos Lab (E2M4) Blue"]}, + "connections":[{"target":"Deimos Lab (E2M4) Blue","pro":False}]}, # Command Center (E2M5) {"name":"Command Center (E2M5) Main", @@ -242,47 +263,54 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":True, "episode":2, "connections":[ - "Halls of the Damned (E2M6) Blue Yellow Red", - "Halls of the Damned (E2M6) Yellow", - "Halls of the Damned (E2M6) One way Yellow"]}, + {"target":"Halls of the Damned (E2M6) Blue Yellow Red","pro":False}, + {"target":"Halls of the Damned (E2M6) Yellow","pro":False}, + {"target":"Halls of the Damned (E2M6) One way Yellow","pro":False}]}, {"name":"Halls of the Damned (E2M6) Yellow", "connects_to_hub":False, "episode":2, - "connections":["Halls of the Damned (E2M6) Main"]}, + "connections":[{"target":"Halls of the Damned (E2M6) Main","pro":False}]}, {"name":"Halls of the Damned (E2M6) Blue Yellow Red", "connects_to_hub":False, "episode":2, - "connections":["Halls of the Damned (E2M6) Main"]}, + "connections":[{"target":"Halls of the Damned (E2M6) Main","pro":False}]}, {"name":"Halls of the Damned (E2M6) One way Yellow", "connects_to_hub":False, "episode":2, - "connections":["Halls of the Damned (E2M6) Main"]}, + "connections":[{"target":"Halls of the Damned (E2M6) Main","pro":False}]}, # Spawning Vats (E2M7) {"name":"Spawning Vats (E2M7) Main", "connects_to_hub":True, "episode":2, "connections":[ - "Spawning Vats (E2M7) Blue", - "Spawning Vats (E2M7) Entrance Secret", - "Spawning Vats (E2M7) Red", - "Spawning Vats (E2M7) Yellow"]}, + {"target":"Spawning Vats (E2M7) Blue","pro":False}, + {"target":"Spawning Vats (E2M7) Entrance Secret","pro":False}, + {"target":"Spawning Vats (E2M7) Red","pro":False}, + {"target":"Spawning Vats (E2M7) Yellow","pro":False}, + {"target":"Spawning Vats (E2M7) Red Exit","pro":True}]}, {"name":"Spawning Vats (E2M7) Blue", "connects_to_hub":False, "episode":2, - "connections":["Spawning Vats (E2M7) Main"]}, + "connections":[{"target":"Spawning Vats (E2M7) Main","pro":False}]}, {"name":"Spawning Vats (E2M7) Yellow", "connects_to_hub":False, "episode":2, - "connections":["Spawning Vats (E2M7) Main"]}, + "connections":[{"target":"Spawning Vats (E2M7) Main","pro":False}]}, {"name":"Spawning Vats (E2M7) Red", "connects_to_hub":False, "episode":2, - "connections":["Spawning Vats (E2M7) Main"]}, + "connections":[ + {"target":"Spawning Vats (E2M7) Main","pro":False}, + {"target":"Spawning Vats (E2M7) Red Exit","pro":False}]}, {"name":"Spawning Vats (E2M7) Entrance Secret", "connects_to_hub":False, "episode":2, - "connections":["Spawning Vats (E2M7) Main"]}, + "connections":[{"target":"Spawning Vats (E2M7) Main","pro":False}]}, + {"name":"Spawning Vats (E2M7) Red Exit", + "connects_to_hub":False, + "episode":2, + "connections":[]}, # Tower of Babel (E2M8) {"name":"Tower of Babel (E2M8) Main", @@ -295,134 +323,134 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":True, "episode":2, "connections":[ - "Fortress of Mystery (E2M9) Blue", - "Fortress of Mystery (E2M9) Red", - "Fortress of Mystery (E2M9) Yellow"]}, + {"target":"Fortress of Mystery (E2M9) Blue","pro":False}, + {"target":"Fortress of Mystery (E2M9) Red","pro":False}, + {"target":"Fortress of Mystery (E2M9) Yellow","pro":False}]}, {"name":"Fortress of Mystery (E2M9) Blue", "connects_to_hub":False, "episode":2, - "connections":["Fortress of Mystery (E2M9) Main"]}, + "connections":[{"target":"Fortress of Mystery (E2M9) Main","pro":False}]}, {"name":"Fortress of Mystery (E2M9) Red", "connects_to_hub":False, "episode":2, - "connections":["Fortress of Mystery (E2M9) Main"]}, + "connections":[{"target":"Fortress of Mystery (E2M9) Main","pro":False}]}, {"name":"Fortress of Mystery (E2M9) Yellow", "connects_to_hub":False, "episode":2, - "connections":["Fortress of Mystery (E2M9) Main"]}, + "connections":[{"target":"Fortress of Mystery (E2M9) Main","pro":False}]}, # Hell Keep (E3M1) {"name":"Hell Keep (E3M1) Main", "connects_to_hub":True, "episode":3, - "connections":["Hell Keep (E3M1) Narrow"]}, + "connections":[{"target":"Hell Keep (E3M1) Narrow","pro":False}]}, {"name":"Hell Keep (E3M1) Narrow", "connects_to_hub":False, "episode":3, - "connections":["Hell Keep (E3M1) Main"]}, + "connections":[{"target":"Hell Keep (E3M1) Main","pro":False}]}, # Slough of Despair (E3M2) {"name":"Slough of Despair (E3M2) Main", "connects_to_hub":True, "episode":3, - "connections":["Slough of Despair (E3M2) Blue"]}, + "connections":[{"target":"Slough of Despair (E3M2) Blue","pro":False}]}, {"name":"Slough of Despair (E3M2) Blue", "connects_to_hub":False, "episode":3, - "connections":["Slough of Despair (E3M2) Main"]}, + "connections":[{"target":"Slough of Despair (E3M2) Main","pro":False}]}, # Pandemonium (E3M3) {"name":"Pandemonium (E3M3) Main", "connects_to_hub":True, "episode":3, - "connections":["Pandemonium (E3M3) Blue"]}, + "connections":[{"target":"Pandemonium (E3M3) Blue","pro":False}]}, {"name":"Pandemonium (E3M3) Blue", "connects_to_hub":False, "episode":3, - "connections":["Pandemonium (E3M3) Main"]}, + "connections":[{"target":"Pandemonium (E3M3) Main","pro":False}]}, # House of Pain (E3M4) {"name":"House of Pain (E3M4) Main", "connects_to_hub":True, "episode":3, - "connections":["House of Pain (E3M4) Blue"]}, + "connections":[{"target":"House of Pain (E3M4) Blue","pro":False}]}, {"name":"House of Pain (E3M4) Blue", "connects_to_hub":False, "episode":3, "connections":[ - "House of Pain (E3M4) Main", - "House of Pain (E3M4) Yellow", - "House of Pain (E3M4) Red"]}, + {"target":"House of Pain (E3M4) Main","pro":False}, + {"target":"House of Pain (E3M4) Yellow","pro":False}, + {"target":"House of Pain (E3M4) Red","pro":False}]}, {"name":"House of Pain (E3M4) Red", "connects_to_hub":False, "episode":3, - "connections":["House of Pain (E3M4) Blue"]}, + "connections":[{"target":"House of Pain (E3M4) Blue","pro":False}]}, {"name":"House of Pain (E3M4) Yellow", "connects_to_hub":False, "episode":3, - "connections":["House of Pain (E3M4) Blue"]}, + "connections":[{"target":"House of Pain (E3M4) Blue","pro":False}]}, # Unholy Cathedral (E3M5) {"name":"Unholy Cathedral (E3M5) Main", "connects_to_hub":True, "episode":3, "connections":[ - "Unholy Cathedral (E3M5) Yellow", - "Unholy Cathedral (E3M5) Blue"]}, + {"target":"Unholy Cathedral (E3M5) Yellow","pro":False}, + {"target":"Unholy Cathedral (E3M5) Blue","pro":False}]}, {"name":"Unholy Cathedral (E3M5) Blue", "connects_to_hub":False, "episode":3, - "connections":["Unholy Cathedral (E3M5) Main"]}, + "connections":[{"target":"Unholy Cathedral (E3M5) Main","pro":False}]}, {"name":"Unholy Cathedral (E3M5) Yellow", "connects_to_hub":False, "episode":3, - "connections":["Unholy Cathedral (E3M5) Main"]}, + "connections":[{"target":"Unholy Cathedral (E3M5) Main","pro":False}]}, # Mt. Erebus (E3M6) {"name":"Mt. Erebus (E3M6) Main", "connects_to_hub":True, "episode":3, - "connections":["Mt. Erebus (E3M6) Blue"]}, + "connections":[{"target":"Mt. Erebus (E3M6) Blue","pro":False}]}, {"name":"Mt. Erebus (E3M6) Blue", "connects_to_hub":False, "episode":3, - "connections":["Mt. Erebus (E3M6) Main"]}, + "connections":[{"target":"Mt. Erebus (E3M6) Main","pro":False}]}, # Limbo (E3M7) {"name":"Limbo (E3M7) Main", "connects_to_hub":True, "episode":3, "connections":[ - "Limbo (E3M7) Red", - "Limbo (E3M7) Blue", - "Limbo (E3M7) Pink"]}, + {"target":"Limbo (E3M7) Red","pro":False}, + {"target":"Limbo (E3M7) Blue","pro":False}, + {"target":"Limbo (E3M7) Pink","pro":False}]}, {"name":"Limbo (E3M7) Blue", "connects_to_hub":False, "episode":3, - "connections":["Limbo (E3M7) Main"]}, + "connections":[{"target":"Limbo (E3M7) Main","pro":False}]}, {"name":"Limbo (E3M7) Red", "connects_to_hub":False, "episode":3, "connections":[ - "Limbo (E3M7) Main", - "Limbo (E3M7) Yellow", - "Limbo (E3M7) Green"]}, + {"target":"Limbo (E3M7) Main","pro":False}, + {"target":"Limbo (E3M7) Yellow","pro":False}, + {"target":"Limbo (E3M7) Green","pro":False}]}, {"name":"Limbo (E3M7) Yellow", "connects_to_hub":False, "episode":3, - "connections":["Limbo (E3M7) Red"]}, + "connections":[{"target":"Limbo (E3M7) Red","pro":False}]}, {"name":"Limbo (E3M7) Pink", "connects_to_hub":False, "episode":3, "connections":[ - "Limbo (E3M7) Green", - "Limbo (E3M7) Main"]}, + {"target":"Limbo (E3M7) Green","pro":False}, + {"target":"Limbo (E3M7) Main","pro":False}]}, {"name":"Limbo (E3M7) Green", "connects_to_hub":False, "episode":3, "connections":[ - "Limbo (E3M7) Pink", - "Limbo (E3M7) Red"]}, + {"target":"Limbo (E3M7) Pink","pro":False}, + {"target":"Limbo (E3M7) Red","pro":False}]}, # Dis (E3M8) {"name":"Dis (E3M8) Main", @@ -435,8 +463,8 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":True, "episode":3, "connections":[ - "Warrens (E3M9) Blue", - "Warrens (E3M9) Blue trigger"]}, + {"target":"Warrens (E3M9) Blue","pro":False}, + {"target":"Warrens (E3M9) Blue trigger","pro":False}]}, {"name":"Warrens (E3M9) Red", "connects_to_hub":False, "episode":3, @@ -445,8 +473,8 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":False, "episode":3, "connections":[ - "Warrens (E3M9) Main", - "Warrens (E3M9) Red"]}, + {"target":"Warrens (E3M9) Main","pro":False}, + {"target":"Warrens (E3M9) Red","pro":False}]}, {"name":"Warrens (E3M9) Blue trigger", "connects_to_hub":False, "episode":3, @@ -457,36 +485,36 @@ class RegionDict(TypedDict, total=False): "connects_to_hub":True, "episode":4, "connections":[ - "Hell Beneath (E4M1) Red", - "Hell Beneath (E4M1) Blue"]}, + {"target":"Hell Beneath (E4M1) Red","pro":False}, + {"target":"Hell Beneath (E4M1) Blue","pro":False}]}, {"name":"Hell Beneath (E4M1) Red", "connects_to_hub":False, "episode":4, - "connections":["Hell Beneath (E4M1) Main"]}, + "connections":[{"target":"Hell Beneath (E4M1) Main","pro":False}]}, {"name":"Hell Beneath (E4M1) Blue", "connects_to_hub":False, "episode":4, - "connections":["Hell Beneath (E4M1) Main"]}, + "connections":[{"target":"Hell Beneath (E4M1) Main","pro":False}]}, # Perfect Hatred (E4M2) {"name":"Perfect Hatred (E4M2) Main", "connects_to_hub":True, "episode":4, "connections":[ - "Perfect Hatred (E4M2) Blue", - "Perfect Hatred (E4M2) Yellow"]}, + {"target":"Perfect Hatred (E4M2) Blue","pro":False}, + {"target":"Perfect Hatred (E4M2) Yellow","pro":False}]}, {"name":"Perfect Hatred (E4M2) Blue", "connects_to_hub":False, "episode":4, "connections":[ - "Perfect Hatred (E4M2) Main", - "Perfect Hatred (E4M2) Cave"]}, + {"target":"Perfect Hatred (E4M2) Main","pro":False}, + {"target":"Perfect Hatred (E4M2) Cave","pro":False}]}, {"name":"Perfect Hatred (E4M2) Yellow", "connects_to_hub":False, "episode":4, "connections":[ - "Perfect Hatred (E4M2) Main", - "Perfect Hatred (E4M2) Cave"]}, + {"target":"Perfect Hatred (E4M2) Main","pro":False}, + {"target":"Perfect Hatred (E4M2) Cave","pro":False}]}, {"name":"Perfect Hatred (E4M2) Cave", "connects_to_hub":False, "episode":4, @@ -496,132 +524,135 @@ class RegionDict(TypedDict, total=False): {"name":"Sever the Wicked (E4M3) Main", "connects_to_hub":True, "episode":4, - "connections":["Sever the Wicked (E4M3) Red"]}, + "connections":[{"target":"Sever the Wicked (E4M3) Red","pro":False}]}, {"name":"Sever the Wicked (E4M3) Red", "connects_to_hub":False, "episode":4, "connections":[ - "Sever the Wicked (E4M3) Blue", - "Sever the Wicked (E4M3) Main"]}, + {"target":"Sever the Wicked (E4M3) Blue","pro":False}, + {"target":"Sever the Wicked (E4M3) Main","pro":False}]}, {"name":"Sever the Wicked (E4M3) Blue", "connects_to_hub":False, "episode":4, - "connections":["Sever the Wicked (E4M3) Red"]}, + "connections":[{"target":"Sever the Wicked (E4M3) Red","pro":False}]}, # Unruly Evil (E4M4) {"name":"Unruly Evil (E4M4) Main", "connects_to_hub":True, "episode":4, - "connections":["Unruly Evil (E4M4) Red"]}, + "connections":[{"target":"Unruly Evil (E4M4) Red","pro":False}]}, {"name":"Unruly Evil (E4M4) Red", "connects_to_hub":False, "episode":4, - "connections":["Unruly Evil (E4M4) Main"]}, + "connections":[{"target":"Unruly Evil (E4M4) Main","pro":False}]}, # They Will Repent (E4M5) {"name":"They Will Repent (E4M5) Main", "connects_to_hub":True, "episode":4, - "connections":["They Will Repent (E4M5) Red"]}, + "connections":[{"target":"They Will Repent (E4M5) Red","pro":False}]}, {"name":"They Will Repent (E4M5) Yellow", "connects_to_hub":False, "episode":4, - "connections":["They Will Repent (E4M5) Red"]}, + "connections":[{"target":"They Will Repent (E4M5) Red","pro":False}]}, {"name":"They Will Repent (E4M5) Blue", "connects_to_hub":False, "episode":4, - "connections":["They Will Repent (E4M5) Red"]}, + "connections":[{"target":"They Will Repent (E4M5) Red","pro":False}]}, {"name":"They Will Repent (E4M5) Red", "connects_to_hub":False, "episode":4, "connections":[ - "They Will Repent (E4M5) Main", - "They Will Repent (E4M5) Yellow", - "They Will Repent (E4M5) Blue"]}, + {"target":"They Will Repent (E4M5) Main","pro":False}, + {"target":"They Will Repent (E4M5) Yellow","pro":False}, + {"target":"They Will Repent (E4M5) Blue","pro":False}]}, # Against Thee Wickedly (E4M6) {"name":"Against Thee Wickedly (E4M6) Main", "connects_to_hub":True, "episode":4, - "connections":["Against Thee Wickedly (E4M6) Blue"]}, + "connections":[ + {"target":"Against Thee Wickedly (E4M6) Blue","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Pink","pro":True}]}, {"name":"Against Thee Wickedly (E4M6) Red", "connects_to_hub":False, "episode":4, "connections":[ - "Against Thee Wickedly (E4M6) Blue", - "Against Thee Wickedly (E4M6) Pink", - "Against Thee Wickedly (E4M6) Main"]}, + {"target":"Against Thee Wickedly (E4M6) Blue","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Pink","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Main","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Magenta","pro":True}]}, {"name":"Against Thee Wickedly (E4M6) Blue", "connects_to_hub":False, "episode":4, "connections":[ - "Against Thee Wickedly (E4M6) Main", - "Against Thee Wickedly (E4M6) Yellow", - "Against Thee Wickedly (E4M6) Red"]}, + {"target":"Against Thee Wickedly (E4M6) Main","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Yellow","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Red","pro":False}]}, {"name":"Against Thee Wickedly (E4M6) Magenta", "connects_to_hub":False, "episode":4, - "connections":["Against Thee Wickedly (E4M6) Main"]}, + "connections":[{"target":"Against Thee Wickedly (E4M6) Main","pro":False}]}, {"name":"Against Thee Wickedly (E4M6) Yellow", "connects_to_hub":False, "episode":4, "connections":[ - "Against Thee Wickedly (E4M6) Blue", - "Against Thee Wickedly (E4M6) Magenta"]}, + {"target":"Against Thee Wickedly (E4M6) Blue","pro":False}, + {"target":"Against Thee Wickedly (E4M6) Magenta","pro":False}]}, {"name":"Against Thee Wickedly (E4M6) Pink", "connects_to_hub":False, "episode":4, - "connections":["Against Thee Wickedly (E4M6) Main"]}, + "connections":[{"target":"Against Thee Wickedly (E4M6) Main","pro":False}]}, # And Hell Followed (E4M7) {"name":"And Hell Followed (E4M7) Main", "connects_to_hub":True, "episode":4, "connections":[ - "And Hell Followed (E4M7) Blue", - "And Hell Followed (E4M7) Red", - "And Hell Followed (E4M7) Yellow"]}, + {"target":"And Hell Followed (E4M7) Blue","pro":False}, + {"target":"And Hell Followed (E4M7) Red","pro":False}, + {"target":"And Hell Followed (E4M7) Yellow","pro":False}]}, {"name":"And Hell Followed (E4M7) Red", "connects_to_hub":False, "episode":4, - "connections":["And Hell Followed (E4M7) Main"]}, + "connections":[{"target":"And Hell Followed (E4M7) Main","pro":False}]}, {"name":"And Hell Followed (E4M7) Blue", "connects_to_hub":False, "episode":4, - "connections":["And Hell Followed (E4M7) Main"]}, + "connections":[{"target":"And Hell Followed (E4M7) Main","pro":False}]}, {"name":"And Hell Followed (E4M7) Yellow", "connects_to_hub":False, "episode":4, - "connections":["And Hell Followed (E4M7) Main"]}, + "connections":[{"target":"And Hell Followed (E4M7) Main","pro":False}]}, # Unto the Cruel (E4M8) {"name":"Unto the Cruel (E4M8) Main", "connects_to_hub":True, "episode":4, "connections":[ - "Unto the Cruel (E4M8) Red", - "Unto the Cruel (E4M8) Yellow", - "Unto the Cruel (E4M8) Orange"]}, + {"target":"Unto the Cruel (E4M8) Red","pro":False}, + {"target":"Unto the Cruel (E4M8) Yellow","pro":False}, + {"target":"Unto the Cruel (E4M8) Orange","pro":False}]}, {"name":"Unto the Cruel (E4M8) Yellow", "connects_to_hub":False, "episode":4, - "connections":["Unto the Cruel (E4M8) Main"]}, + "connections":[{"target":"Unto the Cruel (E4M8) Main","pro":False}]}, {"name":"Unto the Cruel (E4M8) Red", "connects_to_hub":False, "episode":4, - "connections":["Unto the Cruel (E4M8) Main"]}, + "connections":[{"target":"Unto the Cruel (E4M8) Main","pro":False}]}, {"name":"Unto the Cruel (E4M8) Orange", "connects_to_hub":False, "episode":4, - "connections":["Unto the Cruel (E4M8) Main"]}, + "connections":[{"target":"Unto the Cruel (E4M8) Main","pro":False}]}, # Fear (E4M9) {"name":"Fear (E4M9) Main", "connects_to_hub":True, "episode":4, - "connections":["Fear (E4M9) Yellow"]}, + "connections":[{"target":"Fear (E4M9) Yellow","pro":False}]}, {"name":"Fear (E4M9) Yellow", "connects_to_hub":False, "episode":4, - "connections":["Fear (E4M9) Main"]}, + "connections":[{"target":"Fear (E4M9) Main","pro":False}]}, ] diff --git a/worlds/doom_1993/Rules.py b/worlds/doom_1993/Rules.py index 6e13a8af34ce..d5abc367a149 100644 --- a/worlds/doom_1993/Rules.py +++ b/worlds/doom_1993/Rules.py @@ -7,7 +7,7 @@ from . import DOOM1993World -def set_episode1_rules(player, world): +def set_episode1_rules(player, world, pro): # Hangar (E1M1) set_rule(world.get_entrance("Hub -> Hangar (E1M1) Main", player), lambda state: state.has("Hangar (E1M1)", player, 1)) @@ -130,7 +130,7 @@ def set_episode1_rules(player, world): state.has("Military Base (E1M9) - Yellow keycard", player, 1)) -def set_episode2_rules(player, world): +def set_episode2_rules(player, world, pro): # Deimos Anomaly (E2M1) set_rule(world.get_entrance("Hub -> Deimos Anomaly (E2M1) Main", player), lambda state: state.has("Deimos Anomaly (E2M1)", player, 1)) @@ -226,6 +226,9 @@ def set_episode2_rules(player, world): state.has("Spawning Vats (E2M7) - Red keycard", player, 1)) set_rule(world.get_entrance("Spawning Vats (E2M7) Main -> Spawning Vats (E2M7) Yellow", player), lambda state: state.has("Spawning Vats (E2M7) - Yellow keycard", player, 1)) + if pro: + set_rule(world.get_entrance("Spawning Vats (E2M7) Main -> Spawning Vats (E2M7) Red Exit", player), lambda state: + state.has("Rocket launcher", player, 1)) set_rule(world.get_entrance("Spawning Vats (E2M7) Yellow -> Spawning Vats (E2M7) Main", player), lambda state: state.has("Spawning Vats (E2M7) - Yellow keycard", player, 1)) set_rule(world.get_entrance("Spawning Vats (E2M7) Red -> Spawning Vats (E2M7) Main", player), lambda state: @@ -260,7 +263,7 @@ def set_episode2_rules(player, world): state.has("Fortress of Mystery (E2M9) - Yellow skull key", player, 1)) -def set_episode3_rules(player, world): +def set_episode3_rules(player, world, pro): # Hell Keep (E3M1) set_rule(world.get_entrance("Hub -> Hell Keep (E3M1) Main", player), lambda state: state.has("Hell Keep (E3M1)", player, 1)) @@ -385,7 +388,7 @@ def set_episode3_rules(player, world): state.has("Warrens (E3M9) - Red skull key", player, 1)) -def set_episode4_rules(player, world): +def set_episode4_rules(player, world, pro): # Hell Beneath (E4M1) set_rule(world.get_entrance("Hub -> Hell Beneath (E4M1) Main", player), lambda state: state.has("Hell Beneath (E4M1)", player, 1)) @@ -520,15 +523,15 @@ def set_episode4_rules(player, world): state.has("Fear (E4M9) - Yellow skull key", player, 1)) -def set_rules(doom_1993_world: "DOOM1993World", included_episodes): +def set_rules(doom_1993_world: "DOOM1993World", included_episodes, pro): player = doom_1993_world.player world = doom_1993_world.multiworld if included_episodes[0]: - set_episode1_rules(player, world) + set_episode1_rules(player, world, pro) if included_episodes[1]: - set_episode2_rules(player, world) + set_episode2_rules(player, world, pro) if included_episodes[2]: - set_episode3_rules(player, world) + set_episode3_rules(player, world, pro) if included_episodes[3]: - set_episode4_rules(player, world) + set_episode4_rules(player, world, pro) diff --git a/worlds/doom_1993/__init__.py b/worlds/doom_1993/__init__.py index 83a8652af1d1..e420b34b4f00 100644 --- a/worlds/doom_1993/__init__.py +++ b/worlds/doom_1993/__init__.py @@ -56,6 +56,13 @@ class DOOM1993World(World): "Hell Beneath (E4M1)" ] + boss_level_for_espidoes: List[str] = [ + "Phobos Anomaly (E1M8)", + "Tower of Babel (E2M8)", + "Dis (E3M8)", + "Unto the Cruel (E4M8)" + ] + # Item ratio that scales depending on episode count. These are the ratio for 3 episode. items_ratio: Dict[str, float] = { "Armor": 41, @@ -90,6 +97,8 @@ def generate_early(self): self.included_episodes[0] = 1 def create_regions(self): + pro = getattr(self.multiworld, "pro")[self.player].value + # Main regions menu_region = Region("Menu", self.player, self.multiworld) hub_region = Region("Hub", self.player, self.multiworld) @@ -116,8 +125,11 @@ def create_regions(self): self.multiworld.regions.append(region) - for connection in region_dict["connections"]: - connections.append((region, connection)) + 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) @@ -135,7 +147,11 @@ def create_regions(self): self.location_count = len(self.multiworld.get_locations(self.player)) def completion_rule(self, state: CollectionState): - for map_name in Maps.map_names: + goal_levels = Maps.map_names + if getattr(self.multiworld, "goal")[self.player].value: + goal_levels = self.boss_level_for_espidoes + + for map_name in goal_levels: if map_name + " - Exit" not in self.location_name_to_id: continue @@ -151,12 +167,15 @@ def completion_rule(self, state: CollectionState): return True def set_rules(self): - Rules.set_rules(self, self.included_episodes) + pro = getattr(self.multiworld, "pro")[self.player].value + allow_death_logic = getattr(self.multiworld, "allow_death_logic")[self.player].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 getattr(self.multiworld, "allow_death_logic")[self.player].value: + 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) @@ -165,7 +184,6 @@ def create_item(self, name: str) -> DOOM1993Item: return DOOM1993Item(name, Items.item_table[item_id]["classification"], item_id, self.player) def create_items(self): - is_only_first_episode: bool = self.get_episode_count() == 1 and self.included_episodes[0] itempool: List[DOOM1993Item] = [] start_with_computer_area_maps: bool = getattr(self.multiworld, "start_with_computer_area_maps")[self.player].value @@ -180,9 +198,6 @@ def create_items(self): if item["episode"] != -1 and not self.included_episodes[item["episode"] - 1]: continue - if item["name"] in {"BFG9000", "Plasma Gun"} and is_only_first_episode: - continue # Don't include those guns if only first episode - 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)] @@ -212,8 +227,10 @@ def create_items(self): # Give Computer area maps if option selected if getattr(self.multiworld, "start_with_computer_area_maps")[self.player].value: for item_id, item_dict in Items.item_table.items(): - if item_dict["doom_type"] == DOOM_TYPE_COMPUTER_AREA_MAP: - self.multiworld.push_precollected(self.create_item(item_dict["name"])) + 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) diff --git a/worlds/doom_1993/docs/setup_en.md b/worlds/doom_1993/docs/setup_en.md index cfd97f623a0c..1e546d359c91 100644 --- a/worlds/doom_1993/docs/setup_en.md +++ b/worlds/doom_1993/docs/setup_en.md @@ -8,6 +8,8 @@ ## Optional Software - [ArchipelagoTextClient](https://github.com/ArchipelagoMW/Archipelago/releases) +- [PopTracker](https://github.com/black-sliver/PopTracker/) + - [OZone's APDoom tracker pack](https://github.com/Ozone31/doom-ap-tracker/releases) ## Installing AP Doom 1. Download [APDOOM.zip](https://github.com/Daivuk/apdoom/releases) and extract it. @@ -17,10 +19,11 @@ ## Joining a MultiWorld Game -1. Launch APDoomLauncher.exe -2. Enter the Archipelago server address, slot name, and password (if you have one) -3. Press "Launch DOOM" -4. Enjoy! +1. Launch apdoom-launcher.exe +2. Select `Ultimate DOOM` 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. @@ -31,8 +34,23 @@ We recommend having Archipelago's Text Client open on the side to keep track of 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 can be difficult because names are rather long and contain special characters. For example: +``` +!hint Toxin Refinery (E1M3) - Computer area map +``` +The game has a hint helper implemented, where you can simply type this: +``` +!hint e1m3 map +``` +For this to work, include the map short name (`E1M1`), 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. + +For better tracking, try OZone's poptracker package: https://github.com/Ozone31/doom-ap-tracker/releases . +Requires [PopTracker](https://github.com/black-sliver/PopTracker/).