X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=1d56c24c5aef821cd0160f9680b1e5ae8abb22d6;hb=f0cd1ce79db6ad0c0c758142c3305a80acc9fcc6;hp=add4eb564186fd89d69ce84ba846e27eb8818029;hpb=abcfcce484c40387a5df78ca91c58e823d01f534;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index add4eb56..1d56c24c 100644 --- a/src/screens.c +++ b/src/screens.c @@ -296,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, int); static char *getHallOfFameScoreText(int); static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; @@ -4930,29 +4932,24 @@ static void drawChooseTreeText(TreeInfo *ti, int y, boolean active) int font_size_1 = getFontWidth(font_nr1); int font_size_3 = getFontWidth(font_nr3); int font_size_4 = getFontWidth(font_nr4); - int text_size_1 = 3 * font_size_1; + int text_size_1 = 4 * font_size_1; int text_size_4 = 5 * font_size_4; int border = amSX - SX + getFontDrawOffsetX(font_nr1); int dx1 = 0; - int dx2 = text_size_1; - int dx3 = dx2 + font_size_1; + int dx3 = text_size_1; int dx4 = screen_width - startdx - 2 * border - text_size_4; int num_dots = (dx4 - dx3) / font_size_3; int startx1 = startx + dx1; - int startx2 = startx + dx2; 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 *dot_text = "."; + char *pos_text = getHallOfFameRankText(pos, 3); int i; DrawText(startx1, starty, pos_text, font_nr1); - DrawText(startx2, starty, dot_text, font_nr1); for (i = 0; i < num_dots; i++) - DrawText(startx3 + i * font_size_3, starty, dot_text, font_nr3); + DrawText(startx3 + i * font_size_3, starty, ".", font_nr3); if (!strEqual(scores.entry[pos].name, EMPTY_PLAYER_NAME)) DrawText(startx3, starty, scores.entry[pos].name, font_nr2); @@ -5783,6 +5780,17 @@ void DrawHallOfFame(int level_nr) DrawChooseTree(&score_entry_current); } +static char *getHallOfFameRankText(int nr, int size) +{ + static char rank_text[10]; + boolean forced = (scores.force_last_added && nr == scores.last_added); + char *rank_text_raw = (forced ? "???" : int2str(nr + 1, size)); + + sprintf(rank_text, "%s%s", rank_text_raw, (size > 0 || !forced ? "." : "")); + + return rank_text; +} + static char *getHallOfFameTimeText(int nr) { static char score_text[10]; @@ -5824,6 +5832,7 @@ static void HandleHallOfFame_SelectLevel(int step, int direction) scores.last_level_nr = level_nr = new_level_nr; + LoadLevel(level_nr); LoadLocalAndServerScore(level_nr, TRUE); DrawHallOfFame_setScoreEntries(); @@ -5848,9 +5857,10 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &score_entry_current); } -static void DrawScoreInfo(int entry_nr) +static void DrawScoreInfo_Content(int entry_nr) { struct ScoreEntry *entry = &scores.entry[entry_nr]; + char *pos_text = getHallOfFameRankText(entry_nr, 0); int font_title = MENU_INFO_FONT_TITLE; int font_head = MENU_INFO_FONT_HEAD; int font_text = MENU_INFO_FONT_TEXT; @@ -5865,16 +5875,20 @@ static void DrawScoreInfo(int entry_nr) 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; - - SetMainBackgroundImageIfDefined(IMG_BACKGROUND_SCOREINFO); - - UnmapAllGadgets(); - - FadeOut(REDRAW_FIELD); + int xstart2 = mSX - SX + 13 * xstep; + int font_width = getFontWidth(font_text); + int font_height = getFontHeight(font_text); + int pad_left = xstart2; + int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT; + int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width; + int max_lines_per_text = 5; + int lines; ClearField(); + // redraw score selection buttons (which have just been erased) + RedrawScreenMenuGadgets(SCREEN_MASK_SCORES); + drawChooseTreeHead(score_entries); drawChooseTreeInfo(score_entries); @@ -5882,17 +5896,43 @@ static void DrawScoreInfo(int entry_nr) ystart += ystep_title; DrawTextF(xstart1, ystart, font_head, "Level Set"); - DrawTextF(xstart2, ystart, font_text, leveldir_current->name); + lines = DrawTextBufferS(xstart2, ystart, leveldir_current->name, font_text, + max_chars_per_line, -1, max_lines_per_text, 0, -1, + TRUE, FALSE, FALSE); + ystart += ystep_line + (lines > 0 ? lines - 1 : 0) * font_height; + + DrawTextF(xstart1, ystart, font_head, "Level"); + lines = DrawTextBufferS(xstart2, ystart, level.name, font_text, + max_chars_per_line, -1, max_lines_per_text, 0, -1, + TRUE, FALSE, FALSE); + ystart += ystep_para + (lines > 0 ? lines - 1 : 0) * font_height; + + DrawTextF(xstart1, ystart, font_head, "Rank"); + DrawTextF(xstart2, ystart, font_text, pos_text); 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, "Player"); DrawTextF(xstart2, ystart, font_text, entry->name); ystart += ystep_line; + DrawTextF(xstart1, ystart, font_head, "Platform"); + DrawTextF(xstart2, ystart, font_text, entry->platform); + ystart += ystep_line; + + DrawTextF(xstart1, ystart, font_head, "Version"); + DrawTextF(xstart2, ystart, font_text, entry->version); + ystart += ystep_line; + + DrawTextF(xstart1, ystart, font_head, "Country"); + lines = DrawTextBufferS(xstart2, ystart, entry->country_name, font_text, + max_chars_per_line, -1, max_lines_per_text, 0, -1, + TRUE, FALSE, FALSE); + ystart += ystep_line + (lines > 0 ? lines - 1 : 0) * font_height; + + DrawTextF(xstart1, ystart, font_head, "Tape Date"); + DrawTextF(xstart2, ystart, font_text, entry->tape_date); + ystart += ystep_line; + if (level.use_step_counter) { DrawTextF(xstart1, ystart, font_head, "Steps"); @@ -5914,13 +5954,53 @@ static void DrawScoreInfo(int entry_nr) } 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) { - if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE) + 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); @@ -5928,6 +6008,18 @@ void HandleScoreInfo(int mx, int my, int dx, int dy, int button) 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); } @@ -10352,11 +10444,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: