#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 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_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_MM_END_2 (EL_DF_START2 + 430)
+// EMC style elements
#define EL_SPRING_LEFT 1215
#define EL_SPRING_RIGHT 1216
#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_MM_END_3 EL_DF_SLOPE_END
#define EL_DF_END_2 EL_DF_SLOPE_END
-#define NUM_FILE_ELEMENTS 1253
+// 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
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;
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[];
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;