X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=1c5c279e7a3dc54a3ac7b3c62bb30f2cb07b89df;hb=1e00d6434028f18d56ed8025835127c94c7c3a93;hp=7b05d4f1f15ada61f7183fd95a3ecf1bffbee3f7;hpb=0a7528897bf0760431a1cef48d8df33f199569fd;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 7b05d4f1..1c5c279e 100644 --- a/src/screens.c +++ b/src/screens.c @@ -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]; @@ -619,6 +622,8 @@ static int align_yoffset = 0; #define EXTRA_SPACING_SCORES(i) (EXTRA_SPACING_INFO(i)) +#define EXTRA_SPACING_SCOREINFO(i) (menu.extra_spacing[GAME_MODE_SCOREINFO]) + #define DRAW_XOFFSET(s) ((s) == GAME_MODE_INFO ? \ DRAW_XOFFSET_INFO(info_mode) : \ (s) == GAME_MODE_SETUP ? \ @@ -4940,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; @@ -5142,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) { @@ -5169,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); @@ -5561,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); @@ -5769,14 +5784,15 @@ void DrawHallOfFame(int level_nr) DrawChooseTree(&score_entry_current); } -static char *getHallOfFameScoreText(int nr) +static char *getHallOfFameRankText(int nr) { - if (!level.rate_time_over_score) - return int2str(scores.entry[nr].score, 5); // show normal score + boolean forced = (scores.force_last_added && nr == scores.last_added); - if (level.use_step_counter) - return int2str(scores.entry[nr].time, 5); // show number of steps + return (forced ? "???" : int2str(nr + 1, 3)); +} +static char *getHallOfFameTimeText(int nr) +{ static char score_text[10]; int time_seconds = scores.entry[nr].time / FRAMES_PER_SECOND; int mm = (time_seconds / 60) % 60; @@ -5787,9 +5803,19 @@ static char *getHallOfFameScoreText(int nr) return score_text; } +static char *getHallOfFameScoreText(int nr) +{ + if (!level.rate_time_over_score) + return int2str(scores.entry[nr].score, 5); // show normal score + else if (level.use_step_counter) + return int2str(scores.entry[nr].time, 5); // show number of steps + else + return getHallOfFameTimeText(nr); // show playing time +} + 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) @@ -5806,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(); @@ -5830,6 +5857,171 @@ 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; + 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); + + DrawTextSCentered(ystart, font_title, "Score Information:"); + ystart += ystep_title; + + DrawTextF(xstart1, ystart, font_head, "Level Set"); + 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 Name"); + 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, "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"); + 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 @@ -10252,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: