about 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.cpp54
-rw-r--r--tools/datapacker/container.h9
-rw-r--r--tools/datapacker/main.cpp209
3 files changed, 261 insertions, 11 deletions
diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp index ffcb75a..4a656b3 100644 --- a/tools/datapacker/container.cpp +++ b/tools/datapacker/container.cpp
@@ -79,7 +79,7 @@ uint64_t Container::FindOrAddPainting(
79 auto it = room_container.find(painting_name); 79 auto it = room_container.find(painting_name);
80 if (it == room_container.end()) { 80 if (it == room_container.end()) {
81 uint64_t new_id = all_objects_.paintings_size(); 81 uint64_t new_id = all_objects_.paintings_size();
82 Painting* painting = all_objects_.add_paintings(); 82 PaintingData* painting = all_objects_.add_paintings();
83 painting->set_id(new_id); 83 painting->set_id(new_id);
84 painting->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); 84 painting->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
85 painting->set_name(painting_name); 85 painting->set_name(painting_name);
@@ -205,6 +205,22 @@ uint64_t Container::FindLetterByName(std::string letter_name) {
205 } 205 }
206} 206}
207 207
208uint64_t Container::FindOrAddEnding(std::string ending_name) {
209 auto it = ending_id_by_name_.find(ending_name);
210 if (it == ending_id_by_name_.end()) {
211 uint64_t new_id = all_objects_.endings_size();
212 Ending* ending = all_objects_.add_endings();
213 ending->set_id(new_id);
214 ending->set_name(ending_name);
215
216 ending_id_by_name_[ending_name] = new_id;
217
218 return new_id;
219 } else {
220 return it->second;
221 }
222}
223
208uint64_t Container::FindOrAddMastery(std::optional<std::string> map_name, 224uint64_t Container::FindOrAddMastery(std::optional<std::string> map_name,
209 std::optional<std::string> room_name, 225 std::optional<std::string> room_name,
210 std::string mastery_name, 226 std::string mastery_name,
@@ -273,7 +289,7 @@ uint64_t Container::FindOrAddKeyholder(
273 auto it = room_container.find(keyholder_name); 289 auto it = room_container.find(keyholder_name);
274 if (it == room_container.end()) { 290 if (it == room_container.end()) {
275 uint64_t new_id = all_objects_.keyholders_size(); 291 uint64_t new_id = all_objects_.keyholders_size();
276 Keyholder* keyholder = all_objects_.add_keyholders(); 292 KeyholderData* keyholder = all_objects_.add_keyholders();
277 keyholder->set_id(new_id); 293 keyholder->set_id(new_id);
278 keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); 294 keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
279 keyholder->set_name(keyholder_name); 295 keyholder->set_name(keyholder_name);
@@ -315,6 +331,40 @@ uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name,
315 } 331 }
316} 332}
317 333
334uint64_t Container::FindOrAddProgressive(std::string prog_name) {
335 auto it = progressive_id_by_name_.find(prog_name);
336
337 if (it == progressive_id_by_name_.end()) {
338 uint64_t new_id = all_objects_.progressives_size();
339 Progressive* progressive = all_objects_.add_progressives();
340 progressive->set_id(new_id);
341 progressive->set_name(prog_name);
342
343 progressive_id_by_name_[prog_name] = new_id;
344
345 return new_id;
346 } else {
347 return it->second;
348 }
349}
350
351uint64_t Container::FindOrAddDoorGroup(std::string group_name) {
352 auto it = door_group_id_by_name_.find(group_name);
353
354 if (it == door_group_id_by_name_.end()) {
355 uint64_t new_id = all_objects_.door_groups_size();
356 DoorGroup* door_group = all_objects_.add_door_groups();
357 door_group->set_id(new_id);
358 door_group->set_name(group_name);
359
360 door_group_id_by_name_[group_name] = new_id;
361
362 return new_id;
363 } else {
364 return it->second;
365 }
366}
367
318void Container::AddConnection(const Connection& connection) { 368void Container::AddConnection(const Connection& connection) {
319 *all_objects_.add_connections() = connection; 369 *all_objects_.add_connections() = connection;
320} 370}
diff --git a/tools/datapacker/container.h b/tools/datapacker/container.h index e1a84d8..bc02ba4 100644 --- a/tools/datapacker/container.h +++ b/tools/datapacker/container.h
@@ -40,6 +40,8 @@ class Container {
40 40
41 uint64_t FindLetterByName(std::string letter_name); 41 uint64_t FindLetterByName(std::string letter_name);
42 42
43 uint64_t FindOrAddEnding(std::string ending_name);
44
43 uint64_t FindOrAddMastery(std::optional<std::string> map_name, 45 uint64_t FindOrAddMastery(std::optional<std::string> map_name,
44 std::optional<std::string> room_name, 46 std::optional<std::string> room_name,
45 std::string mastery_name, 47 std::string mastery_name,
@@ -58,6 +60,10 @@ class Container {
58 60
59 void AddConnection(const Connection& connection); 61 void AddConnection(const Connection& connection);
60 62
63 uint64_t FindOrAddProgressive(std::string prog_name);
64
65 uint64_t FindOrAddDoorGroup(std::string group_name);
66
61 AllObjects& all_objects() { return all_objects_; } 67 AllObjects& all_objects() { return all_objects_; }
62 68
63 private: 69 private:
@@ -79,6 +85,9 @@ class Container {
79 keyholder_id_by_map_room_keyholder_names_; 85 keyholder_id_by_map_room_keyholder_names_;
80 std::map<std::string, std::map<std::string, uint64_t>> 86 std::map<std::string, std::map<std::string, uint64_t>>
81 door_id_by_map_door_names_; 87 door_id_by_map_door_names_;
88 std::map<std::string, uint64_t> ending_id_by_name_;
89 std::map<std::string, uint64_t> progressive_id_by_name_;
90 std::map<std::string, uint64_t> door_group_id_by_name_;
82}; 91};
83 92
84} // namespace com::fourisland::lingo2_archipelago 93} // namespace com::fourisland::lingo2_archipelago
diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 1736ec1..8109bf5 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp
@@ -14,6 +14,7 @@
14#include "container.h" 14#include "container.h"
15#include "proto/data.pb.h" 15#include "proto/data.pb.h"
16#include "proto/human.pb.h" 16#include "proto/human.pb.h"
17#include "util/ids_yaml_format.h"
17 18
18namespace com::fourisland::lingo2_archipelago { 19namespace com::fourisland::lingo2_archipelago {
19namespace { 20namespace {
@@ -42,7 +43,10 @@ class DataPacker {
42 43
43 ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt); 44 ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt);
44 ProcessMaps(datadir_path); 45 ProcessMaps(datadir_path);
45 ProcessIdsFile(datadir_path / "ids.txtpb"); 46 ProcessProgressivesFile(datadir_path / "progressives.txtpb");
47 ProcessDoorGroupsFile(datadir_path / "door_groups.txtpb");
48 ProcessGlobalMetadataFile(datadir_path / "metadata.txtpb");
49 ProcessIdsFile(datadir_path / "ids.yaml");
46 50
47 { 51 {
48 std::ofstream outputfile(outputpath_); 52 std::ofstream outputfile(outputpath_);
@@ -65,13 +69,38 @@ class DataPacker {
65 } 69 }
66 70
67 void ProcessMap(std::filesystem::path path) { 71 void ProcessMap(std::filesystem::path path) {
68 std::string map_name = path.filename(); 72 std::string map_name = path.filename().string();
69 73
74 ProcessMapMetadataFile(path / "metadata.txtpb", map_name);
70 ProcessConnectionsFile(path / "connections.txtpb", map_name); 75 ProcessConnectionsFile(path / "connections.txtpb", map_name);
71 ProcessDoorsFile(path / "doors.txtpb", map_name); 76 ProcessDoorsFile(path / "doors.txtpb", map_name);
72 ProcessRooms(path / "rooms", map_name); 77 ProcessRooms(path / "rooms", map_name);
73 } 78 }
74 79
80 void ProcessMapMetadataFile(std::filesystem::path path,
81 const std::string& map_name) {
82 if (!std::filesystem::exists(path)) {
83 return;
84 }
85
86 auto metadata = ReadMessageFromFile<HumanMap>(path.string());
87
88 uint64_t map_id = container_.FindOrAddMap(map_name);
89 Map& map = *container_.all_objects().mutable_maps(map_id);
90
91 map.set_type(metadata.type());
92
93 if (metadata.has_display_name()) {
94 map.set_display_name(metadata.display_name());
95 }
96
97 if (metadata.has_worldport_entrance()) {
98 map.set_worldport_entrance(container_.FindOrAddPort(
99 map_name, metadata.worldport_entrance().room(),
100 metadata.worldport_entrance().name(), std::nullopt, std::nullopt));
101 }
102 }
103
75 void ProcessRooms(std::filesystem::path path, 104 void ProcessRooms(std::filesystem::path path,
76 const std::string& current_map_name) { 105 const std::string& current_map_name) {
77 for (auto const& dir_entry : std::filesystem::directory_iterator(path)) { 106 for (auto const& dir_entry : std::filesystem::directory_iterator(path)) {
@@ -86,7 +115,11 @@ class DataPacker {
86 container_.FindOrAddRoom(current_map_name, h_room.name(), std::nullopt); 115 container_.FindOrAddRoom(current_map_name, h_room.name(), std::nullopt);
87 Room& room = *container_.all_objects().mutable_rooms(room_id); 116 Room& room = *container_.all_objects().mutable_rooms(room_id);
88 117
89 room.set_display_name(h_room.display_name()); 118 // room.set_display_name(h_room.display_name());
119
120 if (h_room.has_panel_display_name()) {
121 room.set_panel_display_name(h_room.panel_display_name());
122 }
90 123
91 for (const HumanPanel& h_panel : h_room.panels()) { 124 for (const HumanPanel& h_panel : h_room.panels()) {
92 room.add_panels(ProcessPanel(h_panel, current_map_name, room.name())); 125 room.add_panels(ProcessPanel(h_panel, current_map_name, room.name()));
@@ -114,6 +147,10 @@ class DataPacker {
114 room.add_keyholders( 147 room.add_keyholders(
115 ProcessKeyholder(h_keyholder, current_map_name, room.name())); 148 ProcessKeyholder(h_keyholder, current_map_name, room.name()));
116 } 149 }
150
151 for (const HumanEnding& h_ending : h_room.endings()) {
152 room.add_endings(ProcessEnding(h_ending, current_map_name, room.name()));
153 }
117 } 154 }
118 155
119 uint64_t ProcessPanel(const HumanPanel& h_panel, 156 uint64_t ProcessPanel(const HumanPanel& h_panel,
@@ -153,6 +190,10 @@ class DataPacker {
153 map_name, h_panel.required_room().name(), current_map_name)); 190 map_name, h_panel.required_room().name(), current_map_name));
154 } 191 }
155 192
193 if (h_panel.has_display_name()) {
194 panel.set_display_name(h_panel.display_name());
195 }
196
156 return panel_id; 197 return panel_id;
157 } 198 }
158 199
@@ -162,7 +203,7 @@ class DataPacker {
162 uint64_t painting_id = container_.FindOrAddPainting( 203 uint64_t painting_id = container_.FindOrAddPainting(
163 current_map_name, current_room_name, h_painting.name(), std::nullopt, 204 current_map_name, current_room_name, h_painting.name(), std::nullopt,
164 std::nullopt); 205 std::nullopt);
165 Painting& painting = 206 PaintingData& painting =
166 *container_.all_objects().mutable_paintings(painting_id); 207 *container_.all_objects().mutable_paintings(painting_id);
167 208
168 painting.set_path(h_painting.path()); 209 painting.set_path(h_painting.path());
@@ -206,7 +247,14 @@ class DataPacker {
206 Port& port = *container_.all_objects().mutable_ports(port_id); 247 Port& port = *container_.all_objects().mutable_ports(port_id);
207 248
208 port.set_path(h_port.path()); 249 port.set_path(h_port.path());
209 port.set_orientation(h_port.orientation()); 250 port.set_display_name(h_port.display_name());
251
252 if (h_port.no_shuffle()) {
253 port.set_no_shuffle(h_port.no_shuffle());
254 } else {
255 *port.mutable_destination() = h_port.destination();
256 port.set_rotation(h_port.rotation());
257 }
210 258
211 // Setting this explicitly because the Godot protobuf doesn't support 259 // Setting this explicitly because the Godot protobuf doesn't support
212 // custom defaults. 260 // custom defaults.
@@ -257,14 +305,31 @@ class DataPacker {
257 uint64_t keyholder_id = container_.FindOrAddKeyholder( 305 uint64_t keyholder_id = container_.FindOrAddKeyholder(
258 current_map_name, current_room_name, h_keyholder.name(), std::nullopt, 306 current_map_name, current_room_name, h_keyholder.name(), std::nullopt,
259 std::nullopt); 307 std::nullopt);
260 Keyholder& keyholder = 308 KeyholderData& keyholder =
261 *container_.all_objects().mutable_keyholders(keyholder_id); 309 *container_.all_objects().mutable_keyholders(keyholder_id);
262 310
263 keyholder.set_path(h_keyholder.path()); 311 keyholder.set_path(h_keyholder.path());
264 312
313 if (h_keyholder.has_key()) {
314 keyholder.set_key(h_keyholder.key());
315 }
316
265 return keyholder_id; 317 return keyholder_id;
266 } 318 }
267 319
320 uint64_t ProcessEnding(const HumanEnding& h_ending,
321 const std::string& current_map_name,
322 const std::string& current_room_name) {
323 uint64_t ending_id = container_.FindOrAddEnding(h_ending.name());
324 Ending& ending = *container_.all_objects().mutable_endings(ending_id);
325
326 ending.set_room_id(container_.FindOrAddRoom(
327 current_map_name, current_room_name, std::nullopt));
328 ending.set_path(h_ending.path());
329
330 return ending_id;
331 }
332
268 void ProcessDoorsFile(std::filesystem::path path, 333 void ProcessDoorsFile(std::filesystem::path path,
269 const std::string& current_map_name) { 334 const std::string& current_map_name) {
270 if (!std::filesystem::exists(path)) { 335 if (!std::filesystem::exists(path)) {
@@ -296,8 +361,8 @@ class DataPacker {
296 h_door.receivers().begin(), h_door.receivers().end(), 361 h_door.receivers().begin(), h_door.receivers().end(),
297 google::protobuf::RepeatedFieldBackInserter(door.mutable_receivers())); 362 google::protobuf::RepeatedFieldBackInserter(door.mutable_receivers()));
298 std::copy( 363 std::copy(
299 h_door.switches().begin(), h_door.switches().end(), 364 h_door.senders().begin(), h_door.senders().end(),
300 google::protobuf::RepeatedFieldBackInserter(door.mutable_switches())); 365 google::protobuf::RepeatedFieldBackInserter(door.mutable_senders()));
301 366
302 for (const PaintingIdentifier& pi : h_door.move_paintings()) { 367 for (const PaintingIdentifier& pi : h_door.move_paintings()) {
303 std::optional<std::string> map_name = 368 std::optional<std::string> map_name =
@@ -346,6 +411,10 @@ class DataPacker {
346 container_.FindOrAddDoor(map_name, di.name(), current_map_name)); 411 container_.FindOrAddDoor(map_name, di.name(), current_map_name));
347 } 412 }
348 413
414 if (h_door.has_white_ending()) {
415 door.set_white_ending(h_door.white_ending());
416 }
417
349 if (h_door.has_control_center_color()) { 418 if (h_door.has_control_center_color()) {
350 door.set_control_center_color(h_door.control_center_color()); 419 door.set_control_center_color(h_door.control_center_color());
351 } 420 }
@@ -355,6 +424,22 @@ class DataPacker {
355 } 424 }
356 425
357 door.set_type(h_door.type()); 426 door.set_type(h_door.type());
427
428 if (h_door.has_location_name()) {
429 door.set_location_name(h_door.location_name());
430 }
431
432 if (h_door.has_double_letters()) {
433 door.set_double_letters(h_door.double_letters());
434 }
435
436 if (h_door.has_latch()) {
437 door.set_latch(h_door.latch());
438 }
439
440 if (h_door.has_legacy_location()) {
441 door.set_legacy_location(h_door.legacy_location());
442 }
358 } 443 }
359 444
360 void ProcessConnectionsFile(std::filesystem::path path, 445 void ProcessConnectionsFile(std::filesystem::path path,
@@ -406,6 +491,26 @@ class DataPacker {
406 r_connection.set_required_door(door_id); 491 r_connection.set_required_door(door_id);
407 } 492 }
408 493
494 if (human_connection.has_roof_access()) {
495 f_connection.set_roof_access(human_connection.roof_access());
496 r_connection.set_roof_access(human_connection.roof_access());
497 }
498
499 if (human_connection.has_purple_ending()) {
500 f_connection.set_purple_ending(human_connection.purple_ending());
501 r_connection.set_purple_ending(human_connection.purple_ending());
502 }
503
504 if (human_connection.has_cyan_ending()) {
505 f_connection.set_cyan_ending(human_connection.cyan_ending());
506 r_connection.set_cyan_ending(human_connection.cyan_ending());
507 }
508
509 if (human_connection.has_vanilla_only()) {
510 f_connection.set_vanilla_only(human_connection.vanilla_only());
511 r_connection.set_vanilla_only(human_connection.vanilla_only());
512 }
513
409 container_.AddConnection(f_connection); 514 container_.AddConnection(f_connection);
410 if (!human_connection.oneway()) { 515 if (!human_connection.oneway()) {
411 container_.AddConnection(r_connection); 516 container_.AddConnection(r_connection);
@@ -489,8 +594,65 @@ class DataPacker {
489 } 594 }
490 } 595 }
491 596
597 void ProcessProgressivesFile(std::filesystem::path path) {
598 if (!std::filesystem::exists(path)) {
599 return;
600 }
601
602 auto h_progs = ReadMessageFromFile<HumanProgressives>(path.string());
603
604 for (const HumanProgressive& h_prog : h_progs.progressives()) {
605 ProcessProgressive(h_prog);
606 }
607 }
608
609 void ProcessProgressive(const HumanProgressive& h_prog) {
610 uint64_t prog_id = container_.FindOrAddProgressive(h_prog.name());
611 Progressive& prog = *container_.all_objects().mutable_progressives(prog_id);
612
613 for (const DoorIdentifier& di : h_prog.doors()) {
614 uint64_t door_id =
615 container_.FindOrAddDoor(di.map(), di.name(), std::nullopt);
616 prog.add_doors(door_id);
617 }
618 }
619
620 void ProcessDoorGroupsFile(std::filesystem::path path) {
621 if (!std::filesystem::exists(path)) {
622 return;
623 }
624
625 auto h_groups = ReadMessageFromFile<HumanDoorGroups>(path.string());
626
627 for (const HumanDoorGroup& h_group : h_groups.door_groups()) {
628 ProcessDoorGroup(h_group);
629 }
630 }
631
632 void ProcessDoorGroup(const HumanDoorGroup& h_group) {
633 uint64_t group_id = container_.FindOrAddDoorGroup(h_group.name());
634 DoorGroup& group = *container_.all_objects().mutable_door_groups(group_id);
635
636 group.set_type(h_group.type());
637
638 for (const DoorIdentifier& di : h_group.doors()) {
639 uint64_t door_id =
640 container_.FindOrAddDoor(di.map(), di.name(), std::nullopt);
641 group.add_doors(door_id);
642 }
643 }
644
645 void ProcessGlobalMetadataFile(std::filesystem::path path) {
646 if (!std::filesystem::exists(path)) {
647 return;
648 }
649
650 auto h_metadata = ReadMessageFromFile<HumanGlobalMetadata>(path.string());
651 *container_.all_objects().mutable_version() = h_metadata.version();
652 }
653
492 void ProcessIdsFile(std::filesystem::path path) { 654 void ProcessIdsFile(std::filesystem::path path) {
493 auto ids = ReadMessageFromFile<IdMappings>(path.string()); 655 auto ids = ReadIdsFromYaml(path.string());
494 656
495 for (const auto& [map_name, map] : ids.maps()) { 657 for (const auto& [map_name, map] : ids.maps()) {
496 for (const auto& [door_name, ap_id] : map.doors()) { 658 for (const auto& [door_name, ap_id] : map.doors()) {
@@ -513,6 +675,20 @@ class DataPacker {
513 .mutable_masteries(mastery_id) 675 .mutable_masteries(mastery_id)
514 ->set_ap_id(ap_id); 676 ->set_ap_id(ap_id);
515 } 677 }
678
679 for (const auto& [keyholder_name, ap_id] : room.keyholders()) {
680 uint64_t keyholder_id = container_.FindOrAddKeyholder(
681 map_name, room_name, keyholder_name, std::nullopt, std::nullopt);
682 container_.all_objects()
683 .mutable_keyholders(keyholder_id)
684 ->set_ap_id(ap_id);
685 }
686
687 for (const auto& [port_name, ap_id] : room.ports()) {
688 uint64_t port_id = container_.FindOrAddPort(
689 map_name, room_name, port_name, std::nullopt, std::nullopt);
690 container_.all_objects().mutable_ports(port_id)->set_ap_id(ap_id);
691 }
516 } 692 }
517 } 693 }
518 694
@@ -525,6 +701,21 @@ class DataPacker {
525 uint64_t letter_id = container_.FindLetterByName(letter_name); 701 uint64_t letter_id = container_.FindLetterByName(letter_name);
526 container_.all_objects().mutable_letters(letter_id)->set_ap_id(ap_id); 702 container_.all_objects().mutable_letters(letter_id)->set_ap_id(ap_id);
527 } 703 }
704
705 for (const auto& [ending_name, ap_id] : ids.endings()) {
706 uint64_t ending_id = container_.FindOrAddEnding(ending_name);
707 container_.all_objects().mutable_endings(ending_id)->set_ap_id(ap_id);
708 }
709
710 for (const auto& [prog_name, ap_id] : ids.progressives()) {
711 uint64_t prog_id = container_.FindOrAddProgressive(prog_name);
712 container_.all_objects().mutable_progressives(prog_id)->set_ap_id(ap_id);
713 }
714
715 for (const auto& [group_name, ap_id] : ids.door_groups()) {
716 uint64_t group_id = container_.FindOrAddDoorGroup(group_name);
717 container_.all_objects().mutable_door_groups(group_id)->set_ap_id(ap_id);
718 }
528 } 719 }
529 720
530 std::string mapdir_; 721 std::string mapdir_;