diff options
| -rw-r--r-- | data/ids.txtpb | 205 | ||||
| -rw-r--r-- | proto/data.proto | 18 | ||||
| -rw-r--r-- | tools/datapacker/container.cpp | 40 | ||||
| -rw-r--r-- | tools/datapacker/container.h | 8 | ||||
| -rw-r--r-- | tools/datapacker/main.cpp | 43 |
5 files changed, 314 insertions, 0 deletions
| diff --git a/data/ids.txtpb b/data/ids.txtpb index ae050e9..a0095ad 100644 --- a/data/ids.txtpb +++ b/data/ids.txtpb | |||
| @@ -926,6 +926,203 @@ maps { | |||
| 926 | } | 926 | } |
| 927 | } | 927 | } |
| 928 | maps { | 928 | maps { |
| 929 | key: "the_congruent" | ||
| 930 | value { | ||
| 931 | doors { | ||
| 932 | key: "C Keyholder Blocker" | ||
| 933 | value: 284 | ||
| 934 | } | ||
| 935 | doors { | ||
| 936 | key: "C2 Door" | ||
| 937 | value: 285 | ||
| 938 | } | ||
| 939 | doors { | ||
| 940 | key: "Flipped Magenta Door" | ||
| 941 | value: 282 | ||
| 942 | } | ||
| 943 | doors { | ||
| 944 | key: "Flipped Yellow Door" | ||
| 945 | value: 283 | ||
| 946 | } | ||
| 947 | doors { | ||
| 948 | key: "G Keyholder Blocker" | ||
| 949 | value: 289 | ||
| 950 | } | ||
| 951 | doors { | ||
| 952 | key: "G2 Door" | ||
| 953 | value: 290 | ||
| 954 | } | ||
| 955 | doors { | ||
| 956 | key: "Near C Keyholder Puzzles" | ||
| 957 | value: 288 | ||
| 958 | } | ||
| 959 | doors { | ||
| 960 | key: "Obverse Magenta Door" | ||
| 961 | value: 281 | ||
| 962 | } | ||
| 963 | doors { | ||
| 964 | key: "Obverse Yellow Door" | ||
| 965 | value: 286 | ||
| 966 | } | ||
| 967 | doors { | ||
| 968 | key: "Obverse Yellow Puzzles" | ||
| 969 | value: 287 | ||
| 970 | } | ||
| 971 | doors { | ||
| 972 | key: "T Keyholder Blocker" | ||
| 973 | value: 291 | ||
| 974 | } | ||
| 975 | rooms { | ||
| 976 | key: "Flipped Magenta Room" | ||
| 977 | value { | ||
| 978 | panels { | ||
| 979 | key: "LAND" | ||
| 980 | value: 325 | ||
| 981 | } | ||
| 982 | panels { | ||
| 983 | key: "LAST" | ||
| 984 | value: 320 | ||
| 985 | } | ||
| 986 | panels { | ||
| 987 | key: "LATE" | ||
| 988 | value: 321 | ||
| 989 | } | ||
| 990 | panels { | ||
| 991 | key: "LEFT" | ||
| 992 | value: 322 | ||
| 993 | } | ||
| 994 | panels { | ||
| 995 | key: "LIST" | ||
| 996 | value: 323 | ||
| 997 | } | ||
| 998 | panels { | ||
| 999 | key: "LOOK" | ||
| 1000 | value: 316 | ||
| 1001 | } | ||
| 1002 | panels { | ||
| 1003 | key: "LUST" | ||
| 1004 | value: 324 | ||
| 1005 | } | ||
| 1006 | panels { | ||
| 1007 | key: "MALE" | ||
| 1008 | value: 319 | ||
| 1009 | } | ||
| 1010 | panels { | ||
| 1011 | key: "RULE" | ||
| 1012 | value: 318 | ||
| 1013 | } | ||
| 1014 | panels { | ||
| 1015 | key: "SLOW" | ||
| 1016 | value: 317 | ||
| 1017 | } | ||
| 1018 | } | ||
| 1019 | } | ||
| 1020 | rooms { | ||
| 1021 | key: "Flipped Yellow Room" | ||
| 1022 | value { | ||
| 1023 | panels { | ||
| 1024 | key: "BRICK" | ||
| 1025 | value: 311 | ||
| 1026 | } | ||
| 1027 | panels { | ||
| 1028 | key: "CAVE (1)" | ||
| 1029 | value: 314 | ||
| 1030 | } | ||
| 1031 | panels { | ||
| 1032 | key: "CAVE (2)" | ||
| 1033 | value: 315 | ||
| 1034 | } | ||
| 1035 | panels { | ||
| 1036 | key: "CROWN" | ||
| 1037 | value: 309 | ||
| 1038 | } | ||
| 1039 | panels { | ||
| 1040 | key: "CRUEL" | ||
| 1041 | value: 310 | ||
| 1042 | } | ||
| 1043 | panels { | ||
| 1044 | key: "DANCER" | ||
| 1045 | value: 308 | ||
| 1046 | } | ||
| 1047 | panels { | ||
| 1048 | key: "FLACK" | ||
| 1049 | value: 312 | ||
| 1050 | } | ||
| 1051 | panels { | ||
| 1052 | key: "TACK" | ||
| 1053 | value: 313 | ||
| 1054 | } | ||
| 1055 | } | ||
| 1056 | } | ||
| 1057 | rooms { | ||
| 1058 | key: "Main Area" | ||
| 1059 | value { | ||
| 1060 | panels { | ||
| 1061 | key: "COAT" | ||
| 1062 | value: 301 | ||
| 1063 | } | ||
| 1064 | panels { | ||
| 1065 | key: "DIE" | ||
| 1066 | value: 296 | ||
| 1067 | } | ||
| 1068 | panels { | ||
| 1069 | key: "LABS (1)" | ||
| 1070 | value: 302 | ||
| 1071 | } | ||
| 1072 | panels { | ||
| 1073 | key: "LABS (2)" | ||
| 1074 | value: 303 | ||
| 1075 | } | ||
| 1076 | panels { | ||
| 1077 | key: "LACE" | ||
| 1078 | value: 300 | ||
| 1079 | } | ||
| 1080 | panels { | ||
| 1081 | key: "LAKE" | ||
| 1082 | value: 295 | ||
| 1083 | } | ||
| 1084 | panels { | ||
| 1085 | key: "LANE (1)" | ||
| 1086 | value: 292 | ||
| 1087 | } | ||
| 1088 | panels { | ||
| 1089 | key: "LANE (2)" | ||
| 1090 | value: 293 | ||
| 1091 | } | ||
| 1092 | panels { | ||
| 1093 | key: "LANE (3)" | ||
| 1094 | value: 294 | ||
| 1095 | } | ||
| 1096 | panels { | ||
| 1097 | key: "LIGHT" | ||
| 1098 | value: 297 | ||
| 1099 | } | ||
| 1100 | panels { | ||
| 1101 | key: "LOVES" | ||
| 1102 | value: 298 | ||
| 1103 | } | ||
| 1104 | panels { | ||
| 1105 | key: "RANGER" | ||
| 1106 | value: 299 | ||
| 1107 | } | ||
| 1108 | } | ||
| 1109 | } | ||
| 1110 | rooms { | ||
| 1111 | key: "Obverse Yellow Room" | ||
| 1112 | value { | ||
| 1113 | panels { | ||
| 1114 | key: "CIVIL" | ||
| 1115 | value: 305 | ||
| 1116 | } | ||
| 1117 | panels { | ||
| 1118 | key: "CRABS" | ||
| 1119 | value: 306 | ||
| 1120 | } | ||
| 1121 | } | ||
| 1122 | } | ||
| 1123 | } | ||
| 1124 | } | ||
| 1125 | maps { | ||
| 929 | key: "the_entry" | 1126 | key: "the_entry" |
| 930 | value { | 1127 | value { |
| 931 | doors { | 1128 | doors { |
| @@ -1453,10 +1650,18 @@ letters { | |||
| 1453 | value: 128 | 1650 | value: 128 |
| 1454 | } | 1651 | } |
| 1455 | letters { | 1652 | letters { |
| 1653 | key: "c2" | ||
| 1654 | value: 307 | ||
| 1655 | } | ||
| 1656 | letters { | ||
| 1456 | key: "d1" | 1657 | key: "d1" |
| 1457 | value: 196 | 1658 | value: 196 |
| 1458 | } | 1659 | } |
| 1459 | letters { | 1660 | letters { |
| 1661 | key: "g2" | ||
| 1662 | value: 304 | ||
| 1663 | } | ||
| 1664 | letters { | ||
| 1460 | key: "h1" | 1665 | key: "h1" |
| 1461 | value: 230 | 1666 | value: 230 |
| 1462 | } | 1667 | } |
| diff --git a/proto/data.proto b/proto/data.proto index 274010d..fd38cfd 100644 --- a/proto/data.proto +++ b/proto/data.proto | |||
| @@ -9,6 +9,11 @@ message ProxyIdentifier { | |||
| 9 | string answer = 2; | 9 | string answer = 2; |
| 10 | } | 10 | } |
| 11 | 11 | ||
| 12 | message KeyholderAnswer { | ||
| 13 | uint64 keyholder = 1; | ||
| 14 | string key = 2; | ||
| 15 | } | ||
| 16 | |||
| 12 | message Connection { | 17 | message Connection { |
| 13 | uint64 from_room = 1; | 18 | uint64 from_room = 1; |
| 14 | uint64 to_room = 2; | 19 | uint64 to_room = 2; |
| @@ -36,6 +41,8 @@ message Door { | |||
| 36 | 41 | ||
| 37 | string control_center_color = 6; | 42 | string control_center_color = 6; |
| 38 | repeated string switches = 7; | 43 | repeated string switches = 7; |
| 44 | repeated KeyholderAnswer keyholders = 13; | ||
| 45 | repeated uint64 rooms = 14; | ||
| 39 | 46 | ||
| 40 | DoorType type = 8; | 47 | DoorType type = 8; |
| 41 | } | 48 | } |
| @@ -69,6 +76,7 @@ message Painting { | |||
| 69 | bool move = 6; | 76 | bool move = 6; |
| 70 | bool enter_only = 7; | 77 | bool enter_only = 7; |
| 71 | bool flipped = 8; | 78 | bool flipped = 8; |
| 79 | bool exit_only = 11; | ||
| 72 | 80 | ||
| 73 | uint64 required_door = 5; | 81 | uint64 required_door = 5; |
| 74 | } | 82 | } |
| @@ -84,6 +92,14 @@ message Port { | |||
| 84 | uint64 required_door = 6; | 92 | uint64 required_door = 6; |
| 85 | } | 93 | } |
| 86 | 94 | ||
| 95 | message Keyholder { | ||
| 96 | uint64 id = 1; | ||
| 97 | uint64 room_id = 2; | ||
| 98 | |||
| 99 | string name = 3; | ||
| 100 | string path = 4; | ||
| 101 | } | ||
| 102 | |||
| 87 | message Letter { | 103 | message Letter { |
| 88 | uint64 id = 3; | 104 | uint64 id = 3; |
| 89 | uint64 ap_id = 5; | 105 | uint64 ap_id = 5; |
| @@ -116,6 +132,7 @@ message Room { | |||
| 116 | repeated uint64 ports = 7; | 132 | repeated uint64 ports = 7; |
| 117 | repeated uint64 doors = 9; | 133 | repeated uint64 doors = 9; |
| 118 | repeated uint64 masteries = 10; | 134 | repeated uint64 masteries = 10; |
| 135 | repeated uint64 keyholders = 11; | ||
| 119 | } | 136 | } |
| 120 | 137 | ||
| 121 | message Map { | 138 | message Map { |
| @@ -130,6 +147,7 @@ message AllObjects { | |||
| 130 | repeated Panel panels = 3; | 147 | repeated Panel panels = 3; |
| 131 | repeated Painting paintings = 4; | 148 | repeated Painting paintings = 4; |
| 132 | repeated Port ports = 5; | 149 | repeated Port ports = 5; |
| 150 | repeated Keyholder keyholders = 11; | ||
| 133 | repeated Letter letters = 9; | 151 | repeated Letter letters = 9; |
| 134 | repeated Mastery masteries = 10; | 152 | repeated Mastery masteries = 10; |
| 135 | repeated Connection connections = 6; | 153 | repeated Connection connections = 6; |
| diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp index 29fa1a5..bb58ec5 100644 --- a/tools/datapacker/container.cpp +++ b/tools/datapacker/container.cpp | |||
| @@ -246,6 +246,46 @@ uint64_t Container::FindOrAddMastery(std::optional<std::string> map_name, | |||
| 246 | } | 246 | } |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | uint64_t Container::FindOrAddKeyholder( | ||
| 250 | std::optional<std::string> map_name, std::optional<std::string> room_name, | ||
| 251 | std::string keyholder_name, std::optional<std::string> map_fallback, | ||
| 252 | std::optional<std::string> room_fallback) { | ||
| 253 | if (!map_name) { | ||
| 254 | if (!map_fallback) { | ||
| 255 | std::cout << "No map name provided for " << keyholder_name << std::endl; | ||
| 256 | map_name = "global"; | ||
| 257 | } else { | ||
| 258 | map_name = map_fallback; | ||
| 259 | } | ||
| 260 | } | ||
| 261 | |||
| 262 | if (!room_name) { | ||
| 263 | if (!room_fallback) { | ||
| 264 | std::cout << "No room name provided for " << keyholder_name << std::endl; | ||
| 265 | room_name = "global"; | ||
| 266 | } else { | ||
| 267 | room_name = room_fallback; | ||
| 268 | } | ||
| 269 | } | ||
| 270 | |||
| 271 | auto& room_container = | ||
| 272 | keyholder_id_by_map_room_keyholder_names_[*map_name][*room_name]; | ||
| 273 | auto it = room_container.find(keyholder_name); | ||
| 274 | if (it == room_container.end()) { | ||
| 275 | uint64_t new_id = all_objects_.keyholders_size(); | ||
| 276 | Keyholder* keyholder = all_objects_.add_keyholders(); | ||
| 277 | keyholder->set_id(new_id); | ||
| 278 | keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); | ||
| 279 | keyholder->set_name(keyholder_name); | ||
| 280 | |||
| 281 | room_container[keyholder_name] = new_id; | ||
| 282 | |||
| 283 | return new_id; | ||
| 284 | } else { | ||
| 285 | return it->second; | ||
| 286 | } | ||
| 287 | } | ||
| 288 | |||
| 249 | uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, | 289 | uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, |
| 250 | std::string door_name, | 290 | std::string door_name, |
| 251 | std::optional<std::string> map_fallback) { | 291 | std::optional<std::string> map_fallback) { |
| diff --git a/tools/datapacker/container.h b/tools/datapacker/container.h index 652a025..7ee5b5b 100644 --- a/tools/datapacker/container.h +++ b/tools/datapacker/container.h | |||
| @@ -46,6 +46,12 @@ class Container { | |||
| 46 | std::optional<std::string> map_fallback, | 46 | std::optional<std::string> map_fallback, |
| 47 | std::optional<std::string> room_fallback); | 47 | std::optional<std::string> room_fallback); |
| 48 | 48 | ||
| 49 | uint64_t FindOrAddKeyholder(std::optional<std::string> map_name, | ||
| 50 | std::optional<std::string> room_name, | ||
| 51 | std::string keyholder_name, | ||
| 52 | std::optional<std::string> map_fallback, | ||
| 53 | std::optional<std::string> room_fallback); | ||
| 54 | |||
| 49 | uint64_t FindOrAddDoor(std::optional<std::string> map_name, | 55 | uint64_t FindOrAddDoor(std::optional<std::string> map_name, |
| 50 | std::string door_name, | 56 | std::string door_name, |
| 51 | std::optional<std::string> map_fallback); | 57 | std::optional<std::string> map_fallback); |
| @@ -69,6 +75,8 @@ class Container { | |||
| 69 | std::map<std::string, uint64_t> letter_id_by_name_; | 75 | 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>>> | 76 | std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>> |
| 71 | mastery_id_by_map_room_mastery_names_; | 77 | mastery_id_by_map_room_mastery_names_; |
| 78 | std::map<std::string, std::map<std::string, std::map<std::string, uint64_t>>> | ||
| 79 | keyholder_id_by_map_room_keyholder_names_; | ||
| 72 | std::map<std::string, std::map<std::string, uint64_t>> | 80 | std::map<std::string, std::map<std::string, uint64_t>> |
| 73 | door_id_by_map_door_names_; | 81 | door_id_by_map_door_names_; |
| 74 | }; | 82 | }; |
| diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 260ab62..7e7f7f7 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp | |||
| @@ -109,6 +109,11 @@ class DataPacker { | |||
| 109 | room.add_masteries( | 109 | room.add_masteries( |
| 110 | ProcessMastery(h_mastery, current_map_name, room.name())); | 110 | ProcessMastery(h_mastery, current_map_name, room.name())); |
| 111 | } | 111 | } |
| 112 | |||
| 113 | for (const HumanKeyholder& h_keyholder : h_room.keyholders()) { | ||
| 114 | room.add_keyholders( | ||
| 115 | ProcessKeyholder(h_keyholder, current_map_name, room.name())); | ||
| 116 | } | ||
| 112 | } | 117 | } |
| 113 | 118 | ||
| 114 | uint64_t ProcessPanel(const HumanPanel& h_panel, | 119 | uint64_t ProcessPanel(const HumanPanel& h_panel, |
| @@ -176,6 +181,10 @@ class DataPacker { | |||
| 176 | painting.set_enter_only(h_painting.enter_only()); | 181 | painting.set_enter_only(h_painting.enter_only()); |
| 177 | } | 182 | } |
| 178 | 183 | ||
| 184 | if (h_painting.has_exit_only()) { | ||
| 185 | painting.set_exit_only(h_painting.exit_only()); | ||
| 186 | } | ||
| 187 | |||
| 179 | if (h_painting.has_required_door()) { | 188 | if (h_painting.has_required_door()) { |
| 180 | std::optional<std::string> map_name = | 189 | std::optional<std::string> map_name = |
| 181 | h_painting.required_door().has_map() | 190 | h_painting.required_door().has_map() |
| @@ -238,6 +247,20 @@ class DataPacker { | |||
| 238 | return mastery_id; | 247 | return mastery_id; |
| 239 | } | 248 | } |
| 240 | 249 | ||
| 250 | uint64_t ProcessKeyholder(const HumanKeyholder& h_keyholder, | ||
| 251 | const std::string& current_map_name, | ||
| 252 | const std::string& current_room_name) { | ||
| 253 | uint64_t keyholder_id = container_.FindOrAddKeyholder( | ||
| 254 | current_map_name, current_room_name, h_keyholder.name(), std::nullopt, | ||
| 255 | std::nullopt); | ||
| 256 | Keyholder& keyholder = | ||
| 257 | *container_.all_objects().mutable_keyholders(keyholder_id); | ||
| 258 | |||
| 259 | keyholder.set_path(h_keyholder.path()); | ||
| 260 | |||
| 261 | return keyholder_id; | ||
| 262 | } | ||
| 263 | |||
| 241 | void ProcessDoorsFile(std::filesystem::path path, | 264 | void ProcessDoorsFile(std::filesystem::path path, |
| 242 | const std::string& current_map_name) { | 265 | const std::string& current_map_name) { |
| 243 | if (!std::filesystem::exists(path)) { | 266 | if (!std::filesystem::exists(path)) { |
| @@ -292,6 +315,26 @@ class DataPacker { | |||
| 292 | } | 315 | } |
| 293 | } | 316 | } |
| 294 | 317 | ||
| 318 | for (const KeyholderIdentifier& ki : h_door.keyholders()) { | ||
| 319 | KeyholderAnswer* answer = door.add_keyholders(); | ||
| 320 | |||
| 321 | std::optional<std::string> map_name = | ||
| 322 | ki.has_map() ? std::optional<std::string>(ki.map()) : std::nullopt; | ||
| 323 | answer->set_keyholder(container_.FindOrAddKeyholder( | ||
| 324 | map_name, ki.room(), ki.name(), current_map_name, std::nullopt)); | ||
| 325 | |||
| 326 | if (ki.has_key()) { | ||
| 327 | answer->set_key(ki.key()); | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 331 | for (const RoomIdentifier& ri : h_door.rooms()) { | ||
| 332 | std::optional<std::string> map_name = | ||
| 333 | ri.has_map() ? std::optional<std::string>(ri.map()) : std::nullopt; | ||
| 334 | door.add_rooms( | ||
| 335 | container_.FindOrAddRoom(map_name, ri.name(), current_map_name)); | ||
| 336 | } | ||
| 337 | |||
| 295 | if (h_door.has_control_center_color()) { | 338 | if (h_door.has_control_center_color()) { |
| 296 | door.set_control_center_color(h_door.control_center_color()); | 339 | door.set_control_center_color(h_door.control_center_color()); |
| 297 | } | 340 | } |
