rnd-20060816-2-src
[rocksndiamonds.git] / src / main.h
index 670711500babb17db6313394ca4708ac42c74f2c..cd6ffe2b3bd8d9f020f56221c6a802e26321c2aa 100644 (file)
@@ -42,6 +42,8 @@
 #define WIN_XSIZE                      672
 #define WIN_YSIZE                      560
 
+#define DEFAULT_FULLSCREEN_MODE                "800x600"
+
 #define SCR_FIELDX                     17
 #define SCR_FIELDY                     17
 #define MAX_BUF_XSIZE                  (SCR_FIELDX + 2)
 #define EP_HAS_ACTION                  87
 #define EP_CAN_CHANGE_OR_HAS_ACTION    88
 
-#define NUM_ELEMENT_PROPERTIES         89
+/* values for internal purpose only (other) */
+#define EP_OBSOLETE                    89
+
+#define NUM_ELEMENT_PROPERTIES         90
 
 #define NUM_EP_BITFIELDS               ((NUM_ELEMENT_PROPERTIES + 31) / 32)
-#define EP_BITFIELD_BASE               0
+#define EP_BITFIELD_BASE_NR            0
 
+#define EP_BITMASK_BASE_DEFAULT                (1 << EP_CAN_MOVE_INTO_ACID)
 #define EP_BITMASK_DEFAULT             0
 
 #define PROPERTY_BIT(p)                        (1 << ((p) % 32))
 #define CE_CREATION_OF_X               37
 #define CE_SCORE_GETS_ZERO             38
 #define CE_SCORE_GETS_ZERO_OF_X                39
+#define CE_VALUE_CHANGES               40
+#define CE_VALUE_CHANGES_OF_X          41
+#define CE_SCORE_CHANGES               42
+#define CE_SCORE_CHANGES_OF_X          43
+
+#define NUM_CHANGE_EVENTS              44
 
-#define NUM_CHANGE_EVENTS              40
+#define NUM_CE_BITFIELDS               ((NUM_CHANGE_EVENTS + 31) / 32)
 
 #define CE_BITMASK_DEFAULT             0
 
+#define CH_EVENT_BITFIELD_NR(e)                (e / 32)
+#define CH_EVENT_BIT(e)                        (1 << ((e) % 32))
+
 #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 CA_SET_LEVEL_GEMS              7
 #define CA_SET_LEVEL_SCORE             8
 #define CA_SET_LEVEL_WIND              9
-#define CA_SET_LEVEL_GRAVITY           10
+#define CA_SET_PLAYER_GRAVITY          10
 #define CA_SET_PLAYER_KEYS             11
 #define CA_SET_PLAYER_SPEED            12
 #define CA_SET_PLAYER_SHIELD           13
 #define CAN_CHANGE_OR_HAS_ACTION(e)    \
                                HAS_PROPERTY(e, EP_CAN_CHANGE_OR_HAS_ACTION)
 
+#define IS_OBSOLETE(e)         HAS_PROPERTY(e, EP_OBSOLETE)
+
 /* special macros used in game engine */
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
                                 (e) <= EL_CUSTOM_END)
 #define IS_IN_GROUP(e, nr)     (element_info[e].in_group[nr] == TRUE)
 #define IS_IN_GROUP_EL(e, ge)  (IS_IN_GROUP(e, (ge) - EL_GROUP_START))
 
+#if 1
+#define IS_EQUAL_OR_IN_GROUP(e, ge)                                    \
+       (ge == EL_ANY_ELEMENT ? TRUE :                                  \
+        IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge))
+#else
 #define IS_EQUAL_OR_IN_GROUP(e, ge)                                    \
        (IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge))
 #endif
 
+#endif
+
 #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 ANIM_DELAY(g)          (graphic_info[g].anim_delay)
 #define ANIM_MODE(g)           (graphic_info[g].anim_mode)
 
+#define IS_ANIM_MODE_CE(g)     (graphic_info[g].anim_mode & (ANIM_CE_VALUE |  \
+                                                             ANIM_CE_SCORE |  \
+                                                             ANIM_CE_DELAY))
 #define IS_ANIMATED(g)         (ANIM_FRAMES(g) > 1)
 #define IS_NEW_DELAY(f, g)     ((f) % ANIM_DELAY(g) == 0)
 #define IS_NEW_FRAME(f, g)     (IS_ANIMATED(g) && IS_NEW_DELAY(f, g))
                                 IS_EDITOR_CASCADE_ACTIVE(e)   ? (e) - 1 : (e))
 
 #define EL_NAME(e)             ((e) >= 0 ? element_info[e].token_name : "(?)")
+#define MV_TEXT(d)             ((d) == MV_NONE  ? "MV_NONE"  :         \
+                                (d) == MV_LEFT  ? "MV_LEFT"  :         \
+                                (d) == MV_RIGHT ? "MV_RIGHT" :         \
+                                (d) == MV_UP    ? "MV_UP"    :         \
+                                (d) == MV_DOWN  ? "MV_DOWN"  : "(various)")
 
 /* fundamental game speed values */
 #define MICROLEVEL_SCROLL_DELAY        50      /* delay for scrolling micro level */
 #define MAX_ELEMENT_NAME_LEN   32
 #define MAX_TAPES_PER_SET      1024
 #define MAX_SCORE_ENTRIES      100
+#define MAX_NUM_TITLE_SCREENS  5
+
 #define MAX_NUM_AMOEBA         100
+
 #if 0  /* game.h */
 #define MAX_INVENTORY_SIZE     1000
 #define STD_NUM_KEYS           4
 #define MAX_NUM_KEYS           8
 #endif
+
 #define NUM_BELTS              4
 #define NUM_BELT_PARTS         3
+#define NUM_ENVELOPES          4
 #define MIN_ENVELOPE_XSIZE     1
 #define MIN_ENVELOPE_YSIZE     1
 #define MAX_ENVELOPE_XSIZE     30
 #define STD_ELEMENT_CONTENTS   4
 #define MAX_ELEMENT_CONTENTS   8
 
-#define LEVEL_SCORE_ELEMENTS   16      /* level elements with score */
-
 /* often used screen positions */
 #define SX                     8
 #define SY                     8
 #define MICROLEVEL_XSIZE       ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
 #define MICROLEVEL_YSIZE       ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
 #define MICROLEVEL_XPOS                (SX + (SXSIZE - MICROLEVEL_XSIZE) / 2)
-#define MICROLEVEL_YPOS                (SX + 12 * TILEY - MICRO_TILEY)
+#define MICROLEVEL_YPOS                (SY + 12 * TILEY - MICRO_TILEY)
 #define MICROLABEL1_YPOS       (MICROLEVEL_YPOS - 36)
 #define MICROLABEL2_YPOS       (MICROLEVEL_YPOS + MICROLEVEL_YSIZE + 7)
 
 #define SC_CRYSTAL             11
 #define SC_PEARL               12
 #define SC_SHIELD              13
+#define SC_UNKNOWN_14          14
+#define SC_UNKNOWN_15          15
+
+#define LEVEL_SCORE_ELEMENTS   16      /* level elements with score */
 
 
 /* "real" level file elements */
 #define EL_YAMYAM_UP                   711
 #define EL_YAMYAM_DOWN                 712
 
-#define NUM_FILE_ELEMENTS              713
+#define EL_BD_EXPANDABLE_WALL          713
+
+#define EL_LAST_CE_8                   714
+#define EL_LAST_CE_7                   715
+#define EL_LAST_CE_6                   716
+#define EL_LAST_CE_5                   717
+#define EL_LAST_CE_4                   718
+#define EL_LAST_CE_3                   719
+#define EL_LAST_CE_2                   720
+#define EL_LAST_CE_1                   721
+#define EL_SELF                                722
+#define EL_NEXT_CE_1                   723
+#define EL_NEXT_CE_2                   724
+#define EL_NEXT_CE_3                   725
+#define EL_NEXT_CE_4                   726
+#define EL_NEXT_CE_5                   727
+#define EL_NEXT_CE_6                   728
+#define EL_NEXT_CE_7                   729
+#define EL_NEXT_CE_8                   730
+#define EL_ANY_ELEMENT                 731
+
+#define NUM_FILE_ELEMENTS              732
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_INTERNAL_CASCADE_CE_ACTIVE          (EL_FIRST_INTERNAL + 23)
 #define EL_INTERNAL_CASCADE_GE                 (EL_FIRST_INTERNAL + 24)
 #define EL_INTERNAL_CASCADE_GE_ACTIVE          (EL_FIRST_INTERNAL + 25)
-#define EL_INTERNAL_CASCADE_USER               (EL_FIRST_INTERNAL + 26)
-#define EL_INTERNAL_CASCADE_USER_ACTIVE                (EL_FIRST_INTERNAL + 27)
-#define EL_INTERNAL_CASCADE_GENERIC            (EL_FIRST_INTERNAL + 28)
-#define EL_INTERNAL_CASCADE_GENERIC_ACTIVE     (EL_FIRST_INTERNAL + 29)
+#define EL_INTERNAL_CASCADE_REF                        (EL_FIRST_INTERNAL + 26)
+#define EL_INTERNAL_CASCADE_REF_ACTIVE         (EL_FIRST_INTERNAL + 27)
+#define EL_INTERNAL_CASCADE_USER               (EL_FIRST_INTERNAL + 28)
+#define EL_INTERNAL_CASCADE_USER_ACTIVE                (EL_FIRST_INTERNAL + 29)
 #define EL_INTERNAL_CASCADE_DYNAMIC            (EL_FIRST_INTERNAL + 30)
 #define EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE     (EL_FIRST_INTERNAL + 31)
 
 
 /* values for special image configuration suffixes (must match game mode) */
 #define GFX_SPECIAL_ARG_DEFAULT                0
-#define GFX_SPECIAL_ARG_MAIN           1
-#define GFX_SPECIAL_ARG_LEVELS         2
-#define GFX_SPECIAL_ARG_SCORES         3
-#define GFX_SPECIAL_ARG_EDITOR         4
-#define GFX_SPECIAL_ARG_INFO           5
-#define GFX_SPECIAL_ARG_SETUP          6
-#define GFX_SPECIAL_ARG_PLAYING                7
-#define GFX_SPECIAL_ARG_DOOR           8
-#define GFX_SPECIAL_ARG_PREVIEW                9
-#define GFX_SPECIAL_ARG_CRUMBLED       10
+#define GFX_SPECIAL_ARG_TITLE          1
+#define GFX_SPECIAL_ARG_MAIN           2
+#define GFX_SPECIAL_ARG_LEVELS         3
+#define GFX_SPECIAL_ARG_SCORES         4
+#define GFX_SPECIAL_ARG_EDITOR         5
+#define GFX_SPECIAL_ARG_INFO           6
+#define GFX_SPECIAL_ARG_SETUP          7
+#define GFX_SPECIAL_ARG_PLAYING                8
+#define GFX_SPECIAL_ARG_DOOR           9
+#define GFX_SPECIAL_ARG_PREVIEW                10
+#define GFX_SPECIAL_ARG_CRUMBLED       11
 
-#define NUM_SPECIAL_GFX_ARGS           11
+#define NUM_SPECIAL_GFX_ARGS           12
 
 
 /* values for image configuration suffixes */
 
 /* values for game_status (must match special image configuration suffixes) */
 #define GAME_MODE_DEFAULT              0
-#define GAME_MODE_MAIN                 1
-#define GAME_MODE_LEVELS               2
-#define GAME_MODE_SCORES               3
-#define GAME_MODE_EDITOR               4
-#define GAME_MODE_INFO                 5
-#define GAME_MODE_SETUP                        6
-#define GAME_MODE_PLAYING              7
-#define GAME_MODE_PSEUDO_DOOR          8
-#define GAME_MODE_PSEUDO_PREVIEW       9
-#define GAME_MODE_PSEUDO_CRUMBLED      10
+#define GAME_MODE_TITLE                        1
+#define GAME_MODE_MAIN                 2
+#define GAME_MODE_LEVELS               3
+#define GAME_MODE_SCORES               4
+#define GAME_MODE_EDITOR               5
+#define GAME_MODE_INFO                 6
+#define GAME_MODE_SETUP                        7
+#define GAME_MODE_PLAYING              8
+#define GAME_MODE_PSEUDO_DOOR          9
+#define GAME_MODE_PSEUDO_PREVIEW       10
+#define GAME_MODE_PSEUDO_CRUMBLED      11
 
 /* there are no special config file suffixes for these modes */
