1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Add text input event to remaining numerical fields

This commit is contained in:
Aaron van Geffen
2024-09-11 17:20:08 +02:00
parent fcbe1aaf92
commit d03fbef0e7
3 changed files with 205 additions and 61 deletions

View File

@@ -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 #

View File

@@ -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,

View File

@@ -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<int16_t>(1);
ft.Add<int16_t>(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<int16_t>(BaseZToMetres(kMinimumLandHeight));
ft.Add<int16_t>(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<int16_t>(BaseZToMetres(kMinimumLandHeight));
ft.Add<int16_t>(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<int32_t>(0);
ft.Add<int32_t>(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<int16_t>(1);
ft.Add<int16_t>(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<int16_t>(BaseZToMetres(kMinimumLandHeight));
ft.Add<int16_t>(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<int16_t>(BaseZToMetres(kMinimumLandHeight));
ft.Add<int16_t>(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);
}
}