X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=8f893cbfb4c28e149bc037797c23635cf2ae0c14;hb=c30ebbe281e38efaa93409ea8de453c54157f51c;hp=1ecf11a1d6e8900ed5930ab55d07908b78ff3295;hpb=f07148acec44f0cba1897a2088a1fbf651faf77a;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 1ecf11a1..8f893cbf 100644 --- a/src/screens.c +++ b/src/screens.c @@ -268,6 +268,7 @@ static void DrawChoosePlayerName(void); static void DrawChooseLevelSet(void); static void DrawChooseLevelNr(void); static void DrawScoreInfo(int); +static void DrawScoreInfo_Content(int); static void DrawInfoScreen(void); static void DrawSetupScreen(void); static void DrawTypeName(void); @@ -295,13 +296,13 @@ static void MapScreenTreeGadgets(TreeInfo *); static void UnmapScreenTreeGadgets(void); static void UpdateScreenMenuGadgets(int, boolean); +static void AdjustScoreInfoButtons(int, int, int); static boolean OfferUploadTapes(void); 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, int); static char *getHallOfFameScoreText(int, int); @@ -1687,8 +1688,6 @@ void DrawMainMenu(void) // store valid level series information leveldir_last_valid = leveldir_current; - init_last = init; // switch to new busy animation - // needed if last screen (level choice) changed graphics, sounds or music ReloadCustomArtwork(0); @@ -4834,6 +4833,8 @@ static int getAlignYOffsetFromTreeInfo(TreeInfo *ti) static void DrawChooseTree(TreeInfo **ti_ptr) { int fade_mask = REDRAW_FIELD; + boolean restart_music = (game_status != game_status_last_screen && + game_status_last_screen != GAME_MODE_SCOREINFO); if (CheckFadeAll()) fade_mask = REDRAW_ALL; @@ -4859,7 +4860,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr) FreeScreenGadgets(); CreateScreenGadgets(); - if (game_status != game_status_last_screen) + if (restart_music) FadeMenuSoundsAndMusic(); FadeOut(fade_mask); @@ -4890,7 +4891,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr) DrawMaskedBorder(fade_mask); - if (game_status != game_status_last_screen) + if (restart_music) PlayMenuSoundsAndMusic(); FadeIn(fade_mask); @@ -4908,8 +4909,10 @@ static void drawChooseTreeText(TreeInfo *ti, int y, boolean active) { int num_entries = numTreeInfoInGroup(ti); boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN); + boolean scrollbar_always = (game_status == GAME_MODE_SCORES); + boolean scrollbar_keep_space = (scrollbar_needed || scrollbar_always); int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset; - int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE); + int screen_width = (scrollbar_keep_space ? scrollbar_xpos : SXSIZE); int first_entry = ti->cl_first; int entry_pos = first_entry + y; TreeInfo *node_first = getTreeInfoFirstGroupEntry(ti); @@ -5113,8 +5116,13 @@ static void drawChooseTreeScreen_Scores_NotAvailable(void) static TreeInfo *setHallOfFameActiveEntry(TreeInfo **ti_ptr) { + int score_pos = scores.last_added; + + if (game_status_last_screen == GAME_MODE_SCOREINFO) + score_pos = scores.last_entry_nr; + // set current tree entry to last added score entry - *ti_ptr = getTreeInfoFromIdentifier(score_entries, i_to_a(scores.last_added)); + *ti_ptr = getTreeInfoFromIdentifier(score_entries, i_to_a(score_pos)); // if that fails, set current tree entry to first entry (back link) if (*ti_ptr == NULL) @@ -5709,6 +5717,9 @@ void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button) static void DrawHallOfFame_setScoreEntries(void) { + int max_empty_entries = 10; // at least show "top ten" list, if empty + int max_visible_entries = NUM_MENU_ENTRIES_ON_SCREEN - 1; // w/o back link + int min_score_entries = MIN(max_empty_entries, max_visible_entries); int score_pos = (scores.last_added >= 0 ? scores.last_added : 0); int i; @@ -5721,9 +5732,10 @@ static void DrawHallOfFame_setScoreEntries(void) for (i = 0; i < MAX_SCORE_ENTRIES; i++) { - // do not add empty score entries + // do not add empty score entries if off-screen if (scores.entry[i].score == 0 && - scores.entry[i].time == 0) + scores.entry[i].time == 0 && + i >= min_score_entries) break; TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_SCORE_ENTRY); @@ -5836,22 +5848,30 @@ static void HandleHallOfFame_SelectLevel(int step, int direction) PlaySound(SND_MENU_ITEM_SELECTING); scores.last_level_nr = level_nr = new_level_nr; + scores.last_entry_nr = 0; LoadLevel(level_nr); LoadLocalAndServerScore(level_nr, TRUE); DrawHallOfFame_setScoreEntries(); - // force remapping optional gadgets (especially scroll bar) - UnmapScreenTreeGadgets(); + if (game_status == GAME_MODE_SCORES) + { + // force remapping optional gadgets (especially scroll bar) + UnmapScreenTreeGadgets(); - // redraw complete high score screen, as sub-title has changed - ClearField(); + // redraw complete high score screen, as sub-title has changed + ClearField(); - // redraw level selection buttons (which have just been erased) - RedrawScreenMenuGadgets(SCREEN_MASK_SCORES); + // redraw level selection buttons (which have just been erased) + RedrawScreenMenuGadgets(SCREEN_MASK_SCORES); - HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, &score_entry_current); + HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, &score_entry_current); + } + else + { + DrawScoreInfo_Content(scores.last_entry_nr); + } SaveLevelSetup_SeriesInfo(); } @@ -5881,6 +5901,8 @@ static void DrawScoreInfo_Content(int entry_nr) int ybottom = mSY - SY + SYSIZE - menu.bottom_spacing[GAME_MODE_SCOREINFO]; int xstart1 = mSX - SX + 2 * xstep; int xstart2 = mSX - SX + 13 * xstep; + int button_x = SX + xstart1; + int button_y1, button_y2; int font_width = getFontWidth(font_text); int font_height = getFontHeight(font_text); int pad_left = xstart2; @@ -5894,6 +5916,13 @@ static void DrawScoreInfo_Content(int entry_nr) // redraw score selection buttons (which have just been erased) RedrawScreenMenuGadgets(SCREEN_MASK_SCORES); + if (score_entries == NULL) + { + drawChooseTreeScreen_Scores_NotAvailable(); + + return; + } + drawChooseTreeHead(score_entries); drawChooseTreeInfo(score_entries); @@ -5912,6 +5941,9 @@ static void DrawScoreInfo_Content(int entry_nr) TRUE, FALSE, FALSE); ystart += ystep_para + (lines > 0 ? lines - 1 : 0) * font_height; + button_y1 = SY + ystart; + ystart += graphic_info[IMG_MENU_BUTTON_PREV_SCORE].height; + DrawTextF(xstart1, ystart, font_head, "Rank"); DrawTextF(xstart2, ystart, font_text, pos_text); ystart += ystep_line; @@ -5960,7 +5992,11 @@ static void DrawScoreInfo_Content(int entry_nr) TRUE, FALSE, FALSE); ystart += ystep_line; + button_y2 = SY + ystart; + DrawTextSCentered(ybottom, font_foot, "Press any key or button to go back"); + + AdjustScoreInfoButtons(button_x, button_y1, button_y2); } static void DrawScoreInfo(int entry_nr) @@ -5973,11 +6009,11 @@ static void DrawScoreInfo(int entry_nr) FadeOut(REDRAW_FIELD); - // map gadgets for score info screen - MapScreenMenuGadgets(SCREEN_MASK_SCORES); - DrawScoreInfo_Content(entry_nr); + // map gadgets for score info screen + MapScreenMenuGadgets(SCREEN_MASK_SCORES_INFO); + FadeIn(REDRAW_FIELD); } @@ -6007,6 +6043,18 @@ void HandleScoreInfo(int mx, int my, int dx, int dy, int button) boolean button_is_valid = (mx >= 0 && my >= 0); boolean button_screen_clicked = (button_action && button_is_valid); + if (server_scores.updated) + { + // reload scores, using updated server score cache file + LoadLocalAndServerScore(scores.last_level_nr, FALSE); + + server_scores.updated = FALSE; + + DrawHallOfFame_setScoreEntries(); + + DrawScoreInfo_Content(scores.last_entry_nr); + } + if (button_screen_clicked) { PlaySound(SND_MENU_ITEM_SELECTING); @@ -6015,18 +6063,14 @@ void HandleScoreInfo(int mx, int my, int dx, int dy, int button) DrawHallOfFame(level_nr); } - else if (dx || dy) + else if (dx) { - HandleScoreInfo_SelectScore(1, SIGN(dx ? dx : dy)); + HandleHallOfFame_SelectLevel(1, SIGN(dx) * (ABS(dx) > 1 ? 10 : 1)); + } + else if (dy) + { + HandleScoreInfo_SelectScore(1, SIGN(dy) * (ABS(dy) > 1 ? 10 : 1)); } -} - -static void HandleHallOfFame_SelectLevelOrScore(int step, int direction) -{ - if (game_status == GAME_MODE_SCORES) - HandleHallOfFame_SelectLevel(step, direction); - else - HandleScoreInfo_SelectScore(step, direction); } @@ -10449,6 +10493,20 @@ static void UnmapScreenTreeGadgets(void) UnmapScreenGadgets(); } +static void AdjustScoreInfoButtons(int x, int y1, int y2) +{ + struct GadgetInfo *gi_1 = screen_gadget[SCREEN_CTRL_ID_PREV_SCORE]; + struct GadgetInfo *gi_2 = screen_gadget[SCREEN_CTRL_ID_NEXT_SCORE]; + struct MenuPosInfo *pos_1 = menubutton_info[SCREEN_CTRL_ID_PREV_SCORE].pos; + struct MenuPosInfo *pos_2 = menubutton_info[SCREEN_CTRL_ID_NEXT_SCORE].pos; + + if (pos_1->x == -1 && pos_1->y == -1) + ModifyGadget(gi_1, GDI_X, x, GDI_Y, y1, GDI_END); + + if (pos_2->x == -1 && pos_2->y == -1) + ModifyGadget(gi_2, GDI_X, x, GDI_Y, y2, GDI_END); +} + static void HandleScreenGadgets(struct GadgetInfo *gi) { int id = gi->custom_id; @@ -10468,11 +10526,19 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) break; case SCREEN_CTRL_ID_PREV_LEVEL2: - HandleHallOfFame_SelectLevelOrScore(step, -1); + HandleHallOfFame_SelectLevel(step, -1); break; case SCREEN_CTRL_ID_NEXT_LEVEL2: - HandleHallOfFame_SelectLevelOrScore(step, +1); + HandleHallOfFame_SelectLevel(step, +1); + break; + + case SCREEN_CTRL_ID_PREV_SCORE: + HandleScoreInfo_SelectScore(step, -1); + break; + + case SCREEN_CTRL_ID_NEXT_SCORE: + HandleScoreInfo_SelectScore(step, +1); break; case SCREEN_CTRL_ID_FIRST_LEVEL: