DOOM 1993: Include only regions/rules for selected episodes

This commit is contained in:
Daivuk 2023-07-25 15:02:59 -04:00 committed by Fabian Dill
parent 40c9287eba
commit de1ec4a18f
4 changed files with 136 additions and 6 deletions

View File

@ -80,7 +80,7 @@ class Episode3(DefaultOnToggle):
display_name = "Episode 3"
class Episode4(DefaultOnToggle):
class Episode4(Toggle):
"""Thy Flesh Consumed.
If none of the episodes are chosen, Episode 1 will be chosen by default."""
display_name = "Episode 4"

View File

@ -6,6 +6,7 @@ from BaseClasses import TypedDict
class RegionDict(TypedDict, total=False):
name: str
connects_to_hub: bool
episode: int
connections: List[str]
@ -13,59 +14,72 @@ regions:List[RegionDict] = [
# Hangar (E1M1)
{"name":"Hangar (E1M1) Main",
"connects_to_hub":True,
"episode":1,
"connections":[]},
# Nuclear Plant (E1M2)
{"name":"Nuclear Plant (E1M2) Main",
"connects_to_hub":True,
"episode":1,
"connections":["Nuclear Plant (E1M2) Red"]},
{"name":"Nuclear Plant (E1M2) Red",
"connects_to_hub":False,
"episode":1,
"connections":["Nuclear Plant (E1M2) Main"]},
# Toxin Refinery (E1M3)
{"name":"Toxin Refinery (E1M3) Main",
"connects_to_hub":True,
"episode":1,
"connections":["Toxin Refinery (E1M3) Blue"]},
{"name":"Toxin Refinery (E1M3) Blue",
"connects_to_hub":False,
"episode":1,
"connections":[
"Toxin Refinery (E1M3) Yellow",
"Toxin Refinery (E1M3) Main"]},
{"name":"Toxin Refinery (E1M3) Yellow",
"connects_to_hub":False,
"episode":1,
"connections":["Toxin Refinery (E1M3) Blue"]},
# Command Control (E1M4)
{"name":"Command Control (E1M4) Main",
"connects_to_hub":True,
"episode":1,
"connections":[
"Command Control (E1M4) Blue",
"Command Control (E1M4) Yellow"]},
{"name":"Command Control (E1M4) Blue",
"connects_to_hub":False,
"episode":1,
"connections":["Command Control (E1M4) Main"]},
{"name":"Command Control (E1M4) Yellow",
"connects_to_hub":False,
"episode":1,
"connections":["Command Control (E1M4) Main"]},
# Phobos Lab (E1M5)
{"name":"Phobos Lab (E1M5) Main",
"connects_to_hub":True,
"episode":1,
"connections":["Phobos Lab (E1M5) Yellow"]},
{"name":"Phobos Lab (E1M5) Yellow",
"connects_to_hub":False,
"episode":1,
"connections":[
"Phobos Lab (E1M5) Main",
"Phobos Lab (E1M5) Blue",
"Phobos Lab (E1M5) Green"]},
{"name":"Phobos Lab (E1M5) Blue",
"connects_to_hub":False,
"episode":1,
"connections":[
"Phobos Lab (E1M5) Green",
"Phobos Lab (E1M5) Yellow"]},
{"name":"Phobos Lab (E1M5) Green",
"connects_to_hub":False,
"episode":1,
"connections":[
"Phobos Lab (E1M5) Main",
"Phobos Lab (E1M5) Blue"]},
@ -73,6 +87,7 @@ regions:List[RegionDict] = [
# Central Processing (E1M6)
{"name":"Central Processing (E1M6) Main",
"connects_to_hub":True,
"episode":1,
"connections":[
"Central Processing (E1M6) Yellow",
"Central Processing (E1M6) Red",
@ -80,140 +95,173 @@ regions:List[RegionDict] = [
"Central Processing (E1M6) Nukage"]},
{"name":"Central Processing (E1M6) Red",
"connects_to_hub":False,
"episode":1,
"connections":["Central Processing (E1M6) Main"]},
{"name":"Central Processing (E1M6) Blue",
"connects_to_hub":False,
"episode":1,
"connections":["Central Processing (E1M6) Main"]},
{"name":"Central Processing (E1M6) Yellow",
"connects_to_hub":False,
"episode":1,
"connections":["Central Processing (E1M6) Main"]},
{"name":"Central Processing (E1M6) Nukage",
"connects_to_hub":False,
"episode":1,
"connections":["Central Processing (E1M6) Yellow"]},
# Computer Station (E1M7)
{"name":"Computer Station (E1M7) Main",
"connects_to_hub":True,
"episode":1,
"connections":[
"Computer Station (E1M7) Red",
"Computer Station (E1M7) Yellow"]},
{"name":"Computer Station (E1M7) Blue",
"connects_to_hub":False,
"episode":1,
"connections":["Computer Station (E1M7) Yellow"]},
{"name":"Computer Station (E1M7) Red",
"connects_to_hub":False,
"episode":1,
"connections":["Computer Station (E1M7) Main"]},
{"name":"Computer Station (E1M7) Yellow",
"connects_to_hub":False,
"episode":1,
"connections":[
"Computer Station (E1M7) Blue",
"Computer Station (E1M7) Courtyard",
"Computer Station (E1M7) Main"]},
{"name":"Computer Station (E1M7) Courtyard",
"connects_to_hub":False,
"episode":1,
"connections":["Computer Station (E1M7) Yellow"]},
# Phobos Anomaly (E1M8)
{"name":"Phobos Anomaly (E1M8) Main",
"connects_to_hub":False,
"episode":1,
"connections":[]},
{"name":"Phobos Anomaly (E1M8) Start",
"connects_to_hub":True,
"episode":1,
"connections":["Phobos Anomaly (E1M8) Main"]},
# 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"]},
{"name":"Military Base (E1M9) Blue",
"connects_to_hub":False,
"episode":1,
"connections":["Military Base (E1M9) Main"]},
{"name":"Military Base (E1M9) Red",
"connects_to_hub":False,
"episode":1,
"connections":["Military Base (E1M9) Main"]},
{"name":"Military Base (E1M9) Yellow",
"connects_to_hub":False,
"episode":1,
"connections":["Military Base (E1M9) Main"]},
# Deimos Anomaly (E2M1)
{"name":"Deimos Anomaly (E2M1) Main",
"connects_to_hub":True,
"episode":2,
"connections":[
"Deimos Anomaly (E2M1) Red",
"Deimos Anomaly (E2M1) Blue"]},
{"name":"Deimos Anomaly (E2M1) Blue",
"connects_to_hub":False,
"episode":2,
"connections":["Deimos Anomaly (E2M1) Main"]},
{"name":"Deimos Anomaly (E2M1) Red",
"connects_to_hub":False,
"episode":2,
"connections":["Deimos Anomaly (E2M1) Main"]},
# 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"]},
{"name":"Containment Area (E2M2) Blue",
"connects_to_hub":False,
"episode":2,
"connections":["Containment Area (E2M2) Main"]},
{"name":"Containment Area (E2M2) Red",
"connects_to_hub":False,
"episode":2,
"connections":["Containment Area (E2M2) Main"]},
{"name":"Containment Area (E2M2) Yellow",
"connects_to_hub":False,
"episode":2,
"connections":["Containment Area (E2M2) Main"]},
# Refinery (E2M3)
{"name":"Refinery (E2M3) Main",
"connects_to_hub":True,
"episode":2,
"connections":["Refinery (E2M3) Blue"]},
{"name":"Refinery (E2M3) Blue",
"connects_to_hub":False,
"episode":2,
"connections":["Refinery (E2M3) Main"]},
# Deimos Lab (E2M4)
{"name":"Deimos Lab (E2M4) Main",
"connects_to_hub":True,
"episode":2,
"connections":["Deimos Lab (E2M4) Blue"]},
{"name":"Deimos Lab (E2M4) Blue",
"connects_to_hub":False,
"episode":2,
"connections":[
"Deimos Lab (E2M4) Main",
"Deimos Lab (E2M4) Yellow"]},
{"name":"Deimos Lab (E2M4) Yellow",
"connects_to_hub":False,
"episode":2,
"connections":["Deimos Lab (E2M4) Blue"]},
# Command Center (E2M5)
{"name":"Command Center (E2M5) Main",
"connects_to_hub":True,
"episode":2,
"connections":[]},
# Halls of the Damned (E2M6)
{"name":"Halls of the Damned (E2M6) Main",
"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"]},
{"name":"Halls of the Damned (E2M6) Yellow",
"connects_to_hub":False,
"episode":2,
"connections":["Halls of the Damned (E2M6) Main"]},
{"name":"Halls of the Damned (E2M6) Blue Yellow Red",
"connects_to_hub":False,
"episode":2,
"connections":["Halls of the Damned (E2M6) Main"]},
{"name":"Halls of the Damned (E2M6) One way Yellow",
"connects_to_hub":False,
"episode":2,
"connections":["Halls of the Damned (E2M6) Main"]},
# Spawning Vats (E2M7)
{"name":"Spawning Vats (E2M7) Main",
"connects_to_hub":True,
"episode":2,
"connections":[
"Spawning Vats (E2M7) Blue",
"Spawning Vats (E2M7) Entrance Secret",
@ -221,207 +269,256 @@ regions:List[RegionDict] = [
"Spawning Vats (E2M7) Yellow"]},
{"name":"Spawning Vats (E2M7) Blue",
"connects_to_hub":False,
"episode":2,
"connections":["Spawning Vats (E2M7) Main"]},
{"name":"Spawning Vats (E2M7) Yellow",
"connects_to_hub":False,
"episode":2,
"connections":["Spawning Vats (E2M7) Main"]},
{"name":"Spawning Vats (E2M7) Red",
"connects_to_hub":False,
"episode":2,
"connections":["Spawning Vats (E2M7) Main"]},
{"name":"Spawning Vats (E2M7) Entrance Secret",
"connects_to_hub":False,
"episode":2,
"connections":["Spawning Vats (E2M7) Main"]},
# Tower of Babel (E2M8)
{"name":"Tower of Babel (E2M8) Main",
"connects_to_hub":True,
"episode":2,
"connections":[]},
# Fortress of Mystery (E2M9)
{"name":"Fortress of Mystery (E2M9) Main",
"connects_to_hub":True,
"episode":2,
"connections":[
"Fortress of Mystery (E2M9) Blue",
"Fortress of Mystery (E2M9) Red",
"Fortress of Mystery (E2M9) Yellow"]},
{"name":"Fortress of Mystery (E2M9) Blue",
"connects_to_hub":False,
"episode":2,
"connections":["Fortress of Mystery (E2M9) Main"]},
{"name":"Fortress of Mystery (E2M9) Red",
"connects_to_hub":False,
"episode":2,
"connections":["Fortress of Mystery (E2M9) Main"]},
{"name":"Fortress of Mystery (E2M9) Yellow",
"connects_to_hub":False,
"episode":2,
"connections":["Fortress of Mystery (E2M9) Main"]},
# Hell Keep (E3M1)
{"name":"Hell Keep (E3M1) Main",
"connects_to_hub":True,
"episode":3,
"connections":["Hell Keep (E3M1) Narrow"]},
{"name":"Hell Keep (E3M1) Narrow",
"connects_to_hub":False,
"episode":3,
"connections":["Hell Keep (E3M1) Main"]},
# Slough of Despair (E3M2)
{"name":"Slough of Despair (E3M2) Main",
"connects_to_hub":True,
"episode":3,
"connections":["Slough of Despair (E3M2) Blue"]},
{"name":"Slough of Despair (E3M2) Blue",
"connects_to_hub":False,
"episode":3,
"connections":["Slough of Despair (E3M2) Main"]},
# Pandemonium (E3M3)
{"name":"Pandemonium (E3M3) Main",
"connects_to_hub":True,
"episode":3,
"connections":["Pandemonium (E3M3) Blue"]},
{"name":"Pandemonium (E3M3) Blue",
"connects_to_hub":False,
"episode":3,
"connections":["Pandemonium (E3M3) Main"]},
# House of Pain (E3M4)
{"name":"House of Pain (E3M4) Main",
"connects_to_hub":True,
"episode":3,
"connections":["House of Pain (E3M4) Blue"]},
{"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"]},
{"name":"House of Pain (E3M4) Red",
"connects_to_hub":False,
"episode":3,
"connections":["House of Pain (E3M4) Blue"]},
{"name":"House of Pain (E3M4) Yellow",
"connects_to_hub":False,
"episode":3,
"connections":["House of Pain (E3M4) Blue"]},
# Unholy Cathedral (E3M5)
{"name":"Unholy Cathedral (E3M5) Main",
"connects_to_hub":True,
"episode":3,
"connections":[
"Unholy Cathedral (E3M5) Yellow",
"Unholy Cathedral (E3M5) Blue"]},
{"name":"Unholy Cathedral (E3M5) Blue",
"connects_to_hub":False,
"episode":3,
"connections":["Unholy Cathedral (E3M5) Main"]},
{"name":"Unholy Cathedral (E3M5) Yellow",
"connects_to_hub":False,
"episode":3,
"connections":["Unholy Cathedral (E3M5) Main"]},
# Mt. Erebus (E3M6)
{"name":"Mt. Erebus (E3M6) Main",
"connects_to_hub":True,
"episode":3,
"connections":["Mt. Erebus (E3M6) Blue"]},
{"name":"Mt. Erebus (E3M6) Blue",
"connects_to_hub":False,
"episode":3,
"connections":["Mt. Erebus (E3M6) Main"]},
# Limbo (E3M7)
{"name":"Limbo (E3M7) Main",
"connects_to_hub":True,
"episode":3,
"connections":[
"Limbo (E3M7) Red",
"Limbo (E3M7) Blue"]},
{"name":"Limbo (E3M7) Blue",
"connects_to_hub":False,
"episode":3,
"connections":["Limbo (E3M7) Main"]},
{"name":"Limbo (E3M7) Red",
"connects_to_hub":False,
"episode":3,
"connections":[
"Limbo (E3M7) Main",
"Limbo (E3M7) Yellow"]},
{"name":"Limbo (E3M7) Yellow",
"connects_to_hub":False,
"episode":3,
"connections":["Limbo (E3M7) Red"]},
# Dis (E3M8)
{"name":"Dis (E3M8) Main",
"connects_to_hub":True,
"episode":3,
"connections":[]},
# Warrens (E3M9)
{"name":"Warrens (E3M9) Main",
"connects_to_hub":True,
"episode":3,
"connections":[
"Warrens (E3M9) Red",
"Warrens (E3M9) Blue",
"Warrens (E3M9) Blue trigger"]},
{"name":"Warrens (E3M9) Red",
"connects_to_hub":False,
"episode":3,
"connections":["Warrens (E3M9) Main"]},
{"name":"Warrens (E3M9) Blue",
"connects_to_hub":False,
"episode":3,
"connections":["Warrens (E3M9) Main"]},
{"name":"Warrens (E3M9) Blue trigger",
"connects_to_hub":False,
"episode":3,
"connections":[]},
# Hell Beneath (E4M1)
{"name":"Hell Beneath (E4M1) Main",
"connects_to_hub":True,
"episode":4,
"connections":[
"Hell Beneath (E4M1) Red",
"Hell Beneath (E4M1) Blue"]},
{"name":"Hell Beneath (E4M1) Red",
"connects_to_hub":False,
"episode":4,
"connections":["Hell Beneath (E4M1) Main"]},
{"name":"Hell Beneath (E4M1) Blue",
"connects_to_hub":False,
"episode":4,
"connections":["Hell Beneath (E4M1) Main"]},
# Perfect Hatred (E4M2)
{"name":"Perfect Hatred (E4M2) Main",
"connects_to_hub":True,
"episode":4,
"connections":[
"Perfect Hatred (E4M2) Blue",
"Perfect Hatred (E4M2) Yellow"]},
{"name":"Perfect Hatred (E4M2) Blue",
"connects_to_hub":False,
"episode":4,
"connections":[
"Perfect Hatred (E4M2) Main",
"Perfect Hatred (E4M2) Cave"]},
{"name":"Perfect Hatred (E4M2) Yellow",
"connects_to_hub":False,
"episode":4,
"connections":[
"Perfect Hatred (E4M2) Main",
"Perfect Hatred (E4M2) Cave"]},
{"name":"Perfect Hatred (E4M2) Cave",
"connects_to_hub":False,
"episode":4,
"connections":[]},
# Sever the Wicked (E4M3)
{"name":"Sever the Wicked (E4M3) Main",
"connects_to_hub":True,
"episode":4,
"connections":["Sever the Wicked (E4M3) Red"]},
{"name":"Sever the Wicked (E4M3) Red",
"connects_to_hub":False,
"episode":4,
"connections":[
"Sever the Wicked (E4M3) Blue",
"Sever the Wicked (E4M3) Main"]},
{"name":"Sever the Wicked (E4M3) Blue",
"connects_to_hub":False,
"episode":4,
"connections":["Sever the Wicked (E4M3) Red"]},
# Unruly Evil (E4M4)
{"name":"Unruly Evil (E4M4) Main",
"connects_to_hub":True,
"episode":4,
"connections":["Unruly Evil (E4M4) Red"]},
{"name":"Unruly Evil (E4M4) Red",
"connects_to_hub":False,
"episode":4,
"connections":["Unruly Evil (E4M4) Main"]},
# They Will Repent (E4M5)
{"name":"They Will Repent (E4M5) Main",
"connects_to_hub":True,
"episode":4,
"connections":["They Will Repent (E4M5) Red"]},
{"name":"They Will Repent (E4M5) Yellow",
"connects_to_hub":False,
"episode":4,
"connections":["They Will Repent (E4M5) Red"]},
{"name":"They Will Repent (E4M5) Blue",
"connects_to_hub":False,
"episode":4,
"connections":["They Will Repent (E4M5) Red"]},
{"name":"They Will Repent (E4M5) Red",
"connects_to_hub":False,
"episode":4,
"connections":[
"They Will Repent (E4M5) Main",
"They Will Repent (E4M5) Yellow",
@ -430,59 +527,73 @@ regions:List[RegionDict] = [
# Against Thee Wickedly (E4M6)
{"name":"Against Thee Wickedly (E4M6) Main",
"connects_to_hub":True,
"episode":4,
"connections":[
"Against Thee Wickedly (E4M6) Blue",
"Against Thee Wickedly (E4M6) Yellow",
"Against Thee Wickedly (E4M6) Red"]},
{"name":"Against Thee Wickedly (E4M6) Red",
"connects_to_hub":False,
"episode":4,
"connections":["Against Thee Wickedly (E4M6) Main"]},
{"name":"Against Thee Wickedly (E4M6) Blue",
"connects_to_hub":False,
"episode":4,
"connections":["Against Thee Wickedly (E4M6) Main"]},
{"name":"Against Thee Wickedly (E4M6) Yellow",
"connects_to_hub":False,
"episode":4,
"connections":["Against Thee Wickedly (E4M6) Main"]},
# 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"]},
{"name":"And Hell Followed (E4M7) Red",
"connects_to_hub":False,
"episode":4,
"connections":["And Hell Followed (E4M7) Main"]},
{"name":"And Hell Followed (E4M7) Blue",
"connects_to_hub":False,
"episode":4,
"connections":["And Hell Followed (E4M7) Main"]},
{"name":"And Hell Followed (E4M7) Yellow",
"connects_to_hub":False,
"episode":4,
"connections":["And Hell Followed (E4M7) Main"]},
# 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"]},
{"name":"Unto the Cruel (E4M8) Yellow",
"connects_to_hub":False,
"episode":4,
"connections":["Unto the Cruel (E4M8) Main"]},
{"name":"Unto the Cruel (E4M8) Red",
"connects_to_hub":False,
"episode":4,
"connections":["Unto the Cruel (E4M8) Main"]},
{"name":"Unto the Cruel (E4M8) Orange",
"connects_to_hub":False,
"episode":4,
"connections":["Unto the Cruel (E4M8) Main"]},
# Fear (E4M9)
{"name":"Fear (E4M9) Main",
"connects_to_hub":True,
"episode":4,
"connections":["Fear (E4M9) Yellow"]},
{"name":"Fear (E4M9) Yellow",
"connects_to_hub":False,
"episode":4,
"connections":["Fear (E4M9) Main"]},
]

View File

@ -7,10 +7,7 @@ if TYPE_CHECKING:
from . import DOOM1993World
def set_rules(doom_1993_world: "DOOM1993World"):
player = doom_1993_world.player
world = doom_1993_world.multiworld
def set_episode1_rules(player, world):
# Hangar (E1M1)
set_rule(world.get_entrance("Hub -> Hangar (E1M1) Main", player), lambda state:
state.has("Hangar (E1M1)", player, 1))
@ -135,6 +132,8 @@ def set_rules(doom_1993_world: "DOOM1993World"):
set_rule(world.get_entrance("Military Base (E1M9) Yellow -> Military Base (E1M9) Main", player), lambda state:
state.has("Military Base (E1M9) - Yellow keycard", player, 1))
def set_episode2_rules(player, world):
# Deimos Anomaly (E2M1)
set_rule(world.get_entrance("Hub -> Deimos Anomaly (E2M1) Main", player), lambda state:
state.has("Deimos Anomaly (E2M1)", player, 1))
@ -263,6 +262,8 @@ def set_rules(doom_1993_world: "DOOM1993World"):
set_rule(world.get_entrance("Fortress of Mystery (E2M9) Yellow -> Fortress of Mystery (E2M9) Main", player), lambda state:
state.has("Fortress of Mystery (E2M9) - Yellow skull key", player, 1))
def set_episode3_rules(player, world):
# Hell Keep (E3M1)
set_rule(world.get_entrance("Hub -> Hell Keep (E3M1) Main", player), lambda state:
state.has("Hell Keep (E3M1)", player, 1))
@ -384,6 +385,8 @@ def set_rules(doom_1993_world: "DOOM1993World"):
set_rule(world.get_entrance("Warrens (E3M9) Blue -> Warrens (E3M9) Main", player), lambda state:
state.has("Warrens (E3M9) - Blue skull key", player, 1))
def set_episode4_rules(player, world):
# Hell Beneath (E4M1)
set_rule(world.get_entrance("Hub -> Hell Beneath (E4M1) Main", player), lambda state:
state.has("Hell Beneath (E4M1)", player, 1))
@ -519,3 +522,16 @@ def set_rules(doom_1993_world: "DOOM1993World"):
set_rule(world.get_entrance("Fear (E4M9) Yellow -> Fear (E4M9) Main", player), lambda state:
state.has("Fear (E4M9) - Yellow skull key", player, 1))
def set_rules(doom_1993_world: "DOOM1993World", included_episodes):
player = doom_1993_world.player
world = doom_1993_world.multiworld
if included_episodes[0]:
set_episode1_rules(player, world)
if included_episodes[1]:
set_episode2_rules(player, world)
if included_episodes[2]:
set_episode3_rules(player, world)
if included_episodes[3]:
set_episode4_rules(player, world)

View File

@ -100,6 +100,9 @@ class DOOM1993World(World):
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)
@ -148,7 +151,7 @@ class DOOM1993World(World):
return True
def set_rules(self):
Rules.set_rules(self)
Rules.set_rules(self, self.included_episodes)
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