From d77c73397b684faa55f0e95484ac89ca68bde1ad Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 20 Aug 2025 15:03:18 -0400 Subject: Added "endings" object type --- tools/assign_ids/main.cpp | 13 +++++++++++++ tools/datapacker/container.cpp | 16 ++++++++++++++++ tools/datapacker/container.h | 3 +++ tools/datapacker/main.cpp | 22 ++++++++++++++++++++++ tools/util/ids_yaml_format.cpp | 12 ++++++++++++ tools/validator/human_processor.cpp | 20 +++++++++++++++++++- tools/validator/structs.h | 5 +++++ tools/validator/validator.cpp | 15 +++++++++++++++ 8 files changed, 105 insertions(+), 1 deletion(-) (limited to 'tools') 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 { } } + for (const auto& [_, id] : id_mappings_.endings()) { + if (id > next_id_) { + next_id_ = id; + } + } + next_id_++; } @@ -195,6 +201,13 @@ class AssignIds { masteries[h_mastery.name()] = next_id_++; } } + + for (const HumanEnding& h_ending : h_room.endings()) { + if (!id_mappings_.endings().contains(h_ending.name())) { + auto& endings = *id_mappings_.mutable_endings(); + endings[h_ending.name()] = next_id_++; + } + } } 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) { } } +uint64_t Container::FindOrAddEnding(std::string ending_name) { + auto it = ending_id_by_name_.find(ending_name); + if (it == ending_id_by_name_.end()) { + uint64_t new_id = all_objects_.endings_size(); + Ending* ending = all_objects_.add_endings(); + ending->set_id(new_id); + ending->set_name(ending_name); + + ending_id_by_name_[ending_name] = new_id; + + return new_id; + } else { + return it->second; + } +} + uint64_t Container::FindOrAddMastery(std::optional map_name, std::optional room_name, 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 { uint64_t FindLetterByName(std::string letter_name); + uint64_t FindOrAddEnding(std::string ending_name); + uint64_t FindOrAddMastery(std::optional map_name, std::optional room_name, std::string mastery_name, @@ -79,6 +81,7 @@ class Container { keyholder_id_by_map_room_keyholder_names_; std::map> door_id_by_map_door_names_; + std::map ending_id_by_name_; }; } // 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 { room.add_keyholders( ProcessKeyholder(h_keyholder, current_map_name, room.name())); } + + for (const HumanEnding& h_ending : h_room.endings()) { + room.add_endings(ProcessEnding(h_ending, current_map_name, room.name())); + } } uint64_t ProcessPanel(const HumanPanel& h_panel, @@ -266,6 +270,19 @@ class DataPacker { return keyholder_id; } + uint64_t ProcessEnding(const HumanEnding& h_ending, + const std::string& current_map_name, + const std::string& current_room_name) { + uint64_t ending_id = container_.FindOrAddEnding(h_ending.name()); + Ending& ending = *container_.all_objects().mutable_endings(ending_id); + + ending.set_room_id(container_.FindOrAddRoom( + current_map_name, current_room_name, std::nullopt)); + ending.set_path(h_ending.path()); + + return ending_id; + } + void ProcessDoorsFile(std::filesystem::path path, const std::string& current_map_name) { if (!std::filesystem::exists(path)) { @@ -526,6 +543,11 @@ class DataPacker { uint64_t letter_id = container_.FindLetterByName(letter_name); container_.all_objects().mutable_letters(letter_id)->set_ap_id(ap_id); } + + for (const auto& [ending_name, ap_id] : ids.endings()) { + uint64_t ending_id = container_.FindOrAddEnding(ending_name); + container_.all_objects().mutable_endings(ending_id)->set_ap_id(ap_id); + } } 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) { } } + if (document["endings"]) { + for (const auto& ending_it : document["endings"]) { + (*result.mutable_endings())[ending_it.first.as()] = + ending_it.second.as(); + } + } + if (document["special"]) { for (const auto& special_it : document["special"]) { (*result.mutable_special())[special_it.first.as()] = @@ -127,6 +134,11 @@ void WriteIdsAsYaml(const IdMappings& ids, const std::string& filename) { result["letters"][letter_name] = letter_id; }); + OperateOnSortedMap(ids.endings(), [&result](const std::string& ending_name, + uint64_t ending_id) { + result["endings"][ending_name] = ending_id; + }); + OperateOnSortedMap(ids.special(), [&result](const std::string& special_name, uint64_t special_id) { 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 { } void ProcessMetadataFile(std::filesystem::path path, - const std::string& current_map_name) { + const std::string& current_map_name) { if (!std::filesystem::exists(path)) { return; } @@ -115,6 +115,10 @@ class HumanProcessor { for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { ProcessKeyholder(h_keyholder, current_map_name, h_room.name()); } + + for (const HumanEnding& h_ending : h_room.endings()) { + ProcessEnding(h_ending, current_map_name, h_room.name()); + } } void ProcessPanel(const HumanPanel& h_panel, @@ -235,6 +239,20 @@ class HumanProcessor { map_info.game_nodes[h_keyholder.path()].uses++; } + void ProcessEnding(const HumanEnding& h_ending, + const std::string& current_map_name, + const std::string& current_room_name) { + EndingInfo& ending_info = info_.endings[h_ending.name()]; + + RoomIdentifier room_identifier; + room_identifier.set_map(current_map_name); + room_identifier.set_name(current_room_name); + ending_info.defined_in.push_back(room_identifier); + + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_ending.path()].uses++; + } + void ProcessDoorsFile(std::filesystem::path path, const std::string& current_map_name) { 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 { std::vector defined_in; }; +struct EndingInfo { + std::vector defined_in; +}; + struct CollectedInfo { std::map maps; std::map rooms; @@ -100,6 +104,7 @@ struct CollectedInfo { std::map keyholders; std::map letters; + std::map endings; }; } // 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, } } +void ValidateEnding(const std::string& ending_name, + const EndingInfo& ending_info) { + if (ending_info.defined_in.size() > 1) { + std::cout << "Ending " << ending_name + << " was defined in multiple places:" << std::endl; + + for (const RoomIdentifier& room_identifier : ending_info.defined_in) { + std::cout << " " << room_identifier.ShortDebugString() << std::endl; + } + } +} + } // namespace void ValidateCollectedInfo(const CollectedInfo& info) { @@ -265,6 +277,9 @@ void ValidateCollectedInfo(const CollectedInfo& info) { for (const auto& [letter_identifier, letter_info] : info.letters) { ValidateLetter(letter_identifier, letter_info); } + for (const auto& [ending_name, ending_info] : info.endings) { + ValidateEnding(ending_name, ending_info); + } } } // namespace com::fourisland::lingo2_archipelago -- cgit 1.4.1