-#define GAME_MODE_PSEUDO_TYPENAME      11
-#define GAME_MODE_QUIT                 12
+#define GAME_MODE_PSEUDO_TYPENAME      12
+#define GAME_MODE_QUIT                 13
 
 /* special definitions currently only used for custom artwork configuration */
 #define MUSIC_PREFIX_BACKGROUND                0
 /* program information and versioning definitions */
 #define PROGRAM_VERSION_MAJOR          3
 #define PROGRAM_VERSION_MINOR          2
-#define PROGRAM_VERSION_PATCH          0
-#define PROGRAM_VERSION_BUILD          8
+#define PROGRAM_VERSION_PATCH          1
+#define PROGRAM_VERSION_BUILD          0
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
-#define PROGRAM_COPYRIGHT_STRING       "Copyright ©1995-2006 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING       "Copyright ©1995-2006 by Holger Schemel"
+#define PROGRAM_EMAIL_STRING           "info@artsoft.org"
+#define PROGRAM_WEBSITE_STRING         "http://www.artsoft.org/"
 
 #define ICON_TITLE_STRING              PROGRAM_TITLE_STRING
 #define COOKIE_PREFIX                  "ROCKSNDIAMONDS"
 #define FILENAME_PREFIX                        "Rocks"
 
-#if defined(PLATFORM_UNIX)
-#define USERDATA_DIRECTORY             ".rocksndiamonds"
-#elif defined(PLATFORM_WIN32)
-#define USERDATA_DIRECTORY             PROGRAM_TITLE_STRING
+#define USERDATA_DIRECTORY_WIN32       PROGRAM_TITLE_STRING
+#define USERDATA_DIRECTORY_MACOSX      PROGRAM_TITLE_STRING
+#define USERDATA_DIRECTORY_UNIX                ".rocksndiamonds"
+#define USERDATA_DIRECTORY_DOS         "userdata"
+
+#if defined(PLATFORM_WIN32)
+#define USERDATA_DIRECTORY             USERDATA_DIRECTORY_WIN32
+#elif defined(PLATFORM_MACOSX)
+#define USERDATA_DIRECTORY             USERDATA_DIRECTORY_MACOSX
+#elif defined(PLATFORM_UNIX)
+#define USERDATA_DIRECTORY             USERDATA_DIRECTORY_UNIX
 #else
-#define USERDATA_DIRECTORY             "userdata"
+#define USERDATA_DIRECTORY             USERDATA_DIRECTORY_DOS
 #endif
 
 #define X11_ICON_FILENAME              "rocks_icon.xbm"
 #define X11_ICONMASK_FILENAME          "rocks_iconmask.xbm"
+#define SDL_ICON_FILENAME              "rocks_icon_32x32.pcx"
 #define MSDOS_POINTER_FILENAME         "mouse.pcx"
 
 /* file version numbers for resource files (levels, tapes, score, setup, etc.)
 #define FILE_VERSION_1_2               VERSION_IDENT(1,2,0,0)
 #define FILE_VERSION_1_4               VERSION_IDENT(1,4,0,0)
 #define FILE_VERSION_2_0               VERSION_IDENT(2,0,0,0)
+#define FILE_VERSION_3_0               VERSION_IDENT(3,0,0,0)
 
 /* file version does not change for every program version, but is changed
    when new features are introduced that are incompatible with older file
    versions, so that they can be treated accordingly */
-#define FILE_VERSION_ACTUAL            FILE_VERSION_2_0
+#define FILE_VERSION_ACTUAL            FILE_VERSION_3_0
 
 #define GAME_VERSION_1_0               FILE_VERSION_1_0
 #define GAME_VERSION_1_2               FILE_VERSION_1_2
 #define GAME_VERSION_1_4               FILE_VERSION_1_4
 #define GAME_VERSION_2_0               FILE_VERSION_2_0
+#define GAME_VERSION_3_0               FILE_VERSION_3_0
 
 #define GAME_VERSION_ACTUAL            VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
                                                      PROGRAM_VERSION_MINOR, \
@@ -1768,6 +1842,9 @@ struct MenuInfo
 
   int list_size[NUM_SPECIAL_GFX_ARGS];
 
+  int fade_delay;
+  int post_delay;
+
   int sound[NUM_SPECIAL_GFX_ARGS];
   int music[NUM_SPECIAL_GFX_ARGS];
 };
@@ -1781,6 +1858,15 @@ struct DoorInfo
   int anim_mode;
 };
 
+struct PreviewInfo
+{
+  int x, y;
+  int xsize, ysize;
+  int tile_size;
+  int step_offset;
+  int step_delay;
+};
+
 struct HiScore
 {
   char Name[MAX_PLAYER_NAME_LEN + 1];
@@ -1792,6 +1878,14 @@ struct Content
   int e[3][3];
 };
 
+struct EnvelopeInfo
+{
+  int xsize;
+  int ysize;
+
+  char text[MAX_ENVELOPE_TEXT_LEN + 1];
+};
+
 struct LevelSetInfo
 {
   int music[MAX_LEVELS];
@@ -1806,6 +1900,13 @@ struct LevelFileInfo
   char *filename;
 };
 
+struct DateInfo
+{
+  int year;
+  int month;
+  int day;
+};
+
 struct LevelInfo
 {
   struct LevelFileInfo file_info;
@@ -1818,6 +1919,8 @@ struct LevelInfo
   int file_version;    /* file format version the level is stored with    */
   int game_version;    /* game release version the level was created with */
 
+  struct DateInfo creation_date;
+
   boolean encoding_16bit_field;                /* level contains 16-bit elements  */
   boolean encoding_16bit_yamyam;       /* yamyam contains 16-bit elements */
   boolean encoding_16bit_amoeba;       /* amoeba contains 16-bit elements */
@@ -1830,8 +1933,7 @@ struct LevelInfo
   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];
+  struct EnvelopeInfo envelope[NUM_ENVELOPES];
 
   int score[LEVEL_SCORE_ELEMENTS];
 
@@ -1893,9 +1995,9 @@ struct LevelInfo
   int can_move_into_acid_bits; /* bitfield to store property for elements */
   int dont_collide_with_bits;  /* bitfield to store property for elements */
 
-  int initial_player_stepsize; /* initial player speed */
+  int initial_player_stepsize[MAX_PLAYERS];    /* initial player speed */
+  boolean initial_player_gravity[MAX_PLAYERS];
 
-  boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
   boolean use_spring_bug;      /* for compatibility with old levels */
   boolean use_time_orb_bug;    /* for compatibility with old levels */
@@ -2134,20 +2236,28 @@ struct GraphicInfo
 
   int src_x, src_y;            /* start position of animation frames */
   int width, height;           /* width/height of each animation frame */
+
   int offset_x, offset_y;      /* x/y offset to next animation frame */
   int offset2_x, offset2_y;    /* x/y offset to second movement tile */
+
   boolean double_movement;     /* animation has second movement tile */
   int swap_double_tiles;       /* explicitely force or forbid tile swapping */
+
   int anim_frames;
   int anim_frames_per_line;
   int anim_start_frame;
   int anim_delay;              /* important: delay of 1 means "no delay"! */
   int anim_mode;
+
   boolean anim_global_sync;
+
   int crumbled_like;           /* element for cloning crumble graphics */
   int diggable_like;           /* element for cloning digging graphics */
+
   int border_size;             /* border size for "crumbled" graphics */
+
   int scale_up_factor;         /* optional factor for scaling image up */
+
   int clone_from;              /* graphic for cloning *all* settings */
 
   int anim_delay_fixed;                /* optional delay values for bored and   */
@@ -2237,10 +2347,13 @@ struct HelpAnimInfo
 };
 
 
-extern Bitmap                 *bitmap_db_field, *bitmap_db_door;
+extern Bitmap                 *bitmap_db_cross;
+extern Bitmap                 *bitmap_db_field;
+extern Bitmap                 *bitmap_db_panel;
+extern Bitmap                 *bitmap_db_door;
 extern Pixmap                  tile_clipmask[];
-extern DrawBuffer            *fieldbuffer;
-extern DrawBuffer            *drawto_field;
+extern DrawBuffer             *fieldbuffer;
+extern DrawBuffer             *drawto_field;
 
 extern int                     game_status;
 extern boolean                 level_editor_test_game;
@@ -2325,6 +2438,7 @@ extern struct TapeInfo            tape;
 extern struct GlobalInfo       global;
 extern struct MenuInfo         menu;
 extern struct DoorInfo         door_1, door_2;
+extern struct PreviewInfo      preview;
 extern struct ElementInfo      element_info[];
 extern struct ElementNameInfo  element_name_info[];
 extern struct ElementActionInfo        element_action_info[];