rnd-20070321-1-src
[rocksndiamonds.git] / src / tools.c
index c1509c1d09d81bd4a49a3a7a6a09432a49e125a6..d3909d5eedbfff6901940af9c64a692d8481f1fc 100644 (file)
@@ -521,11 +521,39 @@ void FadeToFront()
 
 void FadeExt(int fade_mask, int fade_mode)
 {
+  static int fade_mode_skip = FADE_MODE_NONE;
   void (*draw_border_function)(void) = NULL;
   Bitmap *bitmap = (fade_mode == FADE_MODE_CROSSFADE ? bitmap_db_cross : NULL);
   int x, y, width, height;
   int fade_delay, post_delay;
 
+  redraw_mask |= fade_mask;
+
+  if (fade_mode & FADE_TYPE_SKIP)
+  {
+    fade_mode_skip = fade_mode;
+
+    return;
+  }
+
+  if (fade_mode_skip & FADE_TYPE_SKIP)
+  {
+#if 0
+    printf("::: skipping %d ... [%d]\n", fade_mode, fade_mode_skip);
+#endif
+
+    /* skip all fade operations until specified fade operation */
+    if (fade_mode & fade_mode_skip)
+      fade_mode_skip = FADE_MODE_NONE;
+
+    return;
+  }
+
+#if 1
+  if (fading.fade_mode == FADE_MODE_NONE)
+    return;
+#endif
+
   if (fade_mask & REDRAW_FIELD)
   {
     x = REAL_SX;
@@ -533,8 +561,8 @@ void FadeExt(int fade_mask, int fade_mode)
     width  = FULL_SXSIZE;
     height = FULL_SYSIZE;
 
-    fade_delay = menu.fade_delay;
-    post_delay = (fade_mode == FADE_MODE_FADE_OUT ? menu.post_delay : 0);
+    fade_delay = fading.fade_delay;
+    post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0);
 
     draw_border_function = DrawMaskedBorder_FIELD;
   }
@@ -545,13 +573,15 @@ void FadeExt(int fade_mask, int fade_mode)
     width  = WIN_XSIZE;
     height = WIN_YSIZE;
 
-    fade_delay = title.fade_delay;
-    post_delay = (fade_mode == FADE_MODE_FADE_OUT ? title.post_delay : 0);
+    fade_delay = fading.fade_delay;
+    post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0);
   }
 
-  redraw_mask |= fade_mask;
-
+#if 1
   if (!setup.fade_screens || fade_delay == 0)
+#else
+  if (!setup.fade_screens || fade_delay == 0 || fading.anim_mode == ANIM_NONE)
+#endif
   {
     if (fade_mode == FADE_MODE_FADE_OUT)
       ClearRectangle(backbuffer, x, y, width, height);
@@ -569,12 +599,26 @@ void FadeExt(int fade_mask, int fade_mode)
 
 void FadeIn(int fade_mask)
 {
+#if 1
+  if (fading.fade_mode == FADE_MODE_CROSSFADE)
+    FadeExt(fade_mask, FADE_MODE_CROSSFADE);
+  else
+    FadeExt(fade_mask, FADE_MODE_FADE_IN);
+#else
   FadeExt(fade_mask, FADE_MODE_FADE_IN);
+#endif
 }
 
 void FadeOut(int fade_mask)
 {
+#if 1
+  if (fading.fade_mode == FADE_MODE_CROSSFADE)
+    FadeCrossSaveBackbuffer();
+  else
+    FadeExt(fade_mask, FADE_MODE_FADE_OUT);
+#else
   FadeExt(fade_mask, FADE_MODE_FADE_OUT);
+#endif
 }
 
 void FadeCross(int fade_mask)
@@ -587,6 +631,48 @@ void FadeCrossSaveBackbuffer()
   BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
 }
 
+void FadeSetEnterMenu()
+{
+  fading = menu.enter_menu;
+}
+
+void FadeSetLeaveMenu()
+{
+  fading = menu.leave_menu;
+}
+
+void FadeSetStartItem()
+{
+  fading = menu.start_item;
+}
+
+void FadeSetFromType(int type)
+{
+  if (type & TYPE_ENTER_SCREEN)
+    FadeSetStartItem();
+  else if (type & TYPE_ENTER)
+    FadeSetEnterMenu();
+  else if (type & TYPE_LEAVE)
+    FadeSetLeaveMenu();
+}
+
+void FadeSetDisabled()
+{
+  static struct TitleFadingInfo fading_none = { FADE_MODE_NONE, -1, -1, -1 };
+
+  fading = fading_none;
+}
+
+void FadeSkipNextFadeIn()
+{
+  FadeExt(0, FADE_MODE_SKIP_FADE_IN);
+}
+
+void FadeSkipNextFadeOut()
+{
+  FadeExt(0, FADE_MODE_SKIP_FADE_OUT);
+}
+
 void SetWindowBackgroundImageIfDefined(int graphic)
 {
   if (graphic_info[graphic].bitmap)
@@ -2988,7 +3074,7 @@ unsigned int MoveDoor(unsigned int door_state)
 
   if (setup.quick_doors)
   {
-    stepsize = 20;             /* must be choosen to always draw last frame */
+    stepsize = 20;             /* must be chosen to always draw last frame */
     door_delay_value = 0;
   }