rnd-20060816-1-src
[rocksndiamonds.git] / src / tools.c
index 5051780e432522e57eb42094db5ca5b5550f4179..8d0fe8deab0d5524716148911957e9aa00005232 100644 (file)
@@ -423,7 +423,8 @@ void FadeIn(int fade_delay)
     return;
   }
 
-  FadeScreen(NULL, FADE_MODE_FADE_IN, fade_delay, 0);
+  FadeRectangle(NULL, 0, 0, WIN_XSIZE, WIN_YSIZE,
+               FADE_MODE_FADE_IN, fade_delay, 0);
 
   redraw_mask = REDRAW_NONE;
 }
@@ -438,7 +439,8 @@ void FadeOut(int fade_delay, int post_delay)
     return;
   }
 
-  FadeScreen(NULL, FADE_MODE_FADE_OUT, fade_delay, post_delay);
+  FadeRectangle(NULL, 0, 0, WIN_XSIZE, WIN_YSIZE,
+               FADE_MODE_FADE_OUT, fade_delay, post_delay);
 
   redraw_mask = REDRAW_NONE;
 }
@@ -453,11 +455,60 @@ void FadeCross(int fade_delay)
     return;
   }
 
-  FadeScreen(bitmap_db_title, FADE_MODE_CROSSFADE, fade_delay, 0);
+  FadeRectangle(bitmap_db_title, 0, 0, WIN_XSIZE, WIN_YSIZE,
+               FADE_MODE_CROSSFADE, fade_delay, 0);
 
   redraw_mask = REDRAW_NONE;
 }
 
+void FadeInField(int fade_delay)
+{
+  if (fade_delay == 0)
+  {
+    BackToFront();
+
+    return;
+  }
+
+  FadeRectangle(NULL, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
+               FADE_MODE_FADE_IN, fade_delay, 0);
+
+  redraw_mask &= ~REDRAW_FIELD;
+}
+
+void FadeOutField(int fade_delay, int post_delay)
+{
+  if (fade_delay == 0)
+  {
+    ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+    BackToFront();
+
+    return;
+  }
+
+  FadeRectangle(NULL, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
+               FADE_MODE_FADE_OUT, fade_delay, post_delay);
+
+  redraw_mask &= ~REDRAW_FIELD;
+}
+
+void FadeCrossField(int fade_delay)
+{
+  if (fade_delay == 0)
+  {
+    BlitBitmap(bitmap_db_title, backbuffer, REAL_SX, REAL_SY,
+              FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY);
+    BackToFront();
+
+    return;
+  }
+
+  FadeRectangle(bitmap_db_title, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
+               FADE_MODE_CROSSFADE, fade_delay, 0);
+
+  redraw_mask &= ~REDRAW_FIELD;
+}
+
 void SetMainBackgroundImageIfDefined(int graphic)
 {
   if (graphic_info[graphic].bitmap)
@@ -490,7 +541,11 @@ void SetPanelBackground()
 
 void DrawBackground(int dst_x, int dst_y, int width, int height)
 {
+#if 1
+  ClearRectangleOnBackground(drawto, dst_x, dst_y, width, height);
+#else
   ClearRectangleOnBackground(backbuffer, dst_x, dst_y, width, height);
+#endif
 
   redraw_mask |= REDRAW_FIELD;
 }
@@ -2057,8 +2112,15 @@ void DrawPlayer(struct PlayerInfo *player)
       GfxElement[jx][jy] = EL_UNDEFINED;
 
       /* make sure that pushed elements are drawn with correct frame rate */
+#if 1
+      graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir);
+
+      if (player->is_pushing && player->is_moving && !IS_ANIM_MODE_CE(graphic))
+       GfxFrame[jx][jy] = player->StepFrame;
+#else
       if (player->is_pushing && player->is_moving)
        GfxFrame[jx][jy] = player->StepFrame;
+#endif
 
       DrawLevelField(jx, jy);
     }
@@ -2118,15 +2180,26 @@ void DrawPlayer(struct PlayerInfo *player)
     int px = SCREENX(jx), py = SCREENY(jy);
     int pxx = (TILEX - ABS(sxx)) * dx;
     int pyy = (TILEY - ABS(syy)) * dy;
+    int gfx_frame = GfxFrame[jx][jy];
 
     int graphic;
+    int sync_frame;
     int frame;
 
     if (!IS_MOVING(jx, jy))            /* push movement already finished */
+    {
       element = Feld[next_jx][next_jy];
+      gfx_frame = GfxFrame[next_jx][next_jy];
+    }
 
     graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir);
+
+#if 1
+    sync_frame = (IS_ANIM_MODE_CE(graphic) ? gfx_frame : player->StepFrame);
+    frame = getGraphicAnimationFrame(graphic, sync_frame);
+#else
     frame = getGraphicAnimationFrame(graphic, player->StepFrame);
+#endif
 
     /* draw background element under pushed element (like the Sokoban field) */
     if (Back[next_jx][next_jy])