rnd-20100224-1-src
[rocksndiamonds.git] / src / game_sp / DDScrollBuffer.c
index 5a89919c320bc0982be26a0b3d365d535c6f680f..de5b237edceeea21b823462ed992fe30ca4e0943 100644 (file)
@@ -39,6 +39,28 @@ boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 
 int TEST_flag = 0;
 
+void RestorePlayfield()
+{
+  int x1 = mScrollX / TILEX - 2;
+  int y1 = mScrollY / TILEY - 2;
+  int x2 = mScrollX / TILEX + (SCR_FIELDX - 1) + 2;
+  int y2 = mScrollY / TILEY + (SCR_FIELDY - 1) + 2;
+  int x, y;
+
+  DrawFrameIfNeeded();
+
+  for (y = DisplayMinY; y <= DisplayMaxY; y++)
+  {
+    for (x = DisplayMinX; x <= DisplayMaxX; x++)
+    {
+      if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
+      {
+       DrawFieldNoAnimated(x, y);
+       DrawFieldAnimated(x, y);
+      }
+    }
+  }
+}
 
 static void ScrollPlayfield(int dx, int dy)
 {
@@ -184,7 +206,7 @@ void InitScrollPlayfield()
   ScrollPlayfieldIfNeededExt(TRUE);
 }
 
-void UpdatePlayfield()
+void UpdatePlayfield(boolean force_redraw)
 {
   int x, y;
 #if 1
@@ -198,14 +220,18 @@ void UpdatePlayfield()
       int element = LowByte(PlayField16[GetSI(x, y)]);
       int graphic = GfxGraphic[x][y];
       int sync_frame = GfxFrame[x][y];
-#if 1
-      boolean redraw = FALSE;
-#else
-      boolean redraw = TRUE;   // !!! TEST ONLY -- ALWAYS REDRAW !!!
+      boolean redraw = force_redraw;
+
+#if 0
+      redraw = TRUE;   // !!! TEST ONLY -- ALWAYS REDRAW !!!
 #endif
 
       if (graphic < 0)
+      {
+       GfxGraphicLast[x][y] = GfxGraphic[x][y];
+
        continue;
+      }
 
       if (element != GfxElementLast[x][y] &&
          graphic == GfxGraphicLast[x][y])