summary refs log tree commit diff stats
path: root/tools/datapacker
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2025-08-09 11:51:20 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2025-08-09 11:51:20 -0400
commit9ca8681ca5f134d65eaa4b5ae68d57ba67fe98d6 (patch)
tree6d58ffe2e9a60eac681b22b0cb0bd03baf74990c /tools/datapacker
parent3fcc676cd3b9b3b24a8755612a459d498879b1df (diff)
downloadlingo2-archipelago-9ca8681ca5f134d65eaa4b5ae68d57ba67fe98d6.tar.gz
lingo2-archipelago-9ca8681ca5f134d65eaa4b5ae68d57ba67fe98d6.tar.bz2
lingo2-archipelago-9ca8681ca5f134d65eaa4b5ae68d57ba67fe98d6.zip
Added support for masteries
Also assigned IDs for the_butterfly, as well as already configured
letters.
Diffstat (limited to 'tools/datapacker')
-rw-r--r--tools/datapacker/CMakeLists.txt4
-rw-r--r--tools/datapacker/container.cpp77
-rw-r--r--tools/datapacker/container.h13
-rw-r--r--tools/datapacker/main.cpp51
4 files changed, 140 insertions, 5 deletions
diff --git a/tools/datapacker/CMakeLists.txt b/tools/datapacker/CMakeLists.txt index 0274043..1ef04e2 100644 --- a/tools/datapacker/CMakeLists.txt +++ b/tools/datapacker/CMakeLists.txt
@@ -6,5 +6,5 @@ add_executable(datapacker
6) 6)
7set_property(TARGET datapacker PROPERTY CXX_STANDARD 20) 7set_property(TARGET datapacker PROPERTY CXX_STANDARD 20)
8set_property(TARGET datapacker PROPERTY CXX_STANDARD_REQUIRED ON) 8set_property(TARGET datapacker PROPERTY CXX_STANDARD_REQUIRED ON)
9target_include_directories(datapacker PUBLIC ${CMAKE_BINARY_DIR}) 9target_include_directories(datapacker PUBLIC ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tools)
10target_link_libraries(datapacker PUBLIC protos protobuf::libprotobuf) 10target_link_libraries(datapacker PUBLIC protos util protobuf::libprotobuf)
diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp index ead3818..29fa1a5 100644 --- a/tools/datapacker/container.cpp +++ b/tools/datapacker/container.cpp
@@ -1,5 +1,9 @@
1#include "container.h" 1#include "container.h"
2 2
3#include <iostream>
4
5#include "util/naming.h"
6
3namespace com::fourisland::lingo2_archipelago { 7namespace com::fourisland::lingo2_archipelago {
4 8
5uint64_t Container::FindOrAddMap(std::string map_name) { 9uint64_t Container::FindOrAddMap(std::string map_name) {
@@ -169,6 +173,79 @@ uint64_t Container::FindOrAddPanel(std::optional<std::string> map_name,
169 } 173 }
170} 174}
171 175
176uint64_t Container::FindOrAddLetter(std::string key, bool double_) {
177 std::string letter_name = GetLetterName(key, double_);
178
179 auto it = letter_id_by_name_.find(letter_name);
180 if (it == letter_id_by_name_.end()) {
181 uint64_t new_id = all_objects_.letters_size();
182 Letter* letter = all_objects_.add_letters();
183 letter->set_id(new_id);
184 letter->set_key(key);
185
186 if (double_) {
187 letter->set_double_(double_);
188 }
189
190 letter_id_by_name_[letter_name] = new_id;
191
192 return new_id;
193 } else {
194 return it->second;
195 }
196}
197
198uint64_t Container::FindLetterByName(std::string letter_name) {
199 auto it = letter_id_by_name_.find(letter_name);
200 if (it == letter_id_by_name_.end()) {
201 std::cout << "Could not find letter by name: " << letter_name << std::endl;
202 exit(2);
203 } else {
204 return it->second;
205 }
206}
207
208uint64_t Container::FindOrAddMastery(std::optional<std::string> map_name,
209 std::optional<std::string> room_name,
210 std::string mastery_name,
211 std::optional<std::string> map_fallback,
212 std::optional<std::string> room_fallback) {
213 if (!map_name) {
214 if (!map_fallback) {
215 std::cout << "No map name provided for " << mastery_name << std::endl;
216 map_name = "global";
217 } else {
218 map_name = map_fallback;
219 }
220 }
221
222 if (!room_name) {
223 if (!room_fallback) {
224 std::cout << "No room name provided for " << mastery_name << std::endl;
225 room_name = "global";
226 } else {
227 room_name = room_fallback;
228 }
229 }
230
231 auto& room_container =
232 mastery_id_by_map_room_mastery_names_[*map_name][*room_name];
233 auto it = room_container.find(mastery_name);
234 if (it == room_container.end()) {
235 uint64_t new_id = all_objects_.masteries_size();
236 Mastery* mastery = all_objects_.add_masteries();
237 mastery->set_id(new_id);
238 mastery->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
239 mastery->set_name(mastery_name);
240
241 room_container[mastery_name] = new_id;
242
243 return new_id;
244 } else {
245 return it->second;
246 }
247}
248
172uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, 249uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name,
173 std::string door_name, 250 std::string door_name,
174 std::optional<std::string> map_fallback) { 251 std::optional<std::string> map_fallback) {
diff --git a/tools/datapacker/container.h b/tools/datapacker/container.h index 571a066..652a025 100644 --- a/tools/datapacker/container.h +++ b/tools/datapacker/container.h
@@ -36,6 +36,16 @@ class Container {
36 std::optional<std::string> map_fallback, 36 std::optional<std::string> map_fallback,
37 std::optional<std::string> room_fallback); 37 std::optional<std::string> room_fallback);
38 38
39 uint64_t FindOrAddLetter(std::string key, bool double_);
40
41 uint64_t FindLetterByName(std::string letter_name);
42
43 uint64_t FindOrAddMastery(std::optional<std::string> map_name,
44 std::optional<std::string> room_name,
45 std::string mastery_name,
46 std::optional<std::string> map_fallback,
47 std::optional<std::string> room_fallback);
48
39 uint64_t FindOrAddDoor(std::optional<std::string> map_name, 49 uint64_t FindOrAddDoor(std::optional<std::string> map_name,
40 std::string door_name, 50 std::string door_name,
41 std::optional<std::string> map_fallback); 51 std::optional<std::string> map_fallback);
@@ -56,6 +66,9 @@ class Container {
56 port_id_by_map_room_port_names_; 66 port_id_by_map_room_port_names_;
57 std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>> 67 std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>>
58 panel_id_by_map_room_panel_names_; 68 panel_id_by_map_room_panel_names_;
69 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>>>
71 mastery_id_by_map_room_mastery_names_;
59 std::map<std::string, std::map<std::string, uint64_t>> 72 std::map<std::string, std::map<std::string, uint64_t>>
60 door_id_by_map_door_names_; 73 door_id_by_map_door_names_;
61}; 74};
diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 28dbc6b..2ad97b0 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp
@@ -101,9 +101,14 @@ class DataPacker {
101 room.add_ports(ProcessPort(h_port, current_map_name, room.name())); 101 room.add_ports(ProcessPort(h_port, current_map_name, room.name()));
102 } 102 }
103 103
104 std::copy( 104 for (const HumanLetter& h_letter : h_room.letters()) {
105 h_room.letters().begin(), h_room.letters().end(), 105 room.add_letters(ProcessLetter(h_letter, current_map_name, room.name()));
106 google::protobuf::RepeatedFieldBackInserter(room.mutable_letters())); 106 }
107
108 for (const HumanMastery& h_mastery : h_room.masteries()) {
109 room.add_masteries(
110 ProcessMastery(h_mastery, current_map_name, room.name()));
111 }
107 } 112 }
108 113
109 uint64_t ProcessPanel(const HumanPanel& h_panel, 114 uint64_t ProcessPanel(const HumanPanel& h_panel,
@@ -197,6 +202,33 @@ class DataPacker {
197 return port_id; 202 return port_id;
198 } 203 }
199 204
205 uint64_t ProcessLetter(const HumanLetter& h_letter,
206 const std::string& current_map_name,
207 const std::string& current_room_name) {
208 uint64_t letter_id =
209 container_.FindOrAddLetter(h_letter.key(), h_letter.double_());
210 Letter& letter = *container_.all_objects().mutable_letters(letter_id);
211
212 letter.set_room_id(container_.FindOrAddRoom(
213 current_map_name, current_room_name, std::nullopt));
214 letter.set_path(h_letter.path());
215
216 return letter_id;
217 }
218
219 uint64_t ProcessMastery(const HumanMastery& h_mastery,
220 const std::string& current_map_name,
221 const std::string& current_room_name) {
222 uint64_t mastery_id = container_.FindOrAddMastery(
223 current_map_name, current_room_name, h_mastery.name(), std::nullopt,
224 std::nullopt);
225 Mastery& mastery = *container_.all_objects().mutable_masteries(mastery_id);
226
227 mastery.set_path(h_mastery.path());
228
229 return mastery_id;
230 }
231
200 void ProcessDoorsFile(std::filesystem::path path, 232 void ProcessDoorsFile(std::filesystem::path path,
201 const std::string& current_map_name) { 233 const std::string& current_map_name) {
202 if (!std::filesystem::exists(path)) { 234 if (!std::filesystem::exists(path)) {
@@ -410,6 +442,14 @@ class DataPacker {
410 map_name, room_name, panel_name, std::nullopt, std::nullopt); 442 map_name, room_name, panel_name, std::nullopt, std::nullopt);
411 container_.all_objects().mutable_panels(panel_id)->set_ap_id(ap_id); 443 container_.all_objects().mutable_panels(panel_id)->set_ap_id(ap_id);
412 } 444 }
445
446 for (const auto& [mastery_name, ap_id] : room.masteries()) {
447 uint64_t mastery_id = container_.FindOrAddMastery(
448 map_name, room_name, mastery_name, std::nullopt, std::nullopt);
449 container_.all_objects()
450 .mutable_masteries(mastery_id)
451 ->set_ap_id(ap_id);
452 }
413 } 453 }
414 } 454 }
415 455
@@ -417,6 +457,11 @@ class DataPacker {
417 for (const auto& [tag, id] : ids.special()) { 457 for (const auto& [tag, id] : ids.special()) {
418 specials[tag] = id; 458 specials[tag] = id;
419 } 459 }
460
461 for (const auto& [letter_name, ap_id] : ids.letters()) {
462 uint64_t letter_id = container_.FindLetterByName(letter_name);
463 container_.all_objects().mutable_letters(letter_id)->set_ap_id(ap_id);
464 }
420 } 465 }
421 466
422 std::string mapdir_; 467 std::string mapdir_;