added setup options to skip (un)covering and hatching for BD engine
[rocksndiamonds.git] / src / main.h
index 32c877527c9713642bb246ffa86b2a137c73ee50..8e6da7fd05def110d812c41a451beec6edd45633 100644 (file)
 #include <fcntl.h>
 
 #include "libgame/libgame.h"
+
+#include "game_bd/game_bd.h"
 #include "game_em/game_em.h"
 #include "game_sp/game_sp.h"
 #include "game_mm/game_mm.h"
-#include "engines.h"
 
 #include "conf_gfx.h"  // include auto-generated data structure definitions
 #include "conf_snd.h"  // include auto-generated data structure definitions
 #define IS_INTERNAL_ELEMENT(e) ((e) >= EL_INTERNAL_START &&            \
                                 (e) <= EL_INTERNAL_END)
 
-#define IS_MM_ELEMENT(e)       ((e) >= EL_MM_START &&                  \
-                                (e) <= EL_MM_END)
-
-#define IS_DF_ELEMENT(e)       ((e) >= EL_DF_START &&                  \
-                                (e) <= EL_DF_END)
+#define IS_MM_ELEMENT_1(e)     ((e) >= EL_MM_START_1 &&                \
+                                (e) <= EL_MM_END_1)
+#define IS_MM_ELEMENT_2(e)     ((e) >= EL_MM_START_2 &&                \
+                                (e) <= EL_MM_END_2)
+#define IS_MM_ELEMENT_3(e)     ((e) >= EL_MM_START_3 &&                \
+                                (e) <= EL_MM_END_3)
+#define IS_MM_ELEMENT(e)       (IS_MM_ELEMENT_1(e) ||                  \
+                                IS_MM_ELEMENT_2(e) ||                  \
+                                IS_MM_ELEMENT_3(e))
+
+#define IS_DF_ELEMENT_1(e)     ((e) >= EL_DF_START_1 &&                \
+                                (e) <= EL_DF_END_1)
+#define IS_DF_ELEMENT_2(e)     ((e) >= EL_DF_START_2 &&                \
+                                (e) <= EL_DF_END_2)
+#define IS_DF_ELEMENT(e)       (IS_DF_ELEMENT_1(e) ||                  \
+                                IS_DF_ELEMENT_2(e))
 
 #define IS_MM_MCDUFFIN(e)      ((e) >= EL_MM_MCDUFFIN_START &&         \
                                 (e) <= EL_MM_MCDUFFIN_END)
 #define EL_BD_FIREFLY_UP               75
 #define EL_BD_FIREFLY_LEFT             76
 #define EL_BD_FIREFLY_DOWN             77
-#define EL_BD_BUTTERFLY_1              EL_BD_BUTTERFLY_DOWN
-#define EL_BD_BUTTERFLY_2              EL_BD_BUTTERFLY_LEFT
-#define EL_BD_BUTTERFLY_3              EL_BD_BUTTERFLY_UP
-#define EL_BD_BUTTERFLY_4              EL_BD_BUTTERFLY_RIGHT
-#define EL_BD_FIREFLY_1                        EL_BD_FIREFLY_LEFT
-#define EL_BD_FIREFLY_2                        EL_BD_FIREFLY_DOWN
-#define EL_BD_FIREFLY_3                        EL_BD_FIREFLY_RIGHT
-#define EL_BD_FIREFLY_4                        EL_BD_FIREFLY_UP
 #define EL_BD_BUTTERFLY                        78
 #define EL_BD_FIREFLY                  79
 #define EL_PLAYER_1                    80
 
 #define EL_EM_KEY_1_FILE_OBSOLETE      119     // obsolete; now EL_EM_KEY_1
 
+// text character elements
 #define EL_CHAR_START                  120
 #define EL_CHAR_ASCII0                 (EL_CHAR_START  - 32)
 #define EL_CHAR_ASCII0_START           (EL_CHAR_ASCII0 + 32)
 #define EL_EXPANDABLE_WALL_VERTICAL    201
 #define EL_EXPANDABLE_WALL_ANY         202
 
+// EM style elements
 #define EL_EM_GATE_1                   203
 #define EL_EM_GATE_2                   204
 #define EL_EM_GATE_3                   205
 #define EL_EM_KEY_3_FILE_OBSOLETE      208     // obsolete; now EL_EM_KEY_3
 #define EL_EM_KEY_4_FILE_OBSOLETE      209     // obsolete; now EL_EM_KEY_4
 
+// SP style elements
 #define EL_SP_START                    210
 #define EL_SP_EMPTY_SPACE              (EL_SP_START + 0)
 #define EL_SP_EMPTY                    EL_SP_EMPTY_SPACE
 #define EL_SP_CHIP_BOTTOM              (EL_SP_START + 39)
 #define EL_SP_END                      (EL_SP_START + 39)
 
+// EM style elements
 #define EL_EM_GATE_1_GRAY              250
 #define EL_EM_GATE_2_GRAY              251
 #define EL_EM_GATE_3_GRAY              252
 #define EL_EM_DYNAMITE                 254
 #define EL_EM_DYNAMITE_ACTIVE          255
 
+// DC2 style elements
 #define EL_PEARL                       256
 #define EL_CRYSTAL                     257
 #define EL_WALL_PEARL                  258
 #define EL_TIMEGATE_SWITCH_ACTIVE      324
 #define EL_TIMEGATE_SWITCH             325
 
+// EMC style elements
 #define EL_BALLOON                     326
 #define EL_BALLOON_SWITCH_LEFT         327
 #define EL_BALLOON_SWITCH_RIGHT                328
 #define EL_EMC_WALL_7                  342
 #define EL_EMC_WALL_8                  343
 
+// DX style elements
 #define EL_TUBE_ANY                    344
 #define EL_TUBE_VERTICAL               345
 #define EL_TUBE_HORIZONTAL             346
 #define EL_CUSTOM_END                  615
 // ---------- end of custom elements section ----------------------------------
 
+// EM style elements
 #define EL_EM_KEY_1                    616
 #define EL_EM_KEY_2                    617
 #define EL_EM_KEY_3                    618
 #define EL_EM_KEY_4                    619
+
+// DC2 style elements
 #define EL_ENVELOPE_1                  620
 #define EL_ENVELOPE_2                  621
 #define EL_ENVELOPE_3                  622
 
 #define EL_BD_EXPANDABLE_WALL          713
 
+// reference elements
 #define EL_PREV_CE_8                   714
 #define EL_PREV_CE_7                   715
 #define EL_PREV_CE_6                   716
 #define EL_NEXT_CE_8                   730
 #define EL_ANY_ELEMENT                 731
 
+// text character elements
 #define EL_STEEL_CHAR_START            732
 #define EL_STEEL_CHAR_ASCII0           (EL_STEEL_CHAR_START  - 32)
 #define EL_STEEL_CHAR_ASCII0_START     (EL_STEEL_CHAR_ASCII0 + 32)
 
 #define EL_STEEL_CHAR(c)               (EL_STEEL_CHAR_ASCII0+MAP_FONT_ASCII(c))
 
+// unused elements
 #define EL_SPERMS                      812
 #define EL_BULLET                      813
 #define EL_HEART                       814
 #define EL_SIGN_CROSS                  820
 #define EL_SIGN_FRANKIE                        821
 
+// DC2 style elements
 #define EL_STEEL_EXIT_CLOSED           822
 #define EL_STEEL_EXIT_OPEN             823
 
 
 #define EL_FROM_LEVEL_TEMPLATE         863
 
+// MM style elements
 #define EL_MM_START                    864
 #define EL_MM_START_1                  EL_MM_START
 
 #define EL_MM_END_1                    (EL_MM_START + 159)
 #define EL_MM_START_2                  (EL_MM_START + 160)
 
+// DF style elements
 #define EL_DF_START                    EL_MM_START_2
+#define EL_DF_START_1                  EL_MM_START_2
 #define EL_DF_START2                   (EL_DF_START - 240)
 
 #define EL_DF_MIRROR_START             EL_DF_START
 #define EL_DF_STEEL_GRID_ROTATING_8    (EL_DF_STEEL_GRID_ROTATING_START + 7)
 #define EL_DF_STEEL_GRID_ROTATING_END  EL_DF_STEEL_GRID_ROTATING_07
 
-#define EL_DF_END                      (EL_DF_START2 + 355)
+#define EL_DF_END_1                    (EL_DF_START2 + 355)
 
+// MM style elements
 #define EL_MM_TELEPORTER_RED_START     (EL_DF_START2 + 356)
 #define EL_MM_TELEPORTER_RED_1         (EL_MM_TELEPORTER_RED_START + 0)
 #define EL_MM_TELEPORTER_RED_2         (EL_MM_TELEPORTER_RED_START + 1)
 #define EL_DF_WOODEN_WALL              1214
 
 #define EL_MM_END_2                    (EL_DF_START2 + 430)
-#define EL_MM_END                      EL_MM_END_2
 
+// EMC style elements
 #define EL_SPRING_LEFT                 1215
 #define EL_SPRING_RIGHT                        1216
 
 // ---------- end of empty space elements section -----------------------------
 
 #define EL_MM_START_3                  EL_DF_MIRROR_FIXED_START
+#define EL_DF_START_2                  EL_DF_MIRROR_FIXED_START
 
+// DF style elements
 #define EL_DF_MIRROR_FIXED_START       1233
 #define EL_DF_MIRROR_FIXED_1           (EL_DF_MIRROR_FIXED_START + 0)
 #define EL_DF_MIRROR_FIXED_2           (EL_DF_MIRROR_FIXED_START + 1)
 #define EL_DF_MIRROR_FIXED_16          (EL_DF_MIRROR_FIXED_START + 15)
 #define EL_DF_MIRROR_FIXED_END         EL_DF_MIRROR_FIXED_16
 
-#define EL_MM_END_3                    EL_DF_MIRROR_FIXED_END
-
-#define NUM_FILE_ELEMENTS              1249
+#define EL_DF_SLOPE_START              1249
+#define EL_DF_SLOPE_1                  (EL_DF_SLOPE_START + 0)
+#define EL_DF_SLOPE_2                  (EL_DF_SLOPE_START + 1)
+#define EL_DF_SLOPE_3                  (EL_DF_SLOPE_START + 2)
+#define EL_DF_SLOPE_4                  (EL_DF_SLOPE_START + 3)
+#define EL_DF_SLOPE_END                        EL_DF_SLOPE_4
+
+#define EL_MM_END_3                    EL_DF_SLOPE_END
+#define EL_DF_END_2                    EL_DF_SLOPE_END
+
+// BD style elements
+#define EL_BD_PLAYER                           1253
+#define EL_BD_SAND                             1254
+#define EL_BD_SAND_2                           1255
+#define EL_BD_SAND_BALL                                1256
+#define EL_BD_SAND_LOOSE                       1257
+#define EL_BD_SAND_SLOPED_UP_RIGHT             1258
+#define EL_BD_SAND_SLOPED_UP_LEFT              1259
+#define EL_BD_SAND_SLOPED_DOWN_LEFT            1260
+#define EL_BD_SAND_SLOPED_DOWN_RIGHT           1261
+#define EL_BD_SAND_GLUED                       1262
+#define EL_BD_WALL_SLOPED_UP_RIGHT             1263
+#define EL_BD_WALL_SLOPED_UP_LEFT              1264
+#define EL_BD_WALL_SLOPED_DOWN_LEFT            1265
+#define EL_BD_WALL_SLOPED_DOWN_RIGHT           1266
+#define EL_BD_WALL_NON_SLOPED                  1267
+#define EL_BD_WALL_DIGGABLE                    1268
+#define EL_BD_WALL_DIAMOND                     1269
+#define EL_BD_WALL_KEY_1                       1270
+#define EL_BD_WALL_KEY_2                       1271
+#define EL_BD_WALL_KEY_3                       1272
+#define EL_BD_FALLING_WALL                     1273
+#define EL_BD_STEELWALL                                1274
+#define EL_BD_STEELWALL_SLOPED_UP_RIGHT                1275
+#define EL_BD_STEELWALL_SLOPED_UP_LEFT         1276
+#define EL_BD_STEELWALL_SLOPED_DOWN_LEFT       1277
+#define EL_BD_STEELWALL_SLOPED_DOWN_RIGHT      1278
+#define EL_BD_STEELWALL_EXPLODABLE             1279
+#define EL_BD_STEELWALL_DIGGABLE               1280
+#define EL_BD_EXPANDABLE_WALL_HORIZONTAL       1281
+#define EL_BD_EXPANDABLE_WALL_VERTICAL         1282
+#define EL_BD_EXPANDABLE_WALL_ANY              1283
+#define EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL  1284
+#define EL_BD_EXPANDABLE_STEELWALL_VERTICAL    1285
+#define EL_BD_EXPANDABLE_STEELWALL_ANY         1286
+#define EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL        1287
+#define EL_BD_EXPANDABLE_WALL_SWITCH_VERTICAL  1288
+#define EL_BD_INBOX                            1289
+#define EL_BD_EXIT_CLOSED                      1290
+#define EL_BD_EXIT_OPEN                                1291
+#define EL_BD_INVISIBLE_EXIT_CLOSED            1292
+#define EL_BD_INVISIBLE_EXIT_OPEN              1293
+#define EL_BD_FLYING_ROCK                      1294
+#define EL_BD_MEGA_ROCK                                1295
+#define EL_BD_ROCK_GLUED                       1296
+#define EL_BD_FLYING_DIAMOND                   1297
+#define EL_BD_DIAMOND_GLUED                    1298
+#define EL_BD_DIAMOND_KEY                      1299
+#define EL_BD_TRAPPED_DIAMOND                  1300
+#define EL_BD_NUT                              1301
+#define EL_BD_AMOEBA_2                         1302
+#define EL_BD_BLADDER                          1303
+#define EL_BD_BLADDER_SPENDER                  1304
+#define EL_BD_CREATURE_SWITCH                  1305
+#define EL_BD_CREATURE_SWITCH_ACTIVE           1306
+#define EL_BD_BITER_SWITCH_1                   1307
+#define EL_BD_BITER_SWITCH_2                   1308
+#define EL_BD_BITER_SWITCH_3                   1309
+#define EL_BD_BITER_SWITCH_4                   1310
+#define EL_BD_REPLICATOR                       1311
+#define EL_BD_REPLICATOR_ACTIVE                        1312
+#define EL_BD_REPLICATOR_SWITCH                        1313
+#define EL_BD_REPLICATOR_SWITCH_ACTIVE         1314
+#define EL_BD_CONVEYOR_LEFT                    1315
+#define EL_BD_CONVEYOR_LEFT_ACTIVE             1316
+#define EL_BD_CONVEYOR_RIGHT                   1317
+#define EL_BD_CONVEYOR_RIGHT_ACTIVE            1318
+#define EL_BD_CONVEYOR_SWITCH                  1319
+#define EL_BD_CONVEYOR_SWITCH_ACTIVE           1320
+#define EL_BD_CONVEYOR_DIR_SWITCH_LEFT         1321
+#define EL_BD_CONVEYOR_DIR_SWITCH_RIGHT                1322
+#define EL_BD_GRAVITY_SWITCH                   1323
+#define EL_BD_GRAVITY_SWITCH_ACTIVE            1324
+#define EL_BD_ACID                             1325
+#define EL_BD_BOX                              1326
+#define EL_BD_TIME_PENALTY                     1327
+#define EL_BD_GRAVESTONE                       1328
+#define EL_BD_CLOCK                            1329
+#define EL_BD_POT                              1330
+#define EL_BD_PNEUMATIC_HAMMER                 1331
+#define EL_BD_TELEPORTER                       1332
+#define EL_BD_SKELETON                         1333
+#define EL_BD_WATER                            1334
+#define EL_BD_KEY_1                            1335
+#define EL_BD_KEY_2                            1336
+#define EL_BD_KEY_3                            1337
+#define EL_BD_GATE_1                           1338
+#define EL_BD_GATE_2                           1339
+#define EL_BD_GATE_3                           1340
+#define EL_BD_LAVA                             1341
+#define EL_BD_SWEET                            1342
+#define EL_BD_VOODOO_DOLL                      1343
+#define EL_BD_SLIME                            1344
+#define EL_BD_WAITING_ROCK                     1345
+#define EL_BD_CHASING_ROCK                     1346
+#define EL_BD_GHOST                            1347
+#define EL_BD_COW                              1348
+#define EL_BD_COW_LEFT                         1349
+#define EL_BD_COW_UP                           1350
+#define EL_BD_COW_RIGHT                                1351
+#define EL_BD_COW_DOWN                         1352
+#define EL_BD_BUTTERFLY_2                      1353
+#define EL_BD_BUTTERFLY_2_RIGHT                        1354
+#define EL_BD_BUTTERFLY_2_UP                   1355
+#define EL_BD_BUTTERFLY_2_LEFT                 1356
+#define EL_BD_BUTTERFLY_2_DOWN                 1357
+#define EL_BD_FIREFLY_2                                1358
+#define EL_BD_FIREFLY_2_RIGHT                  1359
+#define EL_BD_FIREFLY_2_UP                     1360
+#define EL_BD_FIREFLY_2_LEFT                   1361
+#define EL_BD_FIREFLY_2_DOWN                   1362
+#define EL_BD_STONEFLY                         1363
+#define EL_BD_STONEFLY_RIGHT                   1364
+#define EL_BD_STONEFLY_UP                      1365
+#define EL_BD_STONEFLY_LEFT                    1366
+#define EL_BD_STONEFLY_DOWN                    1367
+#define EL_BD_BITER                            1368
+#define EL_BD_BITER_RIGHT                      1369
+#define EL_BD_BITER_UP                         1370
+#define EL_BD_BITER_LEFT                       1371
+#define EL_BD_BITER_DOWN                       1372
+#define EL_BD_DRAGONFLY                                1373
+#define EL_BD_DRAGONFLY_RIGHT                  1374
+#define EL_BD_DRAGONFLY_UP                     1375
+#define EL_BD_DRAGONFLY_LEFT                   1376
+#define EL_BD_DRAGONFLY_DOWN                   1377
+#define EL_BD_BOMB                             1378
+#define EL_BD_NITRO_PACK                       1379
+#define EL_BD_PLAYER_WITH_BOMB                 1380
+#define EL_BD_PLAYER_GLUED                     1381
+#define EL_BD_PLAYER_STIRRING                  1382
+#define EL_BD_FAKE_BONUS                       1383
+#define EL_BD_COVERED                          1384
+
+#define NUM_FILE_ELEMENTS                      1385
 
 
 // "real" (and therefore drawable) runtime elements
 
 #define EL_INTERNAL_CASCADE_BD                 (EL_FIRST_INTERNAL + 4)
 #define EL_INTERNAL_CASCADE_BD_ACTIVE          (EL_FIRST_INTERNAL + 5)
-#define EL_INTERNAL_CASCADE_EM                 (EL_FIRST_INTERNAL + 6)
-#define EL_INTERNAL_CASCADE_EM_ACTIVE          (EL_FIRST_INTERNAL + 7)
-#define EL_INTERNAL_CASCADE_EMC                        (EL_FIRST_INTERNAL + 8)
-#define EL_INTERNAL_CASCADE_EMC_ACTIVE         (EL_FIRST_INTERNAL + 9)
-#define EL_INTERNAL_CASCADE_RND                        (EL_FIRST_INTERNAL + 10)
-#define EL_INTERNAL_CASCADE_RND_ACTIVE         (EL_FIRST_INTERNAL + 11)
-#define EL_INTERNAL_CASCADE_SB                 (EL_FIRST_INTERNAL + 12)
-#define EL_INTERNAL_CASCADE_SB_ACTIVE          (EL_FIRST_INTERNAL + 13)
-#define EL_INTERNAL_CASCADE_SP                 (EL_FIRST_INTERNAL + 14)
-#define EL_INTERNAL_CASCADE_SP_ACTIVE          (EL_FIRST_INTERNAL + 15)
-#define EL_INTERNAL_CASCADE_DC                 (EL_FIRST_INTERNAL + 16)
-#define EL_INTERNAL_CASCADE_DC_ACTIVE          (EL_FIRST_INTERNAL + 17)
-#define EL_INTERNAL_CASCADE_DX                 (EL_FIRST_INTERNAL + 18)
-#define EL_INTERNAL_CASCADE_DX_ACTIVE          (EL_FIRST_INTERNAL + 19)
-#define EL_INTERNAL_CASCADE_MM                 (EL_FIRST_INTERNAL + 20)
-#define EL_INTERNAL_CASCADE_MM_ACTIVE          (EL_FIRST_INTERNAL + 21)
-#define EL_INTERNAL_CASCADE_DF                 (EL_FIRST_INTERNAL + 22)
-#define EL_INTERNAL_CASCADE_DF_ACTIVE          (EL_FIRST_INTERNAL + 23)
-#define EL_INTERNAL_CASCADE_CHARS              (EL_FIRST_INTERNAL + 24)
-#define EL_INTERNAL_CASCADE_CHARS_ACTIVE       (EL_FIRST_INTERNAL + 25)
-#define EL_INTERNAL_CASCADE_STEEL_CHARS                (EL_FIRST_INTERNAL + 26)
-#define EL_INTERNAL_CASCADE_STEEL_CHARS_ACTIVE (EL_FIRST_INTERNAL + 27)
-#define EL_INTERNAL_CASCADE_CE                 (EL_FIRST_INTERNAL + 28)
-#define EL_INTERNAL_CASCADE_CE_ACTIVE          (EL_FIRST_INTERNAL + 29)
-#define EL_INTERNAL_CASCADE_GE                 (EL_FIRST_INTERNAL + 30)
-#define EL_INTERNAL_CASCADE_GE_ACTIVE          (EL_FIRST_INTERNAL + 31)
-#define EL_INTERNAL_CASCADE_ES                 (EL_FIRST_INTERNAL + 32)
-#define EL_INTERNAL_CASCADE_ES_ACTIVE          (EL_FIRST_INTERNAL + 33)
-#define EL_INTERNAL_CASCADE_REF                        (EL_FIRST_INTERNAL + 34)
-#define EL_INTERNAL_CASCADE_REF_ACTIVE         (EL_FIRST_INTERNAL + 35)
-#define EL_INTERNAL_CASCADE_USER               (EL_FIRST_INTERNAL + 36)
-#define EL_INTERNAL_CASCADE_USER_ACTIVE                (EL_FIRST_INTERNAL + 37)
-#define EL_INTERNAL_CASCADE_DYNAMIC            (EL_FIRST_INTERNAL + 38)
-#define EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE     (EL_FIRST_INTERNAL + 39)
+#define EL_INTERNAL_CASCADE_BD_NATIVE          (EL_FIRST_INTERNAL + 6)
+#define EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE   (EL_FIRST_INTERNAL + 7)
+#define EL_INTERNAL_CASCADE_EM                 (EL_FIRST_INTERNAL + 8)
+#define EL_INTERNAL_CASCADE_EM_ACTIVE          (EL_FIRST_INTERNAL + 9)
+#define EL_INTERNAL_CASCADE_EMC                        (EL_FIRST_INTERNAL + 10)
+#define EL_INTERNAL_CASCADE_EMC_ACTIVE         (EL_FIRST_INTERNAL + 11)
+#define EL_INTERNAL_CASCADE_RND                        (EL_FIRST_INTERNAL + 12)
+#define EL_INTERNAL_CASCADE_RND_ACTIVE         (EL_FIRST_INTERNAL + 13)
+#define EL_INTERNAL_CASCADE_SB                 (EL_FIRST_INTERNAL + 14)
+#define EL_INTERNAL_CASCADE_SB_ACTIVE          (EL_FIRST_INTERNAL + 15)
+#define EL_INTERNAL_CASCADE_SP                 (EL_FIRST_INTERNAL + 16)
+#define EL_INTERNAL_CASCADE_SP_ACTIVE          (EL_FIRST_INTERNAL + 17)
+#define EL_INTERNAL_CASCADE_DC                 (EL_FIRST_INTERNAL + 18)
+#define EL_INTERNAL_CASCADE_DC_ACTIVE          (EL_FIRST_INTERNAL + 19)
+#define EL_INTERNAL_CASCADE_DX                 (EL_FIRST_INTERNAL + 20)
+#define EL_INTERNAL_CASCADE_DX_ACTIVE          (EL_FIRST_INTERNAL + 21)
+#define EL_INTERNAL_CASCADE_MM                 (EL_FIRST_INTERNAL + 22)
+#define EL_INTERNAL_CASCADE_MM_ACTIVE          (EL_FIRST_INTERNAL + 23)
+#define EL_INTERNAL_CASCADE_DF                 (EL_FIRST_INTERNAL + 24)
+#define EL_INTERNAL_CASCADE_DF_ACTIVE          (EL_FIRST_INTERNAL + 25)
+#define EL_INTERNAL_CASCADE_CHARS              (EL_FIRST_INTERNAL + 26)
+#define EL_INTERNAL_CASCADE_CHARS_ACTIVE       (EL_FIRST_INTERNAL + 27)
+#define EL_INTERNAL_CASCADE_STEEL_CHARS                (EL_FIRST_INTERNAL + 28)
+#define EL_INTERNAL_CASCADE_STEEL_CHARS_ACTIVE (EL_FIRST_INTERNAL + 29)
+#define EL_INTERNAL_CASCADE_CE                 (EL_FIRST_INTERNAL + 30)
+#define EL_INTERNAL_CASCADE_CE_ACTIVE          (EL_FIRST_INTERNAL + 31)
+#define EL_INTERNAL_CASCADE_GE                 (EL_FIRST_INTERNAL + 32)
+#define EL_INTERNAL_CASCADE_GE_ACTIVE          (EL_FIRST_INTERNAL + 33)
+#define EL_INTERNAL_CASCADE_ES                 (EL_FIRST_INTERNAL + 34)
+#define EL_INTERNAL_CASCADE_ES_ACTIVE          (EL_FIRST_INTERNAL + 35)
+#define EL_INTERNAL_CASCADE_REF                        (EL_FIRST_INTERNAL + 36)
+#define EL_INTERNAL_CASCADE_REF_ACTIVE         (EL_FIRST_INTERNAL + 37)
+#define EL_INTERNAL_CASCADE_USER               (EL_FIRST_INTERNAL + 38)
+#define EL_INTERNAL_CASCADE_USER_ACTIVE                (EL_FIRST_INTERNAL + 39)
+#define EL_INTERNAL_CASCADE_DYNAMIC            (EL_FIRST_INTERNAL + 40)
+#define EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE     (EL_FIRST_INTERNAL + 41)
 
 #define EL_INTERNAL_CLIPBOARD_START    (EL_FIRST_INTERNAL + 0)
 #define EL_INTERNAL_CLIPBOARD_END      (EL_FIRST_INTERNAL + 2)
 #define EL_INTERNAL_START              (EL_FIRST_INTERNAL + 0)
