From 15b8794bbe80be0bcf1f482674455efe002cec2c Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 17 Aug 2025 16:36:24 -0400 Subject: Validate that node paths aren't used multiple times --- tools/validator/human_processor.cpp | 20 +++++++++++++++++++- tools/validator/structs.h | 9 +++++++++ tools/validator/validator.cpp | 12 ++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/validator/human_processor.cpp b/tools/validator/human_processor.cpp index 26aee56..0846bb8 100644 --- a/tools/validator/human_processor.cpp +++ b/tools/validator/human_processor.cpp @@ -114,9 +114,14 @@ class HumanProcessor { panel_info.definitions.push_back(h_panel); panel_info.proxies[h_panel.answer()].definitions.push_back(Proxy()); + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_panel.path()].uses++; + for (const Proxy& h_proxy : h_panel.proxies()) { ProxyInfo& proxy_info = panel_info.proxies[h_proxy.answer()]; proxy_info.definitions.push_back(h_proxy); + + map_info.game_nodes[h_proxy.path()].uses++; } if (h_panel.has_required_door()) { @@ -145,6 +150,9 @@ class HumanProcessor { PaintingInfo& painting_info = info_.paintings[painting_identifier]; painting_info.definitions.push_back(h_painting); + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_painting.path()].uses++; + if (h_painting.has_required_door()) { DoorIdentifier required_door_identifier = *GetCompleteDoorIdentifier( h_painting.required_door(), current_map_name); @@ -163,6 +171,9 @@ class HumanProcessor { PortInfo& port_info = info_.ports[port_identifier]; port_info.definitions.push_back(h_port); + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_port.path()].uses++; + if (h_port.has_required_door()) { DoorIdentifier required_door_identifier = *GetCompleteDoorIdentifier(h_port.required_door(), current_map_name); @@ -182,12 +193,16 @@ class HumanProcessor { room_identifier.set_map(current_map_name); room_identifier.set_name(current_room_name); letter_info.defined_in.push_back(room_identifier); + + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_letter.path()].uses++; } void ProcessMastery(const HumanMastery& h_mastery, const std::string& current_map_name, const std::string& current_room_name) { - // Nothing really to validate about masteries yet. + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_mastery.path()].uses++; } void ProcessKeyholder(const HumanKeyholder& h_keyholder, @@ -200,6 +215,9 @@ class HumanProcessor { KeyholderInfo& keyholder_info = info_.keyholders[keyholder_identifier]; keyholder_info.definitions.push_back(h_keyholder); + + MapInfo& map_info = info_.maps[current_map_name]; + map_info.game_nodes[h_keyholder.path()].uses++; } void ProcessDoorsFile(std::filesystem::path path, diff --git a/tools/validator/structs.h b/tools/validator/structs.h index c3427f4..1b61f77 100644 --- a/tools/validator/structs.h +++ b/tools/validator/structs.h @@ -20,6 +20,14 @@ struct MalformedIdentifiers { } }; +struct GameNodeInfo { + int uses = 0; +}; + +struct MapInfo { + std::map game_nodes; +}; + struct RoomInfo { std::vector definitions; @@ -82,6 +90,7 @@ struct LetterInfo { }; struct CollectedInfo { + std::map maps; std::map rooms; std::map doors; std::map ports; diff --git a/tools/validator/validator.cpp b/tools/validator/validator.cpp index 3381ed2..f2ec280 100644 --- a/tools/validator/validator.cpp +++ b/tools/validator/validator.cpp @@ -9,6 +9,15 @@ namespace com::fourisland::lingo2_archipelago { namespace { +void ValidateMap(const std::string& map_name, const MapInfo& map_info) { + for (const auto& [node_path, node_info] : map_info.game_nodes) { + if (node_info.uses > 1) { + std::cout << "Map " << map_name << " node " << node_path + << " is used in multiple places." << std::endl; + } + } +} + void ValidateRoom(const RoomIdentifier& room_identifier, const RoomInfo& room_info) { if (room_info.definitions.empty()) { @@ -224,6 +233,9 @@ void ValidateLetter(const LetterIdentifier& letter_identifier, } // namespace void ValidateCollectedInfo(const CollectedInfo& info) { + for (const auto& [map_name, map_info] : info.maps) { + ValidateMap(map_name, map_info); + } for (const auto& [room_identifier, room_info] : info.rooms) { ValidateRoom(room_identifier, room_info); } -- cgit 1.4.1