summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--data/ids.txtpb205
-rw-r--r--proto/data.proto18
-rw-r--r--tools/datapacker/container.cpp40
-rw-r--r--tools/datapacker/container.h8
-rw-r--r--tools/datapacker/main.cpp43
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}
928maps { 928maps {
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}
1125maps {
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}
1455letters { 1652letters {
1653 key: "c2"
1654 value: 307
1655}
1656letters {
1456 key: "d1" 1657 key: "d1"
1457 value: 196 1658 value: 196
1458} 1659}
1459letters { 1660letters {
1661 key: "g2"
1662 value: 304
1663}
1664letters {
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
12message KeyholderAnswer {
13 uint64 keyholder = 1;
14 string key = 2;
15}
16
12message Connection { 17message 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
95message Keyholder {
96 uint64 id = 1;
97 uint64 room_id = 2;
98
99 string name = 3;
100 string path = 4;
101}
102
87message Letter { 103message 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
121message Map { 138message 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
249uint64_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
249uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name, 289uint64_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 }