#define CE_PLAYER_PUSHES_X 13
#define CE_PLAYER_COLLECTS_X 14
#define CE_PLAYER_DROPS_X 15
-
-#if 1
#define CE_COUNT_AT_ZERO 16
#define CE_COUNT_AT_ZERO_OF_X 17
-#else
-#define CE_BY_PLAYER_OBSOLETE 16 /* obsolete; now CE_BY_DIRECT_ACTION */
-#define CE_BY_COLLISION_OBSOLETE 17 /* obsolete; now CE_BY_DIRECT_ACTION */
-#endif
-
#define CE_BY_OTHER_ACTION 18 /* activates other element events */
#define CE_BY_DIRECT_ACTION 19 /* activates direct element events */
#define CE_PLAYER_DIGS_X 20
#define CE_BITMASK_DEFAULT 0
-#if 1
-
#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 SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \
CH_ANY_EVENT_VAR(e,c) = (v) : 0)
-#else
-
-#define CH_EVENT_BIT(c) (1 << (c))
-#define CH_EVENT_VAR(e) (element_info[e].change->events)
-#define CH_ANY_EVENT_VAR(e) (element_info[e].change_events)
-
-#define HAS_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \
- (CH_EVENT_VAR(e) & CH_EVENT_BIT(c)) != 0)
-#define HAS_ANY_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \
- (CH_ANY_EVENT_VAR(e) & CH_EVENT_BIT(c)) != 0)
-#define SET_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \
- ((v) ? \
- (CH_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \
- (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
-#define SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \
- ((v) ? \
- (CH_ANY_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \
- (CH_ANY_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
-#endif
-
/* values for player bitmasks */
#define PLAYER_BITS_NONE 0
#define PLAYER_BITS_1 (1 << 0)
/* 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
+#define CA_MODE_SET 1
+#define CA_MODE_ADD 2
+#define CA_MODE_SUBTRACT 3
+#define CA_MODE_MULTIPLY 4
+#define CA_MODE_DIVIDE 5
+#define CA_MODE_MODULO 6
/* values for change action parameters for custom elements */
#define CA_ARG_MIN 0
#define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER_1])
#define SHIELD_ON(p) ((p)->shield_normal_time_left > 0)
-#if 1
-
#define ENEMY_PROTECTED_FIELD(x,y) (IS_PROTECTED(Feld[x][y]) || \
IS_PROTECTED(Back[x][y]))
#define EXPLOSION_PROTECTED_FIELD(x,y) (IS_EXPLOSION_PROOF(Feld[x][y]))
#define PLAYER_EXPLOSION_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
EXPLOSION_PROTECTED_FIELD(x, y))
-#else
-
-#define PROTECTED_FIELD(x,y) (IS_ACCESSIBLE_INSIDE(Feld[x][y]) && \
- IS_INDESTRUCTIBLE(Feld[x][y]))
-#define PLAYER_ENEMY_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
- PROTECTED_FIELD(x, y))
-#define PLAYER_EXPLOSION_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
- PROTECTED_FIELD(x, y))
-#endif
-
#define PLAYER_SWITCHING(p,x,y) ((p)->is_switching && \
(p)->switch_x == (x) && (p)->switch_y == (y))
#define ACTION_SLURPED_BY_SPRING 49
#define ACTION_TWINKLING 50
#define ACTION_SPLASHING 51
-#define ACTION_OTHER 52
-
-#define NUM_ACTIONS 53
+#define ACTION_PAGE_1 52
+#define ACTION_PAGE_2 53
+#define ACTION_PAGE_3 54
+#define ACTION_PAGE_4 55
+#define ACTION_PAGE_5 56
+#define ACTION_PAGE_6 57
+#define ACTION_PAGE_7 58
+#define ACTION_PAGE_8 59
+#define ACTION_PAGE_9 60
+#define ACTION_PAGE_10 61
+#define ACTION_PAGE_11 62
+#define ACTION_PAGE_12 63
+#define ACTION_PAGE_13 64
+#define ACTION_PAGE_14 65
+#define ACTION_PAGE_15 66
+#define ACTION_PAGE_16 67
+#define ACTION_PAGE_17 68
+#define ACTION_PAGE_18 69
+#define ACTION_PAGE_19 70
+#define ACTION_PAGE_20 71
+#define ACTION_PAGE_21 72
+#define ACTION_PAGE_22 73
+#define ACTION_PAGE_23 74
+#define ACTION_PAGE_24 75
+#define ACTION_PAGE_25 76
+#define ACTION_PAGE_26 77
+#define ACTION_PAGE_27 78
+#define ACTION_PAGE_28 79
+#define ACTION_PAGE_29 80
+#define ACTION_PAGE_30 81
+#define ACTION_PAGE_31 82
+#define ACTION_PAGE_32 83
+#define ACTION_OTHER 84
+
+#define NUM_ACTIONS 85
#define ACTION_BORING_LAST ACTION_BORING_10
#define ACTION_SLEEPING_LAST ACTION_SLEEPING_3
#define GFX_ARG_POST_DELAY_RANDOM 35
#define GFX_ARG_NAME 36
#define GFX_ARG_SCALE_UP_FACTOR 37
+#define GFX_ARG_CLONE_FROM 38
-#define NUM_GFX_ARGS 38
+#define NUM_GFX_ARGS 39
/* values for sound configuration suffixes */
/* program information and versioning definitions */
-#define RELEASE_311 FALSE
+#define RELEASE_3_1_2 FALSE
-#if RELEASE_311
+#if RELEASE_3_1_2
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 1
#define PROGRAM_VERSION_PATCH 2
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 2
#define PROGRAM_VERSION_PATCH 0
-#define PROGRAM_VERSION_BUILD 3
+#define PROGRAM_VERSION_BUILD 4
#endif
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
int show_envelope;
-#if 1 /* USE_NEW_MOVE_DELAY */
int move_delay;
int move_delay_value;
-#else
- unsigned long move_delay;
- int move_delay_value;
-#endif
-
+ int move_delay_value_next;
int move_delay_reset_counter;
-#if 1 /* USE_NEW_PUSH_DELAY */
int push_delay;
int push_delay_value;
-#else
- unsigned long push_delay;
- unsigned long push_delay_value;
-#endif
unsigned long actual_frame_counter;
boolean block_last_field; /* player blocks previous field while moving */
boolean sp_block_last_field; /* player blocks previous field while moving */
-#if 0 /* !!! THIS IS NOT A LEVEL SETTING => LOGIC MOVED TO "game.c" !!! */
- int block_delay; /* delay for blocking previous field */
- int sp_block_delay; /* delay for blocking previous field */
-#endif
-
/* ('int' instead of 'boolean' because used as selectbox value in editor) */
int use_step_counter; /* count steps instead of seconds for level */
{
boolean can_change; /* use or ignore this change info */
-#if 1
boolean has_event[NUM_CHANGE_EVENTS]; /* change events */
-#else
- unsigned long events; /* change events */
-#endif
int trigger_player; /* player triggering change */
int trigger_side; /* side triggering change */
int access_direction; /* accessible from which direction */
- int collect_score; /* score value for collecting */
- int collect_count; /* count value for collecting */
+ int collect_score_initial; /* initial score value for collecting */
+ int collect_count_initial; /* initial count value for collecting */
int push_delay_fixed; /* constant delay before pushing */
int push_delay_random; /* additional random delay before pushing */
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 */
/* ---------- internal values used at runtime when playing ---------- */
-#if 1
boolean has_change_event[NUM_CHANGE_EVENTS];
-#else
- unsigned long change_events; /* bitfield for combined change events */
-#endif
int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */
struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */
boolean in_group[NUM_GROUP_ELEMENTS];
-#if 0
- boolean can_leave_element; /* element can leave other element behind */
- boolean can_leave_element_last;
-#endif
-
- int counter; /* current value of generic CE counter */
+ int collect_score; /* runtime score value for collecting */
/* ---------- internal values used in level editor ---------- */
struct GraphicInfo
{
Bitmap *bitmap;
+ int src_image_width; /* scaled bitmap size, but w/o small images */
+ int src_image_height; /* scaled bitmap size, but w/o small images */
+
int src_x, src_y; /* start position of animation frames */
int width, height; /* width/height of each animation frame */
int offset_x, offset_y; /* x/y offset to next animation frame */
int diggable_like; /* element for cloning digging graphics */
int border_size; /* border size for "crumbled" graphics */
int scale_up_factor; /* optional factor for scaling image up */
+ int clone_from; /* graphic for cloning *all* settings */
int anim_delay_fixed; /* optional delay values for bored and */
int anim_delay_random; /* sleeping player animations (animation */
};
-#if 0
-extern GC tile_clip_gc;
-extern Bitmap *pix[];
-#endif
extern Bitmap *bitmap_db_field, *bitmap_db_door;
extern Pixmap tile_clipmask[];
extern DrawBuffer *fieldbuffer;
extern short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short Count[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];