added functions to open URLs (not used yet)
[rocksndiamonds.git] / src / screens.c
index 048359fe13c54e0ed4b59a0dfd9938651bb544fa..cf0e528e3b69413649169776246ae4bf058502f2 100644 (file)
@@ -302,7 +302,7 @@ static void UnmapScreenTreeGadgets(void);
 
 static void UpdateScreenMenuGadgets(int, boolean);
 static void AdjustScoreInfoButtons_SelectScore(int, int, int);
-static void AdjustScoreInfoButtons_PlayTape(int, int);
+static void AdjustScoreInfoButtons_PlayTape(int, int, boolean);
 
 static boolean OfferUploadTapes(void);
 static void execOfferUploadTapes(void);
@@ -1693,6 +1693,18 @@ void DrawMainMenu(void)
     return;
   }
 
+  // needed if last screen was the playing screen, invoked from hall of fame
+  if (score_info_tape_play)
+  {
+    CloseDoor(DOOR_CLOSE_ALL);
+
+    SetGameStatus(GAME_MODE_SCOREINFO);
+
+    DrawScoreInfo(scores.last_entry_nr);
+
+    return;
+  }
+
   // leveldir_current may be invalid (level group, parent link, node copy)
   leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid);
 
@@ -5374,6 +5386,7 @@ static void DrawScoreInfo_Content(int entry_nr)
   int select_y1, select_y2;
   int play_x, play_y;
   int play_height = screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE]->height;
+  boolean play_visible = (entry->id != -1);
   int font_width = getFontWidth(font_text);
   int font_height = getFontHeight(font_text);
   int tape_date_width  = getTextWidth(entry->tape_date, font_text);
@@ -5472,12 +5485,13 @@ static void DrawScoreInfo_Content(int entry_nr)
   DrawTextSCentered(ybottom, font_foot, "Press any key or button to go back");
 
   AdjustScoreInfoButtons_SelectScore(select_x, select_y1, select_y2);
-  AdjustScoreInfoButtons_PlayTape(play_x, play_y);
+  AdjustScoreInfoButtons_PlayTape(play_x, play_y, play_visible);
 }
 
 static void DrawScoreInfo(int entry_nr)
 {
   scores.last_entry_nr = entry_nr;
+  score_info_tape_play = FALSE;
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_SCOREINFO);
 
@@ -5485,6 +5499,9 @@ static void DrawScoreInfo(int entry_nr)
 
   FadeOut(REDRAW_FIELD);
 
+  // needed if different viewport properties defined after playing score tape
+  ChangeViewportPropertiesIfNeeded();
+
   DrawScoreInfo_Content(entry_nr);
 
   // map gadgets for score info screen
@@ -5515,6 +5532,12 @@ static void HandleScoreInfo_SelectScore(int step, int direction)
 
 static void HandleScoreInfo_PlayTape(void)
 {
+  if (!PlayScoreTape(scores.last_entry_nr))
+  {
+    DrawScoreInfo_Content(scores.last_entry_nr);
+
+    FadeIn(REDRAW_FIELD);
+  }
 }
 
 void HandleScoreInfo(int mx, int my, int dx, int dy, int button)
@@ -9997,13 +10020,17 @@ static void AdjustScoreInfoButtons_SelectScore(int x, int y1, int y2)
     ModifyGadget(gi_2, GDI_X, x, GDI_Y, y2, GDI_END);
 }
 
-static void AdjustScoreInfoButtons_PlayTape(int x, int y)
+static void AdjustScoreInfoButtons_PlayTape(int x, int y, boolean visible)
 {
   struct GadgetInfo *gi = screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE];
   struct MenuPosInfo *pos = menubutton_info[SCREEN_CTRL_ID_PLAY_TAPE].pos;
 
-  if (pos->x == -1 && pos->y == -1)
-    ModifyGadget(gi, GDI_X, x, GDI_Y, y, GDI_END);
+  // set gadget position dynamically, pre-defined or off-screen
+  int xx = (visible ? (pos->x == -1 ? x : pos->x) : POS_OFFSCREEN);
+  int yy = (visible ? (pos->y == -1 ? y : pos->y) : POS_OFFSCREEN);
+
+  ModifyGadget(gi, GDI_X, xx, GDI_Y, yy, GDI_END);
+  MapGadget(gi);       // (needed if deactivated on last score page)
 }
 
 static void HandleScreenGadgets(struct GadgetInfo *gi)