#define CE_PLAYER_PUSHES_X 13
#define CE_PLAYER_COLLECTS_X 14
#define CE_PLAYER_DROPS_X 15
-#define CE_COUNT_AT_ZERO 16
-#define CE_COUNT_AT_ZERO_OF_X 17
+#define CE_VALUE_GETS_ZERO 16
+#define CE_VALUE_GETS_ZERO_OF_X 17
#define CE_BY_OTHER_ACTION 18
#define CE_BY_DIRECT_ACTION 19
#define CE_PLAYER_DIGS_X 20
#define CE_HITTING_X 28
#define CE_HIT_BY_X 29
#define CE_BLOCKED 30
+#define CE_SWITCHED_BY_PLAYER 31
+#define CE_PLAYER_SWITCHES_X 32
+#define CE_SNAPPED_BY_PLAYER 33
+#define CE_PLAYER_SNAPS_X 34
+#define CE_MOVE_OF_X 35
-#define NUM_CHANGE_EVENTS 31
+#define NUM_CHANGE_EVENTS 36
#define CE_BITMASK_DEFAULT 0
PLAYER_BITS_4)
#define PLAYER_BITS_TRIGGER (1 << 4)
+/* values for move directions (bits 0 - 3: basic move directions) */
+#define MV_BIT_PREVIOUS 4
+#define MV_BIT_TRIGGER 5
+#define MV_BIT_TRIGGER_BACK 6
+
+#define MV_PREVIOUS (1 << MV_BIT_PREVIOUS)
+#define MV_TRIGGER (1 << MV_BIT_TRIGGER)
+#define MV_TRIGGER_BACK (1 << MV_BIT_TRIGGER_BACK)
+
/* values for change side for custom elements */
#define CH_SIDE_NONE MV_NONE
#define CH_SIDE_LEFT MV_LEFT
#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_GEMS 7
-#define CA_SET_TIME 8
-#define CA_SET_SCORE 9
-#define CA_SET_CE_SCORE 10
-#define CA_SET_CE_COUNT 11
+#define CA_MOVE_PLAYER 3
+#define CA_RESTART_LEVEL 4
+#define CA_SHOW_ENVELOPE 5
+#define CA_SET_LEVEL_TIME 6
+#define CA_SET_LEVEL_GEMS 7
+#define CA_SET_LEVEL_SCORE 8
+#define CA_SET_LEVEL_WIND 9
+#define CA_SET_LEVEL_GRAVITY 10
+#define CA_SET_PLAYER_KEYS 11
#define CA_SET_PLAYER_SPEED 12
-#define CA_SET_PLAYER_GRAVITY 13
-#define CA_SET_WIND_DIRECTION 14
-#if 0
-#define CA_SET_DYNABOMB_NUMBER 15
-#define CA_SET_DYNABOMB_SIZE 16
-#define CA_SET_DYNABOMB_POWER 17
-#endif
+#define CA_SET_PLAYER_SHIELD 13
+#define CA_SET_PLAYER_ARTWORK 14
+#define CA_SET_CE_SCORE 15
+#define CA_SET_CE_VALUE 16
+
+#define CA_HEADLINE_LEVEL_ACTIONS 250
+#define CA_HEADLINE_PLAYER_ACTIONS 251
+#define CA_HEADLINE_CE_ACTIONS 252
+#define CA_UNDEFINED 255
/* values for change action mode for custom elements */
#define CA_MODE_UNDEFINED 0
#define CA_ARG_NUMBER_MAX (CA_ARG_NUMBER + 1)
#define CA_ARG_NUMBER_RESET (CA_ARG_NUMBER + 2)
#define CA_ARG_NUMBER_CE_SCORE (CA_ARG_NUMBER + 3)
-#define CA_ARG_NUMBER_CE_COUNT (CA_ARG_NUMBER + 4)
+#define CA_ARG_NUMBER_CE_VALUE (CA_ARG_NUMBER + 4)
#define CA_ARG_NUMBER_CE_DELAY (CA_ARG_NUMBER + 5)
+#define CA_ARG_NUMBER_LEVEL_TIME (CA_ARG_NUMBER + 6)
+#define CA_ARG_NUMBER_LEVEL_GEMS (CA_ARG_NUMBER + 7)
+#define CA_ARG_NUMBER_LEVEL_SCORE (CA_ARG_NUMBER + 8)
#define CA_ARG_NUMBER_HEADLINE (CA_ARG_NUMBER + 999)
#define CA_ARG_ELEMENT 12000
-#define CA_ARG_ELEMENT_TARGET (CA_ARG_ELEMENT + 0)
-#define CA_ARG_ELEMENT_TRIGGER (CA_ARG_ELEMENT + 1)
+#define CA_ARG_ELEMENT_RESET (CA_ARG_ELEMENT + 0)
+#define CA_ARG_ELEMENT_TARGET (CA_ARG_ELEMENT + 1)
+#define CA_ARG_ELEMENT_TRIGGER (CA_ARG_ELEMENT + 2)
#define CA_ARG_ELEMENT_HEADLINE (CA_ARG_ELEMENT + 999)
#define CA_ARG_SPEED 13000
+#define CA_ARG_SPEED_NOT_MOVING (CA_ARG_SPEED + 0)
#define CA_ARG_SPEED_VERY_SLOW (CA_ARG_SPEED + 1)
#define CA_ARG_SPEED_SLOW (CA_ARG_SPEED + 2)
#define CA_ARG_SPEED_NORMAL (CA_ARG_SPEED + 4)
#define CA_ARG_SPEED_EVEN_FASTER (CA_ARG_SPEED + 32)
#define CA_ARG_SPEED_SLOWER (CA_ARG_SPEED + 50)
#define CA_ARG_SPEED_FASTER (CA_ARG_SPEED + 200)
-#define CA_ARG_SPEED_RESET (CA_ARG_SPEED + 0)
+#define CA_ARG_SPEED_RESET (CA_ARG_SPEED + 100)
#define CA_ARG_SPEED_HEADLINE (CA_ARG_SPEED + 999)
#define CA_ARG_GRAVITY 14000
#define CA_ARG_GRAVITY_OFF (CA_ARG_GRAVITY + 0)
#define CA_ARG_DIRECTION_RIGHT (CA_ARG_DIRECTION + MV_RIGHT)
#define CA_ARG_DIRECTION_UP (CA_ARG_DIRECTION + MV_UP)
#define CA_ARG_DIRECTION_DOWN (CA_ARG_DIRECTION + MV_DOWN)
-#define CA_ARG_DIRECTION_TRIGGER (CA_ARG_DIRECTION + MV_ANY_DIRECTION)
+#define CA_ARG_DIRECTION_TRIGGER (CA_ARG_DIRECTION + MV_TRIGGER)
+#define CA_ARG_DIRECTION_TRIGGER_BACK (CA_ARG_DIRECTION + MV_TRIGGER_BACK)
#define CA_ARG_DIRECTION_HEADLINE (CA_ARG_DIRECTION + 999)
+#define CA_ARG_SHIELD 16000
+#define CA_ARG_SHIELD_OFF (CA_ARG_SHIELD + 0)
+#define CA_ARG_SHIELD_NORMAL (CA_ARG_SHIELD + 1)
+#define CA_ARG_SHIELD_DEADLY (CA_ARG_SHIELD + 2)
+#define CA_ARG_SHIELD_HEADLINE (CA_ARG_SHIELD + 999)
#define CA_ARG_UNDEFINED 19999
/* values for custom move patterns (bits 0 - 3: basic move directions) */
#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_NONE (MV_NONE)
#define MV_START_AUTOMATIC (MV_NONE)
#define MV_START_UP (MV_UP)
#define MV_START_DOWN (MV_DOWN)
#define MV_START_RANDOM (MV_ALL_DIRECTIONS)
-#define MV_START_PREVIOUS (1 << MV_START_BIT_PREVIOUS)
+#define MV_START_PREVIOUS (MV_PREVIOUS)
/* values for elements left behind by custom elements */
#define LEAVE_TYPE_UNLIMITED 0
#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 GET_PLAYER_NR(e) (GET_PLAYER_ELEMENT(e) - EL_PLAYER_1)
+
#define ANIM_FRAMES(g) (graphic_info[g].anim_frames)
#define ANIM_DELAY(g) (graphic_info[g].anim_delay)
#define ANIM_MODE(g) (graphic_info[g].anim_mode)
#define EL_QUICKSAND_FILLING (EL_FIRST_RUNTIME_UNREAL + 15)
#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 16)
#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 17)
+#define EL_ELEMENT_SNAPPING (EL_FIRST_RUNTIME_UNREAL + 18)
/* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 18)
+#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 19)
#define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0)
#define EL_STEELWALL_TOPRIGHT (EL_FIRST_DUMMY + 1)
int GfxAction;
- boolean use_murphy_graphic;
+ boolean use_murphy;
+ int artwork_element;
boolean block_last_field;
int block_delay_adjustment; /* needed for different engine versions */
boolean is_bored;
boolean is_sleeping;
+ boolean cannot_move;
+
int frame_counter_bored;
int frame_counter_sleeping;
int extra_time;
int time_orb_time;
+ int extra_time_score;
+
+ int start_element[MAX_PLAYERS];
+ boolean use_start_element[MAX_PLAYERS];
+
+#if 1
/* values for the new EMC elements */
int android_move_time;
int android_clone_time;
int wind_direction_initial;
struct Content ball_content[MAX_ELEMENT_CONTENTS];
boolean android_array[16];
+#endif
int can_move_into_acid_bits; /* bitfield to store property for elements */
int dont_collide_with_bits; /* bitfield to store property for elements */
boolean initial_gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
boolean use_spring_bug; /* for compatibility with old levels */
+ boolean use_time_orb_bug; /* for compatibility with old levels */
boolean instant_relocation; /* no visual delay when relocating player */
boolean can_pass_to_walkable; /* player can pass to empty or walkable tile */
boolean grow_into_diggable; /* amoeba can grow into anything diggable */
+ boolean block_snap_field; /* snapping blocks field to show animation */
boolean block_last_field; /* player blocks previous field while moving */
boolean sp_block_last_field; /* player blocks previous field while moving */
int trigger_side; /* side triggering change */
int trigger_page; /* page triggering change */
- short target_element; /* target element after change */
+ int target_element; /* target element after change */
int delay_fixed; /* added frame delay before changed (fixed) */
int delay_random; /* added frame delay before changed (random) */
int delay_frames; /* either 1 (frames) or 50 (seconds; 50 fps) */
- short trigger_element; /* element triggering change */
+ int trigger_element; /* element triggering change */
struct Content target_content;/* elements for extended change target */
boolean use_target_content; /* use extended change target */
void (*post_change_function)(int x, int y);
short actual_trigger_element; /* element that actually triggered change */
- int actual_trigger_side; /* el.side that actually triggered change */
+ int actual_trigger_side; /* element side that triggered the change */
int actual_trigger_player; /* player which actually triggered change */
+ int actual_trigger_ce_value; /* CE value of element that triggered change */
boolean can_change_or_has_action; /* can_change | has_action */
struct ElementGroupInfo
{
int num_elements; /* number of elements in this group */
- short element[MAX_ELEMENTS_IN_GROUP]; /* list of elements in this group */
+ int element[MAX_ELEMENTS_IN_GROUP]; /* list of elements in this group */
int choice_mode; /* how to choose element from group */
/* ---------- special element property values ---------- */
boolean use_gfx_element; /* use custom graphic element */
- short gfx_element; /* optional custom graphic element */
+ int gfx_element; /* optional custom graphic element */
int access_direction; /* accessible from which direction */
int collect_score_initial; /* initial score value for collecting */
int collect_count_initial; /* initial count value for collecting */
+ int ce_value_fixed_initial; /* initial value for custom variable (fix) */
+ int ce_value_random_initial; /* initial value for custom variable (rnd) */
+ boolean use_last_ce_value; /* use value from element before change */
+
int push_delay_fixed; /* constant delay before pushing */
int push_delay_random; /* additional random delay before pushing */
int drop_delay_fixed; /* constant delay after dropping */
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 CustomValue[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];