X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fmain.h;h=68ad89ca303d0a240c3c656f0e3d25204e26c355;hp=a690c06446194b726e13642a0a7bc82be0c2ed6b;hb=86b0ea5594dc5a9db7ac5d71fa2b7487a4fc1f9d;hpb=ba30b2aedd9a673be5c23ebb2c5f25a4616daaa5 diff --git a/src/main.h b/src/main.h index a690c064..68ad89ca 100644 --- a/src/main.h +++ b/src/main.h @@ -33,6 +33,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 @@ -60,59 +61,87 @@ #define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2) #define IN_LEV_FIELD(x,y) ((x)>=0 && (x)=0 &&(y)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 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 + +/* 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) + +/* 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_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 IS_ENEMY(e) HAS_PROPERTY(e, EP_ENEMY) -#define IS_HISTORIC_WALL(e) HAS_PROPERTY(e, EP_HISTORIC_WALL) -#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_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) -#define IS_BD_ELEMENT(e) HAS_PROPERTY(e, EP_BD_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_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 CAN_FALL(e) HAS_PROPERTY(e, EP_CAN_FALL) +#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) -/* macros for runtime properties */ +/* 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_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM) +#define IS_FOOD_PENGUIN(e) HAS_PROPERTY(e, EP_FOOD_PENGUIN) +#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) +#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_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB) +#define IS_INACTIVE(e) HAS_PROPERTY(e, EP_INACTIVE) + +/* 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_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_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE) #define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE) -#define IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB) -#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_SP_ELEMENT(e) HAS_PROPERTY(e, EP_SP_ELEMENT) -#define HAS_CONTENT(e) HAS_PROPERTY(e, EP_HAS_CONTENT) -#define IS_TUBE(e) HAS_PROPERTY(e, EP_TUBE) +#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 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)) @@ -226,57 +355,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 10 /* values for elements with content */ #define MIN_ELEMENT_CONTENTS 1 @@ -285,13 +385,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 @@ -337,7 +430,7 @@ #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_EMERALD 6 @@ -603,7 +696,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 @@ -659,10 +752,10 @@ #include "conf_cus.h" /* include auto-generated data structure definitions */ -#define EL_CUSTOM_END (EL_CUSTOM_START + 127) +#define NUM_CUSTOM_ELEMENTS 256 -#define NUM_CUSTOM_ELEMENTS 128 -#define NUM_FILE_ELEMENTS 488 +#define EL_CUSTOM_END (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS - 1) +#define NUM_FILE_ELEMENTS (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS) /* "real" (and therefore drawable) runtime elements */ @@ -721,19 +814,20 @@ #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) @@ -747,12 +841,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 */ @@ -765,37 +867,40 @@ #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 - -/* values for special image configuration suffixes */ +#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 #define GFX_SPECIAL_ARG_LEVELS 1 #define GFX_SPECIAL_ARG_SCORES 2 #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 */ @@ -815,15 +920,17 @@ #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_STEP_OFFSET 18 +#define GFX_ARG_STEP_DELAY 19 +#define GFX_ARG_DIRECTION 20 +#define GFX_ARG_POSITION 21 +#define GFX_ARG_DRAW_XOFFSET 22 +#define GFX_ARG_DRAW_YOFFSET 23 +#define GFX_ARG_NAME 24 -#define NUM_GFX_ARGS 23 +#define NUM_GFX_ARGS 25 /* values for sound configuration suffixes */ @@ -842,43 +949,51 @@ #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 - -#define PROGRAM_VERSION_MAJOR 2 -#define PROGRAM_VERSION_MINOR 2 -#define PROGRAM_VERSION_PATCH 0 -#define PROGRAM_VERSION_STRING "2.2.0rc6" +/* 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_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_PSEUDO_TYPENAME 10 +#define GAME_MODE_QUIT 11 + +#define PROGRAM_VERSION_MAJOR 3 +#define PROGRAM_VERSION_MINOR 0 +#define PROGRAM_VERSION_PATCH 3 +#define PROGRAM_VERSION_RELEASE 0 +#define PROGRAM_VERSION_STRING "3.0.3" #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" @@ -925,9 +1040,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 @@ -990,10 +1106,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 @@ -1005,15 +1123,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[MAX_ENVELOPE_TEXT_LEN + 1]; + int envelope_xsize, envelope_ysize; 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; @@ -1024,9 +1143,11 @@ struct LevelInfo boolean 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 no_level_file; + boolean use_custom_template; /* use custom properties from template file */ + + boolean no_level_file; /* set for currently undefined levels */ }; struct TapeInfo @@ -1071,7 +1192,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; @@ -1090,33 +1211,139 @@ struct GlobalInfo 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]; + + int scrollbar_xoffset; + + int list_size_default; + int list_size[NUM_SPECIAL_GFX_ARGS]; +}; + +struct DoorInfo +{ + int step_offset; + int step_delay; +}; + +struct ElementChangeInfo +{ + boolean can_change; /* use or ignore this change info */ + + unsigned long events; /* bitfield for change events */ + + 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 player_action; /* touched/pressed/pushed by player */ + int collide_action; /* collision/impact/smashed */ + int other_action; /* various change 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_num[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 @@ -1142,6 +1369,8 @@ 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 step_offset; /* optional step offset of toon animations */ int step_delay; /* optional step delay of toon animations */ @@ -1198,15 +1427,17 @@ 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 boolean Changing[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]; @@ -1246,16 +1477,19 @@ 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 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;