summary refs log tree commit diff stats
path: root/tools/datapacker
diff options
context:
space:
mode:
Diffstat (limited to 'tools/datapacker')
-rw-r--r--tools/datapacker/container.cpp40
-rw-r--r--tools/datapacker/container.h8
-rw-r--r--tools/datapacker/main.cpp43
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
249uint64_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
249uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, 289uint64_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 }