diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 3cfc073110..6b570e689c 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3811,3 +3811,10 @@ STR_6763 :RollerCoaster Tycoon 1 STR_6764 :Saving and autosaves STR_6765 :Advanced STR_6766 :Clear +STR_6767 :Window +STR_6768 :Rendering +STR_6769 :Behaviour +STR_6770 :Frame rate limit: +STR_6771 :Internal speed (default) +STR_6772 :Vertical sync +STR_6773 :Unrestricted diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index b5dcae0e37..429d733cec 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -1125,13 +1125,20 @@ namespace OpenRCT2 STR_FAHRENHEIT = 2367, STR_FINANCES_BUTTON_ON_TOOLBAR = 5120, STR_FINANCES_BUTTON_ON_TOOLBAR_TIP = 5838, + STR_FRAME_RATE_LIMIT_DEFAULT = 6771, + STR_FRAME_RATE_LIMIT_LABEL = 6770, + STR_FRAME_RATE_LIMIT_UNRESTRICTED = 6773, + STR_FRAME_RATE_LIMIT_VSYNC = 6772, STR_FULLSCREEN_MODE = 5177, STR_FULLSCREEN_MODE_TIP = 5855, STR_GRIDLINES = 2363, STR_GRIDLINES_TIP = 2364, STR_GROUP_ADVANCED = 6765, + STR_GROUP_BEHAVIOUR = 6769, STR_GROUP_RCT1 = 6763, + STR_GROUP_RENDERING = 6768, STR_GROUP_SAVING = 6764, + STR_GROUP_WINDOW = 6767, STR_HARDWARE_GROUP = 5476, STR_HEIGHT_IN_UNITS = 2358, STR_HEIGHT_LABELS = 2331, diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index c33bec87e0..5af1662d48 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -92,7 +92,7 @@ namespace OpenRCT2::Ui::Windows WIDX_PAGE_START, // Display - WIDX_HARDWARE_GROUP = WIDX_PAGE_START, + WIDX_WINDOW_GROUP = WIDX_PAGE_START, WIDX_FULLSCREEN_LABEL, WIDX_FULLSCREEN, WIDX_FULLSCREEN_DROPDOWN, @@ -103,19 +103,24 @@ namespace OpenRCT2::Ui::Windows WIDX_SCALE, WIDX_SCALE_UP, WIDX_SCALE_DOWN, + + WIDX_RENDERING_GROUP, WIDX_DRAWING_ENGINE_LABEL, WIDX_DRAWING_ENGINE, WIDX_DRAWING_ENGINE_DROPDOWN, - WIDX_STEAM_OVERLAY_PAUSE, - WIDX_UNCAP_FPS_CHECKBOX, + WIDX_FRAME_RATE_LIMIT_LABEL, + WIDX_FRAME_RATE_LIMIT, + WIDX_FRAME_RATE_LIMIT_DROPDOWN, WIDX_SHOW_FPS_CHECKBOX, WIDX_MULTITHREADING_CHECKBOX, - WIDX_USE_VSYNC_CHECKBOX, + + WIDX_BEHAVIOUR_GROUP, + WIDX_STEAM_OVERLAY_PAUSE, WIDX_MINIMIZE_FOCUS_LOSS, WIDX_DISABLE_SCREENSAVER_LOCK, - // Rendering - WIDX_RENDERING_GROUP = WIDX_PAGE_START, + // Map rendering + WIDX_MAP_RENDERING_GROUP = WIDX_PAGE_START, WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, WIDX_UPPER_CASE_BANNERS_CHECKBOX, @@ -261,7 +266,7 @@ namespace OpenRCT2::Ui::Windows static constexpr Widget window_options_display_widgets[] = { MAIN_OPTIONS_WIDGETS, - MakeWidget ({ 5, 53}, {300, 170}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_HARDWARE_GROUP ), // Hardware group + MakeWidget ({ 5, 53}, {300, 64}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_GROUP_WINDOW ), // Window group MakeWidget ({ 10, 67}, {145, 12}, WindowWidgetType::Label, WindowColour::Secondary, STR_FULLSCREEN_MODE, STR_FULLSCREEN_MODE_TIP ), // Fullscreen MakeWidget ({155, 68}, {145, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary ), MakeWidget ({288, 69}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_FULLSCREEN_MODE_TIP ), @@ -269,17 +274,22 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({155, 83}, {145, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_ARG_16_RESOLUTION_X_BY_Y ), MakeWidget ({288, 84}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_DISPLAY_RESOLUTION_TIP ), MakeWidget ({ 10, 98}, {145, 12}, WindowWidgetType::Label, WindowColour::Secondary, STR_UI_SCALING_DESC, STR_WINDOW_SCALE_TIP ), // Scale - MakeSpinnerWidgets({155, 98}, {145, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, kStringIdNone, STR_WINDOW_SCALE_TIP ), // Scale spinner (3 widgets) - MakeWidget ({ 10, 113}, {145, 12}, WindowWidgetType::Label, WindowColour::Secondary, STR_DRAWING_ENGINE, STR_DRAWING_ENGINE_TIP ), // Drawing engine - MakeWidget ({155, 113}, {145, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary ), // Drawing engine - MakeWidget ({288, 114}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_DRAWING_ENGINE_TIP ), - MakeWidget ({ 11, 144}, {280, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_STEAM_OVERLAY_PAUSE, STR_STEAM_OVERLAY_PAUSE_TIP ), // Pause on steam overlay - MakeWidget ({ 11, 161}, {143, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_UNCAP_FPS, STR_UNCAP_FPS_TIP ), // Uncap fps - MakeWidget ({155, 161}, {136, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_SHOW_FPS, STR_SHOW_FPS_TIP ), // Show fps - MakeWidget ({155, 176}, {136, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MULTITHREADING, STR_MULTITHREADING_TIP ), // Multithreading - MakeWidget ({ 11, 176}, {143, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_USE_VSYNC, STR_USE_VSYNC_TIP ), // Use vsync - MakeWidget ({ 11, 191}, {280, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MINIMISE_FULLSCREEN_ON_FOCUS_LOSS, STR_MINIMISE_FULLSCREEN_ON_FOCUS_LOSS_TIP), // Minimise fullscreen focus loss - MakeWidget ({ 11, 206}, {280, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_DISABLE_SCREENSAVER, STR_DISABLE_SCREENSAVER_TIP ), // Disable screensaver + MakeSpinnerWidgets({155, 98}, {145, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, kStringIdNone, STR_WINDOW_SCALE_TIP ), // Scale spinner (3 widgets) + + MakeWidget ({ 5, 121}, {300, 64}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_GROUP_RENDERING ), // Rendering group + MakeWidget ({ 10, 135}, {145, 12}, WindowWidgetType::Label, WindowColour::Secondary, STR_DRAWING_ENGINE, STR_DRAWING_ENGINE_TIP ), // Drawing engine (label) + MakeWidget ({155, 135}, {145, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary ), // Drawing engine (dropdown label) + MakeWidget ({288, 136}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_DRAWING_ENGINE_TIP ), // Drawing engine (chevron) + MakeWidget ({ 10, 150}, {145, 12}, WindowWidgetType::Label, WindowColour::Secondary, STR_FRAME_RATE_LIMIT_LABEL ), // Frame rate limit (label) + MakeWidget ({155, 150}, {145, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary ), // Frame rate limit (dropdown label) + MakeWidget ({288, 151}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH ), // Frame rate limit (chevron) + MakeWidget ({ 10, 166}, {136, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_SHOW_FPS, STR_SHOW_FPS_TIP ), // Show fps + MakeWidget ({155, 166}, {136, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MULTITHREADING, STR_MULTITHREADING_TIP ), // Multithreading + + MakeWidget ({ 5, 188}, {300, 64}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_GROUP_BEHAVIOUR ), // Behaviour group + MakeWidget ({ 11, 203}, {280, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_STEAM_OVERLAY_PAUSE, STR_STEAM_OVERLAY_PAUSE_TIP ), // Pause on steam overlay + MakeWidget ({ 11, 218}, {280, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MINIMISE_FULLSCREEN_ON_FOCUS_LOSS, STR_MINIMISE_FULLSCREEN_ON_FOCUS_LOSS_TIP), // Minimise fullscreen focus loss + MakeWidget ({ 11, 233}, {280, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_DISABLE_SCREENSAVER, STR_DISABLE_SCREENSAVER_TIP ), // Disable screensaver }; constexpr int32_t kFrameRenderingStart = 53; @@ -739,18 +749,6 @@ namespace OpenRCT2::Ui::Windows { switch (widgetIndex) { - case WIDX_UNCAP_FPS_CHECKBOX: - Config::Get().general.UncapFPS ^= 1; - DrawingEngineSetVSync(Config::Get().general.UseVSync); - Config::Save(); - Invalidate(); - break; - case WIDX_USE_VSYNC_CHECKBOX: - Config::Get().general.UseVSync ^= 1; - DrawingEngineSetVSync(Config::Get().general.UseVSync); - Config::Save(); - Invalidate(); - break; case WIDX_SHOW_FPS_CHECKBOX: Config::Get().general.ShowFPS ^= 1; Config::Save(); @@ -857,6 +855,27 @@ namespace OpenRCT2::Ui::Windows ContextTriggerResize(); ContextUpdateCursorScale(); break; + case WIDX_FRAME_RATE_LIMIT_DROPDOWN: + { + gDropdownItems[0].Format = STR_DROPDOWN_MENU_LABEL; + gDropdownItems[1].Format = STR_DROPDOWN_MENU_LABEL; + gDropdownItems[2].Format = STR_DROPDOWN_MENU_LABEL; + gDropdownItems[0].Args = STR_FRAME_RATE_LIMIT_DEFAULT; + gDropdownItems[1].Args = STR_FRAME_RATE_LIMIT_VSYNC; + gDropdownItems[2].Args = STR_FRAME_RATE_LIMIT_UNRESTRICTED; + + ShowDropdown(widget, 3); + + auto& config = Config::Get().general; + auto activeItem = 0; + if (config.UncapFPS) + { + activeItem = config.UseVSync ? 1 : 2; + } + + Dropdown::SetChecked(activeItem, true); + break; + } } } @@ -882,8 +901,8 @@ namespace OpenRCT2::Ui::Windows Config::Save(); GfxInvalidateScreen(); } + break; } - break; case WIDX_FULLSCREEN_DROPDOWN: if (dropdownIndex != Config::Get().general.FullscreenMode) { @@ -905,6 +924,30 @@ namespace OpenRCT2::Ui::Windows Invalidate(); } break; + case WIDX_FRAME_RATE_LIMIT_DROPDOWN: + { + auto& config = Config::Get().general; + switch (dropdownIndex) + { + case 0: // vanilla + config.UncapFPS = 0; + config.UseVSync = 0; + break; + case 1: // vsync + config.UncapFPS = 1; + config.UseVSync = 1; + break; + case 2: // uncapped + config.UncapFPS = 1; + config.UseVSync = 0; + break; + } + + DrawingEngineSetVSync(config.UseVSync); + Config::Save(); + Invalidate(); + break; + } } } @@ -930,8 +973,6 @@ namespace OpenRCT2::Ui::Windows disabled_widgets &= ~(1uLL << WIDX_RESOLUTION_LABEL); } - SetCheckboxValue(WIDX_UNCAP_FPS_CHECKBOX, Config::Get().general.UncapFPS); - SetCheckboxValue(WIDX_USE_VSYNC_CHECKBOX, Config::Get().general.UseVSync); SetCheckboxValue(WIDX_SHOW_FPS_CHECKBOX, Config::Get().general.ShowFPS); SetCheckboxValue(WIDX_MULTITHREADING_CHECKBOX, Config::Get().general.MultiThreading); SetCheckboxValue(WIDX_MINIMIZE_FOCUS_LOSS, Config::Get().general.MinimizeFullscreenFocusLoss); @@ -941,6 +982,20 @@ namespace OpenRCT2::Ui::Windows // Dropdown captions for straightforward strings. widgets[WIDX_FULLSCREEN].text = FullscreenModeNames[Config::Get().general.FullscreenMode]; widgets[WIDX_DRAWING_ENGINE].text = kDrawingEngineStringIds[EnumValue(Config::Get().general.DrawingEngine)]; + + static constexpr StringId kFrameRateLimitStringIds[] = { + STR_FRAME_RATE_LIMIT_DEFAULT, + STR_FRAME_RATE_LIMIT_VSYNC, + STR_FRAME_RATE_LIMIT_UNRESTRICTED, + }; + + auto& config = Config::Get().general; + auto activeItem = 0; + if (config.UncapFPS) + { + activeItem = config.UseVSync ? 1 : 2; + } + widgets[WIDX_FRAME_RATE_LIMIT].text = kFrameRateLimitStringIds[activeItem]; } void DisplayDraw(RenderTarget& rt)