X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=486f6f2a020e889fce10eab3994bb1126cb898f4;hb=0ff3f484ffbb8e3404e1dc4536a292335369f2d2;hp=345e9f9dfc0600ab468b086c2f8f046bdd903a26;hpb=49600fe866a0590700a684593913fc5674332201;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 345e9f9d..486f6f2a 100644 --- a/src/main.h +++ b/src/main.h @@ -87,6 +87,7 @@ #define EP_CAN_EXPLODE_1X1 23 #define EP_PUSHABLE 24 #define EP_CAN_EXPLODE_DYNA 25 +#define EP_PROTECTED 26 /* values for pre-defined properties */ #define EP_PLAYER 32 @@ -135,13 +136,14 @@ #define EP_CAN_SMASH 69 #define EP_CAN_EXPLODE 70 #define EP_CAN_EXPLODE_3X3 71 +#define EP_SP_PORT 72 /* values for internal purpose only (level editor) */ -#define EP_EXPLODE_RESULT 72 -#define EP_WALK_TO_OBJECT 73 -#define EP_DEADLY 74 +#define EP_EXPLODE_RESULT 73 +#define EP_WALK_TO_OBJECT 74 +#define EP_DEADLY 75 -#define NUM_ELEMENT_PROPERTIES 75 +#define NUM_ELEMENT_PROPERTIES 76 #define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32) #define EP_BITFIELD_BASE 0 @@ -220,7 +222,7 @@ #define CP_HALF_DESTRUCTIVE 1 #define CP_FULL_DESTRUCTIVE 2 -/* values for special move patterns (bits 0-3: basic move directions) */ +/* values for custom 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 @@ -234,15 +236,12 @@ #define MV_BIT_TURNING_LEFT_RIGHT 14 #define MV_BIT_TURNING_RIGHT_LEFT 15 #define MV_BIT_TURNING_RANDOM 16 -#define MV_BIT_PREVIOUS 17 -/* values for special move patterns for custom elements */ +/* values for custom move patterns */ #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_RANDOM (MV_ALL_DIRECTIONS) -#define MV_AUTOMATIC (MV_NO_MOVING) #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) @@ -257,7 +256,18 @@ #define MV_TURNING_LEFT_RIGHT (1 << MV_BIT_TURNING_LEFT_RIGHT) #define MV_TURNING_RIGHT_LEFT (1 << MV_BIT_TURNING_RIGHT_LEFT) #define MV_TURNING_RANDOM (1 << MV_BIT_TURNING_RANDOM) -#define MV_PREVIOUS (1 << MV_BIT_PREVIOUS) + +/* values for initial move direction (bits 0 - 3: basic move directions) */ +#define MV_START_BIT_PREVIOUS 4 + +/* values for initial move direction */ +#define MV_START_AUTOMATIC (MV_NO_MOVING) +#define MV_START_LEFT (MV_LEFT) +#define MV_START_RIGHT (MV_RIGHT) +#define MV_START_UP (MV_UP) +#define MV_START_DOWN (MV_DOWN) +#define MV_START_RANDOM (MV_ALL_DIRECTIONS) +#define MV_START_PREVIOUS (1 << MV_START_BIT_PREVIOUS) /* values for elements left behind by custom elements */ #define LEAVE_TYPE_UNLIMITED 0 @@ -297,6 +307,7 @@ #define CAN_EXPLODE_1X1(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_1X1) #define IS_PUSHABLE(e) HAS_PROPERTY(e, EP_PUSHABLE) #define CAN_EXPLODE_DYNA(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_DYNA) +#define IS_PROTECTED(e) HAS_PROPERTY(e, EP_PROTECTED) /* macros for special configurable properties */ #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) @@ -345,6 +356,7 @@ #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_SP_PORT(e) HAS_PROPERTY(e, EP_SP_PORT) /* special macros used in game engine */ #define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ @@ -385,10 +397,26 @@ #define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER_1]) #define SHIELD_ON(p) ((p)->shield_normal_time_left > 0) + +#if 1 + +#define ENEMY_PROTECTED_FIELD(x,y) (IS_PROTECTED(Feld[x][y]) || \ + IS_PROTECTED(Back[x][y])) +#define EXPLOSION_PROTECTED_FIELD(x,y) (IS_EXPLOSION_PROOF(Feld[x][y])) +#define PLAYER_ENEMY_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ + ENEMY_PROTECTED_FIELD(x, y)) +#define PLAYER_EXPLOSION_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ + EXPLOSION_PROTECTED_FIELD(x, y)) + +#else + #define PROTECTED_FIELD(x,y) (IS_ACCESSIBLE_INSIDE(Feld[x][y]) && \ IS_INDESTRUCTIBLE(Feld[x][y])) -#define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ +#define PLAYER_ENEMY_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ PROTECTED_FIELD(x, y)) +#define PLAYER_EXPLOSION_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ + PROTECTED_FIELD(x, y)) +#endif #define PLAYER_SWITCHING(p,x,y) ((p)->is_switching && \ (p)->switch_x == (x) && (p)->switch_y == (y)) @@ -408,9 +436,10 @@ /* fundamental game speed values */ +#define ONE_SECOND_DELAY 1000 /* delay value for one second */ #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 FRAMES_PER_SECOND (ONE_SECOND_DELAY / GAME_FRAME_DELAY) #define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */ #define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */ @@ -428,7 +457,7 @@ #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 +#define MAX_CHANGE_PAGES 32 #define MIN_ELEMENTS_IN_GROUP 1 #define MAX_ELEMENTS_IN_GROUP 16 @@ -844,7 +873,9 @@ #define EL_GROUP_END 655 /* ---------- end of custom elements section ------------------------------- */ -#define NUM_FILE_ELEMENTS 656 +#define EL_UNKNOWN 656 + +#define NUM_FILE_ELEMENTS 657 /* "real" (and therefore drawable) runtime elements */ @@ -1252,6 +1283,8 @@ struct PlayerInfo boolean use_murphy_graphic; + boolean block_last_field; + boolean LevelSolved, GameOver; int last_move_dir; @@ -1322,6 +1355,8 @@ struct LevelFileInfo { int nr; int type; + boolean packed; + char *basename; char *filename; }; @@ -1353,6 +1388,8 @@ struct LevelInfo boolean double_speed; boolean initial_gravity; boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */ + boolean block_last_field; /* player blocks previous field while moving */ + boolean sp_block_last_field; /* player blocks previous field while moving */ short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; @@ -1481,12 +1518,16 @@ struct ElementGroupInfo int num_elements; /* number of elements in this group */ short element[MAX_ELEMENTS_IN_GROUP]; /* list of elements in this group */ + int choice_mode; /* how to choose element from group */ + /* ---------- internal values used at runtime when playing ---------- */ /* the following is the same as above, but with recursively resolved group elements (group elements may also contain further group elements!) */ int num_elements_resolved; short element_resolved[NUM_FILE_ELEMENTS]; + + int choice_pos; /* current element choice position */ }; struct ElementInfo @@ -1538,6 +1579,9 @@ struct ElementInfo int content[3][3]; /* new elements after explosion */ + int explosion_delay; /* duration of explosion of this element */ + int ignition_delay; /* delay for explosion by other explosion */ + struct ElementChangeInfo *change_page; /* actual list of change pages */ struct ElementChangeInfo *change; /* pointer to current change page */ @@ -1562,6 +1606,7 @@ struct ElementInfo int access_type; /* walkable or passable */ int access_layer; /* accessible over/inside/under */ + int access_protected; /* protection against deadly elements */ int walk_to_action; /* diggable/collectible/pushable */ int smash_targets; /* can smash player/enemies/everything */ int deadliness; /* deadly when running/colliding/touching */ @@ -1722,8 +1767,9 @@ extern short WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short AmoebaCnt[MAX_NUM_AMOEBA]; extern short AmoebaCnt2[MAX_NUM_AMOEBA]; -extern short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern short ExplodeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];