X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=e440a8ee18cce9192d0c58b9aa6904119a58c64b;hb=ad15815ec04f42779d0717a6d291f93b8e847d39;hp=03df0b6c262bba19b4652746989764de2b4caab4;hpb=396703fd486c7ed92bfd300147a38982e40de599;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 03df0b6c..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 @@ -63,7 +60,7 @@ /* values for configurable properties (custom elem's only, else pre-defined) */ #define EP_DIGGABLE 0 -#define EP_COLLECTIBLE 1 +#define EP_COLLECTIBLE_ONLY 1 #define EP_DONT_RUN_INTO 2 #define EP_DONT_COLLIDE_WITH 3 #define EP_DONT_TOUCH 4 @@ -84,40 +81,40 @@ #define EP_PASSABLE_OVER 19 #define EP_PASSABLE_INSIDE 20 #define EP_PASSABLE_UNDER 21 -#define EP_UNUSED_22 22 -#define EP_UNUSED_23 23 +#define EP_DROPPABLE 22 +#define EP_CAN_EXPLODE_1X1 23 #define EP_PUSHABLE 24 +/* values for pre-defined properties */ +#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 +#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_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 32 +#define EP_EM_SLIPPERY_WALL 55 /* values for special graphics properties (no effect on game engine) */ -#define EP_CAN_BE_CRUMBLED 33 - -/* values for pre-defined properties */ -#define EP_PLAYER 34 -#define EP_CAN_PASS_MAGIC_WALL 35 -#define EP_SWITCHABLE 36 -#define EP_BD_ELEMENT 37 -#define EP_SP_ELEMENT 38 -#define EP_SB_ELEMENT 39 -#define EP_GEM 40 -#define EP_FOOD_DARK_YAMYAM 41 -#define EP_FOOD_PENGUIN 42 -#define EP_FOOD_PIG 43 -#define EP_HISTORIC_WALL 44 -#define EP_HISTORIC_SOLID 45 -#define EP_CLASSIC_ENEMY 46 -#define EP_BELT 47 -#define EP_BELT_ACTIVE 48 -#define EP_BELT_SWITCH 49 -#define EP_TUBE 50 -#define EP_KEYGATE 51 -#define EP_AMOEBOID 52 -#define EP_AMOEBALIVE 53 -#define EP_HAS_CONTENT 54 -#define EP_ACTIVE_BOMB 55 -#define EP_INACTIVE 56 +#define EP_GFX_CRUMBLED 56 /* values for derived properties (determined from properties above) */ #define EP_ACCESSIBLE_OVER 57 @@ -126,20 +123,22 @@ #define EP_WALKABLE 60 #define EP_PASSABLE 61 #define EP_ACCESSIBLE 62 -#define EP_SNAPPABLE 63 -#define EP_WALL 64 -#define EP_SOLID_FOR_PUSHING 65 -#define EP_DRAGONFIRE_PROOF 66 -#define EP_EXPLOSION_PROOF 67 -#define EP_CAN_SMASH 68 -#define EP_CAN_EXPLODE 69 +#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 70 -#define EP_WALK_TO_OBJECT 71 -#define EP_DEADLY 72 +#define EP_EXPLODE_RESULT 72 +#define EP_WALK_TO_OBJECT 73 +#define EP_DEADLY 74 -#define NUM_ELEMENT_PROPERTIES 73 +#define NUM_ELEMENT_PROPERTIES 75 #define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32) #define EP_BITFIELD_BASE 0 @@ -154,41 +153,62 @@ (PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p))) -/* values for change events for custom elements */ +/* 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_COLLISION 4 -#define CE_IMPACT 5 -#define CE_SMASHED 6 -#define CE_OTHER_IS_TOUCHING 7 -#define CE_OTHER_IS_CHANGING 8 -#define CE_OTHER_IS_EXPLODING 9 -#define CE_OTHER_GETS_TOUCHED 10 -#define CE_OTHER_GETS_PRESSED 11 -#define CE_OTHER_GETS_PUSHED 12 -#define CE_OTHER_GETS_COLLECTED 13 - -/* values for internal purpose only (level editor) */ -#define CE_BY_PLAYER 14 -#define CE_BY_COLLISION 15 -#define CE_BY_OTHER 16 - -#define NUM_CHANGE_EVENTS 17 +#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_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 @@ -201,6 +221,7 @@ #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) @@ -213,6 +234,7 @@ #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 @@ -223,7 +245,7 @@ /* 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) @@ -244,13 +266,15 @@ #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 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) +#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) @@ -281,21 +305,26 @@ #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) /* 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) @@ -330,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) @@ -344,13 +376,28 @@ #define IS_LOOP_SOUND(s) (sound_info[s].loop) +/* 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_ELEMENT_NAME_LEN 32 -#define MAX_TAPELEN (1000 * 50) /* max. time * framerate */ +#define MAX_TAPELEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ #define MAX_SCORE_ENTRIES 100 #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 @@ -359,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 @@ -411,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 @@ -538,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) @@ -560,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) @@ -658,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 @@ -677,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 @@ -729,68 +769,78 @@ #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) @@ -822,16 +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_DEFAULT (EL_FIRST_DUMMY + 16) -#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 17) -#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 18) -#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 19) +#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 + 20) +#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 24) /* values for graphics/sounds action types */ @@ -872,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 */ @@ -895,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 */ @@ -930,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) */ @@ -953,19 +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_RELEASE 7 -#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" @@ -1023,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]; @@ -1058,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; @@ -1078,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 @@ -1093,12 +1184,13 @@ 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 yamyam_content[MAX_ELEMENT_CONTENTS][3][3]; int num_yamyam_contents; @@ -1109,14 +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 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 @@ -1170,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 @@ -1185,26 +1279,12 @@ struct GlobalInfo 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 list_size_default; - int list_size[NUM_SPECIAL_GFX_ARGS]; -}; - -struct DoorInfo -{ - int step_offset; - int step_delay; -}; - struct ElementChangeInfo { - unsigned long events; /* bitfield for change events */ + boolean can_change; /* use or ignore this change info */ + + unsigned long events; /* change events */ + int sides; /* change sides */ short target_element; /* target element after change */ @@ -1228,6 +1308,11 @@ struct ElementChangeInfo 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 @@ -1245,6 +1330,11 @@ struct ElementInfo 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 */ @@ -1255,8 +1345,8 @@ struct ElementInfo boolean use_gfx_element; /* use custom graphic element */ short gfx_element; /* optional custom graphic element */ - int score; /* score value for collecting */ - int gem_count; /* gem count value for collecting */ + 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 */ @@ -1271,7 +1361,18 @@ struct ElementInfo int content[3][3]; /* new elements after explosion */ - struct ElementChangeInfo change; + 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 ---------- */ @@ -1281,13 +1382,12 @@ struct ElementInfo int smash_targets; /* can smash player/enemies/everything */ int deadliness; /* deadly when running/colliding/touching */ int consistency; /* indestructible/can explode */ - int change_player_action; /* touched/pressed/pushed by player */ - int change_collide_action; /* collision/impact/smashed */ - int change_other_action; /* various change actions */ 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 @@ -1313,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 */ @@ -1379,7 +1484,8 @@ 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 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]; @@ -1426,7 +1532,7 @@ 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[];