rnd-20060816-2-src
[rocksndiamonds.git] / src / main.h
index 5d1d97c2a39ebce8db2023396c42cc439cbe2f5a..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 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 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 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 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)
 
 /* 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, \
@@ -1791,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];
 };
@@ -1804,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];
@@ -1815,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];
@@ -1829,6 +1900,13 @@ struct LevelFileInfo
   char *filename;
 };
 
+struct DateInfo
+{
+  int year;
+  int month;
+  int day;
+};
+
 struct LevelInfo
 {
   struct LevelFileInfo file_info;
@@ -1841,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 */
@@ -1853,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];
 
@@ -1916,9 +1995,7 @@ 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 */
-
-  boolean initial_gravity;
+  int initial_player_stepsize[MAX_PLAYERS];    /* initial player speed */
   boolean initial_player_gravity[MAX_PLAYERS];
 
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
@@ -2159,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   */
@@ -2262,8 +2347,9 @@ struct HelpAnimInfo
 };
 
 
-extern Bitmap                 *bitmap_db_title;
+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;
@@ -2352,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[];