X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=e440a8ee18cce9192d0c58b9aa6904119a58c64b;hb=ad15815ec04f42779d0717a6d291f93b8e847d39;hp=c92fe607dd11f84072725a93077b7cc05312636f;hpb=b303c5bef445371b5ae5916b36061c9796254a4c;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index c92fe607..e440a8ee 100644 --- a/src/main.h +++ b/src/main.h @@ -14,9 +14,6 @@ #ifndef MAIN_H #define MAIN_H -#include -#include -#include #include #include #include @@ -33,6 +30,7 @@ #define IMG_UNDEFINED (-1) #define IMG_EMPTY IMG_EMPTY_SPACE #define IMG_SP_EMPTY IMG_SP_EMPTY_SPACE +#define IMG_EXPLOSION IMG_DEFAULT_EXPLODING #define IMG_CHAR_START IMG_CHAR_SPACE #define IMG_CUSTOM_START IMG_CUSTOM_1 @@ -62,44 +60,35 @@ /* values for configurable properties (custom elem's only, else pre-defined) */ #define EP_DIGGABLE 0 -#define EP_COLLECTIBLE 1 -#define EP_UNUSED_2 2 -#define EP_UNUSED_3 3 -#define EP_UNUSED_4 4 +#define EP_COLLECTIBLE_ONLY 1 +#define EP_DONT_RUN_INTO 2 +#define EP_DONT_COLLIDE_WITH 3 +#define EP_DONT_TOUCH 4 #define EP_INDESTRUCTIBLE 5 #define EP_SLIPPERY 6 -#define EP_UNUSED_7 7 -#define EP_UNUSED_8 8 +#define EP_CAN_CHANGE 7 +#define EP_CAN_MOVE 8 #define EP_CAN_FALL 9 -#define EP_CAN_SMASH 10 -#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_CAN_SMASH_PLAYER 10 +#define EP_CAN_SMASH_ENEMIES 11 +#define EP_CAN_SMASH_EVERYTHING 12 +#define EP_CAN_EXPLODE_BY_FIRE 13 +#define EP_CAN_EXPLODE_SMASHED 14 +#define EP_CAN_EXPLODE_IMPACT 15 +#define EP_WALKABLE_OVER 16 +#define EP_WALKABLE_INSIDE 17 +#define EP_WALKABLE_UNDER 18 +#define EP_PASSABLE_OVER 19 +#define EP_PASSABLE_INSIDE 20 +#define EP_PASSABLE_UNDER 21 +#define EP_DROPPABLE 22 +#define EP_CAN_EXPLODE_1X1 23 #define EP_PUSHABLE 24 -/* values for special configurable properties (depending on level settings) */ -#define EP_EM_SLIPPERY_WALL 25 - /* 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_PLAYER 32 +#define EP_CAN_PASS_MAGIC_WALL 33 +#define EP_SWITCHABLE 34 #define EP_BD_ELEMENT 35 #define EP_SP_ELEMENT 36 #define EP_SB_ELEMENT 37 @@ -109,31 +98,47 @@ #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_CLASSIC_ENEMY 44 +#define EP_BELT 45 +#define EP_BELT_ACTIVE 46 +#define EP_BELT_SWITCH 47 +#define EP_TUBE 48 +#define EP_KEYGATE 49 +#define EP_AMOEBOID 50 +#define EP_AMOEBALIVE 51 +#define EP_HAS_CONTENT 52 +#define EP_ACTIVE_BOMB 53 +#define EP_INACTIVE 54 + +/* values for special configurable properties (depending on level settings) */ +#define EP_EM_SLIPPERY_WALL 55 + +/* values for special graphics properties (no effect on game engine) */ +#define EP_GFX_CRUMBLED 56 /* 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 57 +#define EP_ACCESSIBLE_INSIDE 58 +#define EP_ACCESSIBLE_UNDER 59 +#define EP_WALKABLE 60 +#define EP_PASSABLE 61 +#define EP_ACCESSIBLE 62 +#define EP_COLLECTIBLE 63 +#define EP_SNAPPABLE 64 +#define EP_WALL 65 +#define EP_SOLID_FOR_PUSHING 66 +#define EP_DRAGONFIRE_PROOF 67 +#define EP_EXPLOSION_PROOF 68 +#define EP_CAN_SMASH 69 +#define EP_CAN_EXPLODE 70 +#define EP_CAN_EXPLODE_3X3 71 + +/* values for internal purpose only (level editor) */ +#define EP_EXPLODE_RESULT 72 +#define EP_WALK_TO_OBJECT 73 +#define EP_DEADLY 74 + +#define NUM_ELEMENT_PROPERTIES 75 #define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32) #define EP_BITFIELD_BASE 0 @@ -141,41 +146,140 @@ #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))) + +/* values for change events for custom elements (stored in level file) */ +#define CE_DELAY 0 +#define CE_TOUCHED_BY_PLAYER 1 +#define CE_PRESSED_BY_PLAYER 2 +#define CE_PUSHED_BY_PLAYER 3 +#define CE_DROPPED_BY_PLAYER 4 +#define CE_COLLISION 5 +#define CE_IMPACT 6 +#define CE_SMASHED 7 +#define CE_OTHER_IS_TOUCHING 8 +#define CE_OTHER_IS_CHANGING 9 +#define CE_OTHER_IS_EXPLODING 10 +#define CE_OTHER_GETS_TOUCHED 11 +#define CE_OTHER_GETS_PRESSED 12 +#define CE_OTHER_GETS_PUSHED 13 +#define CE_OTHER_GETS_COLLECTED 14 +#define CE_OTHER_GETS_DROPPED 15 +#define CE_BY_PLAYER 16 /* obsolete; now CE_BY_DIRECT_ACTION */ +#define CE_BY_COLLISION 17 /* obsolete; now CE_BY_DIRECT_ACTION */ +#define CE_BY_OTHER_ACTION 18 /* activates other element events */ +#define CE_BY_DIRECT_ACTION 19 /* activates direct element events */ +#define CE_OTHER_GETS_DIGGED 20 +#define CE_ENTERED_BY_PLAYER 21 +#define CE_LEFT_BY_PLAYER 22 +#define CE_OTHER_GETS_ENTERED 23 +#define CE_OTHER_GETS_LEFT 24 +#define CE_SWITCHED 25 +#define CE_OTHER_IS_SWITCHING 26 + +#define NUM_CHANGE_EVENTS 27 + +#define CE_BITMASK_DEFAULT 0 + +#define CH_EVENT_BIT(c) (1 << (c)) +#define CH_EVENT_VAR(e) (element_info[e].change->events) +#define CH_ANY_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 HAS_ANY_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \ + (CH_ANY_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) + +/* values for change sides for custom elements */ +#define CH_SIDE_NONE MV_NO_MOVING +#define CH_SIDE_LEFT MV_LEFT +#define CH_SIDE_RIGHT MV_RIGHT +#define CH_SIDE_TOP MV_UP +#define CH_SIDE_BOTTOM MV_DOWN +#define CH_SIDE_LEFT_RIGHT MV_HORIZONTAL +#define CH_SIDE_TOP_BOTTOM MV_VERTICAL +#define CH_SIDE_ANY MV_ANY_DIRECTION + +/* values for change power for custom elements */ +#define CP_NON_DESTRUCTIVE 0 +#define CP_HALF_DESTRUCTIVE 1 +#define CP_FULL_DESTRUCTIVE 2 + +/* values for special move patterns (bits 0-3: basic move directions) */ +#define MV_BIT_TOWARDS_PLAYER 4 +#define MV_BIT_AWAY_FROM_PLAYER 5 +#define MV_BIT_ALONG_LEFT_SIDE 6 +#define MV_BIT_ALONG_RIGHT_SIDE 7 +#define MV_BIT_TURNING_LEFT 8 +#define MV_BIT_TURNING_RIGHT 9 +#define MV_BIT_WHEN_PUSHED 10 + +/* values for special move patterns for custom elements */ +#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT) +#define MV_VERTICAL (MV_UP | MV_DOWN) +#define MV_ALL_DIRECTIONS (MV_HORIZONTAL | MV_VERTICAL) +#define MV_ANY_DIRECTION (MV_ALL_DIRECTIONS) +#define MV_TOWARDS_PLAYER (1 << MV_BIT_TOWARDS_PLAYER) +#define MV_AWAY_FROM_PLAYER (1 << MV_BIT_AWAY_FROM_PLAYER) +#define MV_ALONG_LEFT_SIDE (1 << MV_BIT_ALONG_LEFT_SIDE) +#define MV_ALONG_RIGHT_SIDE (1 << MV_BIT_ALONG_RIGHT_SIDE) +#define MV_TURNING_LEFT (1 << MV_BIT_TURNING_LEFT) +#define MV_TURNING_RIGHT (1 << MV_BIT_TURNING_RIGHT) +#define MV_WHEN_PUSHED (1 << MV_BIT_WHEN_PUSHED) + +/* values for slippery property for custom elements */ +#define SLIPPERY_ANY_RANDOM 0 +#define SLIPPERY_ANY_LEFT_RIGHT 1 +#define SLIPPERY_ANY_RIGHT_LEFT 2 +#define SLIPPERY_ONLY_LEFT 3 +#define SLIPPERY_ONLY_RIGHT 4 + /* macros for configurable properties */ #define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE) -#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE) +#define IS_COLLECTIBLE_ONLY(e) HAS_PROPERTY(e, EP_COLLECTIBLE_ONLY) +#define DONT_RUN_INTO(e) HAS_PROPERTY(e, EP_DONT_RUN_INTO) +#define DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_DONT_COLLIDE_WITH) +#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 CAN_CHANGE(e) HAS_PROPERTY(e, EP_CAN_CHANGE) +#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_SMASH_PLAYER(e) HAS_PROPERTY(e, EP_CAN_SMASH_PLAYER) +#define CAN_SMASH_ENEMIES(e) HAS_PROPERTY(e, EP_CAN_SMASH_ENEMIES) +#define CAN_SMASH_EVERYTHING(e) HAS_PROPERTY(e, EP_CAN_SMASH_EVERYTHING) +#define CAN_EXPLODE_BY_FIRE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_FIRE) +#define CAN_EXPLODE_SMASHED(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_SMASHED) +#define CAN_EXPLODE_IMPACT(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_IMPACT) #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_DROPPABLE(e) HAS_PROPERTY(e, EP_DROPPABLE) +#define CAN_EXPLODE_1X1(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_1X1) #define IS_PUSHABLE(e) HAS_PROPERTY(e, EP_PUSHABLE) -#define IS_CHANGEABLE(e) HAS_PROPERTY(e, EP_CHANGEABLE) /* macros for special configurable properties */ #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) +/* macros for special graphics properties */ +#define GFX_CRUMBLED(e) HAS_PROPERTY(GFX_ELEMENT(e), EP_GFX_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) @@ -185,6 +289,7 @@ #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_CLASSIC_ENEMY(e) HAS_PROPERTY(e, EP_CLASSIC_ENEMY) #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) @@ -200,18 +305,29 @@ #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_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE) +#define IS_SNAPPABLE(e) HAS_PROPERTY(e, EP_SNAPPABLE) #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 CAN_SMASH(e) HAS_PROPERTY(e, EP_CAN_SMASH) +#define CAN_EXPLODE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE) +#define CAN_EXPLODE_3X3(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_3X3) -#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ +/* special macros used in game engine */ +#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ (e) <= EL_CUSTOM_END) +#define IS_ENVELOPE(e) ((e) >= EL_ENVELOPE_1 && \ + (e) <= EL_ENVELOPE_4) + +#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)) @@ -243,6 +359,9 @@ #define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ PROTECTED_FIELD(x, y)) +#define PLAYER_SWITCHING(p,x,y) ((p)->Switching && \ + (p)->switch_x == (x) && (p)->switch_y == (y)) + #define PLAYER_NR_GFX(g,i) ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1)) #define ANIM_FRAMES(g) (graphic_info[g].anim_frames) @@ -257,57 +376,28 @@ #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 +/* fundamental game speed values */ +#define GAME_FRAME_DELAY 20 /* frame delay in milliseconds */ +#define FFWD_FRAME_DELAY 10 /* 200% speed for fast forward */ +#define FRAMES_PER_SECOND (1000 / GAME_FRAME_DELAY) +#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */ +#define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */ /* 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_ELEMENT_NAME_LEN 32 +#define MAX_TAPELEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ #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 +#define MAX_INVENTORY_SIZE 1000 +#define MIN_ENVELOPE_XSIZE 1 +#define MIN_ENVELOPE_YSIZE 1 +#define MAX_ENVELOPE_XSIZE 30 +#define MAX_ENVELOPE_YSIZE 20 +#define MAX_ENVELOPE_TEXT_LEN (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE) +#define MIN_CHANGE_PAGES 1 +#define MAX_CHANGE_PAGES 16 /* values for elements with content */ #define MIN_ELEMENT_CONTENTS 1 @@ -316,13 +406,6 @@ #define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */ -/* fundamental game speed values */ -#define GAME_FRAME_DELAY 20 /* frame delay in milliseconds */ -#define FFWD_FRAME_DELAY 10 /* 200% speed for fast forward */ -#define FRAMES_PER_SECOND (1000 / GAME_FRAME_DELAY) -#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */ -#define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */ - /* often used screen positions */ #define SX 8 #define SY 8 @@ -368,12 +451,12 @@ #define EL_EMPTY EL_EMPTY_SPACE #define EL_SAND 1 #define EL_WALL 2 -#define EL_WALL_CRUMBLED 3 +#define EL_WALL_SLIPPERY 3 #define EL_ROCK 4 -#define EL_KEY_OBSOLETE 5 /* obsolete; mapped to EL_KEY_1 */ +#define EL_KEY_OBSOLETE 5 /* obsolete; now EL_KEY_1 */ #define EL_EMERALD 6 #define EL_EXIT_CLOSED 7 -#define EL_PLAYER_OBSOLETE 8 /* obsolete; mapped to EL_PLAYER_1 */ +#define EL_PLAYER_OBSOLETE 8 /* obsolete; now EL_PLAYER_1 */ #define EL_BUG 9 #define EL_SPACESHIP 10 #define EL_YAMYAM 11 @@ -495,7 +578,7 @@ #define EL_PIG 117 #define EL_DRAGON 118 -#define EL_EM_KEY_1_FILE 119 +#define EL_EM_KEY_1_FILE_OBSOLETE 119 /* obsolete; now EL_EM_KEY_1 */ #define EL_CHAR_START 120 #define EL_CHAR_ASCII0 (EL_CHAR_START - 32) @@ -517,9 +600,9 @@ #define EL_EM_GATE_3 205 #define EL_EM_GATE_4 206 -#define EL_EM_KEY_2_FILE 207 -#define EL_EM_KEY_3_FILE 208 -#define EL_EM_KEY_4_FILE 209 +#define EL_EM_KEY_2_FILE_OBSOLETE 207 /* obsolete; now EL_EM_KEY_2 */ +#define EL_EM_KEY_3_FILE_OBSOLETE 208 /* obsolete; now EL_EM_KEY_3 */ +#define EL_EM_KEY_4_FILE_OBSOLETE 209 /* obsolete; now EL_EM_KEY_4 */ #define EL_SP_START 210 #define EL_SP_EMPTY_SPACE (EL_SP_START + 0) @@ -615,7 +698,7 @@ #define EL_CONVEYOR_BELT_4_SWITCH_MIDDLE 293 #define EL_CONVEYOR_BELT_4_SWITCH_RIGHT 294 #define EL_LANDMINE 295 -#define EL_ENVELOPE 296 +#define EL_ENVELOPE_OBSOLETE 296 /* obsolete; now EL_ENVELOPE_1 */ #define EL_LIGHT_SWITCH 297 #define EL_LIGHT_SWITCH_ACTIVE 298 #define EL_SIGN_EXCLAMATION 299 @@ -634,7 +717,7 @@ #define EL_MOLE_RIGHT 312 #define EL_MOLE_UP 313 #define EL_MOLE_DOWN 314 -#define EL_STEELWALL_SLANTED 315 +#define EL_STEELWALL_SLIPPERY 315 #define EL_INVISIBLE_SAND 316 #define EL_DX_UNKNOWN_15 317 #define EL_DX_UNKNOWN_42 318 @@ -686,85 +769,96 @@ #define EL_UNUSED_358 358 #define EL_UNUSED_359 359 +/* ---------- begin of custom elements section ----------------------------- */ #define EL_CUSTOM_START 360 #include "conf_cus.h" /* include auto-generated data structure definitions */ -#define EL_CUSTOM_END (EL_CUSTOM_START + 127) +#define NUM_CUSTOM_ELEMENTS 256 +#define EL_CUSTOM_END 615 +/* ---------- end of custom elements section ------------------------------- */ + +#define EL_EM_KEY_1 616 +#define EL_EM_KEY_2 617 +#define EL_EM_KEY_3 618 +#define EL_EM_KEY_4 619 +#define EL_ENVELOPE_1 620 +#define EL_ENVELOPE_2 621 +#define EL_ENVELOPE_3 622 +#define EL_ENVELOPE_4 623 -#define NUM_CUSTOM_ELEMENTS 128 -#define NUM_FILE_ELEMENTS 488 +#define NUM_FILE_ELEMENTS 624 /* "real" (and therefore drawable) runtime elements */ #define EL_FIRST_RUNTIME_REAL NUM_FILE_ELEMENTS -#define EL_EM_KEY_1 (EL_FIRST_RUNTIME_REAL + 0) -#define EL_EM_KEY_2 (EL_FIRST_RUNTIME_REAL + 1) -#define EL_EM_KEY_3 (EL_FIRST_RUNTIME_REAL + 2) -#define EL_EM_KEY_4 (EL_FIRST_RUNTIME_REAL + 3) -#define EL_DYNABOMB_PLAYER_1_ACTIVE (EL_FIRST_RUNTIME_REAL + 4) -#define EL_DYNABOMB_PLAYER_2_ACTIVE (EL_FIRST_RUNTIME_REAL + 5) -#define EL_DYNABOMB_PLAYER_3_ACTIVE (EL_FIRST_RUNTIME_REAL + 6) -#define EL_DYNABOMB_PLAYER_4_ACTIVE (EL_FIRST_RUNTIME_REAL + 7) -#define EL_SP_DISK_RED_ACTIVE (EL_FIRST_RUNTIME_REAL + 8) -#define EL_SWITCHGATE_OPENING (EL_FIRST_RUNTIME_REAL + 9) -#define EL_SWITCHGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 10) -#define EL_TIMEGATE_OPENING (EL_FIRST_RUNTIME_REAL + 11) -#define EL_TIMEGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 12) -#define EL_PEARL_BREAKING (EL_FIRST_RUNTIME_REAL + 13) -#define EL_TRAP_ACTIVE (EL_FIRST_RUNTIME_REAL + 14) -#define EL_INVISIBLE_STEELWALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 15) -#define EL_INVISIBLE_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 16) -#define EL_INVISIBLE_SAND_ACTIVE (EL_FIRST_RUNTIME_REAL + 17) -#define EL_CONVEYOR_BELT_1_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 18) -#define EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 19) -#define EL_CONVEYOR_BELT_1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 20) -#define EL_CONVEYOR_BELT_2_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 21) -#define EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 22) -#define EL_CONVEYOR_BELT_2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 23) -#define EL_CONVEYOR_BELT_3_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 24) -#define EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 25) -#define EL_CONVEYOR_BELT_3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 26) -#define EL_CONVEYOR_BELT_4_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 27) -#define EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 28) -#define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 29) -#define EL_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 30) -#define EL_SP_EXIT_OPEN (EL_FIRST_RUNTIME_REAL + 31) -#define EL_SP_TERMINAL_ACTIVE (EL_FIRST_RUNTIME_REAL + 32) -#define EL_SP_BUGGY_BASE_ACTIVATING (EL_FIRST_RUNTIME_REAL + 33) -#define EL_SP_BUGGY_BASE_ACTIVE (EL_FIRST_RUNTIME_REAL + 34) -#define EL_SP_MURPHY_CLONE (EL_FIRST_RUNTIME_REAL + 35) -#define EL_AMOEBA_DROPPING (EL_FIRST_RUNTIME_REAL + 36) -#define EL_QUICKSAND_EMPTYING (EL_FIRST_RUNTIME_REAL + 37) -#define EL_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 38) -#define EL_BD_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 39) -#define EL_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 40) -#define EL_BD_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 41) -#define EL_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 42) -#define EL_BD_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 43) -#define EL_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 44) -#define EL_BD_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 45) +#define EL_DYNABOMB_PLAYER_1_ACTIVE (EL_FIRST_RUNTIME_REAL + 0) +#define EL_DYNABOMB_PLAYER_2_ACTIVE (EL_FIRST_RUNTIME_REAL + 1) +#define EL_DYNABOMB_PLAYER_3_ACTIVE (EL_FIRST_RUNTIME_REAL + 2) +#define EL_DYNABOMB_PLAYER_4_ACTIVE (EL_FIRST_RUNTIME_REAL + 3) +#define EL_SP_DISK_RED_ACTIVE (EL_FIRST_RUNTIME_REAL + 4) +#define EL_SWITCHGATE_OPENING (EL_FIRST_RUNTIME_REAL + 5) +#define EL_SWITCHGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 6) +#define EL_TIMEGATE_OPENING (EL_FIRST_RUNTIME_REAL + 7) +#define EL_TIMEGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 8) +#define EL_PEARL_BREAKING (EL_FIRST_RUNTIME_REAL + 9) +#define EL_TRAP_ACTIVE (EL_FIRST_RUNTIME_REAL + 10) +#define EL_INVISIBLE_STEELWALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 11) +#define EL_INVISIBLE_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 12) +#define EL_INVISIBLE_SAND_ACTIVE (EL_FIRST_RUNTIME_REAL + 13) +#define EL_CONVEYOR_BELT_1_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 14) +#define EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 15) +#define EL_CONVEYOR_BELT_1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 16) +#define EL_CONVEYOR_BELT_2_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 17) +#define EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 18) +#define EL_CONVEYOR_BELT_2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 19) +#define EL_CONVEYOR_BELT_3_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 20) +#define EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 21) +#define EL_CONVEYOR_BELT_3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 22) +#define EL_CONVEYOR_BELT_4_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 23) +#define EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 24) +#define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 25) +#define EL_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 26) +#define EL_EXIT_CLOSING (EL_FIRST_RUNTIME_REAL + 27) +#define EL_SP_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 28) +#define EL_SP_EXIT_CLOSING (EL_FIRST_RUNTIME_REAL + 29) +#define EL_SP_EXIT_OPEN (EL_FIRST_RUNTIME_REAL + 30) +#define EL_SP_TERMINAL_ACTIVE (EL_FIRST_RUNTIME_REAL + 31) +#define EL_SP_BUGGY_BASE_ACTIVATING (EL_FIRST_RUNTIME_REAL + 32) +#define EL_SP_BUGGY_BASE_ACTIVE (EL_FIRST_RUNTIME_REAL + 33) +#define EL_SP_MURPHY_CLONE (EL_FIRST_RUNTIME_REAL + 34) +#define EL_AMOEBA_DROPPING (EL_FIRST_RUNTIME_REAL + 35) +#define EL_QUICKSAND_EMPTYING (EL_FIRST_RUNTIME_REAL + 36) +#define EL_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 37) +#define EL_BD_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 38) +#define EL_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 39) +#define EL_BD_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 40) +#define EL_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 41) +#define EL_BD_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 42) +#define EL_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 43) +#define EL_BD_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 44) /* "unreal" (and therefore not drawable) runtime elements */ -#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 46) +#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 45) #define EL_BLOCKED (EL_FIRST_RUNTIME_UNREAL + 0) #define EL_EXPLOSION (EL_FIRST_RUNTIME_UNREAL + 1) #define EL_NUT_BREAKING (EL_FIRST_RUNTIME_UNREAL + 2) -#define EL_ACID_SPLASH_LEFT (EL_FIRST_RUNTIME_UNREAL + 3) -#define EL_ACID_SPLASH_RIGHT (EL_FIRST_RUNTIME_UNREAL + 4) -#define EL_AMOEBA_GROWING (EL_FIRST_RUNTIME_UNREAL + 5) -#define EL_AMOEBA_SHRINKING (EL_FIRST_RUNTIME_UNREAL + 6) -#define EL_EXPANDABLE_WALL_GROWING (EL_FIRST_RUNTIME_UNREAL + 7) -#define EL_FLAMES (EL_FIRST_RUNTIME_UNREAL + 8) -#define EL_PLAYER_IS_LEAVING (EL_FIRST_RUNTIME_UNREAL + 9) -#define EL_QUICKSAND_FILLING (EL_FIRST_RUNTIME_UNREAL + 10) -#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 11) -#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 12) +#define EL_DIAMOND_BREAKING (EL_FIRST_RUNTIME_UNREAL + 3) +#define EL_ACID_SPLASH_LEFT (EL_FIRST_RUNTIME_UNREAL + 4) +#define EL_ACID_SPLASH_RIGHT (EL_FIRST_RUNTIME_UNREAL + 5) +#define EL_AMOEBA_GROWING (EL_FIRST_RUNTIME_UNREAL + 6) +#define EL_AMOEBA_SHRINKING (EL_FIRST_RUNTIME_UNREAL + 7) +#define EL_EXPANDABLE_WALL_GROWING (EL_FIRST_RUNTIME_UNREAL + 8) +#define EL_FLAMES (EL_FIRST_RUNTIME_UNREAL + 9) +#define EL_PLAYER_IS_LEAVING (EL_FIRST_RUNTIME_UNREAL + 10) +#define EL_QUICKSAND_FILLING (EL_FIRST_RUNTIME_UNREAL + 11) +#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 12) +#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 13) /* dummy elements (never used as game elements, only used as graphics) */ -#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 13) +#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 14) #define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0) #define EL_STEELWALL_TOPRIGHT (EL_FIRST_DUMMY + 1) @@ -778,12 +872,20 @@ #define EL_INVISIBLE_STEELWALL_BOTTOMRIGHT (EL_FIRST_DUMMY + 9) #define EL_INVISIBLE_STEELWALL_HORIZONTAL (EL_FIRST_DUMMY + 10) #define EL_INVISIBLE_STEELWALL_VERTICAL (EL_FIRST_DUMMY + 11) -#define EL_SAND_CRUMBLED (EL_FIRST_DUMMY + 12) +#define EL_DYNABOMB (EL_FIRST_DUMMY + 12) #define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 13) -#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 14) -#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 15) +#define EL_DYNABOMB_PLAYER_1 (EL_FIRST_DUMMY + 14) +#define EL_DYNABOMB_PLAYER_2 (EL_FIRST_DUMMY + 15) +#define EL_DYNABOMB_PLAYER_3 (EL_FIRST_DUMMY + 16) +#define EL_DYNABOMB_PLAYER_4 (EL_FIRST_DUMMY + 17) +#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 18) +#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 19) +#define EL_DEFAULT (EL_FIRST_DUMMY + 20) +#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 21) +#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 22) +#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 23) -#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 16) +#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 24) /* values for graphics/sounds action types */ @@ -796,25 +898,26 @@ #define ACTION_COLLECTING 6 #define ACTION_DROPPING 7 #define ACTION_PUSHING 8 -#define ACTION_PASSING 9 -#define ACTION_IMPACT 10 -#define ACTION_BREAKING 11 -#define ACTION_ACTIVATING 12 -#define ACTION_DEACTIVATING 13 -#define ACTION_OPENING 14 -#define ACTION_CLOSING 15 -#define ACTION_ATTACKING 16 -#define ACTION_GROWING 17 -#define ACTION_SHRINKING 18 -#define ACTION_ACTIVE 19 -#define ACTION_FILLING 20 -#define ACTION_EMPTYING 21 -#define ACTION_CHANGING 22 -#define ACTION_EXPLODING 23 -#define ACTION_DYING 24 -#define ACTION_OTHER 25 - -#define NUM_ACTIONS 26 +#define ACTION_WALKING 9 +#define ACTION_PASSING 10 +#define ACTION_IMPACT 11 +#define ACTION_BREAKING 12 +#define ACTION_ACTIVATING 13 +#define ACTION_DEACTIVATING 14 +#define ACTION_OPENING 15 +#define ACTION_CLOSING 16 +#define ACTION_ATTACKING 17 +#define ACTION_GROWING 18 +#define ACTION_SHRINKING 19 +#define ACTION_ACTIVE 20 +#define ACTION_FILLING 21 +#define ACTION_EMPTYING 22 +#define ACTION_CHANGING 23 +#define ACTION_EXPLODING 24 +#define ACTION_DYING 25 +#define ACTION_OTHER 26 + +#define NUM_ACTIONS 27 /* values for special image configuration suffixes (must match game mode) */ #define GFX_SPECIAL_ARG_MAIN 0 @@ -823,10 +926,12 @@ #define GFX_SPECIAL_ARG_EDITOR 3 #define GFX_SPECIAL_ARG_INFO 4 #define GFX_SPECIAL_ARG_SETUP 5 -#define GFX_SPECIAL_ARG_DOOR 6 -#define GFX_SPECIAL_ARG_PREVIEW 7 +#define GFX_SPECIAL_ARG_PLAYING 6 +#define GFX_SPECIAL_ARG_DOOR 7 +#define GFX_SPECIAL_ARG_PREVIEW 8 +#define GFX_SPECIAL_ARG_CRUMBLED 9 -#define NUM_SPECIAL_GFX_ARGS 8 +#define NUM_SPECIAL_GFX_ARGS 10 /* values for image configuration suffixes */ @@ -846,15 +951,19 @@ #define GFX_ARG_DELAY 13 #define GFX_ARG_ANIM_MODE 14 #define GFX_ARG_GLOBAL_SYNC 15 -#define GFX_ARG_STEP_OFFSET 16 -#define GFX_ARG_STEP_DELAY 17 -#define GFX_ARG_DIRECTION 18 -#define GFX_ARG_POSITION 19 -#define GFX_ARG_DRAW_XOFFSET 20 -#define GFX_ARG_DRAW_YOFFSET 21 -#define GFX_ARG_NAME 22 +#define GFX_ARG_CRUMBLED_LIKE 16 +#define GFX_ARG_DIGGABLE_LIKE 17 +#define GFX_ARG_BORDER_SIZE 18 +#define GFX_ARG_STEP_OFFSET 19 +#define GFX_ARG_STEP_DELAY 20 +#define GFX_ARG_DIRECTION 21 +#define GFX_ARG_POSITION 22 +#define GFX_ARG_DRAW_XOFFSET 23 +#define GFX_ARG_DRAW_YOFFSET 24 +#define GFX_ARG_DRAW_MASKED 25 +#define GFX_ARG_NAME 26 -#define NUM_GFX_ARGS 23 +#define NUM_GFX_ARGS 27 /* values for sound configuration suffixes */ @@ -881,20 +990,24 @@ #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 FONT_ENVELOPE_1 16 +#define FONT_ENVELOPE_2 17 +#define FONT_ENVELOPE_3 18 +#define FONT_ENVELOPE_4 19 +#define FONT_INPUT_1_ACTIVE 20 +#define FONT_INPUT_2_ACTIVE 21 +#define FONT_INPUT_1 22 +#define FONT_INPUT_2 23 +#define FONT_OPTION_OFF 24 +#define FONT_OPTION_ON 25 +#define FONT_VALUE_1 26 +#define FONT_VALUE_2 27 +#define FONT_VALUE_OLD 28 +#define FONT_LEVEL_NUMBER 29 +#define FONT_TAPE_RECORDER 30 +#define FONT_GAME_INFO 31 + +#define NUM_FONTS 32 #define NUM_INITIAL_FONTS 4 /* values for game_status (must match special image configuration suffixes) */ @@ -904,18 +1017,20 @@ #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 +#define GAME_MODE_PLAYING 6 +#define GAME_MODE_PSEUDO_DOOR 7 +#define GAME_MODE_PSEUDO_PREVIEW 8 +#define GAME_MODE_PSEUDO_CRUMBLED 9 /* 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 GAME_MODE_PSEUDO_TYPENAME 10 +#define GAME_MODE_QUIT 11 -#define PROGRAM_VERSION_MAJOR 2 -#define PROGRAM_VERSION_MINOR 2 -#define PROGRAM_VERSION_PATCH 0 -#define PROGRAM_VERSION_STRING "2.2.0rc7" +#define PROGRAM_VERSION_MAJOR 3 +#define PROGRAM_VERSION_MINOR 0 +#define PROGRAM_VERSION_PATCH 7 +#define PROGRAM_VERSION_RELEASE 0 +#define PROGRAM_VERSION_STRING "3.0.7" #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" @@ -962,9 +1077,10 @@ #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 @@ -972,6 +1088,26 @@ #define EMU_SOKOBAN 2 #define EMU_SUPAPLEX 3 +struct MenuInfo +{ + int draw_xoffset_default; + int draw_yoffset_default; + int draw_xoffset[NUM_SPECIAL_GFX_ARGS]; + int draw_yoffset[NUM_SPECIAL_GFX_ARGS]; + + int scrollbar_xoffset; + + int list_size_default; + int list_size[NUM_SPECIAL_GFX_ARGS]; +}; + +struct DoorInfo +{ + int step_offset; + int step_delay; + int anim_mode; +}; + struct HiScore { char Name[MAX_PLAYER_NAME_LEN + 1]; @@ -1007,12 +1143,16 @@ struct PlayerInfo boolean LevelSolved, GameOver; boolean snapped; + int switch_x, switch_y; + int last_move_dir; boolean is_moving; boolean is_waiting; boolean is_digging; boolean is_collecting; + int show_envelope; + unsigned long move_delay; int move_delay_value; @@ -1027,10 +1167,12 @@ struct PlayerInfo int lights_still_needed; int friends_still_needed; int key[4]; - int dynamite; int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl; int shield_normal_time_left; int shield_deadly_time_left; + + int inventory_element[MAX_INVENTORY_SIZE]; + int inventory_size; }; struct LevelInfo @@ -1042,15 +1184,16 @@ struct LevelInfo boolean encoding_16bit_yamyam; /* yamyam contains 16-bit elements */ boolean encoding_16bit_amoeba; /* amoeba contains 16-bit elements */ - int fieldx; - int fieldy; + int fieldx, fieldy; int time; int gems_needed; char name[MAX_LEVEL_NAME_LEN + 1]; char author[MAX_LEVEL_AUTHOR_LEN + 1]; + char envelope_text[4][MAX_ENVELOPE_TEXT_LEN + 1]; + int envelope_xsize[4], envelope_ysize[4]; 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; @@ -1058,12 +1201,14 @@ struct LevelInfo int time_light; int time_timegate; boolean double_speed; - boolean gravity; + boolean initial_gravity; boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */ - short custom_element_successor[NUM_CUSTOM_ELEMENTS]; + short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; + + boolean use_custom_template; /* use custom properties from template file */ - boolean no_level_file; + boolean no_level_file; /* set for currently undefined levels */ }; struct TapeInfo @@ -1108,7 +1253,7 @@ struct GameInfo 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; @@ -1117,7 +1262,9 @@ struct GameInfo int belt_dir_nr[4]; int switchgate_pos; int balloon_dir; + boolean gravity; boolean explosions_delayed; + boolean envelope_active; }; struct GlobalInfo @@ -1132,34 +1279,115 @@ struct GlobalInfo int fps_slowdown_factor; }; -struct MenuInfo +struct ElementChangeInfo { - int draw_xoffset_default; - int draw_yoffset_default; - int draw_xoffset[NUM_SPECIAL_GFX_ARGS]; - int draw_yoffset[NUM_SPECIAL_GFX_ARGS]; -}; + boolean can_change; /* use or ignore this change info */ -struct DoorInfo -{ - int step_offset; - int step_delay; + unsigned long events; /* change events */ + int sides; /* change sides */ + + short 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; /* custom element triggering change */ + + int content[3][3]; /* new elements after extended change */ + boolean use_content; /* use extended change content */ + boolean only_complete; /* only use complete content */ + boolean use_random_change; /* use random value for setting content */ + int random; /* random value for setting content */ + int power; /* power of extended change */ + + boolean explode; /* explode instead of change */ + + /* functions that are called before, while and after the change of an + element -- currently only used for non-custom elements */ + void (*pre_change_function)(int x, int y); + void (*change_function)(int x, int y); + void (*post_change_function)(int x, int y); + + /* ---------- internal values used in level editor ---------- */ + + int direct_action; /* change triggered by actions on element */ + int other_action; /* change triggered by other element actions */ }; 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 */ + char *editor_description; /* pre-defined description for level editor */ + char *custom_description; /* alternative description from config file */ + char description[MAX_ELEMENT_NAME_LEN + 1]; /* for custom elements */ + + /* ---------- 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 */ + + int crumbled[NUM_ACTIONS]; /* crumbled graphics for several actions */ + int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS]; + /* crumbled graphics for left/right/up/down */ + int special_graphic[NUM_SPECIAL_GFX_ARGS]; /* special graphics for certain screens */ int sound[NUM_ACTIONS]; /* default sounds for several actions */ + + /* ---------- special element property values ---------- */ + + boolean use_gfx_element; /* use custom graphic element */ + short gfx_element; /* optional custom graphic element */ + + int collect_score; /* score value for collecting */ + int collect_count; /* count value for collecting */ + + 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 move_stepsize; /* step size element moves with */ + + int slippery_type; /* how/where other elements slip away */ + + int content[3][3]; /* new elements after explosion */ + + struct ElementChangeInfo *change_page; /* actual list of change pages */ + struct ElementChangeInfo *change; /* pointer to current change page */ + + int num_change_pages; /* actual number of change pages */ + int current_change_page; /* currently edited change page */ + + /* ---------- internal values used at runtime when playing ---------- */ + + unsigned long change_events; /* bitfield for combined change events */ + + int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */ + struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */ + + /* ---------- internal values used in level editor ---------- */ + + int access_type; /* walkable or passable */ + int access_layer; /* accessible over/inside/under */ + int walk_to_action; /* diggable/collectible/pushable */ + int smash_targets; /* can smash player/enemies/everything */ + int deadliness; /* deadly when running/colliding/touching */ + int consistency; /* indestructible/can explode */ + + boolean can_explode_by_fire; /* element explodes by fire */ + boolean can_explode_smashed; /* element explodes when smashed */ + boolean can_explode_impact; /* element explodes on impact */ + + boolean modified_settings; /* set for all modified custom elements */ }; struct FontInfo @@ -1185,12 +1413,17 @@ struct GraphicInfo int anim_delay; /* important: delay of 1 means "no delay"! */ int anim_mode; boolean anim_global_sync; + int crumbled_like; /* element for cloning crumble graphics */ + int diggable_like; /* element for cloning digging graphics */ + int border_size; /* border size for "crumbled" graphics */ int step_offset; /* optional step offset of toon animations */ int step_delay; /* optional step delay of toon animations */ int draw_x, draw_y; /* optional offset for drawing fonts chars */ + int draw_masked; /* optional setting for drawing envelope gfx */ + #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) Pixmap clip_mask; /* single-graphic-only clip mask for X11 */ GC clip_gc; /* single-graphic-only clip gc for X11 */ @@ -1241,15 +1474,18 @@ extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; extern int redraw_x1, redraw_y1; extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; -extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern short ChangeDelay[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]; extern short Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern boolean Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern unsigned long Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern unsigned long ChangeEvent[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 short AmoebaCnt[MAX_NUM_AMOEBA]; @@ -1289,14 +1525,14 @@ extern boolean network_player_action_received; extern int graphics_action_mapping[]; -extern struct LevelInfo level; +extern struct LevelInfo level, level_template; extern struct PlayerInfo stored_player[], *local_player; extern struct HiScore highscore[]; extern struct TapeInfo tape; extern struct GameInfo game; extern struct GlobalInfo global; extern struct MenuInfo menu; -extern struct DoorInfo door; +extern struct DoorInfo door_1, door_2; extern struct ElementInfo element_info[]; extern struct ElementActionInfo element_action_info[]; extern struct ElementDirectionInfo element_direction_info[];