about summary refs log tree commit diff stats
path: root/proto
diff options
context:
space:
mode:
Diffstat (limited to 'proto')
-rw-r--r--proto/CMakeLists.txt2
-rw-r--r--proto/common.proto38
-rw-r--r--proto/data.proto309
-rw-r--r--proto/human.proto225
4 files changed, 400 insertions, 174 deletions
diff --git a/proto/CMakeLists.txt b/proto/CMakeLists.txt index c5abd46..95687d7 100644 --- a/proto/CMakeLists.txt +++ b/proto/CMakeLists.txt
@@ -5,7 +5,7 @@ add_library(protos)
5protobuf_generate( 5protobuf_generate(
6 LANGUAGE cpp 6 LANGUAGE cpp
7 TARGET protos 7 TARGET protos
8 PROTOS human.proto data.proto common.proto 8 PROTOS human.proto data.proto
9) 9)
10 10
11target_link_libraries(protos PUBLIC protobuf::libprotobuf) 11target_link_libraries(protos PUBLIC protobuf::libprotobuf)
diff --git a/proto/common.proto b/proto/common.proto deleted file mode 100644 index e37f670..0000000 --- a/proto/common.proto +++ /dev/null
@@ -1,38 +0,0 @@
1edition = "2023";
2
3package com.fourisland.lingo2_archipelago;
4
5message Proxy {
6 string answer = 1;
7 string path = 2;
8}
9
10enum DoorType {
11 DOOR_TYPE_UNKNOWN = 0;
12
13 // This door is a location unless panelsanity is on, and it is an item as long as door shuffle is on.
14 STANDARD = 1;
15
16 // This door is never an item or a location.
17 EVENT = 2;
18
19 // This door is never a location, and is an item as long as door shuffle is on.
20 ITEM_ONLY = 3;
21
22 // This door is never a location, and is an item as long as control center color shuffle is on.
23 CONTROL_CENTER_COLOR = 4;
24
25 // This door is never an item, and is a location as long as panelsanity is not on.
26 LOCATION_ONLY = 5;
27}
28
29enum AxisDirection {
30 AXIS_DIRECTION_UNKNOWN = 0;
31
32 X_PLUS = 1;
33 X_MINUS = 2;
34 Y_PLUS = 3;
35 Y_MINUS = 4;
36 Z_PLUS = 5;
37 Z_MINUS = 6;
38}
diff --git a/proto/data.proto b/proto/data.proto index b590454..e9cc7d7 100644 --- a/proto/data.proto +++ b/proto/data.proto
@@ -1,131 +1,264 @@
1edition = "2023"; 1syntax = "proto2";
2
3import "common.proto";
4 2
5package com.fourisland.lingo2_archipelago; 3package com.fourisland.lingo2_archipelago;
6 4
5message Proxy {
6 optional string answer = 1;
7 optional string path = 2;
8}
9
10enum DoorType {
11 DOOR_TYPE_UNKNOWN = 0;
12
13 // This door is a location unless panelsanity is on, and it is an item as long as door shuffle is on.
14 STANDARD = 1;
15
16 // This door is never an item or a location.
17 EVENT = 2;
18
19 // This door is never a location, and is an item as long as door shuffle is on.
20 ITEM_ONLY = 3;
21
22 // This door is never a location, and is an item as long as control center color shuffle is on.
23 CONTROL_CENTER_COLOR = 4;
24
25 // This door is never an item, and is a location as long as panelsanity is not on.
26 LOCATION_ONLY = 5;
27
28 // This door is an item if gravestone shuffle is enabled, and is a location as long as panelsanity is not on.
29 GRAVESTONE = 6;
30
31 // This door is never a location, and is an item as long as gallery painting shuffle is on.
32 GALLERY_PAINTING = 7;
33}
34
35enum DoorGroupType {
36 DOOR_GROUP_TYPE_UNKNOWN = 0;
37
38 // These doors border a worldport. They should be grouped when connections are
39 // not shuffled.
40 CONNECTOR = 1;
41
42 // Similar to CONNECTOR, but these doors are also ordinarily opened by solving
43 // the COLOR panel in the Control Center. These should be grouped when
44 // connections are not shuffled, but are not items at all when control center
45 // colors are not shuffled.
46 COLOR_CONNECTOR = 2;
47
48 // Groups with this type become an item if cyan door behavior is set to item.
49 CYAN_DOORS = 3;
50
51 // Groups with this type always become an item if door shuffle is on.
52 SHUFFLE_GROUP = 4;
53}
54
55enum MapType {
56 NORMAL_MAP = 0;
57 ICARUS = 1;
58 GIFT_MAP = 2;
59 DEMO = 3;
60}
61
62enum AxisDirection {
63 AXIS_DIRECTION_UNKNOWN = 0;
64
65 X_PLUS = 1;
66 X_MINUS = 2;
67 Y_PLUS = 3;
68 Y_MINUS = 4;
69 Z_PLUS = 5;
70 Z_MINUS = 6;
71}
72
73enum PuzzleSymbol {
74 PUZZLE_SYMBOL_UNKNOWN = 0;
75
76 SUN = 1;
77 SPARKLES = 2;
78 ZERO = 3;
79 EXAMPLE = 4;
80 BOXES = 5;
81 PLANET = 6;
82 PYRAMID = 7;
83 CROSS = 8;
84 SWEET = 9;
85 GENDER = 10;
86 AGE = 11;
87 SOUND = 12;
88 ANAGRAM = 13;
89 JOB = 14;
90 STARS = 15;
91 NULL = 16;
92 EVAL = 17;
93 LINGO = 18;
94 QUESTION = 19;
95}
96
97message Vec3d {
98 optional double x = 1;
99 optional double y = 2;
100 optional double z = 3;
101}
102
103message VersionNumber {
104 optional uint64 major = 1;
105 optional uint64 minor = 2;
106 optional uint64 patch = 3;
107}
108
7message ProxyIdentifier { 109message ProxyIdentifier {
8 uint64 panel = 1; 110 optional uint64 panel = 1;
9 string answer = 2; 111 optional string answer = 2;
10} 112}
11 113
12message KeyholderAnswer { 114message KeyholderAnswer {
13 uint64 keyholder = 1; 115 optional uint64 keyholder = 1;
14 string key = 2; 116 optional string key = 2;
15} 117}
16 118
17message Connection { 119message Connection {
18 uint64 from_room = 1; 120 optional uint64 from_room = 1;
19 uint64 to_room = 2; 121 optional uint64 to_room = 2;
20 uint64 required_door = 3; 122 optional uint64 required_door = 3;
21 123
22 oneof trigger { 124 oneof trigger {
23 uint64 port = 4; 125 uint64 port = 4;
24 uint64 painting = 5; 126 uint64 painting = 5;
25 ProxyIdentifier panel = 6; 127 ProxyIdentifier panel = 6;
26 } 128 }
129
130 optional bool roof_access = 7;
131 optional bool purple_ending = 8;
132 optional bool cyan_ending = 9;
133 optional bool vanilla_only = 10;
27} 134}
28 135
29message Door { 136message Door {
30 uint64 id = 1; 137 optional uint64 id = 1;
31 uint64 ap_id = 11; 138 optional uint64 ap_id = 11;
32 uint64 map_id = 9; 139 optional uint64 map_id = 9;
33 uint64 room_id = 10; 140 optional uint64 room_id = 10;
34 string name = 2; 141 optional string name = 2;
35 142
36 repeated string receivers = 3; 143 repeated string receivers = 3;
37 repeated uint64 move_paintings = 4; 144 repeated uint64 move_paintings = 4;
38 145
39 repeated ProxyIdentifier panels = 5; 146 repeated ProxyIdentifier panels = 5;
40 uint64 complete_at = 12; 147 optional uint64 complete_at = 12;
41 148
42 string control_center_color = 6; 149 optional string control_center_color = 6;
43 repeated string switches = 7;
44 repeated KeyholderAnswer keyholders = 13; 150 repeated KeyholderAnswer keyholders = 13;
45 repeated uint64 rooms = 14; 151 repeated uint64 rooms = 14;
152 repeated uint64 doors = 15;
153 optional bool white_ending = 16;
154 optional bool double_letters = 18;
155 repeated string senders = 19;
156
157 optional DoorType type = 8;
158 optional bool latch = 20;
159 optional bool legacy_location = 21;
46 160
47 DoorType type = 8; 161 optional string location_name = 17;
48} 162}
49 163
50message Panel { 164message PanelData {
51 uint64 id = 1; 165 optional uint64 id = 1;
52 uint64 ap_id = 10; 166 optional uint64 ap_id = 10;
53 uint64 room_id = 2; 167 optional uint64 room_id = 2;
54 string name = 3; 168 optional string name = 3;
55 169
56 string path = 4; 170 optional string path = 4;
57 string clue = 5; 171 optional string clue = 5;
58 string answer = 6; 172 optional string answer = 6;
59 repeated string symbols = 7; 173 repeated PuzzleSymbol symbols = 7;
60 174
61 repeated Proxy proxies = 8; 175 repeated Proxy proxies = 8;
62 176
63 uint64 required_door = 9; 177 optional uint64 required_door = 9;
64 uint64 required_room = 11; 178 optional uint64 required_room = 11;
179
180 optional string display_name = 12;
65} 181}
66 182
67message Painting { 183message PaintingData {
68 uint64 id = 1; 184 optional uint64 id = 1;
69 uint64 room_id = 2; 185 optional uint64 room_id = 2;
70 string name = 9; 186 optional string name = 9;
71 187
72 string path = 10; 188 optional string path = 10;
73 string display_name = 4; 189 optional string display_name = 4;
74 190
75 string orientation = 3; 191 optional string orientation = 3;
76 bool move = 6; 192 optional bool move = 6;
77 bool enter_only = 7; 193 optional bool enter_only = 7;
78 AxisDirection gravity = 8 [default = Y_MINUS]; 194 optional AxisDirection gravity = 8;
79 bool exit_only = 11; 195 optional bool exit_only = 11;
80 196
81 uint64 required_door = 5; 197 optional uint64 required_door = 5;
82} 198}
83 199
84message Port { 200message Port {
85 uint64 id = 1; 201 optional uint64 id = 1;
86 uint64 room_id = 2; 202 optional uint64 ap_id = 11;
87 string name = 3; 203 optional uint64 room_id = 2;
88 204 optional string name = 3;
89 string path = 4; 205
90 string orientation = 5; 206 optional string display_name = 10;
91 AxisDirection gravity = 7 [default = Y_MINUS]; 207 optional string path = 4;
92 208 optional Vec3d destination = 5;
93 uint64 required_door = 6; 209 optional double rotation = 8;
210 optional AxisDirection gravity = 7;
211 optional bool no_shuffle = 9;
212
213 optional uint64 required_door = 6;
94} 214}
95 215
96message Keyholder { 216message KeyholderData {
97 uint64 id = 1; 217 optional uint64 id = 1;
98 uint64 room_id = 2; 218 optional uint64 ap_id = 6;
219 optional uint64 room_id = 2;
99 220
100 string name = 3; 221 optional string name = 3;
101 string path = 4; 222 optional string path = 4;
223 optional string key = 5;
102} 224}
103 225
104message Letter { 226message Letter {
105 uint64 id = 3; 227 optional uint64 id = 3;
106 uint64 ap_id = 5; 228 optional uint64 ap_id = 5;
107 uint64 room_id = 4; 229 optional uint64 room_id = 4;
108 230
109 string key = 1; 231 optional string key = 1;
110 bool double = 2; 232 optional bool level2 = 2;
111 233
112 string path = 6; 234 optional string path = 6;
113} 235}
114 236
115message Mastery { 237message Mastery {
116 uint64 id = 1; 238 optional uint64 id = 1;
117 uint64 ap_id = 2; 239 optional uint64 ap_id = 2;
118 uint64 room_id = 3; 240 optional uint64 room_id = 3;
241
242 optional string name = 4;
243 optional string path = 5;
244}
245
246message Ending {
247 optional uint64 id = 1;
248 optional uint64 ap_id = 2;
249 optional uint64 room_id = 3;
250
251 optional string name = 4;
119 252
120 string name = 4; 253 optional string path = 5;
121 string path = 5;
122} 254}
123 255
124message Room { 256message Room {
125 uint64 id = 1; 257 optional uint64 id = 1;
126 uint64 map_id = 8; 258 optional uint64 map_id = 8;
127 string name = 2; 259 optional string name = 2;
128 string display_name = 3; 260 optional string display_name = 3;
261 optional string panel_display_name = 13;
129 262
130 repeated uint64 panels = 4; 263 repeated uint64 panels = 4;
131 repeated uint64 paintings = 5; 264 repeated uint64 paintings = 5;
@@ -134,23 +267,47 @@ message Room {
134 repeated uint64 doors = 9; 267 repeated uint64 doors = 9;
135 repeated uint64 masteries = 10; 268 repeated uint64 masteries = 10;
136 repeated uint64 keyholders = 11; 269 repeated uint64 keyholders = 11;
270 repeated uint64 endings = 12;
137} 271}
138 272
139message Map { 273message Map {
140 uint64 id = 1; 274 optional uint64 id = 1;
141 string name = 2; 275 optional string name = 2;
276 optional string display_name = 3;
277 optional uint64 worldport_entrance = 4;
278 optional MapType type = 5;
279}
280
281message Progressive {
282 optional uint64 id = 1;
283 optional string name = 2;
284 optional uint64 ap_id = 3;
285 repeated uint64 doors = 4;
286}
287
288message DoorGroup {
289 optional uint64 id = 1;
290 optional string name = 2;
291 optional uint64 ap_id = 3;
292 optional DoorGroupType type = 4;
293 repeated uint64 doors = 5;
142} 294}
143 295
144message AllObjects { 296message AllObjects {
297 optional VersionNumber version = 15;
298
145 repeated Map maps = 7; 299 repeated Map maps = 7;
146 repeated Room rooms = 1; 300 repeated Room rooms = 1;
147 repeated Door doors = 2; 301 repeated Door doors = 2;
148 repeated Panel panels = 3; 302 repeated PanelData panels = 3;
149 repeated Painting paintings = 4; 303 repeated PaintingData paintings = 4;
150 repeated Port ports = 5; 304 repeated Port ports = 5;
151 repeated Keyholder keyholders = 11; 305 repeated KeyholderData keyholders = 11;
152 repeated Letter letters = 9; 306 repeated Letter letters = 9;
153 repeated Mastery masteries = 10; 307 repeated Mastery masteries = 10;
308 repeated Ending endings = 12;
154 repeated Connection connections = 6; 309 repeated Connection connections = 6;
310 repeated Progressive progressives = 13;
311 repeated DoorGroup door_groups = 14;
155 map<string, uint64> special_ids = 8; 312 map<string, uint64> special_ids = 8;
156} 313}
diff --git a/proto/human.proto b/proto/human.proto index 858c88f..c586599 100644 --- a/proto/human.proto +++ b/proto/human.proto
@@ -1,43 +1,43 @@
1edition = "2023"; 1syntax = "proto2";
2 2
3import "common.proto"; 3import "data.proto";
4 4
5package com.fourisland.lingo2_archipelago; 5package com.fourisland.lingo2_archipelago;
6 6
7message RoomIdentifier { 7message RoomIdentifier {
8 string map = 1; 8 optional string map = 1;
9 string name = 2; 9 optional string name = 2;
10} 10}
11 11
12message DoorIdentifier { 12message DoorIdentifier {
13 string map = 1; 13 optional string map = 1;
14 string name = 2; 14 optional string name = 2;
15} 15}
16 16
17message PortIdentifier { 17message PortIdentifier {
18 string map = 1; 18 optional string map = 1;
19 string room = 2; 19 optional string room = 2;
20 string name = 3; 20 optional string name = 3;
21} 21}
22 22
23message PaintingIdentifier { 23message PaintingIdentifier {
24 string map = 1; 24 optional string map = 1;
25 string room = 2; 25 optional string room = 2;
26 string name = 3; 26 optional string name = 3;
27} 27}
28 28
29message PanelIdentifier { 29message PanelIdentifier {
30 string map = 1; 30 optional string map = 1;
31 string room = 2; 31 optional string room = 2;
32 string name = 3; 32 optional string name = 3;
33 string answer = 4; 33 optional string answer = 4;
34} 34}
35 35
36message KeyholderIdentifier { 36message KeyholderIdentifier {
37 string map = 1; 37 optional string map = 1;
38 string room = 2; 38 optional string room = 2;
39 string name = 3; 39 optional string name = 3;
40 string key = 4; 40 optional string key = 4;
41} 41}
42 42
43message HumanConnection { 43message HumanConnection {
@@ -60,8 +60,27 @@ message HumanConnection {
60 string to_room = 6; 60 string to_room = 6;
61 } 61 }
62 62
63 bool oneway = 3; 63 optional bool oneway = 3;
64 DoorIdentifier door = 4; 64 optional DoorIdentifier door = 4;
65
66 // If true, this connection will only be logically allowed if the Daedalus
67 // Roof Access option is enabled.
68 optional bool roof_access = 7;
69
70 // This means that the connection intentionally skips the target object's
71 // required door.
72 optional bool bypass_target_door = 8;
73
74 // This means that the connection should additionally require all purple
75 // letters when the Strict Purple Ending option is on.
76 optional bool purple_ending = 9;
77
78 // This means that the connection should additionally require all cyan letters
79 // when the Strict Cyan Ending option is on.
80 optional bool cyan_ending = 10;
81
82 // This means that the connection only exists when doors are not shuffled.
83 optional bool vanilla_only = 11;
65} 84}
66 85
67message HumanConnections { 86message HumanConnections {
@@ -69,7 +88,7 @@ message HumanConnections {
69} 88}
70 89
71message HumanDoor { 90message HumanDoor {
72 string name = 1; 91 optional string name = 1;
73 92
74 repeated string receivers = 2; 93 repeated string receivers = 2;
75 repeated PaintingIdentifier move_paintings = 8; 94 repeated PaintingIdentifier move_paintings = 8;
@@ -79,15 +98,32 @@ message HumanDoor {
79 98
80 // If set, the number of panels from the above set that need to be solved. 99 // If set, the number of panels from the above set that need to be solved.
81 // Warning: this is a messy kind of OR logic! Consider if there's another way. 100 // Warning: this is a messy kind of OR logic! Consider if there's another way.
82 uint64 complete_at = 9; 101 optional uint64 complete_at = 9;
83 102
84 string control_center_color = 6; 103 optional string control_center_color = 6;
85 repeated string switches = 7;
86 repeated KeyholderIdentifier keyholders = 10; 104 repeated KeyholderIdentifier keyholders = 10;
87 repeated RoomIdentifier rooms = 11; 105 repeated RoomIdentifier rooms = 11;
88 106 repeated DoorIdentifier doors = 12;
89 DoorType type = 4; 107 optional bool white_ending = 13;
90 string location_room = 5; 108 optional bool double_letters = 15;
109
110 // Sender nodes to be added to the list of requirements for triggering the
111 // location. Only for senders that have no logic requirements.
112 repeated string senders = 16;
113
114 optional DoorType type = 4;
115 optional string location_room = 5;
116 optional string location_name = 14;
117
118 // Non-item doors that are latched will stay open once opened, even if the
119 // opening trigger is deactivated. This applies to EVENT/LOCATION_ONLY doors,
120 // as well as item-locked doors when not shuffling doors.
121 optional bool latch = 17;
122
123 // If true, the client will treat this door like a location, even though no
124 // location is created for it in the generator. This helps provide backwards
125 // compatability with older worlds.
126 optional bool legacy_location = 18;
91} 127}
92 128
93message HumanDoors { 129message HumanDoors {
@@ -95,64 +131,89 @@ message HumanDoors {
95} 131}
96 132
97message HumanPanel { 133message HumanPanel {
98 string name = 1; 134 optional string name = 1;
99 string path = 5; 135 optional string path = 5;
100 136
101 string clue = 2; 137 optional string clue = 2;
102 string answer = 3; 138 optional string answer = 3;
103 repeated string symbols = 4; 139 repeated PuzzleSymbol symbols = 4;
104 140
105 repeated Proxy proxies = 6; 141 repeated Proxy proxies = 6;
106 142
107 DoorIdentifier required_door = 7; 143 optional DoorIdentifier required_door = 7;
108 RoomIdentifier required_room = 8; 144 optional RoomIdentifier required_room = 8;
145
146 optional string display_name = 9;
109} 147}
110 148
111message HumanPainting { 149message HumanPainting {
112 string name = 1; 150 optional string name = 1;
113 string path = 2; 151 optional string path = 2;
114 152
115 string display_name = 4; 153 optional string display_name = 4;
116 154
117 string orientation = 3; 155 optional string orientation = 3;
118 bool move = 6; 156 optional bool move = 6;
119 bool enter_only = 7; 157 optional bool enter_only = 7;
120 AxisDirection gravity = 8 [default = Y_MINUS]; 158 optional AxisDirection gravity = 8 [default = Y_MINUS];
121 bool exit_only = 9; 159 optional bool exit_only = 9;
122 160
123 DoorIdentifier required_door = 5; 161 optional DoorIdentifier required_door = 5;
124} 162}
125 163
126message HumanPort { 164message HumanPort {
127 string name = 1; 165 optional string name = 1;
128 string path = 2; 166 optional string display_name = 8;
167 optional string path = 2;
129 168
130 string orientation = 3; 169 optional bool no_shuffle = 7;
131 AxisDirection gravity = 5 [default = Y_MINUS];
132 170
133 DoorIdentifier required_door = 4; 171 // These specify how the player should be placed when a randomized entrance
172 // sends them to this port. "rotation" is in degrees and is counter-clockwise
173 // from the positive X axis.
174 optional Vec3d destination = 3;
175 optional double rotation = 6;
176 optional AxisDirection gravity = 5 [default = Y_MINUS];
177
178 optional DoorIdentifier required_door = 4;
134} 179}
135 180
136message HumanKeyholder { 181message HumanKeyholder {
137 string name = 1; 182 optional string name = 1;
138 string path = 2; 183 optional string path = 2;
184
185 // If this is set, the keyholder will become a location when keyholder shuffle
186 // is enabled. This value specifies the key that is required to clear the
187 // location. It should be the same as the key needed for Green Ending. The
188 // only cases when this shouldn't be set is the two disappearing keyholders in
189 // The Congruent.
190 optional string key = 3;
139} 191}
140 192
141message HumanLetter { 193message HumanLetter {
142 string key = 1; 194 optional string key = 1;
143 bool double = 2; 195 optional bool level2 = 2;
144 196
145 string path = 3; 197 optional string path = 3;
146} 198}
147 199
148message HumanMastery { 200message HumanMastery {
149 string name = 1; 201 optional string name = 1;
150 string path = 2; 202 optional string path = 2;
203}
204
205message HumanEnding {
206 optional string name = 1;
207 optional string path = 2;
151} 208}
152 209
153message HumanRoom { 210message HumanRoom {
154 string name = 1; 211 optional string name = 1;
155 string display_name = 2; 212 optional string display_name = 2;
213
214 // This is used in panelsanity location names and location names for STANDARD
215 // doors generated from panels in the same area.
216 optional string panel_display_name = 10;
156 217
157 repeated HumanPanel panels = 3; 218 repeated HumanPanel panels = 3;
158 repeated HumanPainting paintings = 4; 219 repeated HumanPainting paintings = 4;
@@ -160,12 +221,55 @@ message HumanRoom {
160 repeated HumanPort ports = 6; 221 repeated HumanPort ports = 6;
161 repeated HumanKeyholder keyholders = 7; 222 repeated HumanKeyholder keyholders = 7;
162 repeated HumanMastery masteries = 8; 223 repeated HumanMastery masteries = 8;
224 repeated HumanEnding endings = 9;
225}
226
227message HumanMap {
228 optional string display_name = 1;
229 optional MapType type = 4;
230
231 optional PortIdentifier worldport_entrance = 3;
232
233 // These two fields are used by the validator and nothing else. excluded_nodes
234 // are objects in the tscn that are intentionally not mentioned in the txtpb.
235 // custom_nodes are the reverse of that; objects that are mentioned in the
236 // txtpb but not present in the tscn. These are generally created dynamically
237 // by the game mod, but may also be used for places where the validator is
238 // just wrong about the contents of the map file.
239 repeated string excluded_nodes = 2;
240 repeated string custom_nodes = 5;
241}
242
243message HumanProgressive {
244 optional string name = 1;
245 repeated DoorIdentifier doors = 2;
246}
247
248message HumanProgressives {
249 repeated HumanProgressive progressives = 1;
250}
251
252message HumanDoorGroup {
253 optional string name = 1;
254 optional DoorGroupType type = 2;
255 repeated DoorIdentifier doors = 3;
256}
257
258message HumanDoorGroups {
259 repeated HumanDoorGroup door_groups = 1;
260}
261
262message HumanGlobalMetadata {
263 repeated string special_names = 1;
264 optional VersionNumber version = 2;
163} 265}
164 266
165message IdMappings { 267message IdMappings {
166 message RoomIds { 268 message RoomIds {
167 map<string, uint64> panels = 1; 269 map<string, uint64> panels = 1;
168 map<string, uint64> masteries = 2; 270 map<string, uint64> masteries = 2;
271 map<string, uint64> keyholders = 3;
272 map<string, uint64> ports = 4;
169 } 273 }
170 274
171 message MapIds { 275 message MapIds {
@@ -176,4 +280,7 @@ message IdMappings {
176 map<string, MapIds> maps = 1; 280 map<string, MapIds> maps = 1;
177 map<string, uint64> special = 2; 281 map<string, uint64> special = 2;
178 map<string, uint64> letters = 3; 282 map<string, uint64> letters = 3;
283 map<string, uint64> endings = 4;
284 map<string, uint64> progressives = 5;
285 map<string, uint64> door_groups = 6;
179} 286}