rnd-20060225-1-src
[rocksndiamonds.git] / src / libgame / system.h
index 6ced002e0f1c3992789d77b8eeb1fed1385c6efe..4c05596d4231bc5b6e335ae26be4d1927a37a97e 100644 (file)
 
 #define NUM_DIRECTIONS         4
 
+/* diagonal movement directions are used in a different contect than buttons */
+#define MV_BIT_UPLEFT          4
+#define MV_BIT_UPRIGHT         5
+#define MV_BIT_DOWNLEFT                6
+#define MV_BIT_DOWNRIGHT       7
+
+#define NUM_DIRECTIONS_FULL    8
+
 /* values for special "button" bitmasks */
 #define BUTTON_1               4
 #define BUTTON_2               5
 
 /* values for move directions and special "button" key bitmasks */
-#define MV_NO_MOVING           0
+#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_UPLEFT              (MV_UP   | MV_LEFT)
+#define MV_UPRIGHT             (MV_UP   | MV_RIGHT)
+#define MV_DOWNLEFT            (MV_DOWN | MV_LEFT)
+#define MV_DOWNRIGHT           (MV_DOWN | MV_RIGHT)
+
 #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_DIRECTIONS       (MV_NO_MOVING)
+#define MV_NO_DIRECTION                (MV_NONE)
 
 #define KEY_BUTTON_1           (1 << BUTTON_1)
 #define KEY_BUTTON_2           (1 << BUTTON_2)
 #define KEY_BUTTON             (KEY_BUTTON_1 | KEY_BUTTON_2)
 #define KEY_ACTION             (KEY_MOTION | KEY_BUTTON)
 
-#define MV_DIR_BIT(x)          ((x) == MV_LEFT  ? MV_BIT_LEFT  :       \
-                                (x) == MV_RIGHT ? MV_BIT_RIGHT :       \
-                                (x) == MV_UP    ? MV_BIT_UP    : MV_BIT_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)
-
+#define MV_DIR_FROM_BIT(x)     ((x) < NUM_DIRECTIONS ? 1 << (x) :        \
+                                (x) == MV_BIT_UPLEFT    ? MV_UPLEFT    : \
+                                (x) == MV_BIT_UPRIGHT   ? MV_UPRIGHT   : \
+                                (x) == MV_BIT_DOWNLEFT  ? MV_DOWNLEFT  : \
+                                (x) == MV_BIT_DOWNRIGHT ? MV_DOWNRIGHT : \
+                                MV_NONE)
+
+#define MV_DIR_TO_BIT(x)       ((x) == MV_LEFT      ? MV_BIT_LEFT      : \
+                                (x) == MV_RIGHT     ? MV_BIT_RIGHT     : \
+                                (x) == MV_UP        ? MV_BIT_UP        : \
+                                (x) == MV_DOWN      ? MV_BIT_DOWN      : \
+                                (x) == MV_UPLEFT    ? MV_BIT_UPLEFT    : \
+                                (x) == MV_UPRIGHT   ? MV_BIT_UPRIGHT   : \
+                                (x) == MV_DOWNLEFT  ? MV_BIT_DOWNLEFT  : \
+                                (x) == MV_DOWNRIGHT ? MV_BIT_DOWNRIGHT : \
+                                MV_BIT_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        : \
+                                (x) == MV_UPLEFT    ? MV_DOWNRIGHT : \
+                                (x) == MV_UPRIGHT   ? MV_DOWNLEFT  : \
+                                (x) == MV_DOWNLEFT  ? MV_UPRIGHT   : \
+                                (x) == MV_DOWNRIGHT ? MV_UPLEFT    : \
+                                MV_NONE)
 
 /* values for animation mode (frame order and direction) */
 #define ANIM_NONE              0
 #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_STATIC_PANEL      (1 << 10)
 
 #define ANIM_DEFAULT           ANIM_LOOP
 
 #define CURSOR_PLAYFIELD       1
 
 
+/* maximum playfield size supported by libgame functions */
+#define MAX_PLAYFIELD_WIDTH    128
+#define MAX_PLAYFIELD_HEIGHT   128
+
 /* maximum number of parallel players supported by libgame functions */
 #define MAX_PLAYERS            4
 
 #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"
 
 
 /* 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 :     \
@@ -412,8 +472,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;
@@ -564,12 +625,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;
@@ -605,6 +684,7 @@ struct SetupInfo
   boolean time_limit;
   boolean fullscreen;
   boolean ask_on_escape;
+  boolean quick_switch;
 
   char *graphics_set;
   char *sounds_set;
@@ -614,6 +694,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;
@@ -810,6 +891,7 @@ extern struct ArtworkInfo   artwork;
 extern struct JoystickInfo     joystick;
 extern struct SetupInfo                setup;
 
+extern LevelDirTree           *leveldir_first_all;
 extern LevelDirTree           *leveldir_first;
 extern LevelDirTree           *leveldir_current;
 extern int                     level_nr;
@@ -866,6 +948,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);