rnd-20001122-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 22 Nov 2000 22:20:37 +0000 (23:20 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:35:04 +0000 (10:35 +0200)
CHANGES
src/image.c
src/init.c
src/network.c
src/sdl.c
src/system.c

diff --git a/CHANGES b/CHANGES
index c8ad050dc4b5a473a256f69ff936b921eeb13a4a..9cde8a3a30303fd72b93d56135e1b81c0e106967 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,7 @@ Version 1.5.0
 -------------
        - SDL!!!
        - trying to open already busy audio device does not block the game
+       - fixed network playing bug (patch from web site)
 
 Release Version 1.4.0 [27 OCT 1999]
 -----------------------------------
index a3f925702580d147918aeece470abd27d01a849f..2b234d477a9452b62d8fedeb918d65c395780a4b 100644 (file)
@@ -553,5 +553,5 @@ int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename,
   return PCX_Success;
 }
 
-#endif /* !USE_SDL_LIBRARY */
 #endif /* !MSDOS */
+#endif /* !USE_SDL_LIBRARY */
index 941881f3218f6126181cfad12fc76d15217e020a..66f4d178bbbed0d40c7e698e7eb47def71eb87db 100644 (file)
@@ -53,6 +53,7 @@ static void InitSound(void);
 static void InitSoundServer(void);
 static void InitWindow(int, char **);
 static void InitGfx(void);
+static void InitGfxBackground(void);
 static void LoadGfx(int, struct PictureFileInfo *);
 static void InitGadgets(void);
 static void InitElementProperties(void);
@@ -100,6 +101,7 @@ void OpenAll(int argc, char *argv[])
   InitLevelInfo();
   InitGadgets();               /* needs to know number of level series */
 
+  InitGfxBackground();
   DrawMainMenu();
 
   InitNetworkServer();
@@ -455,7 +457,7 @@ void InitWindow(int argc, char *argv[])
 #ifdef USE_SDL_LIBRARY
   /* open SDL video output device (window or fullscreen mode) */
 #if 0
