From 21e334efcda30845f0d95b274fba7bb3f6f04004 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 10 Aug 2025 12:42:36 -0400 Subject: Assigned IDs for the_congruent Keyholders are packed now. Doors can rely on keyholders and rooms. Paintings can be exit only. --- data/ids.txtpb | 205 +++++++++++++++++++++++++++++++++++++++++ proto/data.proto | 18 ++++ tools/datapacker/container.cpp | 40 ++++++++ tools/datapacker/container.h | 8 ++ tools/datapacker/main.cpp | 43 +++++++++ 5 files changed, 314 insertions(+) diff --git a/data/ids.txtpb b/data/ids.txtpb index ae050e9..a0095ad 100644 --- a/data/ids.txtpb +++ b/data/ids.txtpb @@ -925,6 +925,203 @@ maps { } } } +maps { + key: "the_congruent" + value { + doors { + key: "C Keyholder Blocker" + value: 284 + } + doors { + key: "C2 Door" + value: 285 + } + doors { + key: "Flipped Magenta Door" + value: 282 + } + doors { + key: "Flipped Yellow Door" + value: 283 + } + doors { + key: "G Keyholder Blocker" + value: 289 + } + doors { + key: "G2 Door" + value: 290 + } + doors { + key: "Near C Keyholder Puzzles" + value: 288 + } + doors { + key: "Obverse Magenta Door" + value: 281 + } + doors { + key: "Obverse Yellow Door" + value: 286 + } + doors { + key: "Obverse Yellow Puzzles" + value: 287 + } + doors { + key: "T Keyholder Blocker" + value: 291 + } + rooms { + key: "Flipped Magenta Room" + value { + panels { + key: "LAND" + value: 325 + } + panels { + key: "LAST" + value: 320 + } + panels { + key: "LATE" + value: 321 + } + panels { + key: "LEFT" + value: 322 + } + panels { + key: "LIST" + value: 323 + } + panels { + key: "LOOK" + value: 316 + } + panels { + key: "LUST" + value: 324 + } + panels { + key: "MALE" + value: 319 + } + panels { + key: "RULE" + value: 318 + } + panels { + key: "SLOW" + value: 317 + } + } + } + rooms { + key: "Flipped Yellow Room" + value { + panels { + key: "BRICK" + value: 311 + } + panels { + key: "CAVE (1)" + value: 314 + } + panels { + key: "CAVE (2)" + value: 315 + } + panels { + key: "CROWN" + value: 309 + } + panels { + key: "CRUEL" + value: 310 + } + panels { + key: "DANCER" + value: 308 + } + panels { + key: "FLACK" + value: 312 + } + panels { + key: "TACK" + value: 313 + } + } + } + rooms { + key: "Main Area" + value { + panels { + key: "COAT" + value: 301 + } + panels { + key: "DIE" + value: 296 + } + panels { + key: "LABS (1)" + value: 302 + } + panels { + key: "LABS (2)" + value: 303 + } + panels { + key: "LACE" + value: 300 + } + panels { + key: "LAKE" + value: 295 + } + panels { + key: "LANE (1)" + value: 292 + } + panels { + key: "LANE (2)" + value: 293 + } + panels { + key: "LANE (3)" + value: 294 + } + panels { + key: "LIGHT" + value: 297 + } + panels { + key: "LOVES" + value: 298 + } + panels { + key: "RANGER" + value: 299 + } + } + } + rooms { + key: "Obverse Yellow Room" + value { + panels { + key: "CIVIL" + value: 305 + } + panels { + key: "CRABS" + value: 306 + } + } + } + } +} maps { key: "the_entry" value { @@ -1452,10 +1649,18 @@ letters { key: "b2" value: 128 } +letters { + key: "c2" + value: 307 +} letters { key: "d1" value: 196 } +letters { + key: "g2" + value: 304 +} letters { key: "h1" value: 230 diff --git a/proto/data.proto b/proto/data.proto index 274010d..fd38cfd 100644 --- a/proto/data.proto +++ b/proto/data.proto @@ -9,6 +9,11 @@ message ProxyIdentifier { string answer = 2; } +message KeyholderAnswer { + uint64 keyholder = 1; + string key = 2; +} + message Connection { uint64 from_room = 1; uint64 to_room = 2; @@ -36,6 +41,8 @@ message Door { string control_center_color = 6; repeated string switches = 7; + repeated KeyholderAnswer keyholders = 13; + repeated uint64 rooms = 14; DoorType type = 8; } @@ -69,6 +76,7 @@ message Painting { bool move = 6; bool enter_only = 7; bool flipped = 8; + bool exit_only = 11; uint64 required_door = 5; } @@ -84,6 +92,14 @@ message Port { uint64 required_door = 6; } +message Keyholder { + uint64 id = 1; + uint64 room_id = 2; + + string name = 3; + string path = 4; +} + message Letter { uint64 id = 3; uint64 ap_id = 5; @@ -116,6 +132,7 @@ message Room { repeated uint64 ports = 7; repeated uint64 doors = 9; repeated uint64 masteries = 10; + repeated uint64 keyholders = 11; } message Map { @@ -130,6 +147,7 @@ message AllObjects { repeated Panel panels = 3; repeated Painting paintings = 4; repeated Port ports = 5; + repeated Keyholder keyholders = 11; repeated Letter letters = 9; repeated Mastery masteries = 10; repeated Connection connections = 6; diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp index 29fa1a5..bb58ec5 100644 --- a/tools/datapacker/container.cpp +++ b/tools/datapacker/container.cpp @@ -246,6 +246,46 @@ uint64_t Container::FindOrAddMastery(std::optional map_name, } } +uint64_t Container::FindOrAddKeyholder( + std::optional map_name, std::optional room_name, + std::string keyholder_name, std::optional map_fallback, + std::optional room_fallback) { + if (!map_name) { + if (!map_fallback) { + std::cout << "No map name provided for " << keyholder_name << std::endl; + map_name = "global"; + } else { + map_name = map_fallback; + } + } + + if (!room_name) { + if (!room_fallback) { + std::cout << "No room name provided for " << keyholder_name << std::endl; + room_name = "global"; + } else { + room_name = room_fallback; + } + } + + auto& room_container = + keyholder_id_by_map_room_keyholder_names_[*map_name][*room_name]; + auto it = room_container.find(keyholder_name); + if (it == room_container.end()) { + uint64_t new_id = all_objects_.keyholders_size(); + Keyholder* keyholder = all_objects_.add_keyholders(); + keyholder->set_id(new_id); + keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); + keyholder->set_name(keyholder_name); + + room_container[keyholder_name] = new_id; + + return new_id; + } else { + return it->second; + } +} + uint64_t Container::FindOrAddDoor(std::optional map_name, std::string door_name, std::optional map_fallback) { diff --git a/tools/datapacker/container.h b/tools/datapacker/container.h index 652a025..7ee5b5b 100644 --- a/tools/datapacker/container.h +++ b/tools/datapacker/container.h @@ -46,6 +46,12 @@ class Container { std::optional map_fallback, std::optional room_fallback); + uint64_t FindOrAddKeyholder(std::optional map_name, + std::optional room_name, + std::string keyholder_name, + std::optional map_fallback, + std::optional room_fallback); + uint64_t FindOrAddDoor(std::optional map_name, std::string door_name, std::optional map_fallback); @@ -69,6 +75,8 @@ class Container { std::map letter_id_by_name_; std::map>> mastery_id_by_map_room_mastery_names_; + std::map>> + keyholder_id_by_map_room_keyholder_names_; std::map> door_id_by_map_door_names_; }; diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 260ab62..7e7f7f7 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp @@ -109,6 +109,11 @@ class DataPacker { room.add_masteries( ProcessMastery(h_mastery, current_map_name, room.name())); } + + for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { + room.add_keyholders( + ProcessKeyholder(h_keyholder, current_map_name, room.name())); + } } uint64_t ProcessPanel(const HumanPanel& h_panel, @@ -176,6 +181,10 @@ class DataPacker { painting.set_enter_only(h_painting.enter_only()); } + if (h_painting.has_exit_only()) { + painting.set_exit_only(h_painting.exit_only()); + } + if (h_painting.has_required_door()) { std::optional map_name = h_painting.required_door().has_map() @@ -238,6 +247,20 @@ class DataPacker { return mastery_id; } + uint64_t ProcessKeyholder(const HumanKeyholder& h_keyholder, + const std::string& current_map_name, + const std::string& current_room_name) { + uint64_t keyholder_id = container_.FindOrAddKeyholder( + current_map_name, current_room_name, h_keyholder.name(), std::nullopt, + std::nullopt); + Keyholder& keyholder = + *container_.all_objects().mutable_keyholders(keyholder_id); + + keyholder.set_path(h_keyholder.path()); + + return keyholder_id; + } + void ProcessDoorsFile(std::filesystem::path path, const std::string& current_map_name) { if (!std::filesystem::exists(path)) { @@ -292,6 +315,26 @@ class DataPacker { } } + for (const KeyholderIdentifier& ki : h_door.keyholders()) { + KeyholderAnswer* answer = door.add_keyholders(); + + std::optional map_name = + ki.has_map() ? std::optional(ki.map()) : std::nullopt; + answer->set_keyholder(container_.FindOrAddKeyholder( + map_name, ki.room(), ki.name(), current_map_name, std::nullopt)); + + if (ki.has_key()) { + answer->set_key(ki.key()); + } + } + + for (const RoomIdentifier& ri : h_door.rooms()) { + std::optional map_name = + ri.has_map() ? std::optional(ri.map()) : std::nullopt; + door.add_rooms( + container_.FindOrAddRoom(map_name, ri.name(), current_map_name)); + } + if (h_door.has_control_center_color()) { door.set_control_center_color(h_door.control_center_color()); } -- cgit 1.4.1