added optional button to restart game (door, panel and touch variants)
[rocksndiamonds.git] / src / main.c
1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
5 //                  Holger Schemel
6 //                  info@artsoft.org
7 //                  https://www.artsoft.org/
8 // ----------------------------------------------------------------------------
9 // main.c
10 // ============================================================================
11
12 #include "libgame/libgame.h"
13
14 #include "main.h"
15 #include "init.h"
16 #include "game.h"
17 #include "tape.h"
18 #include "tools.h"
19 #include "files.h"
20 #include "events.h"
21 #include "config.h"
22
23 Bitmap                 *bitmap_db_field;
24 Bitmap                 *bitmap_db_door_1;
25 Bitmap                 *bitmap_db_door_2;
26 Bitmap                 *bitmap_db_store_1;
27 Bitmap                 *bitmap_db_store_2;
28 DrawBuffer             *fieldbuffer;
29 DrawBuffer             *drawto_field;
30
31 int                     game_status = -1;
32 int                     game_status_last_screen = -1;
33 boolean                 level_editor_test_game = FALSE;
34 boolean                 score_info_tape_play = FALSE;
35 boolean                 network_playing = FALSE;
36
37 int                     key_joystick_mapping = 0;
38
39 short                   Tile[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
40 short                   Last[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
41 short                   MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
42 short                   MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
43 short                   MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
44 short                   ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
45 short                   ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
46 short                   CustomValue[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
47 short                   Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
48 short                   Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
49 short                   StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
50 short                   Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
51 boolean                 Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
52 boolean                 Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
53 short                   ChangeCount[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
54 short                   ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
55 short                   WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
56 short                   WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
57 short                   CheckCollision[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
58 short                   CheckImpact[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
59 short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
60 short                   AmoebaCnt[MAX_NUM_AMOEBA];
61 short                   AmoebaCnt2[MAX_NUM_AMOEBA];
62 short                   ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
63 short                   ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
64 short                   ExplodeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
65 int                     RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
66 int                     PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
67
68 int                     GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
69 int                     GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
70 int                     GfxRandomStatic[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
71 int                     GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
72 int                     GfxElementEmpty[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
73 int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
74 int                     GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
75 int                     GfxRedraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
76
77 int                     ActiveElement[MAX_NUM_ELEMENTS];
78 int                     ActiveButton[NUM_IMAGE_FILES];
79 int                     ActiveFont[NUM_FONTS];
80
81 int                     lev_fieldx, lev_fieldy;
82 int                     scroll_x, scroll_y;
83
84 int                     WIN_XSIZE = WIN_XSIZE_DEFAULT;
85 int                     WIN_YSIZE = WIN_YSIZE_DEFAULT;
86
87 int                     SCR_FIELDX = SCR_FIELDX_DEFAULT;
88 int                     SCR_FIELDY = SCR_FIELDY_DEFAULT;
89
90 int                     REAL_SX = 6, REAL_SY = 6;
91 int                     SX = 8, SY = 8;
92 int                     DX = 566, DY = 60;
93 int                     VX = 566, VY = 400;
94 int                     EX = 566, EY = 356;
95 int                     dDX, dDY;
96
97 int                     FULL_SXSIZE = 2 + SXSIZE_DEFAULT + 2;
98 int                     FULL_SYSIZE = 2 + SYSIZE_DEFAULT + 2;
99 int                     SXSIZE = SXSIZE_DEFAULT;
100 int                     SYSIZE = SYSIZE_DEFAULT;
101
102 int                     FADE_SX = 6, FADE_SY = 6;
103 int                     FADE_SXSIZE = 2 + SXSIZE_DEFAULT + 2;
104 int                     FADE_SYSIZE = 2 + SXSIZE_DEFAULT + 2;
105
106 int                     DXSIZE = 100;
107 int                     DYSIZE = 280;
108 int                     VXSIZE = 100;
109 int                     VYSIZE = 100;
110 int                     EXSIZE = 100;
111 int                     EYSIZE = 144;
112 int                     TILESIZE_VAR = TILESIZE;
113
114 int                     FX, FY;
115 int                     ScrollStepSize;
116 int                     ScreenMovDir = MV_NONE, ScreenMovPos = 0;
117 int                     ScreenGfxPos = 0;
118 int                     BorderElement = EL_STEELWALL;
119 int                     MenuFrameDelay = MENU_FRAME_DELAY;
120 int                     GameFrameDelay = GAME_FRAME_DELAY;
121 int                     FfwdFrameDelay = FFWD_FRAME_DELAY;
122 int                     BX1, BY1;
123 int                     BX2, BY2;
124 int                     SBX_Left, SBX_Right;
125 int                     SBY_Upper, SBY_Lower;
126
127 int                     TimeFrames, TimePlayed, TimeLeft, TapeTime;
128
129 boolean                 network_player_action_received = FALSE;
130
131 struct LevelInfo        level, level_template;
132 struct PlayerInfo       stored_player[MAX_PLAYERS], *local_player = NULL;
133 struct ScoreInfo        scores, server_scores;
134 struct TapeInfo         tape;
135 struct GameInfo         game;
136 struct GlobalInfo       global;
137 struct BorderInfo       border;
138 struct ViewportInfo     viewport;
139 struct TitleFadingInfo  fading;
140 struct TitleFadingInfo  title_initial_first_default;
141 struct TitleFadingInfo  title_initial_default;
142 struct TitleFadingInfo  title_first_default;
143 struct TitleFadingInfo  title_default;
144 struct TitleMessageInfo titlescreen_initial_first_default;
145 struct TitleMessageInfo titlescreen_initial_first[MAX_NUM_TITLE_IMAGES];
146 struct TitleMessageInfo titlescreen_initial_default;
147 struct TitleMessageInfo titlescreen_initial[MAX_NUM_TITLE_IMAGES];
148 struct TitleMessageInfo titlescreen_first_default;
149 struct TitleMessageInfo titlescreen_first[MAX_NUM_TITLE_IMAGES];
150 struct TitleMessageInfo titlescreen_default;
151 struct TitleMessageInfo titlescreen[MAX_NUM_TITLE_IMAGES];
152 struct TitleMessageInfo titlemessage_initial_first_default;
153 struct TitleMessageInfo titlemessage_initial_first[MAX_NUM_TITLE_MESSAGES];
154 struct TitleMessageInfo titlemessage_initial_default;
155 struct TitleMessageInfo titlemessage_initial[MAX_NUM_TITLE_MESSAGES];
156 struct TitleMessageInfo titlemessage_first_default;
157 struct TitleMessageInfo titlemessage_first[MAX_NUM_TITLE_MESSAGES];
158 struct TitleMessageInfo titlemessage_default;
159 struct TitleMessageInfo titlemessage[MAX_NUM_TITLE_MESSAGES];
160 struct TitleMessageInfo readme;
161 struct InitInfo         init, init_last;
162 struct MenuInfo         menu;
163 struct DoorInfo         door_1, door_2;
164 struct RequestInfo      request;
165 struct PreviewInfo      preview;
166 struct EditorInfo       editor;
167
168 struct GraphicInfo     *graphic_info = NULL;
169 struct SoundInfo       *sound_info = NULL;
170 struct MusicInfo       *music_info = NULL;
171 struct MusicFileInfo   *music_file_info = NULL;
172 struct HelpAnimInfo    *helpanim_info = NULL;
173
174 SetupFileHash          *helptext_info = NULL;
175 SetupFileHash          *image_config_hash = NULL;
176 SetupFileHash          *element_token_hash = NULL;
177 SetupFileHash          *graphic_token_hash = NULL;
178 SetupFileHash          *font_token_hash = NULL;
179 SetupFileHash          *hide_setup_hash = NULL;
180 SetupFileHash          *anim_url_hash = NULL;
181
182
183 // ----------------------------------------------------------------------------
184 // element definitions
185 // ----------------------------------------------------------------------------
186
187 struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1];
188
189 // this contains predefined structure elements to initialize "element_info"
190 struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
191 {
192   // keyword to start parser: "ELEMENT_INFO_START" <-- do not change!
193
194   // --------------------------------------------------------------------------
195   // "real" level file elements
196   // --------------------------------------------------------------------------
197
198   {
199     "empty_space",
200     "empty_space",
201     "empty space"
202   },
203   {
204     "sand",
205     "sand",
206     "sand"
207   },
208   {
209     "wall",
210     "wall",
211     "normal wall"
212   },
213   {
214     "wall_slippery",
215     "wall",
216     "slippery wall"
217   },
218   {
219     "rock",
220     "rock",
221     "rock"
222   },
223   {
224     "key_obsolete",
225     "obsolete",
226     "key (OBSOLETE)"
227   },
228   {
229     "emerald",
230     "emerald",
231     "emerald"
232   },
233   {
234     "exit_closed",
235     "exit",
236     "closed exit"
237   },
238   {
239     "player_obsolete",
240     "obsolete",
241     "player (OBSOLETE)"
242   },
243   {
244     "bug",
245     "bug",
246     "bug (random start direction)"
247   },
248   {
249     "spaceship",
250     "spaceship",
251     "spaceship (random start direction)"
252   },
253   {
254     "yamyam",
255     "yamyam",
256     "yam yam (random start direction)"
257   },
258   {
259     "robot",
260     "robot",
261     "robot"
262   },
263   {
264     "steelwall",
265     "steelwall",
266     "steel wall"
267   },
268   {
269     "diamond",
270     "diamond",
271     "diamond"
272   },
273   {
274     "amoeba_dead",
275     "amoeba",
276     "dead amoeba"
277   },
278   {
279     "quicksand_empty",
280     "quicksand",
281     "quicksand (empty)"
282   },
283   {
284     "quicksand_full",
285     "quicksand",
286     "quicksand (with rock)"
287   },
288   {
289     "amoeba_drop",
290     "amoeba",
291     "amoeba drop"
292   },
293   {
294     "bomb",
295     "bomb",
296     "bomb"
297   },
298   {
299     "magic_wall",
300     "magic_wall",
301     "magic wall"
302   },
303   {
304     "speed_pill",
305     "speed_pill",
306     "speed pill"
307   },
308   {
309     "acid",
310     "acid",
311     "acid"
312   },
313   {
314     "amoeba_wet",
315     "amoeba",
316     "dropping amoeba (EM style)"
317   },
318   {
319     "amoeba_dry",
320     "amoeba",
321     "normal amoeba"
322   },
323   {
324     "nut",
325     "nut",
326     "nut with emerald"
327   },
328   {
329     "game_of_life",
330     "game_of_life",
331     "Conway's wall of life"
332   },
333   {
334     "biomaze",
335     "biomaze",
336     "biomaze"
337   },
338   {
339     "dynamite.active",
340     "dynamite",
341     "burning dynamite"
342   },
343   {
344     "stoneblock",
345     "wall",
346     "wall"
347   },
348   {
349     "robot_wheel",
350     "robot_wheel",
351     "magic wheel"
352   },
353   {
354     "robot_wheel.active",
355     "robot_wheel",
356     "magic wheel (running)"
357   },
358   {
359     "key_1",
360     "key",
361     "key 1"
362   },
363   {
364     "key_2",
365     "key",
366     "key 2"
367   },
368   {
369     "key_3",
370     "key",
371     "key 3"
372   },
373   {
374     "key_4",
375     "key",
376     "key 4"
377   },
378   {
379     "gate_1",
380     "gate",
381     "door 1"
382   },
383   {
384     "gate_2",
385     "gate",
386     "door 2"
387   },
388   {
389     "gate_3",
390     "gate",
391     "door 3"
392   },
393   {
394     "gate_4",
395     "gate",
396     "door 4"
397   },
398   {
399     "gate_1_gray",
400     "gate",
401     "gray door (opened by key 1)"
402   },
403   {
404     "gate_2_gray",
405     "gate",
406     "gray door (opened by key 2)"
407   },
408   {
409     "gate_3_gray",
410     "gate",
411     "gray door (opened by key 3)"
412   },
413   {
414     "gate_4_gray",
415     "gate",
416     "gray door (opened by key 4)"
417   },
418   {
419     "dynamite",
420     "dynamite",
421     "dynamite"
422   },
423   {
424     "pacman",
425     "pacman",
426     "pac man (random start direction)"
427   },
428   {
429     "invisible_wall",
430     "wall",
431     "invisible normal wall"
432   },
433   {
434     "lamp",
435     "lamp",
436     "lamp (off)"
437   },
438   {
439     "lamp.active",
440     "lamp",
441     "lamp (on)"
442   },
443   {
444     "wall_emerald",
445     "wall",
446     "wall with emerald"
447   },
448   {
449     "wall_diamond",
450     "wall",
451     "wall with diamond"
452   },
453   {
454     "amoeba_full",
455     "amoeba",
456     "amoeba with content"
457   },
458   {
459     "bd_amoeba",
460     "bd_amoeba",
461     "amoeba (BD style)"
462   },
463   {
464     "time_orb_full",
465     "time_orb_full",
466     "time orb (full)"
467   },
468   {
469     "time_orb_empty",
470     "time_orb_empty",
471     "time orb (empty)"
472   },
473   {
474     "expandable_wall",
475     "wall",
476     "growing wall (horizontal, visible)"
477   },
478   {
479     "bd_diamond",
480     "bd_diamond",
481     "diamond (BD style)"
482   },
483   {
484     "emerald_yellow",
485     "emerald",
486     "yellow emerald"
487   },
488   {
489     "wall_bd_diamond",
490     "wall",
491     "wall with BD style diamond"
492   },
493   {
494     "wall_emerald_yellow",
495     "wall",
496     "wall with yellow emerald"
497   },
498   {
499     "dark_yamyam",
500     "dark_yamyam",
501     "dark yam yam"
502   },
503   {
504     "bd_magic_wall",
505     "bd_magic_wall",
506     "magic wall (BD style)"
507   },
508   {
509     "invisible_steelwall",
510     "steelwall",
511     "invisible steel wall"
512   },
513   {
514     "sokoban_field_player",
515     "sokoban",
516     "sokoban field with player"
517   },
518   {
519     "dynabomb_increase_number",
520     "dynabomb",
521     "increases number of bombs"
522   },
523   {
524     "dynabomb_increase_size",
525     "dynabomb",
526     "increases explosion size"
527   },
528   {
529     "dynabomb_increase_power",
530     "dynabomb",
531     "increases power of explosion"
532   },
533   {
534     "sokoban_object",
535     "sokoban",
536     "sokoban object"
537   },
538   {
539     "sokoban_field_empty",
540     "sokoban",
541     "sokoban empty field"
542   },
543   {
544     "sokoban_field_full",
545     "sokoban",
546     "sokoban field with object"
547   },
548   {
549     "bd_butterfly.right",
550     "bd_butterfly",
551     "butterfly (starts moving right)"
552   },
553   {
554     "bd_butterfly.up",
555     "bd_butterfly",
556     "butterfly (starts moving up)"
557   },
558   {
559     "bd_butterfly.left",
560     "bd_butterfly",
561     "butterfly (starts moving left)"
562   },
563   {
564     "bd_butterfly.down",
565     "bd_butterfly",
566     "butterfly (starts moving down)"
567   },
568   {
569     "bd_firefly.right",
570     "bd_firefly",
571     "firefly (starts moving right)"
572   },
573   {
574     "bd_firefly.up",
575     "bd_firefly",
576     "firefly (starts moving up)"
577   },
578   {
579     "bd_firefly.left",
580     "bd_firefly",
581     "firefly (starts moving left)"
582   },
583   {
584     "bd_firefly.down",
585     "bd_firefly",
586     "firefly (starts moving down)"
587   },
588   {
589     "bd_butterfly",
590     "bd_butterfly",
591     "butterfly (random start direction)"
592   },
593   {
594     "bd_firefly",
595     "bd_firefly",
596     "firefly (random start direction)"
597   },
598   {
599     "player_1",
600     "player",
601     "player 1"
602   },
603   {
604     "player_2",
605     "player",
606     "player 2"
607   },
608   {
609     "player_3",
610     "player",
611     "player 3"
612   },
613   {
614     "player_4",
615     "player",
616     "player 4"
617   },
618   {
619     "bug.right",
620     "bug",
621     "bug (starts moving right)"
622   },
623   {
624     "bug.up",
625     "bug",
626     "bug (starts moving up)"
627   },
628   {
629     "bug.left",
630     "bug",
631     "bug (starts moving left)"
632   },
633   {
634     "bug.down",
635     "bug",
636     "bug (starts moving down)"
637   },
638   {
639     "spaceship.right",
640     "spaceship",
641     "spaceship (starts moving right)"
642   },
643   {
644     "spaceship.up",
645     "spaceship",
646     "spaceship (starts moving up)"
647   },
648   {
649     "spaceship.left",
650     "spaceship",
651     "spaceship (starts moving left)"
652   },
653   {
654     "spaceship.down",
655     "spaceship",
656     "spaceship (starts moving down)"
657   },
658   {
659     "pacman.right",
660     "pacman",
661     "pac man (starts moving right)"
662   },
663   {
664     "pacman.up",
665     "pacman",
666     "pac man (starts moving up)"
667   },
668   {
669     "pacman.left",
670     "pacman",
671     "pac man (starts moving left)"
672   },
673   {
674     "pacman.down",
675     "pacman",
676     "pac man (starts moving down)"
677   },
678   {
679     "emerald_red",
680     "emerald",
681     "red emerald"
682   },
683   {
684     "emerald_purple",
685     "emerald",
686     "purple emerald"
687   },
688   {
689     "wall_emerald_red",
690     "wall",
691     "wall with red emerald"
692   },
693   {
694     "wall_emerald_purple",
695     "wall",
696     "wall with purple emerald"
697   },
698   {
699     "acid_pool_topleft",
700     "wall",
701     "acid pool (top left)"
702   },
703   {
704     "acid_pool_topright",
705     "wall",
706     "acid pool (top right)"
707   },
708   {
709     "acid_pool_bottomleft",
710     "wall",
711     "acid pool (bottom left)"
712   },
713   {
714     "acid_pool_bottom",
715     "wall",
716     "acid pool (bottom)"
717   },
718   {
719     "acid_pool_bottomright",
720     "wall",
721     "acid pool (bottom right)"
722   },
723   {
724     "bd_wall",
725     "wall",
726     "normal wall (BD style)"
727   },
728   {
729     "bd_rock",
730     "bd_rock",
731     "rock (BD style)"
732   },
733   {
734     "exit_open",
735     "exit",
736     "open exit"
737   },
738   {
739     "black_orb",
740     "black_orb",
741     "black orb bomb"
742   },
743   {
744     "amoeba_to_diamond",
745     "amoeba",
746     "amoeba"
747   },
748   {
749     "mole",
750     "mole",
751     "mole (random start direction)"
752   },
753   {
754     "penguin",
755     "penguin",
756     "penguin"
757   },
758   {
759     "satellite",
760     "satellite",
761     "satellite"
762   },
763   {
764     "arrow_left",
765     "arrow",
766     "arrow left"
767   },
768   {
769     "arrow_right",
770     "arrow",
771     "arrow right"
772   },
773   {
774     "arrow_up",
775     "arrow",
776     "arrow up"
777   },
778   {
779     "arrow_down",
780     "arrow",
781     "arrow down"
782   },
783   {
784     "pig",
785     "pig",
786     "pig"
787   },
788   {
789     "dragon",
790     "dragon",
791     "fire breathing dragon"
792   },
793   {
794     "em_key_1_file_obsolete",
795     "obsolete",
796     "key (OBSOLETE)"
797   },
798   {
799     "char_space",
800     "char",
801     "letter ' '"
802   },
803   {
804     "char_exclam",
805     "char",
806     "letter '!'"
807   },
808   {
809     "char_quotedbl",
810     "char",
811     "letter '\"'"
812   },
813   {
814     "char_numbersign",
815     "char",
816     "letter '#'"
817   },
818   {
819     "char_dollar",
820     "char",
821     "letter '$'"
822   },
823   {
824     "char_percent",
825     "char",
826     "letter '%'"
827   },
828   {
829     "char_ampersand",
830     "char",
831     "letter '&'"
832   },
833   {
834     "char_apostrophe",
835     "char",
836     "letter '''"
837   },
838   {
839     "char_parenleft",
840     "char",
841     "letter '('"
842   },
843   {
844     "char_parenright",
845     "char",
846     "letter ')'"
847   },
848   {
849     "char_asterisk",
850     "char",
851     "letter '*'"
852   },
853   {
854     "char_plus",
855     "char",
856     "letter '+'"
857   },
858   {
859     "char_comma",
860     "char",
861     "letter ','"
862   },
863   {
864     "char_minus",
865     "char",
866     "letter '-'"
867   },
868   {
869     "char_period",
870     "char",
871     "letter '.'"
872   },
873   {
874     "char_slash",
875     "char",
876     "letter '/'"
877   },
878   {
879     "char_0",
880     "char",
881     "letter '0'"
882   },
883   {
884     "char_1",
885     "char",
886     "letter '1'"
887   },
888   {
889     "char_2",
890     "char",
891     "letter '2'"
892   },
893   {
894     "char_3",
895     "char",
896     "letter '3'"
897   },
898   {
899     "char_4",
900     "char",
901     "letter '4'"
902   },
903   {
904     "char_5",
905     "char",
906     "letter '5'"
907   },
908   {
909     "char_6",
910     "char",
911     "letter '6'"
912   },
913   {
914     "char_7",
915     "char",
916     "letter '7'"
917   },
918   {
919     "char_8",
920     "char",
921     "letter '8'"
922   },
923   {
924     "char_9",
925     "char",
926     "letter '9'"
927   },
928   {
929     "char_colon",
930     "char",
931     "letter ':'"
932   },
933   {
934     "char_semicolon",
935     "char",
936     "letter ';'"
937   },
938   {
939     "char_less",
940     "char",
941     "letter '<'"
942   },
943   {
944     "char_equal",
945     "char",
946     "letter '='"
947   },
948   {
949     "char_greater",
950     "char",
951     "letter '>'"
952   },
953   {
954     "char_question",
955     "char",
956     "letter '?'"
957   },
958   {
959     "char_at",
960     "char",
961     "letter '@'"
962   },
963   {
964     "char_a",
965     "char",
966     "letter 'A'"
967   },
968   {
969     "char_b",
970     "char",
971     "letter 'B'"
972   },
973   {
974     "char_c",
975     "char",
976     "letter 'C'"
977   },
978   {
979     "char_d",
980     "char",
981     "letter 'D'"
982   },
983   {
984     "char_e",
985     "char",
986     "letter 'E'"
987   },
988   {
989     "char_f",
990     "char",
991     "letter 'F'"
992   },
993   {
994     "char_g",
995     "char",
996     "letter 'G'"
997   },
998   {
999     "char_h",
1000     "char",
1001     "letter 'H'"
1002   },
1003   {
1004     "char_i",
1005     "char",
1006     "letter 'I'"
1007   },
1008   {
1009     "char_j",
1010     "char",
1011     "letter 'J'"
1012   },
1013   {
1014     "char_k",
1015     "char",
1016     "letter 'K'"
1017   },
1018   {
1019     "char_l",
1020     "char",
1021     "letter 'L'"
1022   },
1023   {
1024     "char_m",
1025     "char",
1026     "letter 'M'"
1027   },
1028   {
1029     "char_n",
1030     "char",
1031     "letter 'N'"
1032   },
1033   {
1034     "char_o",
1035     "char",
1036     "letter 'O'"
1037   },
1038   {
1039     "char_p",
1040     "char",
1041     "letter 'P'"
1042   },
1043   {
1044     "char_q",
1045     "char",
1046     "letter 'Q'"
1047   },
1048   {
1049     "char_r",
1050     "char",
1051     "letter 'R'"
1052   },
1053   {
1054     "char_s",
1055     "char",
1056     "letter 'S'"
1057   },
1058   {
1059     "char_t",
1060     "char",
1061     "letter 'T'"
1062   },
1063   {
1064     "char_u",
1065     "char",
1066     "letter 'U'"
1067   },
1068   {
1069     "char_v",
1070     "char",
1071     "letter 'V'"
1072   },
1073   {
1074     "char_w",
1075     "char",
1076     "letter 'W'"
1077   },
1078   {
1079     "char_x",
1080     "char",
1081     "letter 'X'"
1082   },
1083   {
1084     "char_y",
1085     "char",
1086     "letter 'Y'"
1087   },
1088   {
1089     "char_z",
1090     "char",
1091     "letter 'Z'"
1092   },
1093   {
1094     "char_bracketleft",
1095     "char",
1096     "letter '['"
1097   },
1098   {
1099     "char_backslash",
1100     "char",
1101     "letter '\\'"
1102   },
1103   {
1104     "char_bracketright",
1105     "char",
1106     "letter ']'"
1107   },
1108   {
1109     "char_asciicircum",
1110     "char",
1111     "letter '^'"
1112   },
1113   {
1114     "char_underscore",
1115     "char",
1116     "letter '_'"
1117   },
1118   {
1119     "char_copyright",
1120     "char",
1121     "letter '\xa9'"
1122   },
1123   {
1124     "char_aumlaut",
1125     "char",
1126     "letter '\xc4'"
1127   },
1128   {
1129     "char_oumlaut",
1130     "char",
1131     "letter '\xd6'"
1132   },
1133   {
1134     "char_uumlaut",
1135     "char",
1136     "letter '\xdc'"
1137   },
1138   {
1139     "char_degree",
1140     "char",
1141     "letter '\xb0'"
1142   },
1143   {
1144     "char_trademark",
1145     "char",
1146     "letter '\xae'"
1147   },
1148   {
1149     "char_cursor",
1150     "char",
1151     "letter '\xa0'"
1152   },
1153   {
1154     "char_unused",
1155     "char",
1156     "letter ''"
1157   },
1158   {
1159     "char_unused",
1160     "char",
1161     "letter ''"
1162   },
1163   {
1164     "char_unused",
1165     "char",
1166     "letter ''"
1167   },
1168   {
1169     "char_unused",
1170     "char",
1171     "letter ''"
1172   },
1173   {
1174     "char_unused",
1175     "char",
1176     "letter ''"
1177   },
1178   {
1179     "char_unused",
1180     "char",
1181     "letter ''"
1182   },
1183   {
1184     "char_button",
1185     "char",
1186     "letter 'button'"
1187   },
1188   {
1189     "char_up",
1190     "char",
1191     "letter 'up'"
1192   },
1193   {
1194     "char_down",
1195     "char",
1196     "letter 'down'"
1197   },
1198   {
1199     "expandable_wall_horizontal",
1200     "wall",
1201     "growing wall (horizontal)"
1202   },
1203   {
1204     "expandable_wall_vertical",
1205     "wall",
1206     "growing wall (vertical)"
1207   },
1208   {
1209     "expandable_wall_any",
1210     "wall",
1211     "growing wall (any direction)"
1212   },
1213   {
1214     "em_gate_1",
1215     "gate",
1216     "door 1 (EM style)"
1217   },
1218   {
1219     "em_gate_2",
1220     "gate",
1221     "door 2 (EM style)"
1222   },
1223   {
1224     "em_gate_3",
1225     "gate",
1226     "door 3 (EM style)"
1227   },
1228   {
1229     "em_gate_4",
1230     "gate",
1231     "door 4 (EM style)"
1232   },
1233   {
1234     "em_key_2_file_obsolete",
1235     "obsolete",
1236     "key (OBSOLETE)"
1237   },
1238   {
1239     "em_key_3_file_obsolete",
1240     "obsolete",
1241     "key (OBSOLETE)"
1242   },
1243   {
1244     "em_key_4_file_obsolete",
1245     "obsolete",
1246     "key (OBSOLETE)"
1247   },
1248   {
1249     "sp_empty_space",
1250     "empty_space",
1251     "empty space"
1252   },
1253   {
1254     "sp_zonk",
1255     "sp_zonk",
1256     "zonk"
1257   },
1258   {
1259     "sp_base",
1260     "sp_base",
1261     "base"
1262   },
1263   {
1264     "sp_murphy",
1265     "player",
1266     "murphy"
1267   },
1268   {
1269     "sp_infotron",
1270     "sp_infotron",
1271     "infotron"
1272   },
1273   {
1274     "sp_chip_single",
1275     "wall",
1276     "chip (single)"
1277   },
1278   {
1279     "sp_hardware_gray",
1280     "wall",
1281     "hardware"
1282   },
1283   {
1284     "sp_exit_closed",
1285     "sp_exit",
1286     "exit"
1287   },
1288   {
1289     "sp_disk_orange",
1290     "sp_disk_orange",
1291     "orange disk"
1292   },
1293   {
1294     "sp_port_right",
1295     "sp_port",
1296     "port (leading right)"
1297   },
1298   {
1299     "sp_port_down",
1300     "sp_port",
1301     "port (leading down)"
1302   },
1303   {
1304     "sp_port_left",
1305     "sp_port",
1306     "port (leading left)"
1307   },
1308   {
1309     "sp_port_up",
1310     "sp_port",
1311     "port (leading up)"
1312   },
1313   {
1314     "sp_gravity_port_right",
1315     "sp_gravity_port",
1316     "gravity-on/off port (leading right)"
1317   },
1318   {
1319     "sp_gravity_port_down",
1320     "sp_gravity_port",
1321     "gravity-on/off port (leading down)"
1322   },
1323   {
1324     "sp_gravity_port_left",
1325     "sp_gravity_port",
1326     "gravity-on/off port (leading left)"
1327   },
1328   {
1329     "sp_gravity_port_up",
1330     "sp_gravity_port",
1331     "gravity-on/off port (leading up)"
1332   },
1333   {
1334     "sp_sniksnak",
1335     "sp_sniksnak",
1336     "snik snak"
1337   },
1338   {
1339     "sp_disk_yellow",
1340     "sp_disk_yellow",
1341     "yellow disk"
1342   },
1343   {
1344     "sp_terminal",
1345     "sp_terminal",
1346     "terminal"
1347   },
1348   {
1349     "sp_disk_red",
1350     "dynamite",
1351     "red disk"
1352   },
1353   {
1354     "sp_port_vertical",
1355     "sp_port",
1356     "port (vertical)"
1357   },
1358   {
1359     "sp_port_horizontal",
1360     "sp_port",
1361     "port (horizontal)"
1362   },
1363   {
1364     "sp_port_any",
1365     "sp_port",
1366     "port (any direction)"
1367   },
1368   {
1369     "sp_electron",
1370     "sp_electron",
1371     "electron"
1372   },
1373   {
1374     "sp_buggy_base",
1375     "sp_buggy_base",
1376     "buggy base"
1377   },
1378   {
1379     "sp_chip_left",
1380     "wall",
1381     "chip (left half)"
1382   },
1383   {
1384     "sp_chip_right",
1385     "wall",
1386     "chip (right half)"
1387   },
1388   {
1389     "sp_hardware_base_1",
1390     "wall",
1391     "hardware"
1392   },
1393   {
1394     "sp_hardware_green",
1395     "wall",
1396     "hardware"
1397   },
1398   {
1399     "sp_hardware_blue",
1400     "wall",
1401     "hardware"
1402   },
1403   {
1404     "sp_hardware_red",
1405     "wall",
1406     "hardware"
1407   },
1408   {
1409     "sp_hardware_yellow",
1410     "wall",
1411     "hardware"
1412   },
1413   {
1414     "sp_hardware_base_2",
1415     "wall",
1416     "hardware"
1417   },
1418   {
1419     "sp_hardware_base_3",
1420     "wall",
1421     "hardware"
1422   },
1423   {
1424     "sp_hardware_base_4",
1425     "wall",
1426     "hardware"
1427   },
1428   {
1429     "sp_hardware_base_5",
1430     "wall",
1431     "hardware"
1432   },
1433   {
1434     "sp_hardware_base_6",
1435     "wall",
1436     "hardware"
1437   },
1438   {
1439     "sp_chip_top",
1440     "wall",
1441     "chip (upper half)"
1442   },
1443   {
1444     "sp_chip_bottom",
1445     "wall",
1446     "chip (lower half)"
1447   },
1448   {
1449     "em_gate_1_gray",
1450     "gate",
1451     "gray door (EM style, key 1)"
1452   },
1453   {
1454     "em_gate_2_gray",
1455     "gate",
1456     "gray door (EM style, key 2)"
1457   },
1458   {
1459     "em_gate_3_gray",
1460     "gate",
1461     "gray door (EM style, key 3)"
1462   },
1463   {
1464     "em_gate_4_gray",
1465     "gate",
1466     "gray door (EM style, key 4)"
1467   },
1468   {
1469     "em_dynamite",
1470     "dynamite",
1471     "dynamite (EM style)"
1472   },
1473   {
1474     "em_dynamite.active",
1475     "dynamite",
1476     "burning dynamite (EM style)"
1477   },
1478   {
1479     "pearl",
1480     "pearl",
1481     "pearl"
1482   },
1483   {
1484     "crystal",
1485     "crystal",
1486     "crystal"
1487   },
1488   {
1489     "wall_pearl",
1490     "wall",
1491     "wall with pearl"
1492   },
1493   {
1494     "wall_crystal",
1495     "wall",
1496     "wall with crystal"
1497   },
1498   {
1499     "dc_gate_white",
1500     "gate",
1501     "white door"
1502   },
1503   {
1504     "dc_gate_white_gray",
1505     "gate",
1506     "gray door (opened by white key)"
1507   },
1508   {
1509     "dc_key_white",
1510     "key",
1511     "white key"
1512   },
1513   {
1514     "shield_normal",
1515     "shield_normal",
1516     "shield (normal)"
1517   },
1518   {
1519     "extra_time",
1520     "extra_time",
1521     "extra time"
1522   },
1523   {
1524     "switchgate_open",
1525     "switchgate",
1526     "switch gate (open)"
1527   },
1528   {
1529     "switchgate_closed",
1530     "switchgate",
1531     "switch gate (closed)"
1532   },
1533   {
1534     "switchgate_switch_up",
1535     "switchgate_switch",
1536     "switch for switch gate"
1537   },
1538   {
1539     "switchgate_switch_down",
1540     "switchgate_switch",
1541     "switch for switch gate"
1542   },
1543   {
1544     "unused_269",
1545     "unused",
1546     "-"
1547   },
1548   {
1549     "unused_270",
1550     "unused",
1551     "-"
1552   },
1553   {
1554     "conveyor_belt_1_left",
1555     "conveyor_belt",
1556     "conveyor belt 1 (left)"
1557   },
1558   {
1559     "conveyor_belt_1_middle",
1560     "conveyor_belt",
1561     "conveyor belt 1 (middle)"
1562   },
1563   {
1564     "conveyor_belt_1_right",
1565     "conveyor_belt",
1566     "conveyor belt 1 (right)"
1567   },
1568   {
1569     "conveyor_belt_1_switch_left",
1570     "conveyor_belt_switch",
1571     "switch for conveyor belt 1 (left)"
1572   },
1573   {
1574     "conveyor_belt_1_switch_middle",
1575     "conveyor_belt_switch",
1576     "switch for conveyor belt 1 (middle)"
1577   },
1578   {
1579     "conveyor_belt_1_switch_right",
1580     "conveyor_belt_switch",
1581     "switch for conveyor belt 1 (right)"
1582   },
1583   {
1584     "conveyor_belt_2_left",
1585     "conveyor_belt",
1586     "conveyor belt 2 (left)"
1587   },
1588   {
1589     "conveyor_belt_2_middle",
1590     "conveyor_belt",
1591     "conveyor belt 2 (middle)"
1592   },
1593   {
1594     "conveyor_belt_2_right",
1595     "conveyor_belt",
1596     "conveyor belt 2 (right)"
1597   },
1598   {
1599     "conveyor_belt_2_switch_left",
1600     "conveyor_belt_switch",
1601     "switch for conveyor belt 2 (left)"
1602   },
1603   {
1604     "conveyor_belt_2_switch_middle",
1605     "conveyor_belt_switch",
1606     "switch for conveyor belt 2 (middle)"
1607   },
1608   {
1609     "conveyor_belt_2_switch_right",
1610     "conveyor_belt_switch",
1611     "switch for conveyor belt 2 (right)"
1612   },
1613   {
1614     "conveyor_belt_3_left",
1615     "conveyor_belt",
1616     "conveyor belt 3 (left)"
1617   },
1618   {
1619     "conveyor_belt_3_middle",
1620     "conveyor_belt",
1621     "conveyor belt 3 (middle)"
1622   },
1623   {
1624     "conveyor_belt_3_right",
1625     "conveyor_belt",
1626     "conveyor belt 3 (right)"
1627   },
1628   {
1629     "conveyor_belt_3_switch_left",
1630     "conveyor_belt_switch",
1631     "switch for conveyor belt 3 (left)"
1632   },
1633   {
1634     "conveyor_belt_3_switch_middle",
1635     "conveyor_belt_switch",
1636     "switch for conveyor belt 3 (middle)"
1637   },
1638   {
1639     "conveyor_belt_3_switch_right",
1640     "conveyor_belt_switch",
1641     "switch for conveyor belt 3 (right)"
1642   },
1643   {
1644     "conveyor_belt_4_left",
1645     "conveyor_belt",
1646     "conveyor belt 4 (left)"
1647   },
1648   {
1649     "conveyor_belt_4_middle",
1650     "conveyor_belt",
1651     "conveyor belt 4 (middle)"
1652   },
1653   {
1654     "conveyor_belt_4_right",
1655     "conveyor_belt",
1656     "conveyor belt 4 (right)"
1657   },
1658   {
1659     "conveyor_belt_4_switch_left",
1660     "conveyor_belt_switch",
1661     "switch for conveyor belt 4 (left)"
1662   },
1663   {
1664     "conveyor_belt_4_switch_middle",
1665     "conveyor_belt_switch",
1666     "switch for conveyor belt 4 (middle)"
1667   },
1668   {
1669     "conveyor_belt_4_switch_right",
1670     "conveyor_belt_switch",
1671     "switch for conveyor belt 4 (right)"
1672   },
1673   {
1674     "landmine",
1675     "landmine",
1676     "land mine (not removable)"
1677   },
1678   {
1679     "envelope_obsolete",
1680     "obsolete",
1681     "envelope (OBSOLETE)"
1682   },
1683   {
1684     "light_switch",
1685     "light_switch",
1686     "light switch (off)"
1687   },
1688   {
1689     "light_switch.active",
1690     "light_switch",
1691     "light switch (on)"
1692   },
1693   {
1694     "sign_exclamation",
1695     "sign",
1696     "sign (exclamation)"
1697   },
1698   {
1699     "sign_radioactivity",
1700     "sign",
1701     "sign (radio activity)"
1702   },
1703   {
1704     "sign_stop",
1705     "sign",
1706     "sign (stop)"
1707   },
1708   {
1709     "sign_wheelchair",
1710     "sign",
1711     "sign (wheel chair)"
1712   },
1713   {
1714     "sign_parking",
1715     "sign",
1716     "sign (parking)"
1717   },
1718   {
1719     "sign_no_entry",
1720     "sign",
1721     "sign (no entry)"
1722   },
1723   {
1724     "sign_unused_1",
1725     "sign",
1726     "sign (unused)"
1727   },
1728   {
1729     "sign_give_way",
1730     "sign",
1731     "sign (give way)"
1732   },
1733   {
1734     "sign_entry_forbidden",
1735     "sign",
1736     "sign (entry forbidden)"
1737   },
1738   {
1739     "sign_emergency_exit",
1740     "sign",
1741     "sign (emergency exit)"
1742   },
1743   {
1744     "sign_yin_yang",
1745     "sign",
1746     "sign (yin yang)"
1747   },
1748   {
1749     "sign_unused_2",
1750     "sign",
1751     "sign (unused)"
1752   },
1753   {
1754     "mole.left",
1755     "mole",
1756     "mole (starts moving left)"
1757   },
1758   {
1759     "mole.right",
1760     "mole",
1761     "mole (starts moving right)"
1762   },
1763   {
1764     "mole.up",
1765     "mole",
1766     "mole (starts moving up)"
1767   },
1768   {
1769     "mole.down",
1770     "mole",
1771     "mole (starts moving down)"
1772   },
1773   {
1774     "steelwall_slippery",
1775     "steelwall",
1776     "slippery steel wall"
1777   },
1778   {
1779     "invisible_sand",
1780     "sand",
1781     "invisible sand"
1782   },
1783   {
1784     "dx_unknown_15",
1785     "unknown",
1786     "dx unknown element 15"
1787   },
1788   {
1789     "dx_unknown_42",
1790     "unknown",
1791     "dx unknown element 42"
1792   },
1793   {
1794     "unused_319",
1795     "unused",
1796     "(not used)"
1797   },
1798   {
1799     "unused_320",
1800     "unused",
1801     "(not used)"
1802   },
1803   {
1804     "shield_deadly",
1805     "shield_deadly",
1806     "shield (deadly, kills enemies)"
1807   },
1808   {
1809     "timegate_open",
1810     "timegate",
1811     "time gate (open)"
1812   },
1813   {
1814     "timegate_closed",
1815     "timegate",
1816     "time gate (closed)"
1817   },
1818   {
1819     "timegate_switch.active",
1820     "timegate_switch",
1821     "switch for time gate"
1822   },
1823   {
1824     "timegate_switch",
1825     "timegate_switch",
1826     "switch for time gate"
1827   },
1828   {
1829     "balloon",
1830     "balloon",
1831     "balloon"
1832   },
1833   {
1834     "balloon_switch_left",
1835     "balloon_switch",
1836     "wind switch (left)"
1837   },
1838   {
1839     "balloon_switch_right",
1840     "balloon_switch",
1841     "wind switch (right)"
1842   },
1843   {
1844     "balloon_switch_up",
1845     "balloon_switch",
1846     "wind switch (up)"
1847   },
1848   {
1849     "balloon_switch_down",
1850     "balloon_switch",
1851     "wind switch (down)"
1852   },
1853   {
1854     "balloon_switch_any",
1855     "balloon_switch",
1856     "wind switch (any direction)"
1857   },
1858   {
1859     "emc_steelwall_1",
1860     "steelwall",
1861     "steel wall 1 (EMC style)"
1862   },
1863   {
1864     "emc_steelwall_2",
1865     "steelwall",
1866     "steel wall 2 (EMC style)"
1867   },
1868   {
1869     "emc_steelwall_3",
1870     "steelwall",
1871     "steel wall 3 (EMC style)"
1872   },
1873   {
1874     "emc_steelwall_4",
1875     "steelwall",
1876     "steel wall 4 (EMC style)"
1877   },
1878   {
1879     "emc_wall_1",
1880     "wall",
1881     "normal wall 1 (EMC style)"
1882   },
1883   {
1884     "emc_wall_2",
1885     "wall",
1886     "normal wall 2 (EMC style)"
1887   },
1888   {
1889     "emc_wall_3",
1890     "wall",
1891     "normal wall 3 (EMC style)"
1892   },
1893   {
1894     "emc_wall_4",
1895     "wall",
1896     "normal wall 4 (EMC style)"
1897   },
1898   {
1899     "emc_wall_5",
1900     "wall",
1901     "normal wall 5 (EMC style)"
1902   },
1903   {
1904     "emc_wall_6",
1905     "wall",
1906     "normal wall 6 (EMC style)"
1907   },
1908   {
1909     "emc_wall_7",
1910     "wall",
1911     "normal wall 7 (EMC style)"
1912   },
1913   {
1914     "emc_wall_8",
1915     "wall",
1916     "normal wall 8 (EMC style)"
1917   },
1918   {
1919     "tube_any",
1920     "tube",
1921     "tube (any direction)"
1922   },
1923   {
1924     "tube_vertical",
1925     "tube",
1926     "tube (vertical)"
1927   },
1928   {
1929     "tube_horizontal",
1930     "tube",
1931     "tube (horizontal)"
1932   },
1933   {
1934     "tube_vertical_left",
1935     "tube",
1936     "tube (vertical & left)"
1937   },
1938   {
1939     "tube_vertical_right",
1940     "tube",
1941     "tube (vertical & right)"
1942   },
1943   {
1944     "tube_horizontal_up",
1945     "tube",
1946     "tube (horizontal & up)"
1947   },
1948   {
1949     "tube_horizontal_down",
1950     "tube",
1951     "tube (horizontal & down)"
1952   },
1953   {
1954     "tube_left_up",
1955     "tube",
1956     "tube (left & up)"
1957   },
1958   {
1959     "tube_left_down",
1960     "tube",
1961     "tube (left & down)"
1962   },
1963   {
1964     "tube_right_up",
1965     "tube",
1966     "tube (right & up)"
1967   },
1968   {
1969     "tube_right_down",
1970     "tube",
1971     "tube (right & down)"
1972   },
1973   {
1974     "spring",
1975     "spring",
1976     "spring"
1977   },
1978   {
1979     "trap",
1980     "trap",
1981     "trap"
1982   },
1983   {
1984     "dx_supabomb",
1985     "bomb",
1986     "stable bomb (DX style)"
1987   },
1988   {
1989     "unused_358",
1990     "unused",
1991     "-"
1992   },
1993   {
1994     "unused_359",
1995     "unused",
1996     "-"
1997   },
1998   {
1999     "custom_1",
2000     "custom",
2001     "custom element 1"
2002   },
2003   {
2004     "custom_2",
2005     "custom",
2006     "custom element 2"
2007   },
2008   {
2009     "custom_3",
2010     "custom",
2011     "custom element 3"
2012   },
2013   {
2014     "custom_4",
2015     "custom",
2016     "custom element 4"
2017   },
2018   {
2019     "custom_5",
2020     "custom",
2021     "custom element 5"
2022   },
2023   {
2024     "custom_6",
2025     "custom",
2026     "custom element 6"
2027   },
2028   {
2029     "custom_7",
2030     "custom",
2031     "custom element 7"
2032   },
2033   {
2034     "custom_8",
2035     "custom",
2036     "custom element 8"
2037   },
2038   {
2039     "custom_9",
2040     "custom",
2041     "custom element 9"
2042   },
2043   {
2044     "custom_10",
2045     "custom",
2046     "custom element 10"
2047   },
2048   {
2049     "custom_11",
2050     "custom",
2051     "custom element 11"
2052   },
2053   {
2054     "custom_12",
2055     "custom",
2056     "custom element 12"
2057   },
2058   {
2059     "custom_13",
2060     "custom",
2061     "custom element 13"
2062   },
2063   {
2064     "custom_14",
2065     "custom",
2066     "custom element 14"
2067   },
2068   {
2069     "custom_15",
2070     "custom",
2071     "custom element 15"
2072   },
2073   {
2074     "custom_16",
2075     "custom",
2076     "custom element 16"
2077   },
2078   {
2079     "custom_17",
2080     "custom",
2081     "custom element 17"
2082   },
2083   {
2084     "custom_18",
2085     "custom",
2086     "custom element 18"
2087   },
2088   {
2089     "custom_19",
2090     "custom",
2091     "custom element 19"
2092   },
2093   {
2094     "custom_20",
2095     "custom",
2096     "custom element 20"
2097   },
2098   {
2099     "custom_21",
2100     "custom",
2101     "custom element 21"
2102   },
2103   {
2104     "custom_22",
2105     "custom",
2106     "custom element 22"
2107   },
2108   {
2109     "custom_23",
2110     "custom",
2111     "custom element 23"
2112   },
2113   {
2114     "custom_24",
2115     "custom",
2116     "custom element 24"
2117   },
2118   {
2119     "custom_25",
2120     "custom",
2121     "custom element 25"
2122   },
2123   {
2124     "custom_26",
2125     "custom",
2126     "custom element 26"
2127   },
2128   {
2129     "custom_27",
2130     "custom",
2131     "custom element 27"
2132   },
2133   {
2134     "custom_28",
2135     "custom",
2136     "custom element 28"
2137   },
2138   {
2139     "custom_29",
2140     "custom",
2141     "custom element 29"
2142   },
2143   {
2144     "custom_30",
2145     "custom",
2146     "custom element 30"
2147   },
2148   {
2149     "custom_31",
2150     "custom",
2151     "custom element 31"
2152   },
2153   {
2154     "custom_32",
2155     "custom",
2156     "custom element 32"
2157   },
2158   {
2159     "custom_33",
2160     "custom",
2161     "custom element 33"
2162   },
2163   {
2164     "custom_34",
2165     "custom",
2166     "custom element 34"
2167   },
2168   {
2169     "custom_35",
2170     "custom",
2171     "custom element 35"
2172   },
2173   {
2174     "custom_36",
2175     "custom",
2176     "custom element 36"
2177   },
2178   {
2179     "custom_37",
2180     "custom",
2181     "custom element 37"
2182   },
2183   {
2184     "custom_38",
2185     "custom",
2186     "custom element 38"
2187   },
2188   {
2189     "custom_39",
2190     "custom",
2191     "custom element 39"
2192   },
2193   {
2194     "custom_40",
2195     "custom",
2196     "custom element 40"
2197   },
2198   {
2199     "custom_41",
2200     "custom",
2201     "custom element 41"
2202   },
2203   {
2204     "custom_42",
2205     "custom",
2206     "custom element 42"
2207   },
2208   {
2209     "custom_43",
2210     "custom",
2211     "custom element 43"
2212   },
2213   {
2214     "custom_44",
2215     "custom",
2216     "custom element 44"
2217   },
2218   {
2219     "custom_45",
2220     "custom",
2221     "custom element 45"
2222   },
2223   {
2224     "custom_46",
2225     "custom",
2226     "custom element 46"
2227   },
2228   {
2229     "custom_47",
2230     "custom",
2231     "custom element 47"
2232   },
2233   {
2234     "custom_48",
2235     "custom",
2236     "custom element 48"
2237   },
2238   {
2239     "custom_49",
2240     "custom",
2241     "custom element 49"
2242   },
2243   {
2244     "custom_50",
2245     "custom",
2246     "custom element 50"
2247   },
2248   {
2249     "custom_51",
2250     "custom",
2251     "custom element 51"
2252   },
2253   {
2254     "custom_52",
2255     "custom",
2256     "custom element 52"
2257   },
2258   {
2259     "custom_53",
2260     "custom",
2261     "custom element 53"
2262   },
2263   {
2264     "custom_54",
2265     "custom",
2266     "custom element 54"
2267   },
2268   {
2269     "custom_55",
2270     "custom",
2271     "custom element 55"
2272   },
2273   {
2274     "custom_56",
2275     "custom",
2276     "custom element 56"
2277   },
2278   {
2279     "custom_57",
2280     "custom",
2281     "custom element 57"
2282   },
2283   {
2284     "custom_58",
2285     "custom",
2286     "custom element 58"
2287   },
2288   {
2289     "custom_59",
2290     "custom",
2291     "custom element 59"
2292   },
2293   {
2294     "custom_60",
2295     "custom",
2296     "custom element 60"
2297   },
2298   {
2299     "custom_61",
2300     "custom",
2301     "custom element 61"
2302   },
2303   {
2304     "custom_62",
2305     "custom",
2306     "custom element 62"
2307   },
2308   {
2309     "custom_63",
2310     "custom",
2311     "custom element 63"
2312   },
2313   {
2314     "custom_64",
2315     "custom",
2316     "custom element 64"
2317   },
2318   {
2319     "custom_65",
2320     "custom",
2321     "custom element 65"
2322   },
2323   {
2324     "custom_66",
2325     "custom",
2326     "custom element 66"
2327   },
2328   {
2329     "custom_67",
2330     "custom",
2331     "custom element 67"
2332   },
2333   {
2334     "custom_68",
2335     "custom",
2336     "custom element 68"
2337   },
2338   {
2339     "custom_69",
2340     "custom",
2341     "custom element 69"
2342   },
2343   {
2344     "custom_70",
2345     "custom",
2346     "custom element 70"
2347   },
2348   {
2349     "custom_71",
2350     "custom",
2351     "custom element 71"
2352   },
2353   {
2354     "custom_72",
2355     "custom",
2356     "custom element 72"
2357   },
2358   {
2359     "custom_73",
2360     "custom",
2361     "custom element 73"
2362   },
2363   {
2364     "custom_74",
2365     "custom",
2366     "custom element 74"
2367   },
2368   {
2369     "custom_75",
2370     "custom",
2371     "custom element 75"
2372   },
2373   {
2374     "custom_76",
2375     "custom",
2376     "custom element 76"
2377   },
2378   {
2379     "custom_77",
2380     "custom",
2381     "custom element 77"
2382   },
2383   {
2384     "custom_78",
2385     "custom",
2386     "custom element 78"
2387   },
2388   {
2389     "custom_79",
2390     "custom",
2391     "custom element 79"
2392   },
2393   {
2394     "custom_80",
2395     "custom",
2396     "custom element 80"
2397   },
2398   {
2399     "custom_81",
2400     "custom",
2401     "custom element 81"
2402   },
2403   {
2404     "custom_82",
2405     "custom",
2406     "custom element 82"
2407   },
2408   {
2409     "custom_83",
2410     "custom",
2411     "custom element 83"
2412   },
2413   {
2414     "custom_84",
2415     "custom",
2416     "custom element 84"
2417   },
2418   {
2419     "custom_85",
2420     "custom",
2421     "custom element 85"
2422   },
2423   {
2424     "custom_86",
2425     "custom",
2426     "custom element 86"
2427   },
2428   {
2429     "custom_87",
2430     "custom",
2431     "custom element 87"
2432   },
2433   {
2434     "custom_88",
2435     "custom",
2436     "custom element 88"
2437   },
2438   {
2439     "custom_89",
2440     "custom",
2441     "custom element 89"
2442   },
2443   {
2444     "custom_90",
2445     "custom",
2446     "custom element 90"
2447   },
2448   {
2449     "custom_91",
2450     "custom",
2451     "custom element 91"
2452   },
2453   {
2454     "custom_92",
2455     "custom",
2456     "custom element 92"
2457   },
2458   {
2459     "custom_93",
2460     "custom",
2461     "custom element 93"
2462   },
2463   {
2464     "custom_94",
2465     "custom",
2466     "custom element 94"
2467   },
2468   {
2469     "custom_95",
2470     "custom",
2471     "custom element 95"
2472   },
2473   {
2474     "custom_96",
2475     "custom",
2476     "custom element 96"
2477   },
2478   {
2479     "custom_97",
2480     "custom",
2481     "custom element 97"
2482   },
2483   {
2484     "custom_98",
2485     "custom",
2486     "custom element 98"
2487   },
2488   {
2489     "custom_99",
2490     "custom",
2491     "custom element 99"
2492   },
2493   {
2494     "custom_100",
2495     "custom",
2496     "custom element 100"
2497   },
2498   {
2499     "custom_101",
2500     "custom",
2501     "custom element 101"
2502   },
2503   {
2504     "custom_102",
2505     "custom",
2506     "custom element 102"
2507   },
2508   {
2509     "custom_103",
2510     "custom",
2511     "custom element 103"
2512   },
2513   {
2514     "custom_104",
2515     "custom",
2516     "custom element 104"
2517   },
2518   {
2519     "custom_105",
2520     "custom",
2521     "custom element 105"
2522   },
2523   {
2524     "custom_106",
2525     "custom",
2526     "custom element 106"
2527   },
2528   {
2529     "custom_107",
2530     "custom",
2531     "custom element 107"
2532   },
2533   {
2534     "custom_108",
2535     "custom",
2536     "custom element 108"
2537   },
2538   {
2539     "custom_109",
2540     "custom",
2541     "custom element 109"
2542   },
2543   {
2544     "custom_110",
2545     "custom",
2546     "custom element 110"
2547   },
2548   {
2549     "custom_111",
2550     "custom",
2551     "custom element 111"
2552   },
2553   {
2554     "custom_112",
2555     "custom",
2556     "custom element 112"
2557   },
2558   {
2559     "custom_113",
2560     "custom",
2561     "custom element 113"
2562   },
2563   {
2564     "custom_114",
2565     "custom",
2566     "custom element 114"
2567   },
2568   {
2569     "custom_115",
2570     "custom",
2571     "custom element 115"
2572   },
2573   {
2574     "custom_116",
2575     "custom",
2576     "custom element 116"
2577   },
2578   {
2579     "custom_117",
2580     "custom",
2581     "custom element 117"
2582   },
2583   {
2584     "custom_118",
2585     "custom",
2586     "custom element 118"
2587   },
2588   {
2589     "custom_119",
2590     "custom",
2591     "custom element 119"
2592   },
2593   {
2594     "custom_120",
2595     "custom",
2596     "custom element 120"
2597   },
2598   {
2599     "custom_121",
2600     "custom",
2601     "custom element 121"
2602   },
2603   {
2604     "custom_122",
2605     "custom",
2606     "custom element 122"
2607   },
2608   {
2609     "custom_123",
2610     "custom",
2611     "custom element 123"
2612   },
2613   {
2614     "custom_124",
2615     "custom",
2616     "custom element 124"
2617   },
2618   {
2619     "custom_125",
2620     "custom",
2621     "custom element 125"
2622   },
2623   {
2624     "custom_126",
2625     "custom",
2626     "custom element 126"
2627   },
2628   {
2629     "custom_127",
2630     "custom",
2631     "custom element 127"
2632   },
2633   {
2634     "custom_128",
2635     "custom",
2636     "custom element 128"
2637   },
2638   {
2639     "custom_129",
2640     "custom",
2641     "custom element 129"
2642   },
2643   {
2644     "custom_130",
2645     "custom",
2646     "custom element 130"
2647   },
2648   {
2649     "custom_131",
2650     "custom",
2651     "custom element 131"
2652   },
2653   {
2654     "custom_132",
2655     "custom",
2656     "custom element 132"
2657   },
2658   {
2659     "custom_133",
2660     "custom",
2661     "custom element 133"
2662   },
2663   {
2664     "custom_134",
2665     "custom",
2666     "custom element 134"
2667   },
2668   {
2669     "custom_135",
2670     "custom",
2671     "custom element 135"
2672   },
2673   {
2674     "custom_136",
2675     "custom",
2676     "custom element 136"
2677   },
2678   {
2679     "custom_137",
2680     "custom",
2681     "custom element 137"
2682   },
2683   {
2684     "custom_138",
2685     "custom",
2686     "custom element 138"
2687   },
2688   {
2689     "custom_139",
2690     "custom",
2691     "custom element 139"
2692   },
2693   {
2694     "custom_140",
2695     "custom",
2696     "custom element 140"
2697   },
2698   {
2699     "custom_141",
2700     "custom",
2701     "custom element 141"
2702   },
2703   {
2704     "custom_142",
2705     "custom",
2706     "custom element 142"
2707   },
2708   {
2709     "custom_143",
2710     "custom",
2711     "custom element 143"
2712   },
2713   {
2714     "custom_144",
2715     "custom",
2716     "custom element 144"
2717   },
2718   {
2719     "custom_145",
2720     "custom",
2721     "custom element 145"
2722   },
2723   {
2724     "custom_146",
2725     "custom",
2726     "custom element 146"
2727   },
2728   {
2729     "custom_147",
2730     "custom",
2731     "custom element 147"
2732   },
2733   {
2734     "custom_148",
2735     "custom",
2736     "custom element 148"
2737   },
2738   {
2739     "custom_149",
2740     "custom",
2741     "custom element 149"
2742   },
2743   {
2744     "custom_150",
2745     "custom",
2746     "custom element 150"
2747   },
2748   {
2749     "custom_151",
2750     "custom",
2751     "custom element 151"
2752   },
2753   {
2754     "custom_152",
2755     "custom",
2756     "custom element 152"
2757   },
2758   {
2759     "custom_153",
2760     "custom",
2761     "custom element 153"
2762   },
2763   {
2764     "custom_154",
2765     "custom",
2766     "custom element 154"
2767   },
2768   {
2769     "custom_155",
2770     "custom",
2771     "custom element 155"
2772   },
2773   {
2774     "custom_156",
2775     "custom",
2776     "custom element 156"
2777   },
2778   {
2779     "custom_157",
2780     "custom",
2781     "custom element 157"
2782   },
2783   {
2784     "custom_158",
2785     "custom",
2786     "custom element 158"
2787   },
2788   {
2789     "custom_159",
2790     "custom",
2791     "custom element 159"
2792   },
2793   {
2794     "custom_160",
2795     "custom",
2796     "custom element 160"
2797   },
2798   {
2799     "custom_161",
2800     "custom",
2801     "custom element 161"
2802   },
2803   {
2804     "custom_162",
2805     "custom",
2806     "custom element 162"
2807   },
2808   {
2809     "custom_163",
2810     "custom",
2811     "custom element 163"
2812   },
2813   {
2814     "custom_164",
2815     "custom",
2816     "custom element 164"
2817   },
2818   {
2819     "custom_165",
2820     "custom",
2821     "custom element 165"
2822   },
2823   {
2824     "custom_166",
2825     "custom",
2826     "custom element 166"
2827   },
2828   {
2829     "custom_167",
2830     "custom",
2831     "custom element 167"
2832   },
2833   {
2834     "custom_168",
2835     "custom",
2836     "custom element 168"
2837   },
2838   {
2839     "custom_169",
2840     "custom",
2841     "custom element 169"
2842   },
2843   {
2844     "custom_170",
2845     "custom",
2846     "custom element 170"
2847   },
2848   {
2849     "custom_171",
2850     "custom",
2851     "custom element 171"
2852   },
2853   {
2854     "custom_172",
2855     "custom",
2856     "custom element 172"
2857   },
2858   {
2859     "custom_173",
2860     "custom",
2861     "custom element 173"
2862   },
2863   {
2864     "custom_174",
2865     "custom",
2866     "custom element 174"
2867   },
2868   {
2869     "custom_175",
2870     "custom",
2871     "custom element 175"
2872   },
2873   {
2874     "custom_176",
2875     "custom",
2876     "custom element 176"
2877   },
2878   {
2879     "custom_177",
2880     "custom",
2881     "custom element 177"
2882   },
2883   {
2884     "custom_178",
2885     "custom",
2886     "custom element 178"
2887   },
2888   {
2889     "custom_179",
2890     "custom",
2891     "custom element 179"
2892   },
2893   {
2894     "custom_180",
2895     "custom",
2896     "custom element 180"
2897   },
2898   {
2899     "custom_181",
2900     "custom",
2901     "custom element 181"
2902   },
2903   {
2904     "custom_182",
2905     "custom",
2906     "custom element 182"
2907   },
2908   {
2909     "custom_183",
2910     "custom",
2911     "custom element 183"
2912   },
2913   {
2914     "custom_184",
2915     "custom",
2916     "custom element 184"
2917   },
2918   {
2919     "custom_185",
2920     "custom",
2921     "custom element 185"
2922   },
2923   {
2924     "custom_186",
2925     "custom",
2926     "custom element 186"
2927   },
2928   {
2929     "custom_187",
2930     "custom",
2931     "custom element 187"
2932   },
2933   {
2934     "custom_188",
2935     "custom",
2936     "custom element 188"
2937   },
2938   {
2939     "custom_189",
2940     "custom",
2941     "custom element 189"
2942   },
2943   {
2944     "custom_190",
2945     "custom",
2946     "custom element 190"
2947   },
2948   {
2949     "custom_191",
2950     "custom",
2951     "custom element 191"
2952   },
2953   {
2954     "custom_192",
2955     "custom",
2956     "custom element 192"
2957   },
2958   {
2959     "custom_193",
2960     "custom",
2961     "custom element 193"
2962   },
2963   {
2964     "custom_194",
2965     "custom",
2966     "custom element 194"
2967   },
2968   {
2969     "custom_195",
2970     "custom",
2971     "custom element 195"
2972   },
2973   {
2974     "custom_196",
2975     "custom",
2976     "custom element 196"
2977   },
2978   {
2979     "custom_197",
2980     "custom",
2981     "custom element 197"
2982   },
2983   {
2984     "custom_198",
2985     "custom",
2986     "custom element 198"
2987   },
2988   {
2989     "custom_199",
2990     "custom",
2991     "custom element 199"
2992   },
2993   {
2994     "custom_200",
2995     "custom",
2996     "custom element 200"
2997   },
2998   {
2999     "custom_201",
3000     "custom",
3001     "custom element 201"
3002   },
3003   {
3004     "custom_202",
3005     "custom",
3006     "custom element 202"
3007   },
3008   {
3009     "custom_203",
3010     "custom",
3011     "custom element 203"
3012   },
3013   {
3014     "custom_204",
3015     "custom",
3016     "custom element 204"
3017   },
3018   {
3019     "custom_205",
3020     "custom",
3021     "custom element 205"
3022   },
3023   {
3024     "custom_206",
3025     "custom",
3026     "custom element 206"
3027   },
3028   {
3029     "custom_207",
3030     "custom",
3031     "custom element 207"
3032   },
3033   {
3034     "custom_208",
3035     "custom",
3036     "custom element 208"
3037   },
3038   {
3039     "custom_209",
3040     "custom",
3041     "custom element 209"
3042   },
3043   {
3044     "custom_210",
3045     "custom",
3046     "custom element 210"
3047   },
3048   {
3049     "custom_211",
3050     "custom",
3051     "custom element 211"
3052   },
3053   {
3054     "custom_212",
3055     "custom",
3056     "custom element 212"
3057   },
3058   {
3059     "custom_213",
3060     "custom",
3061     "custom element 213"
3062   },
3063   {
3064     "custom_214",
3065     "custom",
3066     "custom element 214"
3067   },
3068   {
3069     "custom_215",
3070     "custom",
3071     "custom element 215"
3072   },
3073   {
3074     "custom_216",
3075     "custom",
3076     "custom element 216"
3077   },
3078   {
3079     "custom_217",
3080     "custom",
3081     "custom element 217"
3082   },
3083   {
3084     "custom_218",
3085     "custom",
3086     "custom element 218"
3087   },
3088   {
3089     "custom_219",
3090     "custom",
3091     "custom element 219"
3092   },
3093   {
3094     "custom_220",
3095     "custom",
3096     "custom element 220"
3097   },
3098   {
3099     "custom_221",
3100     "custom",
3101     "custom element 221"
3102   },
3103   {
3104     "custom_222",
3105     "custom",
3106     "custom element 222"
3107   },
3108   {
3109     "custom_223",
3110     "custom",
3111     "custom element 223"
3112   },
3113   {
3114     "custom_224",
3115     "custom",
3116     "custom element 224"
3117   },
3118   {
3119     "custom_225",
3120     "custom",
3121     "custom element 225"
3122   },
3123   {
3124     "custom_226",
3125     "custom",
3126     "custom element 226"
3127   },
3128   {
3129     "custom_227",
3130     "custom",
3131     "custom element 227"
3132   },
3133   {
3134     "custom_228",
3135     "custom",
3136     "custom element 228"
3137   },
3138   {
3139     "custom_229",
3140     "custom",
3141     "custom element 229"
3142   },
3143   {
3144     "custom_230",
3145     "custom",
3146     "custom element 230"
3147   },
3148   {
3149     "custom_231",
3150     "custom",
3151     "custom element 231"
3152   },
3153   {
3154     "custom_232",
3155     "custom",
3156     "custom element 232"
3157   },
3158   {
3159     "custom_233",
3160     "custom",
3161     "custom element 233"
3162   },
3163   {
3164     "custom_234",
3165     "custom",
3166     "custom element 234"
3167   },
3168   {
3169     "custom_235",
3170     "custom",
3171     "custom element 235"
3172   },
3173   {
3174     "custom_236",
3175     "custom",
3176     "custom element 236"
3177   },
3178   {
3179     "custom_237",
3180     "custom",
3181     "custom element 237"
3182   },
3183   {
3184     "custom_238",
3185     "custom",
3186     "custom element 238"
3187   },
3188   {
3189     "custom_239",
3190     "custom",
3191     "custom element 239"
3192   },
3193   {
3194     "custom_240",
3195     "custom",
3196     "custom element 240"
3197   },
3198   {
3199     "custom_241",
3200     "custom",
3201     "custom element 241"
3202   },
3203   {
3204     "custom_242",
3205     "custom",
3206     "custom element 242"
3207   },
3208   {
3209     "custom_243",
3210     "custom",
3211     "custom element 243"
3212   },
3213   {
3214     "custom_244",
3215     "custom",
3216     "custom element 244"
3217   },
3218   {
3219     "custom_245",
3220     "custom",
3221     "custom element 245"
3222   },
3223   {
3224     "custom_246",
3225     "custom",
3226     "custom element 246"
3227   },
3228   {
3229     "custom_247",
3230     "custom",
3231     "custom element 247"
3232   },
3233   {
3234     "custom_248",
3235     "custom",
3236     "custom element 248"
3237   },
3238   {
3239     "custom_249",
3240     "custom",
3241     "custom element 249"
3242   },
3243   {
3244     "custom_250",
3245     "custom",
3246     "custom element 250"
3247   },
3248   {
3249     "custom_251",
3250     "custom",
3251     "custom element 251"
3252   },
3253   {
3254     "custom_252",
3255     "custom",
3256     "custom element 252"
3257   },
3258   {
3259     "custom_253",
3260     "custom",
3261     "custom element 253"
3262   },
3263   {
3264     "custom_254",
3265     "custom",
3266     "custom element 254"
3267   },
3268   {
3269     "custom_255",
3270     "custom",
3271     "custom element 255"
3272   },
3273   {
3274     "custom_256",
3275     "custom",
3276     "custom element 256"
3277   },
3278   {
3279     "em_key_1",
3280     "key",
3281     "key 1 (EM style)"
3282     },
3283   {
3284     "em_key_2",
3285     "key",
3286     "key 2 (EM style)"
3287     },
3288   {
3289     "em_key_3",
3290     "key",
3291     "key 3 (EM style)"
3292   },
3293   {
3294     "em_key_4",
3295     "key",
3296     "key 4 (EM style)"
3297   },
3298   {
3299     "envelope_1",
3300     "envelope",
3301     "mail envelope 1"
3302   },
3303   {
3304     "envelope_2",
3305     "envelope",
3306     "mail envelope 2"
3307   },
3308   {
3309     "envelope_3",
3310     "envelope",
3311     "mail envelope 3"
3312   },
3313   {
3314     "envelope_4",
3315     "envelope",
3316     "mail envelope 4"
3317   },
3318   {
3319     "group_1",
3320     "group",
3321     "group element 1"
3322   },
3323   {
3324     "group_2",
3325     "group",
3326     "group element 2"
3327   },
3328   {
3329     "group_3",
3330     "group",
3331     "group element 3"
3332   },
3333   {
3334     "group_4",
3335     "group",
3336     "group element 4"
3337   },
3338   {
3339     "group_5",
3340     "group",
3341     "group element 5"
3342   },
3343   {
3344     "group_6",
3345     "group",
3346     "group element 6"
3347   },
3348   {
3349     "group_7",
3350     "group",
3351     "group element 7"
3352   },
3353   {
3354     "group_8",
3355     "group",
3356     "group element 8"
3357   },
3358   {
3359     "group_9",
3360     "group",
3361     "group element 9"
3362   },
3363   {
3364     "group_10",
3365     "group",
3366     "group element 10"
3367   },
3368   {
3369     "group_11",
3370     "group",
3371     "group element 11"
3372   },
3373   {
3374     "group_12",
3375     "group",
3376     "group element 12"
3377   },
3378   {
3379     "group_13",
3380     "group",
3381     "group element 13"
3382   },
3383   {
3384     "group_14",
3385     "group",
3386     "group element 14"
3387   },
3388   {
3389     "group_15",
3390     "group",
3391     "group element 15"
3392   },
3393   {
3394     "group_16",
3395     "group",
3396     "group element 16"
3397   },
3398   {
3399     "group_17",
3400     "group",
3401     "group element 17"
3402   },
3403   {
3404     "group_18",
3405     "group",
3406     "group element 18"
3407   },
3408   {
3409     "group_19",
3410     "group",
3411     "group element 19"
3412   },
3413   {
3414     "group_20",
3415     "group",
3416     "group element 20"
3417   },
3418   {
3419     "group_21",
3420     "group",
3421     "group element 21"
3422   },
3423   {
3424     "group_22",
3425     "group",
3426     "group element 22"
3427   },
3428   {
3429     "group_23",
3430     "group",
3431     "group element 23"
3432   },
3433   {
3434     "group_24",
3435     "group",
3436     "group element 24"
3437   },
3438   {
3439     "group_25",
3440     "group",
3441     "group element 25"
3442   },
3443   {
3444     "group_26",
3445     "group",
3446     "group element 26"
3447   },
3448   {
3449     "group_27",
3450     "group",
3451     "group element 27"
3452   },
3453   {
3454     "group_28",
3455     "group",
3456     "group element 28"
3457   },
3458   {
3459     "group_29",
3460     "group",
3461     "group element 29"
3462   },
3463   {
3464     "group_30",
3465     "group",
3466     "group element 30"
3467   },
3468   {
3469     "group_31",
3470     "group",
3471     "group element 31"
3472   },
3473   {
3474     "group_32",
3475     "group",
3476     "group element 32"
3477   },
3478   {
3479     "unknown",
3480     "unknown",
3481     "unknown element"
3482   },
3483   {
3484     "trigger_element",
3485     "trigger",
3486     "element triggering change"
3487   },
3488   {
3489     "trigger_player",
3490     "trigger",
3491     "player triggering change"
3492   },
3493   {
3494     "sp_gravity_on_port_right",
3495     "sp_gravity_on_port",
3496     "gravity-on port (leading right)"
3497   },
3498   {
3499     "sp_gravity_on_port_down",
3500     "sp_gravity_on_port",
3501     "gravity-on port (leading down)"
3502   },
3503   {
3504     "sp_gravity_on_port_left",
3505     "sp_gravity_on_port",
3506     "gravity-on port (leading left)"
3507   },
3508   {
3509     "sp_gravity_on_port_up",
3510     "sp_gravity_on_port",
3511     "gravity-on port (leading up)"
3512   },
3513   {
3514     "sp_gravity_off_port_right",
3515     "sp_gravity_off_port",
3516     "gravity-off port (leading right)"
3517   },
3518   {
3519     "sp_gravity_off_port_down",
3520     "sp_gravity_off_port",
3521     "gravity-off port (leading down)"
3522   },
3523   {
3524     "sp_gravity_off_port_left",
3525     "sp_gravity_off_port",
3526     "gravity-off port (leading left)"
3527   },
3528   {
3529     "sp_gravity_off_port_up",
3530     "sp_gravity_off_port",
3531     "gravity-off port (leading up)"
3532   },
3533   {
3534     "balloon_switch_none",
3535     "balloon_switch",
3536     "wind switch (off)"
3537   },
3538   {
3539     "emc_gate_5",
3540     "gate",
3541     "door 5 (EMC style)",
3542   },
3543   {
3544     "emc_gate_6",
3545     "gate",
3546     "door 6 (EMC style)",
3547   },
3548   {
3549     "emc_gate_7",
3550     "gate",
3551     "door 7 (EMC style)",
3552   },
3553   {
3554     "emc_gate_8",
3555     "gate",
3556     "door 8 (EMC style)",
3557   },
3558   {
3559     "emc_gate_5_gray",
3560     "gate",
3561     "gray door (EMC style, key 5)",
3562   },
3563   {
3564     "emc_gate_6_gray",
3565     "gate",
3566     "gray door (EMC style, key 6)",
3567   },
3568   {
3569     "emc_gate_7_gray",
3570     "gate",
3571     "gray door (EMC style, key 7)",
3572   },
3573   {
3574     "emc_gate_8_gray",
3575     "gate",
3576     "gray door (EMC style, key 8)",
3577   },
3578   {
3579     "emc_key_5",
3580     "key",
3581     "key 5 (EMC style)",
3582   },
3583   {
3584     "emc_key_6",
3585     "key",
3586     "key 6 (EMC style)",
3587   },
3588   {
3589     "emc_key_7",
3590     "key",
3591     "key 7 (EMC style)",
3592   },
3593   {
3594     "emc_key_8",
3595     "key",
3596     "key 8 (EMC style)",
3597   },
3598   {
3599     "emc_android",
3600     "emc_android",
3601     "android",
3602   },
3603   {
3604     "emc_grass",
3605     "emc_grass",
3606     "grass",
3607   },
3608   {
3609     "emc_magic_ball",
3610     "emc_magic_ball",
3611     "magic ball",
3612   },
3613   {
3614     "emc_magic_ball.active",
3615     "emc_magic_ball",
3616     "magic ball (activated)",
3617   },
3618   {
3619     "emc_magic_ball_switch",
3620     "emc_magic_ball_switch",
3621     "magic ball switch (off)",
3622   },
3623   {
3624     "emc_magic_ball_switch.active",
3625     "emc_magic_ball_switch",
3626     "magic ball switch (on)",
3627   },
3628   {
3629     "emc_spring_bumper",
3630     "emc_spring_bumper",
3631     "spring bumper",
3632   },
3633   {
3634     "emc_plant",
3635     "emc_plant",
3636     "plant",
3637   },
3638   {
3639     "emc_lenses",
3640     "emc_lenses",
3641     "lenses",
3642   },
3643   {
3644     "emc_magnifier",
3645     "emc_magnifier",
3646     "magnifier",
3647   },
3648   {
3649     "emc_wall_9",
3650     "wall",
3651     "normal wall 9 (EMC style)"
3652   },
3653   {
3654     "emc_wall_10",
3655     "wall",
3656     "normal wall 10 (EMC style)"
3657   },
3658   {
3659     "emc_wall_11",
3660     "wall",
3661     "normal wall 11 (EMC style)"
3662   },
3663   {
3664     "emc_wall_12",
3665     "wall",
3666     "normal wall 12 (EMC style)"
3667   },
3668   {
3669     "emc_wall_13",
3670     "wall",
3671     "normal wall 13 (EMC style)"
3672   },
3673   {
3674     "emc_wall_14",
3675     "wall",
3676     "normal wall 14 (EMC style)"
3677   },
3678   {
3679     "emc_wall_15",
3680     "wall",
3681     "normal wall 15 (EMC style)"
3682   },
3683   {
3684     "emc_wall_16",
3685     "wall",
3686     "normal wall 16 (EMC style)"
3687   },
3688   {
3689     "emc_wall_slippery_1",
3690     "wall",
3691     "slippery wall 1 (EMC style)"
3692   },
3693   {
3694     "emc_wall_slippery_2",
3695     "wall",
3696     "slippery wall 2 (EMC style)"
3697   },
3698   {
3699     "emc_wall_slippery_3",
3700     "wall",
3701     "slippery wall 3 (EMC style)"
3702   },
3703   {
3704     "emc_wall_slippery_4",
3705     "wall",
3706     "slippery wall 4 (EMC style)"
3707   },
3708   {
3709     "emc_fake_grass",
3710     "fake_grass",
3711     "fake grass"
3712   },
3713   {
3714     "emc_fake_acid",
3715     "fake_acid",
3716     "fake acid"
3717   },
3718   {
3719     "emc_dripper",
3720     "dripper",
3721     "dripper"
3722   },
3723   {
3724     "trigger_ce_value",
3725     "trigger",
3726     "CE value of element triggering change"
3727   },
3728   {
3729     "trigger_ce_score",
3730     "trigger",
3731     "CE score of element triggering change"
3732   },
3733   {
3734     "current_ce_value",
3735     "current",
3736     "CE value of current element"
3737   },
3738   {
3739     "current_ce_score",
3740     "current",
3741     "CE score of current element"
3742   },
3743   {
3744     "yamyam.left",
3745     "yamyam",
3746     "yam yam (starts moving left)"
3747   },
3748   {
3749     "yamyam.right",
3750     "yamyam",
3751     "yam yam (starts moving right)"
3752   },
3753   {
3754     "yamyam.up",
3755     "yamyam",
3756     "yam yam (starts moving up)"
3757   },
3758   {
3759     "yamyam.down",
3760     "yamyam",
3761     "yam yam (starts moving down)"
3762   },
3763   {
3764     "bd_expandable_wall",
3765     "wall",
3766     "growing wall (horizontal, BD style)"
3767   },
3768   {
3769     "prev_ce_8",
3770     "prev_ce",
3771     "CE 8 positions earlier in list"
3772   },
3773   {
3774     "prev_ce_7",
3775     "prev_ce",
3776     "CE 7 positions earlier in list"
3777   },
3778   {
3779     "prev_ce_6",
3780     "prev_ce",
3781     "CE 6 positions earlier in list"
3782   },
3783   {
3784     "prev_ce_5",
3785     "prev_ce",
3786     "CE 5 positions earlier in list"
3787   },
3788   {
3789     "prev_ce_4",
3790     "prev_ce",
3791     "CE 4 positions earlier in list"
3792   },
3793   {
3794     "prev_ce_3",
3795     "prev_ce",
3796     "CE 3 positions earlier in list"
3797   },
3798   {
3799     "prev_ce_2",
3800     "prev_ce",
3801     "CE 2 positions earlier in list"
3802   },
3803   {
3804     "prev_ce_1",
3805     "prev_ce",
3806     "CE 1 position earlier in list"
3807   },
3808   {
3809     "self",
3810     "self",
3811     "the current custom element"
3812   },
3813   {
3814     "next_ce_1",
3815     "next_ce",
3816     "CE 1 position later in list"
3817   },
3818   {
3819     "next_ce_2",
3820     "next_ce",
3821     "CE 2 positions later in list"
3822   },
3823   {
3824     "next_ce_3",
3825     "next_ce",
3826     "CE 3 positions later in list"
3827   },
3828   {
3829     "next_ce_4",
3830     "next_ce",
3831     "CE 4 positions later in list"
3832   },
3833   {
3834     "next_ce_5",
3835     "next_ce",
3836     "CE 5 positions later in list"
3837   },
3838   {
3839     "next_ce_6",
3840     "next_ce",
3841     "CE 6 positions later in list"
3842   },
3843   {
3844     "next_ce_7",
3845     "next_ce",
3846     "CE 7 positions later in list"
3847   },
3848   {
3849     "next_ce_8",
3850     "next_ce",
3851     "CE 8 positions later in list"
3852   },
3853   {
3854     "any_element",
3855     "any_element",
3856     "this element matches any element"
3857   },
3858   {
3859     "steel_char_space",
3860     "steel_char",
3861     "steel letter ' '"
3862   },
3863   {
3864     "steel_char_exclam",
3865     "steel_char",
3866     "steel letter '!'"
3867   },
3868   {
3869     "steel_char_quotedbl",
3870     "steel_char",
3871     "steel letter '\"'"
3872   },
3873   {
3874     "steel_char_numbersign",
3875     "steel_char",
3876     "steel letter '#'"
3877   },
3878   {
3879     "steel_char_dollar",
3880     "steel_char",
3881     "steel letter '$'"
3882   },
3883   {
3884     "steel_char_percent",
3885     "steel_char",
3886     "steel letter '%'"
3887   },
3888   {
3889     "steel_char_ampersand",
3890     "steel_char",
3891     "steel letter '&'"
3892   },
3893   {
3894     "steel_char_apostrophe",
3895     "steel_char",
3896     "steel letter '''"
3897   },
3898   {
3899     "steel_char_parenleft",
3900     "steel_char",
3901     "steel letter '('"
3902   },
3903   {
3904     "steel_char_parenright",
3905     "steel_char",
3906     "steel letter ')'"
3907   },
3908   {
3909     "steel_char_asterisk",
3910     "steel_char",
3911     "steel letter '*'"
3912   },
3913   {
3914     "steel_char_plus",
3915     "steel_char",
3916     "steel letter '+'"
3917   },
3918   {
3919     "steel_char_comma",
3920     "steel_char",
3921     "steel letter ','"
3922   },
3923   {
3924     "steel_char_minus",
3925     "steel_char",
3926     "steel letter '-'"
3927   },
3928   {
3929     "steel_char_period",
3930     "steel_char",
3931     "steel letter '.'"
3932   },
3933   {
3934     "steel_char_slash",
3935     "steel_char",
3936     "steel letter '/'"
3937   },
3938   {
3939     "steel_char_0",
3940     "steel_char",
3941     "steel letter '0'"
3942   },
3943   {
3944     "steel_char_1",
3945     "steel_char",
3946     "steel letter '1'"
3947   },
3948   {
3949     "steel_char_2",
3950     "steel_char",
3951     "steel letter '2'"
3952   },
3953   {
3954     "steel_char_3",
3955     "steel_char",
3956     "steel letter '3'"
3957   },
3958   {
3959     "steel_char_4",
3960     "steel_char",
3961     "steel letter '4'"
3962   },
3963   {
3964     "steel_char_5",
3965     "steel_char",
3966     "steel letter '5'"
3967   },
3968   {
3969     "steel_char_6",
3970     "steel_char",
3971     "steel letter '6'"
3972   },
3973   {
3974     "steel_char_7",
3975     "steel_char",
3976     "steel letter '7'"
3977   },
3978   {
3979     "steel_char_8",
3980     "steel_char",
3981     "steel letter '8'"
3982   },
3983   {
3984     "steel_char_9",
3985     "steel_char",
3986     "steel letter '9'"
3987   },
3988   {
3989     "steel_char_colon",
3990     "steel_char",
3991     "steel letter ':'"
3992   },
3993   {
3994     "steel_char_semicolon",
3995     "steel_char",
3996     "steel letter ';'"
3997   },
3998   {
3999     "steel_char_less",
4000     "steel_char",
4001     "steel letter '<'"
4002   },
4003   {
4004     "steel_char_equal",
4005     "steel_char",
4006     "steel letter '='"
4007   },
4008   {
4009     "steel_char_greater",
4010     "steel_char",
4011     "steel letter '>'"
4012   },
4013   {
4014     "steel_char_question",
4015     "steel_char",
4016     "steel letter '?'"
4017   },
4018   {
4019     "steel_char_at",
4020     "steel_char",
4021     "steel letter '@'"
4022   },
4023   {
4024     "steel_char_a",
4025     "steel_char",
4026     "steel letter 'A'"
4027   },
4028   {
4029     "steel_char_b",
4030     "steel_char",
4031     "steel letter 'B'"
4032   },
4033   {
4034     "steel_char_c",
4035     "steel_char",
4036     "steel letter 'C'"
4037   },
4038   {
4039     "steel_char_d",
4040     "steel_char",
4041     "steel letter 'D'"
4042   },
4043   {
4044     "steel_char_e",
4045     "steel_char",
4046     "steel letter 'E'"
4047   },
4048   {
4049     "steel_char_f",
4050     "steel_char",
4051     "steel letter 'F'"
4052   },
4053   {
4054     "steel_char_g",
4055     "steel_char",
4056     "steel letter 'G'"
4057   },
4058   {
4059     "steel_char_h",
4060     "steel_char",
4061     "steel letter 'H'"
4062   },
4063   {
4064     "steel_char_i",
4065     "steel_char",
4066     "steel letter 'I'"
4067   },
4068   {
4069     "steel_char_j",
4070     "steel_char",
4071     "steel letter 'J'"
4072   },
4073   {
4074     "steel_char_k",
4075     "steel_char",
4076     "steel letter 'K'"
4077   },
4078   {
4079     "steel_char_l",
4080     "steel_char",
4081     "steel letter 'L'"
4082   },
4083   {
4084     "steel_char_m",
4085     "steel_char",
4086     "steel letter 'M'"
4087   },
4088   {
4089     "steel_char_n",
4090     "steel_char",
4091     "steel letter 'N'"
4092   },
4093   {
4094     "steel_char_o",
4095     "steel_char",
4096     "steel letter 'O'"
4097   },
4098   {
4099     "steel_char_p",
4100     "steel_char",
4101     "steel letter 'P'"
4102   },
4103   {
4104     "steel_char_q",
4105     "steel_char",
4106     "steel letter 'Q'"
4107   },
4108   {
4109     "steel_char_r",
4110     "steel_char",
4111     "steel letter 'R'"
4112   },
4113   {
4114     "steel_char_s",
4115     "steel_char",
4116     "steel letter 'S'"
4117   },
4118   {
4119     "steel_char_t",
4120     "steel_char",
4121     "steel letter 'T'"
4122   },
4123   {
4124     "steel_char_u",
4125     "steel_char",
4126     "steel letter 'U'"
4127   },
4128   {
4129     "steel_char_v",
4130     "steel_char",
4131     "steel letter 'V'"
4132   },
4133   {
4134     "steel_char_w",
4135     "steel_char",
4136     "steel letter 'W'"
4137   },
4138   {
4139     "steel_char_x",
4140     "steel_char",
4141     "steel letter 'X'"
4142   },
4143   {
4144     "steel_char_y",
4145     "steel_char",
4146     "steel letter 'Y'"
4147   },
4148   {
4149     "steel_char_z",
4150     "steel_char",
4151     "steel letter 'Z'"
4152   },
4153   {
4154     "steel_char_bracketleft",
4155     "steel_char",
4156     "steel letter '['"
4157   },
4158   {
4159     "steel_char_backslash",
4160     "steel_char",
4161     "steel letter '\\'"
4162   },
4163   {
4164     "steel_char_bracketright",
4165     "steel_char",
4166     "steel letter ']'"
4167   },
4168   {
4169     "steel_char_asciicircum",
4170     "steel_char",
4171     "steel letter '^'"
4172   },
4173   {
4174     "steel_char_underscore",
4175     "steel_char",
4176     "steel letter '_'"
4177   },
4178   {
4179     "steel_char_copyright",
4180     "steel_char",
4181     "steel letter '\xa9'"
4182   },
4183   {
4184     "steel_char_aumlaut",
4185     "steel_char",
4186     "steel letter '\xc4'"
4187   },
4188   {
4189     "steel_char_oumlaut",
4190     "steel_char",
4191     "steel letter '\xd6'"
4192   },
4193   {
4194     "steel_char_uumlaut",
4195     "steel_char",
4196     "steel letter '\xdc'"
4197   },
4198   {
4199     "steel_char_degree",
4200     "steel_char",
4201     "steel letter '\xb0'"
4202   },
4203   {
4204     "steel_char_trademark",
4205     "steel_char",
4206     "steel letter '\xae'"
4207   },
4208   {
4209     "steel_char_cursor",
4210     "steel_char",
4211     "steel letter '\xa0'"
4212   },
4213   {
4214     "steel_char_unused",
4215     "steel_char",
4216     "steel letter ''"
4217   },
4218   {
4219     "steel_char_unused",
4220     "steel_char",
4221     "steel letter ''"
4222   },
4223   {
4224     "steel_char_unused",
4225     "steel_char",
4226     "steel letter ''"
4227   },
4228   {
4229     "steel_char_unused",
4230     "steel_char",
4231     "steel letter ''"
4232   },
4233   {
4234     "steel_char_unused",
4235     "steel_char",
4236     "steel letter ''"
4237   },
4238   {
4239     "steel_char_unused",
4240     "steel_char",
4241     "steel letter ''"
4242   },
4243   {
4244     "steel_char_button",
4245     "steel_char",
4246     "steel letter 'button'"
4247   },
4248   {
4249     "steel_char_up",
4250     "steel_char",
4251     "steel letter 'up'"
4252   },
4253   {
4254     "steel_char_down",
4255     "steel_char",
4256     "steel letter 'down'"
4257   },
4258   {
4259     "sperms",
4260     "frankie",
4261     "sperms"
4262   },
4263   {
4264     "bullet",
4265     "frankie",
4266     "bullet"
4267   },
4268   {
4269     "heart",
4270     "frankie",
4271     "heart"
4272   },
4273   {
4274     "cross",
4275     "frankie",
4276     "cross"
4277   },
4278   {
4279     "frankie",
4280     "frankie",
4281     "frankie"
4282   },
4283   {
4284     "sign_sperms",
4285     "sign",
4286     "sign (sperms)"
4287   },
4288   {
4289     "sign_bullet",
4290     "sign",
4291     "sign (bullet)"
4292   },
4293   {
4294     "sign_heart",
4295     "sign",
4296     "sign (heart)"
4297   },
4298   {
4299     "sign_cross",
4300     "sign",
4301     "sign (cross)"
4302   },
4303   {
4304     "sign_frankie",
4305     "sign",
4306     "sign (frankie)"
4307   },
4308   {
4309     "steel_exit_closed",
4310     "steel_exit",
4311     "closed steel exit"
4312   },
4313   {
4314     "steel_exit_open",
4315     "steel_exit",
4316     "open steel exit"
4317   },
4318   {
4319     "dc_steelwall_1_left",
4320     "steelwall",
4321     "steel wall 1 (left)"
4322   },
4323   {
4324     "dc_steelwall_1_right",
4325     "steelwall",
4326     "steel wall 1 (right)"
4327   },
4328   {
4329     "dc_steelwall_1_top",
4330     "steelwall",
4331     "steel wall 1 (top)"
4332   },
4333   {
4334     "dc_steelwall_1_bottom",
4335     "steelwall",
4336     "steel wall 1 (bottom)"
4337   },
4338   {
4339     "dc_steelwall_1_horizontal",
4340     "steelwall",
4341     "steel wall 1 (top/bottom)"
4342   },
4343   {
4344     "dc_steelwall_1_vertical",
4345     "steelwall",
4346     "steel wall 1 (left/right)"
4347   },
4348   {
4349     "dc_steelwall_1_topleft",
4350     "steelwall",
4351     "steel wall 1 (top/left)"
4352   },
4353   {
4354     "dc_steelwall_1_topright",
4355     "steelwall",
4356     "steel wall 1 (top/right)"
4357   },
4358   {
4359     "dc_steelwall_1_bottomleft",
4360     "steelwall",
4361     "steel wall 1 (bottom/left)"
4362   },
4363   {
4364     "dc_steelwall_1_bottomright",
4365     "steelwall",
4366     "steel wall 1 (bottom/right)"
4367   },
4368   {
4369     "dc_steelwall_1_topleft_2",
4370     "steelwall",
4371     "steel wall 1 (top/left corner)"
4372   },
4373   {
4374     "dc_steelwall_1_topright_2",
4375     "steelwall",
4376     "steel wall 1 (top/right corner)"
4377   },
4378   {
4379     "dc_steelwall_1_bottomleft_2",
4380     "steelwall",
4381     "steel wall 1 (bottom/left corner)"
4382   },
4383   {
4384     "dc_steelwall_1_bottomright_2",
4385     "steelwall",
4386     "steel wall 1 (bottom/right corner)"
4387   },
4388   {
4389     "dc_steelwall_2_left",
4390     "steelwall",
4391     "steel wall 2 (left)"
4392   },
4393   {
4394     "dc_steelwall_2_right",
4395     "steelwall",
4396     "steel wall 2 (right)"
4397   },
4398   {
4399     "dc_steelwall_2_top",
4400     "steelwall",
4401     "steel wall 2 (top)"
4402   },
4403   {
4404     "dc_steelwall_2_bottom",
4405     "steelwall",
4406     "steel wall 2 (bottom)"
4407   },
4408   {
4409     "dc_steelwall_2_horizontal",
4410     "steelwall",
4411     "steel wall 2 (horizontal)"
4412   },
4413   {
4414     "dc_steelwall_2_vertical",
4415     "steelwall",
4416     "steel wall 2 (vertical)"
4417   },
4418   {
4419     "dc_steelwall_2_middle",
4420     "steelwall",
4421     "steel wall 2 (middle)"
4422   },
4423   {
4424     "dc_steelwall_2_single",
4425     "steelwall",
4426     "steel wall 2 (single)"
4427   },
4428   {
4429     "dc_switchgate_switch_up",
4430     "switchgate_switch",
4431     "switch for switch gate (steel)"
4432   },
4433   {
4434     "dc_switchgate_switch_down",
4435     "switchgate_switch",
4436     "switch for switch gate (steel)"
4437   },
4438   {
4439     "dc_timegate_switch",
4440     "timegate_switch",
4441     "switch for time gate (steel)"
4442   },
4443   {
4444     "dc_timegate_switch.active",
4445     "timegate_switch",
4446     "switch for time gate (steel)"
4447   },
4448   {
4449     "dc_landmine",
4450     "dc_landmine",
4451     "land mine (DC style, removable)"
4452   },
4453   {
4454     "expandable_steelwall",
4455     "steelwall",
4456     "growing steel wall"
4457   },
4458   {
4459     "expandable_steelwall_horizontal",
4460     "steelwall",
4461     "growing steel wall (horizontal)"
4462   },
4463   {
4464     "expandable_steelwall_vertical",
4465     "steelwall",
4466     "growing steel wall (vertical)"
4467   },
4468   {
4469     "expandable_steelwall_any",
4470     "steelwall",
4471     "growing steel wall (any direction)"
4472   },
4473   {
4474     "em_exit_closed",
4475     "em_exit",
4476     "closed exit (EM style)"
4477   },
4478   {
4479     "em_exit_open",
4480     "em_exit",
4481     "open exit (EM style)"
4482   },
4483   {
4484     "em_steel_exit_closed",
4485     "em_steel_exit",
4486     "closed steel exit (EM style)"
4487   },
4488   {
4489     "em_steel_exit_open",
4490     "em_steel_exit",
4491     "open steel exit (EM style)"
4492   },
4493   {
4494     "dc_gate_fake_gray",
4495     "gate",
4496     "gray door (opened by no key)"
4497   },
4498   {
4499     "dc_magic_wall",
4500     "dc_magic_wall",
4501     "magic wall (DC style)"
4502   },
4503   {
4504     "quicksand_fast_empty",
4505     "quicksand",
4506     "fast quicksand (empty)"
4507   },
4508   {
4509     "quicksand_fast_full",
4510     "quicksand",
4511     "fast quicksand (with rock)"
4512   },
4513   {
4514     "from_level_template",
4515     "from_level_template",
4516     "element taken from level template"
4517   },
4518   {
4519     "mm_empty_space",
4520     "empty_space",
4521     "empty space"
4522   },
4523   {
4524     "mm_mirror_1",
4525     "mm_mirror",
4526     "mirror (0\xb0)"
4527   },
4528   {
4529     "mm_mirror_2",
4530     "mm_mirror",
4531     "mirror (11.25\xb0)"
4532   },
4533   {
4534     "mm_mirror_3",
4535     "mm_mirror",
4536     "mirror (22.5\xb0)"
4537   },
4538   {
4539     "mm_mirror_4",
4540     "mm_mirror",
4541     "mirror (33.75\xb0)"
4542   },
4543   {
4544     "mm_mirror_5",
4545     "mm_mirror",
4546     "mirror (45\xb0)"
4547   },
4548   {
4549     "mm_mirror_6",
4550     "mm_mirror",
4551     "mirror (56.25\xb0)"
4552   },
4553   {
4554     "mm_mirror_7",
4555     "mm_mirror",
4556     "mirror (67.5\xb0)"
4557   },
4558   {
4559     "mm_mirror_8",
4560     "mm_mirror",
4561     "mirror (78.75\xb0)"
4562   },
4563   {
4564     "mm_mirror_9",
4565     "mm_mirror",
4566     "mirror (90\xb0)"
4567   },
4568   {
4569     "mm_mirror_10",
4570     "mm_mirror",
4571     "mirror (101.25\xb0)"
4572   },
4573   {
4574     "mm_mirror_11",
4575     "mm_mirror",
4576     "mirror (112.5\xb0)"
4577   },
4578   {
4579     "mm_mirror_12",
4580     "mm_mirror",
4581     "mirror (123.75\xb0)"
4582   },
4583   {
4584     "mm_mirror_13",
4585     "mm_mirror",
4586     "mirror (135\xb0)"
4587   },
4588   {
4589     "mm_mirror_14",
4590     "mm_mirror",
4591     "mirror (146.25\xb0)"
4592   },
4593   {
4594     "mm_mirror_15",
4595     "mm_mirror",
4596     "mirror (157.5\xb0)"
4597   },
4598   {
4599     "mm_mirror_16",
4600     "mm_mirror",
4601     "mirror (168.75\xb0)"
4602   },
4603   {
4604     "mm_steel_grid_fixed_1",
4605     "mm_steel_grid_fixed",
4606     "fixed steel polarizer (0\xb0)"
4607   },
4608   {
4609     "mm_steel_grid_fixed_2",
4610     "mm_steel_grid_fixed",
4611     "fixed steel polarizer (90\xb0)"
4612   },
4613   {
4614     "mm_steel_grid_fixed_3",
4615     "mm_steel_grid_fixed",
4616     "fixed steel polarizer (45\xb0)"
4617   },
4618   {
4619     "mm_steel_grid_fixed_4",
4620     "mm_steel_grid_fixed",
4621     "fixed steel polarizer (135\xb0)"
4622   },
4623   {
4624     "mm_mcduffin.right",
4625     "mm_mcduffin",
4626     "Gregor McDuffin (looking right)"
4627   },
4628   {
4629     "mm_mcduffin.up",
4630     "mm_mcduffin",
4631     "Gregor McDuffin (looking up)"
4632   },
4633   {
4634     "mm_mcduffin.left",
4635     "mm_mcduffin",
4636     "Gregor McDuffin (looking left)"
4637   },
4638   {
4639     "mm_mcduffin.down",
4640     "mm_mcduffin",
4641     "Gregor McDuffin (looking down)"
4642   },
4643   {
4644     "mm_exit_closed",
4645     "mm_exit",
4646     "closed exit (MM style)"
4647   },
4648   {
4649     "mm_exit_opening_1",
4650     "mm_exit",
4651     "opening exit 1"
4652   },
4653   {
4654     "mm_exit_opening_2",
4655     "mm_exit",
4656     "opening exit 2"
4657   },
4658   {
4659     "mm_exit_open",
4660     "mm_exit",
4661     "open exit (MM style)"
4662   },
4663   {
4664     "mm_kettle",
4665     "mm_kettle",
4666     "magic cauldron"
4667   },
4668   {
4669     "mm_bomb",
4670     "mm_bomb",
4671     "bomb (MM style)"
4672   },
4673   {
4674     "mm_prism",
4675     "mm_prism",
4676     "prism"
4677   },
4678   {
4679     "mm_steel_wall_1",
4680     "mm_steel_wall",
4681     "steel wall 1 (MM style)"
4682   },
4683   {
4684     "mm_steel_wall_2",
4685     "mm_steel_wall",
4686     "steel wall 2 (MM style)"
4687   },
4688   {
4689     "mm_steel_wall_3",
4690     "mm_steel_wall",
4691     "steel wall 3 (MM style)"
4692   },
4693   {
4694     "mm_steel_wall_4",
4695     "mm_steel_wall",
4696     "steel wall 4 (MM style)"
4697   },
4698   {
4699     "mm_steel_wall_5",
4700     "mm_steel_wall",
4701     "steel wall 5 (MM style)"
4702   },
4703   {
4704     "mm_steel_wall_6",
4705     "mm_steel_wall",
4706     "steel wall 6 (MM style)"
4707   },
4708   {
4709     "mm_steel_wall_7",
4710     "mm_steel_wall",
4711     "steel wall 7 (MM style)"
4712   },
4713   {
4714     "mm_steel_wall_8",
4715     "mm_steel_wall",
4716     "steel wall 8 (MM style)"
4717   },
4718   {
4719     "mm_steel_wall_9",
4720     "mm_steel_wall",
4721     "steel wall 9 (MM style)"
4722   },
4723   {
4724     "mm_steel_wall_10",
4725     "mm_steel_wall",
4726     "steel wall 10 (MM style)"
4727   },
4728   {
4729     "mm_steel_wall_11",
4730     "mm_steel_wall",
4731     "steel wall 11 (MM style)"
4732   },
4733   {
4734     "mm_steel_wall_12",
4735     "mm_steel_wall",
4736     "steel wall 12 (MM style)"
4737   },
4738   {
4739     "mm_steel_wall_13",
4740     "mm_steel_wall",
4741     "steel wall 13 (MM style)"
4742   },
4743   {
4744     "mm_steel_wall_14",
4745     "mm_steel_wall",
4746     "steel wall 14 (MM style)"
4747   },
4748   {
4749     "mm_steel_wall_15",
4750     "mm_steel_wall",
4751     "steel wall 15 (MM style)"
4752   },
4753   {
4754     "mm_steel_wall_16",
4755     "mm_steel_wall",
4756     "steel wall 16 (MM style)"
4757   },
4758   {
4759     "mm_wooden_wall_1",
4760     "mm_wooden_wall",
4761     "wooden wall 1 (MM style)"
4762   },
4763   {
4764     "mm_wooden_wall_2",
4765     "mm_wooden_wall",
4766     "wooden wall 2 (MM style)"
4767   },
4768   {
4769     "mm_wooden_wall_3",
4770     "mm_wooden_wall",
4771     "wooden wall 3 (MM style)"
4772   },
4773   {
4774     "mm_wooden_wall_4",
4775     "mm_wooden_wall",
4776     "wooden wall 4 (MM style)"
4777   },
4778   {
4779     "mm_wooden_wall_5",
4780     "mm_wooden_wall",
4781     "wooden wall 5 (MM style)"
4782   },
4783   {
4784     "mm_wooden_wall_6",
4785     "mm_wooden_wall",
4786     "wooden wall 6 (MM style)"
4787   },
4788   {
4789     "mm_wooden_wall_7",
4790     "mm_wooden_wall",
4791     "wooden wall 7 (MM style)"
4792   },
4793   {
4794     "mm_wooden_wall_8",
4795     "mm_wooden_wall",
4796     "wooden wall 8 (MM style)"
4797   },
4798   {
4799     "mm_wooden_wall_9",
4800     "mm_wooden_wall",
4801     "wooden wall 9 (MM style)"
4802   },
4803   {
4804     "mm_wooden_wall_10",
4805     "mm_wooden_wall",
4806     "wooden wall 10 (MM style)"
4807   },
4808   {
4809     "mm_wooden_wall_11",
4810     "mm_wooden_wall",
4811     "wooden wall 11 (MM style)"
4812   },
4813   {
4814     "mm_wooden_wall_12",
4815     "mm_wooden_wall",
4816     "wooden wall 12 (MM style)"
4817   },
4818   {
4819     "mm_wooden_wall_13",
4820     "mm_wooden_wall",
4821     "wooden wall 13 (MM style)"
4822   },
4823   {
4824     "mm_wooden_wall_14",
4825     "mm_wooden_wall",
4826     "wooden wall 14 (MM style)"
4827   },
4828   {
4829     "mm_wooden_wall_15",
4830     "mm_wooden_wall",
4831     "wooden wall 15 (MM style)"
4832   },
4833   {
4834     "mm_wooden_wall_16",
4835     "mm_wooden_wall",
4836     "wooden wall 16 (MM style)"
4837   },
4838   {
4839     "mm_ice_wall_1",
4840     "mm_ice_wall",
4841     "ice wall 1"
4842   },
4843   {
4844     "mm_ice_wall_2",
4845     "mm_ice_wall",
4846     "ice wall 2"
4847   },
4848   {
4849     "mm_ice_wall_3",
4850     "mm_ice_wall",
4851     "ice wall 3"
4852   },
4853   {
4854     "mm_ice_wall_4",
4855     "mm_ice_wall",
4856     "ice wall 4"
4857   },
4858   {
4859     "mm_ice_wall_5",
4860     "mm_ice_wall",
4861     "ice wall 5"
4862   },
4863   {
4864     "mm_ice_wall_6",
4865     "mm_ice_wall",
4866     "ice wall 6"
4867   },
4868   {
4869     "mm_ice_wall_7",
4870     "mm_ice_wall",
4871     "ice wall 7"
4872   },
4873   {
4874     "mm_ice_wall_8",
4875     "mm_ice_wall",
4876     "ice wall 8"
4877   },
4878   {
4879     "mm_ice_wall_9",
4880     "mm_ice_wall",
4881     "ice wall 9"
4882   },
4883   {
4884     "mm_ice_wall_10",
4885     "mm_ice_wall",
4886     "ice wall 10"
4887   },
4888   {
4889     "mm_ice_wall_11",
4890     "mm_ice_wall",
4891     "ice wall 11"
4892   },
4893   {
4894     "mm_ice_wall_12",
4895     "mm_ice_wall",
4896     "ice wall 12"
4897   },
4898   {
4899     "mm_ice_wall_13",
4900     "mm_ice_wall",
4901     "ice wall 13"
4902   },
4903   {
4904     "mm_ice_wall_14",
4905     "mm_ice_wall",
4906     "ice wall 14"
4907   },
4908   {
4909     "mm_ice_wall_15",
4910     "mm_ice_wall",
4911     "ice wall 15"
4912   },
4913   {
4914     "mm_ice_wall_16",
4915     "mm_ice_wall",
4916     "ice wall 16"
4917   },
4918   {
4919     "mm_amoeba_wall_1",
4920     "mm_amoeba_wall",
4921     "amoeba wall 1"
4922   },
4923   {
4924     "mm_amoeba_wall_2",
4925     "mm_amoeba_wall",
4926     "amoeba wall 2"
4927   },
4928   {
4929     "mm_amoeba_wall_3",
4930     "mm_amoeba_wall",
4931     "amoeba wall 3"
4932   },
4933   {
4934     "mm_amoeba_wall_4",
4935     "mm_amoeba_wall",
4936     "amoeba wall 4"
4937   },
4938   {
4939     "mm_amoeba_wall_5",
4940     "mm_amoeba_wall",
4941     "amoeba wall 5"
4942   },
4943   {
4944     "mm_amoeba_wall_6",
4945     "mm_amoeba_wall",
4946     "amoeba wall 6"
4947   },
4948   {
4949     "mm_amoeba_wall_7",
4950     "mm_amoeba_wall",
4951     "amoeba wall 7"
4952   },
4953   {
4954     "mm_amoeba_wall_8",
4955     "mm_amoeba_wall",
4956     "amoeba wall 8"
4957   },
4958   {
4959     "mm_amoeba_wall_9",
4960     "mm_amoeba_wall",
4961     "amoeba wall 9"
4962   },
4963   {
4964     "mm_amoeba_wall_10",
4965     "mm_amoeba_wall",
4966     "amoeba wall 10"
4967   },
4968   {
4969     "mm_amoeba_wall_11",
4970     "mm_amoeba_wall",
4971     "amoeba wall 11"
4972   },
4973   {
4974     "mm_amoeba_wall_12",
4975     "mm_amoeba_wall",
4976     "amoeba wall 12"
4977   },
4978   {
4979     "mm_amoeba_wall_13",
4980     "mm_amoeba_wall",
4981     "amoeba wall 13"
4982   },
4983   {
4984     "mm_amoeba_wall_14",
4985     "mm_amoeba_wall",
4986     "amoeba wall 14"
4987   },
4988   {
4989     "mm_amoeba_wall_15",
4990     "mm_amoeba_wall",
4991     "amoeba wall 15"
4992   },
4993   {
4994     "mm_amoeba_wall_16",
4995     "mm_amoeba_wall",
4996     "amoeba wall 16"
4997   },
4998   {
4999     "mm_wooden_block",
5000     "mm_wooden_block",
5001     "wooden block"
5002   },
5003   {
5004     "mm_gray_ball",
5005     "mm_gray_ball",
5006     "gray ball"
5007   },
5008   {
5009     "mm_teleporter_1",
5010     "mm_teleporter",
5011     "teleporter (0\xb0)"
5012   },
5013   {
5014     "mm_teleporter_2",
5015     "mm_teleporter",
5016     "teleporter (22.5\xb0)"
5017   },
5018   {
5019     "mm_teleporter_3",
5020     "mm_teleporter",
5021     "teleporter (45\xb0)"
5022   },
5023   {
5024     "mm_teleporter_4",
5025     "mm_teleporter",
5026     "teleporter (67.5\xb0)"
5027   },
5028   {
5029     "mm_teleporter_5",
5030     "mm_teleporter",
5031     "teleporter (90\xb0)"
5032   },
5033   {
5034     "mm_teleporter_6",
5035     "mm_teleporter",
5036     "teleporter (112.5\xb0)"
5037   },
5038   {
5039     "mm_teleporter_7",
5040     "mm_teleporter",
5041     "teleporter (135\xb0)"
5042   },
5043   {
5044     "mm_teleporter_8",
5045     "mm_teleporter",
5046     "teleporter (157.5\xb0)"
5047   },
5048   {
5049     "mm_teleporter_9",
5050     "mm_teleporter",
5051     "teleporter (180\xb0)"
5052   },
5053   {
5054     "mm_teleporter_10",
5055     "mm_teleporter",
5056     "teleporter (202.5\xb0)"
5057   },
5058   {
5059     "mm_teleporter_11",
5060     "mm_teleporter",
5061     "teleporter (225\xb0)"
5062   },
5063   {
5064     "mm_teleporter_12",
5065     "mm_teleporter",
5066     "teleporter (247.5\xb0)"
5067   },
5068   {
5069     "mm_teleporter_13",
5070     "mm_teleporter",
5071     "teleporter (270\xb0)"
5072   },
5073   {
5074     "mm_teleporter_14",
5075     "mm_teleporter",
5076     "teleporter (292.5\xb0)"
5077   },
5078   {
5079     "mm_teleporter_15",
5080     "mm_teleporter",
5081     "teleporter (315\xb0)"
5082   },
5083   {
5084     "mm_teleporter_16",
5085     "mm_teleporter",
5086     "teleporter (337.5\xb0)"
5087   },
5088   {
5089     "mm_fuse.active",
5090     "mm_fuse",
5091     "fuse (on)"
5092   },
5093   {
5094     "mm_pacman.right",
5095     "mm_pacman",
5096     "pac man (starts moving right)"
5097   },
5098   {
5099     "mm_pacman.up",
5100     "mm_pacman",
5101     "pac man (starts moving up)"
5102   },
5103   {
5104     "mm_pacman.left",
5105     "mm_pacman",
5106     "pac man (starts moving left)"
5107   },
5108   {
5109     "mm_pacman.down",
5110     "mm_pacman",
5111     "pac man (starts moving down)"
5112   },
5113   {
5114     "mm_polarizer_1",
5115     "mm_polarizer",
5116     "polarizer (0\xb0)"
5117   },
5118   {
5119     "mm_polarizer_2",
5120     "mm_polarizer",
5121     "polarizer (11.25\xb0)"
5122   },
5123   {
5124     "mm_polarizer_3",
5125     "mm_polarizer",
5126     "polarizer (22.5\xb0)"
5127   },
5128   {
5129     "mm_polarizer_4",
5130     "mm_polarizer",
5131     "polarizer (33.75\xb0)"
5132   },
5133   {
5134     "mm_polarizer_5",
5135     "mm_polarizer",
5136     "polarizer (45\xb0)"
5137   },
5138   {
5139     "mm_polarizer_6",
5140     "mm_polarizer",
5141     "polarizer (56.25\xb0)"
5142   },
5143   {
5144     "mm_polarizer_7",
5145     "mm_polarizer",
5146     "polarizer (67.5\xb0)"
5147   },
5148   {
5149     "mm_polarizer_8",
5150     "mm_polarizer",
5151     "polarizer (78.75\xb0)"
5152   },
5153   {
5154     "mm_polarizer_9",
5155     "mm_polarizer",
5156     "polarizer (90\xb0)"
5157   },
5158   {
5159     "mm_polarizer_10",
5160     "mm_polarizer",
5161     "polarizer (101.25\xb0)"
5162   },
5163   {
5164     "mm_polarizer_11",
5165     "mm_polarizer",
5166     "polarizer (112.5\xb0)"
5167   },
5168   {
5169     "mm_polarizer_12",
5170     "mm_polarizer",
5171     "polarizer (123.75\xb0)"
5172   },
5173   {
5174     "mm_polarizer_13",
5175     "mm_polarizer",
5176     "polarizer (135\xb0)"
5177   },
5178   {
5179     "mm_polarizer_14",
5180     "mm_polarizer",
5181     "polarizer (146.25\xb0)"
5182   },
5183   {
5184     "mm_polarizer_15",
5185     "mm_polarizer",
5186     "polarizer (157.5\xb0)"
5187   },
5188   {
5189     "mm_polarizer_16",
5190     "mm_polarizer",
5191     "polarizer (168.75\xb0)"
5192   },
5193   {
5194     "mm_polarizer_cross_1",
5195     "mm_polarizer_cross",
5196     "two-way polarizer (0\xb0)"
5197   },
5198   {
5199     "mm_polarizer_cross_2",
5200     "mm_polarizer_cross",
5201     "two-way polarizer (22.5\xb0)"
5202   },
5203   {
5204     "mm_polarizer_cross_3",
5205     "mm_polarizer_cross",
5206     "two-way polarizer (45\xb0)"
5207   },
5208   {
5209     "mm_polarizer_cross_4",
5210     "mm_polarizer_cross",
5211     "two-way polarizer (67.5\xb0)"
5212   },
5213   {
5214     "mm_mirror_fixed_1",
5215     "mm_mirror_fixed",
5216     "fixed mirror (0\xb0)"
5217   },
5218   {
5219     "mm_mirror_fixed_2",
5220     "mm_mirror_fixed",
5221     "fixed mirror (45\xb0)"
5222   },
5223   {
5224     "mm_mirror_fixed_3",
5225     "mm_mirror_fixed",
5226     "fixed mirror (90\xb0)"
5227   },
5228   {
5229     "mm_mirror_fixed_4",
5230     "mm_mirror_fixed",
5231     "fixed mirror (135\xb0)"
5232   },
5233   {
5234     "mm_steel_lock",
5235     "mm_steel_lock",
5236     "steel lock"
5237   },
5238   {
5239     "mm_key",
5240     "mm_key",
5241     "key (MM style)"
5242   },
5243   {
5244     "mm_lightbulb",
5245     "mm_lightbulb",
5246     "light bulb (off)"
5247   },
5248   {
5249     "mm_lightbulb.active",
5250     "mm_lightbulb",
5251     "light bulb (on)"
5252   },
5253   {
5254     "mm_lightball",
5255     "mm_lightball",
5256     "bonus ball"
5257   },
5258   {
5259     "mm_steel_block",
5260     "mm_steel_block",
5261     "steel block"
5262   },
5263   {
5264     "mm_wooden_lock",
5265     "mm_wooden_lock",
5266     "wooden lock"
5267   },
5268   {
5269     "mm_fuel_full",
5270     "mm_fuel",
5271     "extra energy ball (full)"
5272   },
5273   {
5274     "mm_wooden_grid_fixed_1",
5275     "mm_wooden_grid_fixed",
5276     "fixed wooden polarizer (0\xb0)"
5277   },
5278   {
5279     "mm_wooden_grid_fixed_2",
5280     "mm_wooden_grid_fixed",
5281     "fixed wooden polarizer (90\xb0)"
5282   },
5283   {
5284     "mm_wooden_grid_fixed_3",
5285     "mm_wooden_grid_fixed",
5286     "fixed wooden polarizer (45\xb0)"
5287   },
5288   {
5289     "mm_wooden_grid_fixed_4",
5290     "mm_wooden_grid_fixed",
5291     "fixed wooden polarizer (135\xb0)"
5292   },
5293   {
5294     "mm_fuel_empty",
5295     "mm_fuel",
5296     "extra energy ball (empty)"
5297   },
5298   {
5299     "mm_envelope_1",
5300     "mm_envelope",
5301     "mail envelope 1 (MM style)"
5302   },
5303   {
5304     "mm_envelope_2",
5305     "mm_envelope",
5306     "mail envelope 2 (MM style)"
5307   },
5308   {
5309     "mm_envelope_3",
5310     "mm_envelope",
5311     "mail envelope 3 (MM style)"
5312   },
5313   {
5314     "mm_envelope_4",
5315     "mm_envelope",
5316     "mail envelope 4 (MM style)"
5317   },
5318   {
5319     "df_mirror_1",
5320     "df_mirror",
5321     "mirror (DF style) (0\xb0)"
5322   },
5323   {
5324     "df_mirror_2",
5325     "df_mirror",
5326     "mirror (DF style) (11.25\xb0)"
5327   },
5328   {
5329     "df_mirror_3",
5330     "df_mirror",
5331     "mirror (DF style) (22.5\xb0)"
5332   },
5333   {
5334     "df_mirror_4",
5335     "df_mirror",
5336     "mirror (DF style) (33.75\xb0)"
5337   },
5338   {
5339     "df_mirror_5",
5340     "df_mirror",
5341     "mirror (DF style) (45\xb0)"
5342   },
5343   {
5344     "df_mirror_6",
5345     "df_mirror",
5346     "mirror (DF style) (56.25\xb0)"
5347   },
5348   {
5349     "df_mirror_7",
5350     "df_mirror",
5351     "mirror (DF style) (67.5\xb0)"
5352   },
5353   {
5354     "df_mirror_8",
5355     "df_mirror",
5356     "mirror (DF style) (78.75\xb0)"
5357   },
5358   {
5359     "df_mirror_9",
5360     "df_mirror",
5361     "mirror (DF style) (90\xb0)"
5362   },
5363   {
5364     "df_mirror_10",
5365     "df_mirror",
5366     "mirror (DF style) (101.25\xb0)"
5367   },
5368   {
5369     "df_mirror_11",
5370     "df_mirror",
5371     "mirror (DF style) (112.5\xb0)"
5372   },
5373   {
5374     "df_mirror_12",
5375     "df_mirror",
5376     "mirror (DF style) (123.75\xb0)"
5377   },
5378   {
5379     "df_mirror_13",
5380     "df_mirror",
5381     "mirror (DF style) (135\xb0)"
5382   },
5383   {
5384     "df_mirror_14",
5385     "df_mirror",
5386     "mirror (DF style) (146.25\xb0)"
5387   },
5388   {
5389     "df_mirror_15",
5390     "df_mirror",
5391     "mirror (DF style) (157.5\xb0)"
5392   },
5393   {
5394     "df_mirror_16",
5395     "df_mirror",
5396     "mirror (DF style) (168.75\xb0)"
5397   },
5398   {
5399     "df_wooden_grid_fixed_1",
5400     "df_wooden_grid_fixed",
5401     "fixed wooden polarizer (DF) (0\xb0)"
5402   },
5403   {
5404     "df_wooden_grid_fixed_2",
5405     "df_wooden_grid_fixed",
5406     "fixed wooden polarizer (DF) (22.5\xb0)"
5407   },
5408   {
5409     "df_wooden_grid_fixed_3",
5410     "df_wooden_grid_fixed",
5411     "fixed wooden polarizer (DF) (45\xb0)"
5412   },
5413   {
5414     "df_wooden_grid_fixed_4",
5415     "df_wooden_grid_fixed",
5416     "fixed wooden polarizer (DF) (67.5\xb0)"
5417   },
5418   {
5419     "df_wooden_grid_fixed_5",
5420     "df_wooden_grid_fixed",
5421     "fixed wooden polarizer (DF) (90\xb0)"
5422   },
5423   {
5424     "df_wooden_grid_fixed_6",
5425     "df_wooden_grid_fixed",
5426     "fixed wooden polarizer (DF) (112.5\xb0)"
5427   },
5428   {
5429     "df_wooden_grid_fixed_7",
5430     "df_wooden_grid_fixed",
5431     "fixed wooden polarizer (DF) (135\xb0)"
5432   },
5433   {
5434     "df_wooden_grid_fixed_8",
5435     "df_wooden_grid_fixed",
5436     "fixed wooden polarizer (DF) (157.5\xb0)"
5437   },
5438   {
5439     "df_steel_grid_fixed_1",
5440     "df_steel_grid_fixed",
5441     "fixed steel polarizer (DF) (0\xb0)"
5442   },
5443   {
5444     "df_steel_grid_fixed_2",
5445     "df_steel_grid_fixed",
5446     "fixed steel polarizer (DF) (22.5\xb0)"
5447   },
5448   {
5449     "df_steel_grid_fixed_3",
5450     "df_steel_grid_fixed",
5451     "fixed steel polarizer (DF) (45\xb0)"
5452   },
5453   {
5454     "df_steel_grid_fixed_4",
5455     "df_steel_grid_fixed",
5456     "fixed steel polarizer (DF) (67.5\xb0)"
5457   },
5458   {
5459     "df_steel_grid_fixed_5",
5460     "df_steel_grid_fixed",
5461     "fixed steel polarizer (DF) (90\xb0)"
5462   },
5463   {
5464     "df_steel_grid_fixed_6",
5465     "df_steel_grid_fixed",
5466     "fixed steel polarizer (DF) (112.5\xb0)"
5467   },
5468   {
5469     "df_steel_grid_fixed_7",
5470     "df_steel_grid_fixed",
5471     "fixed steel polarizer (DF) (135\xb0)"
5472   },
5473   {
5474     "df_steel_grid_fixed_8",
5475     "df_steel_grid_fixed",
5476     "fixed steel polarizer (DF) (157.5\xb0)"
5477   },
5478   {
5479     "df_wooden_wall_1",
5480     "df_wooden_wall",
5481     "wooden wall 1 (DF style)"
5482   },
5483   {
5484     "df_wooden_wall_2",
5485     "df_wooden_wall",
5486     "wooden wall 2 (DF style)"
5487   },
5488   {
5489     "df_wooden_wall_3",
5490     "df_wooden_wall",
5491     "wooden wall 3 (DF style)"
5492   },
5493   {
5494     "df_wooden_wall_4",
5495     "df_wooden_wall",
5496     "wooden wall 4 (DF style)"
5497   },
5498   {
5499     "df_wooden_wall_5",
5500     "df_wooden_wall",
5501     "wooden wall 5 (DF style)"
5502   },
5503   {
5504     "df_wooden_wall_6",
5505     "df_wooden_wall",
5506     "wooden wall 6 (DF style)"
5507   },
5508   {
5509     "df_wooden_wall_7",
5510     "df_wooden_wall",
5511     "wooden wall 7 (DF style)"
5512   },
5513   {
5514     "df_wooden_wall_8",
5515     "df_wooden_wall",
5516     "wooden wall 8 (DF style)"
5517   },
5518   {
5519     "df_wooden_wall_9",
5520     "df_wooden_wall",
5521     "wooden wall 9 (DF style)"
5522   },
5523   {
5524     "df_wooden_wall_10",
5525     "df_wooden_wall",
5526     "wooden wall 10 (DF style)"
5527   },
5528   {
5529     "df_wooden_wall_11",
5530     "df_wooden_wall",
5531     "wooden wall 11 (DF style)"
5532   },
5533   {
5534     "df_wooden_wall_12",
5535     "df_wooden_wall",
5536     "wooden wall 12 (DF style)"
5537   },
5538   {
5539     "df_wooden_wall_13",
5540     "df_wooden_wall",
5541     "wooden wall 13 (DF style)"
5542   },
5543   {
5544     "df_wooden_wall_14",
5545     "df_wooden_wall",
5546     "wooden wall 14 (DF style)"
5547   },
5548   {
5549     "df_wooden_wall_15",
5550     "df_wooden_wall",
5551     "wooden wall 15 (DF style)"
5552   },
5553   {
5554     "df_wooden_wall_16",
5555     "df_wooden_wall",
5556     "wooden wall 16 (DF style)"
5557   },
5558   {
5559     "df_steel_wall_1",
5560     "df_steel_wall",
5561     "steel wall 1 (DF style)"
5562   },
5563   {
5564     "df_steel_wall_2",
5565     "df_steel_wall",
5566     "steel wall 2 (DF style)"
5567   },
5568   {
5569     "df_steel_wall_3",
5570     "df_steel_wall",
5571     "steel wall 3 (DF style)"
5572   },
5573   {
5574     "df_steel_wall_4",
5575     "df_steel_wall",
5576     "steel wall 4 (DF style)"
5577   },
5578   {
5579     "df_steel_wall_5",
5580     "df_steel_wall",
5581     "steel wall 5 (DF style)"
5582   },
5583   {
5584     "df_steel_wall_6",
5585     "df_steel_wall",
5586     "steel wall 6 (DF style)"
5587   },
5588   {
5589     "df_steel_wall_7",
5590     "df_steel_wall",
5591     "steel wall 7 (DF style)"
5592   },
5593   {
5594     "df_steel_wall_8",
5595     "df_steel_wall",
5596     "steel wall 8 (DF style)"
5597   },
5598   {
5599     "df_steel_wall_9",
5600     "df_steel_wall",
5601     "steel wall 9 (DF style)"
5602   },
5603   {
5604     "df_steel_wall_10",
5605     "df_steel_wall",
5606     "steel wall 10 (DF style)"
5607   },
5608   {
5609     "df_steel_wall_11",
5610     "df_steel_wall",
5611     "steel wall 11 (DF style)"
5612   },
5613   {
5614     "df_steel_wall_12",
5615     "df_steel_wall",
5616     "steel wall 12 (DF style)"
5617   },
5618   {
5619     "df_steel_wall_13",
5620     "df_steel_wall",
5621     "steel wall 13 (DF style)"
5622   },
5623   {
5624     "df_steel_wall_14",
5625     "df_steel_wall",
5626     "steel wall 14 (DF style)"
5627   },
5628   {
5629     "df_steel_wall_15",
5630     "df_steel_wall",
5631     "steel wall 15 (DF style)"
5632   },
5633   {
5634     "df_steel_wall_16",
5635     "df_steel_wall",
5636     "steel wall 16 (DF style)"
5637   },
5638   {
5639     "df_empty_space",
5640     "empty_space",
5641     "empty space"
5642   },
5643   {
5644     "df_cell",
5645     "df_cell",
5646     "cell"
5647   },
5648   {
5649     "df_mine",
5650     "df_mine",
5651     "mine"
5652   },
5653   {
5654     "df_refractor",
5655     "df_refractor",
5656     "refractor"
5657   },
5658   {
5659     "df_laser.right",
5660     "df_laser",
5661     "laser cannon (shooting right)"
5662   },
5663   {
5664     "df_laser.up",
5665     "df_laser",
5666     "laser cannon (shooting up)"
5667   },
5668   {
5669     "df_laser.left",
5670     "df_laser",
5671     "laser cannon (shooting left)"
5672   },
5673   {
5674     "df_laser.down",
5675     "df_laser",
5676     "laser cannon (shooting down)"
5677   },
5678   {
5679     "df_receiver.right",
5680     "df_receiver",
5681     "laser receiver (directed right)"
5682   },
5683   {
5684     "df_receiver.up",
5685     "df_receiver",
5686     "laser receiver (directed up)"
5687   },
5688   {
5689     "df_receiver.left",
5690     "df_receiver",
5691     "laser receiver (directed left)"
5692   },
5693   {
5694     "df_receiver.down",
5695     "df_receiver",
5696     "laser receiver (directed down)"
5697   },
5698   {
5699     "df_fibre_optic_red_1",
5700     "df_fibre_optic",
5701     "red fibre optic (part 1)"
5702   },
5703   {
5704     "df_fibre_optic_red_2",
5705     "df_fibre_optic",
5706     "red fibre optic (part 2)"
5707   },
5708   {
5709     "df_fibre_optic_yellow_1",
5710     "df_fibre_optic",
5711     "yellow fibre optic (part 1)"
5712   },
5713   {
5714     "df_fibre_optic_yellow_2",
5715     "df_fibre_optic",
5716     "yellow fibre optic (part 2)"
5717   },
5718   {
5719     "df_fibre_optic_green_1",
5720     "df_fibre_optic",
5721     "green fibre optic (part 1)"
5722   },
5723   {
5724     "df_fibre_optic_green_2",
5725     "df_fibre_optic",
5726     "green fibre optic (part 2)"
5727   },
5728   {
5729     "df_fibre_optic_blue_1",
5730     "df_fibre_optic",
5731     "blue fibre optic (part 1)"
5732   },
5733   {
5734     "df_fibre_optic_blue_2",
5735     "df_fibre_optic",
5736     "blue fibre optic (part 2)"
5737   },
5738   {
5739     "df_mirror_rotating_1",
5740     "df_mirror_rotating",
5741     "rotating mirror (0\xb0)"
5742   },
5743   {
5744     "df_mirror_rotating_2",
5745     "df_mirror_rotating",
5746     "rotating mirror (11.25\xb0)"
5747   },
5748   {
5749     "df_mirror_rotating_3",
5750     "df_mirror_rotating",
5751     "rotating mirror (22.5\xb0)"
5752   },
5753   {
5754     "df_mirror_rotating_4",
5755     "df_mirror_rotating",
5756     "rotating mirror (33.75\xb0)"
5757   },
5758   {
5759     "df_mirror_rotating_5",
5760     "df_mirror_rotating",
5761     "rotating mirror (45\xb0)"
5762   },
5763   {
5764     "df_mirror_rotating_6",
5765     "df_mirror_rotating",
5766     "rotating mirror (56.25\xb0)"
5767   },
5768   {
5769     "df_mirror_rotating_7",
5770     "df_mirror_rotating",
5771     "rotating mirror (67.5\xb0)"
5772   },
5773   {
5774     "df_mirror_rotating_8",
5775     "df_mirror_rotating",
5776     "rotating mirror (78.75\xb0)"
5777   },
5778   {
5779     "df_mirror_rotating_9",
5780     "df_mirror_rotating",
5781     "rotating mirror (90\xb0)"
5782   },
5783   {
5784     "df_mirror_rotating_10",
5785     "df_mirror_rotating",
5786     "rotating mirror (101.25\xb0)"
5787   },
5788   {
5789     "df_mirror_rotating_11",
5790     "df_mirror_rotating",
5791     "rotating mirror (112.5\xb0)"
5792   },
5793   {
5794     "df_mirror_rotating_12",
5795     "df_mirror_rotating",
5796     "rotating mirror (123.75\xb0)"
5797   },
5798   {
5799     "df_mirror_rotating_13",
5800     "df_mirror_rotating",
5801     "rotating mirror (135\xb0)"
5802   },
5803   {
5804     "df_mirror_rotating_14",
5805     "df_mirror_rotating",
5806     "rotating mirror (146.25\xb0)"
5807   },
5808   {
5809     "df_mirror_rotating_15",
5810     "df_mirror_rotating",
5811     "rotating mirror (157.5\xb0)"
5812   },
5813   {
5814     "df_mirror_rotating_16",
5815     "df_mirror_rotating",
5816     "rotating mirror (168.75\xb0)"
5817   },
5818   {
5819     "df_wooden_grid_rotating_1",
5820     "df_wooden_grid_rotating",
5821     "rotating wooden polarizer (0\xb0)"
5822   },
5823   {
5824     "df_wooden_grid_rotating_2",
5825     "df_wooden_grid_rotating",
5826     "rotating wooden polarizer (22.5\xb0)"
5827   },
5828   {
5829     "df_wooden_grid_rotating_3",
5830     "df_wooden_grid_rotating",
5831     "rotating wooden polarizer (45\xb0)"
5832   },
5833   {
5834     "df_wooden_grid_rotating_4",
5835     "df_wooden_grid_rotating",
5836     "rotating wooden polarizer (67.5\xb0)"
5837   },
5838   {
5839     "df_wooden_grid_rotating_5",
5840     "df_wooden_grid_rotating",
5841     "rotating wooden polarizer (90\xb0)"
5842   },
5843   {
5844     "df_wooden_grid_rotating_6",
5845     "df_wooden_grid_rotating",
5846     "rotating wooden polarizer (112.5\xb0)"
5847   },
5848   {
5849     "df_wooden_grid_rotating_7",
5850     "df_wooden_grid_rotating",
5851     "rotating wooden polarizer (135\xb0)"
5852   },
5853   {
5854     "df_wooden_grid_rotating_8",
5855     "df_wooden_grid_rotating",
5856     "rotating wooden polarizer (157.5\xb0)"
5857   },
5858   {
5859     "df_steel_grid_rotating_1",
5860     "df_steel_grid_rotating",
5861     "rotating steel polarizer (0\xb0)"
5862   },
5863   {
5864     "df_steel_grid_rotating_2",
5865     "df_steel_grid_rotating",
5866     "rotating steel polarizer (22.5\xb0)"
5867   },
5868   {
5869     "df_steel_grid_rotating_3",
5870     "df_steel_grid_rotating",
5871     "rotating steel polarizer (45\xb0)"
5872   },
5873   {
5874     "df_steel_grid_rotating_4",
5875     "df_steel_grid_rotating",
5876     "rotating steel polarizer (67.5\xb0)"
5877   },
5878   {
5879     "df_steel_grid_rotating_5",
5880     "df_steel_grid_rotating",
5881     "rotating steel polarizer (90\xb0)"
5882   },
5883   {
5884     "df_steel_grid_rotating_6",
5885     "df_steel_grid_rotating",
5886     "rotating steel polarizer (112.5\xb0)"
5887   },
5888   {
5889     "df_steel_grid_rotating_7",
5890     "df_steel_grid_rotating",
5891     "rotating steel polarizer (135\xb0)"
5892   },
5893   {
5894     "df_steel_grid_rotating_8",
5895     "df_steel_grid_rotating",
5896     "rotating steel polarizer (157.5\xb0)"
5897   },
5898   {
5899     "mm_teleporter_red_1",
5900     "mm_teleporter",
5901     "red teleporter (0\xb0)"
5902   },
5903   {
5904     "mm_teleporter_red_2",
5905     "mm_teleporter",
5906     "red teleporter (22.5\xb0)"
5907   },
5908   {
5909     "mm_teleporter_red_3",
5910     "mm_teleporter",
5911     "red teleporter (45\xb0)"
5912   },
5913   {
5914     "mm_teleporter_red_4",
5915     "mm_teleporter",
5916     "red teleporter (67.5\xb0)"
5917   },
5918   {
5919     "mm_teleporter_red_5",
5920     "mm_teleporter",
5921     "red teleporter (90\xb0)"
5922   },
5923   {
5924     "mm_teleporter_red_6",
5925     "mm_teleporter",
5926     "red teleporter (112.5\xb0)"
5927   },
5928   {
5929     "mm_teleporter_red_7",
5930     "mm_teleporter",
5931     "red teleporter (135\xb0)"
5932   },
5933   {
5934     "mm_teleporter_red_8",
5935     "mm_teleporter",
5936     "red teleporter (157.5\xb0)"
5937   },
5938   {
5939     "mm_teleporter_red_9",
5940     "mm_teleporter",
5941     "red teleporter (180\xb0)"
5942   },
5943   {
5944     "mm_teleporter_red_10",
5945     "mm_teleporter",
5946     "red teleporter (202.5\xb0)"
5947   },
5948   {
5949     "mm_teleporter_red_11",
5950     "mm_teleporter",
5951     "red teleporter (225\xb0)"
5952   },
5953   {
5954     "mm_teleporter_red_12",
5955     "mm_teleporter",
5956     "red teleporter (247.5\xb0)"
5957   },
5958   {
5959     "mm_teleporter_red_13",
5960     "mm_teleporter",
5961     "red teleporter (270\xb0)"
5962   },
5963   {
5964     "mm_teleporter_red_14",
5965     "mm_teleporter",
5966     "red teleporter (292.5\xb0)"
5967   },
5968   {
5969     "mm_teleporter_red_15",
5970     "mm_teleporter",
5971     "red teleporter (315\xb0)"
5972   },
5973   {
5974     "mm_teleporter_red_16",
5975     "mm_teleporter",
5976     "red teleporter (337.5\xb0)"
5977   },
5978   {
5979     "mm_teleporter_yellow_1",
5980     "mm_teleporter",
5981     "yellow teleporter (0\xb0)"
5982   },
5983   {
5984     "mm_teleporter_yellow_2",
5985     "mm_teleporter",
5986     "yellow teleporter (22.5\xb0)"
5987   },
5988   {
5989     "mm_teleporter_yellow_3",
5990     "mm_teleporter",
5991     "yellow teleporter (45\xb0)"
5992   },
5993   {
5994     "mm_teleporter_yellow_4",
5995     "mm_teleporter",
5996     "yellow teleporter (67.5\xb0)"
5997   },
5998   {
5999     "mm_teleporter_yellow_5",
6000     "mm_teleporter",
6001     "yellow teleporter (90\xb0)"
6002   },
6003   {
6004     "mm_teleporter_yellow_6",
6005     "mm_teleporter",
6006     "yellow teleporter (112.5\xb0)"
6007   },
6008   {
6009     "mm_teleporter_yellow_7",
6010     "mm_teleporter",
6011     "yellow teleporter (135\xb0)"
6012   },
6013   {
6014     "mm_teleporter_yellow_8",
6015     "mm_teleporter",
6016     "yellow teleporter (157.5\xb0)"
6017   },
6018   {
6019     "mm_teleporter_yellow_9",
6020     "mm_teleporter",
6021     "yellow teleporter (180\xb0)"
6022   },
6023   {
6024     "mm_teleporter_yellow_10",
6025     "mm_teleporter",
6026     "yellow teleporter (202.5\xb0)"
6027   },
6028   {
6029     "mm_teleporter_yellow_11",
6030     "mm_teleporter",
6031     "yellow teleporter (225\xb0)"
6032   },
6033   {
6034     "mm_teleporter_yellow_12",
6035     "mm_teleporter",
6036     "yellow teleporter (247.5\xb0)"
6037   },
6038   {
6039     "mm_teleporter_yellow_13",
6040     "mm_teleporter",
6041     "yellow teleporter (270\xb0)"
6042   },
6043   {
6044     "mm_teleporter_yellow_14",
6045     "mm_teleporter",
6046     "yellow teleporter (292.5\xb0)"
6047   },
6048   {
6049     "mm_teleporter_yellow_15",
6050     "mm_teleporter",
6051     "yellow teleporter (315\xb0)"
6052   },
6053   {
6054     "mm_teleporter_yellow_16",
6055     "mm_teleporter",
6056     "yellow teleporter (337.5\xb0)"
6057   },
6058   {
6059     "mm_teleporter_green_1",
6060     "mm_teleporter",
6061     "green teleporter (0\xb0)"
6062   },
6063   {
6064     "mm_teleporter_green_2",
6065     "mm_teleporter",
6066     "green teleporter (22.5\xb0)"
6067   },
6068   {
6069     "mm_teleporter_green_3",
6070     "mm_teleporter",
6071     "green teleporter (45\xb0)"
6072   },
6073   {
6074     "mm_teleporter_green_4",
6075     "mm_teleporter",
6076     "green teleporter (67.5\xb0)"
6077   },
6078   {
6079     "mm_teleporter_green_5",
6080     "mm_teleporter",
6081     "green teleporter (90\xb0)"
6082   },
6083   {
6084     "mm_teleporter_green_6",
6085     "mm_teleporter",
6086     "green teleporter (112.5\xb0)"
6087   },
6088   {
6089     "mm_teleporter_green_7",
6090     "mm_teleporter",
6091     "green teleporter (135\xb0)"
6092   },
6093   {
6094     "mm_teleporter_green_8",
6095     "mm_teleporter",
6096     "green teleporter (157.5\xb0)"
6097   },
6098   {
6099     "mm_teleporter_green_9",
6100     "mm_teleporter",
6101     "green teleporter (180\xb0)"
6102   },
6103   {
6104     "mm_teleporter_green_10",
6105     "mm_teleporter",
6106     "green teleporter (202.5\xb0)"
6107   },
6108   {
6109     "mm_teleporter_green_11",
6110     "mm_teleporter",
6111     "green teleporter (225\xb0)"
6112   },
6113   {
6114     "mm_teleporter_green_12",
6115     "mm_teleporter",
6116     "green teleporter (247.5\xb0)"
6117   },
6118   {
6119     "mm_teleporter_green_13",
6120     "mm_teleporter",
6121     "green teleporter (270\xb0)"
6122   },
6123   {
6124     "mm_teleporter_green_14",
6125     "mm_teleporter",
6126     "green teleporter (292.5\xb0)"
6127   },
6128   {
6129     "mm_teleporter_green_15",
6130     "mm_teleporter",
6131     "green teleporter (315\xb0)"
6132   },
6133   {
6134     "mm_teleporter_green_16",
6135     "mm_teleporter",
6136     "green teleporter (337.5\xb0)"
6137   },
6138   {
6139     "mm_teleporter_blue_1",
6140     "mm_teleporter",
6141     "blue teleporter (0\xb0)"
6142   },
6143   {
6144     "mm_teleporter_blue_2",
6145     "mm_teleporter",
6146     "blue teleporter (22.5\xb0)"
6147   },
6148   {
6149     "mm_teleporter_blue_3",
6150     "mm_teleporter",
6151     "blue teleporter (45\xb0)"
6152   },
6153   {
6154     "mm_teleporter_blue_4",
6155     "mm_teleporter",
6156     "blue teleporter (67.5\xb0)"
6157   },
6158   {
6159     "mm_teleporter_blue_5",
6160     "mm_teleporter",
6161     "blue teleporter (90\xb0)"
6162   },
6163   {
6164     "mm_teleporter_blue_6",
6165     "mm_teleporter",
6166     "blue teleporter (112.5\xb0)"
6167   },
6168   {
6169     "mm_teleporter_blue_7",
6170     "mm_teleporter",
6171     "blue teleporter (135\xb0)"
6172   },
6173   {
6174     "mm_teleporter_blue_8",
6175     "mm_teleporter",
6176     "blue teleporter (157.5\xb0)"
6177   },
6178   {
6179     "mm_teleporter_blue_9",
6180     "mm_teleporter",
6181     "blue teleporter (180\xb0)"
6182   },
6183   {
6184     "mm_teleporter_blue_10",
6185     "mm_teleporter",
6186     "blue teleporter (202.5\xb0)"
6187   },
6188   {
6189     "mm_teleporter_blue_11",
6190     "mm_teleporter",
6191     "blue teleporter (225\xb0)"
6192   },
6193   {
6194     "mm_teleporter_blue_12",
6195     "mm_teleporter",
6196     "blue teleporter (247.5\xb0)"
6197   },
6198   {
6199     "mm_teleporter_blue_13",
6200     "mm_teleporter",
6201     "blue teleporter (270\xb0)"
6202   },
6203   {
6204     "mm_teleporter_blue_14",
6205     "mm_teleporter",
6206     "blue teleporter (292.5\xb0)"
6207   },
6208   {
6209     "mm_teleporter_blue_15",
6210     "mm_teleporter",
6211     "blue teleporter (315\xb0)"
6212   },
6213   {
6214     "mm_teleporter_blue_16",
6215     "mm_teleporter",
6216     "blue teleporter (337.5\xb0)"
6217   },
6218   {
6219     "mm_mcduffin",
6220     "mm_mcduffin",
6221     "Gregor McDuffin"
6222   },
6223   {
6224     "mm_pacman",
6225     "mm_pacman",
6226     "pac man (MM style)"
6227   },
6228   {
6229     "mm_fuse",
6230     "mm_fuse",
6231     "fuse (off)",
6232   },
6233   {
6234     "mm_steel_wall",
6235     "mm_steel_wall",
6236     "steel wall (MM style)",
6237   },
6238   {
6239     "mm_wooden_wall",
6240     "mm_wooden_wall",
6241     "wooden wall (MM style)",
6242   },
6243   {
6244     "mm_ice_wall",
6245     "mm_ice_wall",
6246     "ice wall",
6247   },
6248   {
6249     "mm_amoeba_wall",
6250     "mm_amoeba_wall",
6251     "amoeba wall",
6252   },
6253   {
6254     "df_laser",
6255     "df_laser",
6256     "laser cannon"
6257   },
6258   {
6259     "df_receiver",
6260     "df_receiver",
6261     "laser receiver"
6262   },
6263   {
6264     "df_steel_wall",
6265     "df_steel_wall",
6266     "steel wall (DF style)",
6267   },
6268   {
6269     "df_wooden_wall",
6270     "df_wooden_wall",
6271     "wooden wall (DF style)",
6272   },
6273   {
6274     "spring.left",
6275     "spring",
6276     "spring (starts moving left)"
6277   },
6278   {
6279     "spring.right",
6280     "spring",
6281     "spring (starts moving right)"
6282   },
6283   {
6284     "empty_space_1",
6285     "empty_space",
6286     "empty space 1"
6287   },
6288   {
6289     "empty_space_2",
6290     "empty_space",
6291     "empty space 2"
6292   },
6293   {
6294     "empty_space_3",
6295     "empty_space",
6296     "empty space 3"
6297   },
6298   {
6299     "empty_space_4",
6300     "empty_space",
6301     "empty space 4"
6302   },
6303   {
6304     "empty_space_5",
6305     "empty_space",
6306     "empty space 5"
6307   },
6308   {
6309     "empty_space_6",
6310     "empty_space",
6311     "empty space 6"
6312   },
6313   {
6314     "empty_space_7",
6315     "empty_space",
6316     "empty space 7"
6317   },
6318   {
6319     "empty_space_8",
6320     "empty_space",
6321     "empty space 8"
6322   },
6323   {
6324     "empty_space_9",
6325     "empty_space",
6326     "empty space 9"
6327   },
6328   {
6329     "empty_space_10",
6330     "empty_space",
6331     "empty space 10"
6332   },
6333   {
6334     "empty_space_11",
6335     "empty_space",
6336     "empty space 11"
6337   },
6338   {
6339     "empty_space_12",
6340     "empty_space",
6341     "empty space 12"
6342   },
6343   {
6344     "empty_space_13",
6345     "empty_space",
6346     "empty space 13"
6347   },
6348   {
6349     "empty_space_14",
6350     "empty_space",
6351     "empty space 14"
6352   },
6353   {
6354     "empty_space_15",
6355     "empty_space",
6356     "empty space 15"
6357   },
6358   {
6359     "empty_space_16",
6360     "empty_space",
6361     "empty space 16"
6362   },
6363   {
6364     "df_mirror_fixed_1",
6365     "df_mirror_fixed",
6366     "fixed mirror (DF style) (0\xb0)"
6367   },
6368   {
6369     "df_mirror_fixed_2",
6370     "df_mirror_fixed",
6371     "fixed mirror (DF style) (11.25\xb0)"
6372   },
6373   {
6374     "df_mirror_fixed_3",
6375     "df_mirror_fixed",
6376     "fixed mirror (DF style) (22.5\xb0)"
6377   },
6378   {
6379     "df_mirror_fixed_4",
6380     "df_mirror_fixed",
6381     "fixed mirror (DF style) (33.75\xb0)"
6382   },
6383   {
6384     "df_mirror_fixed_5",
6385     "df_mirror_fixed",
6386     "fixed mirror (DF style) (45\xb0)"
6387   },
6388   {
6389     "df_mirror_fixed_6",
6390     "df_mirror_fixed",
6391     "fixed mirror (DF style) (56.25\xb0)"
6392   },
6393   {
6394     "df_mirror_fixed_7",
6395     "df_mirror_fixed",
6396     "fixed mirror (DF style) (67.5\xb0)"
6397   },
6398   {
6399     "df_mirror_fixed_8",
6400     "df_mirror_fixed",
6401     "fixed mirror (DF style) (78.75\xb0)"
6402   },
6403   {
6404     "df_mirror_fixed_9",
6405     "df_mirror_fixed",
6406     "fixed mirror (DF style) (90\xb0)"
6407   },
6408   {
6409     "df_mirror_fixed_10",
6410     "df_mirror_fixed",
6411     "fixed mirror (DF style) (101.25\xb0)"
6412   },
6413   {
6414     "df_mirror_fixed_11",
6415     "df_mirror_fixed",
6416     "fixed mirror (DF style) (112.5\xb0)"
6417   },
6418   {
6419     "df_mirror_fixed_12",
6420     "df_mirror_fixed",
6421     "fixed mirror (DF style) (123.75\xb0)"
6422   },
6423   {
6424     "df_mirror_fixed_13",
6425     "df_mirror_fixed",
6426     "fixed mirror (DF style) (135\xb0)"
6427   },
6428   {
6429     "df_mirror_fixed_14",
6430     "df_mirror_fixed",
6431     "fixed mirror (DF style) (146.25\xb0)"
6432   },
6433   {
6434     "df_mirror_fixed_15",
6435     "df_mirror_fixed",
6436     "fixed mirror (DF style) (157.5\xb0)"
6437   },
6438   {
6439     "df_mirror_fixed_16",
6440     "df_mirror_fixed",
6441     "fixed mirror (DF style) (168.75\xb0)"
6442   },
6443   {
6444     "df_slope_1",
6445     "df_slope",
6446     "slope (DF style) (45\xb0)"
6447   },
6448   {
6449     "df_slope_2",
6450     "df_slope",
6451     "slope (DF style) (135\xb0)"
6452   },
6453   {
6454     "df_slope_3",
6455     "df_slope",
6456     "slope (DF style) (225\xb0)"
6457   },
6458   {
6459     "df_slope_4",
6460     "df_slope",
6461     "slope (DF style) (315\xb0)"
6462   },
6463
6464   // --------------------------------------------------------------------------
6465   // "real" (and therefore drawable) runtime elements
6466   // --------------------------------------------------------------------------
6467
6468   {
6469     "dynabomb_player_1.active",
6470     "dynabomb",
6471     "-"
6472   },
6473   {
6474     "dynabomb_player_2.active",
6475     "dynabomb",
6476     "-"
6477   },
6478   {
6479     "dynabomb_player_3.active",
6480     "dynabomb",
6481     "-"
6482   },
6483   {
6484     "dynabomb_player_4.active",
6485     "dynabomb",
6486     "-"
6487   },
6488   {
6489     "sp_disk_red.active",
6490     "dynamite",
6491     "-"
6492   },
6493   {
6494     "switchgate.opening",
6495     "switchgate",
6496     "-"
6497   },
6498   {
6499     "switchgate.closing",
6500     "switchgate",
6501     "-"
6502   },
6503   {
6504     "timegate.opening",
6505     "timegate",
6506     "-"
6507   },
6508   {
6509     "timegate.closing",
6510     "timegate",
6511     "-"
6512   },
6513   {
6514     "pearl.breaking",
6515     "pearl",
6516     "-"
6517   },
6518   {
6519     "trap.active",
6520     "trap",
6521     "-"
6522   },
6523   {
6524     "invisible_steelwall.active",
6525     "steelwall",
6526     "-"
6527   },
6528   {
6529     "invisible_wall.active",
6530     "wall",
6531     "-"
6532   },
6533   {
6534     "invisible_sand.active",
6535     "sand",
6536     "-"
6537   },
6538   {
6539     "conveyor_belt_1_left.active",
6540     "conveyor_belt",
6541     "-"
6542   },
6543   {
6544     "conveyor_belt_1_middle.active",
6545     "conveyor_belt",
6546     "-"
6547   },
6548   {
6549     "conveyor_belt_1_right.active",
6550     "conveyor_belt",
6551     "-"
6552   },
6553   {
6554     "conveyor_belt_2_left.active",
6555     "conveyor_belt",
6556     "-"
6557   },
6558   {
6559     "conveyor_belt_2_middle.active",
6560     "conveyor_belt",
6561     "-"
6562   },
6563   {
6564     "conveyor_belt_2_right.active",
6565     "conveyor_belt",
6566     "-"
6567   },
6568   {
6569     "conveyor_belt_3_left.active",
6570     "conveyor_belt",
6571     "-"
6572   },
6573   {
6574     "conveyor_belt_3_middle.active",
6575     "conveyor_belt",
6576     "-"
6577   },
6578   {
6579     "conveyor_belt_3_right.active",
6580     "conveyor_belt",
6581     "-"
6582   },
6583   {
6584     "conveyor_belt_4_left.active",
6585     "conveyor_belt",
6586     "-"
6587   },
6588   {
6589     "conveyor_belt_4_middle.active",
6590     "conveyor_belt",
6591     "-"
6592   },
6593   {
6594     "conveyor_belt_4_right.active",
6595     "conveyor_belt",
6596     "-"
6597   },
6598   {
6599     "exit.opening",
6600     "exit",
6601     "-"
6602   },
6603   {
6604     "exit.closing",
6605     "exit",
6606     "-"
6607   },
6608   {
6609     "steel_exit.opening",
6610     "steel_exit",
6611     "-"
6612   },
6613   {
6614     "steel_exit.closing",
6615     "steel_exit",
6616     "-"
6617   },
6618   {
6619     "em_exit.opening",
6620     "em_exit",
6621     "-"
6622   },
6623   {
6624     "em_exit.closing",
6625     "em_exit",
6626     "-"
6627   },
6628   {
6629     "em_steel_exit.opening",
6630     "em_steel_exit",
6631     "-"
6632   },
6633   {
6634     "em_steel_exit.closing",
6635     "em_steel_exit",
6636     "-"
6637   },
6638   {
6639     "sp_exit.opening",
6640     "sp_exit",
6641     "-"
6642   },
6643   {
6644     "sp_exit.closing",
6645     "sp_exit",
6646     "-"
6647   },
6648   {
6649     "sp_exit_open",
6650     "sp_exit",
6651     "-"
6652   },
6653   {
6654     "sp_terminal.active",
6655     "sp_terminal",
6656     "-"
6657   },
6658   {
6659     "sp_buggy_base.activating",
6660     "sp_buggy_base",
6661     "-"
6662   },
6663   {
6664     "sp_buggy_base.active",
6665     "sp_buggy_base",
6666     "-"
6667   },
6668   {
6669     "sp_murphy_clone",
6670     "murphy_clone",
6671     "-"
6672   },
6673   {
6674     "amoeba.dropping",
6675     "amoeba",
6676     "-"
6677   },
6678   {
6679     "quicksand.emptying",
6680     "quicksand",
6681     "-"
6682   },
6683   {
6684     "quicksand_fast.emptying",
6685     "quicksand",
6686     "-"
6687   },
6688   {
6689     "magic_wall.active",
6690     "magic_wall",
6691     "-"
6692   },
6693   {
6694     "bd_magic_wall.active",
6695     "magic_wall",
6696     "-"
6697   },
6698   {
6699     "dc_magic_wall.active",
6700     "magic_wall",
6701     "-"
6702   },
6703   {
6704     "magic_wall_full",
6705     "magic_wall",
6706     "-"
6707   },
6708   {
6709     "bd_magic_wall_full",
6710     "magic_wall",
6711     "-"
6712   },
6713   {
6714     "dc_magic_wall_full",
6715     "magic_wall",
6716     "-"
6717   },
6718   {
6719     "magic_wall.emptying",
6720     "magic_wall",
6721     "-"
6722   },
6723   {
6724     "bd_magic_wall.emptying",
6725     "magic_wall",
6726     "-"
6727   },
6728   {
6729     "dc_magic_wall.emptying",
6730     "magic_wall",
6731     "-"
6732   },
6733   {
6734     "magic_wall_dead",
6735     "magic_wall",
6736     "-"
6737   },
6738   {
6739     "bd_magic_wall_dead",
6740     "magic_wall",
6741     "-"
6742   },
6743   {
6744     "dc_magic_wall_dead",
6745     "magic_wall",
6746     "-"
6747   },
6748
6749   {
6750     "emc_fake_grass.active",
6751     "fake_grass",
6752     "-"
6753   },
6754   {
6755     "gate_1_gray.active",
6756     "gate",
6757     ""
6758   },
6759   {
6760     "gate_2_gray.active",
6761     "gate",
6762     ""
6763   },
6764   {
6765     "gate_3_gray.active",
6766     "gate",
6767     ""
6768   },
6769   {
6770     "gate_4_gray.active",
6771     "gate",
6772     ""
6773   },
6774   {
6775     "em_gate_1_gray.active",
6776     "gate",
6777     ""
6778   },
6779   {
6780     "em_gate_2_gray.active",
6781     "gate",
6782     ""
6783   },
6784   {
6785     "em_gate_3_gray.active",
6786     "gate",
6787     ""
6788   },
6789   {
6790     "em_gate_4_gray.active",
6791     "gate",
6792     ""
6793   },
6794   {
6795     "emc_gate_5_gray.active",
6796     "gate",
6797     "",
6798   },
6799   {
6800     "emc_gate_6_gray.active",
6801     "gate",
6802     "",
6803   },
6804   {
6805     "emc_gate_7_gray.active",
6806     "gate",
6807     "",
6808   },
6809   {
6810     "emc_gate_8_gray.active",
6811     "gate",
6812     "",
6813   },
6814   {
6815     "dc_gate_white_gray.active",
6816     "gate",
6817     "",
6818   },
6819   {
6820     "emc_dripper.active",
6821     "dripper",
6822     "dripper"
6823   },
6824   {
6825     "emc_spring_bumper.active",
6826     "emc_spring_bumper",
6827     "spring bumper",
6828   },
6829   {
6830     "mm_exit.opening",
6831     "mm_exit",
6832     "-"
6833   },
6834   {
6835     "mm_exit.closing",
6836     "mm_exit",
6837     "-"
6838   },
6839   {
6840     "mm_gray_ball.active",
6841     "mm_gray_ball",
6842     "-",
6843   },
6844   {
6845     "mm_gray_ball.opening",
6846     "mm_gray_ball",
6847     "-",
6848   },
6849   {
6850     "mm_ice_wall.shrinking",
6851     "mm_ice_wall",
6852     "-",
6853   },
6854   {
6855     "mm_amoeba_wall.growing",
6856     "mm_amoeba_wall",
6857     "-",
6858   },
6859   {
6860     "mm_pacman.eating.right",
6861     "mm_pacman",
6862     "pac man (eating right)"
6863   },
6864   {
6865     "mm_pacman.eating.up",
6866     "mm_pacman",
6867     "pac man (eating up)"
6868   },
6869   {
6870     "mm_pacman.eating.left",
6871     "mm_pacman",
6872     "pac man (eating left)"
6873   },
6874   {
6875     "mm_pacman.eating.down",
6876     "mm_pacman",
6877     "pac man (eating down)"
6878   },
6879   {
6880     "mm_bomb.active",
6881     "mm_bomb",
6882     "active bomb (MM style)"
6883   },
6884   {
6885     "df_mine.active",
6886     "df_mine",
6887     "active mine"
6888   },
6889
6890   // --------------------------------------------------------------------------
6891   // "unreal" (and therefore not drawable) runtime elements
6892   // --------------------------------------------------------------------------
6893
6894   {
6895     "blocked",
6896     "-",
6897     "-"
6898   },
6899   {
6900     "explosion",
6901     "-",
6902     "-"
6903   },
6904   {
6905     "nut.breaking",
6906     "-",
6907     "-"
6908   },
6909   {
6910     "diamond.breaking",
6911     "-",
6912     "-"
6913   },
6914   {
6915     "acid_splash_left",
6916     "-",
6917     "-"
6918   },
6919   {
6920     "acid_splash_right",
6921     "-",
6922     "-"
6923   },
6924   {
6925     "amoeba.growing",
6926     "-",
6927     "-"
6928   },
6929   {
6930     "amoeba.shrinking",
6931     "-",
6932     "-"
6933   },
6934   {
6935     "expandable_wall.growing",
6936     "-",
6937     "-"
6938   },
6939   {
6940     "expandable_steelwall.growing",
6941     "-",
6942     "-"
6943   },
6944   {
6945     "flames",
6946     "-",
6947     "-"
6948   },
6949   {
6950     "player_is_leaving",
6951     "-",
6952     "-"
6953   },
6954   {
6955     "player_is_exploding_1",
6956     "-",
6957     "-"
6958   },
6959   {
6960     "player_is_exploding_2",
6961     "-",
6962     "-"
6963   },
6964   {
6965     "player_is_exploding_3",
6966     "-",
6967     "-"
6968   },
6969   {
6970     "player_is_exploding_4",
6971     "-",
6972     "-"
6973   },
6974   {
6975     "quicksand.filling",
6976     "quicksand",
6977     "-"
6978   },
6979   {
6980     "quicksand_fast.filling",
6981     "quicksand",
6982     "-"
6983   },
6984   {
6985     "magic_wall.filling",
6986     "-",
6987     "-"
6988   },
6989   {
6990     "bd_magic_wall.filling",
6991     "-",
6992     "-"
6993   },
6994   {
6995     "dc_magic_wall.filling",
6996     "-",
6997     "-"
6998   },
6999   {
7000     "element.snapping",
7001     "-",
7002     "-"
7003   },
7004   {
7005     "diagonal.shrinking",
7006     "-",
7007     "-"
7008   },
7009   {
7010     "diagonal.growing",
7011     "-",
7012     "-"
7013   },
7014
7015   // --------------------------------------------------------------------------
7016   // dummy elements (never used as game elements, only used as graphics)
7017   // --------------------------------------------------------------------------
7018
7019   {
7020     "steelwall_topleft",
7021     "-",
7022     "-"
7023   },
7024   {
7025     "steelwall_topright",
7026     "-",
7027     "-"
7028   },
7029   {
7030     "steelwall_bottomleft",
7031     "-",
7032     "-"
7033   },
7034   {
7035     "steelwall_bottomright",
7036     "-",
7037     "-"
7038   },
7039   {
7040     "steelwall_horizontal",
7041     "-",
7042     "-"
7043   },
7044   {
7045     "steelwall_vertical",
7046     "-",
7047     "-"
7048   },
7049   {
7050     "invisible_steelwall_topleft",
7051     "-",
7052     "-"
7053   },
7054   {
7055     "invisible_steelwall_topright",
7056     "-",
7057     "-"
7058   },
7059   {
7060     "invisible_steelwall_bottomleft",
7061     "-",
7062     "-"
7063   },
7064   {
7065     "invisible_steelwall_bottomright",
7066     "-",
7067     "-"
7068   },
7069   {
7070     "invisible_steelwall_horizontal",
7071     "-",
7072     "-"
7073   },
7074   {
7075     "invisible_steelwall_vertical",
7076     "-",
7077     "-"
7078   },
7079   {
7080     "dynabomb",
7081     "-",
7082     "-"
7083   },
7084   {
7085     "dynabomb.active",
7086     "-",
7087     "-"
7088   },
7089   {
7090     "dynabomb_player_1",
7091     "-",
7092     "-"
7093   },
7094   {
7095     "dynabomb_player_2",
7096     "-",
7097     "-"
7098   },
7099   {
7100     "dynabomb_player_3",
7101     "-",
7102     "-"
7103   },
7104   {
7105     "dynabomb_player_4",
7106     "-",
7107     "-"
7108   },
7109   {
7110     "shield_normal.active",
7111     "-",
7112     "-"
7113   },
7114   {
7115     "shield_deadly.active",
7116     "-",
7117     "-"
7118   },
7119   {
7120     "amoeba",
7121     "amoeba",
7122     "-"
7123   },
7124   {
7125     "mm_lightball_red",
7126     "-",
7127     "-"
7128   },
7129   {
7130     "mm_lightball_blue",
7131     "-",
7132     "-"
7133   },
7134   {
7135     "mm_lightball_yellow",
7136     "-",
7137     "-"
7138   },
7139   {
7140     "[default]",
7141     "default",
7142     "-"
7143   },
7144   {
7145     "[bd_default]",
7146     "bd_default",
7147     "-"
7148   },
7149   {
7150     "[sp_default]",
7151     "sp_default",
7152     "-"
7153   },
7154   {
7155     "[sb_default]",
7156     "sb_default",
7157     "-"
7158   },
7159   {
7160     "[mm_default]",
7161     "mm_default",
7162     "-"
7163   },
7164   {
7165     "graphic_1",
7166     "graphic",
7167     "-"
7168   },
7169   {
7170     "graphic_2",
7171     "graphic",
7172     "-"
7173   },
7174   {
7175     "graphic_3",
7176     "graphic",
7177     "-"
7178   },
7179   {
7180     "graphic_4",
7181     "graphic",
7182     "-"
7183   },
7184   {
7185     "graphic_5",
7186     "graphic",
7187     "-"
7188   },
7189   {
7190     "graphic_6",
7191     "graphic",
7192     "-"
7193   },
7194   {
7195     "graphic_7",
7196     "graphic",
7197     "-"
7198   },
7199   {
7200     "graphic_8",
7201     "graphic",
7202     "-"
7203   },
7204   {
7205     "internal_clipboard_custom",
7206     "internal",
7207     "empty custom element"
7208   },
7209   {
7210     "internal_clipboard_change",
7211     "internal",
7212     "empty change page"
7213   },
7214   {
7215     "internal_clipboard_group",
7216     "internal",
7217     "empty group element"
7218   },
7219   {
7220     "internal_dummy",
7221     "internal",
7222     "-"
7223   },
7224   {
7225     "internal_cascade_bd",
7226     "internal",
7227     "show Boulder Dash elements"
7228   },
7229   {
7230     "internal_cascade_bd.active",
7231     "internal",
7232     "hide Boulder Dash elements"
7233   },
7234   {
7235     "internal_cascade_em",
7236     "internal",
7237     "show Emerald Mine elements"
7238   },
7239   {
7240     "internal_cascade_em.active",
7241     "internal",
7242     "hide Emerald Mine elements"
7243   },
7244   {
7245     "internal_cascade_emc",
7246     "internal",
7247     "show Emerald Mine Club elements"
7248   },
7249   {
7250     "internal_cascade_emc.active",
7251     "internal",
7252     "hide Emerald Mine Club elements"
7253   },
7254   {
7255     "internal_cascade_rnd",
7256     "internal",
7257     "show Rocks'n'Diamonds elements"
7258   },
7259   {
7260     "internal_cascade_rnd.active",
7261     "internal",
7262     "hide Rocks'n'Diamonds elements"
7263   },
7264   {
7265     "internal_cascade_sb",
7266     "internal",
7267     "show Sokoban elements"
7268   },
7269   {
7270     "internal_cascade_sb.active",
7271     "internal",
7272     "hide Sokoban elements"
7273   },
7274   {
7275     "internal_cascade_sp",
7276     "internal",
7277     "show Supaplex elements"
7278   },
7279   {
7280     "internal_cascade_sp.active",
7281     "internal",
7282     "hide Supaplex elements"
7283   },
7284   {
7285     "internal_cascade_dc",
7286     "internal",
7287     "show Diamond Caves II elements"
7288   },
7289   {
7290     "internal_cascade_dc.active",
7291     "internal",
7292     "hide Diamond Caves II elements"
7293   },
7294   {
7295     "internal_cascade_dx",
7296     "internal",
7297     "show DX Boulderdash elements"
7298   },
7299   {
7300     "internal_cascade_dx.active",
7301     "internal",
7302     "hide DX Boulderdash elements"
7303   },
7304   {
7305     "internal_cascade_mm",
7306     "internal",
7307     "show Mirror Magic elements"
7308   },
7309   {
7310     "internal_cascade_mm.active",
7311     "internal",
7312     "hide Mirror Magic elements"
7313   },
7314   {
7315     "internal_cascade_df",
7316     "internal",
7317     "show Deflektor elements"
7318   },
7319   {
7320     "internal_cascade_df.active",
7321     "internal",
7322     "hide Deflektor elements"
7323   },
7324   {
7325     "internal_cascade_chars",
7326     "internal",
7327     "show text elements"
7328   },
7329   {
7330     "internal_cascade_chars.active",
7331     "internal",
7332     "hide text elements"
7333   },
7334   {
7335     "internal_cascade_steel_chars",
7336     "internal",
7337     "show steel text elements"
7338   },
7339   {
7340     "internal_cascade_steel_chars.active",
7341     "internal",
7342     "hide steel text elements"
7343   },
7344   {
7345     "internal_cascade_ce",
7346     "internal",
7347     "show custom elements"
7348   },
7349   {
7350     "internal_cascade_ce.active",
7351     "internal",
7352     "hide custom elements"
7353   },
7354   {
7355     "internal_cascade_ge",
7356     "internal",
7357     "show group elements"
7358   },
7359   {
7360     "internal_cascade_ge.active",
7361     "internal",
7362     "hide group elements"
7363   },
7364   {
7365     "internal_cascade_es",
7366     "internal",
7367     "show empty space elements"
7368   },
7369   {
7370     "internal_cascade_es.active",
7371     "internal",
7372     "hide empty space elements"
7373   },
7374   {
7375     "internal_cascade_ref",
7376     "internal",
7377     "show reference elements"
7378   },
7379   {
7380     "internal_cascade_ref.active",
7381     "internal",
7382     "hide reference elements"
7383   },
7384   {
7385     "internal_cascade_user",
7386     "internal",
7387     "show user defined elements"
7388   },
7389   {
7390     "internal_cascade_user.active",
7391     "internal",
7392     "hide user defined elements"
7393   },
7394   {
7395     "internal_cascade_dynamic",
7396     "internal",
7397     "show elements used in this level"
7398   },
7399   {
7400     "internal_cascade_dynamic.active",
7401     "internal",
7402     "hide elements used in this level"
7403   },
7404
7405   // keyword to stop parser: "ELEMENT_INFO_END" <-- do not change!
7406
7407   {
7408     NULL,
7409     NULL,
7410     NULL
7411   }
7412 };
7413
7414
7415 // ----------------------------------------------------------------------------
7416 // element action and direction definitions
7417 // ----------------------------------------------------------------------------
7418
7419 struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] =
7420 {
7421   { ".[DEFAULT]",               ACTION_DEFAULT,                 TRUE    },
7422   { ".waiting",                 ACTION_WAITING,                 TRUE    },
7423   { ".falling",                 ACTION_FALLING,                 TRUE    },
7424   { ".moving",                  ACTION_MOVING,                  TRUE    },
7425   { ".digging",                 ACTION_DIGGING,                 FALSE   },
7426   { ".snapping",                ACTION_SNAPPING,                FALSE   },
7427   { ".collecting",              ACTION_COLLECTING,              FALSE   },
7428   { ".dropping",                ACTION_DROPPING,                FALSE   },
7429   { ".pushing",                 ACTION_PUSHING,                 FALSE   },
7430   { ".walking",                 ACTION_WALKING,                 FALSE   },
7431   { ".passing",                 ACTION_PASSING,                 FALSE   },
7432   { ".impact",                  ACTION_IMPACT,                  FALSE   },
7433   { ".breaking",                ACTION_BREAKING,                FALSE   },
7434   { ".activating",              ACTION_ACTIVATING,              FALSE   },
7435   { ".deactivating",            ACTION_DEACTIVATING,            FALSE   },
7436   { ".opening",                 ACTION_OPENING,                 FALSE   },
7437   { ".closing",                 ACTION_CLOSING,                 FALSE   },
7438   { ".attacking",               ACTION_ATTACKING,               TRUE    },
7439   { ".growing",                 ACTION_GROWING,                 TRUE    },
7440   { ".shrinking",               ACTION_SHRINKING,               FALSE   },
7441   { ".active",                  ACTION_ACTIVE,                  TRUE    },
7442   { ".filling",                 ACTION_FILLING,                 FALSE   },
7443   { ".emptying",                ACTION_EMPTYING,                FALSE   },
7444   { ".changing",                ACTION_CHANGING,                FALSE   },
7445   { ".exploding",               ACTION_EXPLODING,               FALSE   },
7446   { ".boring",                  ACTION_BORING,                  FALSE   },
7447   { ".boring[1]",               ACTION_BORING_1,                FALSE   },
7448   { ".boring[2]",               ACTION_BORING_2,                FALSE   },
7449   { ".boring[3]",               ACTION_BORING_3,                FALSE   },
7450   { ".boring[4]",               ACTION_BORING_4,                FALSE   },
7451   { ".boring[5]",               ACTION_BORING_5,                FALSE   },
7452   { ".boring[6]",               ACTION_BORING_6,                FALSE   },
7453   { ".boring[7]",               ACTION_BORING_7,                FALSE   },
7454   { ".boring[8]",               ACTION_BORING_8,                FALSE   },
7455   { ".boring[9]",               ACTION_BORING_9,                FALSE   },
7456   { ".boring[10]",              ACTION_BORING_10,               FALSE   },
7457   { ".sleeping",                ACTION_SLEEPING,                FALSE   },
7458   { ".sleeping[1]",             ACTION_SLEEPING_1,              FALSE   },
7459   { ".sleeping[2]",             ACTION_SLEEPING_2,              FALSE   },
7460   { ".sleeping[3]",             ACTION_SLEEPING_3,              FALSE   },
7461   { ".awakening",               ACTION_AWAKENING,               FALSE   },
7462   { ".dying",                   ACTION_DYING,                   FALSE   },
7463   { ".turning",                 ACTION_TURNING,                 FALSE   },
7464   { ".turning_from_left",       ACTION_TURNING_FROM_LEFT,       FALSE   },
7465   { ".turning_from_right",      ACTION_TURNING_FROM_RIGHT,      FALSE   },
7466   { ".turning_from_up",         ACTION_TURNING_FROM_UP,         FALSE   },
7467   { ".turning_from_down",       ACTION_TURNING_FROM_DOWN,       FALSE   },
7468   { ".smashed_by_rock",         ACTION_SMASHED_BY_ROCK,         FALSE   },
7469   { ".smashed_by_spring",       ACTION_SMASHED_BY_SPRING,       FALSE   },
7470   { ".eating",                  ACTION_EATING,                  FALSE   },
7471   { ".twinkling",               ACTION_TWINKLING,               FALSE   },
7472   { ".splashing",               ACTION_SPLASHING,               FALSE   },
7473   { ".hitting",                 ACTION_HITTING,                 FALSE   },
7474   { ".page[1]",                 ACTION_PAGE_1,                  FALSE   },
7475   { ".page[2]",                 ACTION_PAGE_2,                  FALSE   },
7476   { ".page[3]",                 ACTION_PAGE_3,                  FALSE   },
7477   { ".page[4]",                 ACTION_PAGE_4,                  FALSE   },
7478   { ".page[5]",                 ACTION_PAGE_5,                  FALSE   },
7479   { ".page[6]",                 ACTION_PAGE_6,                  FALSE   },
7480   { ".page[7]",                 ACTION_PAGE_7,                  FALSE   },
7481   { ".page[8]",                 ACTION_PAGE_8,                  FALSE   },
7482   { ".page[9]",                 ACTION_PAGE_9,                  FALSE   },
7483   { ".page[10]",                ACTION_PAGE_10,                 FALSE   },
7484   { ".page[11]",                ACTION_PAGE_11,                 FALSE   },
7485   { ".page[12]",                ACTION_PAGE_12,                 FALSE   },
7486   { ".page[13]",                ACTION_PAGE_13,                 FALSE   },
7487   { ".page[14]",                ACTION_PAGE_14,                 FALSE   },
7488   { ".page[15]",                ACTION_PAGE_15,                 FALSE   },
7489   { ".page[16]",                ACTION_PAGE_16,                 FALSE   },
7490   { ".page[17]",                ACTION_PAGE_17,                 FALSE   },
7491   { ".page[18]",                ACTION_PAGE_18,                 FALSE   },
7492   { ".page[19]",                ACTION_PAGE_19,                 FALSE   },
7493   { ".page[20]",                ACTION_PAGE_20,                 FALSE   },
7494   { ".page[21]",                ACTION_PAGE_21,                 FALSE   },
7495   { ".page[22]",                ACTION_PAGE_22,                 FALSE   },
7496   { ".page[23]",                ACTION_PAGE_23,                 FALSE   },
7497   { ".page[24]",                ACTION_PAGE_24,                 FALSE   },
7498   { ".page[25]",                ACTION_PAGE_25,                 FALSE   },
7499   { ".page[26]",                ACTION_PAGE_26,                 FALSE   },
7500   { ".page[27]",                ACTION_PAGE_27,                 FALSE   },
7501   { ".page[28]",                ACTION_PAGE_28,                 FALSE   },
7502   { ".page[29]",                ACTION_PAGE_29,                 FALSE   },
7503   { ".page[30]",                ACTION_PAGE_30,                 FALSE   },
7504   { ".page[31]",                ACTION_PAGE_31,                 FALSE   },
7505   { ".page[32]",                ACTION_PAGE_32,                 FALSE   },
7506   { ".part_1",                  ACTION_PART_1,                  FALSE   },
7507   { ".part_2",                  ACTION_PART_2,                  FALSE   },
7508   { ".part_3",                  ACTION_PART_3,                  FALSE   },
7509   { ".part_4",                  ACTION_PART_4,                  FALSE   },
7510   { ".part_5",                  ACTION_PART_5,                  FALSE   },
7511   { ".part_6",                  ACTION_PART_6,                  FALSE   },
7512   { ".part_7",                  ACTION_PART_7,                  FALSE   },
7513   { ".part_8",                  ACTION_PART_8,                  FALSE   },
7514   { ".part_9",                  ACTION_PART_9,                  FALSE   },
7515   { ".part_10",                 ACTION_PART_10,                 FALSE   },
7516   { ".part_11",                 ACTION_PART_11,                 FALSE   },
7517   { ".part_12",                 ACTION_PART_12,                 FALSE   },
7518   { ".part_13",                 ACTION_PART_13,                 FALSE   },
7519   { ".part_14",                 ACTION_PART_14,                 FALSE   },
7520   { ".part_15",                 ACTION_PART_15,                 FALSE   },
7521   { ".part_16",                 ACTION_PART_16,                 FALSE   },
7522   { ".part_17",                 ACTION_PART_17,                 FALSE   },
7523   { ".part_18",                 ACTION_PART_18,                 FALSE   },
7524   { ".part_19",                 ACTION_PART_19,                 FALSE   },
7525   { ".part_20",                 ACTION_PART_20,                 FALSE   },
7526   { ".part_21",                 ACTION_PART_21,                 FALSE   },
7527   { ".part_22",                 ACTION_PART_22,                 FALSE   },
7528   { ".part_23",                 ACTION_PART_23,                 FALSE   },
7529   { ".part_24",                 ACTION_PART_24,                 FALSE   },
7530   { ".part_25",                 ACTION_PART_25,                 FALSE   },
7531   { ".part_26",                 ACTION_PART_26,                 FALSE   },
7532   { ".part_27",                 ACTION_PART_27,                 FALSE   },
7533   { ".part_28",                 ACTION_PART_28,                 FALSE   },
7534   { ".part_29",                 ACTION_PART_29,                 FALSE   },
7535   { ".part_30",                 ACTION_PART_30,                 FALSE   },
7536   { ".part_31",                 ACTION_PART_31,                 FALSE   },
7537   { ".part_32",                 ACTION_PART_32,                 FALSE   },
7538   { ".other",                   ACTION_OTHER,                   FALSE   },
7539
7540   // empty suffix always matches -- check as last entry in InitSoundInfo()
7541   { "",                         ACTION_DEFAULT,                 TRUE    },
7542
7543   { NULL,                       0,                              0       }
7544 };
7545
7546 struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS_FULL + 1] =
7547 {
7548   { ".left",                    MV_BIT_LEFT                             },
7549   { ".right",                   MV_BIT_RIGHT                            },
7550   { ".up",                      MV_BIT_UP                               },
7551   { ".down",                    MV_BIT_DOWN                             },
7552   { ".upleft",                  MV_BIT_UP                               },
7553   { ".upright",                 MV_BIT_RIGHT                            },
7554   { ".downleft",                MV_BIT_LEFT                             },
7555   { ".downright",               MV_BIT_DOWN                             },
7556
7557   { NULL,                       0                                       }
7558 };
7559
7560 struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1 + 1] =
7561 {
7562   { ".[DEFAULT]",               GFX_SPECIAL_ARG_DEFAULT,                },
7563   { ".LOADING_INITIAL",         GFX_SPECIAL_ARG_LOADING_INITIAL,        },
7564   { ".LOADING",                 GFX_SPECIAL_ARG_LOADING,                },
7565   { ".TITLE_INITIAL",           GFX_SPECIAL_ARG_TITLE_INITIAL,          },
7566   { ".TITLE_INITIAL_1",         GFX_SPECIAL_ARG_TITLE_INITIAL_1,        },
7567   { ".TITLE_INITIAL_2",         GFX_SPECIAL_ARG_TITLE_INITIAL_2,        },
7568   { ".TITLE_INITIAL_3",         GFX_SPECIAL_ARG_TITLE_INITIAL_3,        },
7569   { ".TITLE_INITIAL_4",         GFX_SPECIAL_ARG_TITLE_INITIAL_4,        },
7570   { ".TITLE_INITIAL_5",         GFX_SPECIAL_ARG_TITLE_INITIAL_5,        },
7571   { ".TITLE",                   GFX_SPECIAL_ARG_TITLE,                  },
7572   { ".TITLE_1",                 GFX_SPECIAL_ARG_TITLE_1,                },
7573   { ".TITLE_2",                 GFX_SPECIAL_ARG_TITLE_2,                },
7574   { ".TITLE_3",                 GFX_SPECIAL_ARG_TITLE_3,                },
7575   { ".TITLE_4",                 GFX_SPECIAL_ARG_TITLE_4,                },
7576   { ".TITLE_5",                 GFX_SPECIAL_ARG_TITLE_5,                },
7577   { ".MAIN",                    GFX_SPECIAL_ARG_MAIN,                   },
7578   { ".NAMES",                   GFX_SPECIAL_ARG_NAMES,                  },
7579   { ".LEVELS",                  GFX_SPECIAL_ARG_LEVELS                  },
7580   { ".LEVELNR",                 GFX_SPECIAL_ARG_LEVELNR                 },
7581   { ".SCORES",                  GFX_SPECIAL_ARG_SCORES,                 },
7582   { ".SCOREINFO",               GFX_SPECIAL_ARG_SCOREINFO,              },
7583   { ".EDITOR",                  GFX_SPECIAL_ARG_EDITOR,                 },
7584   { ".INFO",                    GFX_SPECIAL_ARG_INFO,                   },
7585   { ".SETUP",                   GFX_SPECIAL_ARG_SETUP,                  },
7586   { ".PLAYING",                 GFX_SPECIAL_ARG_PLAYING,                },
7587   { ".DOOR",                    GFX_SPECIAL_ARG_DOOR,                   },
7588   { ".TAPE",                    GFX_SPECIAL_ARG_TAPE,                   },
7589   { ".PANEL",                   GFX_SPECIAL_ARG_PANEL,                  },
7590   { ".PREVIEW",                 GFX_SPECIAL_ARG_PREVIEW,                },
7591   { ".CRUMBLED",                GFX_SPECIAL_ARG_CRUMBLED,               },
7592   { ".MAINONLY",                GFX_SPECIAL_ARG_MAINONLY,               },
7593   { ".NAMESONLY",               GFX_SPECIAL_ARG_NAMESONLY,              },
7594   { ".SCORESONLY",              GFX_SPECIAL_ARG_SCORESONLY,             },
7595   { ".TYPENAME",                GFX_SPECIAL_ARG_TYPENAME,               },
7596   { ".TYPENAMES",               GFX_SPECIAL_ARG_TYPENAMES,              },
7597   { ".SUBMENU",                 GFX_SPECIAL_ARG_SUBMENU,                },
7598   { ".MENU",                    GFX_SPECIAL_ARG_MENU,                   },
7599   { ".TOONS",                   GFX_SPECIAL_ARG_TOONS,                  },
7600   { ".SCORESOLD",               GFX_SPECIAL_ARG_SCORESOLD,              },
7601   { ".SCORESNEW",               GFX_SPECIAL_ARG_SCORESNEW,              },
7602   { ".NO_TITLE",                GFX_SPECIAL_ARG_NO_TITLE,               },
7603   { ".FADING",                  GFX_SPECIAL_ARG_FADING,                 },
7604   { ".QUIT",                    GFX_SPECIAL_ARG_QUIT,                   },
7605
7606   // empty suffix always matches -- check as last entry in InitMusicInfo()
7607   { "",                         GFX_SPECIAL_ARG_DEFAULT,                },
7608
7609   { NULL,                       0,                                      }
7610 };
7611
7612 #include "conf_var.c"   // include auto-generated data structure definitions
7613
7614
7615 // ----------------------------------------------------------------------------
7616 // font definitions
7617 // ----------------------------------------------------------------------------
7618
7619 // Important: When one entry is a prefix of another entry, the longer entry
7620 // must come first, because the dynamic configuration does prefix matching!
7621 // (These definitions must match the corresponding definitions in "main.h"!)
7622
7623 struct FontInfo font_info[NUM_FONTS + 1] =
7624 {
7625   { "font.initial_1"            },
7626   { "font.initial_2"            },
7627   { "font.initial_3"            },
7628   { "font.initial_4"            },
7629   { "font.title_1"              },
7630   { "font.title_2"              },
7631   { "font.menu_1.active"        },
7632   { "font.menu_2.active"        },
7633   { "font.menu_1"               },
7634   { "font.menu_2"               },
7635   { "font.text_1.active"        },
7636   { "font.text_2.active"        },
7637   { "font.text_3.active"        },
7638   { "font.text_4.active"        },
7639   { "font.text_1"               },
7640   { "font.text_2"               },
7641   { "font.text_3"               },
7642   { "font.text_4"               },
7643   { "font.envelope_1"           },
7644   { "font.envelope_2"           },
7645   { "font.envelope_3"           },
7646   { "font.envelope_4"           },
7647   { "font.request_narrow"       },
7648   { "font.request"              },
7649   { "font.input_1.active"       },
7650   { "font.input_2.active"       },
7651   { "font.input_1"              },
7652   { "font.input_2"              },
7653   { "font.option_off_narrow"    },
7654   { "font.option_off"           },
7655   { "font.option_on_narrow"     },
7656   { "font.option_on"            },
7657   { "font.value_1"              },
7658   { "font.value_2"              },
7659   { "font.value_old_narrow"     },
7660   { "font.value_old"            },
7661   { "font.value_narrow"         },
7662   { "font.level_number.active"  },
7663   { "font.level_number"         },
7664   { "font.tape_recorder"        },
7665   { "font.game_info"            },
7666   { "font.info.elements"        },
7667   { "font.info.levelset"        },
7668   { "font.main.network_players" },
7669
7670   { NULL                        }
7671 };
7672
7673 struct GlobalAnimInfo global_anim_info[NUM_GLOBAL_ANIM_TOKENS + 1];
7674
7675 // this contains predefined structure elements to init "global_anim_info"
7676 struct GlobalAnimNameInfo global_anim_name_info[NUM_GLOBAL_ANIM_TOKENS + 1] =
7677 {
7678   // (real) graphic definitions used to define animation graphics
7679   { "gfx.global.anim_1",        },
7680   { "gfx.global.anim_2",        },
7681   { "gfx.global.anim_3",        },
7682   { "gfx.global.anim_4",        },
7683   { "gfx.global.anim_5",        },
7684   { "gfx.global.anim_6",        },
7685   { "gfx.global.anim_7",        },
7686   { "gfx.global.anim_8",        },
7687   { "gfx.global.anim_9",        },
7688   { "gfx.global.anim_10",       },
7689   { "gfx.global.anim_11",       },
7690   { "gfx.global.anim_12",       },
7691   { "gfx.global.anim_13",       },
7692   { "gfx.global.anim_14",       },
7693   { "gfx.global.anim_15",       },
7694   { "gfx.global.anim_16",       },
7695   { "gfx.global.anim_17",       },
7696   { "gfx.global.anim_18",       },
7697   { "gfx.global.anim_19",       },
7698   { "gfx.global.anim_20",       },
7699   { "gfx.global.anim_21",       },
7700   { "gfx.global.anim_22",       },
7701   { "gfx.global.anim_23",       },
7702   { "gfx.global.anim_24",       },
7703   { "gfx.global.anim_25",       },
7704   { "gfx.global.anim_26",       },
7705   { "gfx.global.anim_27",       },
7706   { "gfx.global.anim_28",       },
7707   { "gfx.global.anim_29",       },
7708   { "gfx.global.anim_30",       },
7709   { "gfx.global.anim_31",       },
7710   { "gfx.global.anim_32",       },
7711
7712   // (dummy) graphic definitions used to define animation controls
7713   { "global.anim_1",            },
7714   { "global.anim_2",            },
7715   { "global.anim_3",            },
7716   { "global.anim_4",            },
7717   { "global.anim_5",            },
7718   { "global.anim_6",            },
7719   { "global.anim_7",            },
7720   { "global.anim_8",            },
7721   { "global.anim_9",            },
7722   { "global.anim_10",           },
7723   { "global.anim_11",           },
7724   { "global.anim_12",           },
7725   { "global.anim_13",           },
7726   { "global.anim_14",           },
7727   { "global.anim_15",           },
7728   { "global.anim_16",           },
7729   { "global.anim_17",           },
7730   { "global.anim_18",           },
7731   { "global.anim_19",           },
7732   { "global.anim_20",           },
7733   { "global.anim_21",           },
7734   { "global.anim_22",           },
7735   { "global.anim_23",           },
7736   { "global.anim_24",           },
7737   { "global.anim_25",           },
7738   { "global.anim_26",           },
7739   { "global.anim_27",           },
7740   { "global.anim_28",           },
7741   { "global.anim_29",           },
7742   { "global.anim_30",           },
7743   { "global.anim_31",           },
7744   { "global.anim_32",           },
7745
7746   { NULL                        }
7747 };
7748
7749 struct GlobalAnimEventInfo global_anim_event_info =
7750 {
7751   NULL, 0
7752 };
7753
7754
7755 // ----------------------------------------------------------------------------
7756 // music token prefix definitions
7757 // ----------------------------------------------------------------------------
7758
7759 struct MusicPrefixInfo music_prefix_info[NUM_MUSIC_PREFIXES + 1] =
7760 {
7761   { "background",               TRUE    },
7762
7763   { NULL,                       0       }
7764 };
7765
7766
7767 // ============================================================================
7768 // main()
7769 // ============================================================================
7770
7771 static void print_usage(void)
7772 {
7773   Print("\n"
7774         "Usage: %s [OPTION]... [HOSTNAME [PORT]]\n"
7775         "\n"
7776         "Options:\n"
7777         "  -b, --basepath DIRECTORY         alternative base DIRECTORY\n"
7778         "  -l, --levels DIRECTORY           alternative levels DIRECTORY\n"
7779         "  -g, --graphics DIRECTORY         alternative graphics DIRECTORY\n"
7780         "  -s, --sounds DIRECTORY           alternative sounds DIRECTORY\n"
7781         "  -m, --music DIRECTORY            alternative music DIRECTORY\n"
7782         "      --display NR                 open program window on display NR\n"
7783         "      --mytapes                    use private tapes for tape tests\n"
7784         "  -n, --network                    network multiplayer game\n"
7785         "      --serveronly                 only start network server\n"
7786         "  -v, --verbose                    verbose mode\n"
7787         "  -V, --version                    show program version\n"
7788         "      --debug[=MODE]               show (and limit) debug output\n"
7789         "  -e, --execute COMMAND            execute batch COMMAND\n"
7790         "\n"
7791         "Valid commands for '--execute' option:\n"
7792         "  \"print graphicsinfo.conf\"        print default graphics config\n"
7793         "  \"print soundsinfo.conf\"          print default sounds config\n"
7794         "  \"print musicinfo.conf\"           print default music config\n"
7795         "  \"print editorsetup.conf\"         print default editor config\n"
7796         "  \"print helpanim.conf\"            print default helpanim config\n"
7797         "  \"print helptext.conf\"            print default helptext config\n"
7798         "  \"dump level FILE\"                dump level data from FILE\n"
7799         "  \"dump tape FILE\"                 dump tape data from FILE\n"
7800         "  \"autoplay LEVELDIR [NR ...]\"     play level tapes for LEVELDIR\n"
7801         "  \"autoffwd LEVELDIR [NR ...]\"     ffwd level tapes for LEVELDIR\n"
7802         "  \"autowarp LEVELDIR [NR ...]\"     warp level tapes for LEVELDIR\n"
7803         "  \"autotest LEVELDIR [NR ...]\"     test level tapes for LEVELDIR\n"
7804         "  \"autofix LEVELDIR [NR ...]\"      test and fix tapes for LEVELDIR\n"
7805         "  \"patch tapes MODE LEVELDIR [NR]\" patch level tapes for LEVELDIR\n"
7806         "  \"convert LEVELDIR [NR]\"          convert levels in LEVELDIR\n"
7807         "  \"create sketch images DIRECTORY\" write BMP images to DIRECTORY\n"
7808         "  \"create collect image DIRECTORY\" write BMP image to DIRECTORY\n"
7809         "\n",
7810         program.command_basename);
7811 }
7812
7813 static void print_version(void)
7814 {
7815   Print("%s", getProgramInitString());
7816
7817   if (!strEqual(getProgramVersionString(), getProgramRealVersionString()))
7818   {
7819     Print(" (%s %d.%d.%d.%d%s)",
7820           PROGRAM_TITLE_STRING,
7821           PROGRAM_VERSION_SUPER,
7822           PROGRAM_VERSION_MAJOR,
7823           PROGRAM_VERSION_MINOR,
7824           PROGRAM_VERSION_PATCH,
7825           PROGRAM_VERSION_EXTRA);
7826   }
7827
7828   Print("\n");
7829
7830   if (options.debug)
7831   {
7832     SDL_version sdl_version;
7833
7834     SDL_VERSION(&sdl_version);
7835     Print("- SDL %d.%d.%d\n",
7836           sdl_version.major,
7837           sdl_version.minor,
7838           sdl_version.patch);
7839
7840     SDL_IMAGE_VERSION(&sdl_version);
7841     Print("- SDL_image %d.%d.%d\n",
7842           sdl_version.major,
7843           sdl_version.minor,
7844           sdl_version.patch);
7845
7846     SDL_MIXER_VERSION(&sdl_version);
7847     Print("- SDL_mixer %d.%d.%d\n",
7848           sdl_version.major,
7849           sdl_version.minor,
7850           sdl_version.patch);
7851
7852     SDL_NET_VERSION(&sdl_version);
7853     Print("- SDL_net %d.%d.%d\n",
7854           sdl_version.major,
7855           sdl_version.minor,
7856           sdl_version.patch);
7857   }
7858 }
7859
7860 static void InitProgramConfig(char *command_filename)
7861 {
7862   char *program_title = PROGRAM_TITLE_STRING;
7863   char *program_icon_file = PROGRAM_ICON_FILENAME;
7864   char *program_version = getProgramRealVersionString();
7865   char *program_basename = getBaseNameNoSuffix(command_filename);
7866   char *config_filename = getProgramConfigFilename(command_filename);
7867   char *userdata_subdir;
7868
7869   // read default program config, if existing
7870   if (fileExists(config_filename))
7871     LoadSetupFromFilename(config_filename);
7872
7873   // set program title from potentially redefined program title
7874   if (setup.internal.program_title != NULL &&
7875       strlen(setup.internal.program_title) > 0)
7876     program_title = getStringCopy(setup.internal.program_title);
7877
7878   // set program version from potentially redefined program version
7879   if (setup.internal.program_version != NULL &&
7880       strlen(setup.internal.program_version) > 0)
7881     program_version = getStringCopy(setup.internal.program_version);
7882
7883   // set program icon file from potentially redefined program icon file
7884   if (setup.internal.program_icon_file != NULL &&
7885       strlen(setup.internal.program_icon_file) > 0)
7886     program_icon_file = getStringCopy(setup.internal.program_icon_file);
7887
7888 #if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MAC) || defined(PLATFORM_EMSCRIPTEN)
7889   userdata_subdir = program_title;
7890 #elif defined(PLATFORM_UNIX)
7891   userdata_subdir = getStringCat2(".", program_basename);
7892 #else
7893   userdata_subdir = USERDATA_DIRECTORY_OTHER;
7894 #endif
7895
7896   // set default window size (only relevant on program startup)
7897   if (setup.internal.default_window_width  != 0 &&
7898       setup.internal.default_window_height != 0)
7899   {
7900     WIN_XSIZE = setup.internal.default_window_width;
7901     WIN_YSIZE = setup.internal.default_window_height;
7902   }
7903
7904   InitProgramInfo(command_filename,
7905                   config_filename,
7906                   userdata_subdir,
7907                   program_basename,
7908                   program_title,
7909                   program_icon_file,
7910                   COOKIE_PREFIX,
7911                   program_version,
7912                   GAME_VERSION_ACTUAL);
7913 }
7914
7915 int main(int argc, char *argv[])
7916 {
7917   InitProgramConfig(argv[0]);
7918
7919   InitWindowTitleFunction(getWindowTitleString);
7920   InitExitMessageFunction(DisplayExitMessage);
7921   InitExitFunction(CloseAllAndExit);
7922   InitPlatformDependentStuff();
7923
7924   GetOptions(argc, argv, print_usage, print_version);
7925   OpenAll();
7926
7927   EventLoop();
7928   CloseAllAndExit(0);
7929
7930   return 0;     // to keep compilers happy
7931 }