X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=83b91dc477a2e142239b70aae7a7e4ccbf8b5422;hb=a4e95e0a6d4b53732ea0a585be0b6df55ae41e42;hp=d86fa57267864ca83e626f6917683fddb8966c8a;hpb=e4b2e4f943c20af98956d30fd3014888e9f75416;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index d86fa572..83b91dc4 100644 --- a/src/screens.c +++ b/src/screens.c @@ -2172,7 +2172,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) SetGameStatus(GAME_MODE_SCORES); - DrawHallOfFame(level_nr, -1); + DrawHallOfFame(level_nr); } else if (pos == MAIN_CONTROL_EDITOR) { @@ -5029,7 +5029,7 @@ void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &level_number_current); } -void DrawHallOfFame(int level_nr, int highlight_position) +void DrawHallOfFame(int level_nr) { int fade_mask = REDRAW_FIELD; @@ -5046,16 +5046,10 @@ void DrawHallOfFame(int level_nr, int highlight_position) SetDrawDeactivationMask(REDRAW_NONE); SetDrawBackgroundMask(REDRAW_FIELD); - if (highlight_position < 0) - LoadScore(level_nr); - else - SetAnimStatus(GAME_MODE_PSEUDO_SCORESNEW); - - LoadServerScore(level_nr); + LoadLocalAndServerScore(level_nr, TRUE); - // correct highlight position after adding server scores - if (highlight_position >= 0) - highlight_position = scores.last_added; + if (scores.last_added >= 0) + SetAnimStatus(GAME_MODE_PSEUDO_SCORESNEW); FadeSetEnterScreen(); @@ -5068,13 +5062,28 @@ void DrawHallOfFame(int level_nr, int highlight_position) OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - HandleHallOfFame(level_nr, highlight_position, 0, 0, MB_MENU_INITIALIZE); + HandleHallOfFame(level_nr, 0, 0, 0, MB_MENU_INITIALIZE); DrawMaskedBorder(fade_mask); FadeIn(fade_mask); } +static int getHallOfFameFirstEntry(int first_entry, int step) +{ + if (step == 0) + first_entry = scores.last_added - (NUM_MENU_ENTRIES_ON_SCREEN + 1) / 2 + 1; + else + first_entry += step; + + if (first_entry < 0) + first_entry = 0; + else if (first_entry > MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN) + first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN); + + return first_entry; +} + static char *getHallOfFameScoreText(int nr) { if (!level.rate_time_over_score) @@ -5093,8 +5102,7 @@ static char *getHallOfFameScoreText(int nr) return score_text; } -static void drawHallOfFameList(int level_nr, int first_entry, - int highlight_position) +static void drawHallOfFameList(int level_nr, int first_entry) { int i, j; @@ -5108,7 +5116,8 @@ static void drawHallOfFameList(int level_nr, int first_entry, for (i = 0; i < NUM_MENU_ENTRIES_ON_SCREEN; i++) { int entry = first_entry + i; - boolean active = (entry == highlight_position); + boolean active = (entry == scores.last_added); + boolean forced = (scores.force_last_added && active); int font_nr1 = (active ? FONT_TEXT_1_ACTIVE : FONT_TEXT_1); int font_nr2 = (active ? FONT_TEXT_2_ACTIVE : FONT_TEXT_2); int font_nr3 = (active ? FONT_TEXT_3_ACTIVE : FONT_TEXT_3); @@ -5119,8 +5128,9 @@ static void drawHallOfFameList(int level_nr, int first_entry, int dx3 = SXSIZE - 2 * (mSX - SX + dxoff) - 5 * getFontWidth(font_nr4); int num_dots = (dx3 - dx2) / getFontWidth(font_nr3); int sy = mSY + 64 + i * 32; + char *pos_text = (forced ? "???" : int2str(entry + 1, 3)); - DrawText(mSX, sy, int2str(entry + 1, 3), font_nr1); + DrawText(mSX, sy, pos_text, font_nr1); DrawText(mSX + dx1, sy, ".", font_nr1); for (j = 0; j < num_dots; j++) @@ -5139,22 +5149,23 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) { static int level_nr = 0; static int first_entry = 0; - static int highlight_position = 0; int step = (button == 1 ? 1 : button == 2 ? 5 : 10); if (button == MB_MENU_INITIALIZE) { level_nr = mx; - highlight_position = my; - first_entry = highlight_position - (NUM_MENU_ENTRIES_ON_SCREEN + 1) / 2 + 1; + if (server_scores.updated) + { + // reload scores, using updated server score cache file + LoadLocalAndServerScore(level_nr, FALSE); + + server_scores.updated = FALSE; + } - if (first_entry < 0) - first_entry = 0; - else if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES) - first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN); + first_entry = getHallOfFameFirstEntry(0, 0); - drawHallOfFameList(level_nr, first_entry, highlight_position); + drawHallOfFameList(level_nr, first_entry); return; } @@ -5164,25 +5175,15 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) if (dy < 0) { - if (first_entry > 0) - { - first_entry -= step; - if (first_entry < 0) - first_entry = 0; + first_entry = getHallOfFameFirstEntry(first_entry, -step); - drawHallOfFameList(level_nr, first_entry, highlight_position); - } + drawHallOfFameList(level_nr, first_entry); } else if (dy > 0) { - if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN < MAX_SCORE_ENTRIES) - { - first_entry += step; - if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES) - first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN); + first_entry = getHallOfFameFirstEntry(first_entry, step); - drawHallOfFameList(level_nr, first_entry, highlight_position); - } + drawHallOfFameList(level_nr, first_entry); } else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE) { @@ -5205,6 +5206,17 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) DrawMainMenu(); } } + else if (server_scores.updated) + { + // reload scores, using updated server score cache file + LoadLocalAndServerScore(level_nr, FALSE); + + server_scores.updated = FALSE; + + first_entry = getHallOfFameFirstEntry(0, 0); + + drawHallOfFameList(level_nr, first_entry); + } if (game_status == GAME_MODE_SCORES) PlayMenuSoundIfLoop(); @@ -6746,6 +6758,8 @@ static struct TokenInfo setup_info_game[] = { TYPE_PLAYER, &setup.network_player_nr,"Preferred Network Player:" }, { TYPE_TEXT_INPUT, execGadgetNetworkServer, "Network Server Hostname:" }, { TYPE_STRING, &network_server_text, "" }, + { TYPE_SWITCH, &setup.api_server, "Use Highscore Server:" }, + { TYPE_SWITCH, &setup.only_show_local_scores, "Only Show Local Scores:" }, { TYPE_SWITCH, &setup.multiple_users, "Multiple Users/Teams:" }, { TYPE_YES_NO, &setup.input_on_focus, "Only Move Focussed Player:" }, { TYPE_SWITCH, &setup.time_limit, "Time Limit:" }, @@ -7347,6 +7361,10 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx) if (si->value == &setup.network_mode) ToggleNetworkModeIfNeeded(); + // API server mode may have changed at this point + if (si->value == &setup.api_server) + runtime.api_server = setup.api_server; + // game speed list may have changed at this point if (si->value == &setup.game_speed_extended) ToggleGameSpeedsListIfNeeded();