From d03fbef0e7aeecccbbe3ce75bc05c1856f44b567 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 11 Sep 2024 17:20:08 +0200 Subject: [PATCH] Add text input event to remaining numerical fields --- data/language/en-GB.txt | 15 ++ src/openrct2-ui/UiStringIds.h | 21 ++- src/openrct2-ui/windows/MapGen.cpp | 230 +++++++++++++++++++++-------- 3 files changed, 205 insertions(+), 61 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 8454248cbc..57838fda54 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3762,6 +3762,21 @@ STR_6687 :Tree to land ratio: STR_6688 :Min. tree altitude: STR_6689 :Max. tree altitude: STR_6690 :{UINT16}% +STR_6691 :Minimum land height +STR_6692 :Enter min. land height between {COMMA16} and {COMMA16} +STR_6693 :Maximum land height +STR_6694 :Enter max. land height between {COMMA16} and {COMMA16} +STR_6695 :Minimum tree altitude +STR_6696 :Enter min. tree altitude between {COMMA16} and {COMMA16} +STR_6697 :Maximum tree altitude +STR_6698 :Enter max. tree altitude between {COMMA16} and {COMMA16} +STR_6699 :Tree to land ratio +STR_6700 :Enter tree to land ratio between {COMMA16} and {COMMA16} +STR_6701 :Simplex Base Frequency +STR_6702 :Enter Base Frequency between {COMMA2DP32} and {COMMA2DP32} +STR_6703 :Simplex Octaves +STR_6704 :Enter Octaves between {COMMA16} and {COMMA16} +STR_6705 :{COMMA2DP32} ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 27a76ab70e..905768225e 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -36,6 +36,7 @@ namespace OpenRCT2 STR_ENTER_PARK_NAME = 1719, STR_ENTER_SELECTION_SIZE = 5129, STR_ERROR_INVALID_CHARACTERS = 5243, + STR_FORMAT_COMMA2DP32 = 6705, STR_FORMAT_INTEGER = 5182, STR_GRAPH_LABEL = 2222, STR_LIGHTPINK_STRINGID = 5299, @@ -896,10 +897,17 @@ namespace OpenRCT2 STR_SHOW_RIDES_STALLS_ON_MAP_TIP = 3144, // Window: MapGen - STR_BEACHES_WATER_BODIES = 6677, STR_BASE_HEIGHT = 5183, STR_BASE_HEIGHT_LABEL = 2691, + STR_BEACHES_WATER_BODIES = 6677, + STR_ENTER_BASE_FREQUENCY = 6702, STR_ENTER_BASE_HEIGHT = 5184, + STR_ENTER_MAX_LAND = 6694, + STR_ENTER_MAX_TREE_ALTITUDE = 6698, + STR_ENTER_MIN_LAND = 6692, + STR_ENTER_MIN_TREE_ALTITUDE = 6696, + STR_ENTER_OCTAVES = 6704, + STR_ENTER_TREE_TO_LAND_RATIO = 6700, STR_ENTER_WATER_LEVEL = 5186, STR_HEIGHTMAP_FILE = 6682, STR_HEIGHTMAP_FLATLAND = 6679, @@ -911,14 +919,14 @@ namespace OpenRCT2 STR_MAPGEN_CAPTION_GENERATOR = 6683, STR_MAPGEN_CAPTION_TERRAIN = 6684, STR_MAPGEN_CAPTION_WATER = 6685, + STR_MAPGEN_MAX_LAND_HEIGHT = 2687, + STR_MAPGEN_MIN_LAND_HEIGHT = 2686, STR_MAPGEN_NORMALIZE = 6046, STR_MAPGEN_OPTION_PLACE_TREES = 2696, STR_MAPGEN_OPTION_RANDOM_TERRAIN = 2695, STR_MAPGEN_SELECT_HEIGHTMAP = 6043, STR_MAPGEN_SIMPLEX_NOISE = 2685, STR_MAPGEN_SIMPLEX_NOISE_BASE_FREQUENCY = 2688, - STR_MAPGEN_MAX_LAND_HEIGHT = 2687, - STR_MAPGEN_MIN_LAND_HEIGHT = 2686, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES = 2689, STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, STR_MAPGEN_SMOOTH_STRENGTH = 6045, @@ -927,7 +935,14 @@ namespace OpenRCT2 STR_MAPGEN_TREE_MIN_ALTITUDE = 6688, STR_MAPGEN_TREE_TO_LAND_RATIO = 6687, STR_MAPGEN_TREE_TO_LAND_RATIO_PCT = 6690, + STR_MAX_LAND_HEIGHT = 6693, + STR_MAX_TREE_ALTITUDE = 6697, + STR_MIN_LAND_HEIGHT = 6691, + STR_MIN_TREE_ALTITUDE = 6695, + STR_SIMPLEX_BASE_FREQUENCY = 6701, + STR_SIMPLEX_OCTAVES = 6703, STR_TERRAIN_LABEL = 2693, + STR_TREE_TO_LAND_RATIO = 6695, STR_WATER_LEVEL = 5185, STR_WATER_LEVEL_LABEL = 2692, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 99353989c9..e6cdad04ae 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -454,7 +454,9 @@ namespace OpenRCT2::Ui::Windows { SharedMouseUp(widgetIndex); - if (_settings.algorithm == MapGenAlgorithm::heightmapImage) + if (_settings.algorithm == MapGenAlgorithm::simplexNoise) + SimplexMouseUp(widgetIndex); + else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) HeightmapMouseUp(widgetIndex); switch (widgetIndex) @@ -549,18 +551,10 @@ namespace OpenRCT2::Ui::Windows } } - void BaseTextInput(WidgetIndex widgetIndex, std::string_view text) + void BaseTextInput(WidgetIndex widgetIndex, int32_t value) { - int32_t value; - char* end; - - const auto strText = u8string(text); - value = strtol(strText.c_str(), &end, 10); - - if (*end != '\0') - { - return; - } + if (_settings.algorithm == MapGenAlgorithm::simplexNoise) + SimplexTextInput(widgetIndex, value); switch (widgetIndex) { @@ -687,6 +681,39 @@ namespace OpenRCT2::Ui::Windows case WIDX_FORESTS_PLACE_TREES: _settings.trees ^= true; break; + + case WIDX_TREE_LAND_RATIO: + { + Formatter ft; + ft.Add(1); + ft.Add(50); + WindowTextInputOpen( + this, widgetIndex, STR_TREE_TO_LAND_RATIO, STR_ENTER_TREE_TO_LAND_RATIO, ft, STR_FORMAT_INTEGER, + _settings.treeToLandRatio, 2); + break; + } + + case WIDX_TREE_ALTITUDE_MIN: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MIN_TREE_ALTITUDE, STR_ENTER_MIN_TREE_ALTITUDE, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.minTreeAltitude), 6); + break; + } + + case WIDX_TREE_ALTITUDE_MAX: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MAX_TREE_ALTITUDE, STR_ENTER_MAX_TREE_ALTITUDE, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.maxTreeAltitude), 6); + break; + } } } @@ -731,6 +758,28 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_2); } + void ForestsTextInput(WidgetIndex widgetIndex, int32_t rawValue, int32_t value) + { + switch (widgetIndex) + { + case WIDX_TREE_LAND_RATIO: + _settings.treeToLandRatio = std::clamp(rawValue, 1, 50); + break; + + case WIDX_TREE_ALTITUDE_MIN: + _settings.minTreeAltitude = value; + _settings.maxTreeAltitude = std::max(_settings.minTreeAltitude, _settings.maxTreeAltitude); + break; + + case WIDX_TREE_ALTITUDE_MAX: + _settings.maxTreeAltitude = value; + _settings.minTreeAltitude = std::min(_settings.minTreeAltitude, _settings.maxTreeAltitude); + break; + } + + Invalidate(); + } + void ForestsPrepareDraw() { if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_FORESTS]) @@ -794,6 +843,34 @@ namespace OpenRCT2::Ui::Windows #pragma region Simplex settings, part of generator tab + void SimplexMouseUp(WidgetIndex widgetIndex) + { + switch (widgetIndex) + { + case WIDX_SIMPLEX_BASE_FREQ: + { + Formatter ft; + ft.Add(0); + ft.Add(1000); + WindowTextInputOpen( + this, widgetIndex, STR_SIMPLEX_BASE_FREQUENCY, STR_ENTER_BASE_FREQUENCY, ft, STR_FORMAT_COMMA2DP32, + _settings.simplex_base_freq, 4); + break; + } + + case WIDX_SIMPLEX_OCTAVES: + { + Formatter ft; + ft.Add(1); + ft.Add(10); + WindowTextInputOpen( + this, widgetIndex, STR_SIMPLEX_OCTAVES, STR_ENTER_OCTAVES, ft, STR_FORMAT_INTEGER, + _settings.simplex_octaves, 10); + break; + } + } + } + void SimplexMouseDown(WidgetIndex widgetIndex, Widget* widget) { switch (widgetIndex) @@ -846,6 +923,20 @@ namespace OpenRCT2::Ui::Windows STR_COMMA16, ft, { textColour }); } + void SimplexTextInput(WidgetIndex widgetIndex, int32_t value) + { + switch (widgetIndex) + { + case WIDX_SIMPLEX_BASE_FREQ: + _settings.simplex_base_freq = std::clamp(value, 0, 1000); + break; + + case WIDX_SIMPLEX_OCTAVES: + _settings.simplex_octaves = std::clamp(value, 1, 10); + break; + } + } + #pragma endregion #pragma region Heightmap settings, part of generator tab @@ -941,6 +1032,29 @@ namespace OpenRCT2::Ui::Windows BaseZToMetres(_settings.baseHeight), 6); break; } + + case WIDX_HEIGHTMAP_LOW: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MIN_LAND_HEIGHT, STR_ENTER_MIN_LAND, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.heightmapLow), 6); + break; + } + + case WIDX_HEIGHTMAP_HIGH: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MAX_LAND_HEIGHT, STR_ENTER_MAX_LAND, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.heightmapHigh), 6); + break; + } + case WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES: _settings.smoothTileEdges = !_settings.smoothTileEdges; SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); @@ -1000,32 +1114,22 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_3); } - void TerrainTextInput(WidgetIndex widgetIndex, std::string_view text) + void TerrainTextInput(WidgetIndex widgetIndex, int32_t value) { - const auto strText = u8string(text); - char* end; - int32_t value = strtol(strText.c_str(), &end, 10); - if (*end != '\0') - { - return; - } - - switch (Config::Get().general.MeasurementFormat) - { - case MeasurementFormat::Imperial: - value = FeetToMetres(value); - [[fallthrough]]; - - default: - value = std::clamp(MetresToBaseZ(value), kMinimumLandHeight, kMaximumLandHeight); - break; - } - switch (widgetIndex) { case WIDX_BASE_HEIGHT: _settings.baseHeight = value; break; + + case WIDX_HEIGHTMAP_LOW: + _settings.heightmapLow = value; + _settings.heightmapHigh = std::max(_settings.heightmapLow, _settings.heightmapHigh); + break; + + case WIDX_HEIGHTMAP_HIGH: + _settings.heightmapHigh = value; + _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh); break; } @@ -1250,30 +1354,8 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_4); } - void WaterTextInput(WidgetIndex widgetIndex, std::string_view text) + void WaterTextInput(WidgetIndex widgetIndex, int32_t value) { - int32_t value; - char* end; - - const auto strText = u8string(text); - value = strtol(strText.c_str(), &end, 10); - - if (*end != '\0') - { - return; - } - - switch (Config::Get().general.MeasurementFormat) - { - case MeasurementFormat::Imperial: - value = FeetToMetres(value); - [[fallthrough]]; - - default: - value = std::clamp(MetresToBaseZ(value), kMinimumWaterHeight, kMaximumWaterHeight); - break; - } - switch (widgetIndex) { case WIDX_WATER_LEVEL: @@ -1428,14 +1510,46 @@ namespace OpenRCT2::Ui::Windows void OnTextInput(WidgetIndex widgetIndex, std::string_view text) override { + auto strText = std::string(text); + char* end; + + // Convert text to integer value + int32_t value{}; + if (page == WINDOW_MAPGEN_PAGE_BASE && widgetIndex == WIDX_SIMPLEX_BASE_FREQ) + value = 100 * strtof(strText.c_str(), &end); + else + value = strtol(strText.c_str(), &end, 10); + + if (*end != '\0') + return; + + // Take care of unit conversion + int32_t rawValue = value; + if (page != WINDOW_MAPGEN_PAGE_BASE) + { + switch (Config::Get().general.MeasurementFormat) + { + case MeasurementFormat::Imperial: + value = FeetToMetres(value); + [[fallthrough]]; + + default: + value = std::clamp(MetresToBaseZ(value), kMinimumLandHeight, kMaximumLandHeight); + break; + } + } + + // Pass on to the actual properties switch (page) { case WINDOW_MAPGEN_PAGE_BASE: - return BaseTextInput(widgetIndex, text); + return BaseTextInput(widgetIndex, value); case WINDOW_MAPGEN_PAGE_TERRAIN: - return TerrainTextInput(widgetIndex, text); + return TerrainTextInput(widgetIndex, value); case WINDOW_MAPGEN_PAGE_WATER: - return WaterTextInput(widgetIndex, text); + return WaterTextInput(widgetIndex, value); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsTextInput(widgetIndex, rawValue, value); } }