added loading high scores from score server
[rocksndiamonds.git] / src / screens.c
index dbac21b31e47d8625abb9f940bf84b7d12139bdc..d86fa57267864ca83e626f6917683fddb8966c8a 100644 (file)
 // other screen text constants
 #define STR_CHOOSE_TREE_EDIT           "Edit"
 #define MENU_CHOOSE_TREE_FONT(x)       (FONT_TEXT_1 + (x))
+#define MENU_CHOOSE_TREE_COLOR(ti, a)  TREE_COLOR(ti, a)
 
 // for input setup functions
 #define SETUPINPUT_SCREEN_POS_START    0
@@ -1629,9 +1630,8 @@ void DrawMainMenu(void)
     return;
   }
 
-  // leveldir_current may be invalid (level group, parent link)
-  if (!validLevelSeries(leveldir_current))
-    leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
+  // leveldir_current may be invalid (level group, parent link, node copy)
+  leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid);
 
   if (leveldir_current != leveldir_last_valid)
   {
@@ -1738,6 +1738,8 @@ void DrawMainMenu(void)
   SetMouseCursor(CURSOR_DEFAULT);
 
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
+
+  SyncEmscriptenFilesystem();
 }
 
 static void gotoTopLevelDir(void)
@@ -2155,6 +2157,9 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
          SaveLevelSetup_LastSeries();
          SaveLevelSetup_SeriesInfo();
 
+         // restore level set if chosen from "last played level set" menu
+         RestoreLastPlayedLevels(&leveldir_current);
+
          if (setup.internal.choose_from_top_leveldir)
            gotoTopLevelDir();
 
@@ -2212,7 +2217,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
        SaveLevelSetup_LastSeries();
        SaveLevelSetup_SeriesInfo();
 
-        if (Request("Do you really want to quit?", REQ_ASK | REQ_STAY_CLOSED))
+       if (!setup.ask_on_quit_program ||
+           Request("Do you really want to quit?", REQ_ASK | REQ_STAY_CLOSED))
          SetGameStatus(GAME_MODE_QUIT);
       }
     }
@@ -4408,9 +4414,8 @@ static void drawChooseTreeText(int y, boolean active, TreeInfo *ti)
   int entry_pos = first_entry + y;
   TreeInfo *node_first = getTreeInfoFirstGroupEntry(ti);
   TreeInfo *node = getTreeInfoFromPos(node_first, entry_pos);
-  int node_color = (node->color == FC_YELLOW ? FC_GREEN : node->color);
-  int color = (active ? FC_YELLOW : node_color);
-  int font_nr = MENU_CHOOSE_TREE_FONT(color);
+  int font_color = MENU_CHOOSE_TREE_COLOR(node, active);
+  int font_nr = MENU_CHOOSE_TREE_FONT(font_color);
   int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
   int xpos = MENU_SCREEN_START_XPOS;
   int ypos = MENU_SCREEN_START_YPOS + y;
@@ -4845,6 +4850,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
            HandleMainMenu_SelectLevel(0, 0, new_level_nr);
          }
+         else if (game_status == GAME_MODE_LEVELS)
+         {
+           // store level set if chosen from "last played level set" menu
+           StoreLastPlayedLevels(leveldir_current);
+         }
          else if (game_status == GAME_MODE_NAMES)
          {
            if (mx >= sx1_edit_name && mx <= sx2_edit_name)
@@ -4869,6 +4879,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
            LoadLevelSetup_LastSeries();
            LoadLevelSetup_SeriesInfo();
 
+           // update list of last played level sets
+           UpdateLastPlayedLevels_TreeInfo();
+
            TapeErase();
 
            ToggleFullscreenIfNeeded();
@@ -5038,6 +5051,12 @@ void DrawHallOfFame(int level_nr, int highlight_position)
   else
     SetAnimStatus(GAME_MODE_PSEUDO_SCORESNEW);
 
+  LoadServerScore(level_nr);
+
+  // correct highlight position after adding server scores
+  if (highlight_position >= 0)
+    highlight_position = scores.last_added;
+
   FadeSetEnterScreen();
 
   FadeOut(fade_mask);
@@ -5056,6 +5075,24 @@ void DrawHallOfFame(int level_nr, int highlight_position)
   FadeIn(fade_mask);
 }
 
+static char *getHallOfFameScoreText(int nr)
+{
+  if (!level.rate_time_over_score)
+    return int2str(scores.entry[nr].score, 5); // show normal score
+
+  if (level.use_step_counter)
+    return int2str(scores.entry[nr].time, 5);  // show number of steps
+
+  static char score_text[10];
+  int time_seconds = scores.entry[nr].time / FRAMES_PER_SECOND;
+  int mm = (time_seconds / 60) % 60;
+  int ss = (time_seconds % 60);
+
+  sprintf(score_text, "%02d:%02d", mm, ss);    // show playing time
+
+  return score_text;
+}
+
 static void drawHallOfFameList(int level_nr, int first_entry,
                               int highlight_position)
 {
@@ -5089,10 +5126,10 @@ static void drawHallOfFameList(int level_nr, int first_entry,
     for (j = 0; j < num_dots; j++)
       DrawText(mSX + dx2 + j * getFontWidth(font_nr3), sy, ".", font_nr3);
 
-    if (!strEqual(highscore[entry].Name, EMPTY_PLAYER_NAME))
-      DrawText(mSX + dx2, sy, highscore[entry].Name, font_nr2);
+    if (!strEqual(scores.entry[entry].name, EMPTY_PLAYER_NAME))
+      DrawText(mSX + dx2, sy, scores.entry[entry].name, font_nr2);
 
-    DrawText(mSX + dx3, sy, int2str(highscore[entry].Score, 5), font_nr4);
+    DrawText(mSX + dx3, sy, getHallOfFameScoreText(entry), font_nr4);
   }
 
   redraw_mask |= REDRAW_FIELD;
@@ -6719,6 +6756,8 @@ static struct TokenInfo setup_info_game[] =
   { TYPE_SWITCH,       &setup.count_score_after_game,"Count Score After Game:" },
   { TYPE_SWITCH,       &setup.show_scores_after_game,"Show Scores After Game:" },
   { TYPE_YES_NO,       &setup.ask_on_game_over, "Ask on Game Over:"    },
+  { TYPE_YES_NO,       &setup.ask_on_quit_game, "Ask on Quit Game:"    },
+  { TYPE_YES_NO,       &setup.ask_on_quit_program, "Ask on Quit Program:" },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record Tapes:"    },
   { TYPE_ENTER_LIST,   execSetupChooseGameSpeed, "Game Speed:"         },
   { TYPE_STRING,       &game_speed_text,       ""                      },