static void ModifyGameSpeedIfNeeded(void);
static void DisableVsyncIfNeeded(void);
+static void RedrawScreenMenuGadgets(int);
static void MapScreenMenuGadgets(int);
static void UnmapScreenMenuGadgets(int);
static void MapScreenGadgets(int);
+static void UnmapScreenGadgets(void);
static void MapScreenTreeGadgets(TreeInfo *);
+static void UnmapScreenTreeGadgets(void);
static void UpdateScreenMenuGadgets(int, boolean);
static boolean OfferUploadTapes(void);
static void execOfferUploadTapes(void);
+static void DrawHallOfFame_setScoreEntries(void);
static char *getHallOfFameScoreText(int);
static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
menu.extra_spacing[GAME_MODE_SETUP] : \
menu.extra_spacing_setup[DRAW_MODE_SETUP(i)])
+#define EXTRA_SPACING_SCORES(i) (EXTRA_SPACING_INFO(i))
+
#define DRAW_XOFFSET(s) ((s) == GAME_MODE_INFO ? \
DRAW_XOFFSET_INFO(info_mode) : \
(s) == GAME_MODE_SETUP ? \
EXTRA_SPACING_INFO(info_mode) : \
(s) == GAME_MODE_SETUP ? \
EXTRA_SPACING_SETUP(setup_mode) : \
+ (s) == GAME_MODE_SCORES ? \
+ EXTRA_SPACING_SCORES(info_mode) : \
menu.extra_spacing[DRAW_MODE(s)])
#define mSX (SX + DRAW_XOFFSET(game_status))
GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
}
-static void AdjustChooseTreeScrollbar(int id, int first_entry, TreeInfo *ti)
+static void AdjustChooseTreeScrollbar(TreeInfo *ti, int id)
{
AdjustScrollbar(id, numTreeInfoInGroup(ti), NUM_MENU_ENTRIES_ON_SCREEN,
- first_entry);
+ ti->cl_first);
}
static void clearMenuListArea(void)
return MENU_CHOOSE_TREE_FONT(MENU_CHOOSE_TREE_COLOR(node, active));
}
-static void drawChooseTreeText(int y, boolean active, TreeInfo *ti)
+static void drawChooseTreeText(TreeInfo *ti, int y, boolean active)
{
int num_entries = numTreeInfoInGroup(ti);
boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN);
drawChooseTreeHeadExt(ti->type, ti->infotext);
}
-static void drawChooseTreeList(int first_entry, int num_page_entries,
- TreeInfo *ti)
+static void drawChooseTreeList(TreeInfo *ti)
{
+ int first_entry = ti->cl_first;
+ int num_entries = numTreeInfoInGroup(ti);
+ int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
int i;
clearMenuListArea();
node_first = getTreeInfoFirstGroupEntry(ti);
node = getTreeInfoFromPos(node_first, entry_pos);
- drawChooseTreeText(i, FALSE, ti);
+ drawChooseTreeText(ti, i, FALSE);
if (node->parent_link)
initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU);
redraw_mask |= REDRAW_FIELD;
}
-static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
+static void drawChooseTreeInfo(TreeInfo *ti)
{
- TreeInfo *node, *node_first;
- int x, last_redraw_mask = redraw_mask;
+ int entry_pos = ti->cl_first + ti->cl_cursor;
+ int last_redraw_mask = redraw_mask;
int ypos = MENU_TITLE2_YPOS;
int font_nr = FONT_TITLE_2;
+ int x;
if (ti->type == TREE_TYPE_LEVEL_NR)
DrawTextFCentered(ypos, font_nr, leveldir_current->name);
if (ti->type != TREE_TYPE_LEVEL_DIR)
return;
- node_first = getTreeInfoFirstGroupEntry(ti);
- node = getTreeInfoFromPos(node_first, entry_pos);
+ TreeInfo *node_first = getTreeInfoFirstGroupEntry(ti);
+ TreeInfo *node = getTreeInfoFromPos(node_first, entry_pos);
DrawBackgroundForFont(SX, SY + ypos, SXSIZE, getFontHeight(font_nr), font_nr);
MarkTileDirty(x, 1);
}
-static void drawChooseTreeCursorAndText(int y, boolean active, TreeInfo *ti)
+static void drawChooseTreeCursorAndText(TreeInfo *ti, boolean active)
{
- drawChooseTreeCursor(y, active);
- drawChooseTreeText(y, active, ti);
+ drawChooseTreeCursor(ti->cl_cursor, active);
+ drawChooseTreeText(ti, ti->cl_cursor, active);
}
static void drawChooseTreeScreen(TreeInfo *ti)
{
- int num_entries = numTreeInfoInGroup(ti);
- int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
-
drawChooseTreeHead(ti);
- drawChooseTreeList(ti->cl_first, num_page_entries, ti);
- drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
- drawChooseTreeCursorAndText(ti->cl_cursor, TRUE, ti);
+ drawChooseTreeList(ti);
+ drawChooseTreeInfo(ti);
+ drawChooseTreeCursorAndText(ti, TRUE);
+
+ AdjustChooseTreeScrollbar(ti, SCREEN_CTRL_ID_SCROLL_VERTICAL);
- AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, ti->cl_first, ti);
+ // scroll bar and buttons may just have been added after reloading scores
+ if (game_status == GAME_MODE_SCORES)
+ MapScreenTreeGadgets(ti);
+}
+
+static void drawChooseTreeScreen_Scores_NotAvailable(void)
+{
+ // dirty workaround to use spacing definitions from info screen
+ info_mode = INFO_MODE_TITLE;
+
+ char *text_info = "HighScores of Level %d";
+ char *text_title = "Score information:";
+ char *text_error = "No scores for this level.";
+ char *text_foot = "Press any key or button for main menu";
+ int font_info = FONT_TITLE_2;
+ int font_title = FONT_INITIAL_3;
+ int font_error = FONT_INITIAL_4;
+ int font_foot = FONT_INITIAL_2;
+ int spacing_title = menu.headline1_spacing_info[INFO_MODE_TITLE];
+ int ystep_title = getMenuTextStep(spacing_title, font_title);
+ int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+ int ystart2 = ystart1 + ystep_title;
+ int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
+ int ystart0 = MENU_TITLE2_YPOS;
+
+ drawChooseTreeHeadExt(TREE_TYPE_SCORE_ENTRY, INFOTEXT_SCORE_ENTRY);
+ DrawTextFCentered(ystart0, font_info, text_info, scores.last_level_nr);
+
+ DrawTextSCentered(ystart1, font_title, text_title);
+ DrawTextSCentered(ystart2, font_error, text_error);
+
+ DrawTextSCentered(ybottom, font_foot, text_foot);
}
static TreeInfo *setHallOfFameActiveEntry(TreeInfo **ti_ptr)
server_scores.updated = FALSE;
+ DrawHallOfFame_setScoreEntries();
+
+ ti = setHallOfFameActiveEntry(ti_ptr);
+
if (button != MB_MENU_INITIALIZE)
+ drawChooseTreeScreen(ti);
+ }
+
+ if (score_entries == NULL)
+ {
+ if (button == MB_MENU_INITIALIZE)
+ {
+ drawChooseTreeScreen_Scores_NotAvailable();
+ }
+ else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE)
{
- ti = setHallOfFameActiveEntry(ti_ptr);
+ PlaySound(SND_MENU_ITEM_SELECTING);
- drawChooseTreeScreen(ti);
+ SetGameStatus(GAME_MODE_MAIN);
+
+ DrawMainMenu();
}
+
+ return;
}
}
{
PlaySound(SND_MENU_ITEM_ACTIVATING);
- drawChooseTreeCursorAndText(ti->cl_cursor, FALSE, ti);
- drawChooseTreeCursorAndText(y, TRUE, ti);
- drawChooseTreeInfo(ti->cl_first + y, ti);
+ drawChooseTreeCursorAndText(ti, FALSE);
ti->cl_cursor = y;
+
+ drawChooseTreeCursorAndText(ti, TRUE);
+
+ drawChooseTreeInfo(ti);
}
else if (dx < 0)
{
for (i = 0; i < MAX_SCORE_ENTRIES; i++)
{
+ // do not add empty score entries
+ if (scores.entry[i].score == 0 &&
+ scores.entry[i].time == 0)
+ break;
+
TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_SCORE_ENTRY);
char identifier[32], name[64];
int value = i;
// if that fails, set current score entry to first valid score entry
if (score_entry_current == NULL)
score_entry_current = getFirstValidTreeInfoEntry(score_entries);
+
+ // ("score_entries" and "score_entry_current" may be NULL here)
}
void DrawHallOfFame(int level_nr)
FreeGadget(screen_gadget[i]);
}
+static void RedrawScreenMenuGadgets(int screen_mask)
+{
+ int i;
+
+ for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++)
+ if (screen_mask & menubutton_info[i].screen_mask)
+ RedrawGadget(screen_gadget[menubutton_info[i].gadget_id]);
+}
+
static void MapScreenMenuGadgets(int screen_mask)
{
int i;
MapGadget(screen_gadget[scrollbar_info[i].gadget_id]);
}
+static void UnmapScreenGadgets()
+{
+ int i;
+
+ for (i = 0; i < NUM_SCREEN_SCROLLBUTTONS; i++)
+ UnmapGadget(screen_gadget[scrollbutton_info[i].gadget_id]);
+
+ for (i = 0; i < NUM_SCREEN_SCROLLBARS; i++)
+ UnmapGadget(screen_gadget[scrollbar_info[i].gadget_id]);
+}
+
static void MapScreenTreeGadgets(TreeInfo *ti)
{
MapScreenGadgets(numTreeInfoInGroup(ti));
}
+static void UnmapScreenTreeGadgets(void)
+{
+ UnmapScreenGadgets();
+}
+
static void HandleScreenGadgets(struct GadgetInfo *gi)
{
int id = gi->custom_id;