rnd-20001204-1-src
[rocksndiamonds.git] / src / libgame / system.c
index a88b78cfdb89630d70a96bd83106fa82ea2250e7..eff8576cf417ccf793b11304a209ebe58cf32b80 100644 (file)
@@ -1,18 +1,27 @@
 /***********************************************************
-*  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.c                                                *
+* system.c                                                 *
 ***********************************************************/
 
-#include "libgame.h"
+#include <string.h>
+
+#include "platform.h"
+
+#if defined(PLATFORM_MSDOS)
+#include <fcntl.h>
+#endif
+
+#include "system.h"
+#include "sound.h"
+#include "misc.h"
 
 
 /* ========================================================================= */
@@ -23,7 +32,10 @@ struct ProgramInfo   program;
 struct OptionInfo      options;
 struct VideoSystemInfo video;
 struct AudioSystemInfo audio;
-struct PlayfieldInfo   playfield;
+struct GfxInfo         gfx;
+
+struct LevelDirInfo    *leveldir_first = NULL;
+struct LevelDirInfo    *leveldir_current = NULL;
 
 Display        *display = NULL;
 Visual        *visual = NULL;
@@ -34,23 +46,55 @@ DrawWindow  window = NULL;
 DrawBuffer     backbuffer = NULL;
 DrawBuffer     drawto = NULL;
 
-int            redraw_mask;
-int            redraw_tiles;
+int            button_status = MB_NOT_PRESSED;
+boolean                motion_status = FALSE;
+
+int            redraw_mask = REDRAW_NONE;
+int            redraw_tiles = 0;
 
 int            FrameCounter = 0;
 
 
 /* ========================================================================= */
-/* video functions                                                           */
+/* init functions                                                            */
 /* ========================================================================= */
 
-inline void InitProgramInfo(char *command_name, char *program_title,
-                           char *window_title, char *icon_title,
-                           char *x11_icon_filename,
-                           char *x11_iconmask_filename,
-                           char *msdos_pointer_filename)
+void InitCommandName(char *argv0)
+{
+  program.command_basename =
+    (strrchr(argv0, '/') ? strrchr(argv0, '/') + 1 : argv0);
+}
+
+void InitExitFunction(void (*exit_function)(int))
+{
+  program.exit_function = exit_function;
+}
+
+void InitPlatformDependantStuff(void)
+{
+#if defined(PLATFORM_MSDOS)
+  _fmode = O_BINARY;
+#endif
+}
+
+void InitProgramInfo(char *unix_userdata_directory, char *program_title,
+                    char *window_title, char *icon_title,
+                    char *x11_icon_basename, char *x11_iconmask_basename,
+                    char *msdos_pointer_basename)
 {
-  program.command_name = command_name;
+  char *gfx_dir = getPath2(options.ro_base_directory, GRAPHICS_DIRECTORY);
+  char *x11_icon_filename = getPath2(gfx_dir, x11_icon_basename);
+  char *x11_iconmask_filename = getPath2(gfx_dir, x11_iconmask_basename);
+  char *msdos_pointer_filename = getPath2(gfx_dir, msdos_pointer_basename);
+
+  free(gfx_dir);
+
+#if defined(PLATFORM_UNIX)
+  program.userdata_directory = unix_userdata_directory;
+#else
+  program.userdata_directory = "userdata";
+#endif
+
   program.program_title = program_title;
   program.window_title = window_title;
   program.icon_title = icon_title;
@@ -59,44 +103,48 @@ inline void InitProgramInfo(char *command_name, char *program_title,
   program.msdos_pointer_filename = msdos_pointer_filename;
 }
 
-inline void InitPlayfieldInfo(int sx, int sy, int sxsize, int sysize,
-                             int real_sx, int real_sy,
-                             int full_sxsize, int full_sysize)
+void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize,
+                     int real_sx, int real_sy,
+                     int full_sxsize, int full_sysize)
 {
-  playfield.sx = sx;
-  playfield.sy = sy;
-  playfield.sxsize = sxsize;
-  playfield.sysize = sysize;
-  playfield.real_sx = real_sx;
-  playfield.real_sy = real_sy;
-  playfield.full_sxsize = full_sxsize;
-  playfield.full_sysize = full_sysize;
+  gfx.sx = sx;
+  gfx.sy = sy;
+  gfx.sxsize = sxsize;
+  gfx.sysize = sysize;
+  gfx.real_sx = real_sx;
+  gfx.real_sy = real_sy;
+  gfx.full_sxsize = full_sxsize;
+  gfx.full_sysize = full_sysize;
 }
 
-inline void InitDoor1Info(int dx, int dy, int dxsize, int dysize)
+void InitGfxDoor1Info(int dx, int dy, int dxsize, int dysize)
 {
-  playfield.dx = dx;
-  playfield.dy = dy;
-  playfield.dxsize = dxsize;
-  playfield.dysize = dysize;
+  gfx.dx = dx;
+  gfx.dy = dy;
+  gfx.dxsize = dxsize;
+  gfx.dysize = dysize;
 }
 
-inline void InitDoor2Info(int vx, int vy, int vxsize, int vysize)
+void InitGfxDoor2Info(int vx, int vy, int vxsize, int vysize)
 {
-  playfield.vx = vx;
-  playfield.vy = vy;
-  playfield.vxsize = vxsize;
-  playfield.vysize = vysize;
+  gfx.vx = vx;
+  gfx.vy = vy;
+  gfx.vxsize = vxsize;
+  gfx.vysize = vysize;
 }
 
-inline void InitScrollbufferInfo(int scrollbuffer_width,
-                                int scrollbuffer_height)
+void InitGfxScrollbufferInfo(int scrollbuffer_width, int scrollbuffer_height)
 {
   /* currently only used by MSDOS code to alloc VRAM buffer, if available */
-  playfield.scrollbuffer_width = scrollbuffer_width;
-  playfield.scrollbuffer_height = scrollbuffer_height;
+  gfx.scrollbuffer_width = scrollbuffer_width;
+  gfx.scrollbuffer_height = scrollbuffer_height;
 }
 
+
+/* ========================================================================= */
+/* video functions                                                           */
+/* ========================================================================= */
+
 inline static int GetRealDepth(int depth)
 {
   return (depth == DEFAULT_DEPTH ? video.default_depth : depth);
@@ -386,6 +434,7 @@ inline boolean OpenAudio(struct AudioSystemInfo *audio)
 {
   audio->sound_available = FALSE;
   audio->loops_available = FALSE;
+  audio->sound_enabled = FALSE;
   audio->soundserver_pipe[0] = audio->soundserver_pipe[1] = 0;
   audio->soundserver_pid = 0;
   audio->device_name = NULL;
@@ -396,12 +445,14 @@ inline boolean OpenAudio(struct AudioSystemInfo *audio)
   {
     audio->sound_available = TRUE;
     audio->loops_available = TRUE;
+    audio->sound_enabled = TRUE;
   }
 #elif defined(PLATFORM_MSDOS)
   if (MSDOSOpenAudio())
   {
     audio->sound_available = TRUE;
     audio->loops_available = TRUE;
+    audio->sound_enabled = TRUE;
   }
 #elif defined(PLATFORM_UNIX)
   UnixOpenAudio(audio);
@@ -422,6 +473,15 @@ inline void CloseAudio(struct AudioSystemInfo *audio)
 
   audio->sound_available = FALSE;
   audio->loops_available = FALSE;
+  audio->sound_enabled = FALSE;
+}
+
+inline void SetAudioMode(boolean enabled)
+{
+  if (!audio.sound_available)
+    return;
+
+  audio.sound_enabled = enabled;
 }