X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=e55db3cb28fcf1426bb398300481d42ce5614177;hb=73dfe4a920cabf20138c0ba49964a3c8c3f752d0;hp=7edb064dcb758e4597099df743af5fbbc6b87abd;hpb=9c285b0e8e4d81c5559815c5f7142685ce865206;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 7edb064d..e55db3cb 100644 --- a/src/main.h +++ b/src/main.h @@ -87,6 +87,8 @@ #define EP_CAN_EXPLODE_1X1 23 #define EP_PUSHABLE 24 #define EP_CAN_EXPLODE_DYNA 25 +#define EP_PROTECTED 26 +#define EP_CAN_MOVE_INTO_ACID 27 /* values for pre-defined properties */ #define EP_PLAYER 32 @@ -135,13 +137,17 @@ #define EP_CAN_SMASH 69 #define EP_CAN_EXPLODE 70 #define EP_CAN_EXPLODE_3X3 71 +#define EP_SP_PORT 72 +#define EP_CAN_EXPLODE_BY_DRAGONFIRE 73 +#define EP_CAN_EXPLODE_BY_EXPLOSION 74 +#define EP_COULD_MOVE_INTO_ACID 75 /* 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 76 +#define EP_WALK_TO_OBJECT 77 +#define EP_DEADLY 78 -#define NUM_ELEMENT_PROPERTIES 75 +#define NUM_ELEMENT_PROPERTIES 79 #define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32) #define EP_BITFIELD_BASE 0 @@ -205,7 +211,7 @@ (CH_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \ (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0) -/* values for change sides for custom elements */ +/* values for change side for custom elements */ #define CH_SIDE_NONE MV_NO_MOVING #define CH_SIDE_LEFT MV_LEFT #define CH_SIDE_RIGHT MV_RIGHT @@ -215,12 +221,25 @@ #define CH_SIDE_TOP_BOTTOM MV_VERTICAL #define CH_SIDE_ANY MV_ANY_DIRECTION +/* values for change player for custom elements */ +#define CH_PLAYER_NONE 0 +#define CH_PLAYER_1 (1 << 0) +#define CH_PLAYER_2 (1 << 1) +#define CH_PLAYER_3 (1 << 2) +#define CH_PLAYER_4 (1 << 3) +#define CH_PLAYER_ANY (CH_PLAYER_1 | CH_PLAYER_2 | CH_PLAYER_3 | \ + CH_PLAYER_4) + +/* values for change page for custom elements */ +#define CH_PAGE_ANY_FILE (0xff) +#define CH_PAGE_ANY (0xffffffff) + /* 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) */ +/* 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 @@ -235,10 +254,10 @@ #define MV_BIT_TURNING_RIGHT_LEFT 15 #define MV_BIT_TURNING_RANDOM 16 -/* 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_VERTICAL (MV_UP | MV_DOWN) +#define MV_ALL_DIRECTIONS (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN) #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) @@ -255,6 +274,22 @@ #define MV_TURNING_RIGHT_LEFT (1 << MV_BIT_TURNING_RIGHT_LEFT) #define MV_TURNING_RANDOM (1 << MV_BIT_TURNING_RANDOM) +/* 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 +#define LEAVE_TYPE_LIMITED 1 + /* values for slippery property for custom elements */ #define SLIPPERY_ANY_RANDOM 0 #define SLIPPERY_ANY_LEFT_RIGHT 1 @@ -289,6 +324,8 @@ #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) +#define CAN_MOVE_INTO_ACID(e) HAS_PROPERTY(e, EP_CAN_MOVE_INTO_ACID) /* macros for special configurable properties */ #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) @@ -337,11 +374,20 @@ #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) +#define CAN_EXPLODE_BY_DRAGONFIRE(e) \ + HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_DRAGONFIRE) +#define CAN_EXPLODE_BY_EXPLOSION(e) \ + HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_EXPLOSION) +#define COULD_MOVE_INTO_ACID(e) HAS_PROPERTY(e, EP_COULD_MOVE_INTO_ACID) /* special macros used in game engine */ #define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ (e) <= EL_CUSTOM_END) +#define IS_GROUP_ELEMENT(e) ((e) >= EL_GROUP_START && \ + (e) <= EL_GROUP_END) + #define IS_ENVELOPE(e) ((e) >= EL_ENVELOPE_1 && \ (e) <= EL_ENVELOPE_4) @@ -374,10 +420,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)) @@ -397,9 +459,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 */ @@ -411,13 +474,18 @@ #define MAX_SCORE_ENTRIES 100 #define MAX_NUM_AMOEBA 100 #define MAX_INVENTORY_SIZE 1000 +#define MAX_KEYS 4 +#define NUM_BELTS 4 +#define NUM_BELT_PARTS 3 #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 +#define MAX_CHANGE_PAGES 32 +#define MIN_ELEMENTS_IN_GROUP 1 +#define MAX_ELEMENTS_IN_GROUP 16 /* values for elements with content */ #define MIN_ELEMENT_CONTENTS 1 @@ -548,9 +616,7 @@ #define EL_DARK_YAMYAM 60 #define EL_BD_MAGIC_WALL 61 #define EL_INVISIBLE_STEELWALL 62 - -#define EL_MAZE_RUNNER 63 - +#define EL_SOKOBAN_FIELD_PLAYER 63 #define EL_DYNABOMB_INCREASE_NUMBER 64 #define EL_DYNABOMB_INCREASE_SIZE 65 #define EL_DYNABOMB_INCREASE_POWER 66 @@ -824,7 +890,18 @@ #define EL_ENVELOPE_3 622 #define EL_ENVELOPE_4 623 -#define NUM_FILE_ELEMENTS 624 +/* ---------- begin of group elements section ------------------------------ */ +#define EL_GROUP_START 624 + +#include "conf_grp.h" /* include auto-generated data structure definitions */ + +#define NUM_GROUP_ELEMENTS 32 +#define EL_GROUP_END 655 +/* ---------- end of custom elements section ------------------------------- */ + +#define EL_UNKNOWN 656 + +#define NUM_FILE_ELEMENTS 657 /* "real" (and therefore drawable) runtime elements */ @@ -890,12 +967,16 @@ #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) +#define EL_PLAYER_IS_EXPLODING_1 (EL_FIRST_RUNTIME_UNREAL + 11) +#define EL_PLAYER_IS_EXPLODING_2 (EL_FIRST_RUNTIME_UNREAL + 12) +#define EL_PLAYER_IS_EXPLODING_3 (EL_FIRST_RUNTIME_UNREAL + 13) +#define EL_PLAYER_IS_EXPLODING_4 (EL_FIRST_RUNTIME_UNREAL + 14) +#define EL_QUICKSAND_FILLING (EL_FIRST_RUNTIME_UNREAL + 15) +#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 16) +#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 17) /* dummy elements (never used as game elements, only used as graphics) */ -#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 14) +#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 18) #define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0) #define EL_STEELWALL_TOPRIGHT (EL_FIRST_DUMMY + 1) @@ -922,9 +1003,14 @@ #define EL_BD_DEFAULT (EL_FIRST_DUMMY + 22) #define EL_SP_DEFAULT (EL_FIRST_DUMMY + 23) #define EL_SB_DEFAULT (EL_FIRST_DUMMY + 24) -#define EL_DUMMY (EL_FIRST_DUMMY + 25) -#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 26) +/* internal elements (only used for internal purposes like copying) */ +#define EL_FIRST_INTERNAL (EL_FIRST_DUMMY + 25) + +#define EL_INTERNAL_EDITOR (EL_FIRST_INTERNAL + 0) +#define EL_INTERNAL_DUMMY (EL_FIRST_INTERNAL + 1) + +#define MAX_NUM_ELEMENTS (EL_FIRST_INTERNAL + 2) /* values for graphics/sounds action types */ @@ -1206,7 +1292,10 @@ struct PlayerInfo boolean connected; /* player connected (locally or via network) */ boolean active; /* player present and connected */ - int index_nr, client_nr, element_nr; + int index_nr; /* player number (0 to 3) */ + int index_bit; /* player number bit (1 << 0 to 1 << 3) */ + int element_nr; /* element (EL_PLAYER_1 to EL_PLAYER_4) */ + int client_nr; /* network client identifier */ byte action; /* action from local input device */ byte effective_action; /* action acknowledged from network server @@ -1223,6 +1312,8 @@ struct PlayerInfo boolean use_murphy_graphic; + boolean block_last_field; + boolean LevelSolved, GameOver; int last_move_dir; @@ -1259,6 +1350,8 @@ struct PlayerInfo unsigned long move_delay; int move_delay_value; + int move_delay_reset_counter; + unsigned long push_delay; unsigned long push_delay_value; @@ -1279,6 +1372,7 @@ struct PlayerInfo int shield_deadly_time_left; int inventory_element[MAX_INVENTORY_SIZE]; + int inventory_infinite_element; int inventory_size; }; @@ -1291,6 +1385,8 @@ struct LevelFileInfo { int nr; int type; + boolean packed; + char *basename; char *filename; }; @@ -1304,30 +1400,47 @@ struct LevelInfo boolean encoding_16bit_amoeba; /* amoeba contains 16-bit elements */ 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; + int amoeba_speed; int amoeba_content; + int time_magic_wall; int time_wheel; int time_light; int time_timegate; + + int can_move_into_acid_bits; /* bits indicate property for element groups */ + + boolean player_can_fall_into_acid; + 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 */ + boolean use_spring_bug; /* for compatibility with old levels */ + + int use_step_counter; /* count steps instead of seconds for level */ short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; boolean use_custom_template; /* use custom properties from template file */ - boolean no_level_file; /* set for currently undefined levels */ + boolean no_valid_file; /* set when level file missing or invalid */ }; struct TapeInfo @@ -1361,6 +1474,8 @@ struct TapeInfo byte action[MAX_PLAYERS]; byte delay; } pos[MAX_TAPELEN]; + + boolean no_valid_file; /* set when tape file missing or invalid */ }; struct GameInfo @@ -1414,7 +1529,10 @@ struct ElementChangeInfo boolean can_change; /* use or ignore this change info */ unsigned long events; /* change events */ - int sides; /* change sides */ + + int trigger_player; /* player triggering change */ + int trigger_side; /* side triggering change */ + int trigger_page; /* page triggering change */ short target_element; /* target element after change */ @@ -1445,6 +1563,23 @@ struct ElementChangeInfo int other_action; /* change triggered by other element actions */ }; +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 { /* ---------- token and description strings ---------- */ @@ -1453,7 +1588,7 @@ struct ElementInfo char *class_name; /* element class used in config files */ 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 */ + char description[MAX_ELEMENT_NAME_LEN + 1]; /* for custom/group elements */ /* ---------- graphic and sound definitions ---------- */ @@ -1475,6 +1610,8 @@ struct ElementInfo boolean use_gfx_element; /* use custom graphic element */ short gfx_element; /* optional custom graphic element */ + int access_direction; /* accessible from which direction */ + int collect_score; /* score value for collecting */ int collect_count; /* count value for collecting */ @@ -1486,17 +1623,25 @@ struct ElementInfo 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 move_enter_element; /* element that can be entered (and removed) */ + int move_leave_element; /* element that can be left behind */ + int move_leave_type; /* change (limited) or leave (unlimited) */ int slippery_type; /* how/where other elements slip away */ 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 */ int num_change_pages; /* actual number of change pages */ int current_change_page; /* currently edited change page */ + struct ElementGroupInfo *group; /* pointer to element group info */ + /* ---------- internal values used at runtime when playing ---------- */ unsigned long change_events; /* bitfield for combined change events */ @@ -1504,10 +1649,16 @@ struct ElementInfo int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */ struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */ + boolean in_group[NUM_GROUP_ELEMENTS]; + + boolean can_leave_element; /* element can leave other element behind */ + boolean can_leave_element_last; + /* ---------- internal values used in level editor ---------- */ 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 */ @@ -1668,8 +1819,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]; @@ -1698,7 +1850,7 @@ extern int ZX, ZY; extern int ExitX, ExitY; extern int AllPlayersGone; -extern int TimeFrames, TimePlayed, TimeLeft; +extern int TimeFrames, TimePlayed, TimeLeft, TapeTime; extern boolean SiebAktiv; extern int SiebCount;