#define PLAYER_BITS_TRIGGER (1 << 4)
/* values for change side for custom elements */
-#define CH_SIDE_NONE MV_NO_MOVING
+#define CH_SIDE_NONE MV_NONE
#define CH_SIDE_LEFT MV_LEFT
#define CH_SIDE_RIGHT MV_RIGHT
#define CH_SIDE_TOP MV_UP
/* 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 MV_BIT_TURNING_LEFT_RIGHT 14
#define MV_BIT_TURNING_RIGHT_LEFT 15
#define MV_BIT_TURNING_RANDOM 16
+#define MV_BIT_WIND_DIRECTION 17
/* values for custom move patterns */
#define MV_TOWARDS_PLAYER (1 << MV_BIT_TOWARDS_PLAYER)
#define MV_TURNING_LEFT_RIGHT (1 << MV_BIT_TURNING_LEFT_RIGHT)
#define MV_TURNING_RIGHT_LEFT (1 << MV_BIT_TURNING_RIGHT_LEFT)
#define MV_TURNING_RANDOM (1 << MV_BIT_TURNING_RANDOM)
+#define MV_WIND_DIRECTION (1 << MV_BIT_WIND_DIRECTION)
/* values for initial move direction (bits 0 - 3: basic move directions) */
#define MV_START_BIT_PREVIOUS 4
/* values for initial move direction */
-#define MV_START_AUTOMATIC (MV_NO_MOVING)
+#define MV_START_NONE (MV_NONE)
+#define MV_START_AUTOMATIC (MV_NONE)
#define MV_START_LEFT (MV_LEFT)
#define MV_START_RIGHT (MV_RIGHT)
#define MV_START_UP (MV_UP)
#define MIN_ELEMENT_CONTENTS 1
#define STD_ELEMENT_CONTENTS 4
#define MAX_ELEMENT_CONTENTS 8
-#define NUM_MAGIC_BALL_CONTENTS 8
#define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */
#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 5
#endif
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
int Score;
};
+struct Content
+{
+ int e[3][3];
+};
+
struct PlayerInfo
{
boolean present; /* player present in level playfield */
int move_delay;
int move_delay_value;
+ int move_delay_value_next;
int move_delay_reset_counter;
int push_delay;
int score[LEVEL_SCORE_ELEMENTS];
- int yamyam_content[MAX_ELEMENT_CONTENTS][3][3];
+ struct Content yamyam_content[MAX_ELEMENT_CONTENTS];
int num_yamyam_contents;
int amoeba_speed;
int amoeba_content;
+ int game_of_life[4];
+ int biomaze[4];
+
int time_magic_wall;
int time_wheel;
int time_light;
int time_timegate;
+ int shield_normal_time;
+ int shield_deadly_time;
+
+ int extra_time;
+ int time_orb_time;
+
/* values for the new EMC elements */
int android_move_time;
int android_clone_time;
int lenses_time;
int magnify_time;
int wind_direction_initial;
- int ball_content[NUM_MAGIC_BALL_CONTENTS][3][3];
+ struct Content ball_content[MAX_ELEMENT_CONTENTS];
boolean android_array[16];
int can_move_into_acid_bits; /* bitfield to store property for elements */
int belt_dir[4];
int belt_dir_nr[4];
int switchgate_pos;
- int balloon_dir;
+ int wind_direction;
boolean gravity;
boolean explosions_delayed;
boolean envelope_active;
short trigger_element; /* element triggering change */
- int target_content[3][3]; /* elements for extended change target */
+ struct Content target_content;/* elements for extended change target */
boolean use_target_content; /* use extended change target */
boolean only_if_complete; /* only use complete target content */
boolean use_random_replace; /* use random value for replacing elements */
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 slippery_type; /* how/where other elements slip away */
- int content[3][3]; /* new elements after explosion */
+ struct Content content; /* new elements after explosion */
int explosion_type; /* type of explosion, like 3x3, 3+3 or 1x1 */
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 in_group[NUM_GROUP_ELEMENTS];
- 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 */
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];