#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 EP_BITMASK_BASE_DEFAULT (1 << EP_CAN_MOVE_INTO_ACID)
#define EP_BITMASK_DEFAULT 0
-#define PROPERTY_BIT(p) (1 << ((p) % 32))
-#define PROPERTY_VAR(e,p) (element_info[e].properties[(p) / 32])
-#define HAS_PROPERTY(e,p) ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
-#define SET_PROPERTY(e,p,v) ((v) ? \
+#define PROPERTY_BIT(p) (1u << ((p) % 32))
+#define PROPERTY_VAR(e, p) (element_info[e].properties[(p) / 32])
+#define HAS_PROPERTY(e, p) ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
+#define SET_PROPERTY(e, p, v) ((v) ? \
(PROPERTY_VAR(e,p) |= PROPERTY_BIT(p)) : \
(PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p)))
#define CH_EVENT_BITFIELD_NR(e) (e / 32)
#define CH_EVENT_BIT(e) (1 << ((e) % 32))
-#define CH_EVENT_VAR(e,c) (element_info[e].change->has_event[c])
-#define CH_ANY_EVENT_VAR(e,c) (element_info[e].has_change_event[c])
+#define CH_EVENT_VAR(e, c) (element_info[e].change->has_event[c])
+#define CH_ANY_EVENT_VAR(e, c) (element_info[e].has_change_event[c])
-#define PAGE_HAS_CHANGE_EVENT(p,c) ((p)->has_event[c])
-#define HAS_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \
- CH_EVENT_VAR(e,c))
-#define HAS_ANY_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \
- CH_ANY_EVENT_VAR(e,c))
+#define PAGE_HAS_CHANGE_EVENT(p, c) ((p)->has_event[c])
+#define HAS_CHANGE_EVENT(e, c) (IS_CUSTOM_ELEMENT(e) && \
+ CH_EVENT_VAR(e, c))
+#define HAS_ANY_CHANGE_EVENT(e, c) (IS_CUSTOM_ELEMENT(e) && \
+ CH_ANY_EVENT_VAR(e, c))
-#define SET_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \
- CH_EVENT_VAR(e,c) = (v) : 0)
-#define SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \
- CH_ANY_EVENT_VAR(e,c) = (v) : 0)
+#define SET_CHANGE_EVENT(e, c, v) (IS_CUSTOM_ELEMENT(e) ? \
+ CH_EVENT_VAR(e, c) = (v) : 0)
+#define SET_ANY_CHANGE_EVENT(e, c, v) (IS_CUSTOM_ELEMENT(e) ? \
+ CH_ANY_EVENT_VAR(e, c) = (v) : 0)
// values for player bitmasks
#define PLAYER_BITS_NONE 0
#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 IS_ENVELOPE(e) ((e) >= EL_ENVELOPE_1 && \
(e) <= EL_ENVELOPE_4)
+#define IS_MM_ENVELOPE(e) ((e) >= EL_MM_ENVELOPE_1 && \
+ (e) <= EL_MM_ENVELOPE_4)
+
#define IS_BALLOON_ELEMENT(e) ((e) == EL_BALLOON || \
(e) == EL_BALLOON_SWITCH_LEFT || \
(e) == EL_BALLOON_SWITCH_RIGHT || \
IS_EM_GATE_GRAY(e) ? EM_GATE_GRAY_NR(e) : \
IS_EMC_GATE_GRAY(e) ? EMC_GATE_GRAY_NR(e) : 0)
+#define RND_ENVELOPE_NR(e) ((e) - EL_ENVELOPE_1)
+#define MM_ENVELOPE_NR(e) ((e) - EL_MM_ENVELOPE_1)
+#define ENVELOPE_NR(e) (IS_ENVELOPE(e) ? RND_ENVELOPE_NR(e) : \
+ MM_ENVELOPE_NR(e))
+
#define IS_ACID_POOL_OR_ACID(e) (IS_ACID_POOL(e) || (e) == EL_ACID)
#define IS_EMC_PILLAR(e) ((e) >= EL_EMC_WALL_1 && \
#define IS_FREE(x, y) (Tile[x][y] == EL_EMPTY && !IS_PLAYER(x, y))
#define IS_FREE_OR_PLAYER(x, y) (Tile[x][y] == EL_EMPTY)
-#define IS_MOVING(x,y) (MovPos[x][y] != 0)
-#define IS_FALLING(x,y) (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN)
-#define IS_BLOCKED(x,y) (Tile[x][y] == EL_BLOCKED)
+#define IS_MOVING(x, y) (MovPos[x][y] != 0)
+#define IS_FALLING(x, y) (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN)
+#define IS_BLOCKED(x, y) (Tile[x][y] == EL_BLOCKED)
#define IS_MV_DIAGONAL(x) ((x) & MV_HORIZONTAL && (x) & MV_VERTICAL)
#define TAPE_IS_EMPTY(x) ((x).length == 0)
#define TAPE_IS_STOPPED(x) (!(x).recording && !(x).playing)
-#define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER_1])
+#define PLAYERINFO(x, y) (&stored_player[StorePlayer[x][y] - EL_PLAYER_1])
#define SHIELD_ON(p) ((p)->shield_normal_time_left > 0)
-#define ENEMY_PROTECTED_FIELD(x,y) (IS_PROTECTED(Tile[x][y]) || \
+#define ENEMY_PROTECTED_FIELD(x, y) (IS_PROTECTED(Tile[x][y]) || \
IS_PROTECTED(Back[x][y]))
-#define EXPLOSION_PROTECTED_FIELD(x,y) (IS_EXPLOSION_PROOF(Tile[x][y]))
-#define PLAYER_ENEMY_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
+#define EXPLOSION_PROTECTED_FIELD(x, y) (IS_EXPLOSION_PROOF(Tile[x][y]))
+#define PLAYER_ENEMY_PROTECTED(x, y) (SHIELD_ON(PLAYERINFO(x, y)) || \
ENEMY_PROTECTED_FIELD(x, y))
#define PLAYER_EXPLOSION_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
EXPLOSION_PROTECTED_FIELD(x, y))
#define PLAYER_DROPPING(p,x,y) ((p)->is_dropping && \
(p)->drop_x == (x) && (p)->drop_y == (y))
-#define PLAYER_NR_GFX(g,i) ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
+#define PLAYER_NR_GFX(g, i) ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
#define GET_PLAYER_ELEMENT(e) ((e) >= EL_PLAYER_1 && (e) <= EL_PLAYER_4 ? \
(e) : EL_PLAYER_1)
#define STD_ELEMENT_CONTENTS 4
#define MAX_ELEMENT_CONTENTS 8
+#define MIN_MM_BALL_CONTENTS 1
+#define STD_MM_BALL_CONTENTS 8
+#define MAX_MM_BALL_CONTENTS 16
+
// values for initial player inventory
#define MIN_INITIAL_INVENTORY_SIZE 1
#define MAX_INITIAL_INVENTORY_SIZE 8
#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_WOODEN_GRID_FIXED_4 (EL_MM_WOODEN_GRID_FIXED_START + 3)
#define EL_MM_WOODEN_GRID_FIXED_END EL_MM_WOODEN_GRID_FIXED_03
#define EL_MM_FUEL_EMPTY (EL_MM_START + 155)
-
-#define EL_MM_UNUSED_156 (EL_MM_START + 156)
-#define EL_MM_UNUSED_157 (EL_MM_START + 157)
-#define EL_MM_UNUSED_158 (EL_MM_START + 158)
-#define EL_MM_UNUSED_159 (EL_MM_START + 159)
+#define EL_MM_ENVELOPE_1 (EL_MM_START + 156)
+#define EL_MM_ENVELOPE_2 (EL_MM_START + 157)
+#define EL_MM_ENVELOPE_3 (EL_MM_START + 158)
+#define EL_MM_ENVELOPE_4 (EL_MM_START + 159)
#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
#define EL_EMPTY_SPACE_END 1232
// ---------- end of empty space elements section -----------------------------
-#define NUM_FILE_ELEMENTS 1233
+#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_3 (EL_DF_MIRROR_FIXED_START + 2)
+#define EL_DF_MIRROR_FIXED_4 (EL_DF_MIRROR_FIXED_START + 3)
+#define EL_DF_MIRROR_FIXED_5 (EL_DF_MIRROR_FIXED_START + 4)
+#define EL_DF_MIRROR_FIXED_6 (EL_DF_MIRROR_FIXED_START + 5)
+#define EL_DF_MIRROR_FIXED_7 (EL_DF_MIRROR_FIXED_START + 6)
+#define EL_DF_MIRROR_FIXED_8 (EL_DF_MIRROR_FIXED_START + 7)
+#define EL_DF_MIRROR_FIXED_9 (EL_DF_MIRROR_FIXED_START + 8)
+#define EL_DF_MIRROR_FIXED_10 (EL_DF_MIRROR_FIXED_START + 9)
+#define EL_DF_MIRROR_FIXED_11 (EL_DF_MIRROR_FIXED_START + 10)
+#define EL_DF_MIRROR_FIXED_12 (EL_DF_MIRROR_FIXED_START + 11)
+#define EL_DF_MIRROR_FIXED_13 (EL_DF_MIRROR_FIXED_START + 12)
+#define EL_DF_MIRROR_FIXED_14 (EL_DF_MIRROR_FIXED_START + 13)
+#define EL_DF_MIRROR_FIXED_15 (EL_DF_MIRROR_FIXED_START + 14)
+#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_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_EMC_SPRING_BUMPER_ACTIVE (EL_FIRST_RUNTIME_REAL + 71)
#define EL_MM_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 72)
#define EL_MM_EXIT_CLOSING (EL_FIRST_RUNTIME_REAL + 73)
-#define EL_MM_GRAY_BALL_OPENING (EL_FIRST_RUNTIME_REAL + 74)
-#define EL_MM_ICE_WALL_SHRINKING (EL_FIRST_RUNTIME_REAL + 75)
-#define EL_MM_AMOEBA_WALL_GROWING (EL_FIRST_RUNTIME_REAL + 76)
-#define EL_MM_PACMAN_EATING_RIGHT (EL_FIRST_RUNTIME_REAL + 77)
-#define EL_MM_PACMAN_EATING_UP (EL_FIRST_RUNTIME_REAL + 78)
-#define EL_MM_PACMAN_EATING_LEFT (EL_FIRST_RUNTIME_REAL + 79)
-#define EL_MM_PACMAN_EATING_DOWN (EL_FIRST_RUNTIME_REAL + 80)
-
-#define NUM_DRAWABLE_ELEMENTS (EL_FIRST_RUNTIME_REAL + 81)
+#define EL_MM_GRAY_BALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 74)
+#define EL_MM_GRAY_BALL_OPENING (EL_FIRST_RUNTIME_REAL + 75)
+#define EL_MM_ICE_WALL_SHRINKING (EL_FIRST_RUNTIME_REAL + 76)
+#define EL_MM_AMOEBA_WALL_GROWING (EL_FIRST_RUNTIME_REAL + 77)
+#define EL_MM_PACMAN_EATING_RIGHT (EL_FIRST_RUNTIME_REAL + 78)
+#define EL_MM_PACMAN_EATING_UP (EL_FIRST_RUNTIME_REAL + 79)
+#define EL_MM_PACMAN_EATING_LEFT (EL_FIRST_RUNTIME_REAL + 80)
+#define EL_MM_PACMAN_EATING_DOWN (EL_FIRST_RUNTIME_REAL + 81)
+#define EL_MM_BOMB_ACTIVE (EL_FIRST_RUNTIME_REAL + 82)
+#define EL_DF_MINE_ACTIVE (EL_FIRST_RUNTIME_REAL + 83)
+
+#define NUM_DRAWABLE_ELEMENTS (EL_FIRST_RUNTIME_REAL + 84)
#define EL_MM_RUNTIME_START EL_MM_EXIT_OPENING
#define EL_MM_RUNTIME_END EL_MM_AMOEBA_WALL_GROWING
#define EL_MM_LIGHTBALL_RED (EL_FIRST_DUMMY + 21)
#define EL_MM_LIGHTBALL_BLUE (EL_FIRST_DUMMY + 22)
#define EL_MM_LIGHTBALL_YELLOW (EL_FIRST_DUMMY + 23)
-#define EL_MM_MASK_MCDUFFIN_RIGHT (EL_FIRST_DUMMY + 24)
-#define EL_MM_MASK_MCDUFFIN_UP (EL_FIRST_DUMMY + 25)
-#define EL_MM_MASK_MCDUFFIN_LEFT (EL_FIRST_DUMMY + 26)
-#define EL_MM_MASK_MCDUFFIN_DOWN (EL_FIRST_DUMMY + 27)
-#define EL_MM_MASK_GRID_1 (EL_FIRST_DUMMY + 28)
-#define EL_MM_MASK_GRID_2 (EL_FIRST_DUMMY + 29)
-#define EL_MM_MASK_GRID_3 (EL_FIRST_DUMMY + 30)
-#define EL_MM_MASK_GRID_4 (EL_FIRST_DUMMY + 31)
-#define EL_MM_MASK_RECTANGLE (EL_FIRST_DUMMY + 32)
-#define EL_MM_MASK_CIRCLE (EL_FIRST_DUMMY + 33)
-#define EL_DEFAULT (EL_FIRST_DUMMY + 34)
-#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 35)
-#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 36)
-#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 37)
-#define EL_MM_DEFAULT (EL_FIRST_DUMMY + 38)
-#define EL_GRAPHIC_1 (EL_FIRST_DUMMY + 39)
-#define EL_GRAPHIC_2 (EL_FIRST_DUMMY + 40)
-#define EL_GRAPHIC_3 (EL_FIRST_DUMMY + 41)
-#define EL_GRAPHIC_4 (EL_FIRST_DUMMY + 42)
-#define EL_GRAPHIC_5 (EL_FIRST_DUMMY + 43)
-#define EL_GRAPHIC_6 (EL_FIRST_DUMMY + 44)
-#define EL_GRAPHIC_7 (EL_FIRST_DUMMY + 45)
-#define EL_GRAPHIC_8 (EL_FIRST_DUMMY + 46)
-
-#define EL_MM_DUMMY_START EL_MM_MASK_MCDUFFIN_RIGHT
-#define EL_MM_DUMMY_END EL_MM_MASK_CIRCLE
+#define EL_DEFAULT (EL_FIRST_DUMMY + 24)
+#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 25)
+#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 26)
+#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 27)
+#define EL_MM_DEFAULT (EL_FIRST_DUMMY + 28)
+#define EL_GRAPHIC_1 (EL_FIRST_DUMMY + 29)
+#define EL_GRAPHIC_2 (EL_FIRST_DUMMY + 30)
+#define EL_GRAPHIC_3 (EL_FIRST_DUMMY + 31)
+#define EL_GRAPHIC_4 (EL_FIRST_DUMMY + 32)
+#define EL_GRAPHIC_5 (EL_FIRST_DUMMY + 33)
+#define EL_GRAPHIC_6 (EL_FIRST_DUMMY + 34)
+#define EL_GRAPHIC_7 (EL_FIRST_DUMMY + 35)
+#define EL_GRAPHIC_8 (EL_FIRST_DUMMY + 36)
// internal elements (only used for internal purposes like copying)
-#define EL_FIRST_INTERNAL (EL_FIRST_DUMMY + 47)
+#define EL_FIRST_INTERNAL (EL_FIRST_DUMMY + 37)
#define EL_INTERNAL_CLIPBOARD_CUSTOM (EL_FIRST_INTERNAL + 0)
#define EL_INTERNAL_CLIPBOARD_CHANGE (EL_FIRST_INTERNAL + 1)
#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
GFX_SPECIAL_ARG_SCORESNEW,
GFX_SPECIAL_ARG_NO_TITLE,
GFX_SPECIAL_ARG_FADING,
+ GFX_SPECIAL_ARG_RESTARTING,
GFX_SPECIAL_ARG_QUIT,
NUM_SPECIAL_GFX_ARGS
GFX_ARG_DELAY,
GFX_ARG_ANIM_MODE,
GFX_ARG_GLOBAL_SYNC,
+ GFX_ARG_GLOBAL_ANIM_SYNC,
GFX_ARG_CRUMBLED_LIKE,
GFX_ARG_DIGGABLE_LIKE,
GFX_ARG_BORDER_SIZE,
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,
GFX_ARG_PRESSED_YOFFSET,
+ GFX_ARG_STACKED_XFACTOR,
+ GFX_ARG_STACKED_YFACTOR,
+ GFX_ARG_STACKED_XOFFSET,
+ GFX_ARG_STACKED_YOFFSET,
NUM_GFX_ARGS
};
FONT_ENVELOPE_2,
FONT_ENVELOPE_3,
FONT_ENVELOPE_4,
+ FONT_REQUEST_NARROW,
FONT_REQUEST,
FONT_INPUT_1_ACTIVE,
FONT_INPUT_2_ACTIVE,
#define GAME_MODE_PSEUDO_SCORESNEW GFX_SPECIAL_ARG_SCORESNEW
#define GAME_MODE_PSEUDO_NO_TITLE GFX_SPECIAL_ARG_NO_TITLE
#define GAME_MODE_PSEUDO_FADING GFX_SPECIAL_ARG_FADING
+#define GAME_MODE_PSEUDO_RESTARTING GFX_SPECIAL_ARG_RESTARTING
#define GAME_MODE_QUIT GFX_SPECIAL_ARG_QUIT
#define NUM_GAME_MODES NUM_SPECIAL_GFX_ARGS
// program information and versioning definitions
#define PROGRAM_VERSION_SUPER 4
#define PROGRAM_VERSION_MAJOR 3
-#define PROGRAM_VERSION_MINOR 2
-#define PROGRAM_VERSION_PATCH 0
+#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 "Copyright \xa9""1995-2022 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 "RocksIcon32x32.png"
+#define PROGRAM_ICON_FILENAME "icons/icon.png"
#define COOKIE_PREFIX "ROCKSNDIAMONDS"
// 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
struct MenuPosInfo insert_solution;
struct MenuPosInfo play_solution;
+ struct MenuPosInfo levelset_info;
struct MenuPosInfo switch_ecs_aga;
};
{
struct MenuPosInfo busy_initial;
struct MenuPosInfo busy;
+ struct MenuPosInfo busy_playfield;
};
struct MenuInfo
int list_size[NUM_SPECIAL_GFX_ARGS];
int list_size_info[NUM_SPECIAL_GFX_INFO_ARGS];
+ int list_entry_size_info[NUM_SPECIAL_GFX_INFO_ARGS];
+ int tile_size_info[NUM_SPECIAL_GFX_INFO_ARGS];
int left_spacing[NUM_SPECIAL_GFX_ARGS];
int left_spacing_info[NUM_SPECIAL_GFX_INFO_ARGS];
int left_spacing_setup[NUM_SPECIAL_GFX_SETUP_ARGS];
+ int middle_spacing_info[NUM_SPECIAL_GFX_INFO_ARGS];
int right_spacing[NUM_SPECIAL_GFX_ARGS];
int right_spacing_info[NUM_SPECIAL_GFX_INFO_ARGS];
int right_spacing_setup[NUM_SPECIAL_GFX_SETUP_ARGS];
int last_added_local;
int last_level_nr;
int last_entry_nr;
+ int next_level_nr;
boolean updated;
boolean uploaded;
boolean tape_downloaded;
boolean force_last_added;
+ boolean continue_playing;
+ boolean continue_on_return;
struct ScoreEntry entry[MAX_SCORE_ENTRIES];
};
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;
int mm_time_ball;
int mm_time_block;
+ int num_mm_ball_contents;
+ int mm_ball_choice_mode;
+ int mm_ball_content[MAX_MM_BALL_CONTENTS];
+ boolean rotate_mm_ball_content;
+ boolean explode_mm_ball;
+
// ('int' instead of 'boolean' because used as selectbox value in editor)
int use_step_counter; // count steps instead of seconds for level
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
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];
int anim_mode;
boolean anim_global_sync;
+ boolean anim_global_anim_sync;
int crumbled_like; // element for cloning crumble graphics
int diggable_like; // element for cloning digging graphics
int class;
int style;
+ int alpha;
int active_xoffset;
int active_yoffset;
int pressed_xoffset;
int pressed_yoffset;
+ int stacked_xfactor;
+ int stacked_yfactor;
+ int stacked_xoffset;
+ int stacked_yoffset;
+
boolean use_image_size; // use image size as default width and height
};
char *artist_header;
char *album_header;
char *year_header;
+ char *played_header;
char *title;
char *artist;
char *album;
char *year;
+ char *played;
int music;
extern Bitmap *bitmap_db_field;
-extern Bitmap *bitmap_db_panel;
extern Bitmap *bitmap_db_door_1;
extern Bitmap *bitmap_db_door_2;
extern Bitmap *bitmap_db_store_1;
extern int game_status;
extern int game_status_last_screen;
extern boolean level_editor_test_game;
+extern boolean score_info_tape_play;
extern boolean network_playing;
extern int key_joystick_mapping;
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;
extern SetupFileHash *hide_setup_hash;
+extern SetupFileHash *anim_url_hash;
extern struct ConfigTypeInfo image_config_suffix[];
extern struct ConfigTypeInfo sound_config_suffix[];
extern struct ConfigTypeInfo music_config_suffix[];