X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=b37e21c50ebf6c13670763a9f23dd9dff66d0b26;hb=77ed16f5281022dce4854250c08ec288f37a99e8;hp=71f525facd0af881ce90e911262a170d0f443735;hpb=3f336329750dff46fe1634f317eee24515cd9d11;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 71f525fa..b37e21c5 100644 --- a/src/main.h +++ b/src/main.h @@ -24,14 +24,17 @@ #include "libgame/libgame.h" #include "game_em/game_em.h" +#include "game_sp/game_sp.h" #include "conf_gfx.h" /* include auto-generated data structure definitions */ #include "conf_snd.h" /* include auto-generated data structure definitions */ #include "conf_mus.h" /* include auto-generated data structure definitions */ + #define IMG_UNDEFINED (-1) #define IMG_EMPTY IMG_EMPTY_SPACE -#define IMG_SP_EMPTY IMG_SP_EMPTY_SPACE +#define IMG_SP_EMPTY IMG_EMPTY_SPACE +#define IMG_SP_EMPTY_SPACE IMG_EMPTY_SPACE #define IMG_EXPLOSION IMG_DEFAULT_EXPLODING #define IMG_CHAR_START IMG_CHAR_SPACE #define IMG_STEEL_CHAR_START IMG_STEEL_CHAR_SPACE @@ -40,13 +43,17 @@ #define SND_UNDEFINED (-1) #define MUS_UNDEFINED (-1) +#if 0 #define WIN_XSIZE 672 #define WIN_YSIZE 560 +#endif #define DEFAULT_FULLSCREEN_MODE "800x600" +#if 0 #define SCR_FIELDX 17 #define SCR_FIELDY 17 +#endif #define MAX_BUF_XSIZE (SCR_FIELDX + 2) #define MAX_BUF_YSIZE (SCR_FIELDY + 2) #define MIN_LEV_FIELDX 3 @@ -108,6 +115,7 @@ #define EP_THROWABLE 28 #define EP_CAN_EXPLODE 29 #define EP_GRAVITY_REACHABLE 30 +#define EP_DONT_GET_HIT_BY 31 /* values for pre-defined properties */ /* (from here on, values can be changed by inserting new values) */ @@ -280,6 +288,7 @@ PLAYER_BITS_3 | \ PLAYER_BITS_4) #define PLAYER_BITS_TRIGGER (1 << 4) +#define PLAYER_BITS_ACTION (1 << 5) /* values for move directions (bits 0 - 3: basic move directions) */ #define MV_BIT_PREVIOUS 4 @@ -336,7 +345,7 @@ #define CP_WHEN_REMOVABLE 4 #define CP_WHEN_WALKABLE 5 -/* values for change actions for custom elements */ +/* values for change actions for custom elements (stored in level file) */ #define CA_NO_ACTION 0 #define CA_EXIT_PLAYER 1 #define CA_KILL_PLAYER 2 @@ -355,6 +364,9 @@ #define CA_SET_CE_SCORE 15 #define CA_SET_CE_VALUE 16 #define CA_SET_ENGINE_SCAN_MODE 17 +#define CA_SET_PLAYER_INVENTORY 18 +#define CA_SET_CE_ARTWORK 19 +#define CA_SET_LEVEL_RANDOM_SEED 20 #define CA_HEADLINE_LEVEL_ACTIONS 250 #define CA_HEADLINE_PLAYER_ACTIONS 251 @@ -394,6 +406,7 @@ #define CA_ARG_PLAYER_4 (CA_ARG_PLAYER + PLAYER_BITS_4) #define CA_ARG_PLAYER_ANY (CA_ARG_PLAYER + PLAYER_BITS_ANY) #define CA_ARG_PLAYER_TRIGGER (CA_ARG_PLAYER + PLAYER_BITS_TRIGGER) +#define CA_ARG_PLAYER_ACTION (CA_ARG_PLAYER + PLAYER_BITS_ACTION) #define CA_ARG_PLAYER_HEADLINE (CA_ARG_PLAYER + 999) #define CA_ARG_NUMBER 11000 #define CA_ARG_NUMBER_MIN (CA_ARG_NUMBER + 0) @@ -410,15 +423,19 @@ #define CA_ARG_ELEMENT_RESET (CA_ARG_ELEMENT + 0) #define CA_ARG_ELEMENT_TARGET (CA_ARG_ELEMENT + 1) #define CA_ARG_ELEMENT_TRIGGER (CA_ARG_ELEMENT + 2) +#define CA_ARG_ELEMENT_ACTION (CA_ARG_ELEMENT + 7) #define CA_ARG_ELEMENT_HEADLINE (CA_ARG_ELEMENT + 997) #define CA_ARG_ELEMENT_CV_TARGET (CA_ARG_ELEMENT_TARGET) #define CA_ARG_ELEMENT_CV_TRIGGER (CA_ARG_ELEMENT_TRIGGER) +#define CA_ARG_ELEMENT_CV_ACTION (CA_ARG_ELEMENT_ACTION) #define CA_ARG_ELEMENT_CV_HEADLINE (CA_ARG_ELEMENT_HEADLINE) #define CA_ARG_ELEMENT_NR_TARGET (CA_ARG_ELEMENT + 3) #define CA_ARG_ELEMENT_NR_TRIGGER (CA_ARG_ELEMENT + 4) +#define CA_ARG_ELEMENT_NR_ACTION (CA_ARG_ELEMENT + 8) #define CA_ARG_ELEMENT_NR_HEADLINE (CA_ARG_ELEMENT + 998) #define CA_ARG_ELEMENT_CS_TARGET (CA_ARG_ELEMENT + 5) #define CA_ARG_ELEMENT_CS_TRIGGER (CA_ARG_ELEMENT + 6) +#define CA_ARG_ELEMENT_CS_ACTION (CA_ARG_ELEMENT + 9) #define CA_ARG_ELEMENT_CS_HEADLINE (CA_ARG_ELEMENT + 999) #define CA_ARG_SPEED 13000 #define CA_ARG_SPEED_NOT_MOVING (CA_ARG_SPEED + STEPSIZE_NOT_MOVING) @@ -455,6 +472,16 @@ #define CA_ARG_SCAN_MODE_NORMAL (CA_ARG_SCAN_MODE + MV_NORMAL) #define CA_ARG_SCAN_MODE_REVERSE (CA_ARG_SCAN_MODE + MV_REVERSE) #define CA_ARG_SCAN_MODE_HEADLINE (CA_ARG_SCAN_MODE + 999) +#define CA_ARG_INVENTORY 18000 +#define CA_ARG_INVENTORY_RESET (CA_ARG_INVENTORY + 0) +#define CA_ARG_INVENTORY_RM_TARGET (CA_ARG_INVENTORY + 1) +#define CA_ARG_INVENTORY_RM_TRIGGER (CA_ARG_INVENTORY + 2) +#define CA_ARG_INVENTORY_RM_ACTION (CA_ARG_INVENTORY + 3) +#define CA_ARG_INVENTORY_RM_FIRST (CA_ARG_INVENTORY + 4) +#define CA_ARG_INVENTORY_RM_LAST (CA_ARG_INVENTORY + 5) +#define CA_ARG_INVENTORY_RM_ALL (CA_ARG_INVENTORY + 6) +#define CA_ARG_INVENTORY_HEADLINE (CA_ARG_INVENTORY + 998) +#define CA_ARG_INVENTORY_RM_HEADLINE (CA_ARG_INVENTORY + 999) #define CA_ARG_UNDEFINED 65535 /* values for custom move patterns (bits 0 - 3: basic move directions) */ @@ -548,6 +575,7 @@ #define IS_THROWABLE(e) HAS_PROPERTY(e, EP_THROWABLE) #define CAN_EXPLODE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE) #define IS_GRAVITY_REACHABLE(e) HAS_PROPERTY(e, EP_GRAVITY_REACHABLE) +#define DONT_GET_HIT_BY(e) HAS_PROPERTY(e, EP_DONT_GET_HIT_BY) /* macros for special configurable properties */ #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) @@ -674,9 +702,11 @@ (e) <= EL_EM_GATE_4) #define IS_EMC_GATE(e) ((e) >= EL_EMC_GATE_5 && \ (e) <= EL_EMC_GATE_8) +#define IS_DC_GATE(e) ((e) == EL_DC_GATE_WHITE) #define IS_GATE(e) (IS_RND_GATE(e) || \ IS_EM_GATE(e) || \ - IS_EMC_GATE(e)) + IS_EMC_GATE(e) || \ + IS_DC_GATE(e)) #define RND_GATE_NR(e) ((e) - EL_GATE_1) #define EM_GATE_NR(e) ((e) - EL_EM_GATE_1) #define EMC_GATE_NR(e) ((e) - EL_EMC_GATE_5 + 4) @@ -696,12 +726,17 @@ (e) <= EL_EMC_GATE_8_GRAY) #define IS_EMC_GATE_GRAY_ACTIVE(e) ((e) >= EL_EMC_GATE_5_GRAY_ACTIVE && \ (e) <= EL_EMC_GATE_8_GRAY_ACTIVE) +#define IS_DC_GATE_GRAY(e) ((e) == EL_DC_GATE_WHITE_GRAY) +#define IS_DC_GATE_GRAY_ACTIVE(e) ((e) == EL_DC_GATE_WHITE_GRAY_ACTIVE) + #define IS_GATE_GRAY(e) (IS_RND_GATE_GRAY(e) || \ IS_EM_GATE_GRAY(e) || \ - IS_EMC_GATE_GRAY(e)) + IS_EMC_GATE_GRAY(e) || \ + IS_DC_GATE_GRAY(e)) #define IS_GATE_GRAY_ACTIVE(e) (IS_RND_GATE_GRAY_ACTIVE(e) || \ IS_EM_GATE_GRAY_ACTIVE(e) || \ - IS_EMC_GATE_GRAY_ACTIVE(e)) + IS_EMC_GATE_GRAY_ACTIVE(e) || \ + IS_DC_GATE_GRAY_ACTIVE(e)) #define RND_GATE_GRAY_NR(e) ((e) - EL_GATE_1_GRAY) #define RND_GATE_GRAY_ACTIVE_NR(e) ((e) - EL_GATE_1_GRAY_ACTIVE) #define EM_GATE_GRAY_NR(e) ((e) - EL_EM_GATE_1_GRAY) @@ -731,8 +766,27 @@ #define IS_DC_STEELWALL_2(e) ((e) >= EL_DC_STEELWALL_2_LEFT && \ (e) <= EL_DC_STEELWALL_2_SINGLE) +#if 1 + +#if 1 +#define GFX_ELEMENT(e) (element_info[e].gfx_element) +#else +#define GFX_ELEMENT(e) (element_info[e].gfx_element == \ + (element_info[e].use_gfx_element ? \ + element_info[e].gfx_element : e) ? \ + element_info[e].gfx_element : \ + element_info[e].gfx_element + \ + 0 * printf("::: %d: %d <-> %d\n", \ + e, \ + element_info[e].gfx_element, \ + element_info[e].use_gfx_element ? \ + element_info[e].gfx_element : e)) +#endif + +#else #define GFX_ELEMENT(e) (element_info[e].use_gfx_element ? \ element_info[e].gfx_element : e) +#endif /* !!! CHECK THIS !!! */ #if 1 @@ -888,7 +942,12 @@ #define STD_ELEMENT_CONTENTS 4 #define MAX_ELEMENT_CONTENTS 8 +/* values for initial player inventory */ +#define MIN_INITIAL_INVENTORY_SIZE 1 +#define MAX_INITIAL_INVENTORY_SIZE 8 + /* often used screen positions */ +#if 0 #define SX 8 #define SY 8 #define REAL_SX (SX - 2) @@ -899,6 +958,7 @@ #define VY 400 #define EX DX #define EY (VY - 44) +#endif #define TILESIZE 32 #define TILEX TILESIZE #define TILEY TILESIZE @@ -1465,7 +1525,9 @@ #define EL_QUICKSAND_FAST_EMPTY 861 #define EL_QUICKSAND_FAST_FULL 862 -#define NUM_FILE_ELEMENTS 863 +#define EL_FROM_LEVEL_TEMPLATE 863 + +#define NUM_FILE_ELEMENTS 864 /* "real" (and therefore drawable) runtime elements */ @@ -1766,11 +1828,12 @@ #define GFX_SPECIAL_ARG_SETUP 9 #define GFX_SPECIAL_ARG_PLAYING 10 #define GFX_SPECIAL_ARG_DOOR 11 -#define GFX_SPECIAL_ARG_PANEL 12 -#define GFX_SPECIAL_ARG_PREVIEW 13 -#define GFX_SPECIAL_ARG_CRUMBLED 14 +#define GFX_SPECIAL_ARG_TAPE 12 +#define GFX_SPECIAL_ARG_PANEL 13 +#define GFX_SPECIAL_ARG_PREVIEW 14 +#define GFX_SPECIAL_ARG_CRUMBLED 15 -#define NUM_SPECIAL_GFX_ARGS 15 +#define NUM_SPECIAL_GFX_ARGS 16 /* these additional definitions are currently only used for draw offsets */ #define GFX_SPECIAL_ARG_INFO_MAIN 0 @@ -1792,12 +1855,15 @@ #define GFX_SPECIAL_ARG_SETUP_SOUND 4 #define GFX_SPECIAL_ARG_SETUP_ARTWORK 5 #define GFX_SPECIAL_ARG_SETUP_INPUT 6 -#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_1 7 -#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_2 8 -#define GFX_SPECIAL_ARG_SETUP_CHOOSE_ARTWORK 9 -#define GFX_SPECIAL_ARG_SETUP_CHOOSE_OTHER 10 +#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS 7 +#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_1 8 +#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_2 9 +#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_3 10 +#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_4 11 +#define GFX_SPECIAL_ARG_SETUP_CHOOSE_ARTWORK 12 +#define GFX_SPECIAL_ARG_SETUP_CHOOSE_OTHER 13 -#define NUM_SPECIAL_GFX_SETUP_ARGS 11 +#define NUM_SPECIAL_GFX_SETUP_ARGS 14 /* values for image configuration suffixes */ @@ -1847,8 +1913,14 @@ #define GFX_ARG_ALIGN 43 #define GFX_ARG_VALIGN 44 #define GFX_ARG_SORT_PRIORITY 45 +#define GFX_ARG_CLASS 46 +#define GFX_ARG_STYLE 47 +#define GFX_ARG_ACTIVE_XOFFSET 48 +#define GFX_ARG_ACTIVE_YOFFSET 49 +#define GFX_ARG_PRESSED_XOFFSET 50 +#define GFX_ARG_PRESSED_YOFFSET 51 -#define NUM_GFX_ARGS 46 +#define NUM_GFX_ARGS 52 /* values for sound configuration suffixes */ @@ -1934,13 +2006,14 @@ #define GAME_MODE_SETUP 9 #define GAME_MODE_PLAYING 10 #define GAME_MODE_PSEUDO_DOOR 11 -#define GAME_MODE_PSEUDO_PANEL 12 -#define GAME_MODE_PSEUDO_PREVIEW 13 -#define GAME_MODE_PSEUDO_CRUMBLED 14 +#define GAME_MODE_PSEUDO_TAPE 12 +#define GAME_MODE_PSEUDO_PANEL 13 +#define GAME_MODE_PSEUDO_PREVIEW 14 +#define GAME_MODE_PSEUDO_CRUMBLED 15 /* there are no special config file suffixes for these modes */ -#define GAME_MODE_PSEUDO_TYPENAME 15 -#define GAME_MODE_QUIT 16 +#define GAME_MODE_PSEUDO_TYPENAME 16 +#define GAME_MODE_QUIT 17 /* special definitions currently only used for custom artwork configuration */ #define MUSIC_PREFIX_BACKGROUND 0 @@ -1954,13 +2027,13 @@ /* program information and versioning definitions */ #define PROGRAM_VERSION_MAJOR 3 -#define PROGRAM_VERSION_MINOR 2 -#define PROGRAM_VERSION_PATCH 5 -#define PROGRAM_VERSION_BUILD 0 +#define PROGRAM_VERSION_MINOR 3 +#define PROGRAM_VERSION_PATCH 0 +#define PROGRAM_VERSION_BUILD 2 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" -#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2008 by Holger Schemel" +#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2010 by Holger Schemel" #define PROGRAM_EMAIL_STRING "info@artsoft.org" #define PROGRAM_WEBSITE_STRING "http://www.artsoft.org/" #define PROGRAM_GAME_BY_STRING "A Game by Artsoft Entertainment" @@ -2048,8 +2121,9 @@ #define GAME_ENGINE_TYPE_UNKNOWN LEVEL_FILE_TYPE_UNKNOWN #define GAME_ENGINE_TYPE_RND LEVEL_FILE_TYPE_RND #define GAME_ENGINE_TYPE_EM LEVEL_FILE_TYPE_EM +#define GAME_ENGINE_TYPE_SP LEVEL_FILE_TYPE_SP -#define NUM_ENGINE_TYPES 3 +#define NUM_ENGINE_TYPES 4 struct BorderInfo @@ -2189,6 +2263,14 @@ struct PreviewInfo int anim_mode; }; +struct ViewportInfo +{ + struct RectWithBorder window; + struct RectWithBorder playfield[NUM_SPECIAL_GFX_ARGS]; + struct RectWithBorder door_1[NUM_SPECIAL_GFX_ARGS]; + struct RectWithBorder door_2[NUM_SPECIAL_GFX_ARGS]; +}; + struct HiScore { char Name[MAX_PLAYER_NAME_LEN + 1]; @@ -2230,6 +2312,12 @@ struct DateInfo int year; int month; int day; + + enum + { + DATE_SRC_CLOCK, + DATE_SRC_LEVELFILE + } src; }; struct LevelInfo @@ -2240,6 +2328,7 @@ struct LevelInfo /* level stored in native format for the alternative native game engines */ struct LevelInfo_EM *native_em_level; + struct LevelInfo_SP *native_sp_level; int file_version; /* file format version the level is stored with */ int game_version; /* game release version the level was created with */ @@ -2258,6 +2347,8 @@ struct LevelInfo char name[MAX_LEVEL_NAME_LEN + 1]; char author[MAX_LEVEL_AUTHOR_LEN + 1]; + int random_seed; + struct EnvelopeInfo envelope[NUM_ENVELOPES]; int score[LEVEL_SCORE_ELEMENTS]; @@ -2318,13 +2409,19 @@ struct LevelInfo int initial_player_stepsize[MAX_PLAYERS]; /* initial player speed */ boolean initial_player_gravity[MAX_PLAYERS]; + boolean use_initial_inventory[MAX_PLAYERS]; + int initial_inventory_size[MAX_PLAYERS]; + int initial_inventory_content[MAX_PLAYERS][MAX_INITIAL_INVENTORY_SIZE]; + boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */ + boolean em_explodes_by_fire; /* EM style chain explosion behaviour */ boolean use_spring_bug; /* for compatibility with old levels */ boolean use_time_orb_bug; /* for compatibility with old levels */ boolean instant_relocation; /* no visual delay when relocating player */ boolean shifted_relocation; /* no level centering when relocating player */ boolean can_pass_to_walkable; /* player can pass to empty or walkable tile */ boolean grow_into_diggable; /* amoeba can grow into anything diggable */ + boolean auto_exit_sokoban; /* automatically finish solved Sokoban levels */ boolean continuous_snapping; /* repeated snapping without releasing key */ boolean block_snap_field; /* snapping blocks field to show animation */ @@ -2341,6 +2438,9 @@ struct LevelInfo boolean no_valid_file; /* set when level file missing or invalid */ boolean changed; /* set when level was changed in the editor */ + + /* runtime flags to handle bugs in old levels (not stored in level file) */ + boolean use_action_after_change_bug; }; struct GlobalInfo @@ -2399,6 +2499,7 @@ struct ElementChangeInfo int action_type; /* type of action */ int action_mode; /* mode of action */ int action_arg; /* parameter of action */ + int action_element; /* element related to action */ /* ---------- internal values used at runtime when playing ---------- */ @@ -2481,7 +2582,7 @@ struct ElementInfo unsigned long properties[NUM_EP_BITFIELDS]; /* element base properties */ boolean use_gfx_element; /* use custom graphic element */ - int gfx_element; /* optional custom graphic element */ + int gfx_element_initial; /* initial optional custom graphic element */ int access_direction; /* accessible from which direction */ @@ -2532,6 +2633,8 @@ struct ElementInfo boolean in_group[NUM_GROUP_ELEMENTS]; + int gfx_element; /* runtime optional custom graphic element */ + int collect_score; /* runtime score value for collecting */ /* count of this element on playfield, calculated after each frame */ @@ -2616,6 +2719,14 @@ struct GraphicInfo int align, valign; /* optional setting for drawing title screens */ int sort_priority; /* optional setting for drawing title screens */ + int class; + int style; + + int active_xoffset; + int active_yoffset; + int pressed_xoffset; + int pressed_yoffset; + boolean use_image_size; /* use image size as default width and height */ #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -2692,6 +2803,7 @@ struct HelpAnimInfo }; +extern Bitmap *bitmap_db_store; extern Bitmap *bitmap_db_cross; extern Bitmap *bitmap_db_field; extern Bitmap *bitmap_db_panel; @@ -2712,7 +2824,11 @@ extern SDL_Thread *server_thread; extern int key_joystick_mapping; +#if 1 +extern boolean redraw[MAX_LEV_FIELDX + 2][MAX_LEV_FIELDY + 2]; +#else extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; +#endif extern int redraw_x1, redraw_y1; extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; @@ -2757,6 +2873,15 @@ extern int ActiveFont[NUM_FONTS]; extern int lev_fieldx, lev_fieldy; extern int scroll_x, scroll_y; +extern int WIN_XSIZE, WIN_YSIZE; +extern int SCR_FIELDX, SCR_FIELDY; +extern int SX, SY; +extern int REAL_SX, REAL_SY; +extern int DX, DY; +extern int VX, VY; +extern int EX, EY; +extern int dDX, dDY; + extern int FX, FY; extern int ScrollStepSize; extern int ScreenMovDir, ScreenMovPos, ScreenGfxPos; @@ -2783,6 +2908,7 @@ extern struct HiScore highscore[]; extern struct TapeInfo tape; extern struct GlobalInfo global; extern struct BorderInfo border; +extern struct ViewportInfo viewport; extern struct TitleFadingInfo fading; extern struct TitleFadingInfo fading_none; extern struct TitleFadingInfo title_initial_default; @@ -2792,7 +2918,7 @@ extern struct TitleMessageInfo titlemessage_initial[]; extern struct TitleMessageInfo titlemessage_default; extern struct TitleMessageInfo titlemessage[]; extern struct TitleMessageInfo readme; -extern struct InitInfo init; +extern struct InitInfo init, init_last; extern struct MenuInfo menu; extern struct DoorInfo door_1, door_2; extern struct PreviewInfo preview;