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