From a3972a65b9b443a6085a6ac40b153442e190f382 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 1 Sep 2025 12:54:46 -0400 Subject: Added progressive doors --- apworld/player_logic.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'apworld/player_logic.py') diff --git a/apworld/player_logic.py b/apworld/player_logic.py index c6465f6..e08f644 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py @@ -23,6 +23,7 @@ def calculate_letter_histogram(solution: str) -> dict[str, int]: class AccessRequirements: items: set[str] + progressives: dict[str, int] rooms: set[str] symbols: set[str] letters: dict[str, int] @@ -32,6 +33,7 @@ class AccessRequirements: def __init__(self): self.items = set() + self.progressives = dict() self.rooms = set() self.symbols = set() self.letters = dict() @@ -47,6 +49,9 @@ class AccessRequirements: for item in other.items: self.items.add(item) + for item, amount in other.progressives.items(): + self.progressives[item] = max(amount, self.progressives.get(item, 0)) + for room in other.rooms: self.rooms.add(room) @@ -63,6 +68,8 @@ class AccessRequirements: parts = [] if len(self.items) > 0: parts.append(f"items={self.items}") + if len(self.progressives) > 0: + parts.append(f"progressives={self.progressives}") if len(self.rooms) > 0: parts.append(f"rooms={self.rooms}") if len(self.symbols) > 0: @@ -85,7 +92,7 @@ class Lingo2PlayerLogic: locations_by_room: dict[int, list[PlayerLocation]] event_loc_item_by_room: dict[int, dict[str, str]] - item_by_door: dict[int, str] + item_by_door: dict[int, tuple[str, int]] panel_reqs: dict[int, AccessRequirements] proxy_reqs: dict[int, dict[str, AccessRequirements]] @@ -103,12 +110,21 @@ class Lingo2PlayerLogic: self.door_reqs = dict() self.real_items = list() + if self.world.options.shuffle_doors: + for progressive in world.static_logic.objects.progressives: + for i in range(0, len(progressive.doors)): + self.item_by_door[progressive.doors[i]] = (progressive.name, i + 1) + self.real_items.append(progressive.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 + door_item_name = self.world.static_logic.get_door_item_name(door) - self.item_by_door[door.id] = door_item_name + 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: @@ -261,7 +277,12 @@ class Lingo2PlayerLogic: def get_door_open_reqs(self, door_id: int) -> AccessRequirements: if door_id in self.item_by_door: reqs = AccessRequirements() - reqs.items.add(self.item_by_door.get(door_id)) + + item_name, amount = self.item_by_door.get(door_id) + if amount == 1: + reqs.items.add(item_name) + else: + reqs.progressives[item_name] = amount return reqs else: -- cgit 1.4.1