From 7f82beb120e222ace6c258fc3982b5988f9ae070 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 2 Sep 2025 14:09:35 -0400 Subject: Added keyholder sanity --- apworld/__init__.py | 4 +- apworld/options.py | 10 ++++ apworld/player_logic.py | 9 ++++ apworld/static_logic.py | 22 +++++--- data/ids.yaml | 60 ++++++++++++++++++++++ data/maps/control_center/rooms/Main Area.txtpb | 4 ++ data/maps/daedalus/rooms/C Keyholder.txtpb | 1 + data/maps/daedalus/rooms/D Keyholder.txtpb | 1 + data/maps/daedalus/rooms/F Keyholder.txtpb | 1 + .../daedalus/rooms/Number Paintings Area.txtpb | 1 + data/maps/daedalus/rooms/Outside House.txtpb | 1 + data/maps/four_rooms/rooms/Keyholder Room.txtpb | 1 + data/maps/the_congruent/rooms/T Keyholder.txtpb | 1 + data/maps/the_extravagant/rooms/X Plus.txtpb | 1 + data/maps/the_gallery/rooms/Main Area.txtpb | 1 + data/maps/the_great/rooms/North Landscape.txtpb | 1 + data/maps/the_hive/rooms/Main Area.txtpb | 1 + data/maps/the_jubilant/rooms/Side Area.txtpb | 1 + data/maps/the_nuanced/rooms/Main Room.txtpb | 1 + data/maps/the_parthenon/rooms/U Keyholder.txtpb | 1 + data/maps/the_partial/rooms/Obverse Side.txtpb | 1 + data/maps/the_quiet/rooms/Keyholder Room.txtpb | 1 + data/maps/the_shop/rooms/Main Area.txtpb | 1 + data/maps/the_talented/rooms/Main Area.txtpb | 1 + data/maps/the_tenacious/rooms/Main Area.txtpb | 1 + data/maps/the_unkempt/rooms/Main Area.txtpb | 1 + data/maps/the_unkempt/rooms/V Keyholder.txtpb | 1 + data/maps/the_unkempt/rooms/W Keyholder.txtpb | 1 + proto/data.proto | 2 + proto/human.proto | 8 +++ tools/assign_ids/main.cpp | 23 +++++++++ tools/datapacker/main.cpp | 12 +++++ tools/util/ids_yaml_format.cpp | 15 ++++++ 33 files changed, 183 insertions(+), 8 deletions(-) diff --git a/apworld/__init__.py b/apworld/__init__.py index 4e5777a..1f1e6fe 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py @@ -65,7 +65,9 @@ class Lingo2World(World): def fill_slot_data(self): slot_options = [ - "victory_condition", "shuffle_doors", + "keyholder_sanity", + "shuffle_doors", + "victory_condition", ] slot_data = { diff --git a/apworld/options.py b/apworld/options.py index d984beb..dacbc46 100644 --- a/apworld/options.py +++ b/apworld/options.py @@ -8,6 +8,15 @@ class ShuffleDoors(Toggle): display_name = "Shuffle Doors" +class KeyholderSanity(Toggle): + """ + If enabled, 26 locations will be created for placing each key into its respective Green Ending keyholder. + + NOTE: This does not apply to the two disappearing keyholders in The Congruent, as they are not part of Green Ending. + """ + display_name = "Keyholder Sanity" + + class VictoryCondition(Choice): """Victory condition.""" display_name = "Victory Condition" @@ -29,4 +38,5 @@ class VictoryCondition(Choice): @dataclass class Lingo2Options(PerGameCommonOptions): shuffle_doors: ShuffleDoors + keyholder_sanity: KeyholderSanity victory_condition: VictoryCondition diff --git a/apworld/player_logic.py b/apworld/player_logic.py index e08f644..dc1bdf0 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py @@ -166,6 +166,15 @@ class Lingo2PlayerLogic: self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = item_name + if self.world.options.keyholder_sanity: + for keyholder in world.static_logic.objects.keyholders: + if keyholder.HasField("key"): + reqs = AccessRequirements() + reqs.letters[keyholder.key.upper()] = 1 + + self.locations_by_room.setdefault(keyholder.room_id, []).append(PlayerLocation(keyholder.ap_id, + reqs)) + def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements: if answer is None: if panel_id not in self.panel_reqs: diff --git a/apworld/static_logic.py b/apworld/static_logic.py index 0613474..a945bc0 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py @@ -44,6 +44,11 @@ class Lingo2StaticLogic: for progressive in self.objects.progressives: self.item_id_to_name[progressive.ap_id] = progressive.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" + self.location_id_to_name[keyholder.ap_id] = location_name + self.item_id_to_name[self.objects.special_ids["Nothing"]] = "Nothing" self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()} @@ -57,13 +62,7 @@ class Lingo2StaticLogic: return self.get_door_item_name(door_id) def get_door_location_name(self, door: data_pb2.Door) -> str: - game_map = self.objects.maps[door.map_id] - room = self.objects.rooms[door.room_id] - - if room.HasField("panel_display_name"): - map_part = f"{game_map.display_name} ({room.panel_display_name})" - else: - map_part = game_map.display_name + map_part = self.get_room_object_location_prefix(door) if door.HasField("location_name"): return f"{map_part} - {door.location_name}" @@ -129,3 +128,12 @@ class Lingo2StaticLogic: def get_room_object_map_name(self, obj) -> str: return self.get_map_object_map_name(self.objects.rooms[obj.room_id]) + + def get_room_object_location_prefix(self, obj) -> str: + room = self.objects.rooms[obj.room_id] + game_map = self.objects.maps[room.map_id] + + if room.HasField("panel_display_name"): + return f"{game_map.display_name} ({room.panel_display_name})" + else: + return game_map.display_name diff --git a/data/ids.yaml b/data/ids.yaml index 3aff6ea..b66d6a9 100644 --- a/data/ids.yaml +++ b/data/ids.yaml @@ -20,6 +20,11 @@ maps: panels: COLOR: 2726 Letters: 2727 + keyholders: + 1: 2760 + 2: 2761 + 3: 2762 + 4: 2763 Partial Entrance: panels: PARTIAL: 2729 @@ -155,6 +160,9 @@ maps: Brown Smiley: panels: OTHERS: 1667 + C Keyholder: + keyholders: + C: 2755 Castle: panels: FIVE (Blue): 1673 @@ -265,6 +273,9 @@ maps: SUMMER: 1754 WORD: 1753 WORDWORD: 1761 + D Keyholder: + keyholders: + D: 2759 Dark Light Exit: panels: GASKET: 1763 @@ -287,6 +298,9 @@ maps: Eye Painting: panels: REVILED: 1777 + F Keyholder: + keyholders: + F: 2756 F2 Room: panels: CAST: 1782 @@ -480,6 +494,8 @@ maps: panels: GOING: 1934 TURN: 1935 + keyholders: + G: 2757 Nursery: panels: "?": 1937 @@ -547,6 +563,8 @@ maps: WALLS: 1986 WHISPER: 1978 WING: 1979 + keyholders: + H: 2758 Outside Magic Room: panels: WIZARD: 1988 @@ -1160,6 +1178,9 @@ maps: SWAY: 24 TERROR: 20 TURN: 22 + Keyholder Room: + keyholders: + A: 2773 Synonyms Room: panels: ADORE: 26 @@ -1452,6 +1473,9 @@ maps: panels: CIVIL: 216 CRABS: 217 + T Keyholder: + keyholders: + T: 2754 doors: C Keyholder Blocker: 176 C2 Door: 177 @@ -1760,6 +1784,8 @@ maps: X Plus: panels: ROSE: 405 + keyholders: + M: 2766 X Plus Middle Leg: panels: COLONY: 403 @@ -1789,6 +1815,9 @@ maps: Daedalus Extension: panels: WHERE: 433 + Main Area: + keyholders: + P: 2765 doors: Ancient Painting: 428 Between Painting: 414 @@ -1973,6 +2002,8 @@ maps: LAUGH FINISHED: 573 PLANTS: 570 WEATHER: 568 + keyholders: + X: 2770 Outside Jail: panels: GUT: 575 @@ -2120,6 +2151,8 @@ maps: WAS: 631 WINGS: 662 YELL: 636 + keyholders: + B: 2769 Mastery Room: masteries: MASTERY: 666 @@ -2186,6 +2219,8 @@ maps: FLASHBACK: 705 PUSH: 703 PUSHBACK: 702 + keyholders: + J: 2772 doors: Side Door: 687 the_keen: @@ -2297,6 +2332,8 @@ maps: NAY: 774 NIGH: 781 TORE: 787 + keyholders: + S: 2767 doors: Left Room Puzzles: 763 Main Room Door: 2750 @@ -2404,6 +2441,9 @@ maps: CLEOPATRA: 859 NAPOLEON: 860 XERXES: 857 + U Keyholder: + keyholders: + U: 2777 doors: K2 Door: 852 the_partial: @@ -2427,6 +2467,8 @@ maps: TON: 878 TURN: 875 UP: 870 + keyholders: + L: 2771 Reverse Side: panels: BRO: 884 @@ -2545,6 +2587,9 @@ maps: Turtle Entrance: 891 the_quiet: rooms: + Keyholder Room: + keyholders: + Q: 2778 Main Area: panels: BEE: 979 @@ -2791,6 +2836,8 @@ maps: STIM: 1148 STONE: 1142 TADPOLES: 1159 + keyholders: + N: 2779 doors: Books Puzzles: 1136 Games Puzzles: 1137 @@ -3145,6 +3192,8 @@ maps: SWINE (Brown): 2446 WIFE (Black): 2440 WIFE (Brown): 2447 + keyholders: + Y: 2764 doors: Black Side Panels: 2427 Brown Side Panels: 2428 @@ -3157,6 +3206,9 @@ maps: Control Center Entrance: panels: ZERO: 2455 + Main Area: + keyholders: + K: 2768 Mastery: masteries: MASTERY: 2456 @@ -3361,6 +3413,8 @@ maps: WAYS: 2621 WHILE: 2613 ZOO: 2615 + keyholders: + I: 2775 Middle Room: panels: FELLOW: 2624 @@ -3408,6 +3462,12 @@ maps: UNINTERESTED: 2650 UNIRONIC: 2656 UNLUCKY: 2654 + V Keyholder: + keyholders: + V: 2776 + W Keyholder: + keyholders: + W: 2774 doors: Cog Rhino Hug Rug: 2586 Control Center Orange Door: 2582 diff --git a/data/maps/control_center/rooms/Main Area.txtpb b/data/maps/control_center/rooms/Main Area.txtpb index 44b0f79..bf81e26 100644 --- a/data/maps/control_center/rooms/Main Area.txtpb +++ b/data/maps/control_center/rooms/Main Area.txtpb @@ -30,18 +30,22 @@ panels { keyholders { name: "1" path: "Components/KeyHolders/keyHolder" + key: "z" } keyholders { name: "2" path: "Components/KeyHolders/keyHolder2" + key: "e" } keyholders { name: "3" path: "Components/KeyHolders/keyHolder3" + key: "r" } keyholders { name: "4" path: "Components/KeyHolders/keyHolder4" + key: "o" } ports { name: "RIGHT" diff --git a/data/maps/daedalus/rooms/C Keyholder.txtpb b/data/maps/daedalus/rooms/C Keyholder.txtpb index cc8548c..ef10a90 100644 --- a/data/maps/daedalus/rooms/C Keyholder.txtpb +++ b/data/maps/daedalus/rooms/C Keyholder.txtpb @@ -3,4 +3,5 @@ panel_display_name: "North Area" keyholders { name: "C" path: "Components/KeyHolders/keyHolderC" + key: "c" } diff --git a/data/maps/daedalus/rooms/D Keyholder.txtpb b/data/maps/daedalus/rooms/D Keyholder.txtpb index 2521ab2..a5852be 100644 --- a/data/maps/daedalus/rooms/D Keyholder.txtpb +++ b/data/maps/daedalus/rooms/D Keyholder.txtpb @@ -3,4 +3,5 @@ panel_display_name: "Plum Room" keyholders { name: "D" path: "Components/KeyHolders/keyHolderD" + key: "d" } diff --git a/data/maps/daedalus/rooms/F Keyholder.txtpb b/data/maps/daedalus/rooms/F Keyholder.txtpb index 662f76d..b424c6a 100644 --- a/data/maps/daedalus/rooms/F Keyholder.txtpb +++ b/data/maps/daedalus/rooms/F Keyholder.txtpb @@ -3,4 +3,5 @@ panel_display_name: "West Area" keyholders { name: "F" path: "Components/KeyHolders/keyHolderF" + key: "f" } diff --git a/data/maps/daedalus/rooms/Number Paintings Area.txtpb b/data/maps/daedalus/rooms/Number Paintings Area.txtpb index 15c8875..c89bfcf 100644 --- a/data/maps/daedalus/rooms/Number Paintings Area.txtpb +++ b/data/maps/daedalus/rooms/Number Paintings Area.txtpb @@ -17,6 +17,7 @@ panels { keyholders { name: "G" path: "Components/KeyHolders/keyHolderG" + key: "g" } paintings { name: "WON" diff --git a/data/maps/daedalus/rooms/Outside House.txtpb b/data/maps/daedalus/rooms/Outside House.txtpb index fd3f5f0..fed9dda 100644 --- a/data/maps/daedalus/rooms/Outside House.txtpb +++ b/data/maps/daedalus/rooms/Outside House.txtpb @@ -75,6 +75,7 @@ panels { keyholders { name: "H" path: "Components/KeyHolders/keyHolderH" + key: "h" } paintings { name: "CASTLE2" diff --git a/data/maps/four_rooms/rooms/Keyholder Room.txtpb b/data/maps/four_rooms/rooms/Keyholder Room.txtpb index e7c7fa6..13c3dce 100644 --- a/data/maps/four_rooms/rooms/Keyholder Room.txtpb +++ b/data/maps/four_rooms/rooms/Keyholder Room.txtpb @@ -2,4 +2,5 @@ name: "Keyholder Room" keyholders { name: "A" path: "Components/KeyHolders/keyHolderA" + key: "a" } diff --git a/data/maps/the_congruent/rooms/T Keyholder.txtpb b/data/maps/the_congruent/rooms/T Keyholder.txtpb index 360b030..143ea53 100644 --- a/data/maps/the_congruent/rooms/T Keyholder.txtpb +++ b/data/maps/the_congruent/rooms/T Keyholder.txtpb @@ -2,4 +2,5 @@ name: "T Keyholder" keyholders { name: "T" path: "Components/KeyHolders/keyHolderT" + key: "t" } diff --git a/data/maps/the_extravagant/rooms/X Plus.txtpb b/data/maps/the_extravagant/rooms/X Plus.txtpb index 89b6da7..a1c4b9d 100644 --- a/data/maps/the_extravagant/rooms/X Plus.txtpb +++ b/data/maps/the_extravagant/rooms/X Plus.txtpb @@ -23,4 +23,5 @@ paintings { keyholders { name: "M" path: "Components/KeyHolders/keyHolderM" + key: "m" } diff --git a/data/maps/the_gallery/rooms/Main Area.txtpb b/data/maps/the_gallery/rooms/Main Area.txtpb index 5ba6b25..bc1606d 100644 --- a/data/maps/the_gallery/rooms/Main Area.txtpb +++ b/data/maps/the_gallery/rooms/Main Area.txtpb @@ -2,6 +2,7 @@ name: "Main Area" keyholders { name: "P" path: "Components/KeyHolders/keyHolderP" + key: "p" } paintings { name: "OWL" diff --git a/data/maps/the_great/rooms/North Landscape.txtpb b/data/maps/the_great/rooms/North Landscape.txtpb index f0fde77..fb11c42 100644 --- a/data/maps/the_great/rooms/North Landscape.txtpb +++ b/data/maps/the_great/rooms/North Landscape.txtpb @@ -52,6 +52,7 @@ panels { keyholders { name: "X" path: "Components/KeyHolders/keyHolderX" + key: "x" } ports { name: "INVISIBLE" diff --git a/data/maps/the_hive/rooms/Main Area.txtpb b/data/maps/the_hive/rooms/Main Area.txtpb index 0f73682..013390a 100644 --- a/data/maps/the_hive/rooms/Main Area.txtpb +++ b/data/maps/the_hive/rooms/Main Area.txtpb @@ -268,6 +268,7 @@ panels { keyholders { name: "B" path: "Components/KeyHolders/keyHolderB" + key: "b" } ports { name: "DAED1" diff --git a/data/maps/the_jubilant/rooms/Side Area.txtpb b/data/maps/the_jubilant/rooms/Side Area.txtpb index e924762..807f044 100644 --- a/data/maps/the_jubilant/rooms/Side Area.txtpb +++ b/data/maps/the_jubilant/rooms/Side Area.txtpb @@ -38,4 +38,5 @@ panels { keyholders { name: "J" path: "Components/KeyHolders/keyHolderJ" + key: "j" } diff --git a/data/maps/the_nuanced/rooms/Main Room.txtpb b/data/maps/the_nuanced/rooms/Main Room.txtpb index 8da3b5f..da89bd8 100644 --- a/data/maps/the_nuanced/rooms/Main Room.txtpb +++ b/data/maps/the_nuanced/rooms/Main Room.txtpb @@ -112,4 +112,5 @@ ports { keyholders { name: "S" path: "Components/KeyHolders/keyHolderS" + key: "s" } diff --git a/data/maps/the_parthenon/rooms/U Keyholder.txtpb b/data/maps/the_parthenon/rooms/U Keyholder.txtpb index 8248df8..0a5c31b 100644 --- a/data/maps/the_parthenon/rooms/U Keyholder.txtpb +++ b/data/maps/the_parthenon/rooms/U Keyholder.txtpb @@ -2,4 +2,5 @@ name: "U Keyholder" keyholders { name: "U" path: "Components/KeyHolders/keyHolderU" + key: "u" } diff --git a/data/maps/the_partial/rooms/Obverse Side.txtpb b/data/maps/the_partial/rooms/Obverse Side.txtpb index 75cd9bb..c0ce04b 100644 --- a/data/maps/the_partial/rooms/Obverse Side.txtpb +++ b/data/maps/the_partial/rooms/Obverse Side.txtpb @@ -106,6 +106,7 @@ keyholders { # This is one of the ones that's misnamed within the game. name: "L" path: "Components/KeyHolders/keyHolderI" + key: "l" } paintings { name: "F" diff --git a/data/maps/the_quiet/rooms/Keyholder Room.txtpb b/data/maps/the_quiet/rooms/Keyholder Room.txtpb index d0f2677..d3cab73 100644 --- a/data/maps/the_quiet/rooms/Keyholder Room.txtpb +++ b/data/maps/the_quiet/rooms/Keyholder Room.txtpb @@ -2,4 +2,5 @@ name: "Keyholder Room" keyholders { name: "Q" path: "Components/KeyHolders/keyHolderQ" + key: "q" } diff --git a/data/maps/the_shop/rooms/Main Area.txtpb b/data/maps/the_shop/rooms/Main Area.txtpb index d45e0f0..db93fe1 100644 --- a/data/maps/the_shop/rooms/Main Area.txtpb +++ b/data/maps/the_shop/rooms/Main Area.txtpb @@ -160,4 +160,5 @@ ports { keyholders { name: "N" path: "Components/KeyHolders/keyHolderN" + key: "n" } diff --git a/data/maps/the_talented/rooms/Main Area.txtpb b/data/maps/the_talented/rooms/Main Area.txtpb index cc3e222..f99be48 100644 --- a/data/maps/the_talented/rooms/Main Area.txtpb +++ b/data/maps/the_talented/rooms/Main Area.txtpb @@ -107,6 +107,7 @@ panels { keyholders { name: "Y" path: "Components/KeyHolders/keyHolderY" + key: "y" } ports { name: "GREAT" diff --git a/data/maps/the_tenacious/rooms/Main Area.txtpb b/data/maps/the_tenacious/rooms/Main Area.txtpb index 8190827..18356e7 100644 --- a/data/maps/the_tenacious/rooms/Main Area.txtpb +++ b/data/maps/the_tenacious/rooms/Main Area.txtpb @@ -2,4 +2,5 @@ name: "Main Area" keyholders { name: "K" path: "Components/KeyHolders/keyHolderK" + key: "k" } diff --git a/data/maps/the_unkempt/rooms/Main Area.txtpb b/data/maps/the_unkempt/rooms/Main Area.txtpb index ed3ce21..b5d29c4 100644 --- a/data/maps/the_unkempt/rooms/Main Area.txtpb +++ b/data/maps/the_unkempt/rooms/Main Area.txtpb @@ -212,6 +212,7 @@ panels { keyholders { name: "I" path: "Components/KeyHolders/keyHolderL" + key: "i" } ports { name: "GREAT" diff --git a/data/maps/the_unkempt/rooms/V Keyholder.txtpb b/data/maps/the_unkempt/rooms/V Keyholder.txtpb index 0906b2e..8a4941d 100644 --- a/data/maps/the_unkempt/rooms/V Keyholder.txtpb +++ b/data/maps/the_unkempt/rooms/V Keyholder.txtpb @@ -2,4 +2,5 @@ name: "V Keyholder" keyholders { name: "V" path: "Components/KeyHolders/keyHolderV" + key: "v" } diff --git a/data/maps/the_unkempt/rooms/W Keyholder.txtpb b/data/maps/the_unkempt/rooms/W Keyholder.txtpb index ae367b2..e16f997 100644 --- a/data/maps/the_unkempt/rooms/W Keyholder.txtpb +++ b/data/maps/the_unkempt/rooms/W Keyholder.txtpb @@ -2,4 +2,5 @@ name: "W Keyholder" keyholders { name: "W" path: "Components/KeyHolders/keyHolderW" + key: "w" } diff --git a/proto/data.proto b/proto/data.proto index b627e83..9cdf5fd 100644 --- a/proto/data.proto +++ b/proto/data.proto @@ -162,10 +162,12 @@ message Port { message KeyholderData { optional uint64 id = 1; + optional uint64 ap_id = 6; optional uint64 room_id = 2; optional string name = 3; optional string path = 4; + optional string key = 5; } message Letter { diff --git a/proto/human.proto b/proto/human.proto index 8d882da..e0378cc 100644 --- a/proto/human.proto +++ b/proto/human.proto @@ -142,6 +142,13 @@ message HumanPort { message HumanKeyholder { optional string name = 1; optional string path = 2; + + // If this is set, the keyholder will become a location when keyholder shuffle + // is enabled. This value specifies the key that is required to clear the + // location. It should be the same as the key needed for Green Ending. The + // only cases when this shouldn't be set is the two disappearing keyholders in + // The Congruent. + optional string key = 3; } message HumanLetter { @@ -196,6 +203,7 @@ message IdMappings { message RoomIds { map panels = 1; map masteries = 2; + map keyholders = 3; } message MapIds { diff --git a/tools/assign_ids/main.cpp b/tools/assign_ids/main.cpp index 3a2f347..6eb41e3 100644 --- a/tools/assign_ids/main.cpp +++ b/tools/assign_ids/main.cpp @@ -183,6 +183,29 @@ class AssignIds { endings[h_ending.name()] = next_id_++; } } + + for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { + if (!h_keyholder.has_key()) { + continue; + } + + if (!id_mappings_.maps().contains(current_map_name) || + !id_mappings_.maps() + .at(current_map_name) + .rooms() + .contains(h_room.name()) || + !id_mappings_.maps() + .at(current_map_name) + .rooms() + .at(h_room.name()) + .keyholders() + .contains(h_keyholder.name())) { + auto& maps = *id_mappings_.mutable_maps(); + auto& rooms = *maps[current_map_name].mutable_rooms(); + auto& keyholders = *rooms[h_room.name()].mutable_keyholders(); + keyholders[h_keyholder.name()] = next_id_++; + } + } } void ProcessProgressivesFile(std::filesystem::path path) { diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 5ed82cc..d7e0b69 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp @@ -293,6 +293,10 @@ class DataPacker { keyholder.set_path(h_keyholder.path()); + if (h_keyholder.has_key()) { + keyholder.set_key(h_keyholder.key()); + } + return keyholder_id; } @@ -592,6 +596,14 @@ class DataPacker { .mutable_masteries(mastery_id) ->set_ap_id(ap_id); } + + for (const auto& [keyholder_name, ap_id] : room.keyholders()) { + uint64_t keyholder_id = container_.FindOrAddKeyholder( + map_name, room_name, keyholder_name, std::nullopt, std::nullopt); + container_.all_objects() + .mutable_keyholders(keyholder_id) + ->set_ap_id(ap_id); + } } } diff --git a/tools/util/ids_yaml_format.cpp b/tools/util/ids_yaml_format.cpp index ae62073..67c21d6 100644 --- a/tools/util/ids_yaml_format.cpp +++ b/tools/util/ids_yaml_format.cpp @@ -56,6 +56,14 @@ IdMappings ReadIdsFromYaml(const std::string& filename) { mastery_it.second.as(); } } + + if (room_it.second["keyholders"]) { + for (const auto& keyholder_it : room_it.second["keyholders"]) { + (*room_ids.mutable_keyholders())[keyholder_it.first + .as()] = + keyholder_it.second.as(); + } + } } } @@ -124,6 +132,13 @@ void WriteIdsAsYaml(const IdMappings& ids, const std::string& filename) { mastery_id; }); + OperateOnSortedMap(room_ids.keyholders(), + [&room_node](const std::string& keyholder_name, + uint64_t keyholder_id) { + room_node["keyholders"][keyholder_name] = + keyholder_id; + }); + map_node["rooms"][room_name] = std::move(room_node); }); -- cgit 1.4.1