diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-08-10 12:42:36 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-08-10 12:42:36 -0400 |
| commit | 21e334efcda30845f0d95b274fba7bb3f6f04004 (patch) | |
| tree | b88a5ea9eeabecff7845ab158cf78f4c035db3df /tools | |
| parent | e1d1b6e1f51b2152373be73ea59900ee410e33d2 (diff) | |
| download | lingo2-archipelago-21e334efcda30845f0d95b274fba7bb3f6f04004.tar.gz lingo2-archipelago-21e334efcda30845f0d95b274fba7bb3f6f04004.tar.bz2 lingo2-archipelago-21e334efcda30845f0d95b274fba7bb3f6f04004.zip | |
Assigned IDs for the_congruent
Keyholders are packed now. Doors can rely on keyholders and rooms. Paintings can be exit only.
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/datapacker/container.cpp | 40 | ||||
| -rw-r--r-- | tools/datapacker/container.h | 8 | ||||
| -rw-r--r-- | tools/datapacker/main.cpp | 43 |
3 files changed, 91 insertions, 0 deletions
| 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<std::string> map_name, | |||
| 246 | } | 246 | } |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | uint64_t Container::FindOrAddKeyholder( | ||
| 250 | std::optional<std::string> map_name, std::optional<std::string> room_name, | ||
| 251 | std::string keyholder_name, std::optional<std::string> map_fallback, | ||
| 252 | std::optional<std::string> room_fallback) { | ||
| 253 | if (!map_name) { | ||
| 254 | if (!map_fallback) { | ||
| 255 | std::cout << "No map name provided for " << keyholder_name << std::endl; | ||
| 256 | map_name = "global"; | ||
| 257 | } else { | ||
| 258 | map_name = map_fallback; | ||
| 259 | } | ||
| 260 | } | ||
| 261 | |||
| 262 | if (!room_name) { | ||
| 263 | if (!room_fallback) { | ||
| 264 | std::cout << "No room name provided for " << keyholder_name << std::endl; | ||
| 265 | room_name = "global"; | ||
| 266 | } else { | ||
| 267 | room_name = room_fallback; | ||
| 268 | } | ||
| 269 | } | ||
| 270 | |||
| 271 | auto& room_container = | ||
| 272 | keyholder_id_by_map_room_keyholder_names_[*map_name][*room_name]; | ||
| 273 | auto it = room_container.find(keyholder_name); | ||
| 274 | if (it == room_container.end()) { | ||
| 275 | uint64_t new_id = all_objects_.keyholders_size(); | ||
| 276 | Keyholder* keyholder = all_objects_.add_keyholders(); | ||
| 277 | keyholder->set_id(new_id); | ||
| 278 | keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); | ||
| 279 | keyholder->set_name(keyholder_name); | ||
| 280 | |||
| 281 | room_container[keyholder_name] = new_id; | ||
| 282 | |||
| 283 | return new_id; | ||
| 284 | } else { | ||
| 285 | return it->second; | ||
| 286 | } | ||
| 287 | } | ||
| 288 | |||
| 249 | uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, | 289 | uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, |
| 250 | std::string door_name, | 290 | std::string door_name, |
| 251 | std::optional<std::string> map_fallback) { | 291 | std::optional<std::string> 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 { | |||
| 46 | std::optional<std::string> map_fallback, | 46 | std::optional<std::string> map_fallback, |
| 47 | std::optional<std::string> room_fallback); | 47 | std::optional<std::string> room_fallback); |
| 48 | 48 | ||
| 49 | uint64_t FindOrAddKeyholder(std::optional<std::string> map_name, | ||
| 50 | std::optional<std::string> room_name, | ||
| 51 | std::string keyholder_name, | ||
| 52 | std::optional<std::string> map_fallback, | ||
| 53 | std::optional<std::string> room_fallback); | ||
| 54 | |||
| 49 | uint64_t FindOrAddDoor(std::optional<std::string> map_name, | 55 | uint64_t FindOrAddDoor(std::optional<std::string> map_name, |
| 50 | std::string door_name, | 56 | std::string door_name, |
| 51 | std::optional<std::string> map_fallback); | 57 | std::optional<std::string> map_fallback); |
| @@ -69,6 +75,8 @@ class Container { | |||
| 69 | std::map<std::string, uint64_t> letter_id_by_name_; | 75 | std::map<std::string, uint64_t> letter_id_by_name_; |
| 70 | std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>> | 76 | std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>> |
| 71 | mastery_id_by_map_room_mastery_names_; | 77 | mastery_id_by_map_room_mastery_names_; |
| 78 | std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>> | ||
| 79 | keyholder_id_by_map_room_keyholder_names_; | ||
| 72 | std::map<std::string, std::map<std::string, uint64_t>> | 80 | std::map<std::string, std::map<std::string, uint64_t>> |
| 73 | door_id_by_map_door_names_; | 81 | door_id_by_map_door_names_; |
| 74 | }; | 82 | }; |
| 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 { | |||
| 109 | room.add_masteries( | 109 | room.add_masteries( |
| 110 | ProcessMastery(h_mastery, current_map_name, room.name())); | 110 | ProcessMastery(h_mastery, current_map_name, room.name())); |
| 111 | } | 111 | } |
| 112 | |||
| 113 | for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { | ||
| 114 | room.add_keyholders( | ||
| 115 | ProcessKeyholder(h_keyholder, current_map_name, room.name())); | ||
| 116 | } | ||
| 112 | } | 117 | } |
| 113 | 118 | ||
| 114 | uint64_t ProcessPanel(const HumanPanel& h_panel, | 119 | uint64_t ProcessPanel(const HumanPanel& h_panel, |
| @@ -176,6 +181,10 @@ class DataPacker { | |||
| 176 | painting.set_enter_only(h_painting.enter_only()); | 181 | painting.set_enter_only(h_painting.enter_only()); |
| 177 | } | 182 | } |
| 178 | 183 | ||
| 184 | if (h_painting.has_exit_only()) { | ||
| 185 | painting.set_exit_only(h_painting.exit_only()); | ||
| 186 | } | ||
| 187 | |||
| 179 | if (h_painting.has_required_door()) { | 188 | if (h_painting.has_required_door()) { |
| 180 | std::optional<std::string> map_name = | 189 | std::optional<std::string> map_name = |
| 181 | h_painting.required_door().has_map() | 190 | h_painting.required_door().has_map() |
| @@ -238,6 +247,20 @@ class DataPacker { | |||
| 238 | return mastery_id; | 247 | return mastery_id; |
| 239 | } | 248 | } |
| 240 | 249 | ||
| 250 | uint64_t ProcessKeyholder(const HumanKeyholder& h_keyholder, | ||
| 251 | const std::string& current_map_name, | ||
| 252 | const std::string& current_room_name) { | ||
| 253 | uint64_t keyholder_id = container_.FindOrAddKeyholder( | ||
| 254 | current_map_name, current_room_name, h_keyholder.name(), std::nullopt, | ||
| 255 | std::nullopt); | ||
| 256 | Keyholder& keyholder = | ||
| 257 | *container_.all_objects().mutable_keyholders(keyholder_id); | ||
| 258 | |||
| 259 | keyholder.set_path(h_keyholder.path()); | ||
| 260 | |||
| 261 | return keyholder_id; | ||
| 262 | } | ||
| 263 | |||
| 241 | void ProcessDoorsFile(std::filesystem::path path, | 264 | void ProcessDoorsFile(std::filesystem::path path, |
| 242 | const std::string& current_map_name) { | 265 | const std::string& current_map_name) { |
| 243 | if (!std::filesystem::exists(path)) { | 266 | if (!std::filesystem::exists(path)) { |
| @@ -292,6 +315,26 @@ class DataPacker { | |||
| 292 | } | 315 | } |
| 293 | } | 316 | } |
| 294 | 317 | ||
| 318 | for (const KeyholderIdentifier& ki : h_door.keyholders()) { | ||
| 319 | KeyholderAnswer* answer = door.add_keyholders(); | ||
| 320 | |||
| 321 | std::optional<std::string> map_name = | ||
| 322 | ki.has_map() ? std::optional<std::string>(ki.map()) : std::nullopt; | ||
| 323 | answer->set_keyholder(container_.FindOrAddKeyholder( | ||
| 324 | map_name, ki.room(), ki.name(), current_map_name, std::nullopt)); | ||
| 325 | |||
| 326 | if (ki.has_key()) { | ||
| 327 | answer->set_key(ki.key()); | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 331 | for (const RoomIdentifier& ri : h_door.rooms()) { | ||
| 332 | std::optional<std::string> map_name = | ||
| 333 | ri.has_map() ? std::optional<std::string>(ri.map()) : std::nullopt; | ||
| 334 | door.add_rooms( | ||
| 335 | container_.FindOrAddRoom(map_name, ri.name(), current_map_name)); | ||
| 336 | } | ||
| 337 | |||
| 295 | if (h_door.has_control_center_color()) { | 338 | if (h_door.has_control_center_color()) { |
| 296 | door.set_control_center_color(h_door.control_center_color()); | 339 | door.set_control_center_color(h_door.control_center_color()); |
| 297 | } | 340 | } |
