#define CP_HALF_DESTRUCTIVE 1
#define CP_FULL_DESTRUCTIVE 2
+/* values for special move patterns (bits 0-3: basic move directions) */
+#define MV_BIT_TOWARDS_PLAYER 4
+#define MV_BIT_AWAY_FROM_PLAYER 5
+#define MV_BIT_ALONG_LEFT_SIDE 6
+#define MV_BIT_ALONG_RIGHT_SIDE 7
+#define MV_BIT_TURNING_LEFT 8
+#define MV_BIT_TURNING_RIGHT 9
+
+/* values for special move patterns for custom elements */
+#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT)
+#define MV_VERTICAL (MV_UP | MV_DOWN)
+#define MV_ALL_DIRECTIONS (MV_HORIZONTAL | MV_VERTICAL)
+#define MV_ANY_DIRECTION (MV_ALL_DIRECTIONS)
+#define MV_TOWARDS_PLAYER (1 << MV_BIT_TOWARDS_PLAYER)
+#define MV_AWAY_FROM_PLAYER (1 << MV_BIT_AWAY_FROM_PLAYER)
+#define MV_ALONG_LEFT_SIDE (1 << MV_BIT_ALONG_LEFT_SIDE)
+#define MV_ALONG_RIGHT_SIDE (1 << MV_BIT_ALONG_RIGHT_SIDE)
+#define MV_TURNING_LEFT (1 << MV_BIT_TURNING_LEFT)
+#define MV_TURNING_RIGHT (1 << MV_BIT_TURNING_RIGHT)
+
+/* values for slippery property for custom elements */
+#define SLIPPERY_ANY_RANDOM 0
+#define SLIPPERY_ANY_LEFT_RIGHT 1
+#define SLIPPERY_ANY_RIGHT_LEFT 2
+#define SLIPPERY_ONLY_LEFT 3
+#define SLIPPERY_ONLY_RIGHT 4
/* macros for configurable properties */
#define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE)
#define EL_EMPTY EL_EMPTY_SPACE
#define EL_SAND 1
#define EL_WALL 2
-#define EL_WALL_CRUMBLED 3
+#define EL_WALL_SLIPPERY 3
#define EL_ROCK 4
#define EL_KEY_OBSOLETE 5 /* obsolete; mapped to EL_KEY_1 */
#define EL_EMERALD 6
#define EL_MOLE_RIGHT 312
#define EL_MOLE_UP 313
#define EL_MOLE_DOWN 314
-#define EL_STEELWALL_SLANTED 315
+#define EL_STEELWALL_SLIPPERY 315
#define EL_INVISIBLE_SAND 316
#define EL_DX_UNKNOWN_15 317
#define EL_DX_UNKNOWN_42 318
#define EL_INVISIBLE_STEELWALL_BOTTOMRIGHT (EL_FIRST_DUMMY + 9)
#define EL_INVISIBLE_STEELWALL_HORIZONTAL (EL_FIRST_DUMMY + 10)
#define EL_INVISIBLE_STEELWALL_VERTICAL (EL_FIRST_DUMMY + 11)
-#define EL_SAND_CRUMBLED (EL_FIRST_DUMMY + 12)
+#define EL_DYNABOMB (EL_FIRST_DUMMY + 12)
#define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 13)
-#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 14)
-#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 15)
-#define EL_DEFAULT (EL_FIRST_DUMMY + 16)
-#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 17)
-#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 18)
-#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 19)
+#define EL_DYNABOMB_PLAYER_1 (EL_FIRST_DUMMY + 14)
+#define EL_DYNABOMB_PLAYER_2 (EL_FIRST_DUMMY + 15)
+#define EL_DYNABOMB_PLAYER_3 (EL_FIRST_DUMMY + 16)
+#define EL_DYNABOMB_PLAYER_4 (EL_FIRST_DUMMY + 17)
+#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 18)
+#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 19)
+#define EL_DEFAULT (EL_FIRST_DUMMY + 20)
+#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 21)
+#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 22)
+#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 23)
-#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 20)
+#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 24)
/* values for graphics/sounds action types */
#define GFX_SPECIAL_ARG_SETUP 5
#define GFX_SPECIAL_ARG_DOOR 6
#define GFX_SPECIAL_ARG_PREVIEW 7
+#define GFX_SPECIAL_ARG_CRUMBLED 8
-#define NUM_SPECIAL_GFX_ARGS 8
+#define NUM_SPECIAL_GFX_ARGS 9
/* values for image configuration suffixes */
#define GFX_ARG_DELAY 13
#define GFX_ARG_ANIM_MODE 14
#define GFX_ARG_GLOBAL_SYNC 15
-#define GFX_ARG_STEP_OFFSET 16
-#define GFX_ARG_STEP_DELAY 17
-#define GFX_ARG_DIRECTION 18
-#define GFX_ARG_POSITION 19
-#define GFX_ARG_DRAW_XOFFSET 20
-#define GFX_ARG_DRAW_YOFFSET 21
-#define GFX_ARG_NAME 22
+#define GFX_ARG_CRUMBLED_LIKE 16
+#define GFX_ARG_DIGGABLE_LIKE 17
+#define GFX_ARG_STEP_OFFSET 18
+#define GFX_ARG_STEP_DELAY 19
+#define GFX_ARG_DIRECTION 20
+#define GFX_ARG_POSITION 21
+#define GFX_ARG_DRAW_XOFFSET 22
+#define GFX_ARG_DRAW_YOFFSET 23
+#define GFX_ARG_NAME 24
-#define NUM_GFX_ARGS 23
+#define NUM_GFX_ARGS 25
/* values for sound configuration suffixes */
#define GAME_MODE_SETUP 5
#define GAME_MODE_PSEUDO_DOOR 6
#define GAME_MODE_PSEUDO_PREVIEW 7
+#define GAME_MODE_PSEUDO_CRUMBLED 8
/* there are no special config file suffixes for these modes */
-#define GAME_MODE_PLAYING 8
-#define GAME_MODE_PSEUDO_TYPENAME 9
-#define GAME_MODE_QUIT 10
+#define GAME_MODE_PLAYING 9
+#define GAME_MODE_PSEUDO_TYPENAME 10
+#define GAME_MODE_QUIT 11
-#define PROGRAM_VERSION_MAJOR 2
-#define PROGRAM_VERSION_MINOR 2
+#define PROGRAM_VERSION_MAJOR 3
+#define PROGRAM_VERSION_MINOR 0
#define PROGRAM_VERSION_PATCH 0
-#define PROGRAM_VERSION_RELEASE 7
-#define PROGRAM_VERSION_STRING "2.2.0rc7"
+#define PROGRAM_VERSION_RELEASE 0
+#define PROGRAM_VERSION_STRING "3.0.0"
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
boolean gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
+ short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
boolean use_custom_template; /* use custom properties from template file */
boolean no_level_file;
int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+ int scrollbar_xoffset;
+
int list_size_default;
int list_size[NUM_SPECIAL_GFX_ARGS];
};
int graphic[NUM_ACTIONS]; /* default graphics for several actions */
int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
/* special graphics for left/right/up/down */
+
+ int crumbled[NUM_ACTIONS]; /* crumbled graphics for several actions */
+ int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS];
+ /* crumbled graphics for left/right/up/down */
+
int special_graphic[NUM_SPECIAL_GFX_ARGS];
/* special graphics for certain screens */
int move_direction_initial; /* initial direction element moves to */
int move_stepsize; /* step size element moves with */
+ int slippery_type; /* how/where other elements slip away */
+
int content[3][3]; /* new elements after explosion */
struct ElementChangeInfo change;
int anim_delay; /* important: delay of 1 means "no delay"! */
int anim_mode;
boolean anim_global_sync;
+ int crumbled_like; /* element for cloning crumble graphics */
+ int diggable_like; /* element for cloning digging graphics */
int step_offset; /* optional step offset of toon animations */
int step_delay; /* optional step delay of toon animations */
extern int redraw_x1, redraw_y1;
extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern boolean Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern boolean Changing[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short AmoebaCnt[MAX_NUM_AMOEBA];
extern int graphics_action_mapping[];
-extern struct LevelInfo level;
+extern struct LevelInfo level, level_template;
extern struct PlayerInfo stored_player[], *local_player;
extern struct HiScore highscore[];
extern struct TapeInfo tape;