rnd-20060112-1-src
[rocksndiamonds.git] / src / libgame / system.h
index f39eb1b1a546d4ab450160a008819f5562a0a2f3..bc434d362208c8c28c65fa1bcf0ade268381aa6b 100644 (file)
 #define BUTTON_1               4
 #define BUTTON_2               5
 
-/* values for move direction and special "button" key bitmasks */
-#define MV_NO_MOVING           0
+/* values for move directions and special "button" key bitmasks */
+#define MV_NONE                        0
 #define MV_LEFT                        (1 << MV_BIT_LEFT)
 #define MV_RIGHT               (1 << MV_BIT_RIGHT)
 #define MV_UP                  (1 << MV_BIT_UP)
 #define MV_DOWN                        (1 << MV_BIT_DOWN)
 
+#define MV_HORIZONTAL          (MV_LEFT | MV_RIGHT)
+#define MV_VERTICAL            (MV_UP   | MV_DOWN)
+#define MV_ALL_DIRECTIONS      (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
+#define MV_ANY_DIRECTION       (MV_ALL_DIRECTIONS)
+#define MV_NO_DIRECTION                (MV_NONE)
+
 #define KEY_BUTTON_1           (1 << BUTTON_1)
 #define KEY_BUTTON_2           (1 << BUTTON_2)
 #define KEY_MOTION             (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
 #define MV_DIR_OPPOSITE(x)     ((x) == MV_LEFT  ? MV_RIGHT :           \
                                 (x) == MV_RIGHT ? MV_LEFT  :           \
                                 (x) == MV_UP    ? MV_DOWN  :           \
-                                (x) == MV_DOWN  ? MV_UP    : MV_NO_MOVING)
+                                (x) == MV_DOWN  ? MV_UP    : MV_NONE)
 
 
 /* values for animation mode (frame order and direction) */
 #define ANIM_PINGPONG          (1 << 2)
 #define ANIM_PINGPONG2         (1 << 3)
 #define ANIM_RANDOM            (1 << 4)
-#define ANIM_REVERSE           (1 << 5)
+#define ANIM_CE_VALUE          (1 << 5)
+#define ANIM_CE_SCORE          (1 << 6)
+#define ANIM_REVERSE           (1 << 7)
 
 /* values for special (non game element) animation modes */
-#define ANIM_HORIZONTAL                (1 << 6)
-#define ANIM_VERTICAL          (1 << 7)
+#define ANIM_HORIZONTAL                (1 << 8)
+#define ANIM_VERTICAL          (1 << 9)
 
 #define ANIM_DEFAULT           ANIM_LOOP
 
 #define SETUP_FILENAME         "setup.conf"
 #define LEVELSETUP_FILENAME    "levelsetup.conf"
 #define EDITORSETUP_FILENAME   "editorsetup.conf"
+#define EDITORCASCADE_FILENAME "editorcascade.conf"
 #define HELPANIM_FILENAME      "helpanim.conf"
 #define HELPTEXT_FILENAME      "helptext.conf"
 #define LEVELINFO_FILENAME     "levelinfo.conf"
 #define SETUP_FILENAME         "setup.cnf"
 #define LEVELSETUP_FILENAME    "lvlsetup.cnf"
 #define EDITORSETUP_FILENAME   "edsetup.cnf"
+#define EDITORCASCADE_FILENAME "edcascad.conf"
 #define HELPANIM_FILENAME      "helpanim.cnf"
 #define HELPTEXT_FILENAME      "helptext.cnf"
 #define LEVELINFO_FILENAME     "lvlinfo.cnf"
    PAGEX3: buffer for animations
 */
 
-#define DOOR_GFX_PAGESIZE      (gfx.dxsize)
+/* these values are hard-coded to be able to use them in initialization */
+#define DOOR_GFX_PAGE_WIDTH    100     /* should be set to "gfx.dxsize" */
+#define DOOR_GFX_PAGE_HEIGHT   280     /* should be set to "gfx.dysize" */
+
+#define DOOR_GFX_PAGESIZE      (DOOR_GFX_PAGE_WIDTH)
 #define DOOR_GFX_PAGEX1                (0 * DOOR_GFX_PAGESIZE)
 #define DOOR_GFX_PAGEX2                (1 * DOOR_GFX_PAGESIZE)
 #define DOOR_GFX_PAGEX3                (2 * DOOR_GFX_PAGESIZE)
 #define DOOR_GFX_PAGEX7                (6 * DOOR_GFX_PAGESIZE)
 #define DOOR_GFX_PAGEX8                (7 * DOOR_GFX_PAGESIZE)
 #define DOOR_GFX_PAGEY1                (0)
-#define DOOR_GFX_PAGEY2                (gfx.dysize)
+#define DOOR_GFX_PAGEY2                (DOOR_GFX_PAGE_HEIGHT)
 
 
 /* macros for version handling */
 
 
 /* values for artwork handling */
+#define LEVELDIR_ARTWORK_SET_PTR(leveldir, type)                       \
+                               ((type) == ARTWORK_TYPE_GRAPHICS ?      \
+                                &(leveldir)->graphics_set :            \
+                                (type) == ARTWORK_TYPE_SOUNDS ?        \
+                                &(leveldir)->sounds_set :              \
+                                &(leveldir)->music_set)
+
 #define LEVELDIR_ARTWORK_SET(leveldir, type)                           \
                                ((type) == ARTWORK_TYPE_GRAPHICS ?      \
                                 (leveldir)->graphics_set :             \
                                 (leveldir)->sounds_set :               \
                                 (leveldir)->music_set)
 
+#define LEVELDIR_ARTWORK_PATH_PTR(leveldir, type)                      \
+                               ((type) == ARTWORK_TYPE_GRAPHICS ?      \
+                                &(leveldir)->graphics_path :           \
+                                (type) == ARTWORK_TYPE_SOUNDS ?        \
+                                &(leveldir)->sounds_path :             \
+                                &(leveldir)->music_path)
+
 #define LEVELDIR_ARTWORK_PATH(leveldir, type)                          \
                                ((type) == ARTWORK_TYPE_GRAPHICS ?      \
                                 (leveldir)->graphics_path :            \
                                 (artwork).snd_first :  \
                                 (artwork).mus_first)
 
+#define ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type)                  \
+                               ((type) == ARTWORK_TYPE_GRAPHICS ?      \
+                                &(artwork).gfx_current_identifier :    \
+                                (type) == ARTWORK_TYPE_SOUNDS ?        \
+                                &(artwork).snd_current_identifier :    \
+                                &(artwork).mus_current_identifier)
+
 #define ARTWORK_CURRENT_IDENTIFIER(artwork, type)                      \
                                ((type) == ARTWORK_TYPE_GRAPHICS ?      \
                                 (artwork).gfx_current_identifier :     \
@@ -402,8 +437,9 @@ typedef int (*EventFilter)(const Event *);
 
 struct ProgramInfo
 {
-  char *command_basename;
-  char *userdata_directory;
+  char *command_basepath;      /* directory that contains the program */
+  char *command_basename;      /* base filename of the program binary */
+  char *userdata_directory;    /* personal user data directory */
 
   char *program_title;
   char *window_title;
@@ -546,6 +582,7 @@ struct SetupEditorInfo
 {
   boolean el_boulderdash;
   boolean el_emerald_mine;
+  boolean el_emerald_mine_club;
   boolean el_more;
   boolean el_sokoban;
   boolean el_supaplex;
@@ -553,12 +590,30 @@ struct SetupEditorInfo
   boolean el_dx_boulderdash;
   boolean el_chars;
   boolean el_custom;
-  boolean el_custom_more;
   boolean el_user_defined;
+  boolean el_dynamic;
 
   boolean el_headlines;
 };
 
+struct SetupEditorCascadeInfo
+{
+  boolean el_bd;
+  boolean el_em;
+  boolean el_emc;
+  boolean el_rnd;
+  boolean el_sb;
+  boolean el_sp;
+  boolean el_dc;
+  boolean el_dx;
+  boolean el_chars;
+  boolean el_ce;
+  boolean el_ge;
+  boolean el_user;
+  boolean el_generic;
+  boolean el_dynamic;
+};
+
 struct SetupShortcutInfo
 {
   Key save_game;
@@ -590,6 +645,7 @@ struct SetupInfo
   boolean quick_doors;
   boolean team_mode;
   boolean handicap;
+  boolean skip_levels;
   boolean time_limit;
   boolean fullscreen;
   boolean ask_on_escape;
@@ -602,6 +658,7 @@ struct SetupInfo
   boolean override_level_music;
 
   struct SetupEditorInfo editor;
+  struct SetupEditorCascadeInfo editor_cascade;
   struct SetupShortcutInfo shortcut;
   struct SetupInputInfo input[MAX_PLAYERS];
   struct SetupSystemInfo system;
@@ -630,6 +687,7 @@ struct TreeInfo
   char *name_sorting;  /* optional sorting name for correct name sorting */
   char *author;                /* level or artwork author name */
   char *imported_from; /* optional comment for imported levels or artwork */
+  char *imported_by;   /* optional comment for imported levels or artwork */
 
   char *graphics_set;  /* optional custom graphics set (level tree only) */
   char *sounds_set;    /* optional custom sounds set (level tree only) */
@@ -650,8 +708,11 @@ struct TreeInfo
 
   boolean level_group; /* directory contains more level series directories */
   boolean parent_link; /* entry links back to parent directory */
-  boolean user_defined;        /* user defined levels are stored in home directory */
+  boolean in_user_dir; /* user defined levels are stored in home directory */
+  boolean user_defined;        /* levels in user directory and marked as "private" */
   boolean readonly;    /* readonly levels can not be changed with editor */
+  boolean handicap;    /* level set has no handicap when set to "false" */
+  boolean skip_levels; /* levels can be skipped when set to "true" */
 
   int color;           /* color to use on selection screen for this level */
   char *class_desc;    /* description of level series class */
@@ -686,6 +747,12 @@ struct ValueTextInfo
 };
 
 struct ConfigInfo
+{
+  char *token;
+  char *value;
+};
+
+struct ConfigTypeInfo
 {
   char *token;
   char *value;
@@ -709,6 +776,7 @@ struct FileInfo
   char **parameter;                            /* array of file parameters */
 
   boolean redefined;
+  boolean fallback_to_default;
 };
 
 struct SetupFileList
@@ -745,7 +813,7 @@ struct ArtworkListInfo
   struct FileInfo *dynamic_file_list;          /* dynamic artwrk file array */
 
   int num_suffix_list_entries;
-  struct ConfigInfo *suffix_list;              /* parameter suffixes array */
+  struct ConfigTypeInfo *suffix_list;          /* parameter suffixes array */
 
   int num_base_prefixes;
   int num_ext1_suffixes;
@@ -843,6 +911,7 @@ inline void BlitBitmapMasked(Bitmap *, Bitmap *, int, int, int, int, int, int);
 inline boolean DrawingOnBackground(int, int);
 inline void BlitBitmapOnBackground(Bitmap *, Bitmap *, int, int, int, int, int,
                                   int);
+inline void DrawSimpleBlackLine(Bitmap *, int, int, int, int);
 inline void DrawSimpleWhiteLine(Bitmap *, int, int, int, int);
 inline void DrawLines(Bitmap *, struct XY *, int, Pixel);
 inline Pixel GetPixel(Bitmap *, int, int);
@@ -862,7 +931,7 @@ Bitmap *LoadCustomImage(char *);
 void ReloadCustomImage(Bitmap *, char *);
 
 Bitmap *ZoomBitmap(Bitmap *, int, int);
-void CreateBitmapWithSmallBitmaps(Bitmap *);
+void CreateBitmapWithSmallBitmaps(Bitmap *, int);
 
 void SetMouseCursor(int);
 
@@ -873,6 +942,7 @@ inline void SetAudioMode(boolean);
 inline void InitEventFilter(EventFilter);
 inline boolean PendingEvent(void);
 inline void NextEvent(Event *event);
+inline void PeekEvent(Event *event);
 inline Key GetEventKey(KeyEvent *, boolean);
 inline KeyMod HandleKeyModState(Key, int);
 inline KeyMod GetKeyModState();