changed main screen to initially start with closed upper door
[rocksndiamonds.git] / src / tools.c
index 2fa69f1151f8656702b3e6993645b243a81b095a..3948bcb1745ff83ad312b2ae5562cbf94af2bffe 100644 (file)
@@ -24,7 +24,8 @@
 
 
 /* select level set with EMC X11 graphics before activating EM GFX debugging */
-#define DEBUG_EM_GFX   0
+#define DEBUG_EM_GFX           FALSE
+#define DEBUG_FRAME_TIME       FALSE
 
 /* tool button identifiers */
 #define TOOL_CTRL_ID_YES       0
@@ -292,6 +293,9 @@ static void DrawMaskedBorderExt_Rect(int x, int y, int width, int height,
 {
   Bitmap *bitmap = getGlobalBorderBitmapFromGameStatus();
 
+  if (x == -1 && y == -1)
+    return;
+
   if (blit_to_screen)
     BlitToScreenMasked(bitmap, x, y, width, height, x, y);
   else
@@ -462,6 +466,44 @@ void DrawFramesPerSecond()
              font_nr, BLIT_OPAQUE);
 }
 
+#if DEBUG_FRAME_TIME
+static void PrintFrameTimeDebugging()
+{
+  static unsigned int last_counter = 0;
+  unsigned int counter = Counter();
+  int diff_1 = counter - last_counter;
+  int diff_2 = diff_1 - GAME_FRAME_DELAY;
+  int diff_2_max = 20;
+  int diff_2_cut = MIN(ABS(diff_2), diff_2_max);
+  char diff_bar[2 * diff_2_max + 5];
+  int pos = 0;
+  int i;
+
+  diff_bar[pos++] = (diff_2 < -diff_2_max ? '<' : ' ');
+
+  for (i = 0; i < diff_2_max; i++)
+    diff_bar[pos++] = (diff_2 >= 0 ? ' ' :
+                      i >= diff_2_max - diff_2_cut ? '-' : ' ');
+
+  diff_bar[pos++] = '|';
+
+  for (i = 0; i < diff_2_max; i++)
+    diff_bar[pos++] = (diff_2 <= 0 ? ' ' : i < diff_2_cut ? '+' : ' ');
+
+  diff_bar[pos++] = (diff_2 > diff_2_max ? '>' : ' ');
+
+  diff_bar[pos++] = '\0';
+
+  Error(ERR_INFO, "%06d [%02d] [%c%02d] %s",
+       counter,
+       diff_1,
+       (diff_2 < 0 ? '-' : diff_2 > 0 ? '+' : ' '), ABS(diff_2),
+       diff_bar);
+
+  last_counter = counter;
+}
+#endif
+
 void BackToFront()
 {
   if (redraw_mask == REDRAW_NONE)
@@ -509,6 +551,13 @@ void BackToFront()
   }
 
   redraw_mask = REDRAW_NONE;
+
+  // force screen redraw in every frame to continue drawing global animations
+  redraw_mask = REDRAW_FIELD;
+
+#if DEBUG_FRAME_TIME
+  PrintFrameTimeDebugging();
+#endif
 }
 
 static void FadeCrossSaveBackbuffer()
@@ -628,6 +677,20 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type)
   redraw_mask &= ~fade_mask;
 }
 
+static void SetAnimStatus_BeforeFadingOut()
+{
+  global.anim_status = GAME_MODE_PSEUDO_FADING;
+}
+
+static void SetAnimStatus_AfterFadingIn()
+{
+  global.anim_status = global.anim_status_next;
+
+  // force update of global animation status in case of rapid screen changes
+  redraw_mask = REDRAW_ALL;
+  BackToFront();
+}
+
 void FadeIn(int fade_mask)
 {
 #if 1
@@ -643,10 +706,14 @@ void FadeIn(int fade_mask)
   FADE_SY = REAL_SY;
   FADE_SXSIZE = FULL_SXSIZE;
   FADE_SYSIZE = FULL_SYSIZE;
+
+  SetAnimStatus_AfterFadingIn();
 }
 
 void FadeOut(int fade_mask)
 {
+  SetAnimStatus_BeforeFadingOut();
+
 #if 0
   DrawMaskedBorder(REDRAW_ALL);
 #endif
@@ -4164,7 +4231,7 @@ unsigned int MoveDoor(unsigned int door_state)
     { DX, DY, DXSIZE, DYSIZE },
     { VX, VY, VXSIZE, VYSIZE }
   };
-  static int door1 = DOOR_OPEN_1;
+  static int door1 = DOOR_CLOSE_1;
   static int door2 = DOOR_CLOSE_2;
   unsigned int door_delay = 0;
   unsigned int door_delay_value;
@@ -8181,6 +8248,8 @@ void JoinRectangles(int *x, int *y, int *width, int *height,
 void SetGameStatus(int game_status_new)
 {
   game_status = game_status_new;
+
+  global.anim_status_next = game_status;
 }
 
 void ChangeViewportPropertiesIfNeeded()