#define CE_HITTING_SOMETHING 5
#define CE_IMPACT 6
#define CE_SMASHED 7
-#define CE_OTHER_IS_TOUCHING 8
-#define CE_OTHER_IS_CHANGING 9
-#define CE_OTHER_IS_EXPLODING 10
-#define CE_OTHER_GETS_TOUCHED 11
-#define CE_OTHER_GETS_PRESSED 12
-#define CE_OTHER_GETS_PUSHED 13
-#define CE_OTHER_GETS_COLLECTED 14
-#define CE_OTHER_GETS_DROPPED 15
+#define CE_TOUCHING_X 8
+#define CE_CHANGE_OF_X 9
+#define CE_EXPLOSION_OF_X 10
+#define CE_PLAYER_TOUCHES_X 11
+#define CE_PLAYER_PRESSES_X 12
+#define CE_PLAYER_PUSHES_X 13
+#define CE_PLAYER_COLLECTS_X 14
+#define CE_PLAYER_DROPS_X 15
#define CE_BY_PLAYER_OBSOLETE 16 /* obsolete; now CE_BY_DIRECT_ACTION */
#define CE_BY_COLLISION_OBSOLETE 17 /* obsolete; now CE_BY_DIRECT_ACTION */
#define CE_BY_OTHER_ACTION 18 /* activates other element events */
#define CE_BY_DIRECT_ACTION 19 /* activates direct element events */
-#define CE_OTHER_GETS_DIGGED 20
+#define CE_PLAYER_DIGS_X 20
#define CE_ENTERED_BY_PLAYER 21
#define CE_LEFT_BY_PLAYER 22
-#define CE_OTHER_GETS_ENTERED 23
-#define CE_OTHER_GETS_LEFT 24
+#define CE_PLAYER_ENTERS_X 23
+#define CE_PLAYER_LEAVES_X 24
#define CE_SWITCHED 25
-#define CE_OTHER_IS_SWITCHING 26
+#define CE_SWITCH_OF_X 26
#define CE_HIT_BY_SOMETHING 27
-#define CE_OTHER_IS_HITTING 28
-#define CE_OTHER_GETS_HIT 29
+#define CE_HITTING_X 28
+#define CE_HIT_BY_X 29
#define CE_BLOCKED 30
#define NUM_CHANGE_EVENTS 31
#define CH_PLAYER_2 (1 << 1)
#define CH_PLAYER_3 (1 << 2)
#define CH_PLAYER_4 (1 << 3)
-#define CH_PLAYER_ANY (CH_PLAYER_1 | CH_PLAYER_2 | CH_PLAYER_3 | \
+#define CH_PLAYER_ANY (CH_PLAYER_1 | \
+ CH_PLAYER_2 | \
+ CH_PLAYER_3 | \
CH_PLAYER_4)
+#define CH_PLAYER_TRIGGER (1 << 4)
/* values for change page for custom elements */
#define CH_PAGE_ANY_FILE (0xff)
#define CP_WHEN_REMOVABLE 4
#define CP_WHEN_WALKABLE 5
+/* values for change actions for custom elements */
+#define CA_NO_ACTION 0
+#define CA_EXIT_PLAYER 1
+#define CA_KILL_PLAYER 2
+#define CA_RESTART_LEVEL 3
+#define CA_SHOW_ENVELOPE 4
+#define CA_ADD_KEY 5
+#define CA_DEL_KEY 6
+#define CA_SET_PLAYER_SPEED 7
+#define CA_SET_GEMS 8
+#define CA_SET_SCORE 9
+#define CA_SET_TIME 10
+#define CA_SET_COUNTER 11
+#define CA_SET_DYNABOMB_NUMBER 12
+#define CA_SET_DYNABOMB_SIZE 13
+#define CA_SET_DYNABOMB_POWER 14
+#define CA_TOGGLE_PLAYER_GRAVITY 15
+#define CA_ENABLE_PLAYER_GRAVITY 16
+#define CA_DISABLE_PLAYER_GRAVITY 17
+
+/* values for change action mode for custom elements */
+#define CA_MODE_UNDEFINED 0
+#define CA_MODE_ADD 1
+#define CA_MODE_SUBTRACT 2
+#define CA_MODE_MULTIPLY 3
+#define CA_MODE_DIVIDE 4
+#define CA_MODE_SET 5
+
+/* values for change action parameters for custom elements */
+#define CA_ARG_0 0
+#define CA_ARG_1 1
+#define CA_ARG_2 2
+#define CA_ARG_3 3
+#define CA_ARG_4 4
+#define CA_ARG_5 5
+#define CA_ARG_6 6
+#define CA_ARG_7 7
+#define CA_ARG_8 8
+#define CA_ARG_9 9
+#define CA_ARG_10 10
+#define CA_ARG_20 20
+#define CA_ARG_25 25
+#define CA_ARG_50 50
+#define CA_ARG_100 100
+#define CA_ARG_1000 1000
+#define CA_ARG_PLAYER 20000
+#define CA_ARG_PLAYER_HEADLINE (CA_ARG_PLAYER + 0)
+#define CA_ARG_PLAYER_1 (CA_ARG_PLAYER + CH_PLAYER_1)
+#define CA_ARG_PLAYER_2 (CA_ARG_PLAYER + CH_PLAYER_2)
+#define CA_ARG_PLAYER_3 (CA_ARG_PLAYER + CH_PLAYER_3)
+#define CA_ARG_PLAYER_4 (CA_ARG_PLAYER + CH_PLAYER_4)
+#define CA_ARG_PLAYER_ANY (CA_ARG_PLAYER + CH_PLAYER_ANY)
+#define CA_ARG_PLAYER_TRIGGER (CA_ARG_PLAYER + CH_PLAYER_TRIGGER)
+#define CA_ARG_NUMBER 30000
+#define CA_ARG_NUMBER_HEADLINE (CA_ARG_NUMBER + 0)
+#define CA_ARG_NUMBER_MIN (CA_ARG_NUMBER + 1)
+#define CA_ARG_NUMBER_MAX (CA_ARG_NUMBER + 2)
+#define CA_ARG_NUMBER_NORMAL (CA_ARG_NUMBER + 3)
+#define CA_ARG_NUMBER_RESET (CA_ARG_NUMBER + 4)
+#define CA_ARG_NUMBER_COUNT (CA_ARG_NUMBER + 5)
+#define CA_ARG_UNDEFINED 30999
+
/* values for custom move patterns (bits 0 - 3: basic move directions) */
#define MV_BIT_TOWARDS_PLAYER 4
#define MV_BIT_AWAY_FROM_PLAYER 5
#define PLAYER_SWITCHING(p,x,y) ((p)->is_switching && \
(p)->switch_x == (x) && (p)->switch_y == (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 ANIM_FRAMES(g) (graphic_info[g].anim_frames)
/* program information and versioning definitions */
+#define RELEASE_311 FALSE
+
+#if RELEASE_311
+#define PROGRAM_VERSION_MAJOR 3
+#define PROGRAM_VERSION_MINOR 1
+#define PROGRAM_VERSION_PATCH 2
+#define PROGRAM_VERSION_BUILD 0
+#else
+/* !!! make sure that packaging script can find unique version number !!! */
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 2
#define PROGRAM_VERSION_PATCH 0
#define PROGRAM_VERSION_BUILD 3
+#endif
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
-#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2004 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2005 by Holger Schemel"
#define ICON_TITLE_STRING PROGRAM_TITLE_STRING
#define COOKIE_PREFIX "ROCKSNDIAMONDS"
int num_special_action_sleeping;
int switch_x, switch_y;
+ int drop_x, drop_y;
int show_envelope;
boolean explode; /* explode instead of change */
+ boolean use_change_action; /* execute change action after change */
+ int change_action; /* type of change action after change */
+ int change_action_mode; /* mode of change action after change */
+ int change_action_arg; /* parameter of change action after change */
+
/* ---------- internal values used at runtime when playing ---------- */
/* functions that are called before, while and after the change of an
int explosion_delay; /* duration of explosion of this element */
int ignition_delay; /* delay for explosion by other explosion */
+ int counter_initial; /* initial value of generic CE counter */
+
struct ElementChangeInfo *change_page; /* actual list of change pages */
struct ElementChangeInfo *change; /* pointer to current change page */
boolean can_leave_element_last;
#endif
+ int counter; /* current value of generic CE counter */
+
/* ---------- internal values used in level editor ---------- */
int access_type; /* walkable or passable */