added selecting score entry from the score info screen
[rocksndiamonds.git] / src / screens.c
index 4156383e3a640604f7ff9ede5deb3e4af483b2d1..a3f9de148b4dbd348b5ef384ce811dcf759d7b70 100644 (file)
@@ -262,6 +262,7 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 static void DrawChoosePlayerName(void);
 static void DrawChooseLevelSet(void);
 static void DrawChooseLevelNr(void);
+static void DrawScoreInfo(int);
 static void DrawInfoScreen(void);
 static void DrawSetupScreen(void);
 static void DrawTypeName(void);
@@ -295,6 +296,8 @@ static void execOfferUploadTapes(void);
 
 static void DrawHallOfFame_setScoreEntries(void);
 static void HandleHallOfFame_SelectLevel(int, int);
+static void HandleHallOfFame_SelectLevelOrScore(int, int);
+static char *getHallOfFameRankText(int);
 static char *getHallOfFameScoreText(int);
 
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
@@ -4942,8 +4945,7 @@ static void drawChooseTreeText(TreeInfo *ti, int y, boolean active)
     int startx3 = startx + dx3;
     int startx4 = startx + dx4;
     int pos = node->pos;
-    boolean forced = (scores.force_last_added && pos == scores.last_added);
-    char *pos_text = (forced ? "???" : int2str(pos + 1, 3));
+    char *pos_text = getHallOfFameRankText(pos);
     char *dot_text = ".";
     int i;
 
@@ -5144,6 +5146,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   int num_entries = numTreeInfoInGroup(ti);
   int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
   boolean position_set_by_scrollbar = (dx == 999);
+  boolean button_action = (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE);
+  boolean button_is_valid = (mx >= 0 && my >= 0);
+  boolean button_screen_clicked = (button_action && button_is_valid);
 
   if (game_status == GAME_MODE_SCORES)
   {
@@ -5171,7 +5176,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
       {
        drawChooseTreeScreen_Scores_NotAvailable();
       }
-      else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE)
+      else if (button_screen_clicked)
       {
        PlaySound(SND_MENU_ITEM_SELECTING);
 
@@ -5563,6 +5568,14 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
                               level.random_seed);
              return;
            }
+           else
+           {
+             SetGameStatus(GAME_MODE_SCOREINFO);
+
+             DrawScoreInfo(node_cursor->pos);
+
+             return;
+           }
          }
 
          SetGameStatus(GAME_MODE_MAIN);
@@ -5771,6 +5784,13 @@ void DrawHallOfFame(int level_nr)
   DrawChooseTree(&score_entry_current);
 }
 
+static char *getHallOfFameRankText(int nr)
+{
+  boolean forced = (scores.force_last_added && nr == scores.last_added);
+
+  return (forced ? "???" : int2str(nr + 1, 3));
+}
+
 static char *getHallOfFameTimeText(int nr)
 {
   static char score_text[10];
@@ -5795,7 +5815,7 @@ static char *getHallOfFameScoreText(int nr)
 
 static void HandleHallOfFame_SelectLevel(int step, int direction)
 {
-  int old_level_nr = level_nr;
+  int old_level_nr = scores.last_level_nr;
   int new_level_nr = old_level_nr + step * direction;
 
   if (new_level_nr < leveldir_current->first_level)
@@ -5836,6 +5856,142 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
   HandleChooseTree(mx, my, dx, dy, button, &score_entry_current);
 }
 
+static void DrawScoreInfo_Content(int entry_nr)
+{
+  struct ScoreEntry *entry = &scores.entry[entry_nr];
+  char *pos_text = getHallOfFameRankText(entry_nr);
+  int font_title = MENU_INFO_FONT_TITLE;
+  int font_head  = MENU_INFO_FONT_HEAD;
+  int font_text  = MENU_INFO_FONT_TEXT;
+  int font_foot  = MENU_INFO_FONT_FOOT;
+  int spacing_title = menu.headline1_spacing[GAME_MODE_SCOREINFO];
+  int spacing_para  = menu.paragraph_spacing[GAME_MODE_SCOREINFO];
+  int spacing_line  = menu.line_spacing[GAME_MODE_SCOREINFO];
+  int xstep = getFontWidth(font_text);
+  int ystep_title = getMenuTextStep(spacing_title, font_title);
+  int ystep_para  = getMenuTextStep(spacing_para,  font_text);
+  int ystep_line  = getMenuTextStep(spacing_line,  font_text);
+  int ystart  = mSY - SY + menu.top_spacing[GAME_MODE_SCOREINFO];
+  int ybottom = mSY - SY + SYSIZE - menu.bottom_spacing[GAME_MODE_SCOREINFO];
+  int xstart1 = mSX - SX + 2 * xstep;
+  int xstart2 = mSX - SX + 14 * xstep;
+
+  ClearField();
+
+  // redraw score selection buttons (which have just been erased)
+  RedrawScreenMenuGadgets(SCREEN_MASK_SCORES);
+
+  drawChooseTreeHead(score_entries);
+  drawChooseTreeInfo(score_entries);
+
+  DrawTextSCentered(ystart, font_title, "Score Information:");
+  ystart += ystep_title;
+
+  DrawTextF(xstart1, ystart, font_head, "Level Set");
+  DrawTextF(xstart2, ystart, font_text, leveldir_current->name);
+  ystart += ystep_line;
+
+  DrawTextF(xstart1, ystart, font_head, "Level Name");
+  DrawTextF(xstart2, ystart, font_text, level.name);
+  ystart += ystep_para;
+
+  DrawTextF(xstart1, ystart, font_head, "Rank");
+  DrawTextF(xstart2, ystart, font_text, pos_text);
+  ystart += ystep_line;
+
+  DrawTextF(xstart1, ystart, font_head, "Player");
+  DrawTextF(xstart2, ystart, font_text, entry->name);
+  ystart += ystep_line;
+
+  if (level.use_step_counter)
+  {
+    DrawTextF(xstart1, ystart, font_head, "Steps");
+    DrawTextF(xstart2, ystart, font_text, int2str(entry->time, 5));
+    ystart += ystep_line;
+  }
+  else
+  {
+    DrawTextF(xstart1, ystart, font_head, "Time");
+    DrawTextF(xstart2, ystart, font_text, getHallOfFameTimeText(entry_nr));
+    ystart += ystep_line;
+  }
+
+  if (!level.rate_time_over_score || entry->score > 0)
+  {
+    DrawTextF(xstart1, ystart, font_head, "Score");
+    DrawTextF(xstart2, ystart, font_text, int2str(entry->score, 5));
+    ystart += ystep_line;
+  }
+
+  DrawTextSCentered(ybottom, font_foot, "Press any key or button to go back");
+}
+
+static void DrawScoreInfo(int entry_nr)
+{
+  scores.last_entry_nr = entry_nr;
+
+  SetMainBackgroundImageIfDefined(IMG_BACKGROUND_SCOREINFO);
+
+  UnmapAllGadgets();
+
+  FadeOut(REDRAW_FIELD);
+
+  // map gadgets for score info screen
+  MapScreenMenuGadgets(SCREEN_MASK_SCORES);
+
+  DrawScoreInfo_Content(entry_nr);
+
+  FadeIn(REDRAW_FIELD);
+}
+
+static void HandleScoreInfo_SelectScore(int step, int direction)
+{
+  int old_entry_nr = scores.last_entry_nr;
+  int new_entry_nr = old_entry_nr + step * direction;
+  int num_nodes = numTreeInfoInGroup(score_entry_current);
+  int num_entries = num_nodes - 1;     // score nodes only, without back link
+
+  if (new_entry_nr < 0)
+    new_entry_nr = 0;
+  if (new_entry_nr > num_entries - 1)
+    new_entry_nr = num_entries - 1;
+
+  if (new_entry_nr != old_entry_nr)
+  {
+    scores.last_entry_nr = new_entry_nr;
+
+    DrawScoreInfo_Content(new_entry_nr);
+  }
+}
+
+void HandleScoreInfo(int mx, int my, int dx, int dy, int button)
+{
+  boolean button_action = (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE);
+  boolean button_is_valid = (mx >= 0 && my >= 0);
+  boolean button_screen_clicked = (button_action && button_is_valid);
+
+  if (button_screen_clicked)
+  {
+    PlaySound(SND_MENU_ITEM_SELECTING);
+
+    SetGameStatus(GAME_MODE_SCORES);
+
+    DrawHallOfFame(level_nr);
+  }
+  else if (dx || dy)
+  {
+    HandleScoreInfo_SelectScore(1, SIGN(dx ? dx : dy));
+  }
+}
+
+static void HandleHallOfFame_SelectLevelOrScore(int step, int direction)
+{
+  if (game_status == GAME_MODE_SCORES)
+    HandleHallOfFame_SelectLevel(step, direction);
+  else
+    HandleScoreInfo_SelectScore(step, direction);
+}
+
 
 // ============================================================================
 // setup screen functions
@@ -10258,11 +10414,11 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       break;
 
     case SCREEN_CTRL_ID_PREV_LEVEL2:
-      HandleHallOfFame_SelectLevel(step, -1);
+      HandleHallOfFame_SelectLevelOrScore(step, -1);
       break;
 
     case SCREEN_CTRL_ID_NEXT_LEVEL2:
-      HandleHallOfFame_SelectLevel(step, +1);
+      HandleHallOfFame_SelectLevelOrScore(step, +1);
       break;
 
     case SCREEN_CTRL_ID_FIRST_LEVEL: