1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
7 // https://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
12 #include "libgame/libgame.h"
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;
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;
37 int key_joystick_mapping = 0;
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];
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];
77 int ActiveElement[MAX_NUM_ELEMENTS];
78 int ActiveButton[NUM_IMAGE_FILES];
79 int ActiveFont[NUM_FONTS];
81 int lev_fieldx, lev_fieldy;
82 int scroll_x, scroll_y;
84 int WIN_XSIZE = WIN_XSIZE_DEFAULT;
85 int WIN_YSIZE = WIN_YSIZE_DEFAULT;
87 int SCR_FIELDX = SCR_FIELDX_DEFAULT;
88 int SCR_FIELDY = SCR_FIELDY_DEFAULT;
90 int REAL_SX = 6, REAL_SY = 6;
92 int DX = 566, DY = 60;
93 int VX = 566, VY = 400;
94 int EX = 566, EY = 356;
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;
102 int FADE_SX = 6, FADE_SY = 6;
103 int FADE_SXSIZE = 2 + SXSIZE_DEFAULT + 2;
104 int FADE_SYSIZE = 2 + SXSIZE_DEFAULT + 2;
112 int TILESIZE_VAR = TILESIZE;
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;
124 int SBX_Left, SBX_Right;
125 int SBY_Upper, SBY_Lower;
127 int TimeFrames, TimePlayed, TimeLeft;
128 int TapeTimeFrames, TapeTime;
130 boolean network_player_action_received = FALSE;
132 struct LevelInfo level, level_template;
133 struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
134 struct ScoreInfo scores, server_scores;
135 struct TapeInfo tape;
136 struct GameInfo game;
137 struct GlobalInfo global;
138 struct BorderInfo border;
139 struct ViewportInfo viewport;
140 struct TitleFadingInfo fading;
141 struct TitleFadingInfo title_initial_first_default;
142 struct TitleFadingInfo title_initial_default;
143 struct TitleFadingInfo title_first_default;
144 struct TitleFadingInfo title_default;
145 struct TitleMessageInfo titlescreen_initial_first_default;
146 struct TitleMessageInfo titlescreen_initial_first[MAX_NUM_TITLE_IMAGES];
147 struct TitleMessageInfo titlescreen_initial_default;
148 struct TitleMessageInfo titlescreen_initial[MAX_NUM_TITLE_IMAGES];
149 struct TitleMessageInfo titlescreen_first_default;
150 struct TitleMessageInfo titlescreen_first[MAX_NUM_TITLE_IMAGES];
151 struct TitleMessageInfo titlescreen_default;
152 struct TitleMessageInfo titlescreen[MAX_NUM_TITLE_IMAGES];
153 struct TitleMessageInfo titlemessage_initial_first_default;
154 struct TitleMessageInfo titlemessage_initial_first[MAX_NUM_TITLE_MESSAGES];
155 struct TitleMessageInfo titlemessage_initial_default;
156 struct TitleMessageInfo titlemessage_initial[MAX_NUM_TITLE_MESSAGES];
157 struct TitleMessageInfo titlemessage_first_default;
158 struct TitleMessageInfo titlemessage_first[MAX_NUM_TITLE_MESSAGES];
159 struct TitleMessageInfo titlemessage_default;
160 struct TitleMessageInfo titlemessage[MAX_NUM_TITLE_MESSAGES];
161 struct TitleMessageInfo readme;
162 struct InitInfo init, init_last;
163 struct MenuInfo menu;
164 struct DoorInfo door_1, door_2;
165 struct RequestInfo request;
166 struct PreviewInfo preview;
167 struct EditorInfo editor;
169 struct GraphicInfo *graphic_info = NULL;
170 struct SoundInfo *sound_info = NULL;
171 struct MusicInfo *music_info = NULL;
172 struct MusicFileInfo *music_file_info = NULL;
173 struct HelpAnimInfo *helpanim_info = NULL;
175 SetupFileHash *helptext_info = NULL;
176 SetupFileHash *image_config_hash = NULL;
177 SetupFileHash *sound_config_hash = NULL;
178 SetupFileHash *element_token_hash = NULL;
179 SetupFileHash *graphic_token_hash = NULL;
180 SetupFileHash *font_token_hash = NULL;
181 SetupFileHash *hide_setup_hash = NULL;
182 SetupFileHash *anim_url_hash = NULL;
185 // ----------------------------------------------------------------------------
186 // element definitions
187 // ----------------------------------------------------------------------------
189 struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1];
191 // this contains predefined structure elements to initialize "element_info"
192 struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
194 // keyword to start parser: "ELEMENT_INFO_START" <-- do not change!
196 // --------------------------------------------------------------------------
197 // "real" level file elements
198 // --------------------------------------------------------------------------
248 "bug (random start direction)"
253 "spaceship (random start direction)"
258 "yam yam (random start direction)"
288 "quicksand (with rock)"
318 "dropping amoeba (EM style)"
333 "Conway's wall of life"
356 "robot_wheel.active",
358 "magic wheel (running)"
403 "gray door (opened by key 1)"
408 "gray door (opened by key 2)"
413 "gray door (opened by key 3)"
418 "gray door (opened by key 4)"
428 "pac man (random start direction)"
433 "invisible normal wall"
458 "amoeba with content"
478 "growing wall (horizontal, visible)"
493 "wall with BD style diamond"
496 "wall_emerald_yellow",
498 "wall with yellow emerald"
508 "magic wall (BD style)"
511 "invisible_steelwall",
513 "invisible steel wall"
516 "sokoban_field_player",
518 "sokoban field with player"
521 "dynabomb_increase_number",
523 "increases number of bombs"
526 "dynabomb_increase_size",
528 "increases explosion size"
531 "dynabomb_increase_power",
533 "increases power of explosion"
541 "sokoban_field_empty",
543 "sokoban empty field"
546 "sokoban_field_full",
548 "sokoban field with object"
551 "bd_butterfly.right",
553 "butterfly (starts moving right)"
558 "butterfly (starts moving up)"
563 "butterfly (starts moving left)"
568 "butterfly (starts moving down)"
573 "firefly (starts moving right)"
578 "firefly (starts moving up)"
583 "firefly (starts moving left)"
588 "firefly (starts moving down)"
593 "butterfly (random start direction)"
598 "firefly (random start direction)"
623 "bug (starts moving right)"
628 "bug (starts moving up)"
633 "bug (starts moving left)"
638 "bug (starts moving down)"
643 "spaceship (starts moving right)"
648 "spaceship (starts moving up)"
653 "spaceship (starts moving left)"
658 "spaceship (starts moving down)"
663 "pac man (starts moving right)"
668 "pac man (starts moving up)"
673 "pac man (starts moving left)"
678 "pac man (starts moving down)"
693 "wall with red emerald"
696 "wall_emerald_purple",
698 "wall with purple emerald"
703 "acid pool (top left)"
706 "acid_pool_topright",
708 "acid pool (top right)"
711 "acid_pool_bottomleft",
713 "acid pool (bottom left)"
721 "acid_pool_bottomright",
723 "acid pool (bottom right)"
728 "normal wall (BD style)"
753 "mole (random start direction)"
793 "fire breathing dragon"
796 "em_key_1_file_obsolete",
1106 "char_bracketright",
1201 "expandable_wall_horizontal",
1203 "growing wall (horizontal)"
1206 "expandable_wall_vertical",
1208 "growing wall (vertical)"
1211 "expandable_wall_any",
1213 "growing wall (any direction)"
1236 "em_key_2_file_obsolete",
1241 "em_key_3_file_obsolete",
1246 "em_key_4_file_obsolete",
1298 "port (leading right)"
1303 "port (leading down)"
1308 "port (leading left)"
1316 "sp_gravity_port_right",
1318 "gravity-on/off port (leading right)"
1321 "sp_gravity_port_down",
1323 "gravity-on/off port (leading down)"
1326 "sp_gravity_port_left",
1328 "gravity-on/off port (leading left)"
1331 "sp_gravity_port_up",
1333 "gravity-on/off port (leading up)"
1361 "sp_port_horizontal",
1368 "port (any direction)"
1391 "sp_hardware_base_1",
1396 "sp_hardware_green",
1411 "sp_hardware_yellow",
1416 "sp_hardware_base_2",
1421 "sp_hardware_base_3",
1426 "sp_hardware_base_4",
1431 "sp_hardware_base_5",
1436 "sp_hardware_base_6",
1453 "gray door (EM style, key 1)"
1458 "gray door (EM style, key 2)"
1463 "gray door (EM style, key 3)"
1468 "gray door (EM style, key 4)"
1473 "dynamite (EM style)"
1476 "em_dynamite.active",
1478 "burning dynamite (EM style)"
1506 "dc_gate_white_gray",
1508 "gray door (opened by white key)"
1528 "switch gate (open)"
1531 "switchgate_closed",
1533 "switch gate (closed)"
1536 "switchgate_switch_up",
1537 "switchgate_switch",
1538 "switch for switch gate"
1541 "switchgate_switch_down",
1542 "switchgate_switch",
1543 "switch for switch gate"
1556 "conveyor_belt_1_left",
1558 "conveyor belt 1 (left)"
1561 "conveyor_belt_1_middle",
1563 "conveyor belt 1 (middle)"
1566 "conveyor_belt_1_right",
1568 "conveyor belt 1 (right)"
1571 "conveyor_belt_1_switch_left",
1572 "conveyor_belt_switch",
1573 "switch for conveyor belt 1 (left)"
1576 "conveyor_belt_1_switch_middle",
1577 "conveyor_belt_switch",
1578 "switch for conveyor belt 1 (middle)"
1581 "conveyor_belt_1_switch_right",
1582 "conveyor_belt_switch",
1583 "switch for conveyor belt 1 (right)"
1586 "conveyor_belt_2_left",
1588 "conveyor belt 2 (left)"
1591 "conveyor_belt_2_middle",
1593 "conveyor belt 2 (middle)"
1596 "conveyor_belt_2_right",
1598 "conveyor belt 2 (right)"
1601 "conveyor_belt_2_switch_left",
1602 "conveyor_belt_switch",
1603 "switch for conveyor belt 2 (left)"
1606 "conveyor_belt_2_switch_middle",
1607 "conveyor_belt_switch",
1608 "switch for conveyor belt 2 (middle)"
1611 "conveyor_belt_2_switch_right",
1612 "conveyor_belt_switch",
1613 "switch for conveyor belt 2 (right)"
1616 "conveyor_belt_3_left",
1618 "conveyor belt 3 (left)"
1621 "conveyor_belt_3_middle",
1623 "conveyor belt 3 (middle)"
1626 "conveyor_belt_3_right",
1628 "conveyor belt 3 (right)"
1631 "conveyor_belt_3_switch_left",
1632 "conveyor_belt_switch",
1633 "switch for conveyor belt 3 (left)"
1636 "conveyor_belt_3_switch_middle",
1637 "conveyor_belt_switch",
1638 "switch for conveyor belt 3 (middle)"
1641 "conveyor_belt_3_switch_right",
1642 "conveyor_belt_switch",
1643 "switch for conveyor belt 3 (right)"
1646 "conveyor_belt_4_left",
1648 "conveyor belt 4 (left)"
1651 "conveyor_belt_4_middle",
1653 "conveyor belt 4 (middle)"
1656 "conveyor_belt_4_right",
1658 "conveyor belt 4 (right)"
1661 "conveyor_belt_4_switch_left",
1662 "conveyor_belt_switch",
1663 "switch for conveyor belt 4 (left)"
1666 "conveyor_belt_4_switch_middle",
1667 "conveyor_belt_switch",
1668 "switch for conveyor belt 4 (middle)"
1671 "conveyor_belt_4_switch_right",
1672 "conveyor_belt_switch",
1673 "switch for conveyor belt 4 (right)"
1678 "land mine (not removable)"
1681 "envelope_obsolete",
1683 "envelope (OBSOLETE)"
1688 "light switch (off)"
1691 "light_switch.active",
1698 "sign (exclamation)"
1701 "sign_radioactivity",
1703 "sign (radio activity)"
1713 "sign (wheel chair)"
1736 "sign_entry_forbidden",
1738 "sign (entry forbidden)"
1741 "sign_emergency_exit",
1743 "sign (emergency exit)"
1758 "mole (starts moving left)"
1763 "mole (starts moving right)"
1768 "mole (starts moving up)"
1773 "mole (starts moving down)"
1776 "steelwall_slippery",
1778 "slippery steel wall"
1788 "dx unknown element 15"
1793 "dx unknown element 42"
1808 "shield (deadly, kills enemies)"
1818 "time gate (closed)"
1821 "timegate_switch.active",
1823 "switch for time gate"
1828 "switch for time gate"
1836 "balloon_switch_left",
1838 "wind switch (left)"
1841 "balloon_switch_right",
1843 "wind switch (right)"
1846 "balloon_switch_up",
1851 "balloon_switch_down",
1853 "wind switch (down)"
1856 "balloon_switch_any",
1858 "wind switch (any direction)"
1863 "steel wall 1 (EMC style)"
1868 "steel wall 2 (EMC style)"
1873 "steel wall 3 (EMC style)"
1878 "steel wall 4 (EMC style)"
1883 "normal wall 1 (EMC style)"
1888 "normal wall 2 (EMC style)"
1893 "normal wall 3 (EMC style)"
1898 "normal wall 4 (EMC style)"
1903 "normal wall 5 (EMC style)"
1908 "normal wall 6 (EMC style)"
1913 "normal wall 7 (EMC style)"
1918 "normal wall 8 (EMC style)"
1923 "tube (any direction)"
1936 "tube_vertical_left",
1938 "tube (vertical & left)"
1941 "tube_vertical_right",
1943 "tube (vertical & right)"
1946 "tube_horizontal_up",
1948 "tube (horizontal & up)"
1951 "tube_horizontal_down",
1953 "tube (horizontal & down)"
1963 "tube (left & down)"
1973 "tube (right & down)"
1988 "stable bomb (DX style)"
2498 "custom element 100"
2503 "custom element 101"
2508 "custom element 102"
2513 "custom element 103"
2518 "custom element 104"
2523 "custom element 105"
2528 "custom element 106"
2533 "custom element 107"
2538 "custom element 108"
2543 "custom element 109"
2548 "custom element 110"
2553 "custom element 111"
2558 "custom element 112"
2563 "custom element 113"
2568 "custom element 114"
2573 "custom element 115"
2578 "custom element 116"
2583 "custom element 117"
2588 "custom element 118"
2593 "custom element 119"
2598 "custom element 120"
2603 "custom element 121"
2608 "custom element 122"
2613 "custom element 123"
2618 "custom element 124"
2623 "custom element 125"
2628 "custom element 126"
2633 "custom element 127"
2638 "custom element 128"
2643 "custom element 129"
2648 "custom element 130"
2653 "custom element 131"
2658 "custom element 132"
2663 "custom element 133"
2668 "custom element 134"
2673 "custom element 135"
2678 "custom element 136"
2683 "custom element 137"
2688 "custom element 138"
2693 "custom element 139"
2698 "custom element 140"
2703 "custom element 141"
2708 "custom element 142"
2713 "custom element 143"
2718 "custom element 144"
2723 "custom element 145"
2728 "custom element 146"
2733 "custom element 147"
2738 "custom element 148"
2743 "custom element 149"
2748 "custom element 150"
2753 "custom element 151"
2758 "custom element 152"
2763 "custom element 153"
2768 "custom element 154"
2773 "custom element 155"
2778 "custom element 156"
2783 "custom element 157"
2788 "custom element 158"
2793 "custom element 159"
2798 "custom element 160"
2803 "custom element 161"
2808 "custom element 162"
2813 "custom element 163"
2818 "custom element 164"
2823 "custom element 165"
2828 "custom element 166"
2833 "custom element 167"
2838 "custom element 168"
2843 "custom element 169"
2848 "custom element 170"
2853 "custom element 171"
2858 "custom element 172"
2863 "custom element 173"
2868 "custom element 174"
2873 "custom element 175"
2878 "custom element 176"
2883 "custom element 177"
2888 "custom element 178"
2893 "custom element 179"
2898 "custom element 180"
2903 "custom element 181"
2908 "custom element 182"
2913 "custom element 183"
2918 "custom element 184"
2923 "custom element 185"
2928 "custom element 186"
2933 "custom element 187"
2938 "custom element 188"
2943 "custom element 189"
2948 "custom element 190"
2953 "custom element 191"
2958 "custom element 192"
2963 "custom element 193"
2968 "custom element 194"
2973 "custom element 195"
2978 "custom element 196"
2983 "custom element 197"
2988 "custom element 198"
2993 "custom element 199"
2998 "custom element 200"
3003 "custom element 201"
3008 "custom element 202"
3013 "custom element 203"
3018 "custom element 204"
3023 "custom element 205"
3028 "custom element 206"
3033 "custom element 207"
3038 "custom element 208"
3043 "custom element 209"
3048 "custom element 210"
3053 "custom element 211"
3058 "custom element 212"
3063 "custom element 213"
3068 "custom element 214"
3073 "custom element 215"
3078 "custom element 216"
3083 "custom element 217"
3088 "custom element 218"
3093 "custom element 219"
3098 "custom element 220"
3103 "custom element 221"
3108 "custom element 222"
3113 "custom element 223"
3118 "custom element 224"
3123 "custom element 225"
3128 "custom element 226"
3133 "custom element 227"
3138 "custom element 228"
3143 "custom element 229"
3148 "custom element 230"
3153 "custom element 231"
3158 "custom element 232"
3163 "custom element 233"
3168 "custom element 234"
3173 "custom element 235"
3178 "custom element 236"
3183 "custom element 237"
3188 "custom element 238"
3193 "custom element 239"
3198 "custom element 240"
3203 "custom element 241"
3208 "custom element 242"
3213 "custom element 243"
3218 "custom element 244"
3223 "custom element 245"
3228 "custom element 246"
3233 "custom element 247"
3238 "custom element 248"
3243 "custom element 249"
3248 "custom element 250"
3253 "custom element 251"
3258 "custom element 252"
3263 "custom element 253"
3268 "custom element 254"
3273 "custom element 255"
3278 "custom element 256"
3488 "element triggering change"
3493 "player triggering change"
3496 "sp_gravity_on_port_right",
3497 "sp_gravity_on_port",
3498 "gravity-on port (leading right)"
3501 "sp_gravity_on_port_down",
3502 "sp_gravity_on_port",
3503 "gravity-on port (leading down)"
3506 "sp_gravity_on_port_left",
3507 "sp_gravity_on_port",
3508 "gravity-on port (leading left)"
3511 "sp_gravity_on_port_up",
3512 "sp_gravity_on_port",
3513 "gravity-on port (leading up)"
3516 "sp_gravity_off_port_right",
3517 "sp_gravity_off_port",
3518 "gravity-off port (leading right)"
3521 "sp_gravity_off_port_down",
3522 "sp_gravity_off_port",
3523 "gravity-off port (leading down)"
3526 "sp_gravity_off_port_left",
3527 "sp_gravity_off_port",
3528 "gravity-off port (leading left)"
3531 "sp_gravity_off_port_up",
3532 "sp_gravity_off_port",
3533 "gravity-off port (leading up)"
3536 "balloon_switch_none",
3543 "door 5 (EMC style)",
3548 "door 6 (EMC style)",
3553 "door 7 (EMC style)",
3558 "door 8 (EMC style)",
3563 "gray door (EMC style, key 5)",
3568 "gray door (EMC style, key 6)",
3573 "gray door (EMC style, key 7)",
3578 "gray door (EMC style, key 8)",
3583 "key 5 (EMC style)",
3588 "key 6 (EMC style)",
3593 "key 7 (EMC style)",
3598 "key 8 (EMC style)",
3616 "emc_magic_ball.active",
3618 "magic ball (activated)",
3621 "emc_magic_ball_switch",
3622 "emc_magic_ball_switch",
3623 "magic ball switch (off)",
3626 "emc_magic_ball_switch.active",
3627 "emc_magic_ball_switch",
3628 "magic ball switch (on)",
3631 "emc_spring_bumper",
3632 "emc_spring_bumper",
3653 "normal wall 9 (EMC style)"
3658 "normal wall 10 (EMC style)"
3663 "normal wall 11 (EMC style)"
3668 "normal wall 12 (EMC style)"
3673 "normal wall 13 (EMC style)"
3678 "normal wall 14 (EMC style)"
3683 "normal wall 15 (EMC style)"
3688 "normal wall 16 (EMC style)"
3691 "emc_wall_slippery_1",
3693 "slippery wall 1 (EMC style)"
3696 "emc_wall_slippery_2",
3698 "slippery wall 2 (EMC style)"
3701 "emc_wall_slippery_3",
3703 "slippery wall 3 (EMC style)"
3706 "emc_wall_slippery_4",
3708 "slippery wall 4 (EMC style)"
3728 "CE value of element triggering change"
3733 "CE score of element triggering change"
3738 "CE value of current element"
3743 "CE score of current element"
3748 "yam yam (starts moving left)"
3753 "yam yam (starts moving right)"
3758 "yam yam (starts moving up)"
3763 "yam yam (starts moving down)"
3766 "bd_expandable_wall",
3767 "bd_expandable_wall",
3768 "growing wall (horizontal, BD style)"
3773 "CE 8 positions earlier in list"
3778 "CE 7 positions earlier in list"
3783 "CE 6 positions earlier in list"
3788 "CE 5 positions earlier in list"
3793 "CE 4 positions earlier in list"
3798 "CE 3 positions earlier in list"
3803 "CE 2 positions earlier in list"
3808 "CE 1 position earlier in list"
3813 "the current custom element"
3818 "CE 1 position later in list"
3823 "CE 2 positions later in list"
3828 "CE 3 positions later in list"
3833 "CE 4 positions later in list"
3838 "CE 5 positions later in list"
3843 "CE 6 positions later in list"
3848 "CE 7 positions later in list"
3853 "CE 8 positions later in list"
3858 "this element matches any element"
3866 "steel_char_exclam",
3871 "steel_char_quotedbl",
3876 "steel_char_numbersign",
3881 "steel_char_dollar",
3886 "steel_char_percent",
3891 "steel_char_ampersand",
3896 "steel_char_apostrophe",
3901 "steel_char_parenleft",
3906 "steel_char_parenright",
3911 "steel_char_asterisk",
3931 "steel_char_period",
3996 "steel_char_semicolon",
4011 "steel_char_greater",
4016 "steel_char_question",
4156 "steel_char_bracketleft",
4161 "steel_char_backslash",
4166 "steel_char_bracketright",
4171 "steel_char_asciicircum",
4176 "steel_char_underscore",
4181 "steel_char_copyright",
4183 "steel letter '\xa9'"
4186 "steel_char_aumlaut",
4188 "steel letter '\xc4'"
4191 "steel_char_oumlaut",
4193 "steel letter '\xd6'"
4196 "steel_char_uumlaut",
4198 "steel letter '\xdc'"
4201 "steel_char_degree",
4203 "steel letter '\xb0'"
4206 "steel_char_trademark",
4208 "steel letter '\xae'"
4211 "steel_char_cursor",
4213 "steel letter '\xa0'"
4216 "steel_char_unused",
4221 "steel_char_unused",
4226 "steel_char_unused",
4231 "steel_char_unused",
4236 "steel_char_unused",
4241 "steel_char_unused",
4246 "steel_char_button",
4248 "steel letter 'button'"
4258 "steel letter 'down'"
4311 "steel_exit_closed",
4321 "dc_steelwall_1_left",
4323 "steel wall 1 (left)"
4326 "dc_steelwall_1_right",
4328 "steel wall 1 (right)"
4331 "dc_steelwall_1_top",
4333 "steel wall 1 (top)"
4336 "dc_steelwall_1_bottom",
4338 "steel wall 1 (bottom)"
4341 "dc_steelwall_1_horizontal",
4343 "steel wall 1 (top/bottom)"
4346 "dc_steelwall_1_vertical",
4348 "steel wall 1 (left/right)"
4351 "dc_steelwall_1_topleft",
4353 "steel wall 1 (top/left)"
4356 "dc_steelwall_1_topright",
4358 "steel wall 1 (top/right)"
4361 "dc_steelwall_1_bottomleft",
4363 "steel wall 1 (bottom/left)"
4366 "dc_steelwall_1_bottomright",
4368 "steel wall 1 (bottom/right)"
4371 "dc_steelwall_1_topleft_2",
4373 "steel wall 1 (top/left corner)"
4376 "dc_steelwall_1_topright_2",
4378 "steel wall 1 (top/right corner)"
4381 "dc_steelwall_1_bottomleft_2",
4383 "steel wall 1 (bottom/left corner)"
4386 "dc_steelwall_1_bottomright_2",
4388 "steel wall 1 (bottom/right corner)"
4391 "dc_steelwall_2_left",
4393 "steel wall 2 (left)"
4396 "dc_steelwall_2_right",
4398 "steel wall 2 (right)"
4401 "dc_steelwall_2_top",
4403 "steel wall 2 (top)"
4406 "dc_steelwall_2_bottom",
4408 "steel wall 2 (bottom)"
4411 "dc_steelwall_2_horizontal",
4413 "steel wall 2 (horizontal)"
4416 "dc_steelwall_2_vertical",
4418 "steel wall 2 (vertical)"
4421 "dc_steelwall_2_middle",
4423 "steel wall 2 (middle)"
4426 "dc_steelwall_2_single",
4428 "steel wall 2 (single)"
4431 "dc_switchgate_switch_up",
4432 "switchgate_switch",
4433 "switch for switch gate (steel)"
4436 "dc_switchgate_switch_down",
4437 "switchgate_switch",
4438 "switch for switch gate (steel)"
4441 "dc_timegate_switch",
4443 "switch for time gate (steel)"
4446 "dc_timegate_switch.active",
4448 "switch for time gate (steel)"
4453 "land mine (DC style, removable)"
4456 "expandable_steelwall",
4458 "growing steel wall"
4461 "expandable_steelwall_horizontal",
4463 "growing steel wall (horizontal)"
4466 "expandable_steelwall_vertical",
4468 "growing steel wall (vertical)"
4471 "expandable_steelwall_any",
4473 "growing steel wall (any direction)"
4478 "closed exit (EM style)"
4483 "open exit (EM style)"
4486 "em_steel_exit_closed",
4488 "closed steel exit (EM style)"
4491 "em_steel_exit_open",
4493 "open steel exit (EM style)"
4496 "dc_gate_fake_gray",
4498 "gray door (opened by no key)"
4503 "magic wall (DC style)"
4506 "quicksand_fast_empty",
4508 "fast quicksand (empty)"
4511 "quicksand_fast_full",
4513 "fast quicksand (with rock)"
4516 "from_level_template",
4517 "from_level_template",
4518 "element taken from level template"
4533 "mirror (11.25\xb0)"
4543 "mirror (33.75\xb0)"
4553 "mirror (56.25\xb0)"
4563 "mirror (78.75\xb0)"
4573 "mirror (101.25\xb0)"
4578 "mirror (112.5\xb0)"
4583 "mirror (123.75\xb0)"
4593 "mirror (146.25\xb0)"
4598 "mirror (157.5\xb0)"
4603 "mirror (168.75\xb0)"
4606 "mm_steel_grid_fixed_1",
4607 "mm_steel_grid_fixed",
4608 "fixed steel polarizer (0\xb0)"
4611 "mm_steel_grid_fixed_2",
4612 "mm_steel_grid_fixed",
4613 "fixed steel polarizer (90\xb0)"
4616 "mm_steel_grid_fixed_3",
4617 "mm_steel_grid_fixed",
4618 "fixed steel polarizer (45\xb0)"
4621 "mm_steel_grid_fixed_4",
4622 "mm_steel_grid_fixed",
4623 "fixed steel polarizer (135\xb0)"
4626 "mm_mcduffin.right",
4628 "Gregor McDuffin (looking right)"
4633 "Gregor McDuffin (looking up)"
4638 "Gregor McDuffin (looking left)"
4643 "Gregor McDuffin (looking down)"
4648 "closed exit (MM style)"
4651 "mm_exit_opening_1",
4656 "mm_exit_opening_2",
4663 "open exit (MM style)"
4683 "steel wall 1 (MM style)"
4688 "steel wall 2 (MM style)"
4693 "steel wall 3 (MM style)"
4698 "steel wall 4 (MM style)"
4703 "steel wall 5 (MM style)"
4708 "steel wall 6 (MM style)"
4713 "steel wall 7 (MM style)"
4718 "steel wall 8 (MM style)"
4723 "steel wall 9 (MM style)"
4728 "steel wall 10 (MM style)"
4733 "steel wall 11 (MM style)"
4738 "steel wall 12 (MM style)"
4743 "steel wall 13 (MM style)"
4748 "steel wall 14 (MM style)"
4753 "steel wall 15 (MM style)"
4758 "steel wall 16 (MM style)"
4763 "wooden wall 1 (MM style)"
4768 "wooden wall 2 (MM style)"
4773 "wooden wall 3 (MM style)"
4778 "wooden wall 4 (MM style)"
4783 "wooden wall 5 (MM style)"
4788 "wooden wall 6 (MM style)"
4793 "wooden wall 7 (MM style)"
4798 "wooden wall 8 (MM style)"
4803 "wooden wall 9 (MM style)"
4806 "mm_wooden_wall_10",
4808 "wooden wall 10 (MM style)"
4811 "mm_wooden_wall_11",
4813 "wooden wall 11 (MM style)"
4816 "mm_wooden_wall_12",
4818 "wooden wall 12 (MM style)"
4821 "mm_wooden_wall_13",
4823 "wooden wall 13 (MM style)"
4826 "mm_wooden_wall_14",
4828 "wooden wall 14 (MM style)"
4831 "mm_wooden_wall_15",
4833 "wooden wall 15 (MM style)"
4836 "mm_wooden_wall_16",
4838 "wooden wall 16 (MM style)"
4966 "mm_amoeba_wall_10",
4971 "mm_amoeba_wall_11",
4976 "mm_amoeba_wall_12",
4981 "mm_amoeba_wall_13",
4986 "mm_amoeba_wall_14",
4991 "mm_amoeba_wall_15",
4996 "mm_amoeba_wall_16",
5013 "teleporter (0\xb0)"
5018 "teleporter (22.5\xb0)"
5023 "teleporter (45\xb0)"
5028 "teleporter (67.5\xb0)"
5033 "teleporter (90\xb0)"
5038 "teleporter (112.5\xb0)"
5043 "teleporter (135\xb0)"
5048 "teleporter (157.5\xb0)"
5053 "teleporter (180\xb0)"
5058 "teleporter (202.5\xb0)"
5063 "teleporter (225\xb0)"
5068 "teleporter (247.5\xb0)"
5073 "teleporter (270\xb0)"
5078 "teleporter (292.5\xb0)"
5083 "teleporter (315\xb0)"
5088 "teleporter (337.5\xb0)"
5098 "pac man (starts moving right)"
5103 "pac man (starts moving up)"
5108 "pac man (starts moving left)"
5113 "pac man (starts moving down)"
5123 "polarizer (11.25\xb0)"
5128 "polarizer (22.5\xb0)"
5133 "polarizer (33.75\xb0)"
5138 "polarizer (45\xb0)"
5143 "polarizer (56.25\xb0)"
5148 "polarizer (67.5\xb0)"
5153 "polarizer (78.75\xb0)"
5158 "polarizer (90\xb0)"
5163 "polarizer (101.25\xb0)"
5168 "polarizer (112.5\xb0)"
5173 "polarizer (123.75\xb0)"
5178 "polarizer (135\xb0)"
5183 "polarizer (146.25\xb0)"
5188 "polarizer (157.5\xb0)"
5193 "polarizer (168.75\xb0)"
5196 "mm_polarizer_cross_1",
5197 "mm_polarizer_cross",
5198 "two-way polarizer (0\xb0)"
5201 "mm_polarizer_cross_2",
5202 "mm_polarizer_cross",
5203 "two-way polarizer (22.5\xb0)"
5206 "mm_polarizer_cross_3",
5207 "mm_polarizer_cross",
5208 "two-way polarizer (45\xb0)"
5211 "mm_polarizer_cross_4",
5212 "mm_polarizer_cross",
5213 "two-way polarizer (67.5\xb0)"
5216 "mm_mirror_fixed_1",
5218 "fixed mirror (0\xb0)"
5221 "mm_mirror_fixed_2",
5223 "fixed mirror (45\xb0)"
5226 "mm_mirror_fixed_3",
5228 "fixed mirror (90\xb0)"
5231 "mm_mirror_fixed_4",
5233 "fixed mirror (135\xb0)"
5251 "mm_lightbulb.active",
5273 "extra energy ball (full)"
5276 "mm_wooden_grid_fixed_1",
5277 "mm_wooden_grid_fixed",
5278 "fixed wooden polarizer (0\xb0)"
5281 "mm_wooden_grid_fixed_2",
5282 "mm_wooden_grid_fixed",
5283 "fixed wooden polarizer (90\xb0)"
5286 "mm_wooden_grid_fixed_3",
5287 "mm_wooden_grid_fixed",
5288 "fixed wooden polarizer (45\xb0)"
5291 "mm_wooden_grid_fixed_4",
5292 "mm_wooden_grid_fixed",
5293 "fixed wooden polarizer (135\xb0)"
5298 "extra energy ball (empty)"
5303 "mail envelope 1 (MM style)"
5308 "mail envelope 2 (MM style)"
5313 "mail envelope 3 (MM style)"
5318 "mail envelope 4 (MM style)"
5323 "mirror (DF style) (0\xb0)"
5328 "mirror (DF style) (11.25\xb0)"
5333 "mirror (DF style) (22.5\xb0)"
5338 "mirror (DF style) (33.75\xb0)"
5343 "mirror (DF style) (45\xb0)"
5348 "mirror (DF style) (56.25\xb0)"
5353 "mirror (DF style) (67.5\xb0)"
5358 "mirror (DF style) (78.75\xb0)"
5363 "mirror (DF style) (90\xb0)"
5368 "mirror (DF style) (101.25\xb0)"
5373 "mirror (DF style) (112.5\xb0)"
5378 "mirror (DF style) (123.75\xb0)"
5383 "mirror (DF style) (135\xb0)"
5388 "mirror (DF style) (146.25\xb0)"
5393 "mirror (DF style) (157.5\xb0)"
5398 "mirror (DF style) (168.75\xb0)"
5401 "df_wooden_grid_fixed_1",
5402 "df_wooden_grid_fixed",
5403 "fixed wooden polarizer (DF) (0\xb0)"
5406 "df_wooden_grid_fixed_2",
5407 "df_wooden_grid_fixed",
5408 "fixed wooden polarizer (DF) (22.5\xb0)"
5411 "df_wooden_grid_fixed_3",
5412 "df_wooden_grid_fixed",
5413 "fixed wooden polarizer (DF) (45\xb0)"
5416 "df_wooden_grid_fixed_4",
5417 "df_wooden_grid_fixed",
5418 "fixed wooden polarizer (DF) (67.5\xb0)"
5421 "df_wooden_grid_fixed_5",
5422 "df_wooden_grid_fixed",
5423 "fixed wooden polarizer (DF) (90\xb0)"
5426 "df_wooden_grid_fixed_6",
5427 "df_wooden_grid_fixed",
5428 "fixed wooden polarizer (DF) (112.5\xb0)"
5431 "df_wooden_grid_fixed_7",
5432 "df_wooden_grid_fixed",
5433 "fixed wooden polarizer (DF) (135\xb0)"
5436 "df_wooden_grid_fixed_8",
5437 "df_wooden_grid_fixed",
5438 "fixed wooden polarizer (DF) (157.5\xb0)"
5441 "df_steel_grid_fixed_1",
5442 "df_steel_grid_fixed",
5443 "fixed steel polarizer (DF) (0\xb0)"
5446 "df_steel_grid_fixed_2",
5447 "df_steel_grid_fixed",
5448 "fixed steel polarizer (DF) (22.5\xb0)"
5451 "df_steel_grid_fixed_3",
5452 "df_steel_grid_fixed",
5453 "fixed steel polarizer (DF) (45\xb0)"
5456 "df_steel_grid_fixed_4",
5457 "df_steel_grid_fixed",
5458 "fixed steel polarizer (DF) (67.5\xb0)"
5461 "df_steel_grid_fixed_5",
5462 "df_steel_grid_fixed",
5463 "fixed steel polarizer (DF) (90\xb0)"
5466 "df_steel_grid_fixed_6",
5467 "df_steel_grid_fixed",
5468 "fixed steel polarizer (DF) (112.5\xb0)"
5471 "df_steel_grid_fixed_7",
5472 "df_steel_grid_fixed",
5473 "fixed steel polarizer (DF) (135\xb0)"
5476 "df_steel_grid_fixed_8",
5477 "df_steel_grid_fixed",
5478 "fixed steel polarizer (DF) (157.5\xb0)"
5483 "wooden wall 1 (DF style)"
5488 "wooden wall 2 (DF style)"
5493 "wooden wall 3 (DF style)"
5498 "wooden wall 4 (DF style)"
5503 "wooden wall 5 (DF style)"
5508 "wooden wall 6 (DF style)"
5513 "wooden wall 7 (DF style)"
5518 "wooden wall 8 (DF style)"
5523 "wooden wall 9 (DF style)"
5526 "df_wooden_wall_10",
5528 "wooden wall 10 (DF style)"
5531 "df_wooden_wall_11",
5533 "wooden wall 11 (DF style)"
5536 "df_wooden_wall_12",
5538 "wooden wall 12 (DF style)"
5541 "df_wooden_wall_13",
5543 "wooden wall 13 (DF style)"
5546 "df_wooden_wall_14",
5548 "wooden wall 14 (DF style)"
5551 "df_wooden_wall_15",
5553 "wooden wall 15 (DF style)"
5556 "df_wooden_wall_16",
5558 "wooden wall 16 (DF style)"
5563 "steel wall 1 (DF style)"
5568 "steel wall 2 (DF style)"
5573 "steel wall 3 (DF style)"
5578 "steel wall 4 (DF style)"
5583 "steel wall 5 (DF style)"
5588 "steel wall 6 (DF style)"
5593 "steel wall 7 (DF style)"
5598 "steel wall 8 (DF style)"
5603 "steel wall 9 (DF style)"
5608 "steel wall 10 (DF style)"
5613 "steel wall 11 (DF style)"
5618 "steel wall 12 (DF style)"
5623 "steel wall 13 (DF style)"
5628 "steel wall 14 (DF style)"
5633 "steel wall 15 (DF style)"
5638 "steel wall 16 (DF style)"
5663 "laser cannon (shooting right)"
5668 "laser cannon (shooting up)"
5673 "laser cannon (shooting left)"
5678 "laser cannon (shooting down)"
5681 "df_receiver.right",
5683 "laser receiver (directed right)"
5688 "laser receiver (directed up)"
5693 "laser receiver (directed left)"
5698 "laser receiver (directed down)"
5701 "df_fibre_optic_red_1",
5703 "red fibre optic (part 1)"
5706 "df_fibre_optic_red_2",
5708 "red fibre optic (part 2)"
5711 "df_fibre_optic_yellow_1",
5713 "yellow fibre optic (part 1)"
5716 "df_fibre_optic_yellow_2",
5718 "yellow fibre optic (part 2)"
5721 "df_fibre_optic_green_1",
5723 "green fibre optic (part 1)"
5726 "df_fibre_optic_green_2",
5728 "green fibre optic (part 2)"
5731 "df_fibre_optic_blue_1",
5733 "blue fibre optic (part 1)"
5736 "df_fibre_optic_blue_2",
5738 "blue fibre optic (part 2)"
5741 "df_mirror_rotating_1",
5742 "df_mirror_rotating",
5743 "rotating mirror (0\xb0)"
5746 "df_mirror_rotating_2",
5747 "df_mirror_rotating",
5748 "rotating mirror (11.25\xb0)"
5751 "df_mirror_rotating_3",
5752 "df_mirror_rotating",
5753 "rotating mirror (22.5\xb0)"
5756 "df_mirror_rotating_4",
5757 "df_mirror_rotating",
5758 "rotating mirror (33.75\xb0)"
5761 "df_mirror_rotating_5",
5762 "df_mirror_rotating",
5763 "rotating mirror (45\xb0)"
5766 "df_mirror_rotating_6",
5767 "df_mirror_rotating",
5768 "rotating mirror (56.25\xb0)"
5771 "df_mirror_rotating_7",
5772 "df_mirror_rotating",
5773 "rotating mirror (67.5\xb0)"
5776 "df_mirror_rotating_8",
5777 "df_mirror_rotating",
5778 "rotating mirror (78.75\xb0)"
5781 "df_mirror_rotating_9",
5782 "df_mirror_rotating",
5783 "rotating mirror (90\xb0)"
5786 "df_mirror_rotating_10",
5787 "df_mirror_rotating",
5788 "rotating mirror (101.25\xb0)"
5791 "df_mirror_rotating_11",
5792 "df_mirror_rotating",
5793 "rotating mirror (112.5\xb0)"
5796 "df_mirror_rotating_12",
5797 "df_mirror_rotating",
5798 "rotating mirror (123.75\xb0)"
5801 "df_mirror_rotating_13",
5802 "df_mirror_rotating",
5803 "rotating mirror (135\xb0)"
5806 "df_mirror_rotating_14",
5807 "df_mirror_rotating",
5808 "rotating mirror (146.25\xb0)"
5811 "df_mirror_rotating_15",
5812 "df_mirror_rotating",
5813 "rotating mirror (157.5\xb0)"
5816 "df_mirror_rotating_16",
5817 "df_mirror_rotating",
5818 "rotating mirror (168.75\xb0)"
5821 "df_wooden_grid_rotating_1",
5822 "df_wooden_grid_rotating",
5823 "rotating wooden polarizer (0\xb0)"
5826 "df_wooden_grid_rotating_2",
5827 "df_wooden_grid_rotating",
5828 "rotating wooden polarizer (22.5\xb0)"
5831 "df_wooden_grid_rotating_3",
5832 "df_wooden_grid_rotating",
5833 "rotating wooden polarizer (45\xb0)"
5836 "df_wooden_grid_rotating_4",
5837 "df_wooden_grid_rotating",
5838 "rotating wooden polarizer (67.5\xb0)"
5841 "df_wooden_grid_rotating_5",
5842 "df_wooden_grid_rotating",
5843 "rotating wooden polarizer (90\xb0)"
5846 "df_wooden_grid_rotating_6",
5847 "df_wooden_grid_rotating",
5848 "rotating wooden polarizer (112.5\xb0)"
5851 "df_wooden_grid_rotating_7",
5852 "df_wooden_grid_rotating",
5853 "rotating wooden polarizer (135\xb0)"
5856 "df_wooden_grid_rotating_8",
5857 "df_wooden_grid_rotating",
5858 "rotating wooden polarizer (157.5\xb0)"
5861 "df_steel_grid_rotating_1",
5862 "df_steel_grid_rotating",
5863 "rotating steel polarizer (0\xb0)"
5866 "df_steel_grid_rotating_2",
5867 "df_steel_grid_rotating",
5868 "rotating steel polarizer (22.5\xb0)"
5871 "df_steel_grid_rotating_3",
5872 "df_steel_grid_rotating",
5873 "rotating steel polarizer (45\xb0)"
5876 "df_steel_grid_rotating_4",
5877 "df_steel_grid_rotating",
5878 "rotating steel polarizer (67.5\xb0)"
5881 "df_steel_grid_rotating_5",
5882 "df_steel_grid_rotating",
5883 "rotating steel polarizer (90\xb0)"
5886 "df_steel_grid_rotating_6",
5887 "df_steel_grid_rotating",
5888 "rotating steel polarizer (112.5\xb0)"
5891 "df_steel_grid_rotating_7",
5892 "df_steel_grid_rotating",
5893 "rotating steel polarizer (135\xb0)"
5896 "df_steel_grid_rotating_8",
5897 "df_steel_grid_rotating",
5898 "rotating steel polarizer (157.5\xb0)"
5901 "mm_teleporter_red_1",
5903 "red teleporter (0\xb0)"
5906 "mm_teleporter_red_2",
5908 "red teleporter (22.5\xb0)"
5911 "mm_teleporter_red_3",
5913 "red teleporter (45\xb0)"
5916 "mm_teleporter_red_4",
5918 "red teleporter (67.5\xb0)"
5921 "mm_teleporter_red_5",
5923 "red teleporter (90\xb0)"
5926 "mm_teleporter_red_6",
5928 "red teleporter (112.5\xb0)"
5931 "mm_teleporter_red_7",
5933 "red teleporter (135\xb0)"
5936 "mm_teleporter_red_8",
5938 "red teleporter (157.5\xb0)"
5941 "mm_teleporter_red_9",
5943 "red teleporter (180\xb0)"
5946 "mm_teleporter_red_10",
5948 "red teleporter (202.5\xb0)"
5951 "mm_teleporter_red_11",
5953 "red teleporter (225\xb0)"
5956 "mm_teleporter_red_12",
5958 "red teleporter (247.5\xb0)"
5961 "mm_teleporter_red_13",
5963 "red teleporter (270\xb0)"
5966 "mm_teleporter_red_14",
5968 "red teleporter (292.5\xb0)"
5971 "mm_teleporter_red_15",
5973 "red teleporter (315\xb0)"
5976 "mm_teleporter_red_16",
5978 "red teleporter (337.5\xb0)"
5981 "mm_teleporter_yellow_1",
5983 "yellow teleporter (0\xb0)"
5986 "mm_teleporter_yellow_2",
5988 "yellow teleporter (22.5\xb0)"
5991 "mm_teleporter_yellow_3",
5993 "yellow teleporter (45\xb0)"
5996 "mm_teleporter_yellow_4",
5998 "yellow teleporter (67.5\xb0)"
6001 "mm_teleporter_yellow_5",
6003 "yellow teleporter (90\xb0)"
6006 "mm_teleporter_yellow_6",
6008 "yellow teleporter (112.5\xb0)"
6011 "mm_teleporter_yellow_7",
6013 "yellow teleporter (135\xb0)"
6016 "mm_teleporter_yellow_8",
6018 "yellow teleporter (157.5\xb0)"
6021 "mm_teleporter_yellow_9",
6023 "yellow teleporter (180\xb0)"
6026 "mm_teleporter_yellow_10",
6028 "yellow teleporter (202.5\xb0)"
6031 "mm_teleporter_yellow_11",
6033 "yellow teleporter (225\xb0)"
6036 "mm_teleporter_yellow_12",
6038 "yellow teleporter (247.5\xb0)"
6041 "mm_teleporter_yellow_13",
6043 "yellow teleporter (270\xb0)"
6046 "mm_teleporter_yellow_14",
6048 "yellow teleporter (292.5\xb0)"
6051 "mm_teleporter_yellow_15",
6053 "yellow teleporter (315\xb0)"
6056 "mm_teleporter_yellow_16",
6058 "yellow teleporter (337.5\xb0)"
6061 "mm_teleporter_green_1",
6063 "green teleporter (0\xb0)"
6066 "mm_teleporter_green_2",
6068 "green teleporter (22.5\xb0)"
6071 "mm_teleporter_green_3",
6073 "green teleporter (45\xb0)"
6076 "mm_teleporter_green_4",
6078 "green teleporter (67.5\xb0)"
6081 "mm_teleporter_green_5",
6083 "green teleporter (90\xb0)"
6086 "mm_teleporter_green_6",
6088 "green teleporter (112.5\xb0)"
6091 "mm_teleporter_green_7",
6093 "green teleporter (135\xb0)"
6096 "mm_teleporter_green_8",
6098 "green teleporter (157.5\xb0)"
6101 "mm_teleporter_green_9",
6103 "green teleporter (180\xb0)"
6106 "mm_teleporter_green_10",
6108 "green teleporter (202.5\xb0)"
6111 "mm_teleporter_green_11",
6113 "green teleporter (225\xb0)"
6116 "mm_teleporter_green_12",
6118 "green teleporter (247.5\xb0)"
6121 "mm_teleporter_green_13",
6123 "green teleporter (270\xb0)"
6126 "mm_teleporter_green_14",
6128 "green teleporter (292.5\xb0)"
6131 "mm_teleporter_green_15",
6133 "green teleporter (315\xb0)"
6136 "mm_teleporter_green_16",
6138 "green teleporter (337.5\xb0)"
6141 "mm_teleporter_blue_1",
6143 "blue teleporter (0\xb0)"
6146 "mm_teleporter_blue_2",
6148 "blue teleporter (22.5\xb0)"
6151 "mm_teleporter_blue_3",
6153 "blue teleporter (45\xb0)"
6156 "mm_teleporter_blue_4",
6158 "blue teleporter (67.5\xb0)"
6161 "mm_teleporter_blue_5",
6163 "blue teleporter (90\xb0)"
6166 "mm_teleporter_blue_6",
6168 "blue teleporter (112.5\xb0)"
6171 "mm_teleporter_blue_7",
6173 "blue teleporter (135\xb0)"
6176 "mm_teleporter_blue_8",
6178 "blue teleporter (157.5\xb0)"
6181 "mm_teleporter_blue_9",
6183 "blue teleporter (180\xb0)"
6186 "mm_teleporter_blue_10",
6188 "blue teleporter (202.5\xb0)"
6191 "mm_teleporter_blue_11",
6193 "blue teleporter (225\xb0)"
6196 "mm_teleporter_blue_12",
6198 "blue teleporter (247.5\xb0)"
6201 "mm_teleporter_blue_13",
6203 "blue teleporter (270\xb0)"
6206 "mm_teleporter_blue_14",
6208 "blue teleporter (292.5\xb0)"
6211 "mm_teleporter_blue_15",
6213 "blue teleporter (315\xb0)"
6216 "mm_teleporter_blue_16",
6218 "blue teleporter (337.5\xb0)"
6228 "pac man (MM style)"
6238 "steel wall (MM style)",
6243 "wooden wall (MM style)",
6268 "steel wall (DF style)",
6273 "wooden wall (DF style)",
6278 "spring (starts moving left)"
6283 "spring (starts moving right)"
6366 "df_mirror_fixed_1",
6368 "fixed mirror (DF style) (0\xb0)"
6371 "df_mirror_fixed_2",
6373 "fixed mirror (DF style) (11.25\xb0)"
6376 "df_mirror_fixed_3",
6378 "fixed mirror (DF style) (22.5\xb0)"
6381 "df_mirror_fixed_4",
6383 "fixed mirror (DF style) (33.75\xb0)"
6386 "df_mirror_fixed_5",
6388 "fixed mirror (DF style) (45\xb0)"
6391 "df_mirror_fixed_6",
6393 "fixed mirror (DF style) (56.25\xb0)"
6396 "df_mirror_fixed_7",
6398 "fixed mirror (DF style) (67.5\xb0)"
6401 "df_mirror_fixed_8",
6403 "fixed mirror (DF style) (78.75\xb0)"
6406 "df_mirror_fixed_9",
6408 "fixed mirror (DF style) (90\xb0)"
6411 "df_mirror_fixed_10",
6413 "fixed mirror (DF style) (101.25\xb0)"
6416 "df_mirror_fixed_11",
6418 "fixed mirror (DF style) (112.5\xb0)"
6421 "df_mirror_fixed_12",
6423 "fixed mirror (DF style) (123.75\xb0)"
6426 "df_mirror_fixed_13",
6428 "fixed mirror (DF style) (135\xb0)"
6431 "df_mirror_fixed_14",
6433 "fixed mirror (DF style) (146.25\xb0)"
6436 "df_mirror_fixed_15",
6438 "fixed mirror (DF style) (157.5\xb0)"
6441 "df_mirror_fixed_16",
6443 "fixed mirror (DF style) (168.75\xb0)"
6448 "slope (DF style) (45\xb0)"
6453 "slope (DF style) (135\xb0)"
6458 "slope (DF style) (225\xb0)"
6463 "slope (DF style) (315\xb0)"
6491 "bd_sand_sloped_up_right",
6493 "sand (sloped up right)"
6496 "bd_sand_sloped_up_left",
6498 "sand (sloped up left)"
6501 "bd_sand_sloped_down_left",
6503 "sand (sloped down left)"
6506 "bd_sand_sloped_down_right",
6508 "sand (sloped down right)"
6516 "bd_wall_sloped_up_right",
6518 "wall (sloped up right)"
6521 "bd_wall_sloped_up_left",
6523 "wall (sloped up left)"
6526 "bd_wall_sloped_down_left",
6528 "wall (sloped down left)"
6531 "bd_wall_sloped_down_right",
6533 "wall (sloped down right)"
6536 "bd_wall_non_sloped",
6576 "bd_steelwall_sloped_up_right",
6577 "bd_steelwall_sloped",
6578 "steel wall (sloped up right)"
6581 "bd_steelwall_sloped_up_left",
6582 "bd_steelwall_sloped",
6583 "steel wall (sloped up left)"
6586 "bd_steelwall_sloped_down_left",
6587 "bd_steelwall_sloped",
6588 "steel wall (sloped down left)"
6591 "bd_steelwall_sloped_down_right",
6592 "bd_steelwall_sloped",
6593 "steel wall (sloped down right)"
6596 "bd_steelwall_explodable",
6598 "explodable steel wall"
6601 "bd_steelwall_diggable",
6603 "diggable steel wall"
6606 "bd_expandable_wall_horizontal",
6607 "bd_expandable_wall",
6608 "expandable wall (horizontal)"
6611 "bd_expandable_wall_vertical",
6612 "bd_expandable_wall",
6613 "expandable wall (vertical)"
6616 "bd_expandable_wall_any",
6617 "bd_expandable_wall",
6618 "expandable wall (any direction)"
6621 "bd_expandable_steelwall_horizontal",
6622 "bd_expandable_steelwall",
6623 "expandable steelwall (horizontal)"
6626 "bd_expandable_steelwall_vertical",
6627 "bd_expandable_steelwall",
6628 "expandable steelwall (vertical)"
6631 "bd_expandable_steelwall_any",
6632 "bd_expandable_steelwall",
6633 "expandable steelwall (any direction)"
6636 "bd_expandable_wall_switch_horizontal",
6637 "bd_expandable_wall_switch",
6638 "switch for expandable wall (horizontal)"
6641 "bd_expandable_wall_switch_vertical",
6642 "bd_expandable_wall_switch",
6643 "switch for expandable wall (vertical)"
6661 "bd_invisible_exit_closed",
6662 "bd_invisible_exit",
6663 "invisible exit (closed)"
6666 "bd_invisible_exit_open",
6667 "bd_invisible_exit",
6668 "invisible exit (open)"
6686 "bd_flying_diamond",
6687 "bd_flying_diamond",
6701 "bd_trapped_diamond",
6702 "bd_trapped_diamond",
6713 "amoeba 2 (BD style)"
6721 "bd_bladder_spender",
6722 "bd_bladder_spender",
6726 "bd_creature_switch",
6727 "bd_creature_switch",
6728 "switch for creature (off)"
6731 "bd_creature_switch.active",
6732 "bd_creature_switch",
6733 "switch for creature (on)"
6736 "bd_biter_switch_1",
6741 "bd_biter_switch_2",
6746 "bd_biter_switch_3",
6751 "bd_biter_switch_4",
6761 "bd_replicator.active",
6763 "replicator (active)"
6766 "bd_replicator_switch",
6767 "bd_replicator_switch",
6768 "switch for replicator (off)"
6771 "bd_replicator_switch.active",
6772 "bd_replicator_switch",
6773 "switch for replicator (on)"
6778 "conveyor belt (left)"
6781 "bd_conveyor_left.active",
6783 "conveyor belt (left) (active)"
6786 "bd_conveyor_right",
6788 "conveyor belt (right)"
6791 "bd_conveyor_right.active",
6793 "conveyor belt (right) (active)"
6796 "bd_conveyor_switch",
6797 "bd_conveyor_switch",
6798 "switch for conveyor belt (off)"
6801 "bd_conveyor_switch.active",
6802 "bd_conveyor_switch",
6803 "switch for conveyor belt (on)"
6806 "bd_conveyor_dir_switch_left",
6807 "bd_conveyor_dir_switch",
6808 "switch for conveyor belt direction (left)"
6811 "bd_conveyor_dir_switch_right",
6812 "bd_conveyor_dir_switch",
6813 "switch for conveyor belt direction (right)"
6816 "bd_gravity_switch",
6817 "bd_gravity_switch",
6821 "bd_gravity_switch.active",
6822 "bd_gravity_switch",
6823 "gravity switch (active)"
6856 "bd_pneumatic_hammer",
6857 "bd_pneumatic_hammer",
6943 "cow (random start direction)"
6948 "cow (starts moving left)"
6953 "cow (starts moving up)"
6958 "cow (starts moving right)"
6963 "cow (starts moving down)"
6968 "butterfly 2 (random start direction)"
6971 "bd_butterfly_2.right",
6973 "butterfly 2 (starts moving right)"
6976 "bd_butterfly_2.up",
6978 "butterfly 2 (starts moving up)"
6981 "bd_butterfly_2.left",
6983 "butterfly 2 (starts moving left)"
6986 "bd_butterfly_2.down",
6988 "butterfly 2 (starts moving down)"
6993 "firefly 2 (random start direction)"
6996 "bd_firefly_2.right",
6998 "firefly 2 (starts moving right)"
7003 "firefly 2 (starts moving up)"
7006 "bd_firefly_2.left",
7008 "firefly 2 (starts moving left)"
7011 "bd_firefly_2.down",
7013 "firefly 2 (starts moving down)"
7018 "stonefly (random start direction)"
7021 "bd_stonefly.right",
7023 "stonefly (starts moving right)"
7028 "stonefly (starts moving up)"
7033 "stonefly (starts moving left)"
7038 "stonefly (starts moving down)"
7043 "biter (random start direction)"
7048 "biter (starts moving right)"
7053 "biter (starts moving up)"
7058 "biter (starts moving left)"
7063 "biter (starts moving down)"
7068 "dragonfly (random start direction)"
7071 "bd_dragonfly.right",
7073 "dragonfly (starts moving right)"
7078 "dragonfly (starts moving up)"
7081 "bd_dragonfly.left",
7083 "dragonfly (starts moving left)"
7086 "bd_dragonfly.down",
7088 "dragonfly (starts moving down)"
7106 "bd_player_with_bomb",
7116 "bd_player_stirring",
7131 // --------------------------------------------------------------------------
7132 // "real" (and therefore drawable) runtime elements
7133 // --------------------------------------------------------------------------
7136 "dynabomb_player_1.active",
7141 "dynabomb_player_2.active",
7146 "dynabomb_player_3.active",
7151 "dynabomb_player_4.active",
7156 "sp_disk_red.active",
7161 "switchgate.opening",
7166 "switchgate.closing",
7191 "invisible_steelwall.active",
7196 "invisible_wall.active",
7201 "invisible_sand.active",
7206 "conveyor_belt_1_left.active",
7211 "conveyor_belt_1_middle.active",
7216 "conveyor_belt_1_right.active",
7221 "conveyor_belt_2_left.active",
7226 "conveyor_belt_2_middle.active",
7231 "conveyor_belt_2_right.active",
7236 "conveyor_belt_3_left.active",
7241 "conveyor_belt_3_middle.active",
7246 "conveyor_belt_3_right.active",
7251 "conveyor_belt_4_left.active",
7256 "conveyor_belt_4_middle.active",
7261 "conveyor_belt_4_right.active",
7276 "steel_exit.opening",
7281 "steel_exit.closing",
7296 "em_steel_exit.opening",
7301 "em_steel_exit.closing",
7321 "sp_terminal.active",
7326 "sp_buggy_base.activating",
7331 "sp_buggy_base.active",
7346 "quicksand.emptying",
7351 "quicksand_fast.emptying",
7356 "magic_wall.active",
7361 "bd_magic_wall.active",
7366 "dc_magic_wall.active",
7376 "bd_magic_wall_full",
7381 "dc_magic_wall_full",
7386 "magic_wall.emptying",
7391 "bd_magic_wall.emptying",
7396 "dc_magic_wall.emptying",
7406 "bd_magic_wall_dead",
7411 "dc_magic_wall_dead",
7417 "emc_fake_grass.active",
7422 "gate_1_gray.active",
7427 "gate_2_gray.active",
7432 "gate_3_gray.active",
7437 "gate_4_gray.active",
7442 "em_gate_1_gray.active",
7447 "em_gate_2_gray.active",
7452 "em_gate_3_gray.active",
7457 "em_gate_4_gray.active",
7462 "emc_gate_5_gray.active",
7467 "emc_gate_6_gray.active",
7472 "emc_gate_7_gray.active",
7477 "emc_gate_8_gray.active",
7482 "dc_gate_white_gray.active",
7487 "emc_dripper.active",
7492 "emc_spring_bumper.active",
7493 "emc_spring_bumper",
7507 "mm_gray_ball.active",
7512 "mm_gray_ball.opening",
7517 "mm_ice_wall.shrinking",
7522 "mm_amoeba_wall.growing",
7527 "mm_pacman.eating.right",
7529 "pac man (eating right)"
7532 "mm_pacman.eating.up",
7534 "pac man (eating up)"
7537 "mm_pacman.eating.left",
7539 "pac man (eating left)"
7542 "mm_pacman.eating.down",
7544 "pac man (eating down)"
7549 "active bomb (MM style)"
7557 // --------------------------------------------------------------------------
7558 // "unreal" (and therefore not drawable) runtime elements
7559 // --------------------------------------------------------------------------
7587 "acid_splash_right",
7602 "expandable_wall.growing",
7607 "expandable_steelwall.growing",
7617 "player_is_leaving",
7622 "player_is_exploding_1",
7627 "player_is_exploding_2",
7632 "player_is_exploding_3",
7637 "player_is_exploding_4",
7642 "quicksand.filling",
7647 "quicksand_fast.filling",
7652 "magic_wall.filling",
7657 "bd_magic_wall.filling",
7662 "dc_magic_wall.filling",
7672 "diagonal.shrinking",
7682 // --------------------------------------------------------------------------
7683 // dummy elements (never used as game elements, only used as graphics)
7684 // --------------------------------------------------------------------------
7687 "steelwall_topleft",
7692 "steelwall_topright",
7697 "steelwall_bottomleft",
7702 "steelwall_bottomright",
7707 "steelwall_horizontal",
7712 "steelwall_vertical",
7717 "invisible_steelwall_topleft",
7722 "invisible_steelwall_topright",
7727 "invisible_steelwall_bottomleft",
7732 "invisible_steelwall_bottomright",
7737 "invisible_steelwall_horizontal",
7742 "invisible_steelwall_vertical",
7757 "dynabomb_player_1",
7762 "dynabomb_player_2",
7767 "dynabomb_player_3",
7772 "dynabomb_player_4",
7777 "shield_normal.active",
7782 "shield_deadly.active",
7797 "mm_lightball_blue",
7802 "mm_lightball_yellow",
7872 "bd_game_graphics_color_template",
7877 "internal_clipboard_custom",
7879 "empty custom element"
7882 "internal_clipboard_change",
7887 "internal_clipboard_group",
7889 "empty group element"
7897 "internal_cascade_bd",
7899 "show Boulder Dash elements"
7902 "internal_cascade_bd.active",
7904 "hide Boulder Dash elements"
7907 "internal_cascade_bd_native",
7909 "show native Boulder Dash elements"
7912 "internal_cascade_bd_native.active",
7914 "hide native Boulder Dash elements"
7917 "internal_cascade_em",
7919 "show Emerald Mine elements"
7922 "internal_cascade_em.active",
7924 "hide Emerald Mine elements"
7927 "internal_cascade_emc",
7929 "show Emerald Mine Club elements"
7932 "internal_cascade_emc.active",
7934 "hide Emerald Mine Club elements"
7937 "internal_cascade_rnd",
7939 "show Rocks'n'Diamonds elements"
7942 "internal_cascade_rnd.active",
7944 "hide Rocks'n'Diamonds elements"
7947 "internal_cascade_sb",
7949 "show Sokoban elements"
7952 "internal_cascade_sb.active",
7954 "hide Sokoban elements"
7957 "internal_cascade_sp",
7959 "show Supaplex elements"
7962 "internal_cascade_sp.active",
7964 "hide Supaplex elements"
7967 "internal_cascade_dc",
7969 "show Diamond Caves II elements"
7972 "internal_cascade_dc.active",
7974 "hide Diamond Caves II elements"
7977 "internal_cascade_dx",
7979 "show DX Boulderdash elements"
7982 "internal_cascade_dx.active",
7984 "hide DX Boulderdash elements"
7987 "internal_cascade_mm",
7989 "show Mirror Magic elements"
7992 "internal_cascade_mm.active",
7994 "hide Mirror Magic elements"
7997 "internal_cascade_df",
7999 "show Deflektor elements"
8002 "internal_cascade_df.active",
8004 "hide Deflektor elements"
8007 "internal_cascade_chars",
8009 "show text elements"
8012 "internal_cascade_chars.active",
8014 "hide text elements"
8017 "internal_cascade_steel_chars",
8019 "show steel text elements"
8022 "internal_cascade_steel_chars.active",
8024 "hide steel text elements"
8027 "internal_cascade_ce",
8029 "show custom elements"
8032 "internal_cascade_ce.active",
8034 "hide custom elements"
8037 "internal_cascade_ge",
8039 "show group elements"
8042 "internal_cascade_ge.active",
8044 "hide group elements"
8047 "internal_cascade_es",
8049 "show empty space elements"
8052 "internal_cascade_es.active",
8054 "hide empty space elements"
8057 "internal_cascade_ref",
8059 "show reference elements"
8062 "internal_cascade_ref.active",
8064 "hide reference elements"
8067 "internal_cascade_user",
8069 "show user defined elements"
8072 "internal_cascade_user.active",
8074 "hide user defined elements"
8077 "internal_cascade_dynamic",
8079 "show elements used in this level"
8082 "internal_cascade_dynamic.active",
8084 "hide elements used in this level"
8087 // keyword to stop parser: "ELEMENT_INFO_END" <-- do not change!
8097 // ----------------------------------------------------------------------------
8098 // element action and direction definitions
8099 // ----------------------------------------------------------------------------
8101 struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] =
8103 { ".[DEFAULT]", ACTION_DEFAULT, TRUE },
8104 { ".waiting", ACTION_WAITING, TRUE },
8105 { ".falling", ACTION_FALLING, TRUE },
8106 { ".moving", ACTION_MOVING, TRUE },
8107 { ".digging", ACTION_DIGGING, FALSE },
8108 { ".snapping", ACTION_SNAPPING, FALSE },
8109 { ".collecting", ACTION_COLLECTING, FALSE },
8110 { ".dropping", ACTION_DROPPING, FALSE },
8111 { ".pushing", ACTION_PUSHING, FALSE },
8112 { ".walking", ACTION_WALKING, FALSE },
8113 { ".passing", ACTION_PASSING, FALSE },
8114 { ".impact", ACTION_IMPACT, FALSE },
8115 { ".breaking", ACTION_BREAKING, FALSE },
8116 { ".activating", ACTION_ACTIVATING, FALSE },
8117 { ".deactivating", ACTION_DEACTIVATING, FALSE },
8118 { ".opening", ACTION_OPENING, FALSE },
8119 { ".closing", ACTION_CLOSING, FALSE },
8120 { ".attacking", ACTION_ATTACKING, TRUE },
8121 { ".growing", ACTION_GROWING, TRUE },
8122 { ".shrinking", ACTION_SHRINKING, FALSE },
8123 { ".active", ACTION_ACTIVE, TRUE },
8124 { ".filling", ACTION_FILLING, FALSE },
8125 { ".emptying", ACTION_EMPTYING, FALSE },
8126 { ".changing", ACTION_CHANGING, FALSE },
8127 { ".exploding", ACTION_EXPLODING, FALSE },
8128 { ".boring", ACTION_BORING, FALSE },
8129 { ".boring[1]", ACTION_BORING_1, FALSE },
8130 { ".boring[2]", ACTION_BORING_2, FALSE },
8131 { ".boring[3]", ACTION_BORING_3, FALSE },
8132 { ".boring[4]", ACTION_BORING_4, FALSE },
8133 { ".boring[5]", ACTION_BORING_5, FALSE },
8134 { ".boring[6]", ACTION_BORING_6, FALSE },
8135 { ".boring[7]", ACTION_BORING_7, FALSE },
8136 { ".boring[8]", ACTION_BORING_8, FALSE },
8137 { ".boring[9]", ACTION_BORING_9, FALSE },
8138 { ".boring[10]", ACTION_BORING_10, FALSE },
8139 { ".sleeping", ACTION_SLEEPING, FALSE },
8140 { ".sleeping[1]", ACTION_SLEEPING_1, FALSE },
8141 { ".sleeping[2]", ACTION_SLEEPING_2, FALSE },
8142 { ".sleeping[3]", ACTION_SLEEPING_3, FALSE },
8143 { ".awakening", ACTION_AWAKENING, FALSE },
8144 { ".dying", ACTION_DYING, FALSE },
8145 { ".turning", ACTION_TURNING, FALSE },
8146 { ".turning_from_left", ACTION_TURNING_FROM_LEFT, FALSE },
8147 { ".turning_from_right", ACTION_TURNING_FROM_RIGHT, FALSE },
8148 { ".turning_from_up", ACTION_TURNING_FROM_UP, FALSE },
8149 { ".turning_from_down", ACTION_TURNING_FROM_DOWN, FALSE },
8150 { ".smashed_by_rock", ACTION_SMASHED_BY_ROCK, FALSE },
8151 { ".smashed_by_spring", ACTION_SMASHED_BY_SPRING, FALSE },
8152 { ".eating", ACTION_EATING, FALSE },
8153 { ".twinkling", ACTION_TWINKLING, FALSE },
8154 { ".splashing", ACTION_SPLASHING, FALSE },
8155 { ".hitting", ACTION_HITTING, FALSE },
8156 { ".page[1]", ACTION_PAGE_1, FALSE },
8157 { ".page[2]", ACTION_PAGE_2, FALSE },
8158 { ".page[3]", ACTION_PAGE_3, FALSE },
8159 { ".page[4]", ACTION_PAGE_4, FALSE },
8160 { ".page[5]", ACTION_PAGE_5, FALSE },
8161 { ".page[6]", ACTION_PAGE_6, FALSE },
8162 { ".page[7]", ACTION_PAGE_7, FALSE },
8163 { ".page[8]", ACTION_PAGE_8, FALSE },
8164 { ".page[9]", ACTION_PAGE_9, FALSE },
8165 { ".page[10]", ACTION_PAGE_10, FALSE },
8166 { ".page[11]", ACTION_PAGE_11, FALSE },
8167 { ".page[12]", ACTION_PAGE_12, FALSE },
8168 { ".page[13]", ACTION_PAGE_13, FALSE },
8169 { ".page[14]", ACTION_PAGE_14, FALSE },
8170 { ".page[15]", ACTION_PAGE_15, FALSE },
8171 { ".page[16]", ACTION_PAGE_16, FALSE },
8172 { ".page[17]", ACTION_PAGE_17, FALSE },
8173 { ".page[18]", ACTION_PAGE_18, FALSE },
8174 { ".page[19]", ACTION_PAGE_19, FALSE },
8175 { ".page[20]", ACTION_PAGE_20, FALSE },
8176 { ".page[21]", ACTION_PAGE_21, FALSE },
8177 { ".page[22]", ACTION_PAGE_22, FALSE },
8178 { ".page[23]", ACTION_PAGE_23, FALSE },
8179 { ".page[24]", ACTION_PAGE_24, FALSE },
8180 { ".page[25]", ACTION_PAGE_25, FALSE },
8181 { ".page[26]", ACTION_PAGE_26, FALSE },
8182 { ".page[27]", ACTION_PAGE_27, FALSE },
8183 { ".page[28]", ACTION_PAGE_28, FALSE },
8184 { ".page[29]", ACTION_PAGE_29, FALSE },
8185 { ".page[30]", ACTION_PAGE_30, FALSE },
8186 { ".page[31]", ACTION_PAGE_31, FALSE },
8187 { ".page[32]", ACTION_PAGE_32, FALSE },
8188 { ".part_1", ACTION_PART_1, FALSE },
8189 { ".part_2", ACTION_PART_2, FALSE },
8190 { ".part_3", ACTION_PART_3, FALSE },
8191 { ".part_4", ACTION_PART_4, FALSE },
8192 { ".part_5", ACTION_PART_5, FALSE },
8193 { ".part_6", ACTION_PART_6, FALSE },
8194 { ".part_7", ACTION_PART_7, FALSE },
8195 { ".part_8", ACTION_PART_8, FALSE },
8196 { ".part_9", ACTION_PART_9, FALSE },
8197 { ".part_10", ACTION_PART_10, FALSE },
8198 { ".part_11", ACTION_PART_11, FALSE },
8199 { ".part_12", ACTION_PART_12, FALSE },
8200 { ".part_13", ACTION_PART_13, FALSE },
8201 { ".part_14", ACTION_PART_14, FALSE },
8202 { ".part_15", ACTION_PART_15, FALSE },
8203 { ".part_16", ACTION_PART_16, FALSE },
8204 { ".part_17", ACTION_PART_17, FALSE },
8205 { ".part_18", ACTION_PART_18, FALSE },
8206 { ".part_19", ACTION_PART_19, FALSE },
8207 { ".part_20", ACTION_PART_20, FALSE },
8208 { ".part_21", ACTION_PART_21, FALSE },
8209 { ".part_22", ACTION_PART_22, FALSE },
8210 { ".part_23", ACTION_PART_23, FALSE },
8211 { ".part_24", ACTION_PART_24, FALSE },
8212 { ".part_25", ACTION_PART_25, FALSE },
8213 { ".part_26", ACTION_PART_26, FALSE },
8214 { ".part_27", ACTION_PART_27, FALSE },
8215 { ".part_28", ACTION_PART_28, FALSE },
8216 { ".part_29", ACTION_PART_29, FALSE },
8217 { ".part_30", ACTION_PART_30, FALSE },
8218 { ".part_31", ACTION_PART_31, FALSE },
8219 { ".part_32", ACTION_PART_32, FALSE },
8220 { ".other", ACTION_OTHER, FALSE },
8222 // empty suffix always matches -- check as last entry in InitSoundInfo()
8223 { "", ACTION_DEFAULT, TRUE },
8228 struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS_FULL + 1] =
8230 { ".left", MV_BIT_LEFT },
8231 { ".right", MV_BIT_RIGHT },
8232 { ".up", MV_BIT_UP },
8233 { ".down", MV_BIT_DOWN },
8234 { ".upleft", MV_BIT_UP },
8235 { ".upright", MV_BIT_RIGHT },
8236 { ".downleft", MV_BIT_LEFT },
8237 { ".downright", MV_BIT_DOWN },
8242 struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1 + 1] =
8244 { ".[DEFAULT]", GFX_SPECIAL_ARG_DEFAULT, },
8245 { ".LOADING_INITIAL", GFX_SPECIAL_ARG_LOADING_INITIAL, },
8246 { ".LOADING", GFX_SPECIAL_ARG_LOADING, },
8247 { ".TITLE_INITIAL", GFX_SPECIAL_ARG_TITLE_INITIAL, },
8248 { ".TITLE_INITIAL_1", GFX_SPECIAL_ARG_TITLE_INITIAL_1, },
8249 { ".TITLE_INITIAL_2", GFX_SPECIAL_ARG_TITLE_INITIAL_2, },
8250 { ".TITLE_INITIAL_3", GFX_SPECIAL_ARG_TITLE_INITIAL_3, },
8251 { ".TITLE_INITIAL_4", GFX_SPECIAL_ARG_TITLE_INITIAL_4, },
8252 { ".TITLE_INITIAL_5", GFX_SPECIAL_ARG_TITLE_INITIAL_5, },
8253 { ".TITLE", GFX_SPECIAL_ARG_TITLE, },
8254 { ".TITLE_1", GFX_SPECIAL_ARG_TITLE_1, },
8255 { ".TITLE_2", GFX_SPECIAL_ARG_TITLE_2, },
8256 { ".TITLE_3", GFX_SPECIAL_ARG_TITLE_3, },
8257 { ".TITLE_4", GFX_SPECIAL_ARG_TITLE_4, },
8258 { ".TITLE_5", GFX_SPECIAL_ARG_TITLE_5, },
8259 { ".MAIN", GFX_SPECIAL_ARG_MAIN, },
8260 { ".NAMES", GFX_SPECIAL_ARG_NAMES, },
8261 { ".LEVELS", GFX_SPECIAL_ARG_LEVELS },
8262 { ".LEVELNR", GFX_SPECIAL_ARG_LEVELNR },
8263 { ".SCORES", GFX_SPECIAL_ARG_SCORES, },
8264 { ".SCOREINFO", GFX_SPECIAL_ARG_SCOREINFO, },
8265 { ".EDITOR", GFX_SPECIAL_ARG_EDITOR, },
8266 { ".INFO", GFX_SPECIAL_ARG_INFO, },
8267 { ".SETUP", GFX_SPECIAL_ARG_SETUP, },
8268 { ".PLAYING", GFX_SPECIAL_ARG_PLAYING, },
8269 { ".DOOR", GFX_SPECIAL_ARG_DOOR, },
8270 { ".TAPE", GFX_SPECIAL_ARG_TAPE, },
8271 { ".PANEL", GFX_SPECIAL_ARG_PANEL, },
8272 { ".PREVIEW", GFX_SPECIAL_ARG_PREVIEW, },
8273 { ".CRUMBLED", GFX_SPECIAL_ARG_CRUMBLED, },
8274 { ".MAINONLY", GFX_SPECIAL_ARG_MAINONLY, },
8275 { ".NAMESONLY", GFX_SPECIAL_ARG_NAMESONLY, },
8276 { ".SCORESONLY", GFX_SPECIAL_ARG_SCORESONLY, },
8277 { ".TYPENAME", GFX_SPECIAL_ARG_TYPENAME, },
8278 { ".TYPENAMES", GFX_SPECIAL_ARG_TYPENAMES, },
8279 { ".SUBMENU", GFX_SPECIAL_ARG_SUBMENU, },
8280 { ".MENU", GFX_SPECIAL_ARG_MENU, },
8281 { ".TOONS", GFX_SPECIAL_ARG_TOONS, },
8282 { ".SCORESOLD", GFX_SPECIAL_ARG_SCORESOLD, },
8283 { ".SCORESNEW", GFX_SPECIAL_ARG_SCORESNEW, },
8284 { ".NO_TITLE", GFX_SPECIAL_ARG_NO_TITLE, },
8285 { ".FADING", GFX_SPECIAL_ARG_FADING, },
8286 { ".QUIT", GFX_SPECIAL_ARG_QUIT, },
8288 // empty suffix always matches -- check as last entry in InitMusicInfo()
8289 { "", GFX_SPECIAL_ARG_DEFAULT, },
8294 #include "conf_var.c" // include auto-generated data structure definitions
8297 // ----------------------------------------------------------------------------
8299 // ----------------------------------------------------------------------------
8301 // Important: When one entry is a prefix of another entry, the longer entry
8302 // must come first, because the dynamic configuration does prefix matching!
8303 // (These definitions must match the corresponding definitions in "main.h"!)
8305 struct FontInfo font_info[NUM_FONTS + 1] =
8307 { "font.initial_1" },
8308 { "font.initial_2" },
8309 { "font.initial_3" },
8310 { "font.initial_4" },
8313 { "font.menu_1.active" },
8314 { "font.menu_2.active" },
8317 { "font.text_1.active" },
8318 { "font.text_2.active" },
8319 { "font.text_3.active" },
8320 { "font.text_4.active" },
8325 { "font.envelope_1" },
8326 { "font.envelope_2" },
8327 { "font.envelope_3" },
8328 { "font.envelope_4" },
8329 { "font.request_narrow" },
8331 { "font.input_1.active" },
8332 { "font.input_2.active" },
8335 { "font.option_off_narrow" },
8336 { "font.option_off" },
8337 { "font.option_on_narrow" },
8338 { "font.option_on" },
8341 { "font.value_old_narrow" },
8342 { "font.value_old" },
8343 { "font.value_narrow" },
8344 { "font.level_number.active" },
8345 { "font.level_number" },
8346 { "font.tape_recorder" },
8347 { "font.game_info" },
8348 { "font.info.elements" },
8349 { "font.info.levelset" },
8350 { "font.main.network_players" },
8355 struct GlobalAnimInfo global_anim_info[NUM_GLOBAL_ANIM_TOKENS + 1];
8357 // this contains predefined structure elements to init "global_anim_info"
8358 struct GlobalAnimNameInfo global_anim_name_info[NUM_GLOBAL_ANIM_TOKENS + 1] =
8360 // (real) graphic definitions used to define animation graphics
8361 { "gfx.global.anim_1", },
8362 { "gfx.global.anim_2", },
8363 { "gfx.global.anim_3", },
8364 { "gfx.global.anim_4", },
8365 { "gfx.global.anim_5", },
8366 { "gfx.global.anim_6", },
8367 { "gfx.global.anim_7", },
8368 { "gfx.global.anim_8", },
8369 { "gfx.global.anim_9", },
8370 { "gfx.global.anim_10", },
8371 { "gfx.global.anim_11", },
8372 { "gfx.global.anim_12", },
8373 { "gfx.global.anim_13", },
8374 { "gfx.global.anim_14", },
8375 { "gfx.global.anim_15", },
8376 { "gfx.global.anim_16", },
8377 { "gfx.global.anim_17", },
8378 { "gfx.global.anim_18", },
8379 { "gfx.global.anim_19", },
8380 { "gfx.global.anim_20", },
8381 { "gfx.global.anim_21", },
8382 { "gfx.global.anim_22", },
8383 { "gfx.global.anim_23", },
8384 { "gfx.global.anim_24", },
8385 { "gfx.global.anim_25", },
8386 { "gfx.global.anim_26", },
8387 { "gfx.global.anim_27", },
8388 { "gfx.global.anim_28", },
8389 { "gfx.global.anim_29", },
8390 { "gfx.global.anim_30", },
8391 { "gfx.global.anim_31", },
8392 { "gfx.global.anim_32", },
8394 // (dummy) graphic definitions used to define animation controls
8395 { "global.anim_1", },
8396 { "global.anim_2", },
8397 { "global.anim_3", },
8398 { "global.anim_4", },
8399 { "global.anim_5", },
8400 { "global.anim_6", },
8401 { "global.anim_7", },
8402 { "global.anim_8", },
8403 { "global.anim_9", },
8404 { "global.anim_10", },
8405 { "global.anim_11", },
8406 { "global.anim_12", },
8407 { "global.anim_13", },
8408 { "global.anim_14", },
8409 { "global.anim_15", },
8410 { "global.anim_16", },
8411 { "global.anim_17", },
8412 { "global.anim_18", },
8413 { "global.anim_19", },
8414 { "global.anim_20", },
8415 { "global.anim_21", },
8416 { "global.anim_22", },
8417 { "global.anim_23", },
8418 { "global.anim_24", },
8419 { "global.anim_25", },
8420 { "global.anim_26", },
8421 { "global.anim_27", },
8422 { "global.anim_28", },
8423 { "global.anim_29", },
8424 { "global.anim_30", },
8425 { "global.anim_31", },
8426 { "global.anim_32", },
8431 struct GlobalAnimEventInfo global_anim_event_info =
8437 // ----------------------------------------------------------------------------
8438 // music token prefix definitions
8439 // ----------------------------------------------------------------------------
8441 struct MusicPrefixInfo music_prefix_info[NUM_MUSIC_PREFIXES + 1] =
8443 { "background", TRUE },
8449 // ============================================================================
8451 // ============================================================================
8453 static void print_usage(void)
8456 "Usage: %s [OPTION]... [HOSTNAME [PORT]]\n"
8459 " -b, --basepath DIRECTORY alternative base DIRECTORY\n"
8460 " -l, --levels DIRECTORY alternative levels DIRECTORY\n"
8461 " -g, --graphics DIRECTORY alternative graphics DIRECTORY\n"
8462 " -s, --sounds DIRECTORY alternative sounds DIRECTORY\n"
8463 " -m, --music DIRECTORY alternative music DIRECTORY\n"
8464 " --display NR open program window on display NR\n"
8465 " --mytapes use private tapes for tape tests\n"
8466 " -n, --network network multiplayer game\n"
8467 " --serveronly only start network server\n"
8468 " -v, --verbose verbose mode\n"
8469 " -V, --version show program version\n"
8470 " --debug[=MODE] show (and limit) debug output\n"
8471 " -e, --execute COMMAND execute batch COMMAND\n"
8473 "Valid commands for '--execute' option:\n"
8474 " \"print graphicsinfo.conf\" print default graphics config\n"
8475 " \"print soundsinfo.conf\" print default sounds config\n"
8476 " \"print musicinfo.conf\" print default music config\n"
8477 " \"print editorsetup.conf\" print default editor config\n"
8478 " \"print helpanim.conf\" print default helpanim config\n"
8479 " \"print helptext.conf\" print default helptext config\n"
8480 " \"dump level FILE\" dump level data from FILE\n"
8481 " \"dump tape FILE\" dump tape data from FILE\n"
8482 " \"autoplay LEVELDIR [NR ...]\" play level tapes for LEVELDIR\n"
8483 " \"autoffwd LEVELDIR [NR ...]\" ffwd level tapes for LEVELDIR\n"
8484 " \"autowarp LEVELDIR [NR ...]\" warp level tapes for LEVELDIR\n"
8485 " \"autotest LEVELDIR [NR ...]\" test level tapes for LEVELDIR\n"
8486 " \"autofix LEVELDIR [NR ...]\" test and fix tapes for LEVELDIR\n"
8487 " \"patch tapes MODE LEVELDIR [NR]\" patch level tapes for LEVELDIR\n"
8488 " \"convert LEVELDIR [NR]\" convert levels in LEVELDIR\n"
8489 " \"create sketch images DIRECTORY\" write BMP images to DIRECTORY\n"
8490 " \"create collect image DIRECTORY\" write BMP image to DIRECTORY\n"
8492 program.command_basename);
8495 static void print_version(void)
8497 Print("%s", getProgramInitString());
8499 if (!strEqual(getProgramVersionString(), getProgramRealVersionString()))
8501 Print(" (%s %d.%d.%d.%d%s)",
8502 PROGRAM_TITLE_STRING,
8503 PROGRAM_VERSION_SUPER,
8504 PROGRAM_VERSION_MAJOR,
8505 PROGRAM_VERSION_MINOR,
8506 PROGRAM_VERSION_PATCH,
8507 PROGRAM_VERSION_EXTRA);
8514 SDL_version sdl_version;
8516 SDL_VERSION(&sdl_version);
8517 Print("- SDL %d.%d.%d\n",
8522 SDL_IMAGE_VERSION(&sdl_version);
8523 Print("- SDL_image %d.%d.%d\n",
8528 SDL_MIXER_VERSION(&sdl_version);
8529 Print("- SDL_mixer %d.%d.%d\n",
8534 SDL_NET_VERSION(&sdl_version);
8535 Print("- SDL_net %d.%d.%d\n",
8542 static void InitProgramConfig(char *command_filename)
8544 char *program_title = PROGRAM_TITLE_STRING;
8545 char *program_icon_file = PROGRAM_ICON_FILENAME;
8546 char *program_version = getProgramRealVersionString();
8547 char *program_basename = getBaseNameNoSuffix(command_filename);
8548 char *config_filename = getProgramConfigFilename(command_filename);
8549 char *userdata_subdir;
8551 // read default program config, if existing
8552 if (fileExists(config_filename))
8553 LoadSetupFromFilename(config_filename);
8555 // set program title from potentially redefined program title
8556 if (setup.internal.program_title != NULL &&
8557 strlen(setup.internal.program_title) > 0)
8558 program_title = getStringCopy(setup.internal.program_title);
8560 // set program version from potentially redefined program version
8561 if (setup.internal.program_version != NULL &&
8562 strlen(setup.internal.program_version) > 0)
8563 program_version = getStringCopy(setup.internal.program_version);
8565 // set program icon file from potentially redefined program icon file
8566 if (setup.internal.program_icon_file != NULL &&
8567 strlen(setup.internal.program_icon_file) > 0)
8568 program_icon_file = getStringCopy(setup.internal.program_icon_file);
8570 #if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MAC) || defined(PLATFORM_EMSCRIPTEN)
8571 userdata_subdir = program_title;
8572 #elif defined(PLATFORM_UNIX)
8573 userdata_subdir = getStringCat2(".", program_basename);
8575 userdata_subdir = USERDATA_DIRECTORY_OTHER;
8578 // set default window size (only relevant on program startup)
8579 if (setup.internal.default_window_width != 0 &&
8580 setup.internal.default_window_height != 0)
8582 WIN_XSIZE = setup.internal.default_window_width;
8583 WIN_YSIZE = setup.internal.default_window_height;
8586 InitProgramInfo(command_filename,
8594 GAME_VERSION_ACTUAL);
8597 int main(int argc, char *argv[])
8599 InitProgramConfig(argv[0]);
8601 InitWindowTitleFunction(getWindowTitleString);
8602 InitExitMessageFunction(DisplayExitMessage);
8603 InitExitFunction(CloseAllAndExit);
8604 InitPlatformDependentStuff();
8606 GetOptions(argc, argv, print_usage, print_version);
8612 return 0; // to keep compilers happy