rnd-20001204-1-src
[rocksndiamonds.git] / src / libgame / system.h
index 25eb0c66c485d83b157228f48dd009e1cb59d2b8..e4126a7d6676237789491ff03b760f9563998dec 100644 (file)
@@ -1,23 +1,21 @@
 /***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
+* Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-*  ©1995 Artsoft Development                               *
-*        Holger Schemel                                    *
-*        33659 Bielefeld-Senne                             *
-*        Telefon: (0521) 493245                            *
-*        eMail: aeglos@valinor.owl.de                      *
-*               aeglos@uni-paderborn.de                    *
-*               q99492@pbhrzx.uni-paderborn.de             *
+* (c) 1994-2000 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
 *----------------------------------------------------------*
-*  system.h                                                *
+* system.h                                                 *
 ***********************************************************/
 
 #ifndef SYSTEM_H
 #define SYSTEM_H
 
-/*
-#include "libgame.h"
-*/
+#include "platform.h"
+#include "types.h"
 
 #if defined(PLATFORM_MSDOS)
 #include "msdos.h"
 #define FULLSCREEN_NOT_AVAILABLE       FALSE
 #define FULLSCREEN_AVAILABLE           TRUE
 
+/* values for button_status */
+#define MB_NOT_PRESSED         FALSE
+#define MB_RELEASED            FALSE
+#define MB_PRESSED             TRUE
+#define MB_MENU_CHOICE         FALSE
+#define MB_MENU_MARK           TRUE
+#define MB_MENU_INITIALIZE     (-1)
+#define MB_LEFTBUTTON          1
+#define MB_MIDDLEBUTTON                2
+#define MB_RIGHTBUTTON         3
 
 /* values for redraw_mask */
+#define REDRAW_NONE            (0)
 #define REDRAW_ALL             (1 << 0)
 #define REDRAW_FIELD           (1 << 1)
 #define REDRAW_TILES           (1 << 2)
 #define REDRAWTILES_THRESHOLD  (SCR_FIELDX * SCR_FIELDY / 2)
 
 
+/* default name for empty highscore entry */
+#define EMPTY_PLAYER_NAME      "no name"
+
+/* default name for unknown player names */
+#define ANONYMOUS_NAME         "anonymous"
+
+/* default name for new levels */
+#define NAMELESS_LEVEL_NAME    "nameless level"
+
+/* definitions for game sub-directories */
+#ifndef RO_GAME_DIR
+#define RO_GAME_DIR            "."
+#endif
+
+#ifndef RW_GAME_DIR
+#define RW_GAME_DIR            "."
+#endif
+
+#define RO_BASE_PATH           RO_GAME_DIR
+#define RW_BASE_PATH           RW_GAME_DIR
+
+#define GRAPHICS_DIRECTORY     "graphics"
+#define SOUNDS_DIRECTORY       "sounds"
+#define LEVELS_DIRECTORY       "levels"
+#define TAPES_DIRECTORY                "tapes"
+#define SCORES_DIRECTORY       "scores"
+
+/* areas in bitmap PIX_DOOR */
+/* meaning in PIX_DB_DOOR: (3 PAGEs)
+   PAGEX1: 1. buffer for DOOR_1
+   PAGEX2: 2. buffer for DOOR_1
+   PAGEX3: buffer for animations
+*/
+
+#define DOOR_GFX_PAGESIZE      (gfx.dxsize)
+#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_PAGEX4                (3 * DOOR_GFX_PAGESIZE)
+#define DOOR_GFX_PAGEX5                (4 * DOOR_GFX_PAGESIZE)
+#define DOOR_GFX_PAGEX6                (5 * 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)
+
+
 /* type definitions */
 
 typedef int (*EventFilter)(const Event *);
@@ -71,13 +127,17 @@ typedef int (*EventFilter)(const Event *);
 
 struct ProgramInfo
 {
-  char *command_name;
+  char *command_basename;
+  char *userdata_directory;
+
   char *program_title;
   char *window_title;
   char *icon_title;
   char *x11_icon_filename;
   char *x11_iconmask_filename;
   char *msdos_pointer_filename;
+
+  void (*exit_function)(int);
 };
 
 struct OptionInfo
@@ -106,13 +166,14 @@ struct AudioSystemInfo
 {
   boolean sound_available;
   boolean loops_available;
+  boolean sound_enabled;
   int soundserver_pipe[2];
   int soundserver_pid;
   char *device_name;
   int device_fd;
 };
 
-struct PlayfieldInfo
+struct GfxInfo
 {
   int sx, sy;
   int sxsize, sysize;
@@ -127,6 +188,35 @@ struct PlayfieldInfo
   int vxsize, vysize;
 };
 
+struct LevelDirInfo
+{
+  char *filename;      /* level series single directory name */
+  char *fullpath;      /* complete path relative to level directory */
+  char *basepath;      /* absolute base path of level directory */
+  char *name;          /* level series name, as displayed on main screen */
+  char *name_short;    /* optional short name for level selection screen */
+  char *name_sorting;  /* optional sorting name for correct level sorting */
+  char *author;                /* level series author name levels without author */
+  char *imported_from; /* optional comment for imported level series */
+  int levels;          /* number of levels in level series */
+  int first_level;     /* first level number (to allow start with 0 or 1) */
+  int last_level;      /* last level number (automatically calculated) */
+  int sort_priority;   /* sort levels by 'sort_priority' and then by name */
+  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 readonly;    /* readonly levels can not be changed with editor */
+  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 */
+};
+
 
 /* ========================================================================= */
 /* exported variables                                                        */
@@ -136,7 +226,10 @@ extern struct ProgramInfo  program;
 extern struct OptionInfo       options;
 extern struct VideoSystemInfo  video;
 extern struct AudioSystemInfo  audio;
-extern struct PlayfieldInfo    playfield;
+extern struct GfxInfo          gfx;
+
+extern struct LevelDirInfo     *leveldir_first;
+extern struct LevelDirInfo     *leveldir_current;
 
 extern Display        *display;
 extern Visual         *visual;
@@ -147,6 +240,9 @@ extern DrawWindow   window;
 extern DrawBuffer      backbuffer;
 extern DrawBuffer      drawto;
 
+extern int             button_status;
+extern boolean         motion_status;
+
 extern int             redraw_mask;
 extern int             redraw_tiles;
 
@@ -155,13 +251,16 @@ extern int                FrameCounter;
 
 /* function definitions */
 
-inline void InitProgramInfo(char *, char *, char *, char *, char *, char *,
-                           char *);
+void InitCommandName(char *);
+void InitExitFunction(void (*exit_function)(int));
+void InitPlatformDependantStuff(void);
+
+void InitProgramInfo(char *, char *, char *, char *, char *, char *, char *);
 
-inline void InitPlayfieldInfo(int, int, int, int, int, int, int, int);
-inline void InitDoor1Info(int, int, int, int);
-inline void InitDoor2Info(int, int, int, int);
-inline void InitScrollbufferInfo(int, int);
+void InitGfxFieldInfo(int, int, int, int, int, int, int, int);
+void InitGfxDoor1Info(int, int, int, int);
+void InitGfxDoor2Info(int, int, int, int);
+void InitGfxScrollbufferInfo(int, int);
 
 inline void InitVideoDisplay(void);
 inline void InitVideoBuffer(DrawBuffer *,DrawWindow *, int, int, int, boolean);
@@ -184,6 +283,7 @@ inline boolean ChangeVideoModeIfNeeded(boolean);
 
 inline boolean OpenAudio(struct AudioSystemInfo *);
 inline void CloseAudio(struct AudioSystemInfo *);
+inline void SetAudioMode(boolean);
 
 inline void InitEventFilter(EventFilter);
 inline boolean PendingEvent(void);