X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fscreens.c;h=e68ec1a8d37efb07cee16488cc4a1c64f5a1a93f;hp=c9c2ba4a29799f65f8be8025408f260e9e4ee051;hb=7ecbe0a730dc19d8a46ffe6bbcb052f20d0c4152;hpb=ce49fdb87ac8d3d9f258882f3072cad48a940044 diff --git a/src/screens.c b/src/screens.c index c9c2ba4a..e68ec1a8 100644 --- a/src/screens.c +++ b/src/screens.c @@ -76,6 +76,8 @@ #define MAX_SETUP_MODES 31 +#define MAX_MENU_MODES MAX(MAX_INFO_MODES, MAX_SETUP_MODES) + /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 #define SETUPINPUT_SCREEN_POS_END (SCR_FIELDY - 4) @@ -98,9 +100,15 @@ MENU_SCREEN_INFO_YSTART2 - \ TILEY / 2) #define MAX_INFO_ELEMENTS_ON_SCREEN 128 -#define NUM_INFO_ELEMENTS_ON_SCREEN MIN(MENU_SCREEN_INFO_YSIZE / \ - MENU_SCREEN_INFO_YSTEP, \ - MAX_INFO_ELEMENTS_ON_SCREEN) +#define STD_INFO_ELEMENTS_ON_SCREEN (MENU_SCREEN_INFO_YSIZE / \ + MENU_SCREEN_INFO_YSTEP) +#define NUM_INFO_ELEMENTS_FROM_CONF \ + (menu.list_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS] > 0 ? \ + menu.list_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS] : \ + MAX_MENU_ENTRIES_ON_SCREEN) +#define NUM_INFO_ELEMENTS_ON_SCREEN MIN(MIN(STD_INFO_ELEMENTS_ON_SCREEN, \ + MAX_INFO_ELEMENTS_ON_SCREEN), \ + NUM_INFO_ELEMENTS_FROM_CONF) #define MAX_MENU_ENTRIES_ON_SCREEN (SCR_FIELDY - MENU_SCREEN_START_YPOS) #define MAX_MENU_TEXT_LENGTH_BIG 13 #define MAX_MENU_TEXT_LENGTH_MEDIUM (MAX_MENU_TEXT_LENGTH_BIG * 2) @@ -166,10 +174,8 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **); static void DrawChooseLevelSet(void); static void DrawChooseLevelNr(void); static void DrawInfoScreen(void); -static void DrawAndFadeInInfoScreen(int); static void DrawSetupScreen(void); -static void DrawInfoScreenExt(int, int); static void DrawInfoScreen_NotAvailable(char *, char *); static void DrawInfoScreen_HelpAnim(int, int, boolean); static void DrawInfoScreen_HelpText(int, int, int, int); @@ -1162,6 +1168,38 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y) y >= rect_y && y < rect_y + rect->height); } +static void AdjustScrollbar(int id, int items_max, int items_visible, + int item_position) +{ + struct GadgetInfo *gi = screen_gadget[id]; + + 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); +} + +static void AdjustChooseTreeScrollbar(int id, int first_entry, TreeInfo *ti) +{ + AdjustScrollbar(id, numTreeInfoInGroup(ti), NUM_MENU_ENTRIES_ON_SCREEN, + first_entry); +} + +static void clearMenuListArea() +{ + int scrollbar_xpos = mSX + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset; + + /* correct scrollbar position if placed outside menu (playfield) area */ + if (scrollbar_xpos > SX + SC_SCROLLBAR_XPOS) + scrollbar_xpos = SX + SC_SCROLLBAR_XPOS; + + /* clear menu list area, but not title or scrollbar */ + DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32, + scrollbar_xpos - mSX, NUM_MENU_ENTRIES_ON_SCREEN * 32); +} + static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) { static int cursor_array[MAX_LEV_FIELDY]; @@ -1214,14 +1252,6 @@ void DrawHeadline() setup.internal.program_copyright); } -int effectiveGameStatus() -{ - if (game_status == GAME_MODE_INFO && info_mode == INFO_MODE_TITLE) - return GAME_MODE_TITLE; - - return game_status; -} - void DrawTitleScreenImage(int nr, boolean initial) { int graphic = getTitleScreenGraphic(nr, initial); @@ -1328,10 +1358,11 @@ boolean CheckTitleScreen(boolean levelset_has_changed) return (show_titlescreen && num_title_screens > 0); } -void DrawMainMenuExt(int fade_mask, boolean do_fading) +void DrawMainMenu() { static LevelDirTree *leveldir_last_valid = NULL; boolean levelset_has_changed = FALSE; + int fade_mask = REDRAW_FIELD; LimitScreenUpdates(FALSE); @@ -1377,13 +1408,16 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) /* needed if last screen (level choice) changed graphics, sounds or music */ ReloadCustomArtwork(0); + /* needed if different viewport properties defined for menues */ + ChangeViewportPropertiesIfNeeded(); + if (redraw_mask & REDRAW_ALL) fade_mask = REDRAW_ALL; - FadeOut(fade_mask); + if (CheckIfGlobalBorderHasChanged()) + fade_mask = REDRAW_ALL; - /* needed if different viewport properties defined for menues */ - ChangeViewportPropertiesIfNeeded(); + FadeOut(fade_mask); /* needed if last screen was the editor screen */ UndrawSpecialEditorDoor(); @@ -1392,6 +1426,7 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) if (CheckTitleScreen(levelset_has_changed)) { + game_status_last_screen = GAME_MODE_MAIN; game_status = GAME_MODE_TITLE; DrawTitleScreen(); @@ -1412,8 +1447,10 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) SetMainBackgroundImage(IMG_BACKGROUND_MAIN); +#if 0 if (fade_mask == REDRAW_ALL) RedrawGlobalBorder(); +#endif ClearField(); @@ -1441,11 +1478,12 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) MapScreenMenuGadgets(SCREEN_MASK_MAIN); /* copy actual game door content to door double buffer for OpenDoor() */ + BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); BlitBitmap(drawto, bitmap_db_door_2, VX, VY, VXSIZE, VYSIZE, 0, 0); OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - DrawMaskedBorder(REDRAW_ALL); + DrawMaskedBorder(fade_mask); FadeIn(fade_mask); FadeSetEnterMenu(); @@ -1461,16 +1499,6 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); } -void DrawAndFadeInMainMenu(int fade_mask) -{ - DrawMainMenuExt(fade_mask, TRUE); -} - -void DrawMainMenu() -{ - DrawMainMenuExt(REDRAW_ALL, FALSE); -} - static void gotoTopLevelDir() { /* move upwards until inside (but not above) top level directory */ @@ -1507,7 +1535,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) static int title_screen_nr = 0; static int last_sound = -1, last_music = -1; boolean return_to_main_menu = FALSE; - boolean use_fading_main_menu = TRUE; struct TitleControlInfo *tci; struct TitleFadingInfo fading_default; struct TitleFadingInfo fading_last = fading; @@ -1523,7 +1550,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) last_sound = SND_UNDEFINED; last_music = MUS_UNDEFINED; - if (game_status == GAME_MODE_INFO) + if (game_status_last_screen == GAME_MODE_INFO) { if (num_title_screens == 0) { @@ -1536,8 +1563,13 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) FadeSoundsAndMusic(); FadeOut(REDRAW_ALL); + + /* only required to update logic for redrawing global border */ + ClearField(); } + ChangeViewportPropertiesIfNeeded(); + if (tci->is_image) DrawTitleScreenImage(tci->local_nr, tci->initial); else @@ -1582,16 +1614,17 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (button == MB_MENU_LEAVE) { return_to_main_menu = TRUE; - use_fading_main_menu = FALSE; } else if (button == MB_MENU_CHOICE) { - if (game_status == GAME_MODE_INFO && num_title_screens == 0) + if (game_status_last_screen == GAME_MODE_INFO && num_title_screens == 0) { FadeSetEnterScreen(); + game_status = GAME_MODE_INFO; info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + + DrawInfoScreen(); return; } @@ -1652,19 +1685,21 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { SetMouseCursor(CURSOR_DEFAULT); - if (game_status == GAME_MODE_INFO) - { - int fade_mask = (num_title_screens == 0 ? REDRAW_FIELD : REDRAW_ALL); + /* force full menu screen redraw after displaying title screens */ + redraw_mask = REDRAW_ALL; + if (game_status_last_screen == GAME_MODE_INFO) + { + game_status = GAME_MODE_INFO; info_mode = INFO_MODE_MAIN; - DrawInfoScreenExt(fade_mask, use_fading_main_menu); + DrawInfoScreen(); } else /* default: return to main menu */ { game_status = GAME_MODE_MAIN; - DrawMainMenuExt(REDRAW_ALL, use_fading_main_menu); + DrawMainMenu(); } } } @@ -1793,6 +1828,10 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else if (pos == MAIN_CONTROL_LEVEL_NUMBER && !button) { + StopAnimation(); + + CloseDoor(DOOR_CLOSE_2); + game_status = GAME_MODE_LEVELNR; ChangeViewportPropertiesIfNeeded(); @@ -1827,6 +1866,10 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) { if (leveldir_first) { + StopAnimation(); + + CloseDoor(DOOR_CLOSE_2); + game_status = GAME_MODE_LEVELS; SaveLevelSetup_LastSeries(); @@ -1842,9 +1885,11 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else if (pos == MAIN_CONTROL_SCORES) { - game_status = GAME_MODE_SCORES; + StopAnimation(); - ChangeViewportPropertiesIfNeeded(); + CloseDoor(DOOR_CLOSE_2); + + game_status = GAME_MODE_SCORES; DrawHallOfFame(-1); } @@ -1854,6 +1899,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) !strEqual(setup.player_name, "Artsoft")) Request("This level is read only!", REQ_CONFIRM); + StopAnimation(); + CloseDoor(DOOR_CLOSE_2); game_status = GAME_MODE_EDITOR; @@ -1864,6 +1911,10 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else if (pos == MAIN_CONTROL_INFO) { + StopAnimation(); + + CloseDoor(DOOR_CLOSE_2); + game_status = GAME_MODE_INFO; info_mode = INFO_MODE_MAIN; @@ -1873,10 +1924,16 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else if (pos == MAIN_CONTROL_GAME) { + StopAnimation(); + StartGameActions(options.network, setup.autorecord, level.random_seed); } else if (pos == MAIN_CONTROL_SETUP) { + StopAnimation(); + + CloseDoor(DOOR_CLOSE_2); + game_status = GAME_MODE_SETUP; setup_mode = SETUP_MODE_MAIN; @@ -1904,7 +1961,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) /* ========================================================================= */ static struct TokenInfo *info_info; -static int num_info_info; +static int num_info_info; /* number of info entries shown on screen */ +static int max_info_info; /* total number of info entries in list */ static void execInfoTitleScreen() { @@ -1959,7 +2017,7 @@ static void execExitInfo() { game_status = GAME_MODE_MAIN; - DrawMainMenuExt(REDRAW_FIELD, FALSE); + DrawMainMenu(); } static struct TokenInfo info_info_main[] = @@ -1977,26 +2035,122 @@ static struct TokenInfo info_info_main[] = { 0, NULL, NULL } }; -static void DrawCursorAndText_Info(int pos, boolean active) +static int getMenuTextFont(int type) +{ + if (type & (TYPE_SWITCH | + TYPE_YES_NO | + TYPE_YES_NO_AUTO | + TYPE_STRING | + TYPE_ECS_AGA | + TYPE_KEYTEXT | + TYPE_ENTER_LIST)) + return FONT_MENU_2; + else + return FONT_MENU_1; +} + +static struct TokenInfo *setup_info; +static struct TokenInfo setup_info_input[]; + +static struct TokenInfo *menu_info; + +static void DrawCursorAndText_Menu_Ext(struct TokenInfo *token_info, + int screen_pos, int menu_info_pos_raw, + boolean active) { + int pos = (menu_info_pos_raw < 0 ? screen_pos : menu_info_pos_raw); + struct TokenInfo *ti = &token_info[pos]; int xpos = MENU_SCREEN_START_XPOS; - int ypos = MENU_SCREEN_START_YPOS + pos; - int font_nr = FONT_MENU_1; + int ypos = MENU_SCREEN_START_YPOS + screen_pos; + int font_nr = getMenuTextFont(ti->type); + + if (token_info == setup_info_input) + font_nr = FONT_MENU_1; if (active) font_nr = FONT_ACTIVE(font_nr); - DrawText(mSX + xpos * 32, mSY + ypos * 32, info_info[pos].text, font_nr); + DrawText(mSX + xpos * 32, mSY + ypos * 32, ti->text, font_nr); + + if (ti->type & ~TYPE_SKIP_ENTRY) + drawCursor(screen_pos, active); +} + +static void DrawCursorAndText_Menu(int screen_pos, int menu_info_pos_raw, + boolean active) +{ + DrawCursorAndText_Menu_Ext(menu_info, screen_pos, menu_info_pos_raw, active); +} + +static void DrawCursorAndText_Setup(int screen_pos, int menu_info_pos_raw, + boolean active) +{ + DrawCursorAndText_Menu_Ext(setup_info, screen_pos, menu_info_pos_raw, active); +} + +static char *screen_mode_text; +static char *window_size_text; +static char *scaling_type_text; + +static void drawSetupValue(int, int); + +static void drawMenuInfoList(int first_entry, int num_page_entries, + int max_page_entries) +{ + int i; + + if (first_entry + num_page_entries > max_page_entries) + first_entry = 0; + + clearMenuListArea(); + + for (i = 0; i < num_page_entries; i++) + { + int menu_info_pos = first_entry + i; + struct TokenInfo *si = &menu_info[menu_info_pos]; + void *value_ptr = si->value; + + /* set some entries to "unchangeable" according to other variables */ + 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) || + (value_ptr == &screen_mode_text && !video.fullscreen_available) || + (value_ptr == &window_size_text && !video.window_scaling_available) || + (value_ptr == &scaling_type_text && !video.window_scaling_available)) + si->type |= TYPE_GHOSTED; + + if (si->type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST)) + initCursor(i, IMG_MENU_BUTTON_ENTER_MENU); + else if (si->type & (TYPE_LEAVE_MENU|TYPE_LEAVE_LIST)) + initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU); + else if (si->type & ~TYPE_SKIP_ENTRY) + initCursor(i, IMG_MENU_BUTTON); - if (info_info[pos].type & ~TYPE_SKIP_ENTRY) - drawCursor(pos, active); + DrawCursorAndText_Menu(i, menu_info_pos, FALSE); + + if (si->type & TYPE_VALUE && + menu_info == setup_info) + drawSetupValue(i, menu_info_pos); + } } -static void DrawInfoScreen_Main(int fade_mask, boolean do_fading) +static void DrawInfoScreen_Main() { + int fade_mask = REDRAW_FIELD; int i; + if (redraw_mask & REDRAW_ALL) + fade_mask = REDRAW_ALL; + + if (CheckIfGlobalBorderHasChanged()) + fade_mask = REDRAW_ALL; + UnmapAllGadgets(); + + FreeScreenGadgets(); + CreateScreenGadgets(); + CloseDoor(DOOR_CLOSE_2); /* (needed after displaying title screens which disable auto repeat) */ @@ -2006,36 +2160,30 @@ static void DrawInfoScreen_Main(int fade_mask, boolean do_fading) FadeOut(fade_mask); - if (fade_mask == REDRAW_ALL) - { - RedrawGlobalBorder(); + ChangeViewportPropertiesIfNeeded(); - OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - } + OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); ClearField(); DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Info Screen"); info_info = info_info_main; - num_info_info = 0; - - for (i = 0; info_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++) - { - if (info_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST)) - initCursor(i, IMG_MENU_BUTTON_ENTER_MENU); - else if (info_info[i].type & (TYPE_LEAVE_MENU|TYPE_LEAVE_LIST)) - initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU); - else if (info_info[i].type & ~TYPE_SKIP_ENTRY) - initCursor(i, IMG_MENU_BUTTON); - - DrawCursorAndText_Info(i, FALSE); + // determine maximal number of info entries that can be displayed on screen + num_info_info = 0; + for (i = 0; info_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++) num_info_info++; - } + + // determine maximal number of info entries available for menu of info screen + max_info_info = 0; + for (i = 0; info_info[i].type != 0; i++) + max_info_info++; HandleInfoScreen_Main(0, 0, 0, 0, MB_MENU_INITIALIZE); + MapScreenGadgets(max_info_info); + PlayMenuSound(); PlayMenuMusic(); @@ -2046,38 +2194,90 @@ static void DrawInfoScreen_Main(int fade_mask, boolean do_fading) InitAnimation(); } -void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) +static void changeSetupValue(int, int, int); + +void HandleMenuScreen(int mx, int my, int dx, int dy, int button, + int mode, int num_page_entries, int max_page_entries) { - static int choice_store[MAX_INFO_MODES]; - int choice = choice_store[info_mode]; /* always starts with 0 */ + static int num_page_entries_all_last[NUM_SPECIAL_GFX_ARGS][MAX_MENU_MODES]; + static int choice_stores[NUM_SPECIAL_GFX_ARGS][MAX_MENU_MODES]; + static int first_entry_stores[NUM_SPECIAL_GFX_ARGS][MAX_MENU_MODES]; + int *num_page_entries_last = num_page_entries_all_last[game_status]; + int *choice_store = choice_stores[game_status]; + int *first_entry_store = first_entry_stores[game_status]; + int choice = choice_store[mode]; /* starts with 0 */ + int first_entry = first_entry_store[mode]; /* starts with 0 */ int x = 0; - int y = choice; + int y = choice - first_entry; + int y_old = y; + boolean position_set_by_scrollbar = (dx == 999); + int step = (button == 1 ? 1 : button == 2 ? 5 : 10); + int i; if (button == MB_MENU_INITIALIZE) { + // check if number of menu page entries has changed (may happen by change + // of custom artwork definition value for 'list_size' for this menu screen) + // (in this case, the last menu position most probably has to be corrected) + if (num_page_entries != num_page_entries_last[mode]) + { + choice_store[mode] = first_entry_store[mode] = 0; + + choice = first_entry = 0; + y = y_old = 0; + + num_page_entries_last[mode] = num_page_entries; + } + /* advance to first valid menu entry */ - while (choice < num_info_info && - info_info[choice].type & TYPE_SKIP_ENTRY) + while (choice < num_page_entries && + menu_info[choice].type & TYPE_SKIP_ENTRY) choice++; - choice_store[info_mode] = choice; - DrawCursorAndText_Info(choice, TRUE); + if (position_set_by_scrollbar) + first_entry = first_entry_store[mode] = dy; + else + AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_page_entries, + NUM_MENU_ENTRIES_ON_SCREEN, first_entry); + + drawMenuInfoList(first_entry, num_page_entries, max_page_entries); + + if (choice < first_entry) + { + choice = first_entry; + + if (menu_info[choice].type & TYPE_SKIP_ENTRY) + choice++; + } + else if (choice > first_entry + num_page_entries - 1) + { + choice = first_entry + num_page_entries - 1; + + if (menu_info[choice].type & TYPE_SKIP_ENTRY) + choice--; + } + + choice_store[mode] = choice; + + DrawCursorAndText_Menu(choice - first_entry, choice, TRUE); return; } else if (button == MB_MENU_LEAVE) { - for (y = 0; y < num_info_info; y++) + PlaySound(SND_MENU_ITEM_SELECTING); + + for (i = 0; i < max_page_entries; i++) { - if (info_info[y].type & TYPE_LEAVE_MENU) + if (menu_info[i].type & TYPE_LEAVE_MENU) { - void (*menu_callback_function)(void) = info_info[y].value; + void (*menu_callback_function)(void) = menu_info[i].value; FadeSetLeaveMenu(); menu_callback_function(); - break; /* absolutely needed because function changes 'info_info'! */ + break; /* absolutely needed because function changes 'menu_info'! */ } } @@ -2089,63 +2289,200 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) x = (mx - mSX) / 32; y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS; } - else if (dx || dy) /* keyboard input */ + else if (dx || dy) /* keyboard or scrollbar/scrollbutton input */ { - if (dx) - { - int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER); + /* move cursor instead of scrolling when already at start/end of list */ + if (dy == -1 * SCROLL_LINE && first_entry == 0) + dy = -1; + else if (dy == +1 * SCROLL_LINE && + first_entry + num_page_entries == max_page_entries) + dy = 1; - if (info_info[choice].type & menu_navigation_type || - info_info[choice].type & TYPE_ENTER_SCREEN || - info_info[choice].type & TYPE_BOOLEAN_STYLE || - info_info[choice].type & TYPE_YES_NO_AUTO) - button = MB_MENU_CHOICE; - } - else if (dy) - y = choice + dy; + /* handle scrolling screen one line or page */ + if (y + dy < 0 || + y + dy > num_page_entries - 1) + { + boolean redraw = FALSE; - /* jump to next non-empty menu entry (up or down) */ - while (y > 0 && y < num_info_info - 1 && - info_info[y].type & TYPE_SKIP_ENTRY) - y += dy; - } + if (ABS(dy) == SCROLL_PAGE) + step = num_page_entries - 1; - if (IN_VIS_MENU(x, y) && - y >= 0 && y < num_info_info && info_info[y].type & ~TYPE_SKIP_ENTRY) - { - if (button) - { - if (y != choice) + if (dy < 0 && first_entry > 0) { - PlaySound(SND_MENU_ITEM_ACTIVATING); + /* scroll page/line up */ - DrawCursorAndText_Info(choice, FALSE); - DrawCursorAndText_Info(y, TRUE); + first_entry -= step; + if (first_entry < 0) + first_entry = 0; - choice = choice_store[info_mode] = y; + redraw = TRUE; } - } - else if (!(info_info[y].type & TYPE_GHOSTED)) - { - PlaySound(SND_MENU_ITEM_SELECTING); - - if (info_info[y].type & TYPE_ENTER_OR_LEAVE) + else if (dy > 0 && first_entry + num_page_entries < max_page_entries) { - void (*menu_callback_function)(void) = info_info[choice].value; + /* scroll page/line down */ - FadeSetFromType(info_info[y].type); + first_entry += step; + if (first_entry + num_page_entries > max_page_entries) + first_entry = MAX(0, max_page_entries - num_page_entries); - menu_callback_function(); + redraw = TRUE; } - } - } -} - -void DrawInfoScreen_NotAvailable(char *text_title, char *text_error) -{ - int ystart1 = mSY - SY + 100; - int ystart2 = mSY - SY + 150; - int ybottom = mSY - SY + SYSIZE - 20; + + if (redraw) + { + choice += first_entry - first_entry_store[mode]; + + if (choice < first_entry) + { + choice = first_entry; + + if (menu_info[choice].type & TYPE_SKIP_ENTRY) + choice++; + } + else if (choice > first_entry + num_page_entries - 1) + { + choice = first_entry + num_page_entries - 1; + + if (menu_info[choice].type & TYPE_SKIP_ENTRY) + choice--; + } + else if (menu_info[choice].type & TYPE_SKIP_ENTRY) + { + choice += SIGN(dy); + + if (choice < first_entry || + choice > first_entry + num_page_entries - 1) + first_entry += SIGN(dy); + } + + first_entry_store[mode] = first_entry; + choice_store[mode] = choice; + + drawMenuInfoList(first_entry, num_page_entries, max_page_entries); + + DrawCursorAndText_Menu(choice - first_entry, choice, TRUE); + + AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_page_entries, + NUM_MENU_ENTRIES_ON_SCREEN, first_entry); + } + + return; + } + + if (dx) + { + int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER); + + if (menu_info[choice].type & menu_navigation_type || + menu_info[choice].type & TYPE_BOOLEAN_STYLE || + menu_info[choice].type & TYPE_YES_NO_AUTO) + button = MB_MENU_CHOICE; + } + else if (dy) + y += dy; + + /* jump to next non-empty menu entry (up or down) */ + while (first_entry + y > 0 && + first_entry + y < max_page_entries - 1 && + menu_info[first_entry + y].type & TYPE_SKIP_ENTRY) + y += dy; + + if (!IN_VIS_MENU(x, y)) + { + choice += y - y_old; + + if (choice < first_entry) + first_entry = choice; + else if (choice > first_entry + num_page_entries - 1) + first_entry = choice - num_page_entries + 1; + + if (first_entry >= 0 && + first_entry + num_page_entries <= max_page_entries) + { + first_entry_store[mode] = first_entry; + + if (choice < first_entry) + choice = first_entry; + else if (choice > first_entry + num_page_entries - 1) + choice = first_entry + num_page_entries - 1; + + choice_store[mode] = choice; + + drawMenuInfoList(first_entry, num_page_entries, max_page_entries); + + DrawCursorAndText_Menu(choice - first_entry, choice, TRUE); + + AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_page_entries, + NUM_MENU_ENTRIES_ON_SCREEN, first_entry); + } + + return; + } + } + + if (!anyScrollbarGadgetActive() && + IN_VIS_MENU(x, y) && + mx < screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x && + y >= 0 && y < num_page_entries) + { + if (button) + { + if (first_entry + y != choice && + menu_info[first_entry + y].type & ~TYPE_SKIP_ENTRY) + { + PlaySound(SND_MENU_ITEM_ACTIVATING); + + DrawCursorAndText_Menu(choice - first_entry, choice, FALSE); + DrawCursorAndText_Menu(y, first_entry + y, TRUE); + + choice = choice_store[mode] = first_entry + y; + } + } + else if (!(menu_info[first_entry + y].type & TYPE_GHOSTED)) + { + PlaySound(SND_MENU_ITEM_SELECTING); + + /* when selecting key headline, execute function for key value change */ + if (menu_info[first_entry + y].type & TYPE_KEYTEXT && + menu_info[first_entry + y + 1].type & TYPE_KEY) + y++; + + /* when selecting string value, execute function for list selection */ + if (menu_info[first_entry + y].type & TYPE_STRING && y > 0 && + menu_info[first_entry + y - 1].type & TYPE_ENTER_LIST) + y--; + + if (menu_info[first_entry + y].type & TYPE_ENTER_OR_LEAVE) + { + void (*menu_callback_function)(void) = + menu_info[first_entry + y].value; + + FadeSetFromType(menu_info[first_entry + y].type); + + menu_callback_function(); + } + else if (menu_info[first_entry + y].type & TYPE_VALUE && + menu_info == setup_info) + { + changeSetupValue(y, first_entry + y, dx); + } + } + } +} + +void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) +{ + menu_info = info_info; + + HandleMenuScreen(mx, my, dx, dy, button, + info_mode, num_info_info, max_info_info); +} + +void DrawInfoScreen_NotAvailable(char *text_title, char *text_error) +{ + int ystart1 = mSY - SY + 100; + int ystart2 = mSY - SY + 150; + int ybottom = mSY - SY + SYSIZE - 20; SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO); @@ -2328,6 +2665,9 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos) void DrawInfoScreen_TitleScreen() { + game_status_last_screen = GAME_MODE_INFO; + game_status = GAME_MODE_TITLE; + DrawTitleScreen(); } @@ -2405,7 +2745,7 @@ void HandleInfoScreen_Elements(int button) FadeSoundsAndMusic(); info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + DrawInfoScreen(); return; } @@ -2504,7 +2844,7 @@ void HandleInfoScreen_Music(int button) FadeSoundsAndMusic(); info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + DrawInfoScreen(); return; } @@ -2808,7 +3148,7 @@ void HandleInfoScreen_Credits(int button) FadeSoundsAndMusic(); info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + DrawInfoScreen(); return; } @@ -2887,7 +3227,7 @@ void HandleInfoScreen_Program(int button) FadeSoundsAndMusic(); info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + DrawInfoScreen(); } else { @@ -3062,7 +3402,7 @@ void HandleInfoScreen_Version(int button) FadeSoundsAndMusic(); info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + DrawInfoScreen(); } else { @@ -3150,7 +3490,7 @@ void HandleInfoScreen_LevelSet(int button) FadeSoundsAndMusic(); info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + DrawInfoScreen(); } else { @@ -3158,7 +3498,7 @@ void HandleInfoScreen_LevelSet(int button) } } -static void DrawInfoScreenExt(int fade_mask, boolean do_fading) +static void DrawInfoScreen() { SetMainBackgroundImage(IMG_BACKGROUND_INFO); @@ -3177,7 +3517,7 @@ static void DrawInfoScreenExt(int fade_mask, boolean do_fading) else if (info_mode == INFO_MODE_LEVELSET) DrawInfoScreen_LevelSet(); else - DrawInfoScreen_Main(fade_mask, do_fading); + DrawInfoScreen_Main(); if (info_mode != INFO_MODE_MAIN && info_mode != INFO_MODE_TITLE && @@ -3188,16 +3528,6 @@ static void DrawInfoScreenExt(int fade_mask, boolean do_fading) } } -void DrawAndFadeInInfoScreen(int fade_mask) -{ - DrawInfoScreenExt(fade_mask, TRUE); -} - -void DrawInfoScreen() -{ - DrawInfoScreenExt(REDRAW_FIELD, FALSE); -} - void HandleInfoScreen(int mx, int my, int dx, int dy, int button) { if (info_mode == INFO_MODE_TITLE) @@ -3308,13 +3638,16 @@ void HandleTypeName(int newxpos, Key key) static void DrawChooseTree(TreeInfo **ti_ptr) { - int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD); + int fade_mask = REDRAW_FIELD; + + if (CheckIfGlobalBorderHasChanged()) + fade_mask = REDRAW_ALL; if (strEqual((*ti_ptr)->subdir, STRING_TOP_DIRECTORY)) { game_status = GAME_MODE_MAIN; - DrawMainMenuExt(REDRAW_FIELD, FALSE); + DrawMainMenu(); return; } @@ -3328,48 +3661,20 @@ static void DrawChooseTree(TreeInfo **ti_ptr) FadeOut(fade_mask); + OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); + ClearField(); HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, ti_ptr); MapScreenTreeGadgets(*ti_ptr); + DrawMaskedBorder(fade_mask); + FadeIn(fade_mask); InitAnimation(); } -static void AdjustScrollbar(int id, int items_max, int items_visible, - int item_position) -{ - struct GadgetInfo *gi = screen_gadget[id]; - - 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); -} - -static void AdjustChooseTreeScrollbar(int id, int first_entry, TreeInfo *ti) -{ - AdjustScrollbar(id, numTreeInfoInGroup(ti), NUM_MENU_ENTRIES_ON_SCREEN, - first_entry); -} - -static void clearMenuListArea() -{ - int scrollbar_xpos = mSX + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset; - - /* correct scrollbar position if placed outside menu (playfield) area */ - if (scrollbar_xpos > SX + SC_SCROLLBAR_XPOS) - scrollbar_xpos = SX + SC_SCROLLBAR_XPOS; - - /* clear menu list area, but not title or scrollbar */ - DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32, - scrollbar_xpos - mSX, NUM_MENU_ENTRIES_ON_SCREEN * 32); -} - static void drawChooseTreeList(int first_entry, int num_page_entries, TreeInfo *ti) { @@ -3553,7 +3858,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, game_status = GAME_MODE_MAIN; - DrawMainMenuExt(REDRAW_FIELD, FALSE); + DrawMainMenu(); } return; @@ -3836,7 +4141,16 @@ void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button) void DrawHallOfFame(int highlight_position) { - int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD); + int fade_mask = REDRAW_FIELD; + + /* required before door position may be changed in next step */ + CloseDoor(DOOR_CLOSE_ALL); + + /* needed if different viewport properties defined for scores */ + ChangeViewportPropertiesIfNeeded(); + + if (CheckIfGlobalBorderHasChanged()) + fade_mask = REDRAW_ALL; UnmapAllGadgets(); FadeSoundsAndMusic(); @@ -3849,8 +4163,6 @@ void DrawHallOfFame(int highlight_position) SetDrawDeactivationMask(REDRAW_NONE); SetDrawBackgroundMask(REDRAW_FIELD); - CloseDoor(DOOR_CLOSE_ALL); - if (highlight_position < 0) LoadScore(level_nr); @@ -3863,8 +4175,12 @@ void DrawHallOfFame(int highlight_position) PlayMenuSound(); PlayMenuMusic(); + OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); + HandleHallOfFame(highlight_position, 0, 0, 0, MB_MENU_INITIALIZE); + DrawMaskedBorder(fade_mask); + FadeIn(fade_mask); } @@ -3966,7 +4282,7 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) game_status = GAME_MODE_MAIN; - DrawAndFadeInMainMenu(REDRAW_FIELD); + DrawMainMenu(); } if (game_status == GAME_MODE_SCORES) @@ -4956,7 +5272,7 @@ static void execExitSetup() { game_status = GAME_MODE_MAIN; - DrawMainMenuExt(REDRAW_FIELD, FALSE); + DrawMainMenu(); } static void execSaveAndExitSetup() @@ -5002,6 +5318,7 @@ static struct TokenInfo setup_info_game[] = #endif { TYPE_ENTER_LIST, execSetupChooseSnapshotMode,"Game Engine Snapshot Mode:" }, { TYPE_STRING, &snapshot_mode_text, "" }, + { TYPE_SWITCH, &setup.show_snapshot_buttons,"Show Snapshot Buttons:" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, @@ -5289,20 +5606,6 @@ static Key getSetupKey() return key; } -static int getSetupTextFont(int type) -{ - if (type & (TYPE_SWITCH | - TYPE_YES_NO | - TYPE_YES_NO_AUTO | - TYPE_STRING | - TYPE_ECS_AGA | - TYPE_KEYTEXT | - TYPE_ENTER_LIST)) - return FONT_MENU_2; - else - return FONT_MENU_1; -} - static int getSetupValueFont(int type, void *value) { if (type & TYPE_KEY) @@ -5378,7 +5681,7 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw) int font1_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset; int font2_xoffset = getFontBitmapInfo(check_font_nr)->draw_xoffset; int text_startx = mSX + MENU_SCREEN_START_XPOS * 32; - int text_font_nr = getSetupTextFont(FONT_MENU_2); + int text_font_nr = getMenuTextFont(FONT_MENU_2); int text_font_xoffset = getFontBitmapInfo(text_font_nr)->draw_xoffset; int text_width = max_menu_text_length_medium * getFontWidth(text_font_nr); boolean correct_font_draw_xoffset = FALSE; @@ -5453,80 +5756,16 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx) ToggleFullscreenOrChangeWindowScalingIfNeeded(); } -static void DrawCursorAndText_Setup(int screen_pos, int setup_info_pos_raw, - boolean active) -{ - int si_pos = (setup_info_pos_raw < 0 ? screen_pos : setup_info_pos_raw); - struct TokenInfo *si = &setup_info[si_pos]; - int xpos = MENU_SCREEN_START_XPOS; - int ypos = MENU_SCREEN_START_YPOS + screen_pos; - int font_nr = getSetupTextFont(si->type); - - if (setup_info == setup_info_input) - font_nr = FONT_MENU_1; - - if (active) - font_nr = FONT_ACTIVE(font_nr); - - DrawText(mSX + xpos * 32, mSY + ypos * 32, si->text, font_nr); - - if (si->type & ~TYPE_SKIP_ENTRY) - drawCursor(screen_pos, active); -} - -static void drawSetupInfoList(struct TokenInfo *setup_info, - int first_entry, int num_page_entries) -{ - int i; - - if (num_page_entries > NUM_MENU_ENTRIES_ON_SCREEN) - num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN; - - if (num_page_entries > max_setup_info) - num_page_entries = max_setup_info; - - if (first_entry + num_page_entries > max_setup_info) - first_entry = 0; - - clearMenuListArea(); - - for (i = 0; i < num_page_entries; i++) - { - int setup_info_pos = first_entry + i; - struct TokenInfo *si = &setup_info[setup_info_pos]; - void *value_ptr = si->value; - - /* set some entries to "unchangeable" according to other variables */ - 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) || - (value_ptr == &screen_mode_text && !video.fullscreen_available) || - (value_ptr == &window_size_text && !video.window_scaling_available) || - (value_ptr == &scaling_type_text && !video.window_scaling_available)) - si->type |= TYPE_GHOSTED; - - if (si->type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST)) - initCursor(i, IMG_MENU_BUTTON_ENTER_MENU); - else if (si->type & (TYPE_LEAVE_MENU|TYPE_LEAVE_LIST)) - initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU); - else if (si->type & ~TYPE_SKIP_ENTRY) - initCursor(i, IMG_MENU_BUTTON); - - DrawCursorAndText_Setup(i, setup_info_pos, FALSE); - - if (si->type & TYPE_VALUE) - drawSetupValue(i, setup_info_pos); - } -} - static void DrawSetupScreen_Generic() { - int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD); + int fade_mask = REDRAW_FIELD; boolean redraw_all = FALSE; char *title_string = NULL; int i; + if (CheckIfGlobalBorderHasChanged()) + fade_mask = REDRAW_ALL; + UnmapAllGadgets(); FreeScreenGadgets(); @@ -5539,6 +5778,8 @@ static void DrawSetupScreen_Generic() FadeOut(fade_mask); + OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); + ClearField(); if (setup_mode == SETUP_MODE_MAIN) @@ -5626,6 +5867,8 @@ static void DrawSetupScreen_Generic() if (redraw_all) redraw_mask = fade_mask = REDRAW_ALL; + DrawMaskedBorder(fade_mask); + FadeIn(fade_mask); InitAnimation(); @@ -5633,262 +5876,10 @@ static void DrawSetupScreen_Generic() void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) { - static int choice_store[MAX_SETUP_MODES]; - static int first_entry_store[MAX_SETUP_MODES]; - int choice = choice_store[setup_mode]; /* starts with 0 */ - int first_entry = first_entry_store[setup_mode]; /* starts with 0 */ - int x = 0; - int y = choice - first_entry; - int y_old = y; - boolean position_set_by_scrollbar = (dx == 999); - int step = (button == 1 ? 1 : button == 2 ? 5 : 10); - int num_page_entries; - - num_page_entries = MIN(max_setup_info, NUM_MENU_ENTRIES_ON_SCREEN); - - if (button == MB_MENU_INITIALIZE) - { - /* advance to first valid menu entry */ - while (choice < num_setup_info && - setup_info[choice].type & TYPE_SKIP_ENTRY) - choice++; - - if (position_set_by_scrollbar) - first_entry = first_entry_store[setup_mode] = dy; - else - AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_setup_info, - NUM_MENU_ENTRIES_ON_SCREEN, first_entry); - - drawSetupInfoList(setup_info, first_entry, NUM_MENU_ENTRIES_ON_SCREEN); - - if (choice < first_entry) - { - choice = first_entry; - - if (setup_info[choice].type & TYPE_SKIP_ENTRY) - choice++; - } - else if (choice > first_entry + num_page_entries - 1) - { - choice = first_entry + num_page_entries - 1; - - if (setup_info[choice].type & TYPE_SKIP_ENTRY) - choice--; - } - - choice_store[setup_mode] = choice; - - DrawCursorAndText_Setup(choice - first_entry, choice, TRUE); - - return; - } - else if (button == MB_MENU_LEAVE) - { - int i; - - PlaySound(SND_MENU_ITEM_SELECTING); - - for (i = 0; setup_info[i].type != 0; i++) - { - if (setup_info[i].type & TYPE_LEAVE_MENU) - { - void (*menu_callback_function)(void) = setup_info[i].value; - - FadeSetLeaveMenu(); - - menu_callback_function(); - - break; /* absolutely needed because function changes 'setup_info'! */ - } - } - - return; - } - - if (mx || my) /* mouse input */ - { - x = (mx - mSX) / 32; - y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS; - } - else if (dx || dy) /* keyboard or scrollbar/scrollbutton input */ - { - /* move cursor instead of scrolling when already at start/end of list */ - if (dy == -1 * SCROLL_LINE && first_entry == 0) - dy = -1; - else if (dy == +1 * SCROLL_LINE && - first_entry + num_page_entries == max_setup_info) - dy = 1; - - /* handle scrolling screen one line or page */ - if (y + dy < 0 || - y + dy > num_page_entries - 1) - { - boolean redraw = FALSE; - - if (ABS(dy) == SCROLL_PAGE) - step = num_page_entries - 1; - - if (dy < 0 && first_entry > 0) - { - /* scroll page/line up */ - - first_entry -= step; - if (first_entry < 0) - first_entry = 0; - - redraw = TRUE; - } - else if (dy > 0 && first_entry + num_page_entries < max_setup_info) - { - /* scroll page/line down */ - - first_entry += step; - if (first_entry + num_page_entries > max_setup_info) - first_entry = MAX(0, max_setup_info - num_page_entries); - - redraw = TRUE; - } - - if (redraw) - { - choice += first_entry - first_entry_store[setup_mode]; - - if (choice < first_entry) - { - choice = first_entry; - - if (setup_info[choice].type & TYPE_SKIP_ENTRY) - choice++; - } - else if (choice > first_entry + num_page_entries - 1) - { - choice = first_entry + num_page_entries - 1; - - if (setup_info[choice].type & TYPE_SKIP_ENTRY) - choice--; - } - else if (setup_info[choice].type & TYPE_SKIP_ENTRY) - { - choice += SIGN(dy); - - if (choice < first_entry || - choice > first_entry + num_page_entries - 1) - first_entry += SIGN(dy); - } - - first_entry_store[setup_mode] = first_entry; - choice_store[setup_mode] = choice; - - drawSetupInfoList(setup_info, first_entry, NUM_MENU_ENTRIES_ON_SCREEN); - - DrawCursorAndText_Setup(choice - first_entry, choice, TRUE); - - AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_setup_info, - NUM_MENU_ENTRIES_ON_SCREEN, first_entry); - } - - return; - } - - if (dx) - { - int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER); - - if (setup_info[choice].type & menu_navigation_type || - setup_info[choice].type & TYPE_BOOLEAN_STYLE || - setup_info[choice].type & TYPE_YES_NO_AUTO) - button = MB_MENU_CHOICE; - } - else if (dy) - y += dy; - - /* jump to next non-empty menu entry (up or down) */ - while (first_entry + y > 0 && - first_entry + y < max_setup_info - 1 && - setup_info[first_entry + y].type & TYPE_SKIP_ENTRY) - y += dy; - - if (!IN_VIS_MENU(x, y)) - { - choice += y - y_old; - - if (choice < first_entry) - first_entry = choice; - else if (choice > first_entry + num_page_entries - 1) - first_entry = choice - num_page_entries + 1; - - if (first_entry >= 0 && - first_entry + num_page_entries <= max_setup_info) - { - first_entry_store[setup_mode] = first_entry; - - if (choice < first_entry) - choice = first_entry; - else if (choice > first_entry + num_page_entries - 1) - choice = first_entry + num_page_entries - 1; - - choice_store[setup_mode] = choice; - - drawSetupInfoList(setup_info, first_entry, NUM_MENU_ENTRIES_ON_SCREEN); - - DrawCursorAndText_Setup(choice - first_entry, choice, TRUE); - - AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_setup_info, - NUM_MENU_ENTRIES_ON_SCREEN, first_entry); - } - - return; - } - } - - if (!anyScrollbarGadgetActive() && - IN_VIS_MENU(x, y) && - mx < screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x && - y >= 0 && y < num_page_entries) - { - if (button) - { - if (first_entry + y != choice && - setup_info[first_entry + y].type & ~TYPE_SKIP_ENTRY) - { - PlaySound(SND_MENU_ITEM_ACTIVATING); - - DrawCursorAndText_Setup(choice - first_entry, choice, FALSE); - DrawCursorAndText_Setup(y, first_entry + y, TRUE); - - choice = choice_store[setup_mode] = first_entry + y; - } - } - else if (!(setup_info[first_entry + y].type & TYPE_GHOSTED)) - { - PlaySound(SND_MENU_ITEM_SELECTING); - - /* when selecting key headline, execute function for key value change */ - if (setup_info[first_entry + y].type & TYPE_KEYTEXT && - setup_info[first_entry + y + 1].type & TYPE_KEY) - y++; + menu_info = setup_info; - /* when selecting string value, execute function for list selection */ - if (setup_info[first_entry + y].type & TYPE_STRING && y > 0 && - setup_info[first_entry + y - 1].type & TYPE_ENTER_LIST) - y--; - - if (setup_info[first_entry + y].type & TYPE_ENTER_OR_LEAVE) - { - void (*menu_callback_function)(void) = - setup_info[first_entry + y].value; - - FadeSetFromType(setup_info[first_entry + y].type); - - menu_callback_function(); - } - else - { - if (setup_info[first_entry + y].type & TYPE_VALUE) - changeSetupValue(y, first_entry + y, dx); - } - } - } + HandleMenuScreen(mx, my, dx, dy, button, + setup_mode, num_setup_info, max_setup_info); } void DrawSetupScreen_Input() @@ -7003,6 +6994,8 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) HandleChooseLevelNr(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_INFO) + HandleInfoScreen(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); break; case SCREEN_CTRL_ID_SCROLL_DOWN: @@ -7012,6 +7005,8 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) HandleChooseLevelNr(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_INFO) + HandleInfoScreen(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); break; case SCREEN_CTRL_ID_SCROLL_VERTICAL: @@ -7021,6 +7016,8 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) HandleChooseLevelNr(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE); + else if (game_status == GAME_MODE_INFO) + HandleInfoScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE); break; default: