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);
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];
#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 ? \
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;
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)
{
{
drawChooseTreeScreen_Scores_NotAvailable();
}
- else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE)
+ else if (button_screen_clicked)
{
PlaySound(SND_MENU_ITEM_SELECTING);
level.random_seed);
return;
}
+ else
+ {
+ SetGameStatus(GAME_MODE_SCOREINFO);
+
+ DrawScoreInfo(node_cursor->pos);
+
+ return;
+ }
}
SetGameStatus(GAME_MODE_MAIN);
DrawChooseTree(&score_entry_current);
}
+static char *getHallOfFameRankText(int nr)
+{
+ boolean forced = (scores.force_last_added && nr == scores.last_added);
+
+ return (forced ? "???" : int2str(nr + 1, 3));
+}
+
static char *getHallOfFameTimeText(int nr)
{
static char score_text[10];
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)
scores.last_level_nr = level_nr = new_level_nr;
+ LoadLevel(level_nr);
LoadLocalAndServerScore(level_nr, TRUE);
DrawHallOfFame_setScoreEntries();
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
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: