X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=fbe8007298591b372fb1386f81bace9f1e10e645;hb=22f539028eb272b70d339e1f37552a2a89f37dd6;hp=25b3bfd886dc3f83ef92f240d7658087d59cb59d;hpb=00e3ab259639fb01724dfc0f0bb96e06f54494e8;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 25b3bfd8..fbe80072 100644 --- a/src/screens.c +++ b/src/screens.c @@ -32,13 +32,14 @@ #define SETUP_MODE_SHORTCUT_1 4 #define SETUP_MODE_SHORTCUT_2 5 #define SETUP_MODE_GRAPHICS 6 -#define SETUP_MODE_SOUND 7 -#define SETUP_MODE_ARTWORK 8 -#define SETUP_MODE_CHOOSE_GRAPHICS 9 -#define SETUP_MODE_CHOOSE_SOUNDS 10 -#define SETUP_MODE_CHOOSE_MUSIC 11 +#define SETUP_MODE_CHOOSE_SCREEN_MODE 7 +#define SETUP_MODE_SOUND 8 +#define SETUP_MODE_ARTWORK 9 +#define SETUP_MODE_CHOOSE_GRAPHICS 10 +#define SETUP_MODE_CHOOSE_SOUNDS 11 +#define SETUP_MODE_CHOOSE_MUSIC 12 -#define MAX_SETUP_MODES 12 +#define MAX_SETUP_MODES 13 /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -121,6 +122,7 @@ static void HandleSetupScreen_Generic(int, int, int, int, int); static void HandleSetupScreen_Input(int, int, int, int, int); static void CustomizeKeyboard(int); static void CalibrateJoystick(int); +static void execSetupGraphics(void); static void execSetupArtwork(void); static void HandleChooseTree(int, int, int, int, int, TreeInfo **); @@ -146,6 +148,9 @@ static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; static int setup_mode = SETUP_MODE_MAIN; static int info_mode = INFO_MODE_MAIN; +static TreeInfo *screen_modes = NULL; +static TreeInfo *screen_mode_current = NULL; + #define DRAW_OFFSET_MODE(x) (x >= GAME_MODE_MAIN && \ x <= GAME_MODE_SETUP ? x : \ x == GAME_MODE_PSEUDO_TYPENAME ? \ @@ -226,12 +231,20 @@ void DrawHeadline() static void ToggleFullscreenIfNeeded() { - if (setup.fullscreen != video.fullscreen_enabled) + if (setup.fullscreen != video.fullscreen_enabled || + setup.fullscreen_mode != video.fullscreen_mode_current) { /* save old door content */ BlitBitmap(backbuffer, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); + if (setup.fullscreen && video.fullscreen_enabled) + { + /* keep fullscreen mode, but change screen mode */ + video.fullscreen_mode_current = setup.fullscreen_mode; + video.fullscreen_enabled = FALSE; + } + /* toggle fullscreen */ ChangeVideoModeIfNeeded(setup.fullscreen); setup.fullscreen = video.fullscreen_enabled; @@ -1034,9 +1047,9 @@ static void DrawInfoScreen_Main(int fade_delay) DrawText(mSX + xpos * 32, mSY + ypos * 32, info_info[i].text, font_nr); - if (info_info[i].type & TYPE_ENTER_MENU) + 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) + 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); @@ -1109,7 +1122,7 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) { if (dx) { - int menu_navigation_type = (dx < 0 ? TYPE_LEAVE_MENU : TYPE_ENTER_MENU); + int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER); if (info_info[choice].type & menu_navigation_type || info_info[choice].type & TYPE_ENTER_SCREEN || @@ -1139,7 +1152,7 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) } else if (!(info_info[y].type & TYPE_GHOSTED)) { - if (info_info[y].type & TYPE_ENTER_OR_LEAVE_MENU) + if (info_info[y].type & TYPE_ENTER_OR_LEAVE) { void (*menu_callback_function)(void) = info_info[choice].value; @@ -2059,11 +2072,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, #endif int last_game_status = game_status; /* save current game status */ - title_string = - (ti->type == TREE_TYPE_LEVEL_DIR ? "Level Sets" : - ti->type == TREE_TYPE_GRAPHICS_DIR ? "Custom Graphics" : - ti->type == TREE_TYPE_SOUNDS_DIR ? "Custom Sounds" : - ti->type == TREE_TYPE_MUSIC_DIR ? "Custom Music" : ""); + title_string = ti->infotext; #if 1 DrawTextSCentered(mSY - SY + yoffset, FONT_TITLE_1, title_string); @@ -2213,7 +2222,13 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else if (game_status == GAME_MODE_SETUP) { - execSetupArtwork(); + if (game_status == GAME_MODE_SETUP) + { + if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) + execSetupGraphics(); + else + execSetupArtwork(); + } } else { @@ -2366,7 +2381,10 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (game_status == GAME_MODE_SETUP) { - execSetupArtwork(); + if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) + execSetupGraphics(); + else + execSetupArtwork(); } else { @@ -2518,6 +2536,7 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) static struct TokenInfo *setup_info; static int num_setup_info; +static char *screen_mode_text; static char *graphics_set_name; static char *sounds_set_name; static char *music_set_name; @@ -2542,10 +2561,75 @@ static void execSetupEditor() static void execSetupGraphics() { + if (video.fullscreen_available && screen_modes == NULL) + { + int i; + + for (i = 0; video.fullscreen_modes[i].width != -1; i++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); + char identifier[20], name[20]; + int x = video.fullscreen_modes[i].width; + int y = video.fullscreen_modes[i].height; + int xx, yy; + + get_aspect_ratio_from_screen_mode(&video.fullscreen_modes[i], &xx, &yy); + + ti->node_top = &screen_modes; + ti->sort_priority = x * y; + + sprintf(identifier, "%dx%d", x, y); + sprintf(name, "%d x %d [%d:%d]", x, y, xx, yy); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + setString(&ti->infotext, "Fullscreen Mode"); + + pushTreeInfo(&screen_modes, ti); + } + + /* sort fullscreen modes to start with lowest available screen resolution */ + sortTreeInfo(&screen_modes); + + /* set current screen mode for fullscreen mode to configured setup value */ + screen_mode_current = getTreeInfoFromIdentifier(screen_modes, + setup.fullscreen_mode); + + /* if that fails, set current screen mode to reliable default value */ + if (screen_mode_current == NULL) + screen_mode_current = getTreeInfoFromIdentifier(screen_modes, + DEFAULT_FULLSCREEN_MODE); + + /* if that also fails, set current screen mode to first available mode */ + if (screen_mode_current == NULL) + screen_mode_current = screen_modes; + + if (screen_mode_current == NULL) + video.fullscreen_available = FALSE; + } + + if (video.fullscreen_available) + { + setup.fullscreen_mode = screen_mode_current->identifier; + + /* needed for displaying screen mode name instead of identifier */ + screen_mode_text = screen_mode_current->name; + } + setup_mode = SETUP_MODE_GRAPHICS; DrawSetupScreen(); } +static void execSetupChooseScreenMode() +{ + if (!video.fullscreen_available) + return; + + setup_mode = SETUP_MODE_CHOOSE_SCREEN_MODE; + DrawSetupScreen(); +} + static void execSetupSound() { setup_mode = SETUP_MODE_SOUND; @@ -2683,7 +2767,9 @@ static struct TokenInfo setup_info_editor[] = static struct TokenInfo setup_info_graphics[] = { - { TYPE_SWITCH, &setup.fullscreen, "Fullscreen Mode:" }, + { TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" }, + { TYPE_ENTER_LIST, execSetupChooseScreenMode, "Fullscreen Mode:" }, + { TYPE_STRING, &screen_mode_text, "" }, { TYPE_SWITCH, &setup.scroll_delay, "Delayed Scrolling:" }, #if 0 { TYPE_SWITCH, &setup.soft_scrolling, "Soft Scrolling:" }, @@ -2714,11 +2800,11 @@ static struct TokenInfo setup_info_sound[] = static struct TokenInfo setup_info_artwork[] = { - { TYPE_ENTER_MENU, execSetupChooseGraphics,"Custom Graphics" }, + { TYPE_ENTER_LIST, execSetupChooseGraphics,"Custom Graphics:" }, { TYPE_STRING, &graphics_set_name, "" }, - { TYPE_ENTER_MENU, execSetupChooseSounds, "Custom Sounds" }, + { TYPE_ENTER_LIST, execSetupChooseSounds, "Custom Sounds:" }, { TYPE_STRING, &sounds_set_name, "" }, - { TYPE_ENTER_MENU, execSetupChooseMusic, "Custom Music" }, + { TYPE_ENTER_LIST, execSetupChooseMusic, "Custom Music:" }, { TYPE_STRING, &music_set_name, "" }, { TYPE_EMPTY, NULL, "" }, #if 1 @@ -2825,7 +2911,8 @@ static int getSetupTextFont(int type) TYPE_YES_NO | TYPE_STRING | TYPE_ECS_AGA | - TYPE_KEYTEXT)) + TYPE_KEYTEXT | + TYPE_ENTER_LIST)) return FONT_MENU_2; else return FONT_MENU_1; @@ -3063,7 +3150,8 @@ static void DrawSetupScreen_Generic() 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 == &setup.fullscreen && !video.fullscreen_available) || + (value_ptr == &screen_mode_text && !video.fullscreen_available)) setup_info[i].type |= TYPE_GHOSTED; #if 1 @@ -3084,9 +3172,9 @@ static void DrawSetupScreen_Generic() DrawText(mSX + xpos * 32, mSY + ypos * 32, setup_info[i].text, font_nr); - if (setup_info[i].type & TYPE_ENTER_MENU) + if (setup_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST)) initCursor(i, IMG_MENU_BUTTON_ENTER_MENU); - else if (setup_info[i].type & TYPE_LEAVE_MENU) + else if (setup_info[i].type & (TYPE_LEAVE_MENU|TYPE_LEAVE_LIST)) initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU); else if (setup_info[i].type & ~TYPE_SKIP_ENTRY) initCursor(i, IMG_MENU_BUTTON); @@ -3123,6 +3211,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) choice_store[setup_mode] = choice; drawCursor(choice, FC_RED); + return; } else if (button == MB_MENU_LEAVE) @@ -3134,6 +3223,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) void (*menu_callback_function)(void) = setup_info[y].value; menu_callback_function(); + break; /* absolutely needed because function changes 'setup_info'! */ } } @@ -3150,7 +3240,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) { if (dx) { - int menu_navigation_type = (dx < 0 ? TYPE_LEAVE_MENU : TYPE_ENTER_MENU); + 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) @@ -3165,6 +3255,44 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) y += dy; } +#if 1 + if (IN_VIS_FIELD(x, y) && y >= 0 && y < num_setup_info) + { + if (button) + { + if (y != choice && setup_info[y].type & ~TYPE_SKIP_ENTRY) + { + drawCursor(y, FC_RED); + drawCursor(choice, FC_BLUE); + choice = choice_store[setup_mode] = y; + } + } + else if (!(setup_info[y].type & TYPE_GHOSTED)) + { + /* when selecting key headline, execute function for key value change */ + if (setup_info[y].type & TYPE_KEYTEXT && + setup_info[y + 1].type & TYPE_KEY) + y++; + + /* when selecting string value, execute function for list selection */ + if (setup_info[y].type & TYPE_STRING && y > 0 && + setup_info[y - 1].type & TYPE_ENTER_LIST) + y--; + + if (setup_info[y].type & TYPE_ENTER_OR_LEAVE) + { + void (*menu_callback_function)(void) = setup_info[y].value; + + menu_callback_function(); + } + else + { + if (setup_info[y].type & TYPE_VALUE) + changeSetupValue(y); + } + } + } +#else if (IN_VIS_FIELD(x, y) && y >= 0 && y < num_setup_info && setup_info[y].type & ~TYPE_SKIP_ENTRY) { @@ -3179,7 +3307,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) } else if (!(setup_info[y].type & TYPE_GHOSTED)) { - if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU) + if (setup_info[y].type & TYPE_ENTER_OR_LEAVE) { void (*menu_callback_function)(void) = setup_info[choice].value; @@ -3196,6 +3324,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) } } } +#endif } void DrawSetupScreen_Input() @@ -3847,6 +3976,8 @@ void DrawSetupScreen() if (setup_mode == SETUP_MODE_INPUT) DrawSetupScreen_Input(); + else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) + DrawChooseTree(&screen_mode_current); else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS) DrawChooseTree(&artwork.gfx_current); else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS) @@ -3864,6 +3995,8 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) { if (setup_mode == SETUP_MODE_INPUT) HandleSetupScreen_Input(mx, my, dx, dy, button); + else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) + HandleChooseTree(mx, my, dx, dy, button, &screen_mode_current); else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS) HandleChooseTree(mx, my, dx, dy, button, &artwork.gfx_current); else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS) @@ -4179,6 +4312,10 @@ static void CreateScreenScrollbars() GDI_SCROLLBAR_ITEMS_MAX, items_max, GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible, GDI_SCROLLBAR_ITEM_POSITION, item_position, + GDI_WHEEL_AREA_X, 0, + GDI_WHEEL_AREA_Y, 0, + GDI_WHEEL_AREA_WIDTH, WIN_XSIZE, + GDI_WHEEL_AREA_HEIGHT, WIN_YSIZE, 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,