#define EP_KEYGATE 49
#define EP_AMOEBOID 50
#define EP_AMOEBALIVE 51
-#define EP_HAS_CONTENT 52
+#define EP_HAS_EDITOR_CONTENT 52
#define EP_CAN_TURN_EACH_MOVE 53
#define EP_CAN_GROW 54
#define EP_ACTIVE_BOMB 55
#define MV_NORMAL (1 << MV_BIT_NORMAL)
#define MV_REVERSE (1 << MV_BIT_REVERSE)
+/* values for move stepsize */
+#define STEPSIZE_NOT_MOVING 0
+#define STEPSIZE_VERY_SLOW 1
+#define STEPSIZE_SLOW 2
+#define STEPSIZE_NORMAL 4
+#define STEPSIZE_FAST 8
+#define STEPSIZE_VERY_FAST 16
+#define STEPSIZE_EVEN_FASTER 32
+#define STEPSIZE_SLOWER 50 /* (symbolic value only) */
+#define STEPSIZE_FASTER 200 /* (symbolic value only) */
+#define STEPSIZE_RESET 100 /* (symbolic value only) */
+
/* values for change side for custom elements */
#define CH_SIDE_NONE MV_NONE
#define CH_SIDE_LEFT MV_LEFT
#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_FAST (CA_ARG_SPEED + 8)
-#define CA_ARG_SPEED_VERY_FAST (CA_ARG_SPEED + 16)
-#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 + 100)
+#define CA_ARG_SPEED_NOT_MOVING (CA_ARG_SPEED + STEPSIZE_NOT_MOVING)
+#define CA_ARG_SPEED_VERY_SLOW (CA_ARG_SPEED + STEPSIZE_VERY_SLOW)
+#define CA_ARG_SPEED_SLOW (CA_ARG_SPEED + STEPSIZE_SLOW)
+#define CA_ARG_SPEED_NORMAL (CA_ARG_SPEED + STEPSIZE_NORMAL)
+#define CA_ARG_SPEED_FAST (CA_ARG_SPEED + STEPSIZE_FAST)
+#define CA_ARG_SPEED_VERY_FAST (CA_ARG_SPEED + STEPSIZE_VERY_FAST)
+#define CA_ARG_SPEED_EVEN_FASTER (CA_ARG_SPEED + STEPSIZE_EVEN_FASTER)
+#define CA_ARG_SPEED_SLOWER (CA_ARG_SPEED + STEPSIZE_SLOWER)
+#define CA_ARG_SPEED_FASTER (CA_ARG_SPEED + STEPSIZE_FASTER)
+#define CA_ARG_SPEED_RESET (CA_ARG_SPEED + STEPSIZE_RESET)
#define CA_ARG_SPEED_HEADLINE (CA_ARG_SPEED + 999)
#define CA_ARG_GRAVITY 14000
#define CA_ARG_GRAVITY_OFF (CA_ARG_GRAVITY + 0)
#define IS_KEYGATE(e) HAS_PROPERTY(e, EP_KEYGATE)
#define IS_AMOEBOID(e) HAS_PROPERTY(e, EP_AMOEBOID)
#define IS_AMOEBALIVE(e) HAS_PROPERTY(e, EP_AMOEBALIVE)
-#define HAS_CONTENT(e) HAS_PROPERTY(e, EP_HAS_CONTENT)
+#define HAS_EDITOR_CONTENT(e) HAS_PROPERTY(e, EP_HAS_EDITOR_CONTENT)
#define CAN_TURN_EACH_MOVE(e) HAS_PROPERTY(e, EP_CAN_TURN_EACH_MOVE)
#define CAN_GROW(e) HAS_PROPERTY(e, EP_CAN_GROW)
#define IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB)
#define MAX_CHANGE_PAGES 32
#define MIN_ELEMENTS_IN_GROUP 1
#define MAX_ELEMENTS_IN_GROUP 16
+#define MIN_ANDROID_ELEMENTS 1
+#define MAX_ANDROID_ELEMENTS 16
/* values for elements with content */
#define MIN_ELEMENT_CONTENTS 1
#define EL_EMC_GATE_7_GRAY_ACTIVE (EL_FIRST_RUNTIME_REAL + 56)
#define EL_EMC_GATE_8_GRAY_ACTIVE (EL_FIRST_RUNTIME_REAL + 57)
#define EL_EMC_DRIPPER_ACTIVE (EL_FIRST_RUNTIME_REAL + 58)
+#define EL_EMC_SPRING_BUMPER_ACTIVE (EL_FIRST_RUNTIME_REAL + 59)
/* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 59)
+#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 60)
#define EL_BLOCKED (EL_FIRST_RUNTIME_UNREAL + 0)
#define EL_EXPLOSION (EL_FIRST_RUNTIME_UNREAL + 1)
#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)
+#define EL_DIAGONAL_SHRINKING (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_DIAGONAL_GROWING (EL_FIRST_RUNTIME_UNREAL + 20)
/* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 21)
#define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0)
#define EL_STEELWALL_TOPRIGHT (EL_FIRST_DUMMY + 1)
struct DoorInfo
{
+ int width;
+ int height;
int step_offset;
int step_delay;
int anim_mode;
struct Content ball_content[MAX_ELEMENT_CONTENTS];
int num_ball_contents;
+#if 0
boolean android_array[16];
#endif
+ int num_android_clone_elements;
+ int android_clone_element[MAX_ANDROID_ELEMENTS];
+#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 double_speed;
+ int initial_player_stepsize; /* initial player speed */
+
boolean initial_gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
boolean use_spring_bug; /* for compatibility with old levels */
/* ---------- graphic and sound definitions ---------- */
int graphic[NUM_ACTIONS]; /* default graphics for several actions */
- int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
+ int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS_FULL];
/* special graphics for left/right/up/down */
int crumbled[NUM_ACTIONS]; /* crumbled graphics for several actions */
- int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS];
+ int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS_FULL];
/* crumbled graphics for left/right/up/down */
int special_graphic[NUM_SPECIAL_GFX_ARGS];