gdlib 0.4.0

Rust library for editing Geometry Dash savefiles
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
//! Properties lookup table
use phf::{Map, phf_map};

use crate::cclocallevels::{gdlevel::leveldata::HeaderValueType, gdobj::structs::GDObjPropType};

// TODO: make the types not unknown
// note: if it;s a number but not specifically an int, don't say it's an int.
/// A map of object property IDs to their identifier and type.   
///
/// Reference: <https://flowvix.github.io/gd-info-explorer/props>
pub static PROPERTY_TABLE: Map<u16, (&'static str, GDObjPropType)> = phf_map! {
    1u16 => ("object ID", GDObjPropType::Int),
    2u16 => ("x pos", GDObjPropType::Float),
    3u16 => ("y pos", GDObjPropType::Float),
    4u16 => ("is flipped horizontally?", GDObjPropType::Bool),
    5u16 => ("is flipped vertically?", GDObjPropType::Bool),
    6u16 => ("rotation", GDObjPropType::Float),
    7u16 => ("Red", GDObjPropType::Int),
    8u16 => ("Green", GDObjPropType::Int),
    9u16 => ("Blue", GDObjPropType::Int),
    10u16 => ("duration / group trigger chance", GDObjPropType::Float),
    11u16 => ("Touch triggerable", GDObjPropType::Bool),
    15u16 => ("Using player colour 1", GDObjPropType::Bool),
    16u16 => ("Using player colour 2", GDObjPropType::Bool),
    17u16 => ("Blending enabled", GDObjPropType::Bool),
    20u16 => ("Editor layer 1", GDObjPropType::Int),
    21u16 => ("Object colour", GDObjPropType::ColourChannel),
    22u16 => ("Secondary colour", GDObjPropType::ColourChannel),
    23u16 => ("Colour channel", GDObjPropType::ColourChannel),
    24u16 => ("Z layer", GDObjPropType::Int),
    25u16 => ("Z order", GDObjPropType::Int),
    28u16 => ("Move units x", GDObjPropType::Int),
    29u16 => ("Move units y", GDObjPropType::Int),
    30u16 => ("Move easing", GDObjPropType::Easing),
    31u16 => ("Base64-encoded text", GDObjPropType::Text),
    32u16 => ("Scale", GDObjPropType::Float),
    34u16 => ("Is group parent?", GDObjPropType::Bool),
    35u16 => ("Opacity", GDObjPropType::Float),
    36u16 => ("Is interactable?", GDObjPropType::Bool),
    45u16 => ("Pulse fade in time", GDObjPropType::Float),
    46u16 => ("Pulse hold time", GDObjPropType::Float),
    47u16 => ("Pulse fade out time", GDObjPropType::Float),
    48u16 => ("HSV is enabled", GDObjPropType::Bool),
    49u16 => ("Copy colour specs", GDObjPropType::Text),
    50u16 => ("Copy colour from channel", GDObjPropType::Bool),
    51u16 => ("Target item", GDObjPropType::Group),
    52u16 => ("Pulse group?", GDObjPropType::Bool),
    56u16 => ("Activate group", GDObjPropType::Bool),
    57u16 => ("Groups", GDObjPropType::Group),
    58u16 => ("Follow player's x movement", GDObjPropType::Bool),
    59u16 => ("Follow player's y movement", GDObjPropType::Bool),
    60u16 => ("Copy opacity", GDObjPropType::Bool),
    61u16 => ("Editor layer 2", GDObjPropType::Int),
    62u16 => ("Spawn triggerable", GDObjPropType::Bool),
    63u16 => ("Spawn delay", GDObjPropType::Float),
    64u16 => ("Don't fade", GDObjPropType::Bool),
    65u16 => ("Pulse main colour only", GDObjPropType::Bool),
    66u16 => ("Pulse detail colour only", GDObjPropType::Bool),
    67u16 => ("Don't enter", GDObjPropType::Bool),
    68u16 => ("Rotate degrees", GDObjPropType::Float),
    69u16 => ("Rotate x360", GDObjPropType::Int),
    70u16 => ("Lock object rotation", GDObjPropType::Bool),
    71u16 => ("Target item 2", GDObjPropType::Group),
    72u16 => ("X-axis follow mod", GDObjPropType::Float),
    73u16 => ("Y-axis follow mod", GDObjPropType::Float),
    75u16 => ("Shake strength", GDObjPropType::Float),
    76u16 => ("Animation ID", GDObjPropType::Int),
    77u16 => ("Target count", GDObjPropType::Int),
    80u16 => ("Input item 1", GDObjPropType::Item),
    81u16 => ("Touch hold mode", GDObjPropType::Bool),
    82u16 => ("Touch toggle on/off", GDObjPropType::Unknown),
    84u16 => ("Shake interval", GDObjPropType::Float),
    85u16 => ("Easing rate", GDObjPropType::Float),
    86u16 => ("Exclusive pulse mode", GDObjPropType::Bool),
    87u16 => ("Multitriggerable", GDObjPropType::Bool),
    89u16 => ("Touch dual mode", GDObjPropType::Bool),
    90u16 => ("Follow speed", GDObjPropType::Float),
    91u16 => ("Follow delay", GDObjPropType::Float),
    92u16 => ("Follow offset", GDObjPropType::Int),
    93u16 => ("Trigger on exit", GDObjPropType::Bool),
    94u16 => ("Dynamic block?", GDObjPropType::Bool),
    95u16 => ("Input item 2", GDObjPropType::Item),
    96u16 => ("No glow", GDObjPropType::Bool),
    99u16 => ("Multi activate", GDObjPropType::Bool),
    100u16 => ("Target move mode", GDObjPropType::Unknown),
    101u16 => ("Target move mode axis lock", GDObjPropType::Unknown),
    102u16 => ("Disable preview", GDObjPropType::Bool),
    103u16 => ("Is high detail?", GDObjPropType::Bool),
    104u16 => ("count trigger Multi activate", GDObjPropType::Bool),
    105u16 => ("Max follow speed", GDObjPropType::Float),
    116u16 => ("No object effects", GDObjPropType::Bool),
    117u16 => ("Reverses gameplay", GDObjPropType::Bool),
    120u16 => ("Timewarp amount", GDObjPropType::Float),
    121u16 => ("No touch?", GDObjPropType::Bool),
    128u16 => ("X scale", GDObjPropType::Float),
    129u16 => ("Y scale", GDObjPropType::Float),
    131u16 => ("Y warp angle", GDObjPropType::Float),
    132u16 => ("X warp angle", GDObjPropType::Float),
    133u16 => ("Only move", GDObjPropType::Bool),
    134u16 => ("Passable", GDObjPropType::Bool),
    135u16 => ("Hidden", GDObjPropType::Bool),
    136u16 => ("Non-stick X", GDObjPropType::Bool),
    137u16 => ("Is ice block?", GDObjPropType::Bool),
    138u16 => ("Controlling player 1", GDObjPropType::Bool),
    141u16 => ("Follow camera's x movement", GDObjPropType::Bool),
    142u16 => ("Follow camera's y movement", GDObjPropType::Bool),
    143u16 => ("X movement multiplier", GDObjPropType::Float),
    144u16 => ("Y movement multiplier", GDObjPropType::Float),
    148u16 => ("Gravity", GDObjPropType::Float),
    150u16 => ("New X Scale", GDObjPropType::Float),
    151u16 => ("New Y Scale", GDObjPropType::Float),
    152u16 => ("Random probabilities list", GDObjPropType::ProbabilitiesList),
    153u16 => ("Div by value X", GDObjPropType::Bool),
    154u16 => ("Div by value Y", GDObjPropType::Bool),
    193u16 => ("Grip slope?", GDObjPropType::Bool),
    198u16 => ("Touch player only", GDObjPropType::Unknown),
    200u16 => ("Controlling player 2", GDObjPropType::Bool),
    201u16 => ("Controlling target player", GDObjPropType::Bool),
    210u16 => ("No legacy HSV", GDObjPropType::Bool),
    217u16 => ("Enter/Exit transition config", GDObjPropType::Unknown),
    274u16 => ("Parent groups", GDObjPropType::Unknown),
    279u16 => ("Is area parent?", GDObjPropType::Bool),
    284u16 => ("Single player touch", GDObjPropType::Bool),
    289u16 => ("Non-stick Y", GDObjPropType::Bool),
    343u16 => ("Enter effect channel", GDObjPropType::Unknown),
    344u16 => ("Target transition channel", GDObjPropType::Unknown),
    356u16 => ("Scale stick", GDObjPropType::Bool),
    369u16 => ("Center effect", GDObjPropType::Bool),
    371u16 => ("Camera zoom", GDObjPropType::Float),
    372u16 => ("No audio scale", GDObjPropType::Bool),
    385u16 => ("X reference position", GDObjPropType::Unknown),
    386u16 => ("Y reference position", GDObjPropType::Unknown),
    387u16 => ("X reference is relative", GDObjPropType::Bool),
    388u16 => ("Y reference is relative", GDObjPropType::Bool),
    389u16 => ("Seconds only", GDObjPropType::Bool),
    390u16 => ("Special counter mode", GDObjPropType::Unknown),
    391u16 => ("Counter alignment", GDObjPropType::Int),
    392u16 => ("Song ID", GDObjPropType::Int),
    393u16 => ("Small step", GDObjPropType::Bool),
    394u16 => ("Directional move mode", GDObjPropType::Bool),
    395u16 => ("Center group id", GDObjPropType::Group),
    396u16 => ("Directional mode distance", GDObjPropType::Int),
    397u16 => ("Dynamic move", GDObjPropType::Bool),
    399u16 => ("Prep?", GDObjPropType::Bool),
    400u16 => ("Load Prep?", GDObjPropType::Bool),
    401u16 => ("Rotation target ID", GDObjPropType::Int),
    402u16 => ("Rotation offset", GDObjPropType::Float),
    403u16 => ("Dynamic move easing", GDObjPropType::Int),
    404u16 => ("Song speed", GDObjPropType::Int),
    406u16 => ("Song volume", GDObjPropType::Float),
    408u16 => ("Start offset in ms", GDObjPropType::Int),
    409u16 => ("Fade in time in ms", GDObjPropType::Int),
    410u16 => ("End offset in ms", GDObjPropType::Int),
    411u16 => ("Fade out time in ms", GDObjPropType::Int),
    413u16 => ("Loop song?", GDObjPropType::Bool),
    430u16 => ("Event listeners", GDObjPropType::EventsList),
    432u16 => ("Song channel", GDObjPropType::Unknown),
    441u16 => ("Spawn ordered", GDObjPropType::Bool),
    442u16 => ("Spawn ID remaps", GDObjPropType::SpawnRemapsList),
    444u16 => ("No multiactivate platformer", GDObjPropType::Bool),
    445u16 => ("Claim touch?", GDObjPropType::Bool),
    446u16 => ("Object material", GDObjPropType::Unknown),
    447u16 => ("Event extra ID", GDObjPropType::Group),
    452u16 => ("Relative rotation", GDObjPropType::Bool),
    460u16 => ("No end effects?", GDObjPropType::Bool),
    461u16 => ("No end sound effects?", GDObjPropType::Bool),
    466u16 => ("Is Timer?", GDObjPropType::Bool),
    467u16 => ("Start time", GDObjPropType::Bool),
    468u16 => ("Don't override", GDObjPropType::Bool),
    469u16 => ("Ignore timewarp", GDObjPropType::Bool),
    470u16 => ("Time value multipler", GDObjPropType::Float),
    471u16 => ("Start paused timer", GDObjPropType::Float),
    472u16 => ("Stop time counter?", GDObjPropType::Bool),
    473u16 => ("Target time", GDObjPropType::Float),
    474u16 => ("Pause at target time", GDObjPropType::Bool),
    475u16 => ("Multiactivatable time event", GDObjPropType::Bool),
    476u16 => ("First item type", GDObjPropType::Unknown),
    477u16 => ("Second item type", GDObjPropType::Unknown),
    478u16 => ("Target item type", GDObjPropType::Unknown),
    479u16 => ("Modifier", GDObjPropType::Float),
    480u16 => ("Left operator", GDObjPropType::Unknown),
    481u16 => ("Right operator", GDObjPropType::Unknown),
    482u16 => ("Compare operator", GDObjPropType::Unknown),
    483u16 => ("Second modifier", GDObjPropType::Float),
    484u16 => ("Tolerance", GDObjPropType::Float),
    485u16 => ("Left round mode", GDObjPropType::Unknown),
    486u16 => ("Right round mode", GDObjPropType::Unknown),
    487u16 => ("Instant end?", GDObjPropType::Bool),
    488u16 => ("Kerning", GDObjPropType::Int),
    491u16 => ("Set persistent item", GDObjPropType::Bool),
    492u16 => ("Target all persistent items", GDObjPropType::Bool),
    493u16 => ("Reset item to 0", GDObjPropType::Bool),
    494u16 => ("Timer", GDObjPropType::Item),
    495u16 => ("Extra sticky", GDObjPropType::Bool),
    496u16 => ("Don't boost Y?", GDObjPropType::Bool),
    504u16 => ("Spawn only", GDObjPropType::Bool),
    506u16 => ("Camera guide preview opacity", GDObjPropType::Float),
    507u16 => ("No particles", GDObjPropType::Bool),
    509u16 => ("Don't boost X?", GDObjPropType::Bool),
    511u16 => ("Has extended collision", GDObjPropType::Bool),
    516u16 => ("MinX ID", GDObjPropType::Group),
    517u16 => ("MinY ID", GDObjPropType::Group),
    518u16 => ("MaxX ID", GDObjPropType::Group),
    519u16 => ("MaxY ID", GDObjPropType::Group),
    525u16 => ("Event Extra ID 2", GDObjPropType::Bool),
    533u16 => ("Middleground", GDObjPropType::Int),
    534u16 => ("Material control ID", GDObjPropType::Int),
    535u16 => ("Use control ID", GDObjPropType::Bool),
    540u16 => ("Stop player jump", GDObjPropType::Bool),
    541u16 => ("Stop player movement", GDObjPropType::Bool),
    542u16 => ("Stop player rotation", GDObjPropType::Bool),
    543u16 => ("Stop player sliding", GDObjPropType::Bool),
    544u16 => ("Silent move", GDObjPropType::Bool),
    547u16 => ("X offset of spawned particles", GDObjPropType::Int),
    548u16 => ("Y offset of spawned particles", GDObjPropType::Int),
    549u16 => ("X offset variation of spawned particles", GDObjPropType::Int),
    550u16 => ("Y offset variation of spawned particles", GDObjPropType::Int),
    551u16 => ("Match rotation of spawned particles?", GDObjPropType::Bool),
    552u16 => ("Rotation of spawned particles", GDObjPropType::Int),
    553u16 => ("Rotation variation of spawned particles", GDObjPropType::Int),
    554u16 => ("Scale of spawned particles", GDObjPropType::Float),
    555u16 => ("Scale variation of spawned particles", GDObjPropType::Float),
    556u16 => ("Spawn delay variation", GDObjPropType::Float),
    574u16 => ("Respawn time", GDObjPropType::Float),
    577u16 => ("Relative scale", GDObjPropType::Bool),
    578u16 => ("Left sign mode", GDObjPropType::Unknown),
    579u16 => ("Right sign mode", GDObjPropType::Unknown),
    580u16 => ("Stop mode", GDObjPropType::Unknown),
    581u16 => ("Reset remap", GDObjPropType::Bool),
    582u16 => ("X velocity modifier", GDObjPropType::Float),
    583u16 => ("Y velocity modifier", GDObjPropType::Float),
    595u16 => ("Don't stop song on death", GDObjPropType::Bool),
    10002u16 => ("Starting gamemode", GDObjPropType::Unknown),
    10003u16 => ("Starting in mini mode?", GDObjPropType::Bool),
    10004u16 => ("Starting speed", GDObjPropType::Unknown),
    10008u16 => ("Starting in dual mode?", GDObjPropType::Bool),
    10019u16 => ("Target order", GDObjPropType::Unknown),
    10020u16 => ("Reverse gameplay?", GDObjPropType::Bool),
    10021u16 => ("Is disabled?", GDObjPropType::Bool),
    10026u16 => ("Target channel", GDObjPropType::Unknown),
    10028u16 => ("Starting in mirror mode?", GDObjPropType::Bool),
    10029u16 => ("Rotate gameplay?", GDObjPropType::Bool),
    10035u16 => ("Reset camera?", GDObjPropType::Bool),
};

/// A map of level header property IDs to their identifier and type. kAxx properties retain their normal index,
/// while kSxx properties' indices are shifted 1000 upwards.
///
/// Reference: <https://wyliemaster.github.io/gddocs/#/resources/client/level-components/level-start>
pub static LEVEL_HEADER_PROPERTIES: Map<u16, (&'static str, HeaderValueType)> = phf_map! {
    1u16 => ("Audio track", HeaderValueType::Int),
    2u16 => ("Gamemode", HeaderValueType::Gamemode),
    3u16 => ("Mini mode", HeaderValueType::Bool),
    4u16 => ("Speed", HeaderValueType::Speed),
    5u16 => ("Obj2 blending", HeaderValueType::Bool),
    6u16 => ("Background texture ID", HeaderValueType::Int),
    7u16 => ("Ground texture ID", HeaderValueType::Int),
    8u16 => ("Dual mode", HeaderValueType::Bool),
    9u16 => ("Level or Startpos object", HeaderValueType::Bool),
    10u16 => ("Two player mode", HeaderValueType::Bool),
    11u16 => ("Flip gravity", HeaderValueType::Bool),
    12u16 => ("Colour3 blending", HeaderValueType::Bool),
    13u16 => ("Song offset seconds", HeaderValueType::Float),
    14u16 => ("Guidelines", HeaderValueType::GuidelineString),
    15u16 => ("Fade in", HeaderValueType::Bool),
    16u16 => ("Fade out", HeaderValueType::Bool),
    17u16 => ("Ground line ID", HeaderValueType::Int),
    18u16 => ("Font ID", HeaderValueType::Int),
    19u16 => ("Startpos target order", HeaderValueType::Int),
    20u16 => ("Reverse gameplay", HeaderValueType::Bool),
    21u16 => ("Startpos disabled", HeaderValueType::Bool),
    22u16 => ("Plaformer mode", HeaderValueType::Bool),
    25u16 => ("Middleground texture ID", HeaderValueType::Int),
    26u16 => ("Startpos target channel", HeaderValueType::Int),
    27u16 => ("Allow multi-rotation", HeaderValueType::Bool),
    28u16 => ("Mirror mode", HeaderValueType::Bool),
    29u16 => ("Rotate gameplay", HeaderValueType::Bool),
    31u16 => ("Enable player squeeze", HeaderValueType::Bool),
    32u16 => ("Fix gravity bug", HeaderValueType::Bool),
    33u16 => ("Fix negative scale", HeaderValueType::Bool),
    34u16 => ("Fix robot jump", HeaderValueType::Bool),
    35u16 => ("Startpos reset camera", HeaderValueType::Bool),
    36u16 => ("Spawn group", HeaderValueType::Int),
    37u16 => ("Dynamic level height", HeaderValueType::Bool),
    38u16 => ("Sort groups", HeaderValueType::Bool),
    39u16 => ("Fix radius collision", HeaderValueType::Bool),
    40u16 => ("Enable 2.2 changes", HeaderValueType::Bool),
    41u16 => ("Allow static rotate", HeaderValueType::Bool),
    42u16 => ("Reverse sync", HeaderValueType::Bool),
    43u16 => ("No time penalty", HeaderValueType::Bool),
    44u16 => ("Decrease boost slide", HeaderValueType::Bool),
    /* Deprecated keys kS1-kS20 and kS29-kS37 are not included */
    1038u16 => ("Colours", HeaderValueType::ColourString),
    1039u16 => ("Colour page", HeaderValueType::Int),
};

/// Get type of an object property by ID
pub fn get_obj_property_type(p: u16) -> Option<GDObjPropType> {
    PROPERTY_TABLE.get(&p).map(|v| v.1)
}
/// Get type of a level header property by ID
pub fn get_level_header_property_type(p: u16) -> Option<HeaderValueType> {
    LEVEL_HEADER_PROPERTIES.get(&p).map(|v| v.1)
}

/// Map of various object IDs to their names.
/// Used to autogenerate `gdobj::ids.rs`
pub const OBJECT_NAMES: &[(i32, &str)] = &[
    (1, "Default block"),
    (2, "Waffle block floor"),
    (3, "Waffle block corner"),
    (4, "Waffle block inner corner"),
    (5, "Waffle block filler"),
    (6, "Waffle block no bottom"),
    (7, "Waffle block straight"),
    (8, "Spike"),
    (9, "Ground spikes"),
    (10, "Normal gravity portal"),
    (11, "Flipped gravity portal"),
    (12, "Cube portal"),
    (13, "Ship portal"),
    (15, "Pulse pole tall"),
    (16, "Pulse pole medium"),
    (17, "Pulse pole short"),
    (18, "Transparent spikes huge"),
    (19, "Transparent spikes big"),
    (20, "Transparent spikes medium"),
    (21, "Transparent spikes small"),
    (22, "No block transition object"),
    (23, "Blocks from top transition object"),
    (24, "Blocks from bottom transition object"),
    (25, "Blocks from left transition object"),
    (26, "Blocks from right transition object"),
    (27, "Scale in transition object"),
    (28, "Scale out transition object"),
    // 29 + 30: mystery colour triggers
    (31, "Start pos"),
    (32, "Enable player trail"),
    (33, "Disable player trail"),
    (34, "Solid startpos"),
    (35, "Yellow pad"),
    (36, "Yellow orb"),
    (39, "Small spike"),
    (40, "Half block default"),
    (41, "Chain tall"),
    (45, "Mirror portal reverse"),
    (46, "Mirror portal normal"),
    (47, "Ball portal"),
    (48, "Transparent clouds big"),
    (49, "Transparent clouds small"),
    (50, "Pulse circle"),
    (51, "Pulse ring"),
    (52, "Pulse heart"),
    (53, "Pulse diamond"),
    (54, "Pulse star"),
    (55, "Random direction transition object"),
    (56, "Away to left transition object"),
    (57, "Away to right transition object"),
    (58, "Away from middle transition object"),
    (59, "Away to middle transition object"),
    (60, "Pulse music note"),
    (61, "Ground spikes wavy"),
    (62, "Wavy block floor"),
    (67, "Blue pad"),
    (83, "Waffle block"),
    (84, "Blue orb"),
    (88, "Buzzsaw big"),
    (89, "Buzzsaw medium"),
    (98, "Buzzsaw small"),
    (99, "Size portal normal"),
    (101, "Size portal small"),
    (111, "UFO portal"),
    (140, "Pink pad"),
    (141, "Pink orb"),
    (200, "Speed portal 0.5x"),
    (201, "Speed portal 1x"),
    (202, "Speed portal 2x"),
    (203, "Speed portal 3x"),
    (286, "Dual portal double"),
    (287, "Dual portal single"),
    (899, "Trigger Colour"),
    (901, "Trigger Move"),
    (914, "Text object"),
    (1006, "Trigger Pulse"),
    (1007, "Trigger Alpha"),
    (1049, "Trigger Toggle"),
    (1268, "Trigger Spawn"),
    (1346, "Trigger Rotation"),
    (1347, "Trigger Follow"),
    (1520, "Trigger Shake"),
    (1585, "Trigger Animate"),
    (1595, "Trigger Touch"),
    (1611, "Trigger Count"),
    (1615, "Counter"),
    (1616, "Trigger Stop"),
    (1812, "Trigger On death"),
    (1812, "Trigger follow player y"),
    (1815, "Trigger Collision"),
    (1816, "Collision block"),
    (1818, "BG effect on"),
    (1819, "BG effect off"),
    (1912, "Trigger Random"),
    (1913, "Trigger Camera zoom"),
    (1915, "Don't fade + don't enter transition object"),
    (1917, "Trigger Reverse gameplay"),
    (1932, "Trigger Player control"),
    (1934, "Trigger Song"),
    (1935, "Trigger Time warp"),
    (2016, "Camera guide"),
    (2066, "Trigger Gravity"),
    (2067, "Trigger Scale"),
    (2068, "Trigger Advanced random"),
    (2900, "Trigger rotate gameplay"),
    (2900, "Trigger Middleground config"),
    (3024, "Trigger Area stop"),
    (3031, "Trigger Middleground change"),
    (3600, "Trigger End"),
    (3604, "Trigger Event"),
    (3606, "BG speed config"),
    (3608, "Trigger Spawn particle"),
    (3609, "Trigger Instant collision"),
    (3612, "MG speed config"),
    (3613, "UI config"),
    (3614, "Trigger Time"),
    (3615, "Trigger Time event"),
    (3617, "Trigger Time control"),
    (3618, "Trigger Reset group"),
    (3619, "Trigger Item edit"),
    (3620, "Trigger Item compare"),
    (3640, "Collision state block"),
    (3641, "Trigger Persistent item"),
    (3643, "Toggle block"),
    (3662, "Trigger Link visible"),
];