From c0c5431800d0306d01814e9902566c9b4fc9220b Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 7 Aug 2025 17:18:47 -0400 Subject: Assign AP IDs to doors and panels --- apworld/__init__.py | 6 +++--- apworld/player_logic.py | 10 +++------- apworld/regions.py | 3 ++- apworld/static_logic.py | 23 ++++++++++++++++++++++- 4 files changed, 30 insertions(+), 12 deletions(-) (limited to 'apworld') diff --git a/apworld/__init__.py b/apworld/__init__.py index 013910e..1544c7b 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py @@ -25,10 +25,10 @@ class Lingo2World(World): options_dataclass = Lingo2Options options: Lingo2Options - item_name_to_id = {} - location_name_to_id = {} - static_logic = Lingo2StaticLogic() + item_name_to_id = static_logic.item_name_to_id + location_name_to_id = static_logic.location_name_to_id + player_logic: Lingo2PlayerLogic def generate_early(self): diff --git a/apworld/player_logic.py b/apworld/player_logic.py index f54573f..675c6ae 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py @@ -1,3 +1,4 @@ +from .generated import common_pb2 as common_pb2 from typing import TYPE_CHECKING, NamedTuple if TYPE_CHECKING: @@ -5,7 +6,6 @@ if TYPE_CHECKING: class PlayerLocation(NamedTuple): - name: str code: int | None @@ -15,10 +15,6 @@ class Lingo2PlayerLogic: def __init__(self, world: "Lingo2World"): self.locations_by_room = {} - code = 1 for door in world.static_logic.objects.doors: - if not door.HasField("room_id"): - continue - - self.locations_by_room.setdefault(door.room_id, []).append(PlayerLocation(door.name, code)) - code += 1 + if door.type == common_pb2.DoorType.STANDARD: + self.locations_by_room.setdefault(door.room_id, []).append(PlayerLocation(door.ap_id)) diff --git a/apworld/regions.py b/apworld/regions.py index 24c2281..d388678 100644 --- a/apworld/regions.py +++ b/apworld/regions.py @@ -11,7 +11,8 @@ def create_region(room, world: "Lingo2World") -> Region: new_region = Region(room.name, world.player, world.multiworld) for location in world.player_logic.locations_by_room.get(room.id, {}): - new_location = Lingo2Location(world.player, location.name, location.code, new_region) + new_location = Lingo2Location(world.player, world.static_logic.location_id_to_name[location.code], + location.code, new_region) new_region.locations.append(new_location) return new_region diff --git a/apworld/static_logic.py b/apworld/static_logic.py index 6c38f1f..d3ed85c 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py @@ -1,9 +1,30 @@ +from .generated import common_pb2 as common_pb2 from .generated import data_pb2 as data_pb2 import pkgutil class Lingo2StaticLogic: + item_id_to_name: dict[int, str] + location_id_to_name: dict[int, str] + + item_name_to_id: dict[str, int] + location_name_to_id: dict[str, int] + def __init__(self): - file = pkgutil.get_data(__name__, "generated/data.binpb") + self.item_id_to_name = {} + self.location_id_to_name = {} + file = pkgutil.get_data(__name__, "generated/data.binpb") self.objects = data_pb2.AllObjects() self.objects.ParseFromString(bytearray(file)) + + for door in self.objects.doors: + if door.type == common_pb2.DoorType.STANDARD: + location_name = f"{self.objects.rooms[door.room_id].display_name} - {door.name}" + self.location_id_to_name[door.ap_id] = location_name + + if door.type != common_pb2.DoorType.EVENT: + item_name = f"{self.objects.rooms[door.room_id].display_name} - {door.name}" + self.item_id_to_name[door.ap_id] = item_name + + self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()} + self.location_name_to_id = {name: ap_id for ap_id, name in self.location_id_to_name.items()} -- cgit 1.4.1