X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=10fed0f80d84f600a77ad97b031b90bc22bd6d71;hb=c93f939100438a9047653b2c2c6b86f034e1bb01;hp=414ff7fccfc03a098ad8e8a17904626281e696e0;hpb=51dcb2097c619c5f9ba924a7edb4a3bdd6a6986e;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 414ff7fc..10fed0f8 100644 --- a/src/main.h +++ b/src/main.h @@ -179,34 +179,52 @@ #define CE_HITTING_SOMETHING 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_TOUCHING_X 8 +#define CE_CHANGE_OF_X 9 +#define CE_EXPLOSION_OF_X 10 +#define CE_PLAYER_TOUCHES_X 11 +#define CE_PLAYER_PRESSES_X 12 +#define CE_PLAYER_PUSHES_X 13 +#define CE_PLAYER_COLLECTS_X 14 +#define CE_PLAYER_DROPS_X 15 #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 +#define CE_PLAYER_DIGS_X 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_PLAYER_ENTERS_X 23 +#define CE_PLAYER_LEAVES_X 24 #define CE_SWITCHED 25 -#define CE_OTHER_IS_SWITCHING 26 +#define CE_SWITCH_OF_X 26 #define CE_HIT_BY_SOMETHING 27 -#define CE_OTHER_IS_HITTING 28 -#define CE_OTHER_GETS_HIT 29 +#define CE_HITTING_X 28 +#define CE_HIT_BY_X 29 #define CE_BLOCKED 30 #define NUM_CHANGE_EVENTS 31 #define CE_BITMASK_DEFAULT 0 +#if 1 + +#define CH_EVENT_VAR(e,c) (element_info[e].change->has_event[c]) +#define CH_ANY_EVENT_VAR(e,c) (element_info[e].has_change_event[c]) + +#define PAGE_HAS_CHANGE_EVENT(p,c) ((p)->has_event[c]) +#define HAS_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \ + CH_EVENT_VAR(e,c)) +#define HAS_ANY_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \ + CH_ANY_EVENT_VAR(e,c)) + +#define SET_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \ + CH_EVENT_VAR(e,c) = (v) : 0) +#define SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \ + CH_ANY_EVENT_VAR(e,c) = (v) : 0) + +#else + #define CH_EVENT_BIT(c) (1 << (c)) #define CH_EVENT_VAR(e) (element_info[e].change->events) #define CH_ANY_EVENT_VAR(e) (element_info[e].change_events) @@ -219,6 +237,11 @@ ((v) ? \ (CH_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \ (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0) +#define SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \ + ((v) ? \ + (CH_ANY_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \ + (CH_ANY_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0) +#endif /* values for change side for custom elements */ #define CH_SIDE_NONE MV_NO_MOVING @@ -236,8 +259,11 @@ #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 | \ +#define CH_PLAYER_ANY (CH_PLAYER_1 | \ + CH_PLAYER_2 | \ + CH_PLAYER_3 | \ CH_PLAYER_4) +#define CH_PLAYER_TRIGGER (1 << 4) /* values for change page for custom elements */ #define CH_PAGE_ANY_FILE (0xff) @@ -251,6 +277,68 @@ #define CP_WHEN_REMOVABLE 4 #define CP_WHEN_WALKABLE 5 +/* values for change actions for custom elements */ +#define CA_NO_ACTION 0 +#define CA_EXIT_PLAYER 1 +#define CA_KILL_PLAYER 2 +#define CA_RESTART_LEVEL 3 +#define CA_SHOW_ENVELOPE 4 +#define CA_ADD_KEY 5 +#define CA_DEL_KEY 6 +#define CA_SET_PLAYER_SPEED 7 +#define CA_SET_GEMS 8 +#define CA_SET_SCORE 9 +#define CA_SET_TIME 10 +#define CA_SET_COUNTER 11 +#define CA_SET_DYNABOMB_NUMBER 12 +#define CA_SET_DYNABOMB_SIZE 13 +#define CA_SET_DYNABOMB_POWER 14 +#define CA_TOGGLE_PLAYER_GRAVITY 15 +#define CA_ENABLE_PLAYER_GRAVITY 16 +#define CA_DISABLE_PLAYER_GRAVITY 17 + +/* values for change action mode for custom elements */ +#define CA_MODE_UNDEFINED 0 +#define CA_MODE_ADD 1 +#define CA_MODE_SUBTRACT 2 +#define CA_MODE_MULTIPLY 3 +#define CA_MODE_DIVIDE 4 +#define CA_MODE_SET 5 + +/* values for change action parameters for custom elements */ +#define CA_ARG_0 0 +#define CA_ARG_1 1 +#define CA_ARG_2 2 +#define CA_ARG_3 3 +#define CA_ARG_4 4 +#define CA_ARG_5 5 +#define CA_ARG_6 6 +#define CA_ARG_7 7 +#define CA_ARG_8 8 +#define CA_ARG_9 9 +#define CA_ARG_10 10 +#define CA_ARG_20 20 +#define CA_ARG_25 25 +#define CA_ARG_50 50 +#define CA_ARG_100 100 +#define CA_ARG_1000 1000 +#define CA_ARG_PLAYER 20000 +#define CA_ARG_PLAYER_HEADLINE (CA_ARG_PLAYER + 0) +#define CA_ARG_PLAYER_1 (CA_ARG_PLAYER + CH_PLAYER_1) +#define CA_ARG_PLAYER_2 (CA_ARG_PLAYER + CH_PLAYER_2) +#define CA_ARG_PLAYER_3 (CA_ARG_PLAYER + CH_PLAYER_3) +#define CA_ARG_PLAYER_4 (CA_ARG_PLAYER + CH_PLAYER_4) +#define CA_ARG_PLAYER_ANY (CA_ARG_PLAYER + CH_PLAYER_ANY) +#define CA_ARG_PLAYER_TRIGGER (CA_ARG_PLAYER + CH_PLAYER_TRIGGER) +#define CA_ARG_NUMBER 30000 +#define CA_ARG_NUMBER_HEADLINE (CA_ARG_NUMBER + 0) +#define CA_ARG_NUMBER_MIN (CA_ARG_NUMBER + 1) +#define CA_ARG_NUMBER_MAX (CA_ARG_NUMBER + 2) +#define CA_ARG_NUMBER_NORMAL (CA_ARG_NUMBER + 3) +#define CA_ARG_NUMBER_RESET (CA_ARG_NUMBER + 4) +#define CA_ARG_NUMBER_COUNT (CA_ARG_NUMBER + 5) +#define CA_ARG_UNDEFINED 30999 + /* values for custom move patterns (bits 0 - 3: basic move directions) */ #define MV_BIT_TOWARDS_PLAYER 4 #define MV_BIT_AWAY_FROM_PLAYER 5 @@ -527,6 +615,9 @@ #define PLAYER_SWITCHING(p,x,y) ((p)->is_switching && \ (p)->switch_x == (x) && (p)->switch_y == (y)) +#define PLAYER_DROPPING(p,x,y) ((p)->is_dropping && \ + (p)->drop_x == (x) && (p)->drop_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) @@ -553,7 +644,8 @@ #define MAX_LEVEL_NAME_LEN 32 #define MAX_LEVEL_AUTHOR_LEN 32 #define MAX_ELEMENT_NAME_LEN 32 -#define MAX_TAPELEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ +#define MAX_TAPE_LEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ +#define MAX_TAPES_PER_SET 1024 #define MAX_SCORE_ENTRIES 100 #define MAX_NUM_AMOEBA 100 #define MAX_INVENTORY_SIZE 1000 @@ -1361,14 +1453,24 @@ /* program information and versioning definitions */ +#define RELEASE_311 FALSE + +#if RELEASE_311 +#define PROGRAM_VERSION_MAJOR 3 +#define PROGRAM_VERSION_MINOR 1 +#define PROGRAM_VERSION_PATCH 2 +#define PROGRAM_VERSION_BUILD 0 +#else +/* !!! make sure that packaging script can find unique version number !!! */ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 2 #define PROGRAM_VERSION_PATCH 0 -#define PROGRAM_VERSION_BUILD 2 +#define PROGRAM_VERSION_BUILD 3 +#endif #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" -#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2004 by Holger Schemel" +#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2005 by Holger Schemel" #define ICON_TITLE_STRING PROGRAM_TITLE_STRING #define COOKIE_PREFIX "ROCKSNDIAMONDS" @@ -1441,14 +1543,11 @@ 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]; int sound[NUM_SPECIAL_GFX_ARGS]; @@ -1495,7 +1594,7 @@ struct PlayerInfo boolean use_murphy_graphic; boolean block_last_field; - int block_delay; + int block_delay_adjustment; /* needed for different engine versions */ boolean can_fall_into_acid; @@ -1530,6 +1629,7 @@ struct PlayerInfo int num_special_action_sleeping; int switch_x, switch_y; + int drop_x, drop_y; int show_envelope; @@ -1654,8 +1754,11 @@ struct LevelInfo boolean block_last_field; /* player blocks previous field while moving */ boolean sp_block_last_field; /* player blocks previous field while moving */ + +#if 0 /* !!! THIS IS NOT A LEVEL SETTING => LOGIC MOVED TO "game.c" !!! */ int block_delay; /* delay for blocking previous field */ int sp_block_delay; /* delay for blocking previous field */ +#endif /* ('int' instead of 'boolean' because used as selectbox value in editor) */ int use_step_counter; /* count steps instead of seconds for level */ @@ -1700,7 +1803,7 @@ struct TapeInfo { byte action[MAX_PLAYERS]; byte delay; - } pos[MAX_TAPELEN]; + } pos[MAX_TAPE_LEN]; boolean no_valid_file; /* set when tape file missing or invalid */ }; @@ -1720,7 +1823,8 @@ struct GameInfo /* flags to handle bugs in and changes between different engine versions */ /* (for the latest engine version, these flags should always be "FALSE") */ - boolean use_bug_change_when_pushing; + boolean use_change_when_pushing_bug; + boolean use_block_last_field_bug; /* variable within running game */ int yamyam_content_nr; @@ -1746,7 +1850,8 @@ struct GameInfo struct GlobalInfo { char *autoplay_leveldir; - int autoplay_level_nr; + int autoplay_level[MAX_TAPES_PER_SET]; + boolean autoplay_all; char *convert_leveldir; int convert_level_nr; @@ -1762,7 +1867,11 @@ struct ElementChangeInfo { boolean can_change; /* use or ignore this change info */ +#if 1 + boolean has_event[NUM_CHANGE_EVENTS]; /* change events */ +#else unsigned long events; /* change events */ +#endif int trigger_player; /* player triggering change */ int trigger_side; /* side triggering change */ @@ -1785,6 +1894,11 @@ struct ElementChangeInfo boolean explode; /* explode instead of change */ + boolean use_change_action; /* execute change action after change */ + int change_action; /* type of change action after change */ + int change_action_mode; /* mode of change action after change */ + int change_action_arg; /* parameter of change action after change */ + /* ---------- internal values used at runtime when playing ---------- */ /* functions that are called before, while and after the change of an @@ -1886,6 +2000,8 @@ struct ElementInfo int explosion_delay; /* duration of explosion of this element */ int ignition_delay; /* delay for explosion by other explosion */ + int counter_initial; /* initial value of generic CE counter */ + struct ElementChangeInfo *change_page; /* actual list of change pages */ struct ElementChangeInfo *change; /* pointer to current change page */ @@ -1896,7 +2012,11 @@ struct ElementInfo /* ---------- internal values used at runtime when playing ---------- */ +#if 1 + boolean has_change_event[NUM_CHANGE_EVENTS]; +#else unsigned long change_events; /* bitfield for combined change events */ +#endif int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */ struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */ @@ -1908,6 +2028,8 @@ struct ElementInfo boolean can_leave_element_last; #endif + int counter; /* current value of generic CE counter */ + /* ---------- internal values used in level editor ---------- */ int access_type; /* walkable or passable */ @@ -2076,8 +2198,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 unsigned long Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; -extern unsigned long ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern boolean Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern short ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short CheckCollision[MAX_LEV_FIELDX][MAX_LEV_FIELDY];