X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=8e66c8c9ed7831cc55f2c2b163dab62f8d2a1812;hb=39af00f43cf5c4cea174d0e90633877df08a2f7c;hp=91ec355073d3505e34d00be34aaf89d0309222b7;hpb=213773d641290a743d56c17165d0bafec72cc0aa;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 91ec3550..8e66c8c9 100644 --- a/src/screens.c +++ b/src/screens.c @@ -78,6 +78,10 @@ static int setup_mode = SETUP_MODE_MAIN; game_status <= GAME_MODE_SETUP ? \ menu.draw_yoffset[game_status] : menu.draw_yoffset_default)) +#define NUM_MENU_ENTRIES_ON_SCREEN (menu.list_size[game_status] > 2 ? \ + menu.list_size[game_status] : \ + MAX_MENU_ENTRIES_ON_SCREEN) + #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) #define NUM_SCROLLBAR_BITMAPS 2 static Bitmap *scrollbar_bitmap[NUM_SCROLLBAR_BITMAPS]; @@ -123,6 +127,18 @@ static void drawCursorXY(int xpos, int ypos, int graphic) drawCursorExt(xpos, ypos, -1, graphic); } +static void drawChooseTreeCursor(int ypos, int color) +{ + int last_game_status = game_status; /* save current game status */ + + /* force LEVELS draw offset on artwork setup screen */ + game_status = GAME_MODE_LEVELS; + + drawCursorExt(0, ypos, color, 0); + + game_status = last_game_status; /* restore current game status */ +} + static void PlaySound_Menu_Start(int sound) { if (sound_info[sound].loop) @@ -139,13 +155,13 @@ static void PlaySound_Menu_Continue(int sound) void DrawHeadline() { - int font1_width = getFontWidth(FONT_TITLE_1); - int font2_width = getFontWidth(FONT_TITLE_2); - int x1 = SX + (SXSIZE - strlen(PROGRAM_TITLE_STRING) * font1_width) / 2; - int x2 = SX + (SXSIZE - strlen(WINDOW_SUBTITLE_STRING) * font2_width) / 2; + int text1_width = getTextWidth(PROGRAM_TITLE_STRING, FONT_TITLE_1); + int text2_width = getTextWidth(PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2); + int x1 = SX + (SXSIZE - text1_width) / 2; + int x2 = SX + (SXSIZE - text2_width) / 2; - DrawText(x1, SY + 8, PROGRAM_TITLE_STRING, FONT_TITLE_1); - DrawText(x2, SY + 46, WINDOW_SUBTITLE_STRING, FONT_TITLE_2); + DrawText(x1, SY + 8, PROGRAM_TITLE_STRING, FONT_TITLE_1); + DrawText(x2, SY + 46, PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2); } static void ToggleFullscreenIfNeeded() @@ -176,9 +192,8 @@ void DrawMainMenu() { static LevelDirTree *leveldir_last_valid = NULL; char *name_text = (!options.network && setup.team_mode ? "Team:" : "Name:"); - int font_width = getFontWidth(FONT_MENU_1); - int name_width = font_width * strlen("Name:"); - int level_width = font_width * strlen("Level:"); + int name_width = getTextWidth("Name:", FONT_MENU_1); + int level_width = getTextWidth("Level:", FONT_MENU_1); int i; UnmapAllGadgets(); @@ -197,6 +212,7 @@ void DrawMainMenu() { game_status = GAME_MODE_EDITOR; DrawLevelEd(); + return; } @@ -206,6 +222,13 @@ void DrawMainMenu() /* needed if last screen was the setup screen and fullscreen state changed */ ToggleFullscreenIfNeeded(); + /* leveldir_current may be invalid (level group, parent link) */ + if (!validLevelSeries(leveldir_current)) + leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid); + + /* store valid level series information */ + leveldir_last_valid = leveldir_current; + /* needed if last screen (level choice) changed graphics, sounds or music */ ReloadCustomArtwork(); @@ -216,13 +239,6 @@ void DrawMainMenu() /* map gadgets for main menu screen */ MapTapeButtons(); - /* leveldir_current may be invalid (level group, parent link) */ - if (!validLevelSeries(leveldir_current)) - leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid); - - /* store valid level series information */ - leveldir_last_valid = leveldir_current; - /* level_nr may have been set to value over handicap with level editor */ if (setup.handicap && level_nr > leveldir_current->handicap_level) level_nr = leveldir_current->handicap_level; @@ -298,10 +314,10 @@ static void gotoTopLevelDir() int num_page_entries; int cl_first, cl_cursor; - if (num_leveldirs <= MAX_MENU_ENTRIES_ON_SCREEN) + if (num_leveldirs <= NUM_MENU_ENTRIES_ON_SCREEN) num_page_entries = num_leveldirs; else - num_page_entries = MAX_MENU_ENTRIES_ON_SCREEN; + num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN; cl_first = MAX(0, leveldir_pos - num_page_entries + 1); cl_cursor = leveldir_pos - cl_first; @@ -316,7 +332,7 @@ static void gotoTopLevelDir() void HandleMainMenu(int mx, int my, int dx, int dy, int button) { - static int choice = 0; + static int choice = 5; int x = 0; int y = choice; @@ -457,8 +473,6 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } } - BackToFront(); - out: if (game_status == GAME_MODE_MAIN) @@ -466,6 +480,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, FALSE); DoAnimation(); } + + BackToFront(); } @@ -511,7 +527,7 @@ static int helpscreen_action[] = IMG_INVISIBLE_WALL, -1, HA_NEXT, - IMG_WALL_CRUMBLED, -1, HA_NEXT, + IMG_WALL_SLIPPERY, -1, HA_NEXT, IMG_FONT_GAME_INFO, -1, HA_NEXT, @@ -840,7 +856,6 @@ void DrawHelpScreenElAction(int start) int graphic; int frame_count; int sync_frame; - int frame; while (helpscreen_action[j] != HA_END) { @@ -903,11 +918,15 @@ void DrawHelpScreenElAction(int start) i++; } +#if 1 + redraw_mask |= REDRAW_FIELD; +#else for(i=2; i<16; i++) { MarkTileDirty(0, i); MarkTileDirty(1, i); } +#endif FrameCounter++; } @@ -1113,10 +1132,9 @@ void HandleHelpScreen(int button) #else PlaySound_Menu_Continue(SND_BACKGROUND_INFO); #endif - - DoAnimation(); } + DoAnimation(); BackToFront(); } @@ -1178,6 +1196,10 @@ void HandleTypeName(int newxpos, Key key) static void DrawChooseTree(TreeInfo **ti_ptr) { UnmapAllGadgets(); + + FreeScreenGadgets(); + CreateScreenGadgets(); + CloseDoor(DOOR_CLOSE_2); ClearWindow(); @@ -1195,13 +1217,14 @@ static void AdjustChooseTreeScrollbar(int id, int first_entry, TreeInfo *ti) int items_max, items_visible, item_position; items_max = numTreeInfoInGroup(ti); - items_visible = MAX_MENU_ENTRIES_ON_SCREEN; + items_visible = NUM_MENU_ENTRIES_ON_SCREEN; item_position = first_entry; if (item_position > items_max - items_visible) item_position = items_max - items_visible; ModifyGadget(gi, GDI_SCROLLBAR_ITEMS_MAX, items_max, + GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible, GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END); } @@ -1218,9 +1241,6 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : yoffset_setup); int last_game_status = game_status; /* save current game status */ - DrawBackground(SX, SY, SXSIZE - 32, SYSIZE); - redraw_mask |= REDRAW_FIELD; - title_string = (ti->type == TREE_TYPE_LEVEL_DIR ? "Level Directories" : ti->type == TREE_TYPE_GRAPHICS_DIR ? "Custom Graphics" : @@ -1232,6 +1252,11 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, /* force LEVELS font on artwork setup screen */ game_status = GAME_MODE_LEVELS; + /* clear tree list area, but not title or scrollbar */ + DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32, + SXSIZE - 32 + menu.scrollbar_xoffset, + MAX_MENU_ENTRIES_ON_SCREEN * 32); + for(i=0; icl_first == -1) { + /* only on initialization */ + ti->cl_first = MAX(0, entry_pos - num_page_entries + 1); + ti->cl_cursor = entry_pos - ti->cl_first; + } + else if (ti->cl_cursor >= num_page_entries || + (num_entries > num_page_entries && + num_entries - ti->cl_first < num_page_entries)) + { + /* only after change of list size (by custom graphic configuration) */ ti->cl_first = MAX(0, entry_pos - num_page_entries + 1); - ti->cl_cursor = - entry_pos - ti->cl_first; + ti->cl_cursor = entry_pos - ti->cl_first; } if (dx == 999) /* first entry is set by scrollbar position */ @@ -1320,7 +1362,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, drawChooseTreeList(ti->cl_first, num_page_entries, ti); drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti); - drawCursor(ti->cl_cursor, FC_RED); + drawChooseTreeCursor(ti->cl_cursor, FC_RED); + return; } else if (button == MB_MENU_LEAVE) @@ -1345,8 +1388,15 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (mx || my) /* mouse input */ { + int last_game_status = game_status; /* save current game status */ + + /* force LEVELS draw offset on artwork setup screen */ + game_status = GAME_MODE_LEVELS; + x = (mx - mSX) / 32; y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS; + + game_status = last_game_status; /* restore current game status */ } else if (dx || dy) /* keyboard or scrollbar/scrollbutton input */ { @@ -1374,7 +1424,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, drawChooseTreeList(ti->cl_first, num_page_entries, ti); drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti); - drawCursor(ti->cl_cursor, FC_RED); + drawChooseTreeCursor(ti->cl_cursor, FC_RED); AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, ti->cl_first, ti); } @@ -1388,7 +1438,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, drawChooseTreeList(ti->cl_first, num_page_entries, ti); drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti); - drawCursor(ti->cl_cursor, FC_RED); + drawChooseTreeCursor(ti->cl_cursor, FC_RED); AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, ti->cl_first, ti); } @@ -1414,6 +1464,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, node_cursor->cl_cursor = ti->cl_cursor; *ti_ptr = node_cursor->node_group; DrawChooseTree(ti_ptr); + return; } } @@ -1421,6 +1472,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, { *ti_ptr = ti->node_parent; DrawChooseTree(ti_ptr); + return; } @@ -1430,8 +1482,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, { if (y != ti->cl_cursor) { - drawCursor(y, FC_RED); - drawCursor(ti->cl_cursor, FC_BLUE); + drawChooseTreeCursor(y, FC_RED); + drawChooseTreeCursor(ti->cl_cursor, FC_BLUE); drawChooseTreeInfo(ti->cl_first + y, ti); ti->cl_cursor = y; } @@ -1484,10 +1536,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } } - BackToFront(); - +#if 0 if (game_status == GAME_MODE_LEVELS || game_status == GAME_MODE_SETUP) DoAnimation(); + + BackToFront(); +#endif } void DrawChooseLevel() @@ -1500,6 +1554,9 @@ void DrawChooseLevel() void HandleChooseLevel(int mx, int my, int dx, int dy, int button) { HandleChooseTree(mx, my, dx, dy, button, &leveldir_current); + + DoAnimation(); + BackToFront(); } void DrawHallOfFame(int highlight_position) @@ -1533,7 +1590,7 @@ static void drawHallOfFameList(int first_entry, int highlight_position) DrawText(mSX + 80, mSY + 8, "Hall Of Fame", FONT_TITLE_1); DrawTextFCentered(46, FONT_TITLE_2, "HighScores of Level %d", level_nr); - for(i=0; i 0) { - if (first_entry + MAX_MENU_ENTRIES_ON_SCREEN < MAX_SCORE_ENTRIES) + if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN < MAX_SCORE_ENTRIES) { first_entry += step; - if (first_entry + MAX_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES) - first_entry = MAX(0, MAX_SCORE_ENTRIES - MAX_MENU_ENTRIES_ON_SCREEN); + if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES) + first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN); drawHallOfFameList(first_entry, highlight_position); - return; } } - - if (button_released) + else if (button_released) { FadeSound(SND_BACKGROUND_SCORES); game_status = GAME_MODE_MAIN; DrawMainMenu(); } - BackToFront(); - - if (game_status == GAME_MODE_SCORES) - { - DoAnimation(); #if 1 + if (game_status == GAME_MODE_SCORES) PlaySound_Menu_Continue(SND_BACKGROUND_SCORES); #endif - } + + DoAnimation(); + BackToFront(); } @@ -1660,13 +1715,13 @@ static void execSetupSound() static void execSetupArtwork() { - /* needed if last screen (setup choice) changed graphics, sounds or music */ - ReloadCustomArtwork(); - setup.graphics_set = artwork.gfx_current->identifier; setup.sounds_set = artwork.snd_current->identifier; setup.music_set = artwork.mus_current->identifier; + /* needed if last screen (setup choice) changed graphics, sounds or music */ + ReloadCustomArtwork(); + /* needed for displaying artwork name instead of artwork identifier */ graphics_set_name = artwork.gfx_current->name; sounds_set_name = artwork.snd_current->name; @@ -1756,6 +1811,8 @@ static struct TokenInfo setup_info_editor[] = { TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX Boulderd.:" }, { TYPE_SWITCH, &setup.editor.el_chars, "Characters:" }, { TYPE_SWITCH, &setup.editor.el_custom, "Custom:" }, + { TYPE_SWITCH, &setup.editor.el_custom_more, "More Custom:" }, + { TYPE_SWITCH, &setup.editor.el_headlines, "Headlines:" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } @@ -1779,8 +1836,6 @@ static struct TokenInfo setup_info_graphics[] = static struct TokenInfo setup_info_sound[] = { - { TYPE_SWITCH, &setup.sound, "Sound:", }, - { TYPE_EMPTY, NULL, "" }, { TYPE_SWITCH, &setup.sound_simple, "Simple Sound:" }, { TYPE_SWITCH, &setup.sound_loops, "Sound Loops:" }, { TYPE_SWITCH, &setup.sound_music, "Game Music:" }, @@ -1859,8 +1914,8 @@ static Key getSetupKey() } } - BackToFront(); DoAnimation(); + BackToFront(); /* don't eat all CPU time */ Delay(10); @@ -1874,23 +1929,25 @@ static void drawSetupValue(int pos) int xpos = MENU_SCREEN_VALUE_XPOS; int ypos = MENU_SCREEN_START_YPOS + pos; int font_nr = FONT_VALUE_1; - char *value_string = getSetupValue(setup_info[pos].type & ~TYPE_GHOSTED, - setup_info[pos].value); + int type = setup_info[pos].type; + void *value = setup_info[pos].value; + char *value_string = (!(type & TYPE_GHOSTED) ? getSetupValue(type, value) : + "n/a"); if (value_string == NULL) return; - if (setup_info[pos].type & TYPE_KEY) + if (type & TYPE_KEY) { xpos = 3; - if (setup_info[pos].type & TYPE_QUERY) + if (type & TYPE_QUERY) { value_string = ""; font_nr = FONT_INPUT_1_ACTIVE; } } - else if (setup_info[pos].type & TYPE_STRING) + else if (type & TYPE_STRING) { int max_value_len = (SCR_FIELDX - 2) * 2; @@ -1900,10 +1957,9 @@ static void drawSetupValue(int pos) if (strlen(value_string) > max_value_len) value_string[max_value_len] = '\0'; } - else if (setup_info[pos].type & TYPE_BOOLEAN_STYLE) + else if (type & TYPE_BOOLEAN_STYLE) { - font_nr = (*(boolean *)(setup_info[pos].value) ? FONT_OPTION_ON : - FONT_OPTION_OFF); + font_nr = (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF); } DrawText(mSX + xpos * 32, mSY + ypos * 32, @@ -1982,17 +2038,17 @@ static void DrawSetupScreen_Generic() DrawText(mSX + 16, mSY + 16, title_string, FONT_TITLE_1); num_setup_info = 0; - for(i=0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++) + for(i=0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++) { void *value_ptr = setup_info[i].value; int ypos = MENU_SCREEN_START_YPOS + i; int font_nr = FONT_MENU_1; /* set some entries to "unchangeable" according to other variables */ - if ((value_ptr == &setup.sound && !audio.sound_available) || - (value_ptr == &setup.sound_loops && !audio.loops_available) || - (value_ptr == &setup.sound_music && !audio.music_available) || - (value_ptr == &setup.fullscreen && !video.fullscreen_available)) + if ((value_ptr == &setup.sound_simple && !audio.sound_available) || + (value_ptr == &setup.sound_loops && !audio.loops_available) || + (value_ptr == &setup.sound_music && !audio.music_available) || + (value_ptr == &setup.fullscreen && !video.fullscreen_available)) setup_info[i].type |= TYPE_GHOSTED; if (setup_info[i].type & TYPE_STRING) @@ -2108,10 +2164,12 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) } } +#if 0 BackToFront(); if (game_status == GAME_MODE_SETUP) DoAnimation(); +#endif } void DrawSetupScreen_Input() @@ -2288,7 +2346,11 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button) static unsigned long delay = 0; if (!DelayReached(&delay, GADGET_FRAME_DELAY)) +#if 1 + return; +#else goto out; +#endif player_nr = (player_nr + (x == 10 ? -1 : +1) + MAX_PLAYERS) % MAX_PLAYERS; @@ -2352,12 +2414,14 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button) } } +#if 0 BackToFront(); out: if (game_status == GAME_MODE_SETUP) DoAnimation(); +#endif } void CustomizeKeyboard(int player_nr) @@ -2475,8 +2539,8 @@ void CustomizeKeyboard(int player_nr) } } - BackToFront(); DoAnimation(); + BackToFront(); /* don't eat all CPU time */ Delay(10); @@ -2638,8 +2702,8 @@ static boolean CalibrateJoystickMain(int player_nr) } - BackToFront(); DoAnimation(); + BackToFront(); /* don't eat all CPU time */ Delay(10); @@ -2716,6 +2780,9 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &artwork.mus_current); else HandleSetupScreen_Generic(mx, my, dx, dy, button); + + DoAnimation(); + BackToFront(); } void HandleGameActions() @@ -2801,7 +2868,7 @@ static struct #else IMG_MENU_SCROLLBAR, IMG_MENU_SCROLLBAR_ACTIVE, #endif - SX + SC_SCROLL_VERTICAL_XPOS, SY + SC_SCROLL_VERTICAL_YPOS, + SC_SCROLL_VERTICAL_XPOS, SC_SCROLL_VERTICAL_YPOS, SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE, GD_TYPE_SCROLLBAR_VERTICAL, SCREEN_CTRL_ID_SCROLL_VERTICAL, @@ -2823,16 +2890,17 @@ static void CreateScreenScrollbuttons() int gd_x1, gd_x2, gd_y1, gd_y2; int id = scrollbutton_info[i].gadget_id; - x = scrollbutton_info[i].x; - y = scrollbutton_info[i].y; - event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; - x += SX; - y += SY; + x = mSX + scrollbutton_info[i].x + menu.scrollbar_xoffset; + y = mSY + scrollbutton_info[i].y; width = SC_SCROLLBUTTON_XSIZE; height = SC_SCROLLBUTTON_YSIZE; + if (id == SCREEN_CTRL_ID_SCROLL_DOWN) + y = mSY + (SC_SCROLL_VERTICAL_YPOS + + (NUM_MENU_ENTRIES_ON_SCREEN - 2) * SC_SCROLLBUTTON_YSIZE); + gfx_unpressed = scrollbutton_info[i].gfx_unpressed; gfx_pressed = scrollbutton_info[i].gfx_pressed; gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap; @@ -2853,6 +2921,7 @@ static void CreateScreenScrollbuttons() GDI_STATE, GD_BUTTON_UNPRESSED, GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1, GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2, + GDI_DIRECT_DRAW, FALSE, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleScreenGadgets, GDI_END); @@ -2874,19 +2943,28 @@ static void CreateScreenScrollbars() #if !defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) int gfx_unpressed, gfx_pressed; #endif + int x, y, width, height; int gd_x1, gd_x2, gd_y1, gd_y2; struct GadgetInfo *gi; int items_max, items_visible, item_position; unsigned long event_mask; - int num_page_entries = MAX_MENU_ENTRIES_ON_SCREEN; + int num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN; int id = scrollbar_info[i].gadget_id; + event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS; + + x = mSX + scrollbar_info[i].x + menu.scrollbar_xoffset; + y = mSY + scrollbar_info[i].y; + width = scrollbar_info[i].width; + height = scrollbar_info[i].height; + + if (id == SCREEN_CTRL_ID_SCROLL_VERTICAL) + height = (NUM_MENU_ENTRIES_ON_SCREEN - 2) * SC_SCROLLBUTTON_YSIZE; + items_max = num_page_entries; items_visible = num_page_entries; item_position = 0; - event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS; - #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) gd_bitmap_unpressed = *scrollbar_info[i].gfx_unpressed; gd_bitmap_pressed = *scrollbar_info[i].gfx_pressed; @@ -2908,10 +2986,10 @@ static void CreateScreenScrollbars() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, scrollbar_info[i].infotext, - GDI_X, scrollbar_info[i].x, - GDI_Y, scrollbar_info[i].y, - GDI_WIDTH, scrollbar_info[i].width, - GDI_HEIGHT, scrollbar_info[i].height, + GDI_X, x, + GDI_Y, y, + GDI_WIDTH, width, + GDI_HEIGHT, height, GDI_TYPE, scrollbar_info[i].type, GDI_SCROLLBAR_ITEMS_MAX, items_max, GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible, @@ -2920,6 +2998,7 @@ static void CreateScreenScrollbars() GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1, GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2, GDI_BORDER_SIZE, SC_BORDER_SIZE, SC_BORDER_SIZE, + GDI_DIRECT_DRAW, FALSE, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleScreenGadgets, GDI_END); @@ -2933,6 +3012,8 @@ static void CreateScreenScrollbars() void CreateScreenGadgets() { + int last_game_status = game_status; /* save current game status */ + #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) int i; @@ -2954,8 +3035,13 @@ void CreateScreenGadgets() } #endif + /* force LEVELS draw offset for scrollbar / scrollbutton gadgets */ + game_status = GAME_MODE_LEVELS; + CreateScreenScrollbuttons(); CreateScreenScrollbars(); + + game_status = last_game_status; /* restore current game status */ } void FreeScreenGadgets() @@ -2982,7 +3068,7 @@ void MapChooseTreeGadgets(TreeInfo *ti) int num_entries = numTreeInfoInGroup(ti); int i; - if (num_entries <= MAX_MENU_ENTRIES_ON_SCREEN) + if (num_entries <= NUM_MENU_ENTRIES_ON_SCREEN) return; for (i=0; i