X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=f07f7030225691b21e273f4c1a1fdb23e5c0c691;hb=9a038e0ab575eb3556118e88158e5a5a4a977eec;hp=de1c498f3535df62e0317d2965ddc8d1503985e4;hpb=7530e229728f4d1ea54ab8e4393029f34a4a2618;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index de1c498f..f07f7030 100644 --- a/src/screens.c +++ b/src/screens.c @@ -184,26 +184,28 @@ // screen gadget identifiers #define SCREEN_CTRL_ID_PREV_LEVEL 0 #define SCREEN_CTRL_ID_NEXT_LEVEL 1 -#define SCREEN_CTRL_ID_FIRST_LEVEL 2 -#define SCREEN_CTRL_ID_LAST_LEVEL 3 -#define SCREEN_CTRL_ID_LEVEL_NUMBER 4 -#define SCREEN_CTRL_ID_PREV_PLAYER 5 -#define SCREEN_CTRL_ID_NEXT_PLAYER 6 -#define SCREEN_CTRL_ID_INSERT_SOLUTION 7 -#define SCREEN_CTRL_ID_PLAY_SOLUTION 8 -#define SCREEN_CTRL_ID_SWITCH_ECS_AGA 9 -#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 10 -#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 11 -#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2 12 -#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2 13 -#define SCREEN_CTRL_ID_SCROLL_UP 14 -#define SCREEN_CTRL_ID_SCROLL_DOWN 15 -#define SCREEN_CTRL_ID_SCROLL_VERTICAL 16 -#define SCREEN_CTRL_ID_NETWORK_SERVER 17 - -#define NUM_SCREEN_GADGETS 18 - -#define NUM_SCREEN_MENUBUTTONS 14 +#define SCREEN_CTRL_ID_PREV_LEVEL2 2 +#define SCREEN_CTRL_ID_NEXT_LEVEL2 3 +#define SCREEN_CTRL_ID_FIRST_LEVEL 4 +#define SCREEN_CTRL_ID_LAST_LEVEL 5 +#define SCREEN_CTRL_ID_LEVEL_NUMBER 6 +#define SCREEN_CTRL_ID_PREV_PLAYER 7 +#define SCREEN_CTRL_ID_NEXT_PLAYER 8 +#define SCREEN_CTRL_ID_INSERT_SOLUTION 9 +#define SCREEN_CTRL_ID_PLAY_SOLUTION 10 +#define SCREEN_CTRL_ID_SWITCH_ECS_AGA 11 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 12 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 13 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2 14 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2 15 +#define SCREEN_CTRL_ID_SCROLL_UP 16 +#define SCREEN_CTRL_ID_SCROLL_DOWN 17 +#define SCREEN_CTRL_ID_SCROLL_VERTICAL 18 +#define SCREEN_CTRL_ID_NETWORK_SERVER 19 + +#define NUM_SCREEN_GADGETS 20 + +#define NUM_SCREEN_MENUBUTTONS 16 #define NUM_SCREEN_SCROLLBUTTONS 2 #define NUM_SCREEN_SCROLLBARS 1 #define NUM_SCREEN_TEXTINPUT 1 @@ -213,6 +215,7 @@ #define SCREEN_MASK_INPUT (1 << 2) #define SCREEN_MASK_TOUCH (1 << 3) #define SCREEN_MASK_TOUCH2 (1 << 4) +#define SCREEN_MASK_SCORES (1 << 5) // graphic position and size values for buttons and scrollbars #define SC_MENUBUTTON_XSIZE TILEX @@ -259,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); @@ -277,16 +281,21 @@ static void HandleInfoScreen_Version(int); 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 void HandleHallOfFame_SelectLevel(int, int); static char *getHallOfFameScoreText(int); static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; @@ -609,6 +618,10 @@ static int align_yoffset = 0; menu.extra_spacing[GAME_MODE_SETUP] : \ menu.extra_spacing_setup[DRAW_MODE_SETUP(i)]) +#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 ? \ @@ -623,6 +636,8 @@ static int align_yoffset = 0; 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)) @@ -1398,10 +1413,10 @@ static void AdjustScrollbar(int id, int items_max, int items_visible, 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) @@ -4858,7 +4873,12 @@ static void DrawChooseTree(TreeInfo **ti_ptr) OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); + // map gadgets for high score screen + if (game_status == GAME_MODE_SCORES) + MapScreenMenuGadgets(SCREEN_MASK_SCORES); + MapScreenTreeGadgets(*ti_ptr); + HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, ti_ptr); DrawMaskedBorder(fade_mask); @@ -4877,7 +4897,7 @@ static int getChooseTreeFont(TreeInfo *node, boolean active) 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); @@ -4964,9 +4984,11 @@ static void drawChooseTreeHead(TreeInfo *ti) 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(); @@ -4979,7 +5001,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, 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); @@ -4998,12 +5020,13 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, 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); @@ -5015,8 +5038,8 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) 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); @@ -5037,23 +5060,53 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) 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); + + // 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); - AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, ti->cl_first, ti); + DrawTextSCentered(ystart1, font_title, text_title); + DrawTextSCentered(ystart2, font_error, text_error); + + DrawTextSCentered(ybottom, font_foot, text_foot); } static TreeInfo *setHallOfFameActiveEntry(TreeInfo **ti_ptr) @@ -5093,6 +5146,45 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN); boolean position_set_by_scrollbar = (dx == 999); + if (game_status == GAME_MODE_SCORES) + { + if (server_scores.updated) + { + // reload scores, using updated server score cache file + LoadLocalAndServerScore(scores.last_level_nr, FALSE); + + server_scores.updated = FALSE; + + DrawHallOfFame_setScoreEntries(); + + if (score_entries != NULL) + { + 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) + { + PlaySound(SND_MENU_ITEM_SELECTING); + + SetGameStatus(GAME_MODE_MAIN); + + DrawMainMenu(); + } + + return; + } + } + if (button == MB_MENU_INITIALIZE) { int num_entries = numTreeInfoInGroup(ti); @@ -5103,14 +5195,6 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (game_status == GAME_MODE_SCORES) { - if (server_scores.updated) - { - // reload scores, using updated server score cache file - LoadLocalAndServerScore(scores.last_level_nr, FALSE); - - server_scores.updated = FALSE; - } - ti = setHallOfFameActiveEntry(ti_ptr); } else if (ti->cl_first == -1) @@ -5250,7 +5334,13 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, y = ti->cl_cursor + dy; } - if (dx == 1) + if (game_status == GAME_MODE_SCORES && ABS(dx) == 1) + { + HandleHallOfFame_SelectLevel(1, dx); + + return; + } + else if (dx == 1) { TreeInfo *node_first, *node_cursor; int entry_pos = ti->cl_first + y; @@ -5301,11 +5391,13 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, { 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) { @@ -5472,6 +5564,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); @@ -5482,18 +5582,6 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } } - if (game_status == GAME_MODE_SCORES && server_scores.updated) - { - // reload scores, using updated server score cache file - LoadLocalAndServerScore(scores.last_level_nr, FALSE); - - server_scores.updated = FALSE; - - ti = setHallOfFameActiveEntry(ti_ptr); - - drawChooseTreeScreen(ti); - } - if (game_status == GAME_MODE_SCORES) PlayMenuSoundIfLoop(); } @@ -5628,6 +5716,11 @@ static void DrawHallOfFame_setScoreEntries(void) 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; @@ -5660,6 +5753,8 @@ static void DrawHallOfFame_setScoreEntries(void) // 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) @@ -5685,14 +5780,8 @@ void DrawHallOfFame(int level_nr) DrawChooseTree(&score_entry_current); } -static char *getHallOfFameScoreText(int nr) +static char *getHallOfFameTimeText(int nr) { - if (!level.rate_time_over_score) - return int2str(scores.entry[nr].score, 5); // show normal score - - if (level.use_step_counter) - return int2str(scores.entry[nr].time, 5); // show number of steps - static char score_text[10]; int time_seconds = scores.entry[nr].time / FRAMES_PER_SECOND; int mm = (time_seconds / 60) % 60; @@ -5703,11 +5792,139 @@ 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 new_level_nr = old_level_nr + step * direction; + + if (new_level_nr < leveldir_current->first_level) + new_level_nr = leveldir_current->first_level; + if (new_level_nr > leveldir_current->last_level) + new_level_nr = leveldir_current->last_level; + + if (setup.handicap && new_level_nr > leveldir_current->handicap_level) + new_level_nr = leveldir_current->handicap_level; + + if (new_level_nr != old_level_nr) + { + PlaySound(SND_MENU_ITEM_SELECTING); + + scores.last_level_nr = level_nr = new_level_nr; + + LoadLocalAndServerScore(level_nr, TRUE); + + DrawHallOfFame_setScoreEntries(); + + // force remapping optional gadgets (especially scroll bar) + UnmapScreenTreeGadgets(); + + // redraw complete high score screen, as sub-title has changed + ClearField(); + + // redraw level selection buttons (which have just been erased) + RedrawScreenMenuGadgets(SCREEN_MASK_SCORES); + + HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, &score_entry_current); + + SaveLevelSetup_SeriesInfo(); + } +} + 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 pos) +{ + struct ScoreEntry *entry = &scores.entry[pos]; + 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; + + SetMainBackgroundImageIfDefined(IMG_BACKGROUND_SCOREINFO); + + FadeOut(REDRAW_FIELD); + + ClearField(); + + drawChooseTreeHead(score_entries); + drawChooseTreeInfo(score_entries); + + DrawTextSCentered(ystart, font_title, "Score Information:"); + ystart += ystep_title; + + DrawTextF(xstart1, ystart, font_head, "Level Set"); + DrawTextF(xstart2, ystart, font_text, leveldir_current->name); + 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; + + 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(pos)); + 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"); + + FadeIn(REDRAW_FIELD); +} + +void HandleScoreInfo(int mx, int my, int dx, int dy, int button) +{ + if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE) + { + PlaySound(SND_MENU_ITEM_SELECTING); + + SetGameStatus(GAME_MODE_SCORES); + + DrawHallOfFame(level_nr); + } +} + // ============================================================================ // setup screen functions @@ -9539,6 +9756,22 @@ static struct GD_EVENT_PRESSED | GD_EVENT_REPEATED, FALSE, "next level" }, + { + IMG_MENU_BUTTON_PREV_LEVEL2, IMG_MENU_BUTTON_PREV_LEVEL2_ACTIVE, + &menu.scores.button.prev_level, NULL, + SCREEN_CTRL_ID_PREV_LEVEL2, + SCREEN_MASK_SCORES, + GD_EVENT_PRESSED | GD_EVENT_REPEATED, + FALSE, "previous level" + }, + { + IMG_MENU_BUTTON_NEXT_LEVEL2, IMG_MENU_BUTTON_NEXT_LEVEL2_ACTIVE, + &menu.scores.button.next_level, NULL, + SCREEN_CTRL_ID_NEXT_LEVEL2, + SCREEN_MASK_SCORES, + GD_EVENT_PRESSED | GD_EVENT_REPEATED, + FALSE, "next level" + }, { IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE, &menu.main.button.first_level, NULL, @@ -9708,8 +9941,10 @@ static void CreateScreenMenubuttons(void) for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++) { struct MenuPosInfo *pos = menubutton_info[i].pos; + int screen_mask = menubutton_info[i].screen_mask; boolean is_touch_button = menubutton_info[i].is_touch_button; boolean is_check_button = menubutton_info[i].check_value != NULL; + boolean is_score_button = (screen_mask == SCREEN_MASK_SCORES); Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed; int gfx_unpressed, gfx_pressed; int x, y, width, height; @@ -9757,6 +9992,21 @@ static void CreateScreenMenubuttons(void) checked = *menubutton_info[i].check_value; } + if (is_score_button) + { + // if x/y set to -1, dynamically place buttons next to title text + int title_width = getTextWidth(INFOTEXT_SCORE_ENTRY, FONT_TITLE_1); + + if (pos->x == -1) + x = (id == SCREEN_CTRL_ID_PREV_LEVEL2 ? + SX + (SXSIZE - title_width) / 2 - width * 3 / 2 : + id == SCREEN_CTRL_ID_NEXT_LEVEL2 ? + SX + (SXSIZE + title_width) / 2 + width / 2 : 0); + + if (pos->y == -1) + y = mSY + MENU_TITLE1_YPOS; + } + gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, GDI_IMAGE_ID, gfx_unpressed, @@ -9998,6 +10248,15 @@ void FreeScreenGadgets(void) 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; @@ -10048,11 +10307,27 @@ static void MapScreenGadgets(int num_entries) 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; @@ -10071,6 +10346,14 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) HandleMainMenu_SelectLevel(step, +1, NO_DIRECT_LEVEL_SELECT); break; + case SCREEN_CTRL_ID_PREV_LEVEL2: + HandleHallOfFame_SelectLevel(step, -1); + break; + + case SCREEN_CTRL_ID_NEXT_LEVEL2: + HandleHallOfFame_SelectLevel(step, +1); + break; + case SCREEN_CTRL_ID_FIRST_LEVEL: HandleMainMenu_SelectLevel(MAX_LEVELS, -1, NO_DIRECT_LEVEL_SELECT); break;