-#define EL_INTERNAL_END                        (EL_FIRST_INTERNAL + 39)
+#define EL_INTERNAL_END                        (EL_FIRST_INTERNAL + 41)
 
-#define MAX_NUM_ELEMENTS               (EL_FIRST_INTERNAL + 40)
+#define MAX_NUM_ELEMENTS               (EL_FIRST_INTERNAL + 42)
 
 
 // values for graphics/sounds action types
@@ -2477,6 +2645,7 @@ enum
   GFX_ARG_SORT_PRIORITY,
   GFX_ARG_CLASS,
   GFX_ARG_STYLE,
+  GFX_ARG_ALPHA,
   GFX_ARG_ACTIVE_XOFFSET,
   GFX_ARG_ACTIVE_YOFFSET,
   GFX_ARG_PRESSED_XOFFSET,
@@ -2532,6 +2701,7 @@ enum
   FONT_ENVELOPE_2,
   FONT_ENVELOPE_3,
   FONT_ENVELOPE_4,
+  FONT_REQUEST_NARROW,
   FONT_REQUEST,
   FONT_INPUT_1_ACTIVE,
   FONT_INPUT_2_ACTIVE,
@@ -2641,15 +2811,15 @@ enum
 // program information and versioning definitions
 #define PROGRAM_VERSION_SUPER          4
 #define PROGRAM_VERSION_MAJOR          3
-#define PROGRAM_VERSION_MINOR          5
-#define PROGRAM_VERSION_PATCH          5
+#define PROGRAM_VERSION_MINOR          8
+#define PROGRAM_VERSION_PATCH          2
 #define PROGRAM_VERSION_EXTRA          ""
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
 #define PROGRAM_EMAIL_STRING           "info@artsoft.org"
 #define PROGRAM_WEBSITE_STRING         "https://www.artsoft.org/"
-#define PROGRAM_COPYRIGHT_STRING       "1995-2023 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING       "1995-2024 by Holger Schemel"
 #define PROGRAM_COMPANY_STRING         "A Game by Artsoft Entertainment"
 
 #define PROGRAM_ICON_FILENAME          "icons/icon.png"
@@ -2709,11 +2879,12 @@ enum
 // values for game engine type identifier
 #define GAME_ENGINE_TYPE_UNKNOWN       LEVEL_FILE_TYPE_UNKNOWN
 #define GAME_ENGINE_TYPE_RND           LEVEL_FILE_TYPE_RND
+#define GAME_ENGINE_TYPE_BD            LEVEL_FILE_TYPE_BD
 #define GAME_ENGINE_TYPE_EM            LEVEL_FILE_TYPE_EM
 #define GAME_ENGINE_TYPE_SP            LEVEL_FILE_TYPE_SP
 #define GAME_ENGINE_TYPE_MM            LEVEL_FILE_TYPE_MM
 