-  if ((window = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH,
+  if ((backbuffer = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH,
                                 SDL_HWSURFACE))
       == NULL)
     Error(ERR_EXIT, "SDL_SetVideoMode() failed: %s", SDL_GetError());
@@ -591,7 +593,7 @@ void InitWindow(int argc, char *argv[])
 
 void InitGfx()
 {
-  int i,j;
+  int i, j;
 
 #ifdef USE_SDL_LIBRARY
   SDL_Surface *sdl_image_tmp;
@@ -698,39 +700,10 @@ void InitGfx()
     { -1, 0 }
   };
 
-#if DEBUG_TIMING
-  debug_print_timestamp(0, NULL);      /* initialize timestamp function */
-#endif
-
-#ifdef DEBUG
-#if 0
-  printf("Test: Loading RocksFont2.pcx ...\n");
-  LoadGfx(PIX_SMALLFONT,&test_pic1);
-  printf("Test: Done.\n");
-  printf("Test: Loading mouse.pcx ...\n");
-  LoadGfx(PIX_SMALLFONT,&test_pic2);
-  printf("Test: Done.\n");
-#endif
-#endif
-
-  LoadGfx(PIX_SMALLFONT, &pic[PIX_SMALLFONT]);
-  DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
-  DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
-#ifdef MSDOS
-  DrawInitText(PROGRAM_DOS_PORT_STRING, 210, FC_BLUE);
-  rest(200);
-#endif /* MSDOS */
-  DrawInitText("Loading graphics:",120,FC_GREEN);
-
-  for(i=0; i<NUM_PICTURES; i++)
-    if (i != PIX_SMALLFONT)
-      LoadGfx(i,&pic[i]);
-
-#if DEBUG_TIMING
-  debug_print_timestamp(0, "SUMMARY LOADING ALL GRAPHICS:");
-#endif
+  /* create additional image buffers for double-buffering */
 
 #ifdef USE_SDL_LIBRARY
+
   /* create some native image surfaces for double-buffer purposes */
 
   /* create double-buffer surface for background image */
@@ -769,6 +742,75 @@ void InitGfx()
 
   SDL_FreeSurface(sdl_image_tmp);
 
+  /* SDL cannot directly draw to the visible video framebuffer like X11,
+     but always uses a backbuffer, which is then blitted to the visible
+     video framebuffer with 'SDL_UpdateRect' (or replaced with the current
+     visible video framebuffer with 'SDL_Flip', if the hardware supports
+     this). Therefore do not use an additional backbuffer for drawing, but
+     use a symbolic buffer (distinguishable from the SDL backbuffer) called
+     'window', which indicates that the SDL backbuffer should be updated to
+     the visible video framebuffer when attempting to blit to it.
+
+     For convenience, it seems to be a good idea to create this symbolic
+     buffer 'window' at the same size as the SDL backbuffer. Although it
+     should never be drawn to directly, it would do no harm nevertheless. */
+
+  window = pix[PIX_DB_BACK];           /* 'window' is only symbolic buffer */
+  pix[PIX_DB_BACK] = backbuffer;       /* 'backbuffer' is SDL screen buffer */
+
+#else /* !USE_SDL_LIBRARY */
+
+  pix[PIX_DB_BACK] = XCreatePixmap(display, window,
+                                  WIN_XSIZE,WIN_YSIZE,
+                                  XDefaultDepth(display,screen));
+  pix[PIX_DB_DOOR] = XCreatePixmap(display, window,
+                                  3*DXSIZE,DYSIZE+VYSIZE,
+                                  XDefaultDepth(display,screen));
+  pix[PIX_DB_FIELD] = XCreatePixmap(display, window,
+                                   FXSIZE,FYSIZE,
+                                   XDefaultDepth(display,screen));
+
+  if (!pix[PIX_DB_BACK] || !pix[PIX_DB_DOOR] || !pix[PIX_DB_FIELD])
+    Error(ERR_EXIT, "cannot create additional pixmaps");
+
+#endif /* !USE_SDL_LIBRARY */
+
+#if DEBUG_TIMING
+  debug_print_timestamp(0, NULL);      /* initialize timestamp function */
+#endif
+
+#ifdef DEBUG
+#if 0
+  printf("Test: Loading RocksFont2.pcx ...\n");
+  LoadGfx(PIX_SMALLFONT,&test_pic1);
+  printf("Test: Done.\n");
+  printf("Test: Loading mouse.pcx ...\n");
+  LoadGfx(PIX_SMALLFONT,&test_pic2);
+  printf("Test: Done.\n");
+#endif
+#endif
+
+  LoadGfx(PIX_SMALLFONT, &pic[PIX_SMALLFONT]);
+  DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
+  DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
+#ifdef MSDOS
+  DrawInitText(PROGRAM_DOS_PORT_STRING, 210, FC_BLUE);
+  rest(200);
+#endif /* MSDOS */
+  DrawInitText("Loading graphics:",120,FC_GREEN);
+
+  for(i=0; i<NUM_PICTURES; i++)
+    if (i != PIX_SMALLFONT)
+      LoadGfx(i,&pic[i]);
+
+#if DEBUG_TIMING
+  debug_print_timestamp(0, "SUMMARY LOADING ALL GRAPHICS:");
+#endif
+
+  /* create additional image buffers for masking of graphics */
+
+#ifdef USE_SDL_LIBRARY
+
   /* initialize surface array to 'NULL' */
   for(i=0; i<NUM_TILES; i++)
     tile_masked[i] = NULL;
@@ -807,25 +849,27 @@ void InitGfx()
 
 #else /* !USE_SDL_LIBRARY */
 
-  pix[PIX_DB_BACK] = XCreatePixmap(display, window,
-                                  WIN_XSIZE,WIN_YSIZE,
-                                  XDefaultDepth(display,screen));
-  pix[PIX_DB_DOOR] = XCreatePixmap(display, window,
-                                  3*DXSIZE,DYSIZE+VYSIZE,
-                                  XDefaultDepth(display,screen));
-  pix[PIX_DB_FIELD] = XCreatePixmap(display, window,
-                                   FXSIZE,FYSIZE,
-                                   XDefaultDepth(display,screen));
-
+  /* create graphic context structures needed for clipping */
   clip_gc_values.graphics_exposures = False;
   clip_gc_valuemask = GCGraphicsExposures;
   copy_clipmask_gc =
-    XCreateGC(display,clipmask[PIX_BACK],clip_gc_valuemask,&clip_gc_values);
+    XCreateGC(display, clipmask[PIX_BACK], clip_gc_valuemask, &clip_gc_values);
 
   clip_gc_values.graphics_exposures = False;
   clip_gc_valuemask = GCGraphicsExposures;
   tile_clip_gc =
-    XCreateGC(display,window,clip_gc_valuemask,&clip_gc_values);
+    XCreateGC(display, window, clip_gc_valuemask, &clip_gc_values);
+
+  for(i=0; i<NUM_BITMAPS; i++)
+  {
+    if (clipmask[i])
+    {
+      clip_gc_values.graphics_exposures = False;
+      clip_gc_values.clip_mask = clipmask[i];
+      clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
+      clip_gc[i] = XCreateGC(display,window,clip_gc_valuemask,&clip_gc_values);
+    }
+  }
 
   /* initialize pixmap array to Pixmap 'None' */
   for(i=0; i<NUM_TILES; i++)
@@ -852,33 +896,24 @@ void InitGfx()
     }
   }
 
-  if (!pix[PIX_DB_BACK] || !pix[PIX_DB_DOOR])
-    Error(ERR_EXIT, "cannot create additional pixmaps");
-
-  for(i=0; i<NUM_BITMAPS; i++)
-  {
-    if (clipmask[i])
-    {
-      clip_gc_values.graphics_exposures = False;
-      clip_gc_values.clip_mask = clipmask[i];
-      clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
-      clip_gc[i] = XCreateGC(display,window,clip_gc_valuemask,&clip_gc_values);
-    }
-  }
-
 #endif /* !USE_SDL_LIBRARY */
+}
+
+void InitGfxBackground()
+{
+  int x, y;
 
   drawto = backbuffer = pix[PIX_DB_BACK];
   fieldbuffer = pix[PIX_DB_FIELD];
   SetDrawtoField(DRAW_BACKBUFFER);
 
   BlitBitmap(pix[PIX_BACK], backbuffer, 0,0, WIN_XSIZE,WIN_YSIZE, 0,0);
-  ClearRectangle(pix[PIX_DB_BACK], REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE);
+  ClearRectangle(backbuffer, REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE);
   ClearRectangle(pix[PIX_DB_DOOR], 0,0, 3*DXSIZE,DYSIZE+VYSIZE);
 
-  for(i=0; i<MAX_BUF_XSIZE; i++)
-    for(j=0; j<MAX_BUF_YSIZE; j++)
-      redraw[i][j] = 0;
+  for(x=0; x<MAX_BUF_XSIZE; x++)
+    for(y=0; y<MAX_BUF_YSIZE; y++)
+      redraw[x][y] = 0;
   redraw_tiles = 0;
   redraw_mask = REDRAW_ALL;
 }
index 70720ea26818305518d09dda35cd80ba5bd17d8e..88c5552175bbea0acb9b8f878ca82add913892b8 100644 (file)
@@ -236,9 +236,9 @@ void SendToServer_StartPlaying()
   buffer[8] = (unsigned char)((new_random_seed >>  8) & 0xff);
   buffer[9] = (unsigned char)((new_random_seed >>  0) & 0xff);
 
-  strcpy((char *)&buffer[10], leveldir_current->name);
+  strcpy((char *)&buffer[10], leveldir_current->filename);
 
-  SendBufferToServer(10 + strlen(leveldir_current->name) + 1);
+  SendBufferToServer(10 + strlen(leveldir_current->filename) + 1);
 }
 
 void SendToServer_PausePlaying()
@@ -415,18 +415,18 @@ static void Handle_OP_START_PLAYING()
   int new_level_nr;
   int dummy;                           /* !!! HAS NO MEANING ANYMORE !!! */
   unsigned long new_random_seed;
-  char *new_leveldir_name;
+  char *new_leveldir_filename;
 
   new_level_nr = (buffer[2] << 8) + buffer[3];
   dummy = (buffer[4] << 8) + buffer[5];
   new_random_seed =
     (buffer[6] << 24) | (buffer[7] << 16) | (buffer[8] << 8) | (buffer[9]);
-  new_leveldir_name = (char *)&buffer[10];
+  new_leveldir_filename = (char *)&buffer[10];
 
-  new_leveldir = getLevelDirInfoFromFilename(new_leveldir_name);
+  new_leveldir = getLevelDirInfoFromFilename(new_leveldir_filename);
   if (new_leveldir == NULL)
   {
-    Error(ERR_WARN, "no such level directory: '%s'", new_leveldir_name);
+    Error(ERR_WARN, "no such level directory: '%s'", new_leveldir_filename);
 
     new_leveldir = leveldir_first;
     Error(ERR_WARN, "using default level directory: '%s'", new_leveldir->name);
index 941904e77a761836385211ee1e6781028f389c26..f3846da7491d6862b55416414cab925328575252 100644 (file)
--- a/src/sdl.c
+++ b/src/sdl.c
@@ -22,6 +22,7 @@ inline void SDLCopyArea(SDL_Surface *src_surface, SDL_Surface *dst_surface,
                        int width, int height,
                        int dst_x, int dst_y)
 {
+  SDL_Surface *surface = (dst_surface == window ? backbuffer : dst_surface);
   SDL_Rect src_rect, dst_rect;
 
   src_rect.x = src_x;
@@ -34,15 +35,17 @@ inline void SDLCopyArea(SDL_Surface *src_surface, SDL_Surface *dst_surface,
   dst_rect.w = width;
   dst_rect.h = height;
 
-  SDL_BlitSurface(src_surface, &src_rect, dst_surface, &dst_rect);
+  if (src_surface != backbuffer || dst_surface != window)
+    SDL_BlitSurface(src_surface, &src_rect, surface, &dst_rect);
 
   if (dst_surface == window)
-    SDL_UpdateRect(dst_surface, dst_x, dst_y, width, height);
+    SDL_UpdateRect(backbuffer, dst_x, dst_y, width, height);
 }
 
-inline void SDLFillRectangle(SDL_Surface *surface, int x, int y,
+inline void SDLFillRectangle(SDL_Surface *dst_surface, int x, int y,
                             int width, int height, unsigned int color)
 {
+  SDL_Surface *surface = (dst_surface == window ? backbuffer : dst_surface);
   SDL_Rect rect;
   unsigned int color_r = (color >> 16) && 0xff;
   unsigned int color_g = (color >>  8) && 0xff;
@@ -54,8 +57,10 @@ inline void SDLFillRectangle(SDL_Surface *surface, int x, int y,
   rect.h = height;
 
   SDL_FillRect(surface, &rect,
-               SDL_MapRGB(surface->format, color_r, color_g, color_b));
-  SDL_UpdateRect(surface, x, y, width, height);
+              SDL_MapRGB(surface->format, color_r, color_g, color_b));
+
+  if (dst_surface == window)
+    SDL_UpdateRect(backbuffer, x, y, width, height);
 }
 
 inline void SDLDrawSimpleLine(SDL_Surface *surface, int from_x, int from_y,
index dd329f1cd6a194276f2223268cce99d15cda19b8..0e1dd9d5c63d044497c859bf0b895fcb5cdc314b 100644 (file)
@@ -193,7 +193,7 @@ inline boolean SetVideoMode(void)
   if (setup.fullscreen && !fullscreen_enabled && fullscreen_available)
   {
     /* switch display to fullscreen mode, if available */
-    DrawWindow window_old = window;
+    DrawWindow window_old = backbuffer;
     DrawWindow window_new;
 
     if ((window_new = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH,
@@ -211,17 +211,17 @@ inline boolean SetVideoMode(void)
     {
       if (window_old)
        SDL_FreeSurface(window_old);
-      window = window_new;
+      backbuffer = window_new;
 
       fullscreen_enabled = TRUE;
       success = TRUE;
     }
   }
 
-  if ((!setup.fullscreen && fullscreen_enabled) || !window)
+  if ((!setup.fullscreen && fullscreen_enabled) || !backbuffer)
   {
     /* switch display to window mode */
-    DrawWindow window_old = window;
+    DrawWindow window_old = backbuffer;
     DrawWindow window_new;
 
     if ((window_new = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH,
@@ -237,7 +237,7 @@ inline boolean SetVideoMode(void)
     {
       if (window_old)
        SDL_FreeSurface(window_old);
-      window = window_new;
+      backbuffer = window_new;
 
       fullscreen_enabled = FALSE;
       success = TRUE;