rnd-20090326-1-src
authorHolger Schemel <info@artsoft.org>
Thu, 26 Mar 2009 09:55:51 +0000 (10:55 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:57:14 +0000 (10:57 +0200)
* extended backwards compatibility mode to allow already fixed bug with
  change actions (see "2008-02-05") for existing levels (especially the
  Zelda and Zelda II levels and other cool stuff by Alan Bond like FMV)
* reactivated workaround to prevent program crashes due to blitting to
  the same SDL surface that apparently only occurs on Windows systems
  (this is no final solution; this problem needs further investigation)
* version number set to 3.2.6.1
* version 3.2.6.0 released

ChangeLog
src/Makefile
src/conftime.h
src/files.c
src/game_em/Makefile
src/init.c
src/libgame/msdos.c
src/libgame/system.c
src/libgame/system.h
src/main.h

index 52445eae5e8ef61f0547924775e85372e08e4101..befc31283b5cca7039171c40abbc7e112f7436fb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2009-03-26
+       * extended backwards compatibility mode to allow already fixed bug with
+         change actions (see "2008-02-05") for existing levels (especially the
+         Zelda and Zelda II levels and other cool stuff by Alan Bond like FMV)
+
+2009-03-24
+       * reactivated workaround to prevent program crashes due to blitting to
+         the same SDL surface that apparently only occurs on Windows systems
+         (this is no final solution; this problem needs further investigation)
+
+2008-11-05
+       * version number set to 3.2.6.1
+
+2008-11-04
+       * version 3.2.6.0 released
+
 2008-10-11
        * fixed behaviour of player option "no centering when relocating" which
          was incorrect when disabled and relocation target inside visible area
index bd5538eae7cb19bdd3894e5c8fdf911a1d3f589e..365c417c9559aa538309bfad0422368697c2a363 100644 (file)
@@ -144,7 +144,7 @@ CONFIG_GAME_DIR = $(CONFIG_RO_GAME_DIR) $(CONFIG_RW_GAME_DIR)
 CONFIG_GAME = $(CONFIG_GAME_DIR) $(CONFIG_SCORE_ENTRIES) $(CONFIG_SPECIAL)
 
 CONFIG = $(CONFIG_GAME) $(JOYSTICK)
-DEBUG = -DDEBUG -g
+DEBUG = -DDEBUG -g
 # PROFILING = $(PROFILING_FLAGS)
 
 # OPTIONS = $(DEBUG) -Wall                     # only for debugging purposes
index c8c6c65664eaaa0d4d5f4fd48ed4a96da64e0a07..cf2834973a49455c9e9bbc353ae0d32baadb43c1 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2008-11-03 21:21"
+#define COMPILE_DATE_STRING "2009-03-26 10:48"
index c32777225a076a5a2477b678b15150dbe8b2a627..bfa498816b667306e86dcf59f9ce43a6b07f0b18 100644 (file)
@@ -6345,6 +6345,32 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
       change->target_element = EL_PLAYER_1;
   }
 
+#if 1
+  /* try to detect and fix "Zelda" style levels, which are broken with 3.2.5 */
+  if (level->game_version < VERSION_IDENT(3,2,5,0))
+  {
+    /* This is needed to fix a problem that was caused by a bugfix in function
+       game.c/CheckTriggeredElementChangeExt() introduced with 3.2.5 that
+       corrects the behaviour when a custom element changes to another custom
+       element with a higher element number that has change actions defined.
+       Normally, only one change per frame is allowed for custom elements.
+       Therefore, it is checked if a custom element already changed in the
+       current frame; if it did, subsequent changes are suppressed.
+       Unfortunately, this is only checked for element changes, but not for
+       change actions, which are still executed. As the function above loops
+       through all custom elements from lower to higher, an element change
+       resulting in a lower CE number won't be checked again, while a target
+       element with a higher number will also be checked, and potential change
+       actions will get executed for this CE, too (which is wrong), while
+       further changes are ignored (which is correct). As this bugfix breaks
+       Zelda II (and introduces graphical bugs to Zelda I, and also breaks a
+       few other levels like Alan Bond's "FMV"), allow the previous, incorrect
+       behaviour for existing levels and tapes that make use of this bug */
+
+    level->use_action_after_change_bug = TRUE;
+  }
+#else
+  /* !!! THIS DOES NOT FIX "Zelda I" (GRAPHICALLY) AND "Alan's FMV" LEVELS */
   /* try to detect and fix "Zelda II" levels, which are broken with 3.2.5 */
   {
     int element = EL_CUSTOM_16;
@@ -6371,6 +6397,7 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
        strncmp(ei->description, "scanline - row 1", 16) == 0)
       level->use_action_after_change_bug = TRUE;
   }
+#endif
 
   /* not centering level after relocating player was default only in 3.2.3 */
   if (level->game_version == VERSION_IDENT(3,2,3,0))   /* (no pre-releases) */
index aec69d091a181b622e9c068441192bc77a5534d9..4fc21cd0f12f70d64b654b99203430597c36e5e0 100644 (file)
@@ -1,7 +1,7 @@
 # =============================================================================
 # Rocks'n'Diamonds Makefile (game_em)
 # -----------------------------------------------------------------------------
-# (c) 1995-2005 Holger Schemel <info@artsoft.org>
+# (c) 1995-2006 Holger Schemel <info@artsoft.org>
 # -----------------------------------------------------------------------------
 # Emerald Mine for X11 © 2000,2001 David Tritscher
 # =============================================================================
index 9dab9371e449ca0d78369721134f346fe34443cc..32ec089204945182cbede2348f9d99e75d45891e 100644 (file)
@@ -5500,6 +5500,7 @@ void InitGfx()
                   bitmap_db_field);
   InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE);
   InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE);
+  InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE);
   InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
   InitGfxCustomArtworkInfo();
 
index 60728bef8b6fdb69390d4c9b1d5c879e97be0486..407752bc96b73b6f3d6e2de9cd2d5a1b811f6c2f 100644 (file)
@@ -440,7 +440,7 @@ Pixmap XCreatePixmap(Display *display, Drawable d, unsigned int width,
   BITMAP *bitmap = NULL;
 
   if (gfx_capabilities & GFX_HW_VRAM_BLIT &&
-      width  == gfx.scrollbuffer_width && height == gfx.scrollbuffer_height)
+      width == gfx.scrollbuffer_width && height == gfx.scrollbuffer_height)
     bitmap = create_video_bitmap(width, height);
 
   if (bitmap == NULL)
index 20ea20bed03553ee0e76107830f8dc3031045e41..f05fffa0bfa8411abba2505e9805b70a87549ae2 100644 (file)
@@ -189,9 +189,16 @@ void InitGfxDoor2Info(int vx, int vy, int vxsize, int vysize)
   gfx.vysize = vysize;
 }
 
+void InitGfxWindowInfo(int win_xsize, int win_ysize)
+{
+  gfx.win_xsize = win_xsize;
+  gfx.win_ysize = win_ysize;
+}
+
 void InitGfxScrollbufferInfo(int scrollbuffer_width, int scrollbuffer_height)
 {
   /* currently only used by MSDOS code to alloc VRAM buffer, if available */
+  /* 2009-03-24: also (temporarily?) used for overlapping blit workaround */
   gfx.scrollbuffer_width = scrollbuffer_width;
   gfx.scrollbuffer_height = scrollbuffer_height;
 }
@@ -491,8 +498,8 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
   if (DrawingDeactivated(dst_x, dst_y, width, height))
     return;
 
-#if 0
-  /* !!! APPARENTLY THIS HAS BEEN FIXED IN SDL 1.2.12 !!! */
+#if 1
+  /* !!! 2009-03-24: It seems that this problem still exists with 1.2.12 !!! */
 #if defined(TARGET_SDL) && defined(PLATFORM_WIN32)
   if (src_bitmap == dst_bitmap)
   {
@@ -502,15 +509,36 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
        recent SDL libraries, but apparently does not work in 1.2.11 directly */
 
     static Bitmap *tmp_bitmap = NULL;
+    static int tmp_bitmap_xsize = 0;
+    static int tmp_bitmap_ysize = 0;
+
+    /* start with largest static bitmaps for initial bitmap size ... */
+    if (tmp_bitmap_xsize == 0 && tmp_bitmap_ysize == 0)
+    {
+      tmp_bitmap_xsize = MAX(gfx.win_xsize, gfx.scrollbuffer_width);
+      tmp_bitmap_ysize = MAX(gfx.win_ysize, gfx.scrollbuffer_height);
+    }
+
+    /* ... and allow for later re-adjustments due to custom artwork bitmaps */
+    if (src_bitmap->width > tmp_bitmap_xsize ||
+       src_bitmap->height > tmp_bitmap_ysize)
+    {
+      tmp_bitmap_xsize = MAX(tmp_bitmap_xsize, src_bitmap->width);
+      tmp_bitmap_ysize = MAX(tmp_bitmap_ysize, src_bitmap->height);
+
+      FreeBitmap(tmp_bitmap);
+
+      tmp_bitmap = NULL;
+    }
 
     if (tmp_bitmap == NULL)
-      tmp_bitmap = CreateBitmap(MAX(FXSIZE, WIN_XSIZE),
-                               MAX(FYSIZE, WIN_YSIZE), DEFAULT_DEPTH);
+      tmp_bitmap = CreateBitmap(tmp_bitmap_xsize, tmp_bitmap_ysize,
+                               DEFAULT_DEPTH);
 
     sysCopyArea(src_bitmap, tmp_bitmap,
                src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE);
     sysCopyArea(tmp_bitmap, dst_bitmap,
-               src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE);
+               dst_x, dst_y, width, height, dst_x, dst_y, BLIT_OPAQUE);
 
     return;
   }
index 3791f1e6523b07e16e7d70b6886f5b22a01cefc0..aa1057fd956f6b7066acc3c893333ae2b35fed60 100644 (file)
@@ -726,6 +726,8 @@ struct GfxInfo
   int vx, vy;
   int vxsize, vysize;
 
+  int win_xsize, win_ysize;
+
   int draw_deactivation_mask;
   int draw_background_mask;
 
@@ -1144,6 +1146,7 @@ void ClosePlatformDependentStuff(void);
 void InitGfxFieldInfo(int, int, int, int, int, int, int, int, Bitmap *);
 void InitGfxDoor1Info(int, int, int, int);
 void InitGfxDoor2Info(int, int, int, int);
+void InitGfxWindowInfo(int, int);
 void InitGfxScrollbufferInfo(int, int);
 void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(void));
 void InitGfxCustomArtworkInfo();
index d47b40686a75dfdf113932272fd9e2b48df710fe..93d3259dce9a2adcb69e94189623faff0a868e5f 100644 (file)
 #define PROGRAM_VERSION_MAJOR          3
 #define PROGRAM_VERSION_MINOR          2
 #define PROGRAM_VERSION_PATCH          6
-#define PROGRAM_VERSION_BUILD          0
+#define PROGRAM_VERSION_BUILD          1
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"