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 | } |