-#define NUM_ENGINE_TYPES               4
+#define NUM_ENGINE_TYPES               5
 
 // values for automatically playing tapes
 #define AUTOPLAY_NONE                  0
@@ -3215,6 +3386,7 @@ struct LevelInfo
   int game_engine_type;
 
   // level stored in native format for the alternative native game engines
+  struct LevelInfo_BD *native_bd_level;
   struct LevelInfo_EM *native_em_level;
   struct LevelInfo_SP *native_sp_level;
   struct LevelInfo_MM *native_mm_level;
@@ -3457,6 +3629,8 @@ struct ElementChangeInfo
   void (*post_change_function)(int x, int y);
 
   short actual_trigger_element;        // element that actually triggered change
+  int actual_trigger_x;                // element x position that triggered change
+  int actual_trigger_y;                // element y position that triggered change
   int actual_trigger_side;     // element side that triggered the change
   int actual_trigger_player;   // player which actually triggered change
   int actual_trigger_player_bits; // player bits of triggering players
@@ -3571,6 +3745,8 @@ struct ElementInfo
 
   struct ElementGroupInfo *group;      // pointer to element group info
 
+  boolean has_anim_event;      // element can trigger global animation
+
   // ---------- internal values used at runtime when playing ----------
 
   boolean has_change_event[NUM_CHANGE_EVENTS];
@@ -3719,6 +3895,7 @@ struct GraphicInfo
 
   int class;
   int style;
+  int alpha;
 
   int active_xoffset;
   int active_yoffset;
@@ -3759,11 +3936,13 @@ struct MusicFileInfo
   char *artist_header;
   char *album_header;
   char *year_header;
+  char *played_header;
 
   char *title;
   char *artist;
   char *album;
   char *year;
+  char *played;
 
   int music;
 
@@ -3892,7 +4071,8 @@ extern int                        BX2, BY2;
 extern int                     SBX_Left, SBX_Right;
 extern int                     SBY_Upper, SBY_Lower;
 
-extern int                     TimeFrames, TimePlayed, TimeLeft, TapeTime;
+extern int                     TimeFrames, TimePlayed, TimeLeft;
+extern int                     TapeTimeFrames, TapeTime;
 
 extern boolean                 network_player_action_received;
 
@@ -3939,6 +4119,7 @@ extern struct ElementActionInfo   element_action_info[];
 extern struct ElementDirectionInfo element_direction_info[];
 extern struct SpecialSuffixInfo special_suffix_info[];
 extern struct TokenIntPtrInfo  image_config_vars[];
+extern struct TokenIntPtrInfo  sound_config_vars[];
 extern struct FontInfo         font_info[];
 extern struct GlobalAnimInfo   global_anim_info[];
 extern struct GlobalAnimNameInfo global_anim_name_info[];
@@ -3951,6 +4132,7 @@ extern struct MusicFileInfo    *music_file_info;
 extern struct HelpAnimInfo     *helpanim_info;
 extern SetupFileHash           *helptext_info;
 extern SetupFileHash          *image_config_hash;
+extern SetupFileHash          *sound_config_hash;
 extern SetupFileHash          *element_token_hash;
 extern SetupFileHash          *graphic_token_hash;
 extern SetupFileHash          *font_token_hash;