From a752ab325cf46d35a90606a354775799977dccb0 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 4 Sep 2025 15:46:25 -0400 Subject: [Data] Strip unnecessary AP IDs This was causing issues in the client, specifically for The Ancient. --- data/ids.yaml | 15 ------- tools/assign_ids/main.cpp | 77 ++++++++++++++++++++++++++++-------- tools/validator/human_processor.cpp | 66 ++++++++++++++++++++++++++++++- tools/validator/structs.h | 6 +++ tools/validator/validator.cpp | 79 ++++++++++++++++++++++++++++++++++++- 5 files changed, 208 insertions(+), 35 deletions(-) diff --git a/data/ids.yaml b/data/ids.yaml index f241b3f..d124ac8 100644 --- a/data/ids.yaml +++ b/data/ids.yaml @@ -897,7 +897,6 @@ maps: REDACTED: 2274 STRINGS: 2205 WINDS: 2204 - "[REDACTED]": 2207 Yellow Color Door: panels: Paintings: 2210 @@ -1217,7 +1216,6 @@ maps: panels: THIS: 45 doors: - End Door: 42 Front Door: 41 Lavender Cubes: 43 the_bearer: @@ -1298,7 +1296,6 @@ maps: Control Center Brown Door: 49 Exit Door: 47 Overlook Door: 46 - Q2 Door: 48 the_between: rooms: Control Center Side: @@ -1518,9 +1515,7 @@ maps: doors: Colorful Entrance: 222 Congruent Entrance: 223 - Double Letter Panel Blockers: 218 Double Sided Entrance: 224 - S1 Door: 221 Second Room Entrance: 219 Third Room Entrance: 220 the_digital: @@ -1720,8 +1715,6 @@ maps: panels: CORN: 393 DICE: 392 - HOLE: 390 - RABBIT: 389 WREATH: 391 doors: Blue Alcove Entrance: 297 @@ -1733,7 +1726,6 @@ maps: D Room Entrance: 319 Daedalus Entrance: 311 Flip Area Entrance: 310 - Flipped Pyramid Area Entrance: 315 Flipped Second Room Left Door: 300 Flipped Second Room Right Door: 299 Gallery Entrance: 321 @@ -2337,7 +2329,6 @@ maps: doors: Left Room Puzzles: 763 Main Room Door: 2750 - Main Room Puzzles: 765 Right Room Puzzles: 764 the_orb: rooms: @@ -2398,11 +2389,6 @@ maps: panels: CRUSH: 845 RAY: 846 - R2C2.5 Bottom: - panels: - BLACK: 849 - FIGMENT: 848 - FIZZLE: 847 R2C3 Bottom: panels: BLACK: 2747 @@ -3713,7 +3699,6 @@ maps: HEALTH: 1428 doors: Bearer Entrance: 1259 - Black Alcove: 2265 Brown Alcove: 1255 Digital Entrance: 1257 East Room 1: 2740 diff --git a/tools/assign_ids/main.cpp b/tools/assign_ids/main.cpp index 6eb41e3..e3add66 100644 --- a/tools/assign_ids/main.cpp +++ b/tools/assign_ids/main.cpp @@ -40,6 +40,7 @@ class AssignIds { ReadIds(ids_path); ProcessMaps(datadir_path); + ProcessSpecialIds(); ProcessProgressivesFile(datadir_path / "progressives.txtpb"); WriteIds(ids_path); @@ -72,7 +73,7 @@ class AssignIds { } void WriteIds(std::filesystem::path path) { - WriteIdsAsYaml(id_mappings_, path.string()); + WriteIdsAsYaml(output_, path.string()); } void ProcessMaps(std::filesystem::path path) { @@ -109,14 +110,18 @@ class AssignIds { return; } + auto& maps = *output_.mutable_maps(); + auto& doors = *maps[current_map_name].mutable_doors(); + if (!id_mappings_.maps().contains(current_map_name) || !id_mappings_.maps() .at(current_map_name) .doors() .contains(h_door.name())) { - auto& maps = *id_mappings_.mutable_maps(); - auto& doors = *maps[current_map_name].mutable_doors(); doors[h_door.name()] = next_id_++; + } else { + doors[h_door.name()] = + id_mappings_.maps().at(current_map_name).doors().at(h_door.name()); } } @@ -131,6 +136,10 @@ class AssignIds { void ProcessRoom(const HumanRoom& h_room, const std::string& current_map_name) { for (const HumanPanel& h_panel : h_room.panels()) { + auto& maps = *output_.mutable_maps(); + auto& rooms = *maps[current_map_name].mutable_rooms(); + auto& panels = *rooms[h_room.name()].mutable_panels(); + if (!id_mappings_.maps().contains(current_map_name) || !id_mappings_.maps() .at(current_map_name) @@ -142,23 +151,33 @@ class AssignIds { .at(h_room.name()) .panels() .contains(h_panel.name())) { - auto& maps = *id_mappings_.mutable_maps(); - auto& rooms = *maps[current_map_name].mutable_rooms(); - auto& panels = *rooms[h_room.name()].mutable_panels(); panels[h_panel.name()] = next_id_++; + } else { + panels[h_panel.name()] = id_mappings_.maps() + .at(current_map_name) + .rooms() + .at(h_room.name()) + .panels() + .at(h_panel.name()); } } for (const HumanLetter& h_letter : h_room.letters()) { std::string lettername = GetLetterName(h_letter.key(), h_letter.level2()); + auto& letters = *output_.mutable_letters(); if (!id_mappings_.letters().contains(lettername)) { - auto& letters = *id_mappings_.mutable_letters(); letters[lettername] = next_id_++; + } else { + letters[lettername] = id_mappings_.letters().at(lettername); } } for (const HumanMastery& h_mastery : h_room.masteries()) { + auto& maps = *output_.mutable_maps(); + auto& rooms = *maps[current_map_name].mutable_rooms(); + auto& masteries = *rooms[h_room.name()].mutable_masteries(); + if (!id_mappings_.maps().contains(current_map_name) || !id_mappings_.maps() .at(current_map_name) @@ -170,17 +189,24 @@ class AssignIds { .at(h_room.name()) .masteries() .contains(h_mastery.name())) { - auto& maps = *id_mappings_.mutable_maps(); - auto& rooms = *maps[current_map_name].mutable_rooms(); - auto& masteries = *rooms[h_room.name()].mutable_masteries(); masteries[h_mastery.name()] = next_id_++; + } else { + masteries[h_mastery.name()] = id_mappings_.maps() + .at(current_map_name) + .rooms() + .at(h_room.name()) + .masteries() + .at(h_mastery.name()); } } for (const HumanEnding& h_ending : h_room.endings()) { + auto& endings = *output_.mutable_endings(); + if (!id_mappings_.endings().contains(h_ending.name())) { - auto& endings = *id_mappings_.mutable_endings(); endings[h_ending.name()] = next_id_++; + } else { + endings[h_ending.name()] = id_mappings_.endings().at(h_ending.name()); } } @@ -189,6 +215,10 @@ class AssignIds { continue; } + auto& maps = *output_.mutable_maps(); + auto& rooms = *maps[current_map_name].mutable_rooms(); + auto& keyholders = *rooms[h_room.name()].mutable_keyholders(); + if (!id_mappings_.maps().contains(current_map_name) || !id_mappings_.maps() .at(current_map_name) @@ -200,25 +230,39 @@ class AssignIds { .at(h_room.name()) .keyholders() .contains(h_keyholder.name())) { - auto& maps = *id_mappings_.mutable_maps(); - auto& rooms = *maps[current_map_name].mutable_rooms(); - auto& keyholders = *rooms[h_room.name()].mutable_keyholders(); keyholders[h_keyholder.name()] = next_id_++; + } else { + keyholders[h_keyholder.name()] = id_mappings_.maps() + .at(current_map_name) + .rooms() + .at(h_room.name()) + .keyholders() + .at(h_keyholder.name()); } } } + void ProcessSpecialIds() { + auto& specials = *output_.mutable_special(); + + for (const auto& [special_name, ap_id] : id_mappings_.special()) { + specials[special_name] = ap_id; + } + } + void ProcessProgressivesFile(std::filesystem::path path) { if (!std::filesystem::exists(path)) { return; } auto h_progs = ReadMessageFromFile(path.string()); - auto& progs = *id_mappings_.mutable_progressives(); + auto& progs = *output_.mutable_progressives(); for (const HumanProgressive& h_prog : h_progs.progressives()) { - if (!progs.contains(h_prog.name())) { + if (!id_mappings_.progressives().contains(h_prog.name())) { progs[h_prog.name()] = next_id_++; + } else { + progs[h_prog.name()] = id_mappings_.progressives().at(h_prog.name()); } } } @@ -237,6 +281,7 @@ class AssignIds { uint64_t next_id_ = 1; IdMappings id_mappings_; + IdMappings output_; }; } // namespace diff --git a/tools/validator/human_processor.cpp b/tools/validator/human_processor.cpp index 49e7578..5720ba9 100644 --- a/tools/validator/human_processor.cpp +++ b/tools/validator/human_processor.cpp @@ -13,6 +13,7 @@ #include #include "structs.h" +#include "util/ids_yaml_format.h" namespace com::fourisland::lingo2_archipelago { namespace { @@ -42,7 +43,7 @@ class HumanProcessor { ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt); ProcessMaps(datadir_path); ProcessProgressivesFile(datadir_path / "progressives.txtpb"); - ProcessIdsFile(datadir_path / "ids.txtpb"); + ProcessIdsFile(datadir_path / "ids.yaml"); } private: @@ -510,7 +511,68 @@ class HumanProcessor { } void ProcessIdsFile(std::filesystem::path path) { - // Ignore this for now. + auto ids = ReadIdsFromYaml(path.string()); + + DoorIdentifier di; + PanelIdentifier pi; + KeyholderIdentifier ki; + + for (const auto& [map_name, map] : ids.maps()) { + di.set_map(map_name); + pi.set_map(map_name); + ki.set_map(map_name); + + for (const auto& [door_name, ap_id] : map.doors()) { + di.set_name(door_name); + + DoorInfo& door_info = info_.doors[di]; + door_info.has_id = true; + } + + for (const auto& [room_name, room] : map.rooms()) { + pi.set_room(room_name); + ki.set_room(room_name); + + for (const auto& [panel_name, ap_id] : room.panels()) { + pi.set_name(panel_name); + + PanelInfo& panel_info = info_.panels[pi]; + panel_info.has_id = true; + } + + for (const auto& [mastery_name, ap_id] : room.masteries()) { + // TODO: Mastery + } + + for (const auto& [keyholder_name, ap_id] : room.keyholders()) { + ki.set_name(keyholder_name); + + KeyholderInfo& keyholder_info = info_.keyholders[ki]; + keyholder_info.has_id = true; + } + } + } + + for (const auto& [tag, id] : ids.special()) { + // TODO: Specials + } + + for (const auto& [letter_name, ap_id] : ids.letters()) { + LetterIdentifier li = + std::make_tuple(letter_name[0], letter_name[1] == '2'); + LetterInfo& letter_info = info_.letters[li]; + letter_info.has_id = true; + } + + for (const auto& [ending_name, ap_id] : ids.endings()) { + EndingInfo& ending_info = info_.endings[ending_name]; + ending_info.has_id = true; + } + + for (const auto& [prog_name, ap_id] : ids.progressives()) { + ProgressiveInfo& prog_info = info_.progressives[prog_name]; + prog_info.has_id = true; + } } std::string mapdir_; diff --git a/tools/validator/structs.h b/tools/validator/structs.h index 717fccf..e24ed3d 100644 --- a/tools/validator/structs.h +++ b/tools/validator/structs.h @@ -39,6 +39,7 @@ struct RoomInfo { struct DoorInfo { std::vector definitions; + bool has_id = false; std::vector connections_referenced_by; std::vector doors_referenced_by; @@ -72,6 +73,7 @@ struct ProxyInfo { struct PanelInfo { std::vector definitions; + bool has_id = false; std::string map_area_name; @@ -83,6 +85,7 @@ struct PanelInfo { struct KeyholderInfo { std::vector definitions; + bool has_id = false; std::vector doors_referenced_by; }; @@ -91,10 +94,12 @@ using LetterIdentifier = std::tuple; struct LetterInfo { std::vector defined_in; + bool has_id = false; }; struct EndingInfo { std::vector defined_in; + bool has_id = false; std::vector doors_referenced_by; }; @@ -105,6 +110,7 @@ struct PanelNameInfo { struct ProgressiveInfo { std::vector definitions; + bool has_id = false; std::vector malformed_doors; }; diff --git a/tools/validator/validator.cpp b/tools/validator/validator.cpp index fd004d7..ab1612e 100644 --- a/tools/validator/validator.cpp +++ b/tools/validator/validator.cpp @@ -172,6 +172,10 @@ class Validator { door_info.progressives_referenced_by) { std::cout << " PROGRESSIVE " << prog_name << std::endl; } + + if (door_info.has_id) { + std::cout << " An AP ID is present." << std::endl; + } } else if (door_info.definitions.size() > 1) { std::cout << "Door " << door_identifier.ShortDebugString() << " was defined multiple times." << std::endl; @@ -215,6 +219,17 @@ class Validator { << " is a location that depends on double_letters." << std::endl; } + + bool needs_id = (h_door.type() != DoorType::EVENT); + if (door_info.has_id != needs_id) { + if (needs_id) { + std::cout << "Door " << door_identifier.ShortDebugString() + << " is missing an AP ID." << std::endl; + } else { + std::cout << "Door " << door_identifier.ShortDebugString() + << " should not have an AP ID." << std::endl; + } + } } } @@ -280,6 +295,10 @@ class Validator { std::cout << " CONNECTION " << connection.ShortDebugString() << std::endl; } + + if (panel_info.has_id) { + std::cout << " An AP ID is present." << std::endl; + } } else if (panel_info.definitions.size() > 1) { std::cout << "Panel " << panel_identifier.ShortDebugString() << " was defined multiple times." << std::endl; @@ -308,6 +327,11 @@ class Validator { << "\" was defined multiple times." << std::endl; } } + + if (!panel_info.has_id) { + std::cout << "Panel " << panel_identifier.ShortDebugString() + << " is missing an AP ID." << std::endl; + } } void ValidateKeyholder(const KeyholderIdentifier& keyholder_identifier, @@ -321,10 +345,28 @@ class Validator { std::cout << " DOOR " << door_identifier.ShortDebugString() << std::endl; } + + if (keyholder_info.has_id) { + std::cout << " An AP ID is present." << std::endl; + } } else if (keyholder_info.definitions.size() > 1) { std::cout << "Keyholder " << keyholder_identifier.ShortDebugString() << " was defined multiple times." << std::endl; } + + for (const HumanKeyholder& h_keyholder : keyholder_info.definitions) { + bool needs_id = (h_keyholder.has_key()); + + if (needs_id != keyholder_info.has_id) { + if (needs_id) { + std::cout << "Keyholder " << keyholder_identifier.ShortDebugString() + << " is missing an AP ID." << std::endl; + } else { + std::cout << "Keyholder " << keyholder_identifier.ShortDebugString() + << " should not have an AP ID." << std::endl; + } + } + } } void ValidateLetter(const LetterIdentifier& letter_identifier, @@ -332,7 +374,14 @@ class Validator { std::string letter_name = std::string(1, std::get<0>(letter_identifier)) + (std::get<1>(letter_identifier) ? "2" : "1"); - if (letter_info.defined_in.size() > 1) { + if (letter_info.defined_in.empty()) { + std::cout << "Letter " << letter_name + << " has no definition, but was referenced:" << std::endl; + + if (letter_info.has_id) { + std::cout << " An AP ID is present." << std::endl; + } + } else if (letter_info.defined_in.size() > 1) { std::cout << "Letter " << letter_name << " was defined in multiple places:" << std::endl; @@ -340,6 +389,11 @@ class Validator { std::cout << " " << room_identifier.ShortDebugString() << std::endl; } } + + if (!letter_info.has_id) { + std::cout << "Letter " << letter_name << " is missing an AP ID." + << std::endl; + } } void ValidateEnding(const std::string& ending_name, @@ -353,6 +407,10 @@ class Validator { std::cout << " DOOR " << door_identifier.ShortDebugString() << std::endl; } + + if (ending_info.has_id) { + std::cout << " An AP ID is present." << std::endl; + } } else if (ending_info.defined_in.size() > 1) { std::cout << "Ending " << ending_name << " was defined in multiple places:" << std::endl; @@ -361,6 +419,11 @@ class Validator { std::cout << " " << room_identifier.ShortDebugString() << std::endl; } } + + if (!ending_info.has_id) { + std::cout << "Ending " << ending_name << " is missing an AP ID." + << std::endl; + } } void ValidatePanelName(const std::string& panel_name, @@ -379,10 +442,22 @@ class Validator { void ValidateProgressive(const std::string& prog_name, const ProgressiveInfo& prog_info) const { - if (prog_info.definitions.size() > 1) { + if (prog_info.definitions.empty()) { + std::cout << "Progressive \"" << prog_name + << "\" has no definition, but was referenced:" << std::endl; + + if (prog_info.has_id) { + std::cout << " An AP ID is present." << std::endl; + } + } else if (prog_info.definitions.size() > 1) { std::cout << "Progressive \"" << prog_name << "\" has multiple definitions." << std::endl; } + + if (!prog_info.has_id) { + std::cout << "Progressive \"" << prog_name << "\" is missing an AP ID." + << std::endl; + } } const CollectedInfo& info_; -- cgit 1.4.1