rnd-20020519-1-src
[rocksndiamonds.git] / src / libgame / system.h
index 1416f231739ebf3fa9aad5f505f654b3d868dc3a..1a130ee0843c6fa9d22c91c1eadbbce2b476400e 100644 (file)
 #define DEFAULT_KEY_OKAY       KSYM_Return
 #define DEFAULT_KEY_CANCEL     KSYM_Escape
 
-/* values for move directions */
+/* default shortcut keys */
+#define DEFAULT_KEY_SAVE_GAME  KSYM_F1
+#define DEFAULT_KEY_LOAD_GAME  KSYM_F2
+#define DEFAULT_KEY_TOGGLE_PAUSE KSYM_space
+
+/* values for move directions and special "button" keys */
 #define MV_NO_MOVING           0
 #define MV_LEFT                        (1 << 0)
 #define MV_RIGHT               (1 << 1)
 #define MV_UP                  (1 << 2)
 #define MV_DOWN                        (1 << 3)
+#define KEY_BUTTON_1           (1 << 4)
+#define KEY_BUTTON_2           (1 << 5)
+#define KEY_MOTION             (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
+#define KEY_BUTTON             (KEY_BUTTON_1 | KEY_BUTTON_2)
+#define KEY_ACTION             (KEY_MOTION | KEY_BUTTON)
 
 /* values for button status */
 #define MB_NOT_PRESSED         FALSE
 #define RW_BASE_PATH           RW_GAME_DIR
 
 #define GRAPHICS_DIRECTORY     "graphics"
-#define MUSIC_DIRECTORY                "music"
 #define SOUNDS_DIRECTORY       "sounds"
+#define MUSIC_DIRECTORY                "music"
 #define LEVELS_DIRECTORY       "levels"
 #define TAPES_DIRECTORY                "tapes"
 #define SCORES_DIRECTORY       "scores"
 
+#if !defined(PLATFORM_MSDOS)
+#define GRAPHICS_SUBDIR                "gfx_classic"
+#define SOUNDS_SUBDIR          "snd_classic"
+#define MUSIC_SUBDIR           "mus_classic"
+#else
+#define GRAPHICS_SUBDIR                "gfx_orig"
+#define SOUNDS_SUBDIR          "snd_orig"
+#define MUSIC_SUBDIR           "mus_orig"
+#endif
+
 /* areas in bitmap PIX_DOOR */
 /* meaning in PIX_DB_DOOR: (3 PAGEs)
    PAGEX1: 1. buffer for DOOR_1
 #define VERSION_MINOR(x)       (((x) % 10000) / 100)
 #define VERSION_PATCH(x)       ((x) % 100)
 
+/* functions for parent/child process identification */
+#define IS_PARENT_PROCESS(pid) ((pid) > 0)
+#define IS_CHILD_PROCESS(pid)  ((pid) == 0)
+
 
 /* type definitions */
 typedef int (*EventFilter)(const Event *);
@@ -197,6 +221,7 @@ struct OptionInfo
   boolean network;
   boolean verbose;
   boolean debug;
+  char *debug_command;
 };
 
 struct VideoSystemInfo
@@ -210,19 +235,20 @@ struct VideoSystemInfo
 struct AudioSystemInfo
 {
   boolean sound_available;
-  boolean music_available;
   boolean loops_available;
-  boolean mods_available;
+  boolean music_available;
+
   boolean sound_enabled;
+  boolean sound_deactivated;   /* for temporarily disabling sound */
 
-  int soundserver_pipe[2];
-  int soundserver_pid;
+  int mixer_pipe[2];
+  int mixer_pid;
   char *device_name;
   int device_fd;
 
-  int channels;
+  int num_channels;
   int music_channel;
-  int music_nr;
+  int first_sound_channel;
 };
 
 struct GfxInfo
@@ -242,14 +268,6 @@ struct GfxInfo
   boolean draw_deactivation_mask;
 };
 
-struct ArtworkInfo
-{
-  char *custom_artwork;
-  char *custom_graphics;
-  char *custom_sounds;
-  char *custom_music;
-};
-
 struct JoystickInfo
 {
   int status;
@@ -283,6 +301,13 @@ struct SetupInputInfo
   struct SetupKeyboardInfo key;
 };
 
+struct SetupShortcutInfo
+{
+  Key save_game;
+  Key load_game;
+  Key toggle_pause;
+};
+
 struct SetupInfo
 {
   char *player_name;
@@ -303,12 +328,36 @@ struct SetupInfo
   boolean handicap;
   boolean time_limit;
   boolean fullscreen;
+  boolean ask_on_escape;
+
+  char *graphics_set;
+  char *sounds_set;
+  char *music_set;
 
+  struct SetupShortcutInfo shortcut;
   struct SetupInputInfo input[MAX_PLAYERS];
 };
 
-struct LevelDirInfo
+#define TREE_TYPE_GENERIC              0
+#define TREE_TYPE_LEVEL_DIR            1
+#define TREE_TYPE_GRAPHICS_DIR         2
+#define TREE_TYPE_SOUNDS_DIR           3
+#define TREE_TYPE_MUSIC_DIR            4
+
+struct TreeInfo
 {
+  struct TreeInfo **node_top;          /* topmost node in tree */
+  struct TreeInfo *node_parent;                /* parent level directory info */
+  struct TreeInfo *node_group;         /* level group sub-directory info */
+  struct TreeInfo *next;               /* next level series structure node */
+
+  int cl_first;                /* internal control field for setup screen */
+  int cl_cursor;       /* internal control field for setup screen */
+
+  int type;            /* type of tree content */
+
+  /* fields for "type == TREE_TYPE_LEVEL_DIR" */
+
   char *filename;      /* level series single directory name */
   char *fullpath;      /* complete path relative to level directory */
   char *basepath;      /* absolute base path of level directory */
@@ -328,12 +377,26 @@ struct LevelDirInfo
   int color;           /* color to use on selection screen for this level */
   char *class_desc;    /* description of level series class */
   int handicap_level;  /* number of the lowest unsolved level */
-  int cl_first;                /* internal control field for "choose level" screen */
-  int cl_cursor;       /* internal control field for "choose level" screen */
+};
 
-  struct LevelDirInfo *node_parent;    /* parent level directory info */
-  struct LevelDirInfo *node_group;     /* level group sub-directory info */
-  struct LevelDirInfo *next;           /* next level series structure node */
+typedef struct TreeInfo TreeInfo;
+typedef struct TreeInfo LevelDirTree;
+typedef struct TreeInfo GraphicsDirTree;
+typedef struct TreeInfo SoundsDirTree;
+typedef struct TreeInfo MusicDirTree;
+
+struct ArtworkInfo
+{
+  GraphicsDirTree *gfx_first;
+  GraphicsDirTree *gfx_current;
+  SoundsDirTree *snd_first;
+  SoundsDirTree *snd_current;
+  MusicDirTree *mus_first;
+  MusicDirTree *mus_current;
+
+  char *graphics_set_current;
+  char *sounds_set_current;
+  char *music_set_current;
 };
 
 
@@ -350,8 +413,8 @@ extern struct ArtworkInfo   artwork;
 extern struct JoystickInfo     joystick;
 extern struct SetupInfo                setup;
 
-extern struct LevelDirInfo     *leveldir_first;
-extern struct LevelDirInfo     *leveldir_current;
+extern LevelDirTree           *leveldir_first;
+extern LevelDirTree           *leveldir_current;
 extern int                     level_nr;
 
 extern Display                *display;
@@ -415,6 +478,7 @@ inline boolean ChangeVideoModeIfNeeded(boolean);
 
 Bitmap *LoadImage(char *);
 Bitmap *LoadCustomImage(char *);
+void ReloadCustomImage(Bitmap *, char *);
 
 inline void OpenAudio(void);
 inline void CloseAudio(void);