major cleanup of preprocessor hell
[rocksndiamonds.git] / src / main.c
1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
5 //                  Holger Schemel
6 //                  info@artsoft.org
7 //                  http://www.artsoft.org/
8 // ----------------------------------------------------------------------------
9 // main.c
10 // ============================================================================
11
12 #include "libgame/libgame.h"
13
14 #include "main.h"
15 #include "init.h"
16 #include "game.h"
17 #include "tape.h"
18 #include "tools.h"
19 #include "events.h"
20 #include "config.h"
21
22 Bitmap                 *bitmap_db_store;
23 Bitmap                 *bitmap_db_cross;
24 Bitmap                 *bitmap_db_field;
25 Bitmap                 *bitmap_db_panel;
26 Bitmap                 *bitmap_db_door_1;
27 Bitmap                 *bitmap_db_door_2;
28 Bitmap                 *bitmap_db_toons;
29 DrawBuffer             *fieldbuffer;
30 DrawBuffer             *drawto_field;
31
32 int                     game_status = -1;
33 boolean                 level_editor_test_game = FALSE;
34 boolean                 network_playing = FALSE;
35
36 #if defined(TARGET_SDL)
37 boolean                 network_server = FALSE;
38 SDL_Thread             *server_thread;
39 #endif
40
41 int                     key_joystick_mapping = 0;
42
43 boolean                 redraw[2 + MAX_LEV_FIELDX + 2][2 + MAX_LEV_FIELDY + 2];
44 int                     redraw_x1 = 0, redraw_y1 = 0;
45
46 short                   Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
47 short                   MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
48 short                   MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
49 short                   MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
50 short                   ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
51 short                   ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
52 short                   CustomValue[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
53 short                   Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
54 short                   Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
55 short                   StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
56 short                   Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
57 boolean                 Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
58 boolean                 Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
59 short                   ChangeCount[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
60 short                   ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
61 short                   WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
62 short                   WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
63 short                   CheckCollision[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
64 short                   CheckImpact[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
65 short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
66 short                   AmoebaCnt[MAX_NUM_AMOEBA];
67 short                   AmoebaCnt2[MAX_NUM_AMOEBA];
68 short                   ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
69 short                   ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
70 short                   ExplodeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
71 int                     RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
72 int                     PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
73
74 int                     GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
75 int                     GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
76 int                     GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
77 int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
78 int                     GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
79 int                     GfxRedraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
80
81 int                     ActiveElement[MAX_NUM_ELEMENTS];
82 int                     ActiveButton[NUM_IMAGE_FILES];
83 int                     ActiveFont[NUM_FONTS];
84
85 int                     lev_fieldx, lev_fieldy;
86 int                     scroll_x, scroll_y;
87
88 int                     WIN_XSIZE = 672, WIN_YSIZE = 560;
89 int                     SCR_FIELDX = 17, SCR_FIELDY = 17;
90 int                     REAL_SX = 6, REAL_SY = 6;
91 int                     SX = 8, SY = 8;
92 int                     DX = 566, DY = 60;
93 int                     VX = 566, VY = 400;
94 int                     EX = 566, EY = 356;
95 int                     dDX, dDY;
96 int                     FULL_SXSIZE = 2 + 17 * TILEX + 2; /* 2 + SXSIZE + 2 */
97 int                     FULL_SYSIZE = 2 + 17 * TILEY + 2; /* 2 + SYSIZE + 2 */
98 int                     SXSIZE = 17 * TILEX;    /* SCR_FIELDX * TILEX */
99 int                     SYSIZE = 17 * TILEY;    /* SCR_FIELDY * TILEY */
100 int                     DXSIZE = 100;
101 int                     DYSIZE = 280;
102 int                     VXSIZE = 100;
103 int                     VYSIZE = 100;
104 int                     EXSIZE = 100;
105 int                     EYSIZE = 144;
106 int                     TILESIZE_VAR = TILESIZE;
107
108 int                     FX, FY;
109 int                     ScrollStepSize;
110 int                     ScreenMovDir = MV_NONE, ScreenMovPos = 0;
111 int                     ScreenGfxPos = 0;
112 int                     BorderElement = EL_STEELWALL;
113 int                     GameFrameDelay = GAME_FRAME_DELAY;
114 int                     FfwdFrameDelay = FFWD_FRAME_DELAY;
115 int                     BX1, BY1;
116 int                     BX2, BY2;
117 int                     SBX_Left, SBX_Right;
118 int                     SBY_Upper, SBY_Lower;
119 int                     ZX, ZY;
120 int                     ExitX, ExitY;
121 int                     AllPlayersGone;
122
123 int                     TimeFrames, TimePlayed, TimeLeft, TapeTime;
124
125 boolean                 network_player_action_received = FALSE;
126
127 struct LevelSetInfo     levelset;
128 struct LevelInfo        level, level_template;
129 struct PlayerInfo       stored_player[MAX_PLAYERS], *local_player = NULL;
130 struct HiScore          highscore[MAX_SCORE_ENTRIES];
131 struct TapeInfo         tape;
132 struct SetupInfo        setup;
133 struct GameInfo         game;
134 struct GlobalInfo       global;
135 struct BorderInfo       border;
136 struct ViewportInfo     viewport;
137 struct TitleFadingInfo  fading;
138 struct TitleFadingInfo  title_initial_default;
139 struct TitleFadingInfo  title_default;
140 struct TitleMessageInfo titlemessage_initial_default;
141 struct TitleMessageInfo titlemessage_initial[MAX_NUM_TITLE_MESSAGES];
142 struct TitleMessageInfo titlemessage_default;
143 struct TitleMessageInfo titlemessage[MAX_NUM_TITLE_MESSAGES];
144 struct TitleMessageInfo readme;
145 struct InitInfo         init, init_last;
146 struct MenuInfo         menu;
147 struct DoorInfo         door_1, door_2;
148 struct RequestInfo      request;
149 struct PreviewInfo      preview;
150 struct EditorInfo       editor;
151
152 struct GraphicInfo     *graphic_info = NULL;
153 struct SoundInfo       *sound_info = NULL;
154 struct MusicInfo       *music_info = NULL;
155 struct MusicFileInfo   *music_file_info = NULL;
156 struct HelpAnimInfo    *helpanim_info = NULL;
157
158 SetupFileHash          *helptext_info = NULL;
159 SetupFileHash          *image_config_hash = NULL;
160 SetupFileHash          *element_token_hash = NULL;
161 SetupFileHash          *graphic_token_hash = NULL;
162 SetupFileHash          *font_token_hash = NULL;
163
164
165 /* ------------------------------------------------------------------------- */
166 /* element definitions                                                       */
167 /* ------------------------------------------------------------------------- */
168
169 struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1];
170
171 /* this contains predefined structure elements to initialize "element_info" */
172 struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
173 {
174   /* keyword to start parser: "ELEMENT_INFO_START" <-- do not change! */
175
176   /* ----------------------------------------------------------------------- */
177   /* "real" level file elements                                              */
178   /* ----------------------------------------------------------------------- */
179
180   {
181     "empty_space",
182     "empty_space",
183     "empty space"
184   },
185   {
186     "sand",
187     "sand",
188     "sand"
189   },
190   {
191     "wall",
192     "wall",
193     "normal wall"
194   },
195   {
196     "wall_slippery",
197     "wall",
198     "slippery wall"
199   },
200   {
201     "rock",
202     "rock",
203     "rock"
204   },
205   {
206     "key_obsolete",
207     "obsolete",
208     "key (OBSOLETE)"
209   },
210   {
211     "emerald",
212     "emerald",
213     "emerald"
214   },
215   {
216     "exit_closed",
217     "exit",
218     "closed exit"
219   },
220   {
221     "player_obsolete",
222     "obsolete",
223     "player (OBSOLETE)"
224   },
225   {
226     "bug",
227     "bug",
228     "bug (random start direction)"
229   },
230   {
231     "spaceship",
232     "spaceship",
233     "spaceship (random start direction)"
234   },
235   {
236     "yamyam",
237     "yamyam",
238     "yam yam (random start direction)"
239   },
240   {
241     "robot",
242     "robot",
243     "robot"
244   },
245   {
246     "steelwall",
247     "steelwall",
248     "steel wall"
249   },
250   {
251     "diamond",
252     "diamond",
253     "diamond"
254   },
255   {
256     "amoeba_dead",
257     "amoeba",
258     "dead amoeba"
259   },
260   {
261     "quicksand_empty",
262     "quicksand",
263     "quicksand (empty)"
264   },
265   {
266     "quicksand_full",
267     "quicksand",
268     "quicksand (with rock)"
269   },
270   {
271     "amoeba_drop",
272     "amoeba",
273     "amoeba drop"
274   },
275   {
276     "bomb",
277     "bomb",
278     "bomb"
279   },
280   {
281     "magic_wall",
282     "magic_wall",
283     "magic wall"
284   },
285   {
286     "speed_pill",
287     "speed_pill",
288     "speed pill"
289   },
290   {
291     "acid",
292     "acid",
293     "acid"
294   },
295   {
296     "amoeba_wet",
297     "amoeba",
298     "dropping amoeba (EM style)"
299   },
300   {
301     "amoeba_dry",
302     "amoeba",
303     "normal amoeba"
304   },
305   {
306     "nut",
307     "nut",
308     "nut with emerald"
309   },
310   {
311     "game_of_life",
312     "game_of_life",
313     "Conway's wall of life"
314   },
315   {
316     "biomaze",
317     "biomaze",
318     "biomaze"
319   },
320   {
321     "dynamite.active",
322     "dynamite",
323     "burning dynamite"
324   },
325   {
326     "stoneblock",
327     "wall",
328     "wall"
329   },
330   {
331     "robot_wheel",
332     "robot_wheel",
333     "magic wheel"
334   },
335   {
336     "robot_wheel.active",
337     "robot_wheel",
338     "magic wheel (running)"
339   },
340   {
341     "key_1",
342     "key",
343     "key 1"
344   },
345   {
346     "key_2",
347     "key",
348     "key 2"
349   },
350   {
351     "key_3",
352     "key",
353     "key 3"
354   },
355   {
356     "key_4",
357     "key",
358     "key 4"
359   },
360   {
361     "gate_1",
362     "gate",
363     "door 1"
364   },
365   {
366     "gate_2",
367     "gate",
368     "door 2"
369   },
370   {
371     "gate_3",
372     "gate",
373     "door 3"
374   },
375   {
376     "gate_4",
377     "gate",
378     "door 4"
379   },
380   {
381     "gate_1_gray",
382     "gate",
383     "gray door (opened by key 1)"
384   },
385   {
386     "gate_2_gray",
387     "gate",
388     "gray door (opened by key 2)"
389   },
390   {
391     "gate_3_gray",
392     "gate",
393     "gray door (opened by key 3)"
394   },
395   {
396     "gate_4_gray",
397     "gate",
398     "gray door (opened by key 4)"
399   },
400   {
401     "dynamite",
402     "dynamite",
403     "dynamite"
404   },
405   {
406     "pacman",
407     "pacman",
408     "pac man (random start direction)"
409   },
410   {
411     "invisible_wall",
412     "wall",
413     "invisible normal wall"
414   },
415   {
416     "lamp",
417     "lamp",
418     "lamp (off)"
419   },
420   {
421     "lamp.active",
422     "lamp",
423     "lamp (on)"
424   },
425   {
426     "wall_emerald",
427     "wall",
428     "wall with emerald"
429   },
430   {
431     "wall_diamond",
432     "wall",
433     "wall with diamond"
434   },
435   {
436     "amoeba_full",
437     "amoeba",
438     "amoeba with content"
439   },
440   {
441     "bd_amoeba",
442     "bd_amoeba",
443     "amoeba (BD style)"
444   },
445   {
446     "time_orb_full",
447     "time_orb_full",
448     "time orb (full)"
449   },
450   {
451     "time_orb_empty",
452     "time_orb_empty",
453     "time orb (empty)"
454   },
455   {
456     "expandable_wall",
457     "wall",
458     "growing wall (horizontal, visible)"
459   },
460   {
461     "bd_diamond",
462     "bd_diamond",
463     "diamond (BD style)"
464   },
465   {
466     "emerald_yellow",
467     "emerald",
468     "yellow emerald"
469   },
470   {
471     "wall_bd_diamond",
472     "wall",
473     "wall with BD style diamond"
474   },
475   {
476     "wall_emerald_yellow",
477     "wall",
478     "wall with yellow emerald"
479   },
480   {
481     "dark_yamyam",
482     "dark_yamyam",
483     "dark yam yam"
484   },
485   {
486     "bd_magic_wall",
487     "bd_magic_wall",
488     "magic wall (BD style)"
489   },
490   {
491     "invisible_steelwall",
492     "steelwall",
493     "invisible steel wall"
494   },
495   {
496     "sokoban_field_player",
497     "sokoban",
498     "sokoban field with player"
499   },
500   {
501     "dynabomb_increase_number",
502     "dynabomb",
503     "increases number of bombs"
504   },
505   {
506     "dynabomb_increase_size",
507     "dynabomb",
508     "increases explosion size"
509   },
510   {
511     "dynabomb_increase_power",
512     "dynabomb",
513     "increases power of explosion"
514   },
515   {
516     "sokoban_object",
517     "sokoban",
518     "sokoban object"
519   },
520   {
521     "sokoban_field_empty",
522     "sokoban",
523     "sokoban empty field"
524   },
525   {
526     "sokoban_field_full",
527     "sokoban",
528     "sokoban field with object"
529   },
530   {
531     "bd_butterfly.right",
532     "bd_butterfly",
533     "butterfly (starts moving right)"},
534   {
535     "bd_butterfly.up",
536     "bd_butterfly",
537     "butterfly (starts moving up)"
538   },
539   {
540     "bd_butterfly.left",
541     "bd_butterfly",
542     "butterfly (starts moving left)"},
543   {
544     "bd_butterfly.down",
545     "bd_butterfly",
546     "butterfly (starts moving down)"},
547   {
548     "bd_firefly.right",
549     "bd_firefly",
550     "firefly (starts moving right)"
551   },
552   {
553     "bd_firefly.up",
554     "bd_firefly",
555     "firefly (starts moving up)"
556   },
557   {
558     "bd_firefly.left",
559     "bd_firefly",
560     "firefly (starts moving left)"
561   },
562   {
563     "bd_firefly.down",
564     "bd_firefly",
565     "firefly (starts moving down)"
566   },
567   {
568     "bd_butterfly",
569     "bd_butterfly",
570     "butterfly (random start direction)"
571   },
572   {
573     "bd_firefly",
574     "bd_firefly",
575     "firefly (random start direction)"
576   },
577   {
578     "player_1",
579     "player",
580     "player 1"
581   },
582   {
583     "player_2",
584     "player",
585     "player 2"
586   },
587   {
588     "player_3",
589     "player",
590     "player 3"
591   },
592   {
593     "player_4",
594     "player",
595     "player 4"
596   },
597   {
598     "bug.right",
599     "bug",
600     "bug (starts moving right)"
601   },
602   {
603     "bug.up",
604     "bug",
605     "bug (starts moving up)"
606   },
607   {
608     "bug.left",
609     "bug",
610     "bug (starts moving left)"
611   },
612   {
613     "bug.down",
614     "bug",
615     "bug (starts moving down)"
616   },
617   {
618     "spaceship.right",
619     "spaceship",
620     "spaceship (starts moving right)"},
621   {
622     "spaceship.up",
623     "spaceship",
624     "spaceship (starts moving up)"
625   },
626   {
627     "spaceship.left",
628     "spaceship",
629     "spaceship (starts moving left)"},
630   {
631     "spaceship.down",
632     "spaceship",
633     "spaceship (starts moving down)"},
634   {
635     "pacman.right",
636     "pacman",
637     "pac man (starts moving right)"
638   },
639   {
640     "pacman.up",
641     "pacman",
642     "pac man (starts moving up)"
643   },
644   {
645     "pacman.left",
646     "pacman",
647     "pac man (starts moving left)"
648   },
649   {
650     "pacman.down",
651     "pacman",
652     "pac man (starts moving down)"
653   },
654   {
655     "emerald_red",
656     "emerald",
657     "red emerald"
658   },
659   {
660     "emerald_purple",
661     "emerald",
662     "purple emerald"
663   },
664   {
665     "wall_emerald_red",
666     "wall",
667     "wall with red emerald"
668   },
669   {
670     "wall_emerald_purple",
671     "wall",
672     "wall with purple emerald"
673   },
674   {
675     "acid_pool_topleft",
676     "wall",
677     "acid pool (top left)"
678   },
679   {
680     "acid_pool_topright",
681     "wall",
682     "acid pool (top right)"
683   },
684   {
685     "acid_pool_bottomleft",
686     "wall",
687     "acid pool (bottom left)"
688   },
689   {
690     "acid_pool_bottom",
691     "wall",
692     "acid pool (bottom)"
693   },
694   {
695     "acid_pool_bottomright",
696     "wall",
697     "acid pool (bottom right)"
698   },
699   {
700     "bd_wall",
701     "wall",
702     "normal wall (BD style)"
703   },
704   {
705     "bd_rock",
706     "bd_rock",
707     "rock (BD style)"
708   },
709   {
710     "exit_open",
711     "exit",
712     "open exit"
713   },
714   {
715     "black_orb",
716     "black_orb",
717     "black orb bomb"
718   },
719   {
720     "amoeba_to_diamond",
721     "amoeba",
722     "amoeba"
723   },
724   {
725     "mole",
726     "mole",
727     "mole (random start direction)"
728   },
729   {
730     "penguin",
731     "penguin",
732     "penguin"
733   },
734   {
735     "satellite",
736     "satellite",
737     "satellite"
738   },
739   {
740     "arrow_left",
741     "arrow",
742     "arrow left"
743   },
744   {
745     "arrow_right",
746     "arrow",
747     "arrow right"
748   },
749   {
750     "arrow_up",
751     "arrow",
752     "arrow up"
753   },
754   {
755     "arrow_down",
756     "arrow",
757     "arrow down"
758   },
759   {
760     "pig",
761     "pig",
762     "pig"
763   },
764   {
765     "dragon",
766     "dragon",
767     "fire breathing dragon"
768   },
769   {
770     "em_key_1_file_obsolete",
771     "obsolete",
772     "key (OBSOLETE)"
773   },
774   {
775     "char_space",
776     "char",
777     "letter ' '"
778   },
779   {
780     "char_exclam",
781     "char",
782     "letter '!'"
783   },
784   {
785     "char_quotedbl",
786     "char",
787     "letter '\"'"
788   },
789   {
790     "char_numbersign",
791     "char",
792     "letter '#'"
793   },
794   {
795     "char_dollar",
796     "char",
797     "letter '$'"
798   },
799   {
800     "char_percent",
801     "char",
802     "letter '%'"
803   },
804   {
805     "char_ampersand",
806     "char",
807     "letter '&'"
808   },
809   {
810     "char_apostrophe",
811     "char",
812     "letter '''"
813   },
814   {
815     "char_parenleft",
816     "char",
817     "letter '('"
818   },
819   {
820     "char_parenright",
821     "char",
822     "letter ')'"
823   },
824   {
825     "char_asterisk",
826     "char",
827     "letter '*'"
828   },
829   {
830     "char_plus",
831     "char",
832     "letter '+'"
833   },
834   {
835     "char_comma",
836     "char",
837     "letter ','"
838   },
839   {
840     "char_minus",
841     "char",
842     "letter '-'"
843   },
844   {
845     "char_period",
846     "char",
847     "letter '.'"
848   },
849   {
850     "char_slash",
851     "char",
852     "letter '/'"
853   },
854   {
855     "char_0",
856     "char",
857     "letter '0'"
858   },
859   {
860     "char_1",
861     "char",
862     "letter '1'"
863   },
864   {
865     "char_2",
866     "char",
867     "letter '2'"
868   },
869   {
870     "char_3",
871     "char",
872     "letter '3'"
873   },
874   {
875     "char_4",
876     "char",
877     "letter '4'"
878   },
879   {
880     "char_5",
881     "char",
882     "letter '5'"
883   },
884   {
885     "char_6",
886     "char",
887     "letter '6'"
888   },
889   {
890     "char_7",
891     "char",
892     "letter '7'"
893   },
894   {
895     "char_8",
896     "char",
897     "letter '8'"
898   },
899   {
900     "char_9",
901     "char",
902     "letter '9'"
903   },
904   {
905     "char_colon",
906     "char",
907     "letter ':'"
908   },
909   {
910     "char_semicolon",
911     "char",
912     "letter ';'"
913   },
914   {
915     "char_less",
916     "char",
917     "letter '<'"
918   },
919   {
920     "char_equal",
921     "char",
922     "letter '='"
923   },
924   {
925     "char_greater",
926     "char",
927     "letter '>'"
928   },
929   {
930     "char_question",
931     "char",
932     "letter '?'"
933   },
934   {
935     "char_at",
936     "char",
937     "letter '@'"
938   },
939   {
940     "char_a",
941     "char",
942     "letter 'A'"
943   },
944   {
945     "char_b",
946     "char",
947     "letter 'B'"
948   },
949   {
950     "char_c",
951     "char",
952     "letter 'C'"
953   },
954   {
955     "char_d",
956     "char",
957     "letter 'D'"
958   },
959   {
960     "char_e",
961     "char",
962     "letter 'E'"
963   },
964   {
965     "char_f",
966     "char",
967     "letter 'F'"
968   },
969   {
970     "char_g",
971     "char",
972     "letter 'G'"
973   },
974   {
975     "char_h",
976     "char",
977     "letter 'H'"
978   },
979   {
980     "char_i",
981     "char",
982     "letter 'I'"
983   },
984   {
985     "char_j",
986     "char",
987     "letter 'J'"
988   },
989   {
990     "char_k",
991     "char",
992     "letter 'K'"
993   },
994   {
995     "char_l",
996     "char",
997     "letter 'L'"
998   },
999   {
1000     "char_m",
1001     "char",
1002     "letter 'M'"
1003   },
1004   {
1005     "char_n",
1006     "char",
1007     "letter 'N'"
1008   },
1009   {
1010     "char_o",
1011     "char",
1012     "letter 'O'"
1013   },
1014   {
1015     "char_p",
1016     "char",
1017     "letter 'P'"
1018   },
1019   {
1020     "char_q",
1021     "char",
1022     "letter 'Q'"
1023   },
1024   {
1025     "char_r",
1026     "char",
1027     "letter 'R'"
1028   },
1029   {
1030     "char_s",
1031     "char",
1032     "letter 'S'"
1033   },
1034   {
1035     "char_t",
1036     "char",
1037     "letter 'T'"
1038   },
1039   {
1040     "char_u",
1041     "char",
1042     "letter 'U'"
1043   },
1044   {
1045     "char_v",
1046     "char",
1047     "letter 'V'"
1048   },
1049   {
1050     "char_w",
1051     "char",
1052     "letter 'W'"
1053   },
1054   {
1055     "char_x",
1056     "char",
1057     "letter 'X'"
1058   },
1059   {
1060     "char_y",
1061     "char",
1062     "letter 'Y'"
1063   },
1064   {
1065     "char_z",
1066     "char",
1067     "letter 'Z'"
1068   },
1069   {
1070     "char_bracketleft",
1071     "char",
1072     "letter '['"
1073   },
1074   {
1075     "char_backslash",
1076     "char",
1077     "letter '\\'"
1078   },
1079   {
1080     "char_bracketright",
1081     "char",
1082     "letter ']'"
1083   },
1084   {
1085     "char_asciicircum",
1086     "char",
1087     "letter '^'"
1088   },
1089   {
1090     "char_underscore",
1091     "char",
1092     "letter '_'"
1093   },
1094   {
1095     "char_copyright",
1096     "char",
1097     "letter '©'"
1098   },
1099   {
1100     "char_aumlaut",
1101     "char",
1102     "letter 'Ä'"
1103   },
1104   {
1105     "char_oumlaut",
1106     "char",
1107     "letter 'Ö'"
1108   },
1109   {
1110     "char_uumlaut",
1111     "char",
1112     "letter 'Ãœ'"
1113   },
1114   {
1115     "char_degree",
1116     "char",
1117     "letter '°'"
1118   },
1119   {
1120     "char_trademark",
1121     "char",
1122     "letter '®'"
1123   },
1124   {
1125     "char_cursor",
1126     "char",
1127     "letter ' '"
1128   },
1129   {
1130     "char_unused",
1131     "char",
1132     "letter ''"
1133   },
1134   {
1135     "char_unused",
1136     "char",
1137     "letter ''"
1138   },
1139   {
1140     "char_unused",
1141     "char",
1142     "letter ''"
1143   },
1144   {
1145     "char_unused",
1146     "char",
1147     "letter ''"
1148   },
1149   {
1150     "char_unused",
1151     "char",
1152     "letter ''"
1153   },
1154   {
1155     "char_unused",
1156     "char",
1157     "letter ''"
1158   },
1159   {
1160     "char_unused",
1161     "char",
1162     "letter 'button'"
1163   },
1164   {
1165     "char_unused",
1166     "char",
1167     "letter 'up'"
1168   },
1169   {
1170     "char_unused",
1171     "char",
1172     "letter 'down'"
1173   },
1174   {
1175     "expandable_wall_horizontal",
1176     "wall",
1177     "growing wall (horizontal)"
1178   },
1179   {
1180     "expandable_wall_vertical",
1181     "wall",
1182     "growing wall (vertical)"
1183   },
1184   {
1185     "expandable_wall_any",
1186     "wall",
1187     "growing wall (any direction)"
1188   },
1189   {
1190     "em_gate_1",
1191     "gate",
1192     "door 1 (EM style)"
1193   },
1194   {
1195     "em_gate_2",
1196     "gate",
1197     "door 2 (EM style)"
1198   },
1199   {
1200     "em_gate_3",
1201     "gate",
1202     "door 3 (EM style)"
1203   },
1204   {
1205     "em_gate_4",
1206     "gate",
1207     "door 4 (EM style)"
1208   },
1209   {
1210     "em_key_2_file_obsolete",
1211     "obsolete",
1212     "key (OBSOLETE)"
1213   },
1214   {
1215     "em_key_3_file_obsolete",
1216     "obsolete",
1217     "key (OBSOLETE)"
1218   },
1219   {
1220     "em_key_4_file_obsolete",
1221     "obsolete",
1222     "key (OBSOLETE)"
1223   },
1224   {
1225     "sp_empty_space",
1226     "empty_space",
1227     "empty space"
1228   },
1229   {
1230     "sp_zonk",
1231     "sp_zonk",
1232     "zonk"
1233   },
1234   {
1235     "sp_base",
1236     "sp_base",
1237     "base"
1238   },
1239   {
1240     "sp_murphy",
1241     "player",
1242     "murphy"
1243   },
1244   {
1245     "sp_infotron",
1246     "sp_infotron",
1247     "infotron"
1248   },
1249   {
1250     "sp_chip_single",
1251     "wall",
1252     "chip (single)"
1253   },
1254   {
1255     "sp_hardware_gray",
1256     "wall",
1257     "hardware"
1258   },
1259   {
1260     "sp_exit_closed",
1261     "sp_exit",
1262     "exit"
1263   },
1264   {
1265     "sp_disk_orange",
1266     "sp_disk_orange",
1267     "orange disk"
1268   },
1269   {
1270     "sp_port_right",
1271     "sp_port",
1272     "port (leading right)"
1273   },
1274   {
1275     "sp_port_down",
1276     "sp_port",
1277     "port (leading down)"
1278   },
1279   {
1280     "sp_port_left",
1281     "sp_port",
1282     "port (leading left)"
1283   },
1284   {
1285     "sp_port_up",
1286     "sp_port",
1287     "port (leading up)"
1288   },
1289   {
1290     "sp_gravity_port_right",
1291     "sp_gravity_port",
1292     "gravity-on/off port (leading right)"
1293   },
1294   {
1295     "sp_gravity_port_down",
1296     "sp_gravity_port",
1297     "gravity-on/off port (leading down)"
1298   },
1299   {
1300     "sp_gravity_port_left",
1301     "sp_gravity_port",
1302     "gravity-on/off port (leading left)"
1303   },
1304   {
1305     "sp_gravity_port_up",
1306     "sp_gravity_port",
1307     "gravity-on/off port (leading up)"
1308   },
1309   {
1310     "sp_sniksnak",
1311     "sp_sniksnak",
1312     "snik snak"
1313   },
1314   {
1315     "sp_disk_yellow",
1316     "sp_disk_yellow",
1317     "yellow disk"
1318   },
1319   {
1320     "sp_terminal",
1321     "sp_terminal",
1322     "terminal"
1323   },
1324   {
1325     "sp_disk_red",
1326     "dynamite",
1327     "red disk"
1328   },
1329   {
1330     "sp_port_vertical",
1331     "sp_port",
1332     "port (vertical)"
1333   },
1334   {
1335     "sp_port_horizontal",
1336     "sp_port",
1337     "port (horizontal)"
1338   },
1339   {
1340     "sp_port_any",
1341     "sp_port",
1342     "port (any direction)"
1343   },
1344   {
1345     "sp_electron",
1346     "sp_electron",
1347     "electron"
1348   },
1349   {
1350     "sp_buggy_base",
1351     "sp_buggy_base",
1352     "buggy base"
1353   },
1354   {
1355     "sp_chip_left",
1356     "wall",
1357     "chip (left half)"
1358   },
1359   {
1360     "sp_chip_right",
1361     "wall",
1362     "chip (right half)"
1363   },
1364   {
1365     "sp_hardware_base_1",
1366     "wall",
1367     "hardware"
1368   },
1369   {
1370     "sp_hardware_green",
1371     "wall",
1372     "hardware"
1373   },
1374   {
1375     "sp_hardware_blue",
1376     "wall",
1377     "hardware"
1378   },
1379   {
1380     "sp_hardware_red",
1381     "wall",
1382     "hardware"
1383   },
1384   {
1385     "sp_hardware_yellow",
1386     "wall",
1387     "hardware"
1388   },
1389   {
1390     "sp_hardware_base_2",
1391     "wall",
1392     "hardware"
1393   },
1394   {
1395     "sp_hardware_base_3",
1396     "wall",
1397     "hardware"
1398   },
1399   {
1400     "sp_hardware_base_4",
1401     "wall",
1402     "hardware"
1403   },
1404   {
1405     "sp_hardware_base_5",
1406     "wall",
1407     "hardware"
1408   },
1409   {
1410     "sp_hardware_base_6",
1411     "wall",
1412     "hardware"
1413   },
1414   {
1415     "sp_chip_top",
1416     "wall",
1417     "chip (upper half)"
1418   },
1419   {
1420     "sp_chip_bottom",
1421     "wall",
1422     "chip (lower half)"
1423   },
1424   {
1425     "em_gate_1_gray",
1426     "gate",
1427     "gray door (EM style, key 1)"
1428   },
1429   {
1430     "em_gate_2_gray",
1431     "gate",
1432     "gray door (EM style, key 2)"
1433   },
1434   {
1435     "em_gate_3_gray",
1436     "gate",
1437     "gray door (EM style, key 3)"
1438   },
1439   {
1440     "em_gate_4_gray",
1441     "gate",
1442     "gray door (EM style, key 4)"
1443   },
1444   {
1445     "em_dynamite",
1446     "dynamite",
1447     "dynamite (EM style)"
1448   },
1449   {
1450     "em_dynamite.active",
1451     "dynamite",
1452     "burning dynamite (EM style)"
1453   },
1454   {
1455     "pearl",
1456     "pearl",
1457     "pearl"
1458   },
1459   {
1460     "crystal",
1461     "crystal",
1462     "crystal"
1463   },
1464   {
1465     "wall_pearl",
1466     "wall",
1467     "wall with pearl"
1468   },
1469   {
1470     "wall_crystal",
1471     "wall",
1472     "wall with crystal"
1473   },
1474   {
1475     "dc_gate_white",
1476     "gate",
1477     "white door"
1478   },
1479   {
1480     "dc_gate_white_gray",
1481     "gate",
1482     "gray door (opened by white key)"
1483   },
1484   {
1485     "dc_key_white",
1486     "key",
1487     "white key"
1488   },
1489   {
1490     "shield_normal",
1491     "shield_normal",
1492     "shield (normal)"
1493   },
1494   {
1495     "extra_time",
1496     "extra_time",
1497     "extra time"
1498   },
1499   {
1500     "switchgate_open",
1501     "switchgate",
1502     "switch gate (open)"
1503   },
1504   {
1505     "switchgate_closed",
1506     "switchgate",
1507     "switch gate (closed)"
1508   },
1509   {
1510     "switchgate_switch_up",
1511     "switchgate_switch",
1512     "switch for switch gate"
1513   },
1514   {
1515     "switchgate_switch_down",
1516     "switchgate_switch",
1517     "switch for switch gate"
1518   },
1519   {
1520     "unused_269",
1521     "unused",
1522     "-"
1523   },
1524   {
1525     "unused_270",
1526     "unused",
1527     "-"
1528   },
1529   {
1530     "conveyor_belt_1_left",
1531     "conveyor_belt",
1532     "conveyor belt 1 (left)"
1533   },
1534   {
1535     "conveyor_belt_1_middle",
1536     "conveyor_belt",
1537     "conveyor belt 1 (middle)"
1538   },
1539   {
1540     "conveyor_belt_1_right",
1541     "conveyor_belt",
1542     "conveyor belt 1 (right)"
1543   },
1544   {
1545     "conveyor_belt_1_switch_left",
1546     "conveyor_belt_switch",
1547     "switch for conveyor belt 1 (left)"
1548   },
1549   {
1550     "conveyor_belt_1_switch_middle",
1551     "conveyor_belt_switch",
1552     "switch for conveyor belt 1 (middle)"
1553   },
1554   {
1555     "conveyor_belt_1_switch_right",
1556     "conveyor_belt_switch",
1557     "switch for conveyor belt 1 (right)"
1558   },
1559   {
1560     "conveyor_belt_2_left",
1561     "conveyor_belt",
1562     "conveyor belt 2 (left)"
1563   },
1564   {
1565     "conveyor_belt_2_middle",
1566     "conveyor_belt",
1567     "conveyor belt 2 (middle)"
1568   },
1569   {
1570     "conveyor_belt_2_right",
1571     "conveyor_belt",
1572     "conveyor belt 2 (right)"
1573   },
1574   {
1575     "conveyor_belt_2_switch_left",
1576     "conveyor_belt_switch",
1577     "switch for conveyor belt 2 (left)"
1578   },
1579   {
1580     "conveyor_belt_2_switch_middle",
1581     "conveyor_belt_switch",
1582     "switch for conveyor belt 2 (middle)"
1583   },
1584   {
1585     "conveyor_belt_2_switch_right",
1586     "conveyor_belt_switch",
1587     "switch for conveyor belt 2 (right)"
1588   },
1589   {
1590     "conveyor_belt_3_left",
1591     "conveyor_belt",
1592     "conveyor belt 3 (left)"
1593   },
1594   {
1595     "conveyor_belt_3_middle",
1596     "conveyor_belt",
1597     "conveyor belt 3 (middle)"
1598   },
1599   {
1600     "conveyor_belt_3_right",
1601     "conveyor_belt",
1602     "conveyor belt 3 (right)"
1603   },
1604   {
1605     "conveyor_belt_3_switch_left",
1606     "conveyor_belt_switch",
1607     "switch for conveyor belt 3 (left)"
1608   },
1609   {
1610     "conveyor_belt_3_switch_middle",
1611     "conveyor_belt_switch",
1612     "switch for conveyor belt 3 (middle)"
1613   },
1614   {
1615     "conveyor_belt_3_switch_right",
1616     "conveyor_belt_switch",
1617     "switch for conveyor belt 3 (right)"
1618   },
1619   {
1620     "conveyor_belt_4_left",
1621     "conveyor_belt",
1622     "conveyor belt 4 (left)"
1623   },
1624   {
1625     "conveyor_belt_4_middle",
1626     "conveyor_belt",
1627     "conveyor belt 4 (middle)"
1628   },
1629   {
1630     "conveyor_belt_4_right",
1631     "conveyor_belt",
1632     "conveyor belt 4 (right)"
1633   },
1634   {
1635     "conveyor_belt_4_switch_left",
1636     "conveyor_belt_switch",
1637     "switch for conveyor belt 4 (left)"
1638   },
1639   {
1640     "conveyor_belt_4_switch_middle",
1641     "conveyor_belt_switch",
1642     "switch for conveyor belt 4 (middle)"
1643   },
1644   {
1645     "conveyor_belt_4_switch_right",
1646     "conveyor_belt_switch",
1647     "switch for conveyor belt 4 (right)"
1648   },
1649   {
1650     "landmine",
1651     "landmine",
1652     "land mine (not removable)"
1653   },
1654   {
1655     "envelope_obsolete",
1656     "obsolete",
1657     "envelope (OBSOLETE)"
1658   },
1659   {
1660     "light_switch",
1661     "light_switch",
1662     "light switch (off)"
1663   },
1664   {
1665     "light_switch.active",
1666     "light_switch",
1667     "light switch (on)"
1668   },
1669   {
1670     "sign_exclamation",
1671     "sign",
1672     "sign (exclamation)"
1673   },
1674   {
1675     "sign_radioactivity",
1676     "sign",
1677     "sign (radio activity)"
1678   },
1679   {
1680     "sign_stop",
1681     "sign",
1682     "sign (stop)"
1683   },
1684   {
1685     "sign_wheelchair",
1686     "sign",
1687     "sign (wheel chair)"
1688   },
1689   {
1690     "sign_parking",
1691     "sign",
1692     "sign (parking)"
1693   },
1694   {
1695     "sign_no_entry",
1696     "sign",
1697     "sign (no entry)"
1698   },
1699   {
1700     "sign_unused_1",
1701     "sign",
1702     "sign (unused)"
1703   },
1704   {
1705     "sign_give_way",
1706     "sign",
1707     "sign (give way)"
1708   },
1709   {
1710     "sign_entry_forbidden",
1711     "sign",
1712     "sign (entry forbidden)"
1713   },
1714   {
1715     "sign_emergency_exit",
1716     "sign",
1717     "sign (emergency exit)"
1718   },
1719   {
1720     "sign_yin_yang",
1721     "sign",
1722     "sign (yin yang)"
1723   },
1724   {
1725     "sign_unused_2",
1726     "sign",
1727     "sign (unused)"
1728   },
1729   {
1730     "mole.left",
1731     "mole",
1732     "mole (starts moving left)"
1733   },
1734   {
1735     "mole.right",
1736     "mole",
1737     "mole (starts moving right)"
1738   },
1739   {
1740     "mole.up",
1741     "mole",
1742     "mole (starts moving up)"
1743   },
1744   {
1745     "mole.down",
1746     "mole",
1747     "mole (starts moving down)"
1748   },
1749   {
1750     "steelwall_slippery",
1751     "steelwall",
1752     "slippery steel wall"
1753   },
1754   {
1755     "invisible_sand",
1756     "sand",
1757     "invisible sand"
1758   },
1759   {
1760     "dx_unknown_15",
1761     "unknown",
1762     "dx unknown element 15"
1763   },
1764   {
1765     "dx_unknown_42",
1766     "unknown",
1767     "dx unknown element 42"
1768   },
1769   {
1770     "unused_319",
1771     "unused",
1772     "(not used)"
1773   },
1774   {
1775     "unused_320",
1776     "unused",
1777     "(not used)"
1778   },
1779   {
1780     "shield_deadly",
1781     "shield_deadly",
1782     "shield (deadly, kills enemies)"
1783   },
1784   {
1785     "timegate_open",
1786     "timegate",
1787     "time gate (open)"
1788   },
1789   {
1790     "timegate_closed",
1791     "timegate",
1792     "time gate (closed)"
1793   },
1794   {
1795     "timegate_switch.active",
1796     "timegate_switch",
1797     "switch for time gate"
1798   },
1799   {
1800     "timegate_switch",
1801     "timegate_switch",
1802     "switch for time gate"
1803   },
1804   {
1805     "balloon",
1806     "balloon",
1807     "balloon"
1808   },
1809   {
1810     "balloon_switch_left",
1811     "balloon_switch",
1812     "wind switch (left)"
1813   },
1814   {
1815     "balloon_switch_right",
1816     "balloon_switch",
1817     "wind switch (right)"
1818   },
1819   {
1820     "balloon_switch_up",
1821     "balloon_switch",
1822     "wind switch (up)"
1823   },
1824   {
1825     "balloon_switch_down",
1826     "balloon_switch",
1827     "wind switch (down)"
1828   },
1829   {
1830     "balloon_switch_any",
1831     "balloon_switch",
1832     "wind switch (any direction)"
1833   },
1834   {
1835     "emc_steelwall_1",
1836     "steelwall",
1837     "steel wall"
1838   },
1839   {
1840     "emc_steelwall_2",
1841     "steelwall",
1842     "steel wall"
1843   },
1844   {
1845     "emc_steelwall_3",
1846     "steelwall",
1847     "steel wall"
1848   },
1849   {
1850     "emc_steelwall_4",
1851     "steelwall",
1852     "steel wall"
1853   },
1854   {
1855     "emc_wall_1",
1856     "wall",
1857     "normal wall"
1858   },
1859   {
1860     "emc_wall_2",
1861     "wall",
1862     "normal wall"
1863   },
1864   {
1865     "emc_wall_3",
1866     "wall",
1867     "normal wall"
1868   },
1869   {
1870     "emc_wall_4",
1871     "wall",
1872     "normal wall"
1873   },
1874   {
1875     "emc_wall_5",
1876     "wall",
1877     "normal wall"
1878   },
1879   {
1880     "emc_wall_6",
1881     "wall",
1882     "normal wall"
1883   },
1884   {
1885     "emc_wall_7",
1886     "wall",
1887     "normal wall"
1888   },
1889   {
1890     "emc_wall_8",
1891     "wall",
1892     "normal wall"
1893   },
1894   {
1895     "tube_any",
1896     "tube",
1897     "tube (any direction)"
1898   },
1899   {
1900     "tube_vertical",
1901     "tube",
1902     "tube (vertical)"
1903   },
1904   {
1905     "tube_horizontal",
1906     "tube",
1907     "tube (horizontal)"
1908   },
1909   {
1910     "tube_vertical_left",
1911     "tube",
1912     "tube (vertical & left)"
1913   },
1914   {
1915     "tube_vertical_right",
1916     "tube",
1917     "tube (vertical & right)"
1918   },
1919   {
1920     "tube_horizontal_up",
1921     "tube",
1922     "tube (horizontal & up)"
1923   },
1924   {
1925     "tube_horizontal_down",
1926     "tube",
1927     "tube (horizontal & down)"
1928   },
1929   {
1930     "tube_left_up",
1931     "tube",
1932     "tube (left & up)"
1933   },
1934   {
1935     "tube_left_down",
1936     "tube",
1937     "tube (left & down)"
1938   },
1939   {
1940     "tube_right_up",
1941     "tube",
1942     "tube (right & up)"
1943   },
1944   {
1945     "tube_right_down",
1946     "tube",
1947     "tube (right & down)"
1948   },
1949   {
1950     "spring",
1951     "spring",
1952     "spring"
1953   },
1954   {
1955     "trap",
1956     "trap",
1957     "trap"
1958   },
1959   {
1960     "dx_supabomb",
1961     "bomb",
1962     "stable bomb (DX style)"
1963   },
1964   {
1965     "unused_358",
1966     "unused",
1967     "-"
1968   },
1969   {
1970     "unused_359",
1971     "unused",
1972     "-"
1973   },
1974   {
1975     "custom_1",
1976     "custom",
1977     "custom element 1"
1978   },
1979   {
1980     "custom_2",
1981     "custom",
1982     "custom element 2"
1983   },
1984   {
1985     "custom_3",
1986     "custom",
1987     "custom element 3"
1988   },
1989   {
1990     "custom_4",
1991     "custom",
1992     "custom element 4"
1993   },
1994   {
1995     "custom_5",
1996     "custom",
1997     "custom element 5"
1998   },
1999   {
2000     "custom_6",
2001     "custom",
2002     "custom element 6"
2003   },
2004   {
2005     "custom_7",
2006     "custom",
2007     "custom element 7"
2008   },
2009   {
2010     "custom_8",
2011     "custom",
2012     "custom element 8"
2013   },
2014   {
2015     "custom_9",
2016     "custom",
2017     "custom element 9"
2018   },
2019   {
2020     "custom_10",
2021     "custom",
2022     "custom element 10"
2023   },
2024   {
2025     "custom_11",
2026     "custom",
2027     "custom element 11"
2028   },
2029   {
2030     "custom_12",
2031     "custom",
2032     "custom element 12"
2033   },
2034   {
2035     "custom_13",
2036     "custom",
2037     "custom element 13"
2038   },
2039   {
2040     "custom_14",
2041     "custom",
2042     "custom element 14"
2043   },
2044   {
2045     "custom_15",
2046     "custom",
2047     "custom element 15"
2048   },
2049   {
2050     "custom_16",
2051     "custom",
2052     "custom element 16"
2053   },
2054   {
2055     "custom_17",
2056     "custom",
2057     "custom element 17"
2058   },
2059   {
2060     "custom_18",
2061     "custom",
2062     "custom element 18"
2063   },
2064   {
2065     "custom_19",
2066     "custom",
2067     "custom element 19"
2068   },
2069   {
2070     "custom_20",
2071     "custom",
2072     "custom element 20"
2073   },
2074   {
2075     "custom_21",
2076     "custom",
2077     "custom element 21"
2078   },
2079   {
2080     "custom_22",
2081     "custom",
2082     "custom element 22"
2083   },
2084   {
2085     "custom_23",
2086     "custom",
2087     "custom element 23"
2088   },
2089   {
2090     "custom_24",
2091     "custom",
2092     "custom element 24"
2093   },
2094   {
2095     "custom_25",
2096     "custom",
2097     "custom element 25"
2098   },
2099   {
2100     "custom_26",
2101     "custom",
2102     "custom element 26"
2103   },
2104   {
2105     "custom_27",
2106     "custom",
2107     "custom element 27"
2108   },
2109   {
2110     "custom_28",
2111     "custom",
2112     "custom element 28"
2113   },
2114   {
2115     "custom_29",
2116     "custom",
2117     "custom element 29"
2118   },
2119   {
2120     "custom_30",
2121     "custom",
2122     "custom element 30"
2123   },
2124   {
2125     "custom_31",
2126     "custom",
2127     "custom element 31"
2128   },
2129   {
2130     "custom_32",
2131     "custom",
2132     "custom element 32"
2133   },
2134   {
2135     "custom_33",
2136     "custom",
2137     "custom element 33"
2138   },
2139   {
2140     "custom_34",
2141     "custom",
2142     "custom element 34"
2143   },
2144   {
2145     "custom_35",
2146     "custom",
2147     "custom element 35"
2148   },
2149   {
2150     "custom_36",
2151     "custom",
2152     "custom element 36"
2153   },
2154   {
2155     "custom_37",
2156     "custom",
2157     "custom element 37"
2158   },
2159   {
2160     "custom_38",
2161     "custom",
2162     "custom element 38"
2163   },
2164   {
2165     "custom_39",
2166     "custom",
2167     "custom element 39"
2168   },
2169   {
2170     "custom_40",
2171     "custom",
2172     "custom element 40"
2173   },
2174   {
2175     "custom_41",
2176     "custom",
2177     "custom element 41"
2178   },
2179   {
2180     "custom_42",
2181     "custom",
2182     "custom element 42"
2183   },
2184   {
2185     "custom_43",
2186     "custom",
2187     "custom element 43"
2188   },
2189   {
2190     "custom_44",
2191     "custom",
2192     "custom element 44"
2193   },
2194   {
2195     "custom_45",
2196     "custom",
2197     "custom element 45"
2198   },
2199   {
2200     "custom_46",
2201     "custom",
2202     "custom element 46"
2203   },
2204   {
2205     "custom_47",
2206     "custom",
2207     "custom element 47"
2208   },
2209   {
2210     "custom_48",
2211     "custom",
2212     "custom element 48"
2213   },
2214   {
2215     "custom_49",
2216     "custom",
2217     "custom element 49"
2218   },
2219   {
2220     "custom_50",
2221     "custom",
2222     "custom element 50"
2223   },
2224   {
2225     "custom_51",
2226     "custom",
2227     "custom element 51"
2228   },
2229   {
2230     "custom_52",
2231     "custom",
2232     "custom element 52"
2233   },
2234   {
2235     "custom_53",
2236     "custom",
2237     "custom element 53"
2238   },
2239   {
2240     "custom_54",
2241     "custom",
2242     "custom element 54"
2243   },
2244   {
2245     "custom_55",
2246     "custom",
2247     "custom element 55"
2248   },
2249   {
2250     "custom_56",
2251     "custom",
2252     "custom element 56"
2253   },
2254   {
2255     "custom_57",
2256     "custom",
2257     "custom element 57"
2258   },
2259   {
2260     "custom_58",
2261     "custom",
2262     "custom element 58"
2263   },
2264   {
2265     "custom_59",
2266     "custom",
2267     "custom element 59"
2268   },
2269   {
2270     "custom_60",
2271     "custom",
2272     "custom element 60"
2273   },
2274   {
2275     "custom_61",
2276     "custom",
2277     "custom element 61"
2278   },
2279   {
2280     "custom_62",
2281     "custom",
2282     "custom element 62"
2283   },
2284   {
2285     "custom_63",
2286     "custom",
2287     "custom element 63"
2288   },
2289   {
2290     "custom_64",
2291     "custom",
2292     "custom element 64"
2293   },
2294   {
2295     "custom_65",
2296     "custom",
2297     "custom element 65"
2298   },
2299   {
2300     "custom_66",
2301     "custom",
2302     "custom element 66"
2303   },
2304   {
2305     "custom_67",
2306     "custom",
2307     "custom element 67"
2308   },
2309   {
2310     "custom_68",
2311     "custom",
2312     "custom element 68"
2313   },
2314   {
2315     "custom_69",
2316     "custom",
2317     "custom element 69"
2318   },
2319   {
2320     "custom_70",
2321     "custom",
2322     "custom element 70"
2323   },
2324   {
2325     "custom_71",
2326     "custom",
2327     "custom element 71"
2328   },
2329   {
2330     "custom_72",
2331     "custom",
2332     "custom element 72"
2333   },
2334   {
2335     "custom_73",
2336     "custom",
2337     "custom element 73"
2338   },
2339   {
2340     "custom_74",
2341     "custom",
2342     "custom element 74"
2343   },
2344   {
2345     "custom_75",
2346     "custom",
2347     "custom element 75"
2348   },
2349   {
2350     "custom_76",
2351     "custom",
2352     "custom element 76"
2353   },
2354   {
2355     "custom_77",
2356     "custom",
2357     "custom element 77"
2358   },
2359   {
2360     "custom_78",
2361     "custom",
2362     "custom element 78"
2363   },
2364   {
2365     "custom_79",
2366     "custom",
2367     "custom element 79"
2368   },
2369   {
2370     "custom_80",
2371     "custom",
2372     "custom element 80"
2373   },
2374   {
2375     "custom_81",
2376     "custom",
2377     "custom element 81"
2378   },
2379   {
2380     "custom_82",
2381     "custom",
2382     "custom element 82"
2383   },
2384   {
2385     "custom_83",
2386     "custom",
2387     "custom element 83"
2388   },
2389   {
2390     "custom_84",
2391     "custom",
2392     "custom element 84"
2393   },
2394   {
2395     "custom_85",
2396     "custom",
2397     "custom element 85"
2398   },
2399   {
2400     "custom_86",
2401     "custom",
2402     "custom element 86"
2403   },
2404   {
2405     "custom_87",
2406     "custom",
2407     "custom element 87"
2408   },
2409   {
2410     "custom_88",
2411     "custom",
2412     "custom element 88"
2413   },
2414   {
2415     "custom_89",
2416     "custom",
2417     "custom element 89"
2418   },
2419   {
2420     "custom_90",
2421     "custom",
2422     "custom element 90"
2423   },
2424   {
2425     "custom_91",
2426     "custom",
2427     "custom element 91"
2428   },
2429   {
2430     "custom_92",
2431     "custom",
2432     "custom element 92"
2433   },
2434   {
2435     "custom_93",
2436     "custom",
2437     "custom element 93"
2438   },
2439   {
2440     "custom_94",
2441     "custom",
2442     "custom element 94"
2443   },
2444   {
2445     "custom_95",
2446     "custom",
2447     "custom element 95"
2448   },
2449   {
2450     "custom_96",
2451     "custom",
2452     "custom element 96"
2453   },
2454   {
2455     "custom_97",
2456     "custom",
2457     "custom element 97"
2458   },
2459   {
2460     "custom_98",
2461     "custom",
2462     "custom element 98"
2463   },
2464   {
2465     "custom_99",
2466     "custom",
2467     "custom element 99"
2468   },
2469   {
2470     "custom_100",
2471     "custom",
2472     "custom element 100"
2473   },
2474   {
2475     "custom_101",
2476     "custom",
2477     "custom element 101"
2478   },
2479   {
2480     "custom_102",
2481     "custom",
2482     "custom element 102"
2483   },
2484   {
2485     "custom_103",
2486     "custom",
2487     "custom element 103"
2488   },
2489   {
2490     "custom_104",
2491     "custom",
2492     "custom element 104"
2493   },
2494   {
2495     "custom_105",
2496     "custom",
2497     "custom element 105"
2498   },
2499   {
2500     "custom_106",
2501     "custom",
2502     "custom element 106"
2503   },
2504   {
2505     "custom_107",
2506     "custom",
2507     "custom element 107"
2508   },
2509   {
2510     "custom_108",
2511     "custom",
2512     "custom element 108"
2513   },
2514   {
2515     "custom_109",
2516     "custom",
2517     "custom element 109"
2518   },
2519   {
2520     "custom_110",
2521     "custom",
2522     "custom element 110"
2523   },
2524   {
2525     "custom_111",
2526     "custom",
2527     "custom element 111"
2528   },
2529   {
2530     "custom_112",
2531     "custom",
2532     "custom element 112"
2533   },
2534   {
2535     "custom_113",
2536     "custom",
2537     "custom element 113"
2538   },
2539   {
2540     "custom_114",
2541     "custom",
2542     "custom element 114"
2543   },
2544   {
2545     "custom_115",
2546     "custom",
2547     "custom element 115"
2548   },
2549   {
2550     "custom_116",
2551     "custom",
2552     "custom element 116"
2553   },
2554   {
2555     "custom_117",
2556     "custom",
2557     "custom element 117"
2558   },
2559   {
2560     "custom_118",
2561     "custom",
2562     "custom element 118"
2563   },
2564   {
2565     "custom_119",
2566     "custom",
2567     "custom element 119"
2568   },
2569   {
2570     "custom_120",
2571     "custom",
2572     "custom element 120"
2573   },
2574   {
2575     "custom_121",
2576     "custom",
2577     "custom element 121"
2578   },
2579   {
2580     "custom_122",
2581     "custom",
2582     "custom element 122"
2583   },
2584   {
2585     "custom_123",
2586     "custom",
2587     "custom element 123"
2588   },
2589   {
2590     "custom_124",
2591     "custom",
2592     "custom element 124"
2593   },
2594   {
2595     "custom_125",
2596     "custom",
2597     "custom element 125"
2598   },
2599   {
2600     "custom_126",
2601     "custom",
2602     "custom element 126"
2603   },
2604   {
2605     "custom_127",
2606     "custom",
2607     "custom element 127"
2608   },
2609   {
2610     "custom_128",
2611     "custom",
2612     "custom element 128"
2613   },
2614   {
2615     "custom_129",
2616     "custom",
2617     "custom element 129"
2618   },
2619   {
2620     "custom_130",
2621     "custom",
2622     "custom element 130"
2623   },
2624   {
2625     "custom_131",
2626     "custom",
2627     "custom element 131"
2628   },
2629   {
2630     "custom_132",
2631     "custom",
2632     "custom element 132"
2633   },
2634   {
2635     "custom_133",
2636     "custom",
2637     "custom element 133"
2638   },
2639   {
2640     "custom_134",
2641     "custom",
2642     "custom element 134"
2643   },
2644   {
2645     "custom_135",
2646     "custom",
2647     "custom element 135"
2648   },
2649   {
2650     "custom_136",
2651     "custom",
2652     "custom element 136"
2653   },
2654   {
2655     "custom_137",
2656     "custom",
2657     "custom element 137"
2658   },
2659   {
2660     "custom_138",
2661     "custom",
2662     "custom element 138"
2663   },
2664   {
2665     "custom_139",
2666     "custom",
2667     "custom element 139"
2668   },
2669   {
2670     "custom_140",
2671     "custom",
2672     "custom element 140"
2673   },
2674   {
2675     "custom_141",
2676     "custom",
2677     "custom element 141"
2678   },
2679   {
2680     "custom_142",
2681     "custom",
2682     "custom element 142"
2683   },
2684   {
2685     "custom_143",
2686     "custom",
2687     "custom element 143"
2688   },
2689   {
2690     "custom_144",
2691     "custom",
2692     "custom element 144"
2693   },
2694   {
2695     "custom_145",
2696     "custom",
2697     "custom element 145"
2698   },
2699   {
2700     "custom_146",
2701     "custom",
2702     "custom element 146"
2703   },
2704   {
2705     "custom_147",
2706     "custom",
2707     "custom element 147"
2708   },
2709   {
2710     "custom_148",
2711     "custom",
2712     "custom element 148"
2713   },
2714   {
2715     "custom_149",
2716     "custom",
2717     "custom element 149"
2718   },
2719   {
2720     "custom_150",
2721     "custom",
2722     "custom element 150"
2723   },
2724   {
2725     "custom_151",
2726     "custom",
2727     "custom element 151"
2728   },
2729   {
2730     "custom_152",
2731     "custom",
2732     "custom element 152"
2733   },
2734   {
2735     "custom_153",
2736     "custom",
2737     "custom element 153"
2738   },
2739   {
2740     "custom_154",
2741     "custom",
2742     "custom element 154"
2743   },
2744   {
2745     "custom_155",
2746     "custom",
2747     "custom element 155"
2748   },
2749   {
2750     "custom_156",
2751     "custom",
2752     "custom element 156"
2753   },
2754   {
2755     "custom_157",
2756     "custom",
2757     "custom element 157"
2758   },
2759   {
2760     "custom_158",
2761     "custom",
2762     "custom element 158"
2763   },
2764   {
2765     "custom_159",
2766     "custom",
2767     "custom element 159"
2768   },
2769   {
2770     "custom_160",
2771     "custom",
2772     "custom element 160"
2773   },
2774   {
2775     "custom_161",
2776     "custom",
2777     "custom element 161"
2778   },
2779   {
2780     "custom_162",
2781     "custom",
2782     "custom element 162"
2783   },
2784   {
2785     "custom_163",
2786     "custom",
2787     "custom element 163"
2788   },
2789   {
2790     "custom_164",
2791     "custom",
2792     "custom element 164"
2793   },
2794   {
2795     "custom_165",
2796     "custom",
2797     "custom element 165"
2798   },
2799   {
2800     "custom_166",
2801     "custom",
2802     "custom element 166"
2803   },
2804   {
2805     "custom_167",
2806     "custom",
2807     "custom element 167"
2808   },
2809   {
2810     "custom_168",
2811     "custom",
2812     "custom element 168"
2813   },
2814   {
2815     "custom_169",
2816     "custom",
2817     "custom element 169"
2818   },
2819   {
2820     "custom_170",
2821     "custom",
2822     "custom element 170"
2823   },
2824   {
2825     "custom_171",
2826     "custom",
2827     "custom element 171"
2828   },
2829   {
2830     "custom_172",
2831     "custom",
2832     "custom element 172"
2833   },
2834   {
2835     "custom_173",
2836     "custom",
2837     "custom element 173"
2838   },
2839   {
2840     "custom_174",
2841     "custom",
2842     "custom element 174"
2843   },
2844   {
2845     "custom_175",
2846     "custom",
2847     "custom element 175"
2848   },
2849   {
2850     "custom_176",
2851     "custom",
2852     "custom element 176"
2853   },
2854   {
2855     "custom_177",
2856     "custom",
2857     "custom element 177"
2858   },
2859   {
2860     "custom_178",
2861     "custom",
2862     "custom element 178"
2863   },
2864   {
2865     "custom_179",
2866     "custom",
2867     "custom element 179"
2868   },
2869   {
2870     "custom_180",
2871     "custom",
2872     "custom element 180"
2873   },
2874   {
2875     "custom_181",
2876     "custom",
2877     "custom element 181"
2878   },
2879   {
2880     "custom_182",
2881     "custom",
2882     "custom element 182"
2883   },
2884   {
2885     "custom_183",
2886     "custom",
2887     "custom element 183"
2888   },
2889   {
2890     "custom_184",
2891     "custom",
2892     "custom element 184"
2893   },
2894   {
2895     "custom_185",
2896     "custom",
2897     "custom element 185"
2898   },
2899   {
2900     "custom_186",
2901     "custom",
2902     "custom element 186"
2903   },
2904   {
2905     "custom_187",
2906     "custom",
2907     "custom element 187"
2908   },
2909   {
2910     "custom_188",
2911     "custom",
2912     "custom element 188"
2913   },
2914   {
2915     "custom_189",
2916     "custom",
2917     "custom element 189"
2918   },
2919   {
2920     "custom_190",
2921     "custom",
2922     "custom element 190"
2923   },
2924   {
2925     "custom_191",
2926     "custom",
2927     "custom element 191"
2928   },
2929   {
2930     "custom_192",
2931     "custom",
2932     "custom element 192"
2933   },
2934   {
2935     "custom_193",
2936     "custom",
2937     "custom element 193"
2938   },
2939   {
2940     "custom_194",
2941     "custom",
2942     "custom element 194"
2943   },
2944   {
2945     "custom_195",
2946     "custom",
2947     "custom element 195"
2948   },
2949   {
2950     "custom_196",
2951     "custom",
2952     "custom element 196"
2953   },
2954   {
2955     "custom_197",
2956     "custom",
2957     "custom element 197"
2958   },
2959   {
2960     "custom_198",
2961     "custom",
2962     "custom element 198"
2963   },
2964   {
2965     "custom_199",
2966     "custom",
2967     "custom element 199"
2968   },
2969   {
2970     "custom_200",
2971     "custom",
2972     "custom element 200"
2973   },
2974   {
2975     "custom_201",
2976     "custom",
2977     "custom element 201"
2978   },
2979   {
2980     "custom_202",
2981     "custom",
2982     "custom element 202"
2983   },
2984   {
2985     "custom_203",
2986     "custom",
2987     "custom element 203"
2988   },
2989   {
2990     "custom_204",
2991     "custom",
2992     "custom element 204"
2993   },
2994   {
2995     "custom_205",
2996     "custom",
2997     "custom element 205"
2998   },
2999   {
3000     "custom_206",
3001     "custom",
3002     "custom element 206"
3003   },
3004   {
3005     "custom_207",
3006     "custom",
3007     "custom element 207"
3008   },
3009   {
3010     "custom_208",
3011     "custom",
3012     "custom element 208"
3013   },
3014   {
3015     "custom_209",
3016     "custom",
3017     "custom element 209"
3018   },
3019   {
3020     "custom_210",
3021     "custom",
3022     "custom element 210"
3023   },
3024   {
3025     "custom_211",
3026     "custom",
3027     "custom element 211"
3028   },
3029   {
3030     "custom_212",
3031     "custom",
3032     "custom element 212"
3033   },
3034   {
3035     "custom_213",
3036     "custom",
3037     "custom element 213"
3038   },
3039   {
3040     "custom_214",
3041     "custom",
3042     "custom element 214"
3043   },
3044   {
3045     "custom_215",
3046     "custom",
3047     "custom element 215"
3048   },
3049   {
3050     "custom_216",
3051     "custom",
3052     "custom element 216"
3053   },
3054   {
3055     "custom_217",
3056     "custom",
3057     "custom element 217"
3058   },
3059   {
3060     "custom_218",
3061     "custom",
3062     "custom element 218"
3063   },
3064   {
3065     "custom_219",
3066     "custom",
3067     "custom element 219"
3068   },
3069   {
3070     "custom_220",
3071     "custom",
3072     "custom element 220"
3073   },
3074   {
3075     "custom_221",
3076     "custom",
3077     "custom element 221"
3078   },
3079   {
3080     "custom_222",
3081     "custom",
3082     "custom element 222"
3083   },
3084   {
3085     "custom_223",
3086     "custom",
3087     "custom element 223"
3088   },
3089   {
3090     "custom_224",
3091     "custom",
3092     "custom element 224"
3093   },
3094   {
3095     "custom_225",
3096     "custom",
3097     "custom element 225"
3098   },
3099   {
3100     "custom_226",
3101     "custom",
3102     "custom element 226"
3103   },
3104   {
3105     "custom_227",
3106     "custom",
3107     "custom element 227"
3108   },
3109   {
3110     "custom_228",
3111     "custom",
3112     "custom element 228"
3113   },
3114   {
3115     "custom_229",
3116     "custom",
3117     "custom element 229"
3118   },
3119   {
3120     "custom_230",
3121     "custom",
3122     "custom element 230"
3123   },
3124   {
3125     "custom_231",
3126     "custom",
3127     "custom element 231"
3128   },
3129   {
3130     "custom_232",
3131     "custom",
3132     "custom element 232"
3133   },
3134   {
3135     "custom_233",
3136     "custom",
3137     "custom element 233"
3138   },
3139   {
3140     "custom_234",
3141     "custom",
3142     "custom element 234"
3143   },
3144   {
3145     "custom_235",
3146     "custom",
3147     "custom element 235"
3148   },
3149   {
3150     "custom_236",
3151     "custom",
3152     "custom element 236"
3153   },
3154   {
3155     "custom_237",
3156     "custom",
3157     "custom element 237"
3158   },
3159   {
3160     "custom_238",
3161     "custom",
3162     "custom element 238"
3163   },
3164   {
3165     "custom_239",
3166     "custom",
3167     "custom element 239"
3168   },
3169   {
3170     "custom_240",
3171     "custom",
3172     "custom element 240"
3173   },
3174   {
3175     "custom_241",
3176     "custom",
3177     "custom element 241"
3178   },
3179   {
3180     "custom_242",
3181     "custom",
3182     "custom element 242"
3183   },
3184   {
3185     "custom_243",
3186     "custom",
3187     "custom element 243"
3188   },
3189   {
3190     "custom_244",
3191     "custom",
3192     "custom element 244"
3193   },
3194   {
3195     "custom_245",
3196     "custom",
3197     "custom element 245"
3198   },
3199   {
3200     "custom_246",
3201     "custom",
3202     "custom element 246"
3203   },
3204   {
3205     "custom_247",
3206     "custom",
3207     "custom element 247"
3208   },
3209   {
3210     "custom_248",
3211     "custom",
3212     "custom element 248"
3213   },
3214   {
3215     "custom_249",
3216     "custom",
3217     "custom element 249"
3218   },
3219   {
3220     "custom_250",
3221     "custom",
3222     "custom element 250"
3223   },
3224   {
3225     "custom_251",
3226     "custom",
3227     "custom element 251"
3228   },
3229   {
3230     "custom_252",
3231     "custom",
3232     "custom element 252"
3233   },
3234   {
3235     "custom_253",
3236     "custom",
3237     "custom element 253"
3238   },
3239   {
3240     "custom_254",
3241     "custom",
3242     "custom element 254"
3243   },
3244   {
3245     "custom_255",
3246     "custom",
3247     "custom element 255"
3248   },
3249   {
3250     "custom_256",
3251     "custom",
3252     "custom element 256"
3253   },
3254   {
3255     "em_key_1",
3256     "key",
3257     "key 1 (EM style)"
3258     },
3259   {
3260     "em_key_2",
3261     "key",
3262     "key 2 (EM style)"
3263     },
3264   {
3265     "em_key_3",
3266     "key",
3267     "key 3 (EM style)"
3268   },
3269   {
3270     "em_key_4",
3271     "key",
3272     "key 4 (EM style)"
3273   },
3274   {
3275     "envelope_1",
3276     "envelope",
3277     "mail envelope 1"
3278   },
3279   {
3280     "envelope_2",
3281     "envelope",
3282     "mail envelope 2"
3283   },
3284   {
3285     "envelope_3",
3286     "envelope",
3287     "mail envelope 3"
3288   },
3289   {
3290     "envelope_4",
3291     "envelope",
3292     "mail envelope 4"
3293   },
3294   {
3295     "group_1",
3296     "group",
3297     "group element 1"
3298   },
3299   {
3300     "group_2",
3301     "group",
3302     "group element 2"
3303   },
3304   {
3305     "group_3",
3306     "group",
3307     "group element 3"
3308   },
3309   {
3310     "group_4",
3311     "group",
3312     "group element 4"
3313   },
3314   {
3315     "group_5",
3316     "group",
3317     "group element 5"
3318   },
3319   {
3320     "group_6",
3321     "group",
3322     "group element 6"
3323   },
3324   {
3325     "group_7",
3326     "group",
3327     "group element 7"
3328   },
3329   {
3330     "group_8",
3331     "group",
3332     "group element 8"
3333   },
3334   {
3335     "group_9",
3336     "group",
3337     "group element 9"
3338   },
3339   {
3340     "group_10",
3341     "group",
3342     "group element 10"
3343   },
3344   {
3345     "group_11",
3346     "group",
3347     "group element 11"
3348   },
3349   {
3350     "group_12",
3351     "group",
3352     "group element 12"
3353   },
3354   {
3355     "group_13",
3356     "group",
3357     "group element 13"
3358   },
3359   {
3360     "group_14",
3361     "group",
3362     "group element 14"
3363   },
3364   {
3365     "group_15",
3366     "group",
3367     "group element 15"
3368   },
3369   {
3370     "group_16",
3371     "group",
3372     "group element 16"
3373   },
3374   {
3375     "group_17",
3376     "group",
3377     "group element 17"
3378   },
3379   {
3380     "group_18",
3381     "group",
3382     "group element 18"
3383   },
3384   {
3385     "group_19",
3386     "group",
3387     "group element 19"
3388   },
3389   {
3390     "group_20",
3391     "group",
3392     "group element 20"
3393   },
3394   {
3395     "group_21",
3396     "group",
3397     "group element 21"
3398   },
3399   {
3400     "group_22",
3401     "group",
3402     "group element 22"
3403   },
3404   {
3405     "group_23",
3406     "group",
3407     "group element 23"
3408   },
3409   {
3410     "group_24",
3411     "group",
3412     "group element 24"
3413   },
3414   {
3415     "group_25",
3416     "group",
3417     "group element 25"
3418   },
3419   {
3420     "group_26",
3421     "group",
3422     "group element 26"
3423   },
3424   {
3425     "group_27",
3426     "group",
3427     "group element 27"
3428   },
3429   {
3430     "group_28",
3431     "group",
3432     "group element 28"
3433   },
3434   {
3435     "group_29",
3436     "group",
3437     "group element 29"
3438   },
3439   {
3440     "group_30",
3441     "group",
3442     "group element 30"
3443   },
3444   {
3445     "group_31",
3446     "group",
3447     "group element 31"
3448   },
3449   {
3450     "group_32",
3451     "group",
3452     "group element 32"
3453   },
3454   {
3455     "unknown",
3456     "unknown",
3457     "unknown element"
3458   },
3459   {
3460     "trigger_element",
3461     "trigger",
3462     "element triggering change"
3463   },
3464   {
3465     "trigger_player",
3466     "trigger",
3467     "player triggering change"
3468   },
3469   {
3470     "sp_gravity_on_port_right",
3471     "sp_gravity_on_port",
3472     "gravity-on port (leading right)"
3473   },
3474   {
3475     "sp_gravity_on_port_down",
3476     "sp_gravity_on_port",
3477     "gravity-on port (leading down)"
3478   },
3479   {
3480     "sp_gravity_on_port_left",
3481     "sp_gravity_on_port",
3482     "gravity-on port (leading left)"
3483   },
3484   {
3485     "sp_gravity_on_port_up",
3486     "sp_gravity_on_port",
3487     "gravity-on port (leading up)"
3488   },
3489   {
3490     "sp_gravity_off_port_right",
3491     "sp_gravity_off_port",
3492     "gravity-off port (leading right)"
3493   },
3494   {
3495     "sp_gravity_off_port_down",
3496     "sp_gravity_off_port",
3497     "gravity-off port (leading down)"
3498   },
3499   {
3500     "sp_gravity_off_port_left",
3501     "sp_gravity_off_port",
3502     "gravity-off port (leading left)"
3503   },
3504   {
3505     "sp_gravity_off_port_up",
3506     "sp_gravity_off_port",
3507     "gravity-off port (leading up)"
3508   },
3509   {
3510     "balloon_switch_none",
3511     "balloon_switch",
3512     "wind switch (off)"
3513   },
3514   {
3515     "emc_gate_5",
3516     "gate",
3517     "door 5 (EMC style)",
3518   },
3519   {
3520     "emc_gate_6",
3521     "gate",
3522     "door 6 (EMC style)",
3523   },
3524   {
3525     "emc_gate_7",
3526     "gate",
3527     "door 7 (EMC style)",
3528   },
3529   {
3530     "emc_gate_8",
3531     "gate",
3532     "door 8 (EMC style)",
3533   },
3534   {
3535     "emc_gate_5_gray",
3536     "gate",
3537     "gray door (EMC style, key 5)",
3538   },
3539   {
3540     "emc_gate_6_gray",
3541     "gate",
3542     "gray door (EMC style, key 6)",
3543   },
3544   {
3545     "emc_gate_7_gray",
3546     "gate",
3547     "gray door (EMC style, key 7)",
3548   },
3549   {
3550     "emc_gate_8_gray",
3551     "gate",
3552     "gray door (EMC style, key 8)",
3553   },
3554   {
3555     "emc_key_5",
3556     "key",
3557     "key 5 (EMC style)",
3558   },
3559   {
3560     "emc_key_6",
3561     "key",
3562     "key 6 (EMC style)",
3563   },
3564   {
3565     "emc_key_7",
3566     "key",
3567     "key 7 (EMC style)",
3568   },
3569   {
3570     "emc_key_8",
3571     "key",
3572     "key 8 (EMC style)",
3573   },
3574   {
3575     "emc_android",
3576     "emc_android",
3577     "android",
3578   },
3579   {
3580     "emc_grass",
3581     "emc_grass",
3582     "grass",
3583   },
3584   {
3585     "emc_magic_ball",
3586     "emc_magic_ball",
3587     "magic ball",
3588   },
3589   {
3590     "emc_magic_ball.active",
3591     "emc_magic_ball",
3592     "magic ball (activated)",
3593   },
3594   {
3595     "emc_magic_ball_switch",
3596     "emc_magic_ball_switch",
3597     "magic ball switch (off)",
3598   },
3599   {
3600     "emc_magic_ball_switch.active",
3601     "emc_magic_ball_switch",
3602     "magic ball switch (on)",
3603   },
3604   {
3605     "emc_spring_bumper",
3606     "emc_spring_bumper",
3607     "spring bumper",
3608   },
3609   {
3610     "emc_plant",
3611     "emc_plant",
3612     "plant",
3613   },
3614   {
3615     "emc_lenses",
3616     "emc_lenses",
3617     "lenses",
3618   },
3619   {
3620     "emc_magnifier",
3621     "emc_magnifier",
3622     "magnifier",
3623   },
3624   {
3625     "emc_wall_9",
3626     "wall",
3627     "normal wall"
3628   },
3629   {
3630     "emc_wall_10",
3631     "wall",
3632     "normal wall"
3633   },
3634   {
3635     "emc_wall_11",
3636     "wall",
3637     "normal wall"
3638   },
3639   {
3640     "emc_wall_12",
3641     "wall",
3642     "normal wall"
3643   },
3644   {
3645     "emc_wall_13",
3646     "wall",
3647     "normal wall"
3648   },
3649   {
3650     "emc_wall_14",
3651     "wall",
3652     "normal wall"
3653   },
3654   {
3655     "emc_wall_15",
3656     "wall",
3657     "normal wall"
3658   },
3659   {
3660     "emc_wall_16",
3661     "wall",
3662     "normal wall"
3663   },
3664   {
3665     "emc_wall_slippery_1",
3666     "wall",
3667     "slippery wall"
3668   },
3669   {
3670     "emc_wall_slippery_2",
3671     "wall",
3672     "slippery wall"
3673   },
3674   {
3675     "emc_wall_slippery_3",
3676     "wall",
3677     "slippery wall"
3678   },
3679   {
3680     "emc_wall_slippery_4",
3681     "wall",
3682     "slippery wall"
3683   },
3684   {
3685     "emc_fake_grass",
3686     "fake_grass",
3687     "fake grass"
3688   },
3689   {
3690     "emc_fake_acid",
3691     "fake_acid",
3692     "fake acid"
3693   },
3694   {
3695     "emc_dripper",
3696     "dripper",
3697     "dripper"
3698   },
3699   {
3700     "trigger_ce_value",
3701     "trigger",
3702     "CE value of element triggering change"
3703   },
3704   {
3705     "trigger_ce_score",
3706     "trigger",
3707     "CE score of element triggering change"
3708   },
3709   {
3710     "current_ce_value",
3711     "current",
3712     "CE value of current element"
3713   },
3714   {
3715     "current_ce_score",
3716     "current",
3717     "CE score of current element"
3718   },
3719   {
3720     "yamyam.left",
3721     "yamyam",
3722     "yam yam (starts moving left)"
3723   },
3724   {
3725     "yamyam.right",
3726     "yamyam",
3727     "yam yam (starts moving right)"
3728   },
3729   {
3730     "yamyam.up",
3731     "yamyam",
3732     "yam yam (starts moving up)"
3733   },
3734   {
3735     "yamyam.down",
3736     "yamyam",
3737     "yam yam (starts moving down)"
3738   },
3739   {
3740     "bd_expandable_wall",
3741     "wall",
3742     "growing wall (horizontal, BD style)"
3743   },
3744   {
3745     "prev_ce_8",
3746     "prev_ce",
3747     "CE 8 positions earlier in list"
3748   },
3749   {
3750     "prev_ce_7",
3751     "prev_ce",
3752     "CE 7 positions earlier in list"
3753   },
3754   {
3755     "prev_ce_6",
3756     "prev_ce",
3757     "CE 6 positions earlier in list"
3758   },
3759   {
3760     "prev_ce_5",
3761     "prev_ce",
3762     "CE 5 positions earlier in list"
3763   },
3764   {
3765     "prev_ce_4",
3766     "prev_ce",
3767     "CE 4 positions earlier in list"
3768   },
3769   {
3770     "prev_ce_3",
3771     "prev_ce",
3772     "CE 3 positions earlier in list"
3773   },
3774   {
3775     "prev_ce_2",
3776     "prev_ce",
3777     "CE 2 positions earlier in list"
3778   },
3779   {
3780     "prev_ce_1",
3781     "prev_ce",
3782     "CE 1 position earlier in list"
3783   },
3784   {
3785     "self",
3786     "self",
3787     "the current custom element"
3788   },
3789   {
3790     "next_ce_1",
3791     "next_ce",
3792     "CE 1 position later in list"
3793   },
3794   {
3795     "next_ce_2",
3796     "next_ce",
3797     "CE 2 positions later in list"
3798   },
3799   {
3800     "next_ce_3",
3801     "next_ce",
3802     "CE 3 positions later in list"
3803   },
3804   {
3805     "next_ce_4",
3806     "next_ce",
3807     "CE 4 positions later in list"
3808   },
3809   {
3810     "next_ce_5",
3811     "next_ce",
3812     "CE 5 positions later in list"
3813   },
3814   {
3815     "next_ce_6",
3816     "next_ce",
3817     "CE 6 positions later in list"
3818   },
3819   {
3820     "next_ce_7",
3821     "next_ce",
3822     "CE 7 positions later in list"
3823   },
3824   {
3825     "next_ce_8",
3826     "next_ce",
3827     "CE 8 positions later in list"
3828   },
3829   {
3830     "any_element",
3831     "any_element",
3832     "this element matches any element"
3833   },
3834   {
3835     "steel_char_space",
3836     "steel_char",
3837     "steel letter ' '"
3838   },
3839   {
3840     "steel_char_exclam",
3841     "steel_char",
3842     "steel letter '!'"
3843   },
3844   {
3845     "steel_char_quotedbl",
3846     "steel_char",
3847     "steel letter '\"'"
3848   },
3849   {
3850     "steel_char_numbersign",
3851     "steel_char",
3852     "steel letter '#'"
3853   },
3854   {
3855     "steel_char_dollar",
3856     "steel_char",
3857     "steel letter '$'"
3858   },
3859   {
3860     "steel_char_percent",
3861     "steel_char",
3862     "steel letter '%'"
3863   },
3864   {
3865     "steel_char_ampersand",
3866     "steel_char",
3867     "steel letter '&'"
3868   },
3869   {
3870     "steel_char_apostrophe",
3871     "steel_char",
3872     "steel letter '''"
3873   },
3874   {
3875     "steel_char_parenleft",
3876     "steel_char",
3877     "steel letter '('"
3878   },
3879   {
3880     "steel_char_parenright",
3881     "steel_char",
3882     "steel letter ')'"
3883   },
3884   {
3885     "steel_char_asterisk",
3886     "steel_char",
3887     "steel letter '*'"
3888   },
3889   {
3890     "steel_char_plus",
3891     "steel_char",
3892     "steel letter '+'"
3893   },
3894   {
3895     "steel_char_comma",
3896     "steel_char",
3897     "steel letter ','"
3898   },
3899   {
3900     "steel_char_minus",
3901     "steel_char",
3902     "steel letter '-'"
3903   },
3904   {
3905     "steel_char_period",
3906     "steel_char",
3907     "steel letter '.'"
3908   },
3909   {
3910     "steel_char_slash",
3911     "steel_char",
3912     "steel letter '/'"
3913   },
3914   {
3915     "steel_char_0",
3916     "steel_char",
3917     "steel letter '0'"
3918   },
3919   {
3920     "steel_char_1",
3921     "steel_char",
3922     "steel letter '1'"
3923   },
3924   {
3925     "steel_char_2",
3926     "steel_char",
3927     "steel letter '2'"
3928   },
3929   {
3930     "steel_char_3",
3931     "steel_char",
3932     "steel letter '3'"
3933   },
3934   {
3935     "steel_char_4",
3936     "steel_char",
3937     "steel letter '4'"
3938   },
3939   {
3940     "steel_char_5",
3941     "steel_char",
3942     "steel letter '5'"
3943   },
3944   {
3945     "steel_char_6",
3946     "steel_char",
3947     "steel letter '6'"
3948   },
3949   {
3950     "steel_char_7",
3951     "steel_char",
3952     "steel letter '7'"
3953   },
3954   {
3955     "steel_char_8",
3956     "steel_char",
3957     "steel letter '8'"
3958   },
3959   {
3960     "steel_char_9",
3961     "steel_char",
3962     "steel letter '9'"
3963   },
3964   {
3965     "steel_char_colon",
3966     "steel_char",
3967     "steel letter ':'"
3968   },
3969   {
3970     "steel_char_semicolon",
3971     "steel_char",
3972     "steel letter ';'"
3973   },
3974   {
3975     "steel_char_less",
3976     "steel_char",
3977     "steel letter '<'"
3978   },
3979   {
3980     "steel_char_equal",
3981     "steel_char",
3982     "steel letter '='"
3983   },
3984   {
3985     "steel_char_greater",
3986     "steel_char",
3987     "steel letter '>'"
3988   },
3989   {
3990     "steel_char_question",
3991     "steel_char",
3992     "steel letter '?'"
3993   },
3994   {
3995     "steel_char_at",
3996     "steel_char",
3997     "steel letter '@'"
3998   },
3999   {
4000     "steel_char_a",
4001     "steel_char",
4002     "steel letter 'A'"
4003   },
4004   {
4005     "steel_char_b",
4006     "steel_char",
4007     "steel letter 'B'"
4008   },
4009   {
4010     "steel_char_c",
4011     "steel_char",
4012     "steel letter 'C'"
4013   },
4014   {
4015     "steel_char_d",
4016     "steel_char",
4017     "steel letter 'D'"
4018   },
4019   {
4020     "steel_char_e",
4021     "steel_char",
4022     "steel letter 'E'"
4023   },
4024   {
4025     "steel_char_f",
4026     "steel_char",
4027     "steel letter 'F'"
4028   },
4029   {
4030     "steel_char_g",
4031     "steel_char",
4032     "steel letter 'G'"
4033   },
4034   {
4035     "steel_char_h",
4036     "steel_char",
4037     "steel letter 'H'"
4038   },
4039   {
4040     "steel_char_i",
4041     "steel_char",
4042     "steel letter 'I'"
4043   },
4044   {
4045     "steel_char_j",
4046     "steel_char",
4047     "steel letter 'J'"
4048   },
4049   {
4050     "steel_char_k",
4051     "steel_char",
4052     "steel letter 'K'"
4053   },
4054   {
4055     "steel_char_l",
4056     "steel_char",
4057     "steel letter 'L'"
4058   },
4059   {
4060     "steel_char_m",
4061     "steel_char",
4062     "steel letter 'M'"
4063   },
4064   {
4065     "steel_char_n",
4066     "steel_char",
4067     "steel letter 'N'"
4068   },
4069   {
4070     "steel_char_o",
4071     "steel_char",
4072     "steel letter 'O'"
4073   },
4074   {
4075     "steel_char_p",
4076     "steel_char",
4077     "steel letter 'P'"
4078   },
4079   {
4080     "steel_char_q",
4081     "steel_char",
4082     "steel letter 'Q'"
4083   },
4084   {
4085     "steel_char_r",
4086     "steel_char",
4087     "steel letter 'R'"
4088   },
4089   {
4090     "steel_char_s",
4091     "steel_char",
4092     "steel letter 'S'"
4093   },
4094   {
4095     "steel_char_t",
4096     "steel_char",
4097     "steel letter 'T'"
4098   },
4099   {
4100     "steel_char_u",
4101     "steel_char",
4102     "steel letter 'U'"
4103   },
4104   {
4105     "steel_char_v",
4106     "steel_char",
4107     "steel letter 'V'"
4108   },
4109   {
4110     "steel_char_w",
4111     "steel_char",
4112     "steel letter 'W'"
4113   },
4114   {
4115     "steel_char_x",
4116     "steel_char",
4117     "steel letter 'X'"
4118   },
4119   {
4120     "steel_char_y",
4121     "steel_char",
4122     "steel letter 'Y'"
4123   },
4124   {
4125     "steel_char_z",
4126     "steel_char",
4127     "steel letter 'Z'"
4128   },
4129   {
4130     "steel_char_bracketleft",
4131     "steel_char",
4132     "steel letter '['"
4133   },
4134   {
4135     "steel_char_backslash",
4136     "steel_char",
4137     "steel letter '\\'"
4138   },
4139   {
4140     "steel_char_bracketright",
4141     "steel_char",
4142     "steel letter ']'"
4143   },
4144   {
4145     "steel_char_asciicircum",
4146     "steel_char",
4147     "steel letter '^'"
4148   },
4149   {
4150     "steel_char_underscore",
4151     "steel_char",
4152     "steel letter '_'"
4153   },
4154   {
4155     "steel_char_copyright",
4156     "steel_char",
4157     "steel letter '©'"
4158   },
4159   {
4160     "steel_char_aumlaut",
4161     "steel_char",
4162     "steel letter 'Ä'"
4163   },
4164   {
4165     "steel_char_oumlaut",
4166     "steel_char",
4167     "steel letter 'Ö'"
4168   },
4169   {
4170     "steel_char_uumlaut",
4171     "steel_char",
4172     "steel letter 'Ãœ'"
4173   },
4174   {
4175     "steel_char_degree",
4176     "steel_char",
4177     "steel letter '°'"
4178   },
4179   {
4180     "steel_char_trademark",
4181     "steel_char",
4182     "steel letter '®'"
4183   },
4184   {
4185     "steel_char_cursor",
4186     "steel_char",
4187     "steel letter ' '"
4188   },
4189   {
4190     "steel_char_unused",
4191     "steel_char",
4192     "steel letter ''"
4193   },
4194   {
4195     "steel_char_unused",
4196     "steel_char",
4197     "steel letter ''"
4198   },
4199   {
4200     "steel_char_unused",
4201     "steel_char",
4202     "steel letter ''"
4203   },
4204   {
4205     "steel_char_unused",
4206     "steel_char",
4207     "steel letter ''"
4208   },
4209   {
4210     "steel_char_unused",
4211     "steel_char",
4212     "steel letter ''"
4213   },
4214   {
4215     "steel_char_unused",
4216     "steel_char",
4217     "steel letter ''"
4218   },
4219   {
4220     "steel_char_unused",
4221     "steel_char",
4222     "steel letter 'button'"
4223   },
4224   {
4225     "steel_char_unused",
4226     "steel_char",
4227     "steel letter 'up'"
4228   },
4229   {
4230     "steel_char_unused",
4231     "steel_char",
4232     "steel letter 'down'"
4233   },
4234   {
4235     "sperms",
4236     "frankie",
4237     "sperms"
4238   },
4239   {
4240     "bullet",
4241     "frankie",
4242     "bullet"
4243   },
4244   {
4245     "heart",
4246     "frankie",
4247     "heart"
4248   },
4249   {
4250     "cross",
4251     "frankie",
4252     "cross"
4253   },
4254   {
4255     "frankie",
4256     "frankie",
4257     "frankie"
4258   },
4259   {
4260     "sign_sperms",
4261     "sign",
4262     "sign (sperms)"
4263   },
4264   {
4265     "sign_bullet",
4266     "sign",
4267     "sign (bullet)"
4268   },
4269   {
4270     "sign_heart",
4271     "sign",
4272     "sign (heart)"
4273   },
4274   {
4275     "sign_cross",
4276     "sign",
4277     "sign (cross)"
4278   },
4279   {
4280     "sign_frankie",
4281     "sign",
4282     "sign (frankie)"
4283   },
4284   {
4285     "steel_exit_closed",
4286     "steel_exit",
4287     "closed steel exit"
4288   },
4289   {
4290     "steel_exit_open",
4291     "steel_exit",
4292     "open steel exit"
4293   },
4294   {
4295     "dc_steelwall_1_left",
4296     "steelwall",
4297     "steel wall (left)"
4298   },
4299   {
4300     "dc_steelwall_1_right",
4301     "steelwall",
4302     "steel wall (right)"
4303   },
4304   {
4305     "dc_steelwall_1_top",
4306     "steelwall",
4307     "steel wall (top)"
4308   },
4309   {
4310     "dc_steelwall_1_bottom",
4311     "steelwall",
4312     "steel wall (bottom)"
4313   },
4314   {
4315     "dc_steelwall_1_horizontal",
4316     "steelwall",
4317     "steel wall (top/bottom)"
4318   },
4319   {
4320     "dc_steelwall_1_vertical",
4321     "steelwall",
4322     "steel wall (left/right)"
4323   },
4324   {
4325     "dc_steelwall_1_topleft",
4326     "steelwall",
4327     "steel wall (top/left)"
4328   },
4329   {
4330     "dc_steelwall_1_topright",
4331     "steelwall",
4332     "steel wall (top/right)"
4333   },
4334   {
4335     "dc_steelwall_1_bottomleft",
4336     "steelwall",
4337     "steel wall (bottom/left)"
4338   },
4339   {
4340     "dc_steelwall_1_bottomright",
4341     "steelwall",
4342     "steel wall (bottom/right)"
4343   },
4344   {
4345     "dc_steelwall_1_topleft_2",
4346     "steelwall",
4347     "steel wall (top/left corner)"
4348   },
4349   {
4350     "dc_steelwall_1_topright_2",
4351     "steelwall",
4352     "steel wall (top/right corner)"
4353   },
4354   {
4355     "dc_steelwall_1_bottomleft_2",
4356     "steelwall",
4357     "steel wall (bottom/left corner)"
4358   },
4359   {
4360     "dc_steelwall_1_bottomright_2",
4361     "steelwall",
4362     "steel wall (bottom/right corner)"
4363   },
4364   {
4365     "dc_steelwall_2_left",
4366     "steelwall",
4367     "steel wall (left)"
4368   },
4369   {
4370     "dc_steelwall_2_right",
4371     "steelwall",
4372     "steel wall (right)"
4373   },
4374   {
4375     "dc_steelwall_2_top",
4376     "steelwall",
4377     "steel wall (top)"
4378   },
4379   {
4380     "dc_steelwall_2_bottom",
4381     "steelwall",
4382     "steel wall (bottom)"
4383   },
4384   {
4385     "dc_steelwall_2_horizontal",
4386     "steelwall",
4387     "steel wall (horizontal)"
4388   },
4389   {
4390     "dc_steelwall_2_vertical",
4391     "steelwall",
4392     "steel wall (vertical)"
4393   },
4394   {
4395     "dc_steelwall_2_middle",
4396     "steelwall",
4397     "steel wall (middle)"
4398   },
4399   {
4400     "dc_steelwall_2_single",
4401     "steelwall",
4402     "steel wall (single)"
4403   },
4404   {
4405     "dc_switchgate_switch_up",
4406     "switchgate_switch",
4407     "switch for switch gate (steel)"
4408   },
4409   {
4410     "dc_switchgate_switch_down",
4411     "switchgate_switch",
4412     "switch for switch gate (steel)"
4413   },
4414   {
4415     "dc_timegate_switch",
4416     "timegate_switch",
4417     "switch for time gate (steel)"
4418   },
4419   {
4420     "dc_timegate_switch.active",
4421     "timegate_switch",
4422     "switch for time gate (steel)"
4423   },
4424   {
4425     "dc_landmine",
4426     "dc_landmine",
4427     "land mine (DC style, removable)"
4428   },
4429   {
4430     "expandable_steelwall",
4431     "steelwall",
4432     "growing steel wall"
4433   },
4434   {
4435     "expandable_steelwall_horizontal",
4436     "steelwall",
4437     "growing steel wall (horizontal)"
4438   },
4439   {
4440     "expandable_steelwall_vertical",
4441     "steelwall",
4442     "growing steel wall (vertical)"
4443   },
4444   {
4445     "expandable_steelwall_any",
4446     "steelwall",
4447     "growing steel wall (any direction)"
4448   },
4449   {
4450     "em_exit_closed",
4451     "em_exit",
4452     "closed exit (EM style)"
4453   },
4454   {
4455     "em_exit_open",
4456     "em_exit",
4457     "open exit (EM style)"
4458   },
4459   {
4460     "em_steel_exit_closed",
4461     "em_steel_exit",
4462     "closed steel exit (EM style)"
4463   },
4464   {
4465     "em_steel_exit_open",
4466     "em_steel_exit",
4467     "open steel exit (EM style)"
4468   },
4469   {
4470     "dc_gate_fake_gray",
4471     "gate",
4472     "gray door (opened by no key)"
4473   },
4474   {
4475     "dc_magic_wall",
4476     "dc_magic_wall",
4477     "magic wall (DC style)"
4478   },
4479   {
4480     "quicksand_fast_empty",
4481     "quicksand",
4482     "fast quicksand (empty)"
4483   },
4484   {
4485     "quicksand_fast_full",
4486     "quicksand",
4487     "fast quicksand (with rock)"
4488   },
4489   {
4490     "from_level_template",
4491     "from_level_template",
4492     "element taken from level template"
4493   },
4494
4495   /* ----------------------------------------------------------------------- */
4496   /* "real" (and therefore drawable) runtime elements                        */
4497   /* ----------------------------------------------------------------------- */
4498
4499   {
4500     "dynabomb_player_1.active",
4501     "dynabomb",
4502     "-"
4503   },
4504   {
4505     "dynabomb_player_2.active",
4506     "dynabomb",
4507     "-"
4508   },
4509   {
4510     "dynabomb_player_3.active",
4511     "dynabomb",
4512     "-"
4513   },
4514   {
4515     "dynabomb_player_4.active",
4516     "dynabomb",
4517     "-"
4518   },
4519   {
4520     "sp_disk_red.active",
4521     "dynamite",
4522     "-"
4523   },
4524   {
4525     "switchgate.opening",
4526     "switchgate",
4527     "-"
4528   },
4529   {
4530     "switchgate.closing",
4531     "switchgate",
4532     "-"
4533   },
4534   {
4535     "timegate.opening",
4536     "timegate",
4537     "-"
4538   },
4539   {
4540     "timegate.closing",
4541     "timegate",
4542     "-"
4543   },
4544   {
4545     "pearl.breaking",
4546     "pearl",
4547     "-"
4548   },
4549   {
4550     "trap.active",
4551     "trap",
4552     "-"
4553   },
4554   {
4555     "invisible_steelwall.active",
4556     "steelwall",
4557     "-"
4558   },
4559   {
4560     "invisible_wall.active",
4561     "wall",
4562     "-"
4563   },
4564   {
4565     "invisible_sand.active",
4566     "sand",
4567     "-"
4568   },
4569   {
4570     "conveyor_belt_1_left.active",
4571     "conveyor_belt",
4572     "-"
4573   },
4574   {
4575     "conveyor_belt_1_middle.active",
4576     "conveyor_belt",
4577     "-"
4578   },
4579   {
4580     "conveyor_belt_1_right.active",
4581     "conveyor_belt",
4582     "-"
4583   },
4584   {
4585     "conveyor_belt_2_left.active",
4586     "conveyor_belt",
4587     "-"
4588   },
4589   {
4590     "conveyor_belt_2_middle.active",
4591     "conveyor_belt",
4592     "-"
4593   },
4594   {
4595     "conveyor_belt_2_right.active",
4596     "conveyor_belt",
4597     "-"
4598   },
4599   {
4600     "conveyor_belt_3_left.active",
4601     "conveyor_belt",
4602     "-"
4603   },
4604   {
4605     "conveyor_belt_3_middle.active",
4606     "conveyor_belt",
4607     "-"
4608   },
4609   {
4610     "conveyor_belt_3_right.active",
4611     "conveyor_belt",
4612     "-"
4613   },
4614   {
4615     "conveyor_belt_4_left.active",
4616     "conveyor_belt",
4617     "-"
4618   },
4619   {
4620     "conveyor_belt_4_middle.active",
4621     "conveyor_belt",
4622     "-"
4623   },
4624   {
4625     "conveyor_belt_4_right.active",
4626     "conveyor_belt",
4627     "-"
4628   },
4629   {
4630     "exit.opening",
4631     "exit",
4632     "-"
4633   },
4634   {
4635     "exit.closing",
4636     "exit",
4637     "-"
4638   },
4639   {
4640     "steel_exit.opening",
4641     "steel_exit",
4642     "-"
4643   },
4644   {
4645     "steel_exit.closing",
4646     "steel_exit",
4647     "-"
4648   },
4649   {
4650     "em_exit.opening",
4651     "em_exit",
4652     "-"
4653   },
4654   {
4655     "em_exit.closing",
4656     "em_exit",
4657     "-"
4658   },
4659   {
4660     "em_steel_exit.opening",
4661     "em_steel_exit",
4662     "-"
4663   },
4664   {
4665     "em_steel_exit.closing",
4666     "em_steel_exit",
4667     "-"
4668   },
4669   {
4670     "sp_exit.opening",
4671     "sp_exit",
4672     "-"
4673   },
4674   {
4675     "sp_exit.closing",
4676     "sp_exit",
4677     "-"
4678   },
4679   {
4680     "sp_exit_open",
4681     "sp_exit",
4682     "-"
4683   },
4684   {
4685     "sp_terminal.active",
4686     "sp_terminal",
4687     "-"
4688   },
4689   {
4690     "sp_buggy_base.activating",
4691     "sp_buggy_base",
4692     "-"
4693   },
4694   {
4695     "sp_buggy_base.active",
4696     "sp_buggy_base",
4697     "-"
4698   },
4699   {
4700     "sp_murphy_clone",
4701     "murphy_clone",
4702     "-"
4703   },
4704   {
4705     "amoeba.dropping",
4706     "amoeba",
4707     "-"
4708   },
4709   {
4710     "quicksand.emptying",
4711     "quicksand",
4712     "-"
4713   },
4714   {
4715     "quicksand_fast.emptying",
4716     "quicksand",
4717     "-"
4718   },
4719   {
4720     "magic_wall.active",
4721     "magic_wall",
4722     "-"
4723   },
4724   {
4725     "bd_magic_wall.active",
4726     "magic_wall",
4727     "-"
4728   },
4729   {
4730     "dc_magic_wall.active",
4731     "magic_wall",
4732     "-"
4733   },
4734   {
4735     "magic_wall_full",
4736     "magic_wall",
4737     "-"
4738   },
4739   {
4740     "bd_magic_wall_full",
4741     "magic_wall",
4742     "-"
4743   },
4744   {
4745     "dc_magic_wall_full",
4746     "magic_wall",
4747     "-"
4748   },
4749   {
4750     "magic_wall.emptying",
4751     "magic_wall",
4752     "-"
4753   },
4754   {
4755     "bd_magic_wall.emptying",
4756     "magic_wall",
4757     "-"
4758   },
4759   {
4760     "dc_magic_wall.emptying",
4761     "magic_wall",
4762     "-"
4763   },
4764   {
4765     "magic_wall_dead",
4766     "magic_wall",
4767     "-"
4768   },
4769   {
4770     "bd_magic_wall_dead",
4771     "magic_wall",
4772     "-"
4773   },
4774   {
4775     "dc_magic_wall_dead",
4776     "magic_wall",
4777     "-"
4778   },
4779
4780   {
4781     "emc_fake_grass.active",
4782     "fake_grass",
4783     "-"
4784   },
4785   {
4786     "gate_1_gray.active",
4787     "gate",
4788     ""
4789   },
4790   {
4791     "gate_2_gray.active",
4792     "gate",
4793     ""
4794   },
4795   {
4796     "gate_3_gray.active",
4797     "gate",
4798     ""
4799   },
4800   {
4801     "gate_4_gray.active",
4802     "gate",
4803     ""
4804   },
4805   {
4806     "em_gate_1_gray.active",
4807     "gate",
4808     ""
4809   },
4810   {
4811     "em_gate_2_gray.active",
4812     "gate",
4813     ""
4814   },
4815   {
4816     "em_gate_3_gray.active",
4817     "gate",
4818     ""
4819   },
4820   {
4821     "em_gate_4_gray.active",
4822     "gate",
4823     ""
4824   },
4825   {
4826     "emc_gate_5_gray.active",
4827     "gate",
4828     "",
4829   },
4830   {
4831     "emc_gate_6_gray.active",
4832     "gate",
4833     "",
4834   },
4835   {
4836     "emc_gate_7_gray.active",
4837     "gate",
4838     "",
4839   },
4840   {
4841     "emc_gate_8_gray.active",
4842     "gate",
4843     "",
4844   },
4845   {
4846     "dc_gate_white_gray.active",
4847     "gate",
4848     "",
4849   },
4850   {
4851     "emc_dripper.active",
4852     "dripper",
4853     "dripper"
4854   },
4855   {
4856     "emc_spring_bumper.active",
4857     "emc_spring_bumper",
4858     "spring bumper",
4859   },
4860
4861   /* ----------------------------------------------------------------------- */
4862   /* "unreal" (and therefore not drawable) runtime elements                  */
4863   /* ----------------------------------------------------------------------- */
4864
4865   {
4866     "blocked",
4867     "-",
4868     "-"
4869   },
4870   {
4871     "explosion",
4872     "-",
4873     "-"
4874   },
4875   {
4876     "nut.breaking",
4877     "-",
4878     "-"
4879   },
4880   {
4881     "diamond.breaking",
4882     "-",
4883     "-"
4884   },
4885   {
4886     "acid_splash_left",
4887     "-",
4888     "-"
4889   },
4890   {
4891     "acid_splash_right",
4892     "-",
4893     "-"
4894   },
4895   {
4896     "amoeba.growing",
4897     "-",
4898     "-"
4899   },
4900   {
4901     "amoeba.shrinking",
4902     "-",
4903     "-"
4904   },
4905   {
4906     "expandable_wall.growing",
4907     "-",
4908     "-"
4909   },
4910   {
4911     "expandable_steelwall.growing",
4912     "-",
4913     "-"
4914   },
4915   {
4916     "flames",
4917     "-",
4918     "-"
4919   },
4920   {
4921     "player_is_leaving",
4922     "-",
4923     "-"
4924   },
4925   {
4926     "player_is_exploding_1",
4927     "-",
4928     "-"
4929   },
4930   {
4931     "player_is_exploding_2",
4932     "-",
4933     "-"
4934   },
4935   {
4936     "player_is_exploding_3",
4937     "-",
4938     "-"
4939   },
4940   {
4941     "player_is_exploding_4",
4942     "-",
4943     "-"
4944   },
4945   {
4946     "quicksand.filling",
4947     "quicksand",
4948     "-"
4949   },
4950   {
4951     "quicksand_fast.filling",
4952     "quicksand",
4953     "-"
4954   },
4955   {
4956     "magic_wall.filling",
4957     "-",
4958     "-"
4959   },
4960   {
4961     "bd_magic_wall.filling",
4962     "-",
4963     "-"
4964   },
4965   {
4966     "dc_magic_wall.filling",
4967     "-",
4968     "-"
4969   },
4970   {
4971     "element.snapping",
4972     "-",
4973     "-"
4974   },
4975   {
4976     "diagonal.shrinking",
4977     "-",
4978     "-"
4979   },
4980   {
4981     "diagonal.growing",
4982     "-",
4983     "-"
4984   },
4985
4986   /* ----------------------------------------------------------------------- */
4987   /* dummy elements (never used as game elements, only used as graphics)     */
4988   /* ----------------------------------------------------------------------- */
4989
4990   {
4991     "steelwall_topleft",
4992     "-",
4993     "-"
4994   },
4995   {
4996     "steelwall_topright",
4997     "-",
4998     "-"
4999   },
5000   {
5001     "steelwall_bottomleft",
5002     "-",
5003     "-"
5004   },
5005   {
5006     "steelwall_bottomright",
5007     "-",
5008     "-"
5009   },
5010   {
5011     "steelwall_horizontal",
5012     "-",
5013     "-"
5014   },
5015   {
5016     "steelwall_vertical",
5017     "-",
5018     "-"
5019   },
5020   {
5021     "invisible_steelwall_topleft",
5022     "-",
5023     "-"
5024   },
5025   {
5026     "invisible_steelwall_topright",
5027     "-",
5028     "-"
5029   },
5030   {
5031     "invisible_steelwall_bottomleft",
5032     "-",
5033     "-"
5034   },
5035   {
5036     "invisible_steelwall_bottomright",
5037     "-",
5038     "-"
5039   },
5040   {
5041     "invisible_steelwall_horizontal",
5042     "-",
5043     "-"
5044   },
5045   {
5046     "invisible_steelwall_vertical",
5047     "-",
5048     "-"
5049   },
5050   {
5051     "dynabomb",
5052     "-",
5053     "-"
5054   },
5055   {
5056     "dynabomb.active",
5057     "-",
5058     "-"
5059   },
5060   {
5061     "dynabomb_player_1",
5062     "-",
5063     "-"
5064   },
5065   {
5066     "dynabomb_player_2",
5067     "-",
5068     "-"
5069   },
5070   {
5071     "dynabomb_player_3",
5072     "-",
5073     "-"
5074   },
5075   {
5076     "dynabomb_player_4",
5077     "-",
5078     "-"
5079   },
5080   {
5081     "shield_normal.active",
5082     "-",
5083     "-"
5084   },
5085   {
5086     "shield_deadly.active",
5087     "-",
5088     "-"
5089   },
5090   {
5091     "amoeba",
5092     "amoeba",
5093     "-"
5094   },
5095   {
5096     "[default]",
5097     "default",
5098     "-"
5099   },
5100   {
5101     "[bd_default]",
5102     "bd_default",
5103     "-"
5104   },
5105   {
5106     "[sp_default]",
5107     "sp_default",
5108     "-"
5109   },
5110   {
5111     "[sb_default]",
5112     "sb_default",
5113     "-"
5114   },
5115   {
5116     "graphic_1",
5117     "graphic",
5118     "-"
5119   },
5120   {
5121     "graphic_2",
5122     "graphic",
5123     "-"
5124   },
5125   {
5126     "graphic_3",
5127     "graphic",
5128     "-"
5129   },
5130   {
5131     "graphic_4",
5132     "graphic",
5133     "-"
5134   },
5135   {
5136     "graphic_5",
5137     "graphic",
5138     "-"
5139   },
5140   {
5141     "graphic_6",
5142     "graphic",
5143     "-"
5144   },
5145   {
5146     "graphic_7",
5147     "graphic",
5148     "-"
5149   },
5150   {
5151     "graphic_8",
5152     "graphic",
5153     "-"
5154   },
5155   {
5156     "internal_clipboard_custom",
5157     "internal",
5158     "empty custom element"
5159   },
5160   {
5161     "internal_clipboard_change",
5162     "internal",
5163     "empty change page"
5164   },
5165   {
5166     "internal_clipboard_group",
5167     "internal",
5168     "empty group element"
5169   },
5170   {
5171     "internal_dummy",
5172     "internal",
5173     "-"
5174   },
5175   {
5176     "internal_cascade_bd",
5177     "internal",
5178     "show Boulder Dash elements"
5179   },
5180   {
5181     "internal_cascade_bd.active",
5182     "internal",
5183     "hide Boulder Dash elements"
5184   },
5185   {
5186     "internal_cascade_em",
5187     "internal",
5188     "show Emerald Mine elements"
5189   },
5190   {
5191     "internal_cascade_em.active",
5192     "internal",
5193     "hide Emerald Mine elements"
5194   },
5195   {
5196     "internal_cascade_emc",
5197     "internal",
5198     "show Emerald Mine Club elements"
5199   },
5200   {
5201     "internal_cascade_emc.active",
5202     "internal",
5203     "hide Emerald Mine Club elements"
5204   },
5205   {
5206     "internal_cascade_rnd",
5207     "internal",
5208     "show Rocks'n'Diamonds elements"
5209   },
5210   {
5211     "internal_cascade_rnd.active",
5212     "internal",
5213     "hide Rocks'n'Diamonds elements"
5214   },
5215   {
5216     "internal_cascade_sb",
5217     "internal",
5218     "show Sokoban elements"
5219   },
5220   {
5221     "internal_cascade_sb.active",
5222     "internal",
5223     "hide Sokoban elements"
5224   },
5225   {
5226     "internal_cascade_sp",
5227     "internal",
5228     "show Supaplex elements"
5229   },
5230   {
5231     "internal_cascade_sp.active",
5232     "internal",
5233     "hide Supaplex elements"
5234   },
5235   {
5236     "internal_cascade_dc",
5237     "internal",
5238     "show Diamond Caves II elements"
5239   },
5240   {
5241     "internal_cascade_dc.active",
5242     "internal",
5243     "hide Diamond Caves II elements"
5244   },
5245   {
5246     "internal_cascade_dx",
5247     "internal",
5248     "show DX Boulderdash elements"
5249   },
5250   {
5251     "internal_cascade_dx.active",
5252     "internal",
5253     "hide DX Boulderdash elements"
5254   },
5255   {
5256     "internal_cascade_chars",
5257     "internal",
5258     "show text elements"
5259   },
5260   {
5261     "internal_cascade_chars.active",
5262     "internal",
5263     "hide text elements"
5264   },
5265   {
5266     "internal_cascade_steel_chars",
5267     "internal",
5268     "show steel text elements"
5269   },
5270   {
5271     "internal_cascade_steel_chars.active",
5272     "internal",
5273     "hide steel text elements"
5274   },
5275   {
5276     "internal_cascade_ce",
5277     "internal",
5278     "show custom elements"
5279   },
5280   {
5281     "internal_cascade_ce.active",
5282     "internal",
5283     "hide custom elements"
5284   },
5285   {
5286     "internal_cascade_ge",
5287     "internal",
5288     "show group elements"
5289   },
5290   {
5291     "internal_cascade_ge.active",
5292     "internal",
5293     "hide group elements"
5294   },
5295   {
5296     "internal_cascade_ref",
5297     "internal",
5298     "show reference elements"
5299   },
5300   {
5301     "internal_cascade_ref.active",
5302     "internal",
5303     "hide reference elements"
5304   },
5305   {
5306     "internal_cascade_user",
5307     "internal",
5308     "show user defined elements"
5309   },
5310   {
5311     "internal_cascade_user.active",
5312     "internal",
5313     "hide user defined elements"
5314   },
5315   {
5316     "internal_cascade_dynamic",
5317     "internal",
5318     "show elements used in this level"
5319   },
5320   {
5321     "internal_cascade_dynamic.active",
5322     "internal",
5323     "hide elements used in this level"
5324   },
5325
5326   /* keyword to stop parser: "ELEMENT_INFO_END" <-- do not change! */
5327
5328   {
5329     NULL,
5330     NULL,
5331     NULL
5332   }
5333 };
5334
5335
5336 /* ------------------------------------------------------------------------- */
5337 /* element action and direction definitions                                  */
5338 /* ------------------------------------------------------------------------- */
5339
5340 struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] =
5341 {
5342   { ".[DEFAULT]",               ACTION_DEFAULT,                 TRUE    },
5343   { ".waiting",                 ACTION_WAITING,                 TRUE    },
5344   { ".falling",                 ACTION_FALLING,                 TRUE    },
5345   { ".moving",                  ACTION_MOVING,                  TRUE    },
5346   { ".digging",                 ACTION_DIGGING,                 FALSE   },
5347   { ".snapping",                ACTION_SNAPPING,                FALSE   },
5348   { ".collecting",              ACTION_COLLECTING,              FALSE   },
5349   { ".dropping",                ACTION_DROPPING,                FALSE   },
5350   { ".pushing",                 ACTION_PUSHING,                 FALSE   },
5351   { ".walking",                 ACTION_WALKING,                 FALSE   },
5352   { ".passing",                 ACTION_PASSING,                 FALSE   },
5353   { ".impact",                  ACTION_IMPACT,                  FALSE   },
5354   { ".breaking",                ACTION_BREAKING,                FALSE   },
5355   { ".activating",              ACTION_ACTIVATING,              FALSE   },
5356   { ".deactivating",            ACTION_DEACTIVATING,            FALSE   },
5357   { ".opening",                 ACTION_OPENING,                 FALSE   },
5358   { ".closing",                 ACTION_CLOSING,                 FALSE   },
5359   { ".attacking",               ACTION_ATTACKING,               TRUE    },
5360   { ".growing",                 ACTION_GROWING,                 TRUE    },
5361   { ".shrinking",               ACTION_SHRINKING,               FALSE   },
5362   { ".active",                  ACTION_ACTIVE,                  TRUE    },
5363   { ".filling",                 ACTION_FILLING,                 FALSE   },
5364   { ".emptying",                ACTION_EMPTYING,                FALSE   },
5365   { ".changing",                ACTION_CHANGING,                FALSE   },
5366   { ".exploding",               ACTION_EXPLODING,               FALSE   },
5367   { ".boring",                  ACTION_BORING,                  FALSE   },
5368   { ".boring[1]",               ACTION_BORING_1,                FALSE   },
5369   { ".boring[2]",               ACTION_BORING_2,                FALSE   },
5370   { ".boring[3]",               ACTION_BORING_3,                FALSE   },
5371   { ".boring[4]",               ACTION_BORING_4,                FALSE   },
5372   { ".boring[5]",               ACTION_BORING_5,                FALSE   },
5373   { ".boring[6]",               ACTION_BORING_6,                FALSE   },
5374   { ".boring[7]",               ACTION_BORING_7,                FALSE   },
5375   { ".boring[8]",               ACTION_BORING_8,                FALSE   },
5376   { ".boring[9]",               ACTION_BORING_9,                FALSE   },
5377   { ".boring[10]",              ACTION_BORING_10,               FALSE   },
5378   { ".sleeping",                ACTION_SLEEPING,                FALSE   },
5379   { ".sleeping[1]",             ACTION_SLEEPING_1,              FALSE   },
5380   { ".sleeping[2]",             ACTION_SLEEPING_2,              FALSE   },
5381   { ".sleeping[3]",             ACTION_SLEEPING_3,              FALSE   },
5382   { ".awakening",               ACTION_AWAKENING,               FALSE   },
5383   { ".dying",                   ACTION_DYING,                   FALSE   },
5384   { ".turning",                 ACTION_TURNING,                 FALSE   },
5385   { ".turning_from_left",       ACTION_TURNING_FROM_LEFT,       FALSE   },
5386   { ".turning_from_right",      ACTION_TURNING_FROM_RIGHT,      FALSE   },
5387   { ".turning_from_up",         ACTION_TURNING_FROM_UP,         FALSE   },
5388   { ".turning_from_down",       ACTION_TURNING_FROM_DOWN,       FALSE   },
5389   { ".smashed_by_rock",         ACTION_SMASHED_BY_ROCK,         FALSE   },
5390   { ".smashed_by_spring",       ACTION_SMASHED_BY_SPRING,       FALSE   },
5391   { ".eating",                  ACTION_EATING,                  FALSE   },
5392   { ".twinkling",               ACTION_TWINKLING,               FALSE   },
5393   { ".splashing",               ACTION_SPLASHING,               FALSE   },
5394   { ".page[1]",                 ACTION_PAGE_1,                  FALSE   },
5395   { ".page[2]",                 ACTION_PAGE_2,                  FALSE   },
5396   { ".page[3]",                 ACTION_PAGE_3,                  FALSE   },
5397   { ".page[4]",                 ACTION_PAGE_4,                  FALSE   },
5398   { ".page[5]",                 ACTION_PAGE_5,                  FALSE   },
5399   { ".page[6]",                 ACTION_PAGE_6,                  FALSE   },
5400   { ".page[7]",                 ACTION_PAGE_7,                  FALSE   },
5401   { ".page[8]",                 ACTION_PAGE_8,                  FALSE   },
5402   { ".page[9]",                 ACTION_PAGE_9,                  FALSE   },
5403   { ".page[10]",                ACTION_PAGE_10,                 FALSE   },
5404   { ".page[11]",                ACTION_PAGE_11,                 FALSE   },
5405   { ".page[12]",                ACTION_PAGE_12,                 FALSE   },
5406   { ".page[13]",                ACTION_PAGE_13,                 FALSE   },
5407   { ".page[14]",                ACTION_PAGE_14,                 FALSE   },
5408   { ".page[15]",                ACTION_PAGE_15,                 FALSE   },
5409   { ".page[16]",                ACTION_PAGE_16,                 FALSE   },
5410   { ".page[17]",                ACTION_PAGE_17,                 FALSE   },
5411   { ".page[18]",                ACTION_PAGE_18,                 FALSE   },
5412   { ".page[19]",                ACTION_PAGE_19,                 FALSE   },
5413   { ".page[20]",                ACTION_PAGE_20,                 FALSE   },
5414   { ".page[21]",                ACTION_PAGE_21,                 FALSE   },
5415   { ".page[22]",                ACTION_PAGE_22,                 FALSE   },
5416   { ".page[23]",                ACTION_PAGE_23,                 FALSE   },
5417   { ".page[24]",                ACTION_PAGE_24,                 FALSE   },
5418   { ".page[25]",                ACTION_PAGE_25,                 FALSE   },
5419   { ".page[26]",                ACTION_PAGE_26,                 FALSE   },
5420   { ".page[27]",                ACTION_PAGE_27,                 FALSE   },
5421   { ".page[28]",                ACTION_PAGE_28,                 FALSE   },
5422   { ".page[29]",                ACTION_PAGE_29,                 FALSE   },
5423   { ".page[30]",                ACTION_PAGE_30,                 FALSE   },
5424   { ".page[31]",                ACTION_PAGE_31,                 FALSE   },
5425   { ".page[32]",                ACTION_PAGE_32,                 FALSE   },
5426   { ".other",                   ACTION_OTHER,                   FALSE   },
5427
5428   /* empty suffix always matches -- check as last entry in InitSoundInfo() */
5429   { "",                         ACTION_DEFAULT,                 TRUE    },
5430
5431   { NULL,                       0,                              0       }
5432 };
5433
5434 struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS_FULL + 1] =
5435 {
5436   { ".left",                    MV_BIT_LEFT                             },
5437   { ".right",                   MV_BIT_RIGHT                            },
5438   { ".up",                      MV_BIT_UP                               },
5439   { ".down",                    MV_BIT_DOWN                             },
5440   { ".upleft",                  MV_BIT_UP                               },
5441   { ".upright",                 MV_BIT_RIGHT                            },
5442   { ".downleft",                MV_BIT_LEFT                             },
5443   { ".downright",               MV_BIT_DOWN                             },
5444
5445   { NULL,                       0                                       }
5446 };
5447
5448 struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1 + 1] =
5449 {
5450   { ".[DEFAULT]",               GFX_SPECIAL_ARG_DEFAULT,                },
5451   { ".LOADING",                 GFX_SPECIAL_ARG_LOADING,                },
5452   { ".TITLE_INITIAL",           GFX_SPECIAL_ARG_TITLE_INITIAL,          },
5453   { ".TITLE",                   GFX_SPECIAL_ARG_TITLE,                  },
5454   { ".MAIN",                    GFX_SPECIAL_ARG_MAIN,                   },
5455   { ".LEVELS",                  GFX_SPECIAL_ARG_LEVELS                  },
5456   { ".LEVELNR",                 GFX_SPECIAL_ARG_LEVELNR                 },
5457   { ".SCORES",                  GFX_SPECIAL_ARG_SCORES,                 },
5458   { ".EDITOR",                  GFX_SPECIAL_ARG_EDITOR,                 },
5459   { ".INFO",                    GFX_SPECIAL_ARG_INFO,                   },
5460   { ".SETUP",                   GFX_SPECIAL_ARG_SETUP,                  },
5461   { ".PLAYING",                 GFX_SPECIAL_ARG_PLAYING,                },
5462   { ".DOOR",                    GFX_SPECIAL_ARG_DOOR,                   },
5463   { ".TAPE",                    GFX_SPECIAL_ARG_TAPE,                   },
5464   { ".PANEL",                   GFX_SPECIAL_ARG_PANEL,                  },
5465   { ".PREVIEW",                 GFX_SPECIAL_ARG_PREVIEW,                },
5466   { ".CRUMBLED",                GFX_SPECIAL_ARG_CRUMBLED,               },
5467
5468   /* empty suffix always matches -- check as last entry in InitMusicInfo() */
5469   { "",                         GFX_SPECIAL_ARG_DEFAULT,                },
5470
5471   { NULL,                       0,                                      }
5472 };
5473
5474 #include "conf_var.c"   /* include auto-generated data structure definitions */
5475
5476
5477 /* ------------------------------------------------------------------------- */
5478 /* font definitions                                                          */
5479 /* ------------------------------------------------------------------------- */
5480
5481 /* Important: When one entry is a prefix of another entry, the longer entry
5482    must come first, because the dynamic configuration does prefix matching!
5483    (These definitions must match the corresponding definitions in "main.h"!) */
5484
5485 struct FontInfo font_info[NUM_FONTS + 1] =
5486 {
5487   { "font.initial_1"            },
5488   { "font.initial_2"            },
5489   { "font.initial_3"            },
5490   { "font.initial_4"            },
5491   { "font.title_1"              },
5492   { "font.title_2"              },
5493   { "font.menu_1.active"        },
5494   { "font.menu_2.active"        },
5495   { "font.menu_1"               },
5496   { "font.menu_2"               },
5497   { "font.text_1.active"        },
5498   { "font.text_2.active"        },
5499   { "font.text_3.active"        },
5500   { "font.text_4.active"        },
5501   { "font.text_1"               },
5502   { "font.text_2"               },
5503   { "font.text_3"               },
5504   { "font.text_4"               },
5505   { "font.envelope_1"           },
5506   { "font.envelope_2"           },
5507   { "font.envelope_3"           },
5508   { "font.envelope_4"           },
5509   { "font.request"              },
5510   { "font.input_1.active"       },
5511   { "font.input_2.active"       },
5512   { "font.input_1"              },
5513   { "font.input_2"              },
5514   { "font.option_off"           },
5515   { "font.option_on"            },
5516   { "font.value_1"              },
5517   { "font.value_2"              },
5518   { "font.value_old"            },
5519   { "font.level_number.active"  },
5520   { "font.level_number"         },
5521   { "font.tape_recorder"        },
5522   { "font.game_info"            },
5523   { "font.info.elements"        },
5524   { "font.info.levelset"        },
5525
5526   { NULL                        }
5527 };
5528
5529
5530 /* ------------------------------------------------------------------------- */
5531 /* music token prefix definitions                                            */
5532 /* ------------------------------------------------------------------------- */
5533
5534 struct MusicPrefixInfo music_prefix_info[NUM_MUSIC_PREFIXES + 1] =
5535 {
5536   { "background",               TRUE    },
5537
5538   { NULL,                       0       }
5539 };
5540
5541
5542 /* ========================================================================= */
5543 /* main()                                                                    */
5544 /* ========================================================================= */
5545
5546 static void print_usage()
5547 {
5548   printf("\n"
5549          "Usage: %s [OPTION]... [HOSTNAME [PORT]]\n"
5550          "\n"
5551          "Options:\n"
5552          "  -d, --display HOSTNAME[:SCREEN]  specify X server display\n"
5553          "  -b, --basepath DIRECTORY         alternative base DIRECTORY\n"
5554          "  -l, --level DIRECTORY            alternative level DIRECTORY\n"
5555          "  -g, --graphics DIRECTORY         alternative graphics DIRECTORY\n"
5556          "  -s, --sounds DIRECTORY           alternative sounds DIRECTORY\n"
5557          "  -m, --music DIRECTORY            alternative music DIRECTORY\n"
5558          "  -n, --network                    network multiplayer game\n"
5559          "      --serveronly                 only start network server\n"
5560          "  -v, --verbose                    verbose mode\n"
5561          "  -V, --version                    show program version\n"
5562          "      --debug                      display debugging information\n"
5563          "      --debug-x11-sync             enable X11 synchronous mode\n"
5564          "  -e, --execute COMMAND            execute batch COMMAND\n"
5565          "\n"
5566          "Valid commands for '--execute' option:\n"
5567          "  \"print graphicsinfo.conf\"        print default graphics config\n"
5568          "  \"print soundsinfo.conf\"          print default sounds config\n"
5569          "  \"print musicinfo.conf\"           print default music config\n"
5570          "  \"print editorsetup.conf\"         print default editor config\n"
5571          "  \"print helpanim.conf\"            print default helpanim config\n"
5572          "  \"print helptext.conf\"            print default helptext config\n"
5573          "  \"dump level FILE\"                dump level data from FILE\n"
5574          "  \"dump tape FILE\"                 dump tape data from FILE\n"
5575          "  \"autoplay LEVELDIR [NR ...]\"     play level tapes for LEVELDIR\n"
5576          "  \"convert LEVELDIR [NR]\"          convert levels in LEVELDIR\n"
5577          "  \"create images DIRECTORY\"        write BMP images to DIRECTORY\n"
5578          "\n",
5579          program.command_basename);
5580 }
5581
5582 static void print_version()
5583 {
5584   printf("%s %d.%d.%d.%d\n",
5585          PROGRAM_TITLE_STRING,
5586          PROGRAM_VERSION_MAJOR,
5587          PROGRAM_VERSION_MINOR,
5588          PROGRAM_VERSION_PATCH,
5589          PROGRAM_VERSION_BUILD);
5590
5591   if (options.debug)
5592   {
5593     SDL_version sdl_version;
5594
5595     SDL_VERSION(&sdl_version);
5596     printf("- SDL %d.%d.%d\n",
5597            sdl_version.major,
5598            sdl_version.minor,
5599            sdl_version.patch);
5600
5601     SDL_IMAGE_VERSION(&sdl_version);
5602     printf("- SDL_image %d.%d.%d\n",
5603            sdl_version.major,
5604            sdl_version.minor,
5605            sdl_version.patch);
5606
5607     SDL_MIXER_VERSION(&sdl_version);
5608     printf("- SDL_mixer %d.%d.%d\n",
5609            sdl_version.major,
5610            sdl_version.minor,
5611            sdl_version.patch);
5612
5613     SDL_NET_VERSION(&sdl_version);
5614     printf("- SDL_net %d.%d.%d\n",
5615            sdl_version.major,
5616            sdl_version.minor,
5617            sdl_version.patch);
5618   }
5619 }
5620
5621 int main(int argc, char *argv[])
5622 {
5623   InitProgramInfo(argv[0], USERDATA_DIRECTORY, USERDATA_DIRECTORY_UNIX,
5624                   PROGRAM_TITLE_STRING, ICON_TITLE_STRING, SDL_ICON_FILENAME,
5625                   COOKIE_PREFIX, GAME_VERSION_ACTUAL);
5626
5627   InitWindowTitleFunction(getWindowTitleString);
5628   InitExitMessageFunction(DisplayExitMessage);
5629   InitExitFunction(CloseAllAndExit);
5630   InitPlatformDependentStuff();
5631
5632   GetOptions(argv, print_usage, print_version);
5633   OpenAll();
5634
5635   EventLoop();
5636   CloseAllAndExit(0);
5637
5638   return 0;     /* to keep compilers happy */
5639 }