diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-08-20 15:03:18 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-08-20 15:03:18 -0400 |
| commit | d77c73397b684faa55f0e95484ac89ca68bde1ad (patch) | |
| tree | 84fd35d342b69a9765d8f94473b56998d26e323d /tools | |
| parent | 53ad8e2f3e5fcf9cf9d5d4628498557e0f5500e8 (diff) | |
| download | lingo2-archipelago-d77c73397b684faa55f0e95484ac89ca68bde1ad.tar.gz lingo2-archipelago-d77c73397b684faa55f0e95484ac89ca68bde1ad.tar.bz2 lingo2-archipelago-d77c73397b684faa55f0e95484ac89ca68bde1ad.zip | |
Added "endings" object type
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/assign_ids/main.cpp | 13 | ||||
| -rw-r--r-- | tools/datapacker/container.cpp | 16 | ||||
| -rw-r--r-- | tools/datapacker/container.h | 3 | ||||
| -rw-r--r-- | tools/datapacker/main.cpp | 22 | ||||
| -rw-r--r-- | tools/util/ids_yaml_format.cpp | 12 | ||||
| -rw-r--r-- | tools/validator/human_processor.cpp | 20 | ||||
| -rw-r--r-- | tools/validator/structs.h | 5 | ||||
| -rw-r--r-- | tools/validator/validator.cpp | 15 |
8 files changed, 105 insertions, 1 deletions
| diff --git a/tools/assign_ids/main.cpp b/tools/assign_ids/main.cpp index 2471bc5..77c0e5a 100644 --- a/tools/assign_ids/main.cpp +++ b/tools/assign_ids/main.cpp | |||
| @@ -87,6 +87,12 @@ class AssignIds { | |||
| 87 | } | 87 | } |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | for (const auto& [_, id] : id_mappings_.endings()) { | ||
| 91 | if (id > next_id_) { | ||
| 92 | next_id_ = id; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 90 | next_id_++; | 96 | next_id_++; |
| 91 | } | 97 | } |
| 92 | 98 | ||
| @@ -195,6 +201,13 @@ class AssignIds { | |||
| 195 | masteries[h_mastery.name()] = next_id_++; | 201 | masteries[h_mastery.name()] = next_id_++; |
| 196 | } | 202 | } |
| 197 | } | 203 | } |
| 204 | |||
| 205 | for (const HumanEnding& h_ending : h_room.endings()) { | ||
| 206 | if (!id_mappings_.endings().contains(h_ending.name())) { | ||
| 207 | auto& endings = *id_mappings_.mutable_endings(); | ||
| 208 | endings[h_ending.name()] = next_id_++; | ||
| 209 | } | ||
| 210 | } | ||
| 198 | } | 211 | } |
| 199 | 212 | ||
| 200 | private: | 213 | private: |
| diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp index ffcb75a..0d3417e 100644 --- a/tools/datapacker/container.cpp +++ b/tools/datapacker/container.cpp | |||
| @@ -205,6 +205,22 @@ uint64_t Container::FindLetterByName(std::string letter_name) { | |||
| 205 | } | 205 | } |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | uint64_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 | |||
| 208 | uint64_t Container::FindOrAddMastery(std::optional<std::string> map_name, | 224 | uint64_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, |
| diff --git a/tools/datapacker/container.h b/tools/datapacker/container.h index e1a84d8..68f5875 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, |
| @@ -79,6 +81,7 @@ class Container { | |||
| 79 | keyholder_id_by_map_room_keyholder_names_; | 81 | keyholder_id_by_map_room_keyholder_names_; |
| 80 | std::map<std::string, std::map<std::string, uint64_t>> | 82 | std::map<std::string, std::map<std::string, uint64_t>> |
| 81 | door_id_by_map_door_names_; | 83 | door_id_by_map_door_names_; |
| 84 | std::map<std::string, uint64_t> ending_id_by_name_; | ||
| 82 | }; | 85 | }; |
| 83 | 86 | ||
| 84 | } // namespace com::fourisland::lingo2_archipelago | 87 | } // namespace com::fourisland::lingo2_archipelago |
| diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 0beb304..c5a90e9 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp | |||
| @@ -115,6 +115,10 @@ class DataPacker { | |||
| 115 | room.add_keyholders( | 115 | room.add_keyholders( |
| 116 | ProcessKeyholder(h_keyholder, current_map_name, room.name())); | 116 | ProcessKeyholder(h_keyholder, current_map_name, room.name())); |
| 117 | } | 117 | } |
| 118 | |||
| 119 | for (const HumanEnding& h_ending : h_room.endings()) { | ||
| 120 | room.add_endings(ProcessEnding(h_ending, current_map_name, room.name())); | ||
| 121 | } | ||
| 118 | } | 122 | } |
| 119 | 123 | ||
| 120 | uint64_t ProcessPanel(const HumanPanel& h_panel, | 124 | uint64_t ProcessPanel(const HumanPanel& h_panel, |
| @@ -266,6 +270,19 @@ class DataPacker { | |||
| 266 | return keyholder_id; | 270 | return keyholder_id; |
| 267 | } | 271 | } |
| 268 | 272 | ||
| 273 | uint64_t ProcessEnding(const HumanEnding& h_ending, | ||
| 274 | const std::string& current_map_name, | ||
| 275 | const std::string& current_room_name) { | ||
| 276 | uint64_t ending_id = container_.FindOrAddEnding(h_ending.name()); | ||
| 277 | Ending& ending = *container_.all_objects().mutable_endings(ending_id); | ||
| 278 | |||
| 279 | ending.set_room_id(container_.FindOrAddRoom( | ||
| 280 | current_map_name, current_room_name, std::nullopt)); | ||
| 281 | ending.set_path(h_ending.path()); | ||
| 282 | |||
| 283 | return ending_id; | ||
| 284 | } | ||
| 285 | |||
| 269 | void ProcessDoorsFile(std::filesystem::path path, | 286 | void ProcessDoorsFile(std::filesystem::path path, |
| 270 | const std::string& current_map_name) { | 287 | const std::string& current_map_name) { |
| 271 | if (!std::filesystem::exists(path)) { | 288 | if (!std::filesystem::exists(path)) { |
| @@ -526,6 +543,11 @@ class DataPacker { | |||
| 526 | uint64_t letter_id = container_.FindLetterByName(letter_name); | 543 | uint64_t letter_id = container_.FindLetterByName(letter_name); |
| 527 | container_.all_objects().mutable_letters(letter_id)->set_ap_id(ap_id); | 544 | container_.all_objects().mutable_letters(letter_id)->set_ap_id(ap_id); |
| 528 | } | 545 | } |
| 546 | |||
| 547 | for (const auto& [ending_name, ap_id] : ids.endings()) { | ||
| 548 | uint64_t ending_id = container_.FindOrAddEnding(ending_name); | ||
| 549 | container_.all_objects().mutable_endings(ending_id)->set_ap_id(ap_id); | ||
| 550 | } | ||
| 529 | } | 551 | } |
| 530 | 552 | ||
| 531 | std::string mapdir_; | 553 | std::string mapdir_; |
| diff --git a/tools/util/ids_yaml_format.cpp b/tools/util/ids_yaml_format.cpp index 99a8890..f72f60e 100644 --- a/tools/util/ids_yaml_format.cpp +++ b/tools/util/ids_yaml_format.cpp | |||
| @@ -75,6 +75,13 @@ IdMappings ReadIdsFromYaml(const std::string& filename) { | |||
| 75 | } | 75 | } |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | if (document["endings"]) { | ||
| 79 | for (const auto& ending_it : document["endings"]) { | ||
| 80 | (*result.mutable_endings())[ending_it.first.as<std::string>()] = | ||
| 81 | ending_it.second.as<uint64_t>(); | ||
| 82 | } | ||
| 83 | } | ||
| 84 | |||
| 78 | if (document["special"]) { | 85 | if (document["special"]) { |
| 79 | for (const auto& special_it : document["special"]) { | 86 | for (const auto& special_it : document["special"]) { |
| 80 | (*result.mutable_special())[special_it.first.as<std::string>()] = | 87 | (*result.mutable_special())[special_it.first.as<std::string>()] = |
| @@ -127,6 +134,11 @@ void WriteIdsAsYaml(const IdMappings& ids, const std::string& filename) { | |||
| 127 | result["letters"][letter_name] = letter_id; | 134 | result["letters"][letter_name] = letter_id; |
| 128 | }); | 135 | }); |
| 129 | 136 | ||
| 137 | OperateOnSortedMap(ids.endings(), [&result](const std::string& ending_name, | ||
| 138 | uint64_t ending_id) { | ||
| 139 | result["endings"][ending_name] = ending_id; | ||
| 140 | }); | ||
| 141 | |||
| 130 | OperateOnSortedMap(ids.special(), [&result](const std::string& special_name, | 142 | OperateOnSortedMap(ids.special(), [&result](const std::string& special_name, |
| 131 | uint64_t special_id) { | 143 | uint64_t special_id) { |
| 132 | result["special"][special_name] = special_id; | 144 | result["special"][special_name] = special_id; |
| diff --git a/tools/validator/human_processor.cpp b/tools/validator/human_processor.cpp index af40980..5a7e78a 100644 --- a/tools/validator/human_processor.cpp +++ b/tools/validator/human_processor.cpp | |||
| @@ -62,7 +62,7 @@ class HumanProcessor { | |||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | void ProcessMetadataFile(std::filesystem::path path, | 64 | void ProcessMetadataFile(std::filesystem::path path, |
| 65 | const std::string& current_map_name) { | 65 | const std::string& current_map_name) { |
| 66 | if (!std::filesystem::exists(path)) { | 66 | if (!std::filesystem::exists(path)) { |
| 67 | return; | 67 | return; |
| 68 | } | 68 | } |
| @@ -115,6 +115,10 @@ class HumanProcessor { | |||
| 115 | for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { | 115 | for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { |
| 116 | ProcessKeyholder(h_keyholder, current_map_name, h_room.name()); | 116 | ProcessKeyholder(h_keyholder, current_map_name, h_room.name()); |
| 117 | } | 117 | } |
| 118 | |||
| 119 | for (const HumanEnding& h_ending : h_room.endings()) { | ||
| 120 | ProcessEnding(h_ending, current_map_name, h_room.name()); | ||
| 121 | } | ||
| 118 | } | 122 | } |
| 119 | 123 | ||
| 120 | void ProcessPanel(const HumanPanel& h_panel, | 124 | void ProcessPanel(const HumanPanel& h_panel, |
| @@ -235,6 +239,20 @@ class HumanProcessor { | |||
| 235 | map_info.game_nodes[h_keyholder.path()].uses++; | 239 | map_info.game_nodes[h_keyholder.path()].uses++; |
| 236 | } | 240 | } |
| 237 | 241 | ||
| 242 | void ProcessEnding(const HumanEnding& h_ending, | ||
| 243 | const std::string& current_map_name, | ||
| 244 | const std::string& current_room_name) { | ||
| 245 | EndingInfo& ending_info = info_.endings[h_ending.name()]; | ||
| 246 | |||
| 247 | RoomIdentifier room_identifier; | ||
| 248 | room_identifier.set_map(current_map_name); | ||
| 249 | room_identifier.set_name(current_room_name); | ||
| 250 | ending_info.defined_in.push_back(room_identifier); | ||
| 251 | |||
| 252 | MapInfo& map_info = info_.maps[current_map_name]; | ||
| 253 | map_info.game_nodes[h_ending.path()].uses++; | ||
| 254 | } | ||
| 255 | |||
| 238 | void ProcessDoorsFile(std::filesystem::path path, | 256 | void ProcessDoorsFile(std::filesystem::path path, |
| 239 | const std::string& current_map_name) { | 257 | const std::string& current_map_name) { |
| 240 | if (!std::filesystem::exists(path)) { | 258 | if (!std::filesystem::exists(path)) { |
| diff --git a/tools/validator/structs.h b/tools/validator/structs.h index 406dc0c..f7d9dc1 100644 --- a/tools/validator/structs.h +++ b/tools/validator/structs.h | |||
| @@ -90,6 +90,10 @@ struct LetterInfo { | |||
| 90 | std::vector<RoomIdentifier> defined_in; | 90 | std::vector<RoomIdentifier> defined_in; |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | struct EndingInfo { | ||
| 94 | std::vector<RoomIdentifier> defined_in; | ||
| 95 | }; | ||
| 96 | |||
| 93 | struct CollectedInfo { | 97 | struct CollectedInfo { |
| 94 | std::map<std::string, MapInfo> maps; | 98 | std::map<std::string, MapInfo> maps; |
| 95 | std::map<RoomIdentifier, RoomInfo, RoomIdentifierLess> rooms; | 99 | std::map<RoomIdentifier, RoomInfo, RoomIdentifierLess> rooms; |
| @@ -100,6 +104,7 @@ struct CollectedInfo { | |||
| 100 | std::map<KeyholderIdentifier, KeyholderInfo, KeyholderIdentifierLess> | 104 | std::map<KeyholderIdentifier, KeyholderInfo, KeyholderIdentifierLess> |
| 101 | keyholders; | 105 | keyholders; |
| 102 | std::map<LetterIdentifier, LetterInfo> letters; | 106 | std::map<LetterIdentifier, LetterInfo> letters; |
| 107 | std::map<std::string, EndingInfo> endings; | ||
| 103 | }; | 108 | }; |
| 104 | 109 | ||
| 105 | } // namespace com::fourisland::lingo2_archipelago | 110 | } // namespace com::fourisland::lingo2_archipelago |
| diff --git a/tools/validator/validator.cpp b/tools/validator/validator.cpp index 6d01b7c..bc6b854 100644 --- a/tools/validator/validator.cpp +++ b/tools/validator/validator.cpp | |||
| @@ -238,6 +238,18 @@ void ValidateLetter(const LetterIdentifier& letter_identifier, | |||
| 238 | } | 238 | } |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | void ValidateEnding(const std::string& ending_name, | ||
| 242 | const EndingInfo& ending_info) { | ||
| 243 | if (ending_info.defined_in.size() > 1) { | ||
| 244 | std::cout << "Ending " << ending_name | ||
| 245 | << " was defined in multiple places:" << std::endl; | ||
| 246 | |||
| 247 | for (const RoomIdentifier& room_identifier : ending_info.defined_in) { | ||
| 248 | std::cout << " " << room_identifier.ShortDebugString() << std::endl; | ||
| 249 | } | ||
| 250 | } | ||
| 251 | } | ||
| 252 | |||
| 241 | } // namespace | 253 | } // namespace |
| 242 | 254 | ||
| 243 | void ValidateCollectedInfo(const CollectedInfo& info) { | 255 | void ValidateCollectedInfo(const CollectedInfo& info) { |
| @@ -265,6 +277,9 @@ void ValidateCollectedInfo(const CollectedInfo& info) { | |||
| 265 | for (const auto& [letter_identifier, letter_info] : info.letters) { | 277 | for (const auto& [letter_identifier, letter_info] : info.letters) { |
| 266 | ValidateLetter(letter_identifier, letter_info); | 278 | ValidateLetter(letter_identifier, letter_info); |
| 267 | } | 279 | } |
| 280 | for (const auto& [ending_name, ending_info] : info.endings) { | ||
| 281 | ValidateEnding(ending_name, ending_info); | ||
| 282 | } | ||
| 268 | } | 283 | } |
| 269 | 284 | ||
| 270 | } // namespace com::fourisland::lingo2_archipelago | 285 | } // namespace com::fourisland::lingo2_archipelago |
