From d79984b099c3f762b95d3b4257bef113d3a8d6ee Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 7 Sep 2025 15:42:00 -0400 Subject: Added door groups --- apworld/options.py | 9 +++++++++ apworld/player_logic.py | 35 +++++++++++++++++++++++++++++------ apworld/static_logic.py | 3 +++ 3 files changed, 41 insertions(+), 6 deletions(-) (limited to 'apworld') diff --git a/apworld/options.py b/apworld/options.py index f7dc5bd..dbf09e7 100644 --- a/apworld/options.py +++ b/apworld/options.py @@ -8,6 +8,14 @@ class ShuffleDoors(Toggle): display_name = "Shuffle Doors" +class ShuffleControlCenterColors(Toggle): + """ + Some doors open after solving the COLOR panel in the Control Center. If this option is enabled, these doors will + instead open upon receiving an item. + """ + display_name = "Shuffle Control Center Colors" + + class ShuffleLetters(Choice): """ Controls how letter unlocks are handled. Note that H1, I1, N1, and T1 will always be present at their vanilla @@ -71,6 +79,7 @@ class VictoryCondition(Choice): @dataclass class Lingo2Options(PerGameCommonOptions): shuffle_doors: ShuffleDoors + shuffle_control_center_colors: ShuffleControlCenterColors shuffle_letters: ShuffleLetters keyholder_sanity: KeyholderSanity daedalus_roof_access: DaedalusRoofAccess diff --git a/apworld/player_logic.py b/apworld/player_logic.py index 5cb9011..ce9a4e5 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py @@ -123,16 +123,39 @@ class Lingo2PlayerLogic: self.item_by_door[progressive.doors[i]] = (progressive.name, i + 1) self.real_items.append(progressive.name) + for door_group in world.static_logic.objects.door_groups: + if door_group.type == data_pb2.DoorGroupType.CONNECTOR and not self.world.options.shuffle_doors: + continue + + if (door_group.type == data_pb2.DoorGroupType.COLOR_CONNECTOR and + not self.world.options.shuffle_control_center_colors): + continue + + for door in door_group.doors: + self.item_by_door[door] = (door_group.name, 1) + + self.real_items.append(door_group.name) + # We iterate through the doors in two parts because it is essential that we determine which doors are shuffled # before we calculate any access requirements. for door in world.static_logic.objects.doors: - if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and self.world.options.shuffle_doors: - if door.id in self.item_by_door: - continue + if door.type in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: + continue + + if door.id in self.item_by_door: + continue + + if (door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and + not self.world.options.shuffle_doors): + continue + + if (door.type == data_pb2.DoorType.CONTROL_CENTER_COLOR and + not self.world.options.shuffle_control_center_colors): + continue - door_item_name = self.world.static_logic.get_door_item_name(door) - self.item_by_door[door.id] = (door_item_name, 1) - self.real_items.append(door_item_name) + door_item_name = self.world.static_logic.get_door_item_name(door) + self.item_by_door[door.id] = (door_item_name, 1) + self.real_items.append(door_item_name) for door in world.static_logic.objects.doors: if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: diff --git a/apworld/static_logic.py b/apworld/static_logic.py index b699d59..3f6cdea 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py @@ -44,6 +44,9 @@ class Lingo2StaticLogic: for progressive in self.objects.progressives: self.item_id_to_name[progressive.ap_id] = progressive.name + for door_group in self.objects.door_groups: + self.item_id_to_name[door_group.ap_id] = door_group.name + for keyholder in self.objects.keyholders: if keyholder.HasField("key"): location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder" -- cgit 1.4.1