improved and extended definitions for title screen transitions
[rocksndiamonds.git] / src / screens.c
index 9de4b55d4bdbddb06d5a1519ff13cf4dfd74151a..1f94c7850526b018393acae400a9c0b37980e86c 100644 (file)
@@ -1308,6 +1308,14 @@ void DrawTitleScreenMessage(int nr, boolean initial)
   /* force TITLE font on title message screen */
   game_status = getTitleMessageGameMode(initial);
 
+  /* if chars *and* width set to "-1", automatically determine width */
+  if (tmi->chars == -1 && tmi->width == -1)
+    tmi->width = viewport.window[game_status].width;
+
+  /* if lines *and* height set to "-1", automatically determine height */
+  if (tmi->lines == -1 && tmi->height == -1)
+    tmi->height = viewport.window[game_status].height;
+
   /* if chars set to "-1", automatically determine by text and font width */
   if (tmi->chars == -1)
     tmi->chars = tmi->width / getFontWidth(tmi->font);
@@ -1320,6 +1328,14 @@ void DrawTitleScreenMessage(int nr, boolean initial)
   else
     tmi->height = tmi->lines * getFontHeight(tmi->font);
 
+  /* if x set to "-1", automatically determine by width and alignment */
+  if (tmi->x == -1)
+    tmi->x = -1 * ALIGNED_XPOS(0, tmi->width, tmi->align);
+
+  /* if y set to "-1", automatically determine by height and alignment */
+  if (tmi->y == -1)
+    tmi->y = -1 * ALIGNED_YPOS(0, tmi->height, tmi->valign);
+
   SetDrawBackgroundMask(REDRAW_ALL);
   SetWindowBackgroundImage(getTitleBackground(nr, initial, FALSE));
 
@@ -1536,9 +1552,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
   static int last_sound = -1, last_music = -1;
   boolean return_to_main_menu = FALSE;
   struct TitleControlInfo *tci;
-  struct TitleFadingInfo fading_default;
-  struct TitleFadingInfo fading_last = fading;
-  struct TitleFadingInfo fading_next;
   int sound, music;
 
   if (button == MB_MENU_INITIALIZE)
@@ -1550,6 +1563,8 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
     last_sound = SND_UNDEFINED;
     last_music = MUS_UNDEFINED;
 
+    FadeSetEnterScreen();
+
     if (game_status_last_screen == GAME_MODE_INFO)
     {
       if (num_title_screens == 0)
@@ -1563,27 +1578,19 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       FadeSoundsAndMusic();
 
       FadeOut(REDRAW_ALL);
-
-      /* only required to update logic for redrawing global border */
-      ClearField();
     }
 
+    /* only required to update logic for redrawing global border */
+    ClearField();
+
+    /* title screens may have different window size */
+    ChangeViewportPropertiesIfNeeded();
+
     if (tci->is_image)
       DrawTitleScreenImage(tci->local_nr, tci->initial);
     else
       DrawTitleScreenMessage(tci->local_nr, tci->initial);
 
-    fading_default = (tci->initial ? title_initial_default : title_default);
-
-    fading = fading_next = getTitleFading(tci);
-
-    if (!(fading_last.fade_mode & FADE_TYPE_TRANSFORM) &&
-       fading_next.fade_mode & FADE_TYPE_TRANSFORM)
-    {
-      fading.fade_mode = FADE_MODE_FADE;
-      fading.fade_delay = fading_default.fade_delay;
-    }
-
     sound = getTitleSound(tci);
     music = getTitleMusic(tci);
 
@@ -1599,8 +1606,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 
     FadeIn(REDRAW_ALL);
 
-    fading = fading_next;
-
     DelayReached(&title_delay, 0);     /* reset delay counter */
 
     return;
@@ -1640,6 +1645,8 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       if (music == MUS_UNDEFINED || music != last_music)
        FadeMusic();
 
+      fading = getTitleFading(tci);
+
       FadeOut(REDRAW_ALL);
 
       if (tci->is_image)
@@ -1647,8 +1654,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       else
        DrawTitleScreenMessage(tci->local_nr, tci->initial);
 
-      fading_next = getTitleFading(tci);
-
       sound = getTitleSound(tci);
       music = getTitleMusic(tci);
 
@@ -1660,15 +1665,8 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       last_sound = sound;
       last_music = music;
 
-      /* last screen already faded out, next screen has no animation */
-      if (!(fading.fade_mode & FADE_TYPE_TRANSFORM) &&
-         fading_next.fade_mode == FADE_MODE_NONE)
-       fading = fading_next;
-
       FadeIn(REDRAW_ALL);
 
-      fading = fading_next;
-
       DelayReached(&title_delay, 0);   /* reset delay counter */
     }
     else
@@ -2158,6 +2156,8 @@ static void DrawInfoScreen_Main()
 
   FadeOut(fade_mask);
 
+  ChangeViewportPropertiesIfNeeded();
+
   OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
 
   ClearField();
@@ -2183,6 +2183,11 @@ static void DrawInfoScreen_Main()
   PlayMenuSound();
   PlayMenuMusic();
 
+#if 1
+  // needed after returning from title screens with different window size
+  OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+#endif
+
   DrawMaskedBorder(fade_mask);
 
   FadeIn(fade_mask);