#define EP_UNUSED_4 4
#define EP_INDESTRUCTIBLE 5
#define EP_SLIPPERY 6
-#define EP_UNUSED_7 7
-#define EP_UNUSED_8 8
+#define EP_CAN_EXPLODE 7
+#define EP_CAN_MOVE 8
#define EP_CAN_FALL 9
#define EP_CAN_SMASH 10
#define EP_WALKABLE_OVER 11
/* values for special configurable properties (depending on level settings) */
#define EP_EM_SLIPPERY_WALL 25
+/* values for special graphics properties (no effect on game engine) */
+#define EP_CAN_BE_CRUMBLED 26
+
/* values for pre-defined properties */
-#define EP_PLAYER 26
-#define EP_CAN_BE_CRUMBLED 27
-#define EP_CAN_MOVE 28
-#define EP_CAN_PASS_MAGIC_WALL 29
-#define EP_SWITCHABLE 30
-#define EP_DONT_TOUCH 31
-#define EP_ENEMY 32
-#define EP_DONT_GO_TO 33
-#define EP_CAN_EXPLODE 34
-#define EP_BD_ELEMENT 35
-#define EP_SP_ELEMENT 36
-#define EP_SB_ELEMENT 37
-#define EP_GEM 38
-#define EP_FOOD_DARK_YAMYAM 39
-#define EP_FOOD_PENGUIN 40
-#define EP_FOOD_PIG 41
-#define EP_HISTORIC_WALL 42
-#define EP_HISTORIC_SOLID 43
-#define EP_BELT 44
-#define EP_BELT_ACTIVE 45
-#define EP_BELT_SWITCH 46
-#define EP_TUBE 47
-#define EP_KEYGATE 48
-#define EP_AMOEBOID 49
-#define EP_AMOEBALIVE 50
-#define EP_HAS_CONTENT 51
-#define EP_ACTIVE_BOMB 52
-#define EP_INACTIVE 53
+#define EP_PLAYER 27
+#define EP_CAN_PASS_MAGIC_WALL 28
+#define EP_SWITCHABLE 29
+#define EP_DONT_TOUCH 30
+#define EP_ENEMY 31
+#define EP_DONT_GO_TO 32
+#define EP_BD_ELEMENT 33
+#define EP_SP_ELEMENT 34
+#define EP_SB_ELEMENT 35
+#define EP_GEM 36
+#define EP_FOOD_DARK_YAMYAM 37
+#define EP_FOOD_PENGUIN 38
+#define EP_FOOD_PIG 39
+#define EP_HISTORIC_WALL 40
+#define EP_HISTORIC_SOLID 41
+#define EP_BELT 42
+#define EP_BELT_ACTIVE 43
+#define EP_BELT_SWITCH 44
+#define EP_TUBE 45
+#define EP_KEYGATE 46
+#define EP_AMOEBOID 47
+#define EP_AMOEBALIVE 48
+#define EP_HAS_CONTENT 49
+#define EP_ACTIVE_BOMB 50
+#define EP_INACTIVE 51
/* values for derived properties (determined from properties above) */
-#define EP_ACCESSIBLE_OVER 54
-#define EP_ACCESSIBLE_INSIDE 55
-#define EP_ACCESSIBLE_UNDER 56
-#define EP_WALKABLE 57
-#define EP_PASSABLE 58
-#define EP_ACCESSIBLE 59
-#define EP_SNAPPABLE 60
-#define EP_WALL 61
-#define EP_SOLID_FOR_PUSHING 62
-#define EP_DRAGONFIRE_PROOF 63
-#define EP_EXPLOSION_PROOF 64
-
-#define NUM_ELEMENT_PROPERTIES 65
+#define EP_ACCESSIBLE_OVER 52
+#define EP_ACCESSIBLE_INSIDE 53
+#define EP_ACCESSIBLE_UNDER 54
+#define EP_WALKABLE 55
+#define EP_PASSABLE 56
+#define EP_ACCESSIBLE 57
+#define EP_SNAPPABLE 58
+#define EP_WALL 59
+#define EP_SOLID_FOR_PUSHING 60
+#define EP_DRAGONFIRE_PROOF 61
+#define EP_EXPLOSION_PROOF 62
+
+/* values for internal purpose only (level editor) */
+#define EP_WALK_TO_OBJECT 63
+
+#define NUM_ELEMENT_PROPERTIES 64
#define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32)
#define EP_BITFIELD_BASE 0
#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE)
#define IS_INDESTRUCTIBLE(e) HAS_PROPERTY(e, EP_INDESTRUCTIBLE)
#define IS_SLIPPERY(e) HAS_PROPERTY(e, EP_SLIPPERY)
+#define CAN_EXPLODE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE)
+#define CAN_MOVE(e) HAS_PROPERTY(e, EP_CAN_MOVE)
#define CAN_FALL(e) HAS_PROPERTY(e, EP_CAN_FALL)
#define CAN_SMASH(e) HAS_PROPERTY(e, EP_CAN_SMASH)
#define IS_WALKABLE_OVER(e) HAS_PROPERTY(e, EP_WALKABLE_OVER)
/* macros for special configurable properties */
#define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
+/* macros for special graphics properties */
+#define CAN_BE_CRUMBLED(e) HAS_PROPERTY(GFX_ELEMENT(e),EP_CAN_BE_CRUMBLED)
+
/* macros for pre-defined properties */
#define ELEM_IS_PLAYER(e) HAS_PROPERTY(e, EP_PLAYER)
-#define CAN_BE_CRUMBLED(e) HAS_PROPERTY(e, EP_CAN_BE_CRUMBLED)
-#define CAN_MOVE(e) HAS_PROPERTY(e, EP_CAN_MOVE)
#define CAN_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
#define IS_SWITCHABLE(e) HAS_PROPERTY(e, EP_SWITCHABLE)
#define DONT_TOUCH(e) HAS_PROPERTY(e, EP_DONT_TOUCH)
#define IS_ENEMY(e) HAS_PROPERTY(e, EP_ENEMY)
#define DONT_GO_TO(e) HAS_PROPERTY(e, EP_DONT_GO_TO)
-#define IS_CAN_EXPLODE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE)
#define IS_BD_ELEMENT(e) HAS_PROPERTY(e, EP_BD_ELEMENT)
#define IS_SP_ELEMENT(e) HAS_PROPERTY(e, EP_SP_ELEMENT)
#define IS_SB_ELEMENT(e) HAS_PROPERTY(e, EP_SB_ELEMENT)
#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
(e) <= EL_CUSTOM_END)
+#define GFX_ELEMENT(e) (IS_CUSTOM_ELEMENT(e) && \
+ CUSTOM_ELEMENT_INFO(e).use_gfx_element ? \
+ CUSTOM_ELEMENT_INFO(e).gfx_element : e)
+
#define IS_PLAYER(x,y) (ELEM_IS_PLAYER(StorePlayer[x][y]))
#define IS_FREE(x,y) (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x,y))
struct CustomElementChangeInfo
{
- unsigned long events; /* bitfield for change events */
+ unsigned long events; /* bitfield for change events */
- short successor; /* new custom 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) */
- int delay_fixed; /* added frame delay before changed (fixed) */
- int delay_random; /* added frame delay before changed (random) */
+ short successor; /* new custom element after change */
};
struct CustomElementInfo
{
+ boolean use_template; /* use all properties from template file */
+
+ boolean use_gfx_element;
+ short gfx_element; /* optional custom graphic element */
+
+ int move_direction; /* direction movable element moves to */
+
+ int walk_to_action; /* only for level editor; not stored */
+ int walkable_layer; /* only for level editor; not stored */
+
+ int content[3][3]; /* new elements after explosion */
+
struct CustomElementChangeInfo change;
};
char name[MAX_LEVEL_NAME_LEN + 1];
char author[MAX_LEVEL_AUTHOR_LEN + 1];
int score[LEVEL_SCORE_ELEMENTS];
- int yam_content[MAX_ELEMENT_CONTENTS][3][3];
- int num_yam_contents;
+ int yamyam_content[MAX_ELEMENT_CONTENTS][3][3];
+ int num_yamyam_contents;
int amoeba_speed;
int amoeba_content;
int time_magic_wall;
int initial_move_delay_value;
/* variable within running game */
- int yam_content_nr;
+ int yamyam_content_nr;
boolean magic_wall_active;
int magic_wall_time_left;
int light_time_left;