diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-08-09 11:51:20 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-08-09 11:51:20 -0400 |
commit | 9ca8681ca5f134d65eaa4b5ae68d57ba67fe98d6 (patch) | |
tree | 6d58ffe2e9a60eac681b22b0cb0bd03baf74990c /tools | |
parent | 3fcc676cd3b9b3b24a8755612a459d498879b1df (diff) | |
download | lingo2-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')
-rw-r--r-- | tools/assign_ids/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tools/assign_ids/main.cpp | 30 | ||||
-rw-r--r-- | tools/datapacker/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tools/datapacker/container.cpp | 77 | ||||
-rw-r--r-- | tools/datapacker/container.h | 13 | ||||
-rw-r--r-- | tools/datapacker/main.cpp | 51 | ||||
-rw-r--r-- | tools/util/CMakeLists.txt | 5 | ||||
-rw-r--r-- | tools/util/naming.cpp | 11 | ||||
-rw-r--r-- | tools/util/naming.h | 8 |
9 files changed, 196 insertions, 7 deletions
diff --git a/tools/assign_ids/CMakeLists.txt b/tools/assign_ids/CMakeLists.txt index 0a9f62d..bc89347 100644 --- a/tools/assign_ids/CMakeLists.txt +++ b/tools/assign_ids/CMakeLists.txt | |||
@@ -5,5 +5,5 @@ add_executable(assign_ids | |||
5 | ) | 5 | ) |
6 | set_property(TARGET assign_ids PROPERTY CXX_STANDARD 20) | 6 | set_property(TARGET assign_ids PROPERTY CXX_STANDARD 20) |
7 | set_property(TARGET assign_ids PROPERTY CXX_STANDARD_REQUIRED ON) | 7 | set_property(TARGET assign_ids PROPERTY CXX_STANDARD_REQUIRED ON) |
8 | target_include_directories(assign_ids PUBLIC ${CMAKE_BINARY_DIR}) | 8 | target_include_directories(assign_ids PUBLIC ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tools) |
9 | target_link_libraries(assign_ids PUBLIC protos protobuf::libprotobuf) | 9 | target_link_libraries(assign_ids PUBLIC protos protobuf::libprotobuf util) |
diff --git a/tools/assign_ids/main.cpp b/tools/assign_ids/main.cpp index f10a21c..eba4fd6 100644 --- a/tools/assign_ids/main.cpp +++ b/tools/assign_ids/main.cpp | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <string> | 9 | #include <string> |
10 | 10 | ||
11 | #include "proto/human.pb.h" | 11 | #include "proto/human.pb.h" |
12 | #include "util/naming.h" | ||
12 | 13 | ||
13 | namespace com::fourisland::lingo2_archipelago { | 14 | namespace com::fourisland::lingo2_archipelago { |
14 | namespace { | 15 | namespace { |
@@ -155,6 +156,35 @@ class AssignIds { | |||
155 | panels[h_panel.name()] = next_id_++; | 156 | panels[h_panel.name()] = next_id_++; |
156 | } | 157 | } |
157 | } | 158 | } |
159 | |||
160 | for (const HumanLetter& h_letter : h_room.letters()) { | ||
161 | std::string lettername = | ||
162 | GetLetterName(h_letter.key(), h_letter.double_()); | ||
163 | |||
164 | if (!id_mappings_.letters().contains(lettername)) { | ||
165 | auto& letters = *id_mappings_.mutable_letters(); | ||
166 | letters[lettername] = next_id_++; | ||
167 | } | ||
168 | } | ||
169 | |||
170 | for (const HumanMastery& h_mastery : h_room.masteries()) { | ||
171 | if (!id_mappings_.maps().contains(current_map_name) || | ||
172 | !id_mappings_.maps() | ||
173 | .at(current_map_name) | ||
174 | .rooms() | ||
175 | .contains(h_room.name()) || | ||
176 | !id_mappings_.maps() | ||
177 | .at(current_map_name) | ||
178 | .rooms() | ||
179 | .at(h_room.name()) | ||
180 | .masteries() | ||
181 | .contains(h_mastery.name())) { | ||
182 | auto& maps = *id_mappings_.mutable_maps(); | ||
183 | auto& rooms = *maps[current_map_name].mutable_rooms(); | ||
184 | auto& masteries = *rooms[h_room.name()].mutable_masteries(); | ||
185 | masteries[h_mastery.name()] = next_id_++; | ||
186 | } | ||
187 | } | ||
158 | } | 188 | } |
159 | 189 | ||
160 | private: | 190 | private: |
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 | ) |
7 | set_property(TARGET datapacker PROPERTY CXX_STANDARD 20) | 7 | set_property(TARGET datapacker PROPERTY CXX_STANDARD 20) |
8 | set_property(TARGET datapacker PROPERTY CXX_STANDARD_REQUIRED ON) | 8 | set_property(TARGET datapacker PROPERTY CXX_STANDARD_REQUIRED ON) |
9 | target_include_directories(datapacker PUBLIC ${CMAKE_BINARY_DIR}) | 9 | target_include_directories(datapacker PUBLIC ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tools) |
10 | target_link_libraries(datapacker PUBLIC protos protobuf::libprotobuf) | 10 | target_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 | |||
3 | namespace com::fourisland::lingo2_archipelago { | 7 | namespace com::fourisland::lingo2_archipelago { |
4 | 8 | ||
5 | uint64_t Container::FindOrAddMap(std::string map_name) { | 9 | uint64_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 | ||
176 | uint64_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 | |||
198 | uint64_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 | |||
208 | uint64_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 | |||
172 | uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, | 249 | uint64_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_; |
diff --git a/tools/util/CMakeLists.txt b/tools/util/CMakeLists.txt new file mode 100644 index 0000000..8eb8d3b --- /dev/null +++ b/tools/util/CMakeLists.txt | |||
@@ -0,0 +1,5 @@ | |||
1 | add_library(util | ||
2 | naming.cpp | ||
3 | ) | ||
4 | set_property(TARGET util PROPERTY CXX_STANDARD 20) | ||
5 | set_property(TARGET util PROPERTY CXX_STANDARD_REQUIRED ON) | ||
diff --git a/tools/util/naming.cpp b/tools/util/naming.cpp new file mode 100644 index 0000000..12594c5 --- /dev/null +++ b/tools/util/naming.cpp | |||
@@ -0,0 +1,11 @@ | |||
1 | #include "naming.h" | ||
2 | |||
3 | #include <sstream> | ||
4 | |||
5 | std::string GetLetterName(std::string key, bool double_) { | ||
6 | std::ostringstream lettername_s; | ||
7 | lettername_s << key; | ||
8 | lettername_s << (double_ ? "2" : "1"); | ||
9 | |||
10 | return lettername_s.str(); | ||
11 | } | ||
diff --git a/tools/util/naming.h b/tools/util/naming.h new file mode 100644 index 0000000..7d61309 --- /dev/null +++ b/tools/util/naming.h | |||
@@ -0,0 +1,8 @@ | |||
1 | #ifndef TOOLS_UTIL_NAMING_H_ | ||
2 | #define TOOLS_UTIL_NAMING_H_ | ||
3 | |||
4 | #include <string> | ||
5 | |||
6 | std::string GetLetterName(std::string key, bool double_); | ||
7 | |||
8 | #endif /* TOOLS_UTIL_NAMING_H_ */ | ||