rnd-20001204-3-src
[rocksndiamonds.git] / src / libgame / system.c
index 0304be812529fa19b895a5eb9d59bbd11e3db7bb..bc7d5a13c304116bacf57da84c57e721dc069ae5 100644 (file)
@@ -1,15 +1,14 @@
 /***********************************************************
-*  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 <string.h>
 #include <fcntl.h>
 #endif
 
-#include "libgame.h"
+#include "system.h"
+#include "sound.h"
+#include "misc.h"
+
 
-#if 0
 /* ========================================================================= */
 /* exported variables                                                        */
 /* ========================================================================= */
@@ -33,6 +34,9 @@ struct VideoSystemInfo        video;
 struct AudioSystemInfo audio;
 struct GfxInfo         gfx;
 
+struct LevelDirInfo    *leveldir_first = NULL;
+struct LevelDirInfo    *leveldir_current = NULL;
+
 Display        *display = NULL;
 Visual        *visual = NULL;
 int            screen = 0;
@@ -50,7 +54,6 @@ int           redraw_tiles = 0;
 
 int            FrameCounter = 0;
 
-#endif
 
 /* ========================================================================= */
 /* init functions                                                            */
@@ -204,15 +207,20 @@ inline Bitmap CreateBitmap(int width, int height, int depth)
 #else
   Pixmap pixmap;
 
-  if (!(pixmap = XCreatePixmap(display, window->drawable,
-                              width, height, real_depth)))
+  if ((pixmap = XCreatePixmap(display, window->drawable,
+                             width, height, real_depth))
+      == None)
     Error(ERR_EXIT, "cannot create pixmap");
+
   new_bitmap->drawable = pixmap;
 
   if (window == NULL)
     Error(ERR_EXIT, "Window GC needed for Bitmap -- create Window first");
+
   new_bitmap->gc = window->gc;
 
+  new_bitmap->line_gc[0] = window->line_gc[0];
+  new_bitmap->line_gc[1] = window->line_gc[1];
 #endif
 
   return new_bitmap;
@@ -336,6 +344,91 @@ inline void DrawSimpleWhiteLine(Bitmap bitmap, int from_x, int from_y,
 #endif
 }
 
+#if !defined(TARGET_X11_NATIVE)
+inline void DrawLine(Bitmap bitmap, int from_x, int from_y,
+                    int to_x, int to_y, Pixel pixel, int line_width)
+{
+  int x, y;
+
+  for (x=0; x<line_width; x++)
+  {
+    for (y=0; y<line_width; y++)
+    {
+      int dx = x - line_width / 2;
+      int dy = y - line_width / 2;
+
+      if ((x == 0 && y == 0) ||
+         (x == 0 && y == line_width - 1) ||
+         (x == line_width - 1 && y == 0) ||
+         (x == line_width - 1 && y == line_width - 1))
+       continue;
+
+#if defined(TARGET_SDL)
+      sge_Line(bitmap->surface,
+              from_x + dx, from_y + dy, to_x + dx, to_y + dy, pixel);
+#elif defined(TARGET_ALLEGRO)
+      AllegroDrawLine(bitmap->drawable, from_x + dx, from_y + dy,
+                     to_x + dx, to_y + dy, pixel);
+#endif
+    }
+  }
+}
+#endif
+
+inline void DrawLines(Bitmap bitmap, struct XY *points, int num_points,
+                     Pixel pixel)
+{
+#if !defined(TARGET_X11_NATIVE)
+  int line_width = 4;
+  int i;
+
+  for (i=0; i<num_points - 1; i++)
+    DrawLine(bitmap, points[i].x, points[i].y,
+            points[i + 1].x, points[i + 1].y, pixel, line_width);
+
+  /*
+  SDLDrawLines(bitmap->surface, points, num_points, pixel);
+  */
+#else
+  XSetForeground(display, bitmap->line_gc[1], pixel);
+  XDrawLines(display, bitmap->drawable, bitmap->line_gc[1],
+            (XPoint *)points, num_points, CoordModeOrigin);
+  /*
+  XSetForeground(display, gc, BlackPixel(display, screen));
+  */
+#endif
+}
+
+inline Pixel GetPixelFromRGB(Bitmap bitmap, unsigned int color_r,
+                            unsigned int color_g, unsigned int color_b)
+{
+  Pixel pixel;
+
+#if defined(TARGET_SDL)
+  pixel = SDL_MapRGB(bitmap->surface->format, color_r, color_g, color_b);
+#elif defined(TARGET_X11_NATIVE)
+  XColor xcolor;
+
+  xcolor.flags = DoRed | DoGreen | DoBlue;
+  xcolor.red = (color_r << 8);
+  xcolor.green = (color_g << 8);
+  xcolor.blue = (color_b << 8);
+  XAllocColor(display, cmap, &xcolor);
+  pixel = xcolor.pixel;
+#endif
+
+  return pixel;
+}
+
+inline Pixel GetPixelFromRGBcompact(Bitmap bitmap, unsigned int color)
+{
+  unsigned int color_r = (color >> 16) & 0xff;
+  unsigned int color_g = (color >>  8) & 0xff;
+  unsigned int color_b = (color >>  0) & 0xff;
+
+  return GetPixelFromRGB(bitmap, color_r, color_g, color_b);
+}
+
 /* execute all pending screen drawing operations */
 inline void FlushDisplay(void)
 {
@@ -431,6 +524,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;
@@ -441,12 +535,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);
@@ -467,6 +563,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;
 }