From 4ae885f392261b939e6f21b47d545f609c6e1965 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 27 Aug 2025 17:14:57 -0400 Subject: Set apworld victory condition --- apworld/player_logic.py | 60 ++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 25 deletions(-) (limited to 'apworld/player_logic.py') diff --git a/apworld/player_logic.py b/apworld/player_logic.py index edf8c4f..83c16f2 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py @@ -63,6 +63,8 @@ class Lingo2PlayerLogic: world: "Lingo2World" locations_by_room: dict[int, list[PlayerLocation]] + event_loc_item_by_room: dict[int, dict[str, str]] + item_by_door: dict[int, str] panel_reqs: dict[int, AccessRequirements] @@ -74,6 +76,7 @@ class Lingo2PlayerLogic: def __init__(self, world: "Lingo2World"): self.world = world self.locations_by_room = {} + self.event_loc_item_by_room = {} self.item_by_door = {} self.panel_reqs = dict() self.proxy_reqs = dict() @@ -105,6 +108,14 @@ class Lingo2PlayerLogic: self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id, AccessRequirements())) + event_name = f"{ending.name.capitalize()} Ending (Achieved)" + item_name = event_name + + if world.options.victory_condition.current_key.removesuffix("_ending").upper() == ending.name: + item_name = "Victory" + + self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = item_name + def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements: if answer is None: if panel_id not in self.panel_reqs: @@ -130,6 +141,12 @@ class Lingo2PlayerLogic: proxy_reqs = AccessRequirements() proxy_reqs.add_solution(proxy.answer) + reqs.or_logic.append([proxy_reqs]) + + if not any(proxy.answer == panel.answer for proxy in panel.proxies): + proxy_reqs = AccessRequirements() + proxy_reqs.add_solution(panel.answer) + reqs.or_logic.append([proxy_reqs]) else: reqs.add_solution(panel.answer) @@ -158,32 +175,25 @@ class Lingo2PlayerLogic: door = self.world.static_logic.objects.doors[door_id] reqs = AccessRequirements() - use_item = False - if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and self.world.options.shuffle_doors: - use_item = True - - if use_item: - reqs.items.add(self.world.static_logic.get_door_item_name(door.id)) + # TODO: complete_at, control_center_color, switches, keyholders + if not door.HasField("complete_at") or door.complete_at == 0: + for proxy in door.panels: + panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None) + reqs.merge(panel_reqs) + elif door.complete_at == 1: + reqs.or_logic.append([self.get_panel_reqs(proxy.panel, + proxy.answer if proxy.HasField("answer") else None) + for proxy in door.panels]) else: - # TODO: complete_at, control_center_color, switches, keyholders - if not door.HasField("complete_at") or door.complete_at == 0: - for proxy in door.panels: - panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None) - reqs.merge(panel_reqs) - elif door.complete_at == 1: - reqs.or_logic.append([self.get_panel_reqs(proxy.panel, - proxy.answer if proxy.HasField("answer") else None) - for proxy in door.panels]) - else: - # TODO: Handle complete_at > 1 - pass - - for room in door.rooms: - reqs.rooms.add(self.world.static_logic.get_room_region_name(room)) - - for sub_door_id in door.doors: - sub_reqs = self.get_door_open_reqs(sub_door_id) - reqs.merge(sub_reqs) + # TODO: Handle complete_at > 1 + pass + + for room in door.rooms: + reqs.rooms.add(self.world.static_logic.get_room_region_name(room)) + + for sub_door_id in door.doors: + sub_reqs = self.get_door_open_reqs(sub_door_id) + reqs.merge(sub_reqs) return reqs -- cgit 1.4.1