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. --- tools/datapacker/container.cpp | 40 +++++++++++++++++++++++++++++++++++++++ tools/datapacker/container.h | 8 ++++++++ tools/datapacker/main.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) (limited to 'tools/datapacker') 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