X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=ae2aa5d0e5df5aba5b23e00bf499c4d5653aa0d7;hb=0ae305660baec1a7568ac7df7f296b695904d59a;hp=fac1302f60cd1282f81d2c742e75a2f7ca95583e;hpb=7373e992fb880976e1dc7c559bcd7a19b8bcfe80;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index fac1302f..ae2aa5d0 100644 --- a/src/main.h +++ b/src/main.h @@ -86,6 +86,7 @@ #define EP_DROPPABLE 22 #define EP_CAN_EXPLODE_1X1 23 #define EP_PUSHABLE 24 +#define EP_CAN_EXPLODE_DYNA 25 /* values for pre-defined properties */ #define EP_PLAYER 32 @@ -134,13 +135,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 @@ -161,7 +163,7 @@ #define CE_PRESSED_BY_PLAYER 2 #define CE_PUSHED_BY_PLAYER 3 #define CE_DROPPED_BY_PLAYER 4 -#define CE_COLLISION 5 +#define CE_HITTING_SOMETHING 5 #define CE_IMPACT 6 #define CE_SMASHED 7 #define CE_OTHER_IS_TOUCHING 8 @@ -172,8 +174,8 @@ #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_PLAYER_OBSOLETE 16 /* obsolete; now CE_BY_DIRECT_ACTION */ +#define CE_BY_COLLISION_OBSOLETE 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 @@ -183,8 +185,11 @@ #define CE_OTHER_GETS_LEFT 24 #define CE_SWITCHED 25 #define CE_OTHER_IS_SWITCHING 26 +#define CE_HIT_BY_SOMETHING 27 +#define CE_OTHER_IS_HITTING 28 +#define CE_OTHER_GETS_HIT 29 -#define NUM_CHANGE_EVENTS 27 +#define NUM_CHANGE_EVENTS 30 #define CE_BITMASK_DEFAULT 0 @@ -224,12 +229,21 @@ #define MV_BIT_TURNING_LEFT 8 #define MV_BIT_TURNING_RIGHT 9 #define MV_BIT_WHEN_PUSHED 10 +#define MV_BIT_MAZE_RUNNER 11 +#define MV_BIT_MAZE_HUNTER 12 +#define MV_BIT_WHEN_DROPPED 13 +#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 */ #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) @@ -237,6 +251,18 @@ #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) +#define MV_MAZE_RUNNER (1 << MV_BIT_MAZE_RUNNER) +#define MV_MAZE_HUNTER (1 << MV_BIT_MAZE_HUNTER) +#define MV_MAZE_RUNNER_STYLE (MV_MAZE_RUNNER | MV_MAZE_HUNTER) +#define MV_WHEN_DROPPED (1 << MV_BIT_WHEN_DROPPED) +#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 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 @@ -271,6 +297,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) /* macros for special configurable properties */ #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) @@ -319,11 +346,15 @@ #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 && \ (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) @@ -400,6 +431,8 @@ #define MAX_ENVELOPE_TEXT_LEN (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE) #define MIN_CHANGE_PAGES 1 #define MAX_CHANGE_PAGES 16 +#define MIN_ELEMENTS_IN_GROUP 1 +#define MAX_ELEMENTS_IN_GROUP 16 /* values for elements with content */ #define MIN_ELEMENT_CONTENTS 1 @@ -446,6 +479,23 @@ #define MICROLABEL_YPOS (MICROLEV_YPOS + MICROLEV_YSIZE + 7) +/* score for elements */ +#define SC_EMERALD 0 +#define SC_DIAMOND 1 +#define SC_BUG 2 +#define SC_SPACESHIP 3 +#define SC_YAMYAM 4 +#define SC_ROBOT 5 +#define SC_PACMAN 6 +#define SC_NUT 7 +#define SC_DYNAMITE 8 +#define SC_KEY 9 +#define SC_TIME_BONUS 10 +#define SC_CRYSTAL 11 +#define SC_PEARL 12 +#define SC_SHIELD 13 + + /* "real" level file elements */ #define EL_UNDEFINED -1 @@ -513,9 +563,7 @@ #define EL_DARK_YAMYAM 60 #define EL_BD_MAGIC_WALL 61 #define EL_INVISIBLE_STEELWALL 62 - -#define EL_UNUSED_63 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 @@ -789,7 +837,16 @@ #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 NUM_FILE_ELEMENTS 656 /* "real" (and therefore drawable) runtime elements */ @@ -855,12 +912,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) @@ -887,9 +948,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 */ @@ -927,19 +993,26 @@ #define ACTION_BORING_6 31 #define ACTION_BORING_7 32 #define ACTION_BORING_8 33 -#define ACTION_SLEEPING 34 -#define ACTION_SLEEPING_1 35 -#define ACTION_SLEEPING_2 36 -#define ACTION_SLEEPING_3 37 -#define ACTION_DYING 38 -#define ACTION_TURNING 39 -#define ACTION_TURNING_FROM_LEFT 40 -#define ACTION_TURNING_FROM_RIGHT 41 -#define ACTION_TURNING_FROM_UP 42 -#define ACTION_TURNING_FROM_DOWN 43 -#define ACTION_OTHER 44 - -#define NUM_ACTIONS 45 +#define ACTION_BORING_9 34 +#define ACTION_BORING_10 35 +#define ACTION_SLEEPING 36 +#define ACTION_SLEEPING_1 37 +#define ACTION_SLEEPING_2 38 +#define ACTION_SLEEPING_3 39 +#define ACTION_AWAKENING 40 +#define ACTION_DYING 41 +#define ACTION_TURNING 42 +#define ACTION_TURNING_FROM_LEFT 43 +#define ACTION_TURNING_FROM_RIGHT 44 +#define ACTION_TURNING_FROM_UP 45 +#define ACTION_TURNING_FROM_DOWN 46 +#define ACTION_OTHER 47 + +#define NUM_ACTIONS 48 + +#define ACTION_BORING_LAST ACTION_BORING_10 +#define ACTION_SLEEPING_LAST ACTION_SLEEPING_3 + /* values for special image configuration suffixes (must match game mode) */ #define GFX_SPECIAL_ARG_DEFAULT 0 @@ -1064,22 +1137,22 @@ #define NUM_MUSIC_PREFIXES 1 #define MAX_LEVELS 1000 +/* definitions for demo animation lists */ +#define HELPANIM_LIST_NEXT -1 +#define HELPANIM_LIST_END -999 + + +/* program information and versioning definitions */ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 0 -#define PROGRAM_VERSION_PATCH 8 +#define PROGRAM_VERSION_PATCH 9 #define PROGRAM_VERSION_BUILD 0 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" #define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2003 by Holger Schemel" -#if 0 -#define PROGRAM_DOS_PORT_STRING "DOS port done by Guido Schulz" -#define PROGRAM_IDENT_STRING PROGRAM_VERSION_STRING " " TARGET_STRING -#define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING -#endif - #define ICON_TITLE_STRING PROGRAM_TITLE_STRING #define COOKIE_PREFIX "ROCKSNDIAMONDS" #define FILENAME_PREFIX "Rocks" @@ -1162,7 +1235,7 @@ struct PlayerInfo { boolean present; /* player present in level playfield */ boolean connected; /* player connected (locally or via network) */ - boolean active; /* player (present && connected) */ + boolean active; /* player present and connected */ int index_nr, client_nr, element_nr; @@ -1192,6 +1265,7 @@ struct PlayerInfo boolean is_collecting; boolean is_pushing; boolean is_switching; + boolean is_dropping; boolean is_bored; boolean is_sleeping; @@ -1202,6 +1276,7 @@ struct PlayerInfo int anim_delay_counter; int post_delay_counter; + int action_waiting, last_action_waiting; int special_action_bored; int special_action_sleeping; @@ -1215,11 +1290,17 @@ struct PlayerInfo unsigned long move_delay; int move_delay_value; + int move_delay_reset_counter; + unsigned long push_delay; unsigned long push_delay_value; unsigned long actual_frame_counter; + int drop_delay; + + int step_counter; + int score; int gems_still_needed; int sokobanfields_still_needed; @@ -1239,6 +1320,15 @@ struct LevelSetInfo int music[MAX_LEVELS]; }; +struct LevelFileInfo +{ + int nr; + int type; + boolean packed; + char *basename; + char *filename; +}; + struct LevelInfo { int file_version; /* file format version the level is stored with */ @@ -1390,6 +1480,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 ---------- */ @@ -1398,7 +1505,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 ---------- */ @@ -1431,6 +1538,9 @@ 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 */ @@ -1442,6 +1552,8 @@ struct ElementInfo 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 */ @@ -1449,6 +1561,11 @@ 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 */ @@ -1528,13 +1645,22 @@ struct MusicPrefixInfo struct MusicFileInfo { - char *context; + char *basename; + + char *title_header; + char *artist_header; + char *album_header; + char *year_header; char *title; char *artist; char *album; char *year; + int music; + + boolean is_sound; + struct MusicFileInfo *next; }; @@ -1557,7 +1683,7 @@ struct SpecialSuffixInfo int value; }; -struct InfoAnimationInfo +struct HelpAnimInfo { int element; int action; @@ -1606,6 +1732,8 @@ 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 int RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern int PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern unsigned long Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS]; @@ -1660,12 +1788,15 @@ extern struct GraphicInfo *graphic_info; extern struct SoundInfo *sound_info; extern struct MusicInfo *music_info; extern struct MusicFileInfo *music_file_info; -extern struct InfoAnimationInfo *info_animation_info; +extern struct HelpAnimInfo *helpanim_info; +extern SetupFileHash *helptext_info; extern struct ConfigInfo image_config[]; extern struct ConfigInfo sound_config[]; extern struct ConfigInfo music_config[]; extern struct ConfigInfo image_config_suffix[]; extern struct ConfigInfo sound_config_suffix[]; extern struct ConfigInfo music_config_suffix[]; +extern struct ConfigInfo helpanim_config[]; +extern struct ConfigInfo helptext_config[]; #endif /* MAIN_H */