X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fmain.h;h=682f9247774e054e111439d9f17556845f1015b1;hp=490af4fafb5236a26903fffb5a5ca1a65d5dc8a3;hb=ed22fcb49eb39c34da82c51f44cbe64ca5b409c4;hpb=3fd9eb037de275a9e65a712d7fbc0d95fe7b2747 diff --git a/src/main.h b/src/main.h index 490af4fa..682f9247 100644 --- a/src/main.h +++ b/src/main.h @@ -86,7 +86,7 @@ #define EP_DROPPABLE 22 #define EP_CAN_EXPLODE_1X1 23 #define EP_PUSHABLE 24 -#define EP_CAN_EXPLODE_DYNA 25 +#define EP_CAN_EXPLODE_CROSS 25 #define EP_PROTECTED 26 #define EP_CAN_MOVE_INTO_ACID 27 @@ -138,16 +138,17 @@ #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 +#define EP_CAN_EXPLODE_BY_DRAGONFIRE 73 +#define EP_CAN_EXPLODE_BY_EXPLOSION 74 +#define EP_COULD_MOVE_INTO_ACID 75 +#define EP_MAYBE_DONT_COLLIDE_WITH 76 /* values for internal purpose only (level editor) */ -#define EP_EXPLODE_RESULT 76 -#define EP_WALK_TO_OBJECT 77 -#define EP_DEADLY 78 +#define EP_EXPLODE_RESULT 77 +#define EP_WALK_TO_OBJECT 78 +#define EP_DEADLY 79 -#define NUM_ELEMENT_PROPERTIES 79 +#define NUM_ELEMENT_PROPERTIES 80 #define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32) #define EP_BITFIELD_BASE 0 @@ -211,7 +212,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 @@ -221,10 +222,23 @@ #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 +#define CP_WHEN_EMPTY 0 +#define CP_WHEN_DIGGABLE 1 +#define CP_WHEN_DESTRUCTIBLE 2 /* values for custom move patterns (bits 0 - 3: basic move directions) */ #define MV_BIT_TOWARDS_PLAYER 4 @@ -243,8 +257,8 @@ /* 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) @@ -310,7 +324,7 @@ #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 CAN_EXPLODE_DYNA(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_DYNA) +#define CAN_EXPLODE_CROSS(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_CROSS) #define IS_PROTECTED(e) HAS_PROPERTY(e, EP_PROTECTED) #define CAN_MOVE_INTO_ACID(e) HAS_PROPERTY(e, EP_CAN_MOVE_INTO_ACID) @@ -367,6 +381,7 @@ #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) +#define MAYBE_DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH) /* special macros used in game engine */ #define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ @@ -375,16 +390,22 @@ #define IS_GROUP_ELEMENT(e) ((e) >= EL_GROUP_START && \ (e) <= EL_GROUP_END) +#define IS_CLIPBOARD_ELEMENT(e) ((e) >= EL_INTERNAL_CLIPBOARD_START && \ + (e) <= EL_INTERNAL_CLIPBOARD_END) + +#define IS_INTERNAL_ELEMENT(e) ((e) >= EL_INTERNAL_START && \ + (e) <= EL_INTERNAL_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_PLAYER(x, y) (ELEM_IS_PLAYER(StorePlayer[x][y])) -#define IS_FREE(x,y) (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x,y)) -#define IS_FREE_OR_PLAYER(x,y) (Feld[x][y] == EL_EMPTY) +#define IS_FREE(x, y) (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x, y)) +#define IS_FREE_OR_PLAYER(x, y) (Feld[x][y] == EL_EMPTY) #define IS_MOVING(x,y) (MovPos[x][y] != 0) #define IS_FALLING(x,y) (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN) @@ -887,8 +908,10 @@ /* ---------- end of custom elements section ------------------------------- */ #define EL_UNKNOWN 656 +#define EL_TRIGGER_ELEMENT 657 +#define EL_TRIGGER_PLAYER 658 -#define NUM_FILE_ELEMENTS 657 +#define NUM_FILE_ELEMENTS 659 /* "real" (and therefore drawable) runtime elements */ @@ -994,10 +1017,17 @@ /* 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 EL_INTERNAL_CLIPBOARD_CUSTOM (EL_FIRST_INTERNAL + 0) +#define EL_INTERNAL_CLIPBOARD_CHANGE (EL_FIRST_INTERNAL + 1) +#define EL_INTERNAL_CLIPBOARD_GROUP (EL_FIRST_INTERNAL + 2) +#define EL_INTERNAL_DUMMY (EL_FIRST_INTERNAL + 3) -#define MAX_NUM_ELEMENTS (EL_FIRST_INTERNAL + 2) +#define EL_INTERNAL_CLIPBOARD_START (EL_FIRST_INTERNAL + 0) +#define EL_INTERNAL_CLIPBOARD_END (EL_FIRST_INTERNAL + 2) +#define EL_INTERNAL_START (EL_FIRST_INTERNAL + 0) +#define EL_INTERNAL_END (EL_FIRST_INTERNAL + 3) + +#define MAX_NUM_ELEMENTS (EL_FIRST_INTERNAL + 4) /* values for graphics/sounds action types */ @@ -1187,9 +1217,9 @@ /* program information and versioning definitions */ #define PROGRAM_VERSION_MAJOR 3 -#define PROGRAM_VERSION_MINOR 0 -#define PROGRAM_VERSION_PATCH 9 -#define PROGRAM_VERSION_BUILD 0 +#define PROGRAM_VERSION_MINOR 1 +#define PROGRAM_VERSION_PATCH 0 +#define PROGRAM_VERSION_BUILD 2 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" @@ -1279,7 +1309,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 @@ -1297,6 +1330,7 @@ struct PlayerInfo boolean use_murphy_graphic; boolean block_last_field; + boolean can_fall_into_acid; boolean LevelSolved, GameOver; @@ -1356,6 +1390,7 @@ struct PlayerInfo int shield_deadly_time_left; int inventory_element[MAX_INVENTORY_SIZE]; + int inventory_infinite_element; int inventory_size; }; @@ -1406,7 +1441,8 @@ struct LevelInfo int time_light; int time_timegate; - int can_move_into_acid; /* bits indicate property for element groups */ + int can_move_into_acid_bits; /* bitfield to store property for elements */ + int dont_collide_with_bits; /* bitfield to store property for elements */ boolean double_speed; boolean initial_gravity; @@ -1414,12 +1450,16 @@ struct LevelInfo 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 */ + boolean instant_relocation; /* no visual delay when relocating player */ + + /* ('int' instead of 'boolean' because used as selectbox value in editor) */ + 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 @@ -1439,7 +1479,8 @@ struct TapeInfo boolean pause_before_death; boolean recording, playing, pausing; boolean fast_forward; - boolean index_search; + boolean warp_forward; + boolean deactivate_display; boolean auto_play; boolean auto_play_level_solved; boolean quick_resume; @@ -1453,6 +1494,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 @@ -1506,8 +1549,9 @@ 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 */ @@ -1516,23 +1560,28 @@ struct ElementChangeInfo 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 */ + short trigger_element; /* 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 */ + int target_content[3][3]; /* elements for extended change target */ + boolean use_target_content; /* use extended change target */ + boolean only_if_complete; /* only use complete target content */ + boolean use_random_replace; /* use random value for replacing elements */ + int random_percentage; /* random value for replacing elements */ + int replace_when; /* type of elements that can be replaced */ boolean explode; /* explode instead of change */ + /* ---------- internal values used at runtime when playing ---------- */ + /* 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); + short actual_trigger_element; /* element that actually triggered change */ + int actual_trigger_player; /* player which actually triggered change */ + /* ---------- internal values used in level editor ---------- */ int direct_action; /* change triggered by actions on element */ @@ -1591,10 +1640,12 @@ struct ElementInfo 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 push_delay_fixed; /* constant delay before pushing */ + int push_delay_random; /* additional random delay before pushing */ + int drop_delay_fixed; /* constant delay after dropping */ + int drop_delay_random; /* additional random delay after dropping */ + int move_delay_fixed; /* constant delay after moving */ + int move_delay_random; /* additional random delay after moving */ int move_pattern; /* direction movable element moves to */ int move_direction_initial; /* initial direction element moves to */ @@ -1627,8 +1678,10 @@ struct ElementInfo boolean in_group[NUM_GROUP_ELEMENTS]; +#if 0 boolean can_leave_element; /* element can leave other element behind */ boolean can_leave_element_last; +#endif /* ---------- internal values used in level editor ---------- */ @@ -1826,7 +1879,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;