1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 20:43:04 +01:00

Make map size spinners in mapgen window functional

This commit is contained in:
Hielke Morsink
2022-06-05 00:25:00 +02:00
parent 7f2f27e826
commit 6d04e21518

View File

@@ -136,8 +136,8 @@ static rct_widget MapWidgets[] = {
SHARED_WIDGETS,
MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ),
MakeSpinnerWidgets({104, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets
MakeWidget ({155, 52}, {20, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_G2_LINK_CHAIN, STR_MAINTAIN_SQUARE_MAP_TOOLTIP),
MakeSpinnerWidgets({176, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets
MakeWidget ({155, 52}, {21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_G2_LINK_CHAIN, STR_MAINTAIN_SQUARE_MAP_TOOLTIP),
MakeSpinnerWidgets({177, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets
MakeSpinnerWidgets({104, 70}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets
MakeSpinnerWidgets({104, 88}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets
MakeWidget ({104, 106}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ),
@@ -162,8 +162,8 @@ static rct_widget SimplexWidgets[] = {
MakeSpinnerWidgets({104, 106}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN}
MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN}
MakeSpinnerWidgets({104, 148}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // WIDX_SIMPLEX_MAP_SIZE_Y{,_UP,_DOWN}
MakeWidget ({155, 148}, { 20, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_G2_LINK_CHAIN, STR_MAINTAIN_SQUARE_MAP_TOOLTIP), // WIDX_SIMPLEX_MAP_SIZE_LINK
MakeSpinnerWidgets({176, 148}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // WIDX_SIMPLEX_MAP_SIZE_X{,_UP,_DOWN}
MakeWidget ({155, 148}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_G2_LINK_CHAIN, STR_MAINTAIN_SQUARE_MAP_TOOLTIP), // WIDX_SIMPLEX_MAP_SIZE_LINK
MakeSpinnerWidgets({177, 148}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // WIDX_SIMPLEX_MAP_SIZE_X{,_UP,_DOWN}
MakeSpinnerWidgets({104, 166}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_WATER_LEVEL{,_UP,_DOWN}
MakeWidget ({104, 190}, { 95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), // WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX
MakeWidget ({102, 202}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), // WIDX_SIMPLEX_FLOOR_TEXTURE
@@ -408,6 +408,17 @@ static bool _heightmapSmoothTiles = true;
static int32_t _heightmapLow = 2;
static int32_t _heightmapHigh = 70;
static void WindowMapgenChangeMapSize(int32_t sizeOffset)
{
if (_mapWidthAndHeightLinked)
_resizeDirection = ResizeDirection::Both;
if (_resizeDirection != ResizeDirection::X)
_mapSize.y = std::clamp(_mapSize.y + sizeOffset, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL);
if (_resizeDirection != ResizeDirection::Y)
_mapSize.x = std::clamp(_mapSize.x + sizeOffset, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL);
}
rct_window* WindowMapgenOpen()
{
rct_window* w = window_bring_to_front_by_class(WC_MAPGEN);
@@ -455,6 +466,17 @@ static void WindowMapgenSharedMouseup(rct_window* w, rct_widgetindex widgetIndex
}
}
static void WindowMapgenInputMapSize(rct_window* w, rct_widgetindex callingWidget, int32_t currentValue)
{
Formatter ft;
ft.Add<int16_t>(MINIMUM_MAP_SIZE_PRACTICAL);
ft.Add<int16_t>(MAXIMUM_MAP_SIZE_PRACTICAL);
// Practical map size is 2 lower than the technical map size
currentValue -= 2;
WindowTextInputOpen(w, callingWidget, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, currentValue, 4);
}
#pragma region Base page
static void WindowMapgenBaseMouseup(rct_window* w, rct_widgetindex widgetIndex)
@@ -476,18 +498,15 @@ static void WindowMapgenBaseMouseup(rct_window* w, rct_widgetindex widgetIndex)
gfx_invalidate_screen();
break;
case WIDX_MAP_SIZE_Y:
ft.Add<int16_t>(MINIMUM_MAP_SIZE_PRACTICAL);
ft.Add<int16_t>(MAXIMUM_MAP_SIZE_PRACTICAL);
// Practical map size is 2 lower than the technical map size
WindowTextInputOpen(
w, WIDX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.y - 2, 4);
_resizeDirection = ResizeDirection::Y;
WindowMapgenInputMapSize(w, WIDX_MAP_SIZE_Y, _mapSize.y);
break;
case WIDX_MAP_SIZE_X: // TODO: Dedupe code - handle similar to Map.cpp
ft.Add<int16_t>(MINIMUM_MAP_SIZE_PRACTICAL);
ft.Add<int16_t>(MAXIMUM_MAP_SIZE_PRACTICAL);
// Practical map size is 2 lower than the technical map size
WindowTextInputOpen(
w, WIDX_MAP_SIZE_X, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.x - 2, 4);
case WIDX_MAP_SIZE_X:
_resizeDirection = ResizeDirection::X;
WindowMapgenInputMapSize(w, WIDX_MAP_SIZE_X, _mapSize.x);
break;
case WIDX_MAP_SIZE_LINK:
_mapWidthAndHeightLinked = !_mapWidthAndHeightLinked;
break;
case WIDX_BASE_HEIGHT:
ft.Add<int16_t>((BASESIZE_MIN - 12) / 2);
@@ -509,19 +528,23 @@ static void WindowMapgenBaseMousedown(rct_window* w, rct_widgetindex widgetIndex
switch (widgetIndex)
{
case WIDX_MAP_SIZE_Y_UP:
_mapSize.y = std::min(_mapSize.y + 1, MAXIMUM_MAP_SIZE_TECHNICAL);
_resizeDirection = ResizeDirection::Y;
WindowMapgenChangeMapSize(+1);
w->Invalidate();
break;
case WIDX_MAP_SIZE_Y_DOWN:
_mapSize.y = std::max(_mapSize.y - 1, MINIMUM_MAP_SIZE_TECHNICAL);
_resizeDirection = ResizeDirection::Y;
WindowMapgenChangeMapSize(-1);
w->Invalidate();
break;
case WIDX_MAP_SIZE_X_UP:
_mapSize.x = std::min(_mapSize.x + 1, MAXIMUM_MAP_SIZE_TECHNICAL);
_resizeDirection = ResizeDirection::X;
WindowMapgenChangeMapSize(+1);
w->Invalidate();
break;
case WIDX_MAP_SIZE_X_DOWN:
_mapSize.x = std::max(_mapSize.x - 1, MINIMUM_MAP_SIZE_TECHNICAL);
_resizeDirection = ResizeDirection::X;
WindowMapgenChangeMapSize(-1);
w->Invalidate();
break;
case WIDX_BASE_HEIGHT_UP:
@@ -618,16 +641,15 @@ static void WindowMapgenTextinput(rct_window* w, rct_widgetindex widgetIndex, ch
switch (widgetIndex)
{
case WIDX_MAP_SIZE_Y:
case WIDX_SIMPLEX_MAP_SIZE_Y:
// The practical size is 2 lower than the technical size
value += 2;
_mapSize.y = std::clamp(value, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL);
break;
case WIDX_MAP_SIZE_X:
case WIDX_SIMPLEX_MAP_SIZE_Y:
case WIDX_SIMPLEX_MAP_SIZE_X:
// The practical size is 2 lower than the technical size
value += 2;
_mapSize.x = std::clamp(value, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL);
if (_resizeDirection == ResizeDirection::Y || _mapWidthAndHeightLinked)
_mapSize.y = value;
if (_resizeDirection == ResizeDirection::X || _mapWidthAndHeightLinked)
_mapSize.x = value;
break;
case WIDX_BASE_HEIGHT:
_baseHeight = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX);
@@ -826,25 +848,16 @@ static void WindowMapgenSimplexMouseup(rct_window* w, rct_widgetindex widgetInde
switch (widgetIndex)
{
case WIDX_SIMPLEX_MAP_SIZE_Y:
{
Formatter ft;
ft.Add<int16_t>(MINIMUM_MAP_SIZE_PRACTICAL);
ft.Add<int16_t>(MAXIMUM_MAP_SIZE_PRACTICAL);
// Practical map size is 2 lower than the technical map size
WindowTextInputOpen(
w, WIDX_SIMPLEX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.y - 2, 4);
_resizeDirection = ResizeDirection::Y;
WindowMapgenInputMapSize(w, WIDX_SIMPLEX_MAP_SIZE_Y, _mapSize.y);
break;
}
case WIDX_SIMPLEX_MAP_SIZE_X: // TODO: Dedupe code - handle similar to Map.cpp
{
Formatter ft;
ft.Add<int16_t>(MINIMUM_MAP_SIZE_PRACTICAL);
ft.Add<int16_t>(MAXIMUM_MAP_SIZE_PRACTICAL);
// Practical map size is 2 lower than the technical map size
WindowTextInputOpen(
w, WIDX_SIMPLEX_MAP_SIZE_X, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.x - 2, 4);
case WIDX_SIMPLEX_MAP_SIZE_X:
_resizeDirection = ResizeDirection::X;
WindowMapgenInputMapSize(w, WIDX_SIMPLEX_MAP_SIZE_X, _mapSize.x);
break;
case WIDX_SIMPLEX_MAP_SIZE_LINK:
_mapWidthAndHeightLinked = !_mapWidthAndHeightLinked;
break;
}
case WIDX_SIMPLEX_GENERATE:
mapgenSettings.mapSize = _mapSize;
@@ -902,19 +915,23 @@ static void WindowMapgenSimplexMousedown(rct_window* w, rct_widgetindex widgetIn
w->Invalidate();
break;
case WIDX_SIMPLEX_MAP_SIZE_Y_UP:
_mapSize.y = std::min(_mapSize.y + 1, MAXIMUM_MAP_SIZE_TECHNICAL);
_resizeDirection = ResizeDirection::Y;
WindowMapgenChangeMapSize(+1);
w->Invalidate();
break;
case WIDX_SIMPLEX_MAP_SIZE_Y_DOWN:
_mapSize.y = std::max(_mapSize.y - 1, MINIMUM_MAP_SIZE_TECHNICAL);
_resizeDirection = ResizeDirection::Y;
WindowMapgenChangeMapSize(-1);
w->Invalidate();
break;
case WIDX_SIMPLEX_MAP_SIZE_X_UP: // TODO: Dedupe code - handle similar to Map.cpp
_mapSize.x = std::min(_mapSize.x + 1, MAXIMUM_MAP_SIZE_TECHNICAL);
case WIDX_SIMPLEX_MAP_SIZE_X_UP:
_resizeDirection = ResizeDirection::X;
WindowMapgenChangeMapSize(+1);
w->Invalidate();
break;
case WIDX_SIMPLEX_MAP_SIZE_X_DOWN: // TODO: Dedupe code - handle similar to Map.cpp
_mapSize.x = std::max(_mapSize.x - 1, MINIMUM_MAP_SIZE_TECHNICAL);
case WIDX_SIMPLEX_MAP_SIZE_X_DOWN:
_resizeDirection = ResizeDirection::X;
WindowMapgenChangeMapSize(-1);
w->Invalidate();
break;
case WIDX_SIMPLEX_WATER_LEVEL_UP: