#define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
#define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
-/* property values */
-#define EP_AMOEBALIVE 0
-#define EP_AMOEBOID 1
-#define EP_CAN_BE_CRUMBLED 2
-#define EP_PFORTE 3
-#define EP_SOLID 4
+/* values for configurable properties (custom elem's only, else pre-defined) */
+#define EP_DIGGABLE 0
+#define EP_COLLECTIBLE 1
+#define EP_DONT_GO_TO 2
+#define EP_ENEMY 3
+#define EP_DONT_TOUCH 4
#define EP_INDESTRUCTIBLE 5
#define EP_SLIPPERY 6
-#define EP_ENEMY 7
-#define EP_MAUER 8
+#define EP_CAN_EXPLODE 7
+#define EP_CAN_MOVE 8
#define EP_CAN_FALL 9
#define EP_CAN_SMASH 10
-#define EP_CAN_CHANGE 11
-#define EP_CAN_MOVE 12
-#define EP_COULD_MOVE 13
-#define EP_DONT_TOUCH 14
-#define EP_DONT_GO_TO 15
-#define EP_FOOD_DARK_YAMYAM 16
-#define EP_EM_SLIPPERY_WALL 17
-#define EP_BD_ELEMENT 18
-#define EP_SB_ELEMENT 19
-#define EP_GEM 20
-#define EP_INACTIVE 21
-#define EP_EXPLOSIVE 22
-#define EP_FOOD_PENGUIN 23
+#define EP_WALKABLE_OVER 11
+#define EP_WALKABLE_INSIDE 12
+#define EP_WALKABLE_UNDER 13
+#define EP_PASSABLE_OVER 14
+#define EP_PASSABLE_INSIDE 15
+#define EP_PASSABLE_UNDER 16
+#define EP_CHANGEABLE 17
+#define EP_UNUSED_18 18
+#define EP_UNUSED_19 19
+#define EP_UNUSED_20 20
+#define EP_UNUSED_21 21
+#define EP_UNUSED_22 22
+#define EP_UNUSED_23 23
#define EP_PUSHABLE 24
-#define EP_PLAYER 25
-#define EP_WALKABLE_OVER 26
-#define EP_DIGGABLE 27
-#define EP_COLLECTIBLE 28
-#define EP_WALKABLE_THROUGH 29
-#define EP_OVER_PLAYER 30
-#define EP_ACTIVE_BOMB 31
-
-#define EP_BELT 32
-#define EP_BELT_ACTIVE 33
-#define EP_BELT_SWITCH 34
-#define EP_WALKABLE_UNDER 35
-#define EP_SP_ELEMENT 36
-#define EP_HAS_CONTENT 37
-#define EP_SOLID_NEW 38
-
-#define NUM_ELEMENT_PROPERTIES 39
+
+/* 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 27
+#define EP_CAN_PASS_MAGIC_WALL 28
+#define EP_SWITCHABLE 29
+#define EP_BD_ELEMENT 30
+#define EP_SP_ELEMENT 31
+#define EP_SB_ELEMENT 32
+#define EP_GEM 33
+#define EP_FOOD_DARK_YAMYAM 34
+#define EP_FOOD_PENGUIN 35
+#define EP_FOOD_PIG 36
+#define EP_HISTORIC_WALL 37
+#define EP_HISTORIC_SOLID 38
+#define EP_BELT 39
+#define EP_BELT_ACTIVE 40
+#define EP_BELT_SWITCH 41
+#define EP_TUBE 42
+#define EP_KEYGATE 43
+#define EP_AMOEBOID 44
+#define EP_AMOEBALIVE 45
+#define EP_HAS_CONTENT 46
+#define EP_ACTIVE_BOMB 47
+#define EP_INACTIVE 48
+
+/* values for derived properties (determined from properties above) */
+#define EP_ACCESSIBLE_OVER 49
+#define EP_ACCESSIBLE_INSIDE 50
+#define EP_ACCESSIBLE_UNDER 51
+#define EP_WALKABLE 52
+#define EP_PASSABLE 53
+#define EP_ACCESSIBLE 54
+#define EP_SNAPPABLE 55
+#define EP_WALL 56
+#define EP_SOLID_FOR_PUSHING 57
+#define EP_DRAGONFIRE_PROOF 58
+#define EP_EXPLOSION_PROOF 59
+
+/* values for internal purpose only (level editor) */
+#define EP_WALK_TO_OBJECT 60
+#define EP_DEADLY 61
+
+#define NUM_ELEMENT_PROPERTIES 62
#define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32)
#define EP_BITFIELD_BASE 0
+#define EP_BITMASK_DEFAULT 0
+
#define PROPERTY_BIT(p) (1 << ((p) % 32))
-#define PROPERTY_VAR(e, p) (Properties[e][(p) / 32])
-#define HAS_PROPERTY(e, p) ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
-#define SET_PROPERTY(e, p, v) ((v) ? \
+#define PROPERTY_VAR(e,p) (Properties[e][(p) / 32])
+#define HAS_PROPERTY(e,p) ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
+#define SET_PROPERTY(e,p,v) ((v) ? \
(PROPERTY_VAR(e,p) |= PROPERTY_BIT(p)) : \
(PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p)))
-/* property bit masks */
-#define EP_BIT_AMOEBALIVE PROPERTY_BIT(EP_AMOEBALIVE)
-#define EP_BIT_AMOEBOID PROPERTY_BIT(EP_AMOEBOID)
-#define EP_BIT_CAN_BE_CRUMBLED PROPERTY_BIT(EP_CAN_BE_CRUMBLED)
-#define EP_BIT_PFORTE PROPERTY_BIT(EP_PFORTE)
-#define EP_BIT_SOLID PROPERTY_BIT(EP_SOLID)
-#define EP_BIT_INDESTRUCTIBLE PROPERTY_BIT(EP_INDESTRUCTIBLE)
-#define EP_BIT_SLIPPERY PROPERTY_BIT(EP_SLIPPERY)
-#define EP_BIT_ENEMY PROPERTY_BIT(EP_ENEMY)
-#define EP_BIT_MAUER PROPERTY_BIT(EP_MAUER)
-#define EP_BIT_CAN_FALL PROPERTY_BIT(EP_CAN_FALL)
-#define EP_BIT_CAN_SMASH PROPERTY_BIT(EP_CAN_SMASH)
-#define EP_BIT_CAN_CHANGE PROPERTY_BIT(EP_CAN_CHANGE)
-#define EP_BIT_CAN_MOVE PROPERTY_BIT(EP_CAN_MOVE)
-#define EP_BIT_COULD_MOVE PROPERTY_BIT(EP_COULD_MOVE)
-#define EP_BIT_DONT_TOUCH PROPERTY_BIT(EP_DONT_TOUCH)
-#define EP_BIT_DONT_GO_TO PROPERTY_BIT(EP_DONT_GO_TO)
-#define EP_BIT_FOOD_DARK_YAMYAM PROPERTY_BIT(EP_FOOD_DARK_YAMYAM)
-#define EP_BIT_EM_SLIPPERY_WALL PROPERTY_BIT(EP_EM_SLIPPERY_WALL)
-#define EP_BIT_BD_ELEMENT PROPERTY_BIT(EP_BD_ELEMENT)
-#define EP_BIT_SB_ELEMENT PROPERTY_BIT(EP_SB_ELEMENT)
-#define EP_BIT_GEM PROPERTY_BIT(EP_GEM)
-#define EP_BIT_INACTIVE PROPERTY_BIT(EP_INACTIVE)
-#define EP_BIT_EXPLOSIVE PROPERTY_BIT(EP_EXPLOSIVE)
-#define EP_BIT_FOOD_PENGUIN PROPERTY_BIT(EP_FOOD_PENGUIN)
-#define EP_BIT_PUSHABLE PROPERTY_BIT(EP_PUSHABLE)
-#define EP_BIT_PLAYER PROPERTY_BIT(EP_PLAYER)
-#define EP_BIT_WALKABLE_OVER PROPERTY_BIT(EP_WALKABLE_OVER)
-#define EP_BIT_DIGGABLE PROPERTY_BIT(EP_DIGGABLE)
-#define EP_BIT_COLLECTIBLE PROPERTY_BIT(EP_COLLECTIBLE)
-#define EP_BIT_WALKABLE_THROUGH PROPERTY_BIT(EP_WALKABLE_THROUGH)
-#define EP_BIT_OVER_PLAYER PROPERTY_BIT(EP_OVER_PLAYER)
-#define EP_BIT_ACTIVE_BOMB PROPERTY_BIT(EP_ACTIVE_BOMB)
-
-#define EP_BIT_BELT PROPERTY_BIT(EP_BELT)
-#define EP_BIT_BELT_ACTIVE PROPERTY_BIT(EP_BELT_ACTIVE)
-#define EP_BIT_BELT_SWITCH PROPERTY_BIT(EP_BELT_SWITCH)
-#define EP_BIT_WALKABLE_UNDER PROPERTY_BIT(EP_WALKABLE_UNDER)
-#define EP_BIT_SP_ELEMENT PROPERTY_BIT(EP_SP_ELEMENT)
-#define EP_BIT_HAS_CONTENT PROPERTY_BIT(EP_HAS_CONTENT)
-#define EP_BIT_SOLID_NEW PROPERTY_BIT(EP_SOLID_NEW)
+/* values for change events for custom elements */
+#define CE_DELAY 0
-#define EP_BITMASK_DEFAULT 0
+#define NUM_CHANGE_EVENTS 1
-/* property macros */
-#define IS_AMOEBALIVE(e) HAS_PROPERTY(e, EP_AMOEBALIVE)
-#define IS_AMOEBOID(e) HAS_PROPERTY(e, EP_AMOEBOID)
-#define CAN_BE_CRUMBLED(e) HAS_PROPERTY(e, EP_CAN_BE_CRUMBLED)
-#define IS_PFORTE(e) HAS_PROPERTY(e, EP_PFORTE)
-#define IS_SOLID(e) HAS_PROPERTY(e, EP_SOLID)
+#define CE_BITMASK_DEFAULT 0
+
+#define CH_EVENT_BIT(c) (1 << (c))
+#define CH_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 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)
+
+
+/* macros for configurable properties */
+#define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE)
+#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE)
+#define DONT_GO_TO(e) HAS_PROPERTY(e, EP_DONT_GO_TO)
+#define IS_ENEMY(e) HAS_PROPERTY(e, EP_ENEMY)
+#define DONT_TOUCH(e) HAS_PROPERTY(e, EP_DONT_TOUCH)
#define IS_INDESTRUCTIBLE(e) HAS_PROPERTY(e, EP_INDESTRUCTIBLE)
#define IS_SLIPPERY(e) HAS_PROPERTY(e, EP_SLIPPERY)
-#define IS_ENEMY(e) HAS_PROPERTY(e, EP_ENEMY)
-#define IS_MAUER(e) HAS_PROPERTY(e, EP_MAUER)
+#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 CAN_CHANGE(e) HAS_PROPERTY(e, EP_CAN_CHANGE)
-#define CAN_MOVE(e) HAS_PROPERTY(e, EP_CAN_MOVE)
-#define COULD_MOVE(e) HAS_PROPERTY(e, EP_COULD_MOVE)
-#define DONT_TOUCH(e) HAS_PROPERTY(e, EP_DONT_TOUCH)
-#define DONT_GO_TO(e) HAS_PROPERTY(e, EP_DONT_GO_TO)
-#define IS_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM)
+#define IS_WALKABLE_OVER(e) HAS_PROPERTY(e, EP_WALKABLE_OVER)
+#define IS_WALKABLE_INSIDE(e) HAS_PROPERTY(e, EP_WALKABLE_INSIDE)
+#define IS_WALKABLE_UNDER(e) HAS_PROPERTY(e, EP_WALKABLE_UNDER)
+#define IS_PASSABLE_OVER(e) HAS_PROPERTY(e, EP_PASSABLE_OVER)
+#define IS_PASSABLE_INSIDE(e) HAS_PROPERTY(e, EP_PASSABLE_INSIDE)
+#define IS_PASSABLE_UNDER(e) HAS_PROPERTY(e, EP_PASSABLE_UNDER)
+#define IS_CHANGEABLE(e) HAS_PROPERTY(e, EP_CHANGEABLE)
+#define IS_PUSHABLE(e) HAS_PROPERTY(e, EP_PUSHABLE)
+
+/* 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_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
+#define IS_SWITCHABLE(e) HAS_PROPERTY(e, EP_SWITCHABLE)
#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_GEM(e) HAS_PROPERTY(e, EP_GEM)
-#define IS_INACTIVE(e) HAS_PROPERTY(e, EP_INACTIVE)
-#define IS_EXPLOSIVE(e) HAS_PROPERTY(e, EP_EXPLOSIVE)
+#define IS_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM)
#define IS_FOOD_PENGUIN(e) HAS_PROPERTY(e, EP_FOOD_PENGUIN)
-#define IS_PUSHABLE(e) HAS_PROPERTY(e, EP_PUSHABLE)
-#define ELEM_IS_PLAYER(e) HAS_PROPERTY(e, EP_PLAYER)
-#define IS_WALKABLE_OVER(e) HAS_PROPERTY(e, EP_WALKABLE_OVER)
-#define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE)
-#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE)
-#define IS_WALKABLE_THROUGH(e) HAS_PROPERTY(e, EP_WALKABLE_THROUGH)
-#define IS_OVER_PLAYER(e) HAS_PROPERTY(e, EP_OVER_PLAYER)
-#define IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB)
-
+#define IS_FOOD_PIG(e) HAS_PROPERTY(e, EP_FOOD_PIG)
+#define IS_HISTORIC_WALL(e) HAS_PROPERTY(e, EP_HISTORIC_WALL)
+#define IS_HISTORIC_SOLID(e) HAS_PROPERTY(e, EP_HISTORIC_SOLID)
#define IS_BELT(e) HAS_PROPERTY(e, EP_BELT)
#define IS_BELT_ACTIVE(e) HAS_PROPERTY(e, EP_BELT_ACTIVE)
#define IS_BELT_SWITCH(e) HAS_PROPERTY(e, EP_BELT_SWITCH)
-#define IS_WALKABLE_UNDER(e) HAS_PROPERTY(e, EP_WALKABLE_UNDER)
-#define IS_SP_ELEMENT(e) HAS_PROPERTY(e, EP_SP_ELEMENT)
+#define IS_TUBE(e) HAS_PROPERTY(e, EP_TUBE)
+#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 IS_SOLID_NEW(e) HAS_PROPERTY(e, EP_SOLID_NEW)
+#define IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB)
+#define IS_INACTIVE(e) HAS_PROPERTY(e, EP_INACTIVE)
-#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
+/* macros for derived properties */
+#define IS_ACCESSIBLE_OVER(e) HAS_PROPERTY(e, EP_ACCESSIBLE_OVER)
+#define IS_ACCESSIBLE_INSIDE(e) HAS_PROPERTY(e, EP_ACCESSIBLE_INSIDE)
+#define IS_ACCESSIBLE_UNDER(e) HAS_PROPERTY(e, EP_ACCESSIBLE_UNDER)
+#define IS_SNAPPABLE(e) HAS_PROPERTY(e, EP_SNAPPABLE)
+#define IS_WALKABLE(e) HAS_PROPERTY(e, EP_WALKABLE)
+#define IS_PASSABLE(e) HAS_PROPERTY(e, EP_PASSABLE)
+#define IS_ACCESSIBLE(e) HAS_PROPERTY(e, EP_ACCESSIBLE)
+#define IS_WALL(e) HAS_PROPERTY(e, EP_WALL)
+#define IS_SOLID_FOR_PUSHING(e) HAS_PROPERTY(e, EP_SOLID_FOR_PUSHING)
+#define IS_DRAGONFIRE_PROOF(e) HAS_PROPERTY(e, EP_DRAGONFIRE_PROOF)
+#define IS_EXPLOSION_PROOF(e) HAS_PROPERTY(e, EP_EXPLOSION_PROOF)
+
+#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
(e) <= EL_CUSTOM_END)
+#define GFX_ELEMENT(e) (element_info[e].use_gfx_element ? \
+ 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))
#define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER_1])
#define SHIELD_ON(p) ((p)->shield_normal_time_left > 0)
-#define PROTECTED_FIELD(x,y) (IS_WALKABLE_UNDER(Feld[x][y]) && \
+#define PROTECTED_FIELD(x,y) (IS_ACCESSIBLE_INSIDE(Feld[x][y]) && \
IS_INDESTRUCTIBLE(Feld[x][y]))
#define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
PROTECTED_FIELD(x, y))
#define IS_LOOP_SOUND(s) (sound_info[s].loop)
-#if 0
-
-/* Bitmaps with graphic file */
-#define PIX_BACK 0
-#define PIX_DOOR 1
-#define PIX_TOONS 2
-#define PIX_FONT_BIG 3
-#define PIX_FONT_SMALL 4
-#define PIX_FONT_MEDIUM 5
-#define PIX_FONT_EM 6
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR 7
-#define PIX_DB_FIELD 8
-
-#define NUM_PICTURES 7
-#define NUM_BITMAPS 9
-
-#else
-
-/* Bitmaps with graphic file */
-#define PIX_BACK 0
-#define PIX_ELEMENTS 1
-#define PIX_DOOR 2
-#define PIX_HEROES 3
-#define PIX_TOONS 4
-#define PIX_SP 5
-#define PIX_DC 6
-#define PIX_MORE 7
-#define PIX_FONT_BIG 8
-#define PIX_FONT_SMALL 9
-#define PIX_FONT_MEDIUM 10
-#define PIX_FONT_EM 11
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR 12
-#define PIX_DB_FIELD 13
-
-#define NUM_PICTURES 12
-#define NUM_BITMAPS 14
-
-#endif
-
/* boundaries of arrays etc. */
#define MAX_LEVEL_NAME_LEN 32
#define MAX_LEVEL_AUTHOR_LEN 32
#define MAX_TAPELEN (1000 * 50) /* max. time * framerate */
#define MAX_SCORE_ENTRIES 100
-#if 0
-#define MAX_ELEMENTS 700 /* 500 static + 200 runtime */
-#define MAX_GRAPHICS 1536 /* see below: NUM_TILES */
-#endif
#define MAX_NUM_AMOEBA 100
/* values for elements with content */
#define NUM_ACTIONS 26
-/* values for special image configuration suffixes */
+/* values for special image configuration suffixes (must match game mode) */
#define GFX_SPECIAL_ARG_MAIN 0
#define GFX_SPECIAL_ARG_LEVELS 1
#define GFX_SPECIAL_ARG_SCORES 2
#define FONT_TITLE_2 5
#define FONT_MENU_1 6
#define FONT_MENU_2 7
-#define FONT_TEXT_1 8
-#define FONT_TEXT_2 9
-#define FONT_TEXT_3 10
-#define FONT_TEXT_4 11
-#define FONT_INPUT_1 12
-#define FONT_INPUT_1_ACTIVE 13
-#define FONT_INPUT_2 14
-#define FONT_INPUT_2_ACTIVE 15
-#define FONT_OPTION_OFF 16
-#define FONT_OPTION_ON 17
-#define FONT_VALUE_1 18
-#define FONT_VALUE_2 19
-#define FONT_VALUE_OLD 20
-#define FONT_LEVEL_NUMBER 21
-#define FONT_TAPE_RECORDER 22
-#define FONT_GAME_INFO 23
-
-#define NUM_FONTS 24
+#define FONT_TEXT_1_ACTIVE 8
+#define FONT_TEXT_2_ACTIVE 9
+#define FONT_TEXT_3_ACTIVE 10
+#define FONT_TEXT_4_ACTIVE 11
+#define FONT_TEXT_1 12
+#define FONT_TEXT_2 13
+#define FONT_TEXT_3 14
+#define FONT_TEXT_4 15
+#define FONT_INPUT_1_ACTIVE 16
+#define FONT_INPUT_2_ACTIVE 17
+#define FONT_INPUT_1 18
+#define FONT_INPUT_2 19
+#define FONT_OPTION_OFF 20
+#define FONT_OPTION_ON 21
+#define FONT_VALUE_1 22
+#define FONT_VALUE_2 23
+#define FONT_VALUE_OLD 24
+#define FONT_LEVEL_NUMBER 25
+#define FONT_TAPE_RECORDER 26
+#define FONT_GAME_INFO 27
+
+#define NUM_FONTS 28
#define NUM_INITIAL_FONTS 4
-/* values for game_status */
-#define EXITGAME 0
-#define MAINMENU 1
-#define PLAYING 2
-#define LEVELED 3
-#define HELPSCREEN 4
-#define CHOOSELEVEL 5
-#define TYPENAME 6
-#define HALLOFFAME 7
-#define SETUP 8
-#define PSEUDO_PREVIEW 9
-#define PSEUDO_DOOR 10
+/* values for game_status (must match special image configuration suffixes) */
+#define GAME_MODE_MAIN 0
+#define GAME_MODE_LEVELS 1
+#define GAME_MODE_SCORES 2
+#define GAME_MODE_EDITOR 3
+#define GAME_MODE_INFO 4
+#define GAME_MODE_SETUP 5
+#define GAME_MODE_PSEUDO_DOOR 6
+#define GAME_MODE_PSEUDO_PREVIEW 7
+
+/* there are no special config file suffixes for these modes */
+#define GAME_MODE_PLAYING 8
+#define GAME_MODE_PSEUDO_TYPENAME 9
+#define GAME_MODE_QUIT 10
#define PROGRAM_VERSION_MAJOR 2
#define PROGRAM_VERSION_MINOR 2
#define PROGRAM_VERSION_PATCH 0
-#define PROGRAM_VERSION_STRING "2.2.0rc4"
+#define PROGRAM_VERSION_RELEASE 7
+#define PROGRAM_VERSION_STRING "2.2.0rc7"
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
#define GAME_VERSION_1_4 FILE_VERSION_1_4
#define GAME_VERSION_2_0 FILE_VERSION_2_0
-#define GAME_VERSION_ACTUAL VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
+#define GAME_VERSION_ACTUAL RELEASE_IDENT(PROGRAM_VERSION_MAJOR, \
PROGRAM_VERSION_MINOR, \
- PROGRAM_VERSION_PATCH)
+ PROGRAM_VERSION_PATCH, \
+ PROGRAM_VERSION_RELEASE)
/* values for game_emulation */
#define EMU_NONE 0
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;
boolean gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
- short custom_element_successor[NUM_CUSTOM_ELEMENTS];
-
boolean no_level_file;
};
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;
int num_toons;
- int menu_draw_xoffset;
- int menu_draw_yoffset;
- int menu_draw_xoffset_MAIN;
- int menu_draw_yoffset_MAIN;
-
- int door_step_offset;
- int door_step_delay;
-
float frames_per_second;
boolean fps_slowdown;
int fps_slowdown_factor;
};
+struct MenuInfo
+{
+ int draw_xoffset_default;
+ int draw_yoffset_default;
+ int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
+ int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+};
+
+struct DoorInfo
+{
+ int step_offset;
+ int step_delay;
+};
+
+struct ElementChangeInfo
+{
+ unsigned long events; /* bitfield for change events */
+
+ 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 successor; /* new custom element after change */
+};
+
struct ElementInfo
{
+ /* ---------- token and description strings ---------- */
+
char *token_name; /* element token used in config files */
char *class_name; /* element class used in config files */
char *editor_description; /* short description for level editor */
char *custom_description; /* custom description for level editor */
+ /* ---------- graphic and sound definitions ---------- */
+
int graphic[NUM_ACTIONS]; /* default graphics for several actions */
int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
/* special graphics for left/right/up/down */
/* special graphics for certain screens */
int sound[NUM_ACTIONS]; /* default sounds for several actions */
+
+ /* ---------- special element property values ---------- */
+
+ boolean use_template; /* use all properties from template file */
+
+ boolean use_gfx_element;
+ short gfx_element; /* optional custom graphic element */
+
+ int score; /* score for collection, smashing, ... */
+
+ int push_delay_fixed; /* constant frame delay for pushing */
+ int push_delay_random; /* additional random frame delay for pushing */
+ int move_delay_fixed; /* constant frame delay for moving */
+ int move_delay_random; /* additional random frame delay for moving */
+
+ int move_pattern; /* direction movable element moves to */
+ int move_direction_initial; /* initial direction element moves to */
+
+ int walk_to_action; /* only for level editor; not stored */
+ int deadliness; /* only for level editor; not stored */
+ int walkable_layer; /* only for level editor; not stored */
+
+ int content[3][3]; /* new elements after explosion */
+
+ struct ElementChangeInfo change;
};
struct FontInfo
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];
+extern short Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern struct TapeInfo tape;
extern struct GameInfo game;
extern struct GlobalInfo global;
+extern struct MenuInfo menu;
+extern struct DoorInfo door;
extern struct ElementInfo element_info[];
extern struct ElementActionInfo element_action_info[];
extern struct ElementDirectionInfo element_direction_info[];
extern struct SpecialSuffixInfo special_suffix_info[];
+extern struct TokenIntPtrInfo image_config_vars[];
extern struct FontInfo font_info[];
extern struct GraphicInfo *graphic_info;
extern struct SoundInfo *sound_info;