From 8d14016c3f2b3dab8f51c5ae47cc17006ae8a3fc Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sun, 15 May 2022 22:25:45 +0200 Subject: [PATCH 1/6] Allow maps to be resized to non-rectangular shapes --- data/language/en-GB.txt | 3 +- resources/g2/icons/link_chain.png | Bin 0 -> 154 bytes resources/g2/sprites.json | 5 + src/openrct2-ui/windows/Map.cpp | 167 ++++++++++++++++++-------- src/openrct2/interface/Window.h | 2 +- src/openrct2/localisation/StringIds.h | 4 +- src/openrct2/sprites.h | 4 +- 7 files changed, 129 insertions(+), 56 deletions(-) create mode 100644 resources/g2/icons/link_chain.png diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 8351bebb4b..49a03d001c 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -2258,7 +2258,7 @@ STR_3208 :Track Designs Manager STR_3209 :Back to Previous Step: STR_3210 :Forward to Next Step: STR_3211 :Map size: -STR_3212 :{COMMA16} × {COMMA16} +STR_3212 :{POP16}{COMMA16} STR_3213 :Can’t decrease map size any further STR_3214 :Can’t increase map size any further STR_3215 :Too close to edge of map @@ -3603,6 +3603,7 @@ STR_6494 :Group by ride type STR_6495 :Group rides by ride types instead of showing each vehicle separately. STR_6496 :{WINDOW_COLOUR_2}{STRINGID} STR_6497 :Click on a tile to show its tile elements.{NEWLINE}Ctrl + click a tile element to select it directly. +STR_6498 :Enable to maintain square map shape. ############# # Scenarios # diff --git a/resources/g2/icons/link_chain.png b/resources/g2/icons/link_chain.png new file mode 100644 index 0000000000000000000000000000000000000000..7edf3872be58a218941ebc6df5bb9886616856fd GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^f_!@pW9jMQ7*Y|JoFE_~!jR17mY(b^kd`1|D8j;+%*d9= zxS_*f#?mEAPAI4xP*}q;EmSChp|in&`H%<$i!GbjYE^!aD;PXo{an^LB{Ts5_P{Ic literal 0 HcmV?d00001 diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 31fa07ddd7..0b2ba1f0ce 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -529,6 +529,11 @@ "x_offset": 4, "y_offset": 2 }, + { + "path": "icons/link_chain.png", + "x_offset": 2, + "y_offset": 2 + }, { "path": "font/latin/ae-uc-small.png", "y_offset": 0, diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 2e062148d7..8d517d5ce9 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -72,25 +72,29 @@ enum WindowMapWidgetIdx WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, - WIDX_RESIZE = 3, - WIDX_PEOPLE_TAB = 4, - WIDX_RIDES_TAB = 5, - WIDX_MAP = 6, - WIDX_MAP_SIZE_SPINNER = 7, - WIDX_MAP_SIZE_SPINNER_UP = 8, - WIDX_MAP_SIZE_SPINNER_DOWN = 9, - WIDX_SET_LAND_RIGHTS = 10, - WIDX_BUILD_PARK_ENTRANCE = 11, - WIDX_PEOPLE_STARTING_POSITION = 12, - WIDX_LAND_TOOL = 13, - WIDX_LAND_TOOL_SMALLER = 14, - WIDX_LAND_TOOL_LARGER = 15, - WIDX_LAND_OWNED_CHECKBOX = 16, - WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX = 17, - WIDX_LAND_SALE_CHECKBOX = 18, - WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX = 19, - WIDX_ROTATE_90 = 20, - WIDX_MAP_GENERATOR = 21 + WIDX_RESIZE, + WIDX_PEOPLE_TAB, + WIDX_RIDES_TAB, + WIDX_MAP, + WIDX_MAP_SIZE_SPINNER_Y, + WIDX_MAP_SIZE_SPINNER_Y_UP, + WIDX_MAP_SIZE_SPINNER_Y_DOWN, + WIDX_MAP_SIZE_LINK, + WIDX_MAP_SIZE_SPINNER_X, + WIDX_MAP_SIZE_SPINNER_X_UP, + WIDX_MAP_SIZE_SPINNER_X_DOWN, + WIDX_SET_LAND_RIGHTS, + WIDX_BUILD_PARK_ENTRANCE, + WIDX_PEOPLE_STARTING_POSITION, + WIDX_LAND_TOOL, + WIDX_LAND_TOOL_SMALLER, + WIDX_LAND_TOOL_LARGER, + WIDX_LAND_OWNED_CHECKBOX, + WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX, + WIDX_LAND_SALE_CHECKBOX, + WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX, + WIDX_ROTATE_90, + WIDX_MAP_GENERATOR }; validate_global_widx(WC_MAP, WIDX_ROTATE_90); @@ -102,7 +106,9 @@ static rct_widget window_map_widgets[] = { MakeRemapWidget ({ 3, 17}, { 31, 27}, WindowWidgetType::ColourBtn, WindowColour::Secondary, SPR_TAB, STR_SHOW_PEOPLE_ON_MAP_TIP ), MakeRemapWidget ({ 34, 17}, { 31, 27}, WindowWidgetType::ColourBtn, WindowColour::Secondary, SPR_TAB, STR_SHOW_RIDES_STALLS_ON_MAP_TIP ), MakeWidget ({ 3, 46}, {239, 180}, WindowWidgetType::Scroll, WindowColour::Secondary, SCROLL_BOTH ), - MakeSpinnerWidgets({104, 229}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_MAP_SIZE_VALUE ), // NB: 3 widgets + MakeSpinnerWidgets({102, 229}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets + MakeWidget ({153, 230}, { 20, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_G2_LINK_CHAIN, STR_MAINTAIN_SQUARE_MAP_TOOLTIP ), + MakeSpinnerWidgets({174, 229}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets MakeWidget ({ 4, 1}, { 24, 24}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_BUY_LAND_RIGHTS, STR_SELECT_PARK_OWNED_LAND_TIP ), MakeWidget ({ 4, 1}, { 24, 24}, WindowWidgetType::FlatBtn, WindowColour::Secondary, SPR_PARK_ENTRANCE, STR_BUILD_PARK_ENTRANCE_TIP ), MakeWidget ({ 28, 1}, { 24, 24}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_SET_STARTING_POSITIONS_TIP ), @@ -140,8 +146,9 @@ public: { widgets = window_map_widgets; - hold_down_widgets = (1ULL << WIDX_MAP_SIZE_SPINNER_UP) | (1ULL << WIDX_MAP_SIZE_SPINNER_DOWN) - | (1ULL << WIDX_LAND_TOOL_LARGER) | (1ULL << WIDX_LAND_TOOL_SMALLER); + hold_down_widgets = (1ULL << WIDX_MAP_SIZE_SPINNER_Y_UP) | (1ULL << WIDX_MAP_SIZE_SPINNER_Y_DOWN) + | (1ULL << WIDX_MAP_SIZE_SPINNER_X_UP) | (1ULL << WIDX_MAP_SIZE_SPINNER_X_DOWN) | (1ULL << WIDX_LAND_TOOL_LARGER) + | (1ULL << WIDX_LAND_TOOL_SMALLER); InitScrollWidgets(); @@ -251,8 +258,12 @@ public: case WIDX_LAND_TOOL: InputLandSize(); break; - case WIDX_MAP_SIZE_SPINNER: - InputMapSize(); + case WIDX_MAP_SIZE_SPINNER_Y: + case WIDX_MAP_SIZE_SPINNER_X: + InputMapSize(widgetIndex); + break; + case WIDX_MAP_SIZE_LINK: + _mapWidthAndHeightLinked = !_mapWidthAndHeightLinked; break; case WIDX_MAP_GENERATOR: context_open_window(WC_MAPGEN); @@ -274,10 +285,20 @@ public: { switch (widgetIndex) { - case WIDX_MAP_SIZE_SPINNER_UP: + case WIDX_MAP_SIZE_SPINNER_Y_UP: + _resizeDirection = ResizeDirection::Y; IncreaseMapSize(); break; - case WIDX_MAP_SIZE_SPINNER_DOWN: + case WIDX_MAP_SIZE_SPINNER_Y_DOWN: + _resizeDirection = ResizeDirection::Y; + DecreaseMapSize(); + break; + case WIDX_MAP_SIZE_SPINNER_X_UP: + _resizeDirection = ResizeDirection::X; + IncreaseMapSize(); + break; + case WIDX_MAP_SIZE_SPINNER_X_DOWN: + _resizeDirection = ResizeDirection::X; DecreaseMapSize(); break; case WIDX_LAND_TOOL_SMALLER: @@ -577,7 +598,8 @@ public: } break; } - case WIDX_MAP_SIZE_SPINNER: + case WIDX_MAP_SIZE_SPINNER_Y: + case WIDX_MAP_SIZE_SPINNER_X: { char* end; std::string textStr = std::string(text); @@ -588,7 +610,13 @@ public: size += 2; size = std::clamp(size, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL); - auto changeMapSizeAction = ChangeMapSizeAction({ size, size }); + TileCoordsXY newMapSize = gMapSize; + if (_resizeDirection != ResizeDirection::X) + newMapSize.y = size; + if (_resizeDirection != ResizeDirection::Y) + newMapSize.x = size; + + auto changeMapSizeAction = ChangeMapSizeAction(newMapSize); GameActions::Execute(&changeMapSizeAction); Invalidate(); } @@ -689,14 +717,8 @@ public: void OnPrepareDraw() override { // Set the pressed widgets - pressed_widgets &= (1ULL << WIDX_PEOPLE_TAB); - pressed_widgets &= (1ULL << WIDX_RIDES_TAB); - pressed_widgets &= (1ULL << WIDX_MAP); - pressed_widgets &= (1ULL << WIDX_LAND_OWNED_CHECKBOX); - pressed_widgets &= (1ULL << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); - pressed_widgets &= (1ULL << WIDX_LAND_SALE_CHECKBOX); - pressed_widgets &= (1ULL << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX); - + pressed_widgets = 0; + SetWidgetPressed(WIDX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); pressed_widgets |= (1ULL << (WIDX_PEOPLE_TAB + selected_tab)); pressed_widgets |= (1ULL << WIDX_LAND_TOOL); @@ -712,6 +734,9 @@ public: if (_activeTool & (1 << 0)) pressed_widgets |= (1ULL << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); + // Set disabled widgets + SetWidgetDisabled(WIDX_MAP_SIZE_LINK, gMapSize.x != gMapSize.y); + // Resize widgets to window size widgets[WIDX_BACKGROUND].right = width - 1; widgets[WIDX_BACKGROUND].bottom = height - 1; @@ -729,12 +754,20 @@ public: else widgets[WIDX_MAP].bottom = height - 1 - 14; - widgets[WIDX_MAP_SIZE_SPINNER].top = height - 15; - widgets[WIDX_MAP_SIZE_SPINNER].bottom = height - 4; - widgets[WIDX_MAP_SIZE_SPINNER_UP].top = height - 14; - widgets[WIDX_MAP_SIZE_SPINNER_UP].bottom = height - 5; - widgets[WIDX_MAP_SIZE_SPINNER_DOWN].top = height - 14; - widgets[WIDX_MAP_SIZE_SPINNER_DOWN].bottom = height - 5; + widgets[WIDX_MAP_SIZE_SPINNER_Y].top = height - 15; + widgets[WIDX_MAP_SIZE_SPINNER_Y].bottom = height - 4; + widgets[WIDX_MAP_SIZE_SPINNER_Y_UP].top = height - 14; + widgets[WIDX_MAP_SIZE_SPINNER_Y_UP].bottom = height - 5; + widgets[WIDX_MAP_SIZE_SPINNER_Y_DOWN].top = height - 14; + widgets[WIDX_MAP_SIZE_SPINNER_Y_DOWN].bottom = height - 5; + widgets[WIDX_MAP_SIZE_LINK].top = height - 15; + widgets[WIDX_MAP_SIZE_LINK].bottom = height - 4; + widgets[WIDX_MAP_SIZE_SPINNER_X].top = height - 15; + widgets[WIDX_MAP_SIZE_SPINNER_X].bottom = height - 4; + widgets[WIDX_MAP_SIZE_SPINNER_X_UP].top = height - 14; + widgets[WIDX_MAP_SIZE_SPINNER_X_UP].bottom = height - 5; + widgets[WIDX_MAP_SIZE_SPINNER_X_DOWN].top = height - 14; + widgets[WIDX_MAP_SIZE_SPINNER_X_DOWN].bottom = height - 5; widgets[WIDX_SET_LAND_RIGHTS].top = height - 70; widgets[WIDX_SET_LAND_RIGHTS].bottom = height - 70 + 23; @@ -766,7 +799,7 @@ public: } // Disable all scenario editor related widgets - for (int32_t i = WIDX_MAP_SIZE_SPINNER; i <= WIDX_MAP_GENERATOR; i++) + for (int32_t i = WIDX_MAP_SIZE_SPINNER_Y; i <= WIDX_MAP_GENERATOR; i++) { widgets[i].type = WindowWidgetType::Empty; } @@ -848,6 +881,7 @@ public: STR_MAP_RIDE, STR_MAP_FOOD_STALL, STR_MAP_DRINK_STALL, STR_MAP_SOUVENIR_STALL, STR_MAP_INFO_KIOSK, STR_MAP_FIRST_AID, STR_MAP_CASH_MACHINE, STR_MAP_TOILET, }; + static_assert(std::size(RideKeyColours) == std::size(_mapLabels)); for (uint32_t i = 0; i < std::size(RideKeyColours); i++) { @@ -866,7 +900,7 @@ public: else if (!WidgetIsActiveTool(this, WIDX_SET_LAND_RIGHTS)) { DrawTextBasic( - &dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_MAP_SIZE_SPINNER].top + 1 }, STR_MAP_SIZE, {}, + &dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_MAP_SIZE_SPINNER_Y].top + 1 }, STR_MAP_SIZE, {}, { colours[1] }); } } @@ -930,13 +964,25 @@ private: void IncreaseMapSize() { - auto increaseMapSizeAction = ChangeMapSizeAction({ gMapSize.x + 1, gMapSize.y + 1 }); + auto newMapSize = gMapSize; + if (IsWidgetPressed(WIDX_MAP_SIZE_LINK) || _resizeDirection == ResizeDirection::Y) + newMapSize.y++; + if (IsWidgetPressed(WIDX_MAP_SIZE_LINK) || _resizeDirection == ResizeDirection::X) + newMapSize.x++; + + auto increaseMapSizeAction = ChangeMapSizeAction(newMapSize); GameActions::Execute(&increaseMapSizeAction); } void DecreaseMapSize() { - auto decreaseMapSizeAction = ChangeMapSizeAction({ gMapSize.x - 1, gMapSize.y - 1 }); + auto newMapSize = gMapSize; + if (IsWidgetPressed(WIDX_MAP_SIZE_LINK) || _resizeDirection == ResizeDirection::Y) + newMapSize.y--; + if (IsWidgetPressed(WIDX_MAP_SIZE_LINK) || _resizeDirection == ResizeDirection::X) + newMapSize.x--; + + auto decreaseMapSizeAction = ChangeMapSizeAction(newMapSize); GameActions::Execute(&decreaseMapSizeAction); } @@ -1246,17 +1292,22 @@ private: { widgets[WIDX_BUILD_PARK_ENTRANCE].type = WindowWidgetType::FlatBtn; widgets[WIDX_PEOPLE_STARTING_POSITION].type = WindowWidgetType::FlatBtn; - widgets[WIDX_MAP_SIZE_SPINNER].type = WindowWidgetType::Spinner; - widgets[WIDX_MAP_SIZE_SPINNER_UP].type = WindowWidgetType::Button; - widgets[WIDX_MAP_SIZE_SPINNER_DOWN].type = WindowWidgetType::Button; + widgets[WIDX_MAP_SIZE_SPINNER_Y].type = WindowWidgetType::Spinner; + widgets[WIDX_MAP_SIZE_SPINNER_Y_UP].type = WindowWidgetType::Button; + widgets[WIDX_MAP_SIZE_SPINNER_Y_DOWN].type = WindowWidgetType::Button; + widgets[WIDX_MAP_SIZE_LINK].type = WindowWidgetType::FlatBtn; + widgets[WIDX_MAP_SIZE_SPINNER_X].type = WindowWidgetType::Spinner; + widgets[WIDX_MAP_SIZE_SPINNER_X_UP].type = WindowWidgetType::Button; + widgets[WIDX_MAP_SIZE_SPINNER_X_DOWN].type = WindowWidgetType::Button; // Only show this in the scenario editor, even when in sandbox mode. if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) widgets[WIDX_MAP_GENERATOR].type = WindowWidgetType::Button; + // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use auto ft = Formatter::Common(); - ft.Add(gMapSize.x - 2); ft.Add(gMapSize.y - 2); + ft.Add(gMapSize.x - 2); } void InputLandSize() @@ -1267,12 +1318,17 @@ private: TextInputOpen(WIDX_LAND_TOOL, STR_SELECTION_SIZE, STR_ENTER_SELECTION_SIZE, ft, STR_NONE, STR_NONE, 3); } - void InputMapSize() + void InputMapSize(rct_widgetindex callingWidget) { + if (IsWidgetPressed(WIDX_MAP_SIZE_LINK)) + _resizeDirection = ResizeDirection::Both; + else + _resizeDirection = (callingWidget == WIDX_MAP_SIZE_SPINNER_Y) ? ResizeDirection::Y : ResizeDirection::X; + Formatter ft; ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); ft.Add(MAXIMUM_MAP_SIZE_PRACTICAL); - TextInputOpen(WIDX_MAP_SIZE_SPINNER, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_NONE, STR_NONE, 4); + TextInputOpen(callingWidget, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_NONE, STR_NONE, 4); } CoordsXY ScreenToMap(ScreenCoordsXY screenCoords) @@ -1327,6 +1383,13 @@ private: uint32_t _currentLine; uint16_t _landRightsToolSize; std::vector _mapImageData; + bool _mapWidthAndHeightLinked{ true }; + enum class ResizeDirection + { + Both, + X, + Y, + } _resizeDirection{ ResizeDirection::Both }; static constexpr const uint16_t RideKeyColours[] = { MapColour(PALETTE_INDEX_61), // COLOUR_KEY_RIDE diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 6ec65ce72f..12d29cab80 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -527,7 +527,7 @@ enum #define WC_PEEP__WIDX_PICKUP 14 #define WC_TRACK_DESIGN_LIST__WIDX_ROTATE 8 #define WC_TRACK_DESIGN_PLACE__WIDX_ROTATE 3 -#define WC_MAP__WIDX_ROTATE_90 20 +#define WC_MAP__WIDX_ROTATE_90 24 #define WC_EDITOR_OBJECT_SELECTION__WIDX_TAB_1 21 #define WC_STAFF__WIDX_PICKUP 9 #define WC_TILE_INSPECTOR__WIDX_BUTTON_ROTATE 13 diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 3f67339641..04466e12f4 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -2379,7 +2379,7 @@ enum : uint16_t STR_BACK_TO_PREVIOUS_STEP = 3209, STR_FORWARD_TO_NEXT_STEP = 3210, STR_MAP_SIZE = 3211, - STR_MAP_SIZE_VALUE = 3212, + STR_POP16_COMMA16 = 3212, STR_CANT_DECREASE_MAP_SIZE_ANY_FURTHER = 3213, STR_CANT_INCREASE_MAP_SIZE_ANY_FURTHER = 3214, STR_TOO_CLOSE_TO_EDGE_OF_MAP = 3215, @@ -3875,6 +3875,8 @@ enum : uint16_t STR_TILE_INSPECTOR_SELECT_TILE_HINT = 6497, + STR_MAINTAIN_SQUARE_MAP_TOOLTIP = 6498, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings }; diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index fee025c4e0..3527d17eb2 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -895,7 +895,9 @@ enum SPR_G2_BUTTON_HIDE_PARTIAL = SPR_G2_BEGIN + 147, SPR_G2_BUTTON_HIDE_FULL = SPR_G2_BEGIN + 148, - SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 149, + SPR_G2_LINK_CHAIN = SPR_G2_BEGIN + 149, + + SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 150, SPR_G2_AE_UPPER = SPR_G2_CHAR_BEGIN, SPR_G2_AE_LOWER = SPR_G2_CHAR_BEGIN + 1, From 1644cb68d3300f9f266f9116fc9bb44f2862204f Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 21 May 2022 08:59:23 +0200 Subject: [PATCH 2/6] Split X and Y map size spinners in mapgen --- src/openrct2-ui/windows/MapGen.cpp | 101 +++++++++++++++++------------ 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 3a1cf926e1..6ab3212989 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -50,9 +50,13 @@ enum TAB_BEGIN, WIDX_MAP_GENERATE = TAB_BEGIN, - WIDX_MAP_SIZE, - WIDX_MAP_SIZE_UP, - WIDX_MAP_SIZE_DOWN, + WIDX_MAP_SIZE_Y, + WIDX_MAP_SIZE_Y_UP, + WIDX_MAP_SIZE_Y_DOWN, + WIDX_MAP_SIZE_LINK, + WIDX_MAP_SIZE_X, + WIDX_MAP_SIZE_X_UP, + WIDX_MAP_SIZE_X_DOWN, WIDX_BASE_HEIGHT, WIDX_BASE_HEIGHT_UP, WIDX_BASE_HEIGHT_DOWN, @@ -80,9 +84,13 @@ enum WIDX_SIMPLEX_OCTAVES, WIDX_SIMPLEX_OCTAVES_UP, WIDX_SIMPLEX_OCTAVES_DOWN, - WIDX_SIMPLEX_MAP_SIZE, - WIDX_SIMPLEX_MAP_SIZE_UP, - WIDX_SIMPLEX_MAP_SIZE_DOWN, + WIDX_SIMPLEX_MAP_SIZE_Y, + WIDX_SIMPLEX_MAP_SIZE_Y_UP, + WIDX_SIMPLEX_MAP_SIZE_Y_DOWN, + WIDX_SIMPLEX_MAP_SIZE_LINK, + WIDX_SIMPLEX_MAP_SIZE_X, + WIDX_SIMPLEX_MAP_SIZE_X_UP, + WIDX_SIMPLEX_MAP_SIZE_X_DOWN, WIDX_SIMPLEX_WATER_LEVEL, WIDX_SIMPLEX_WATER_LEVEL_UP, WIDX_SIMPLEX_WATER_LEVEL_DOWN, @@ -126,12 +134,14 @@ static constexpr const int32_t WH = 273; static rct_widget MapWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), - MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // 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 ), - MakeWidget ({151, 106}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), + MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), + MakeSpinnerWidgets({104, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // 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 ), // 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 ), + MakeWidget ({151, 106}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP ), WIDGETS_END, }; @@ -145,18 +155,20 @@ static rct_widget RandomWidgets[] = { static rct_widget SimplexWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), // WIDX_SIMPLEX_GENERATE - MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL - MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} - 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}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_MAP_SIZE{,_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 - MakeWidget ({150, 202}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), // WIDX_SIMPLEX_WALL_TEXTURE - MakeWidget ({104, 239}, { 95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary ), // WIDX_SIMPLEX_PLACE_TREES_CHECKBOX + MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), // WIDX_SIMPLEX_GENERATE + MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL + MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} + 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 ), // 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 ), // 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 + MakeWidget ({150, 202}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP ), // WIDX_SIMPLEX_WALL_TEXTURE + MakeWidget ({104, 239}, { 95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary ), // WIDX_SIMPLEX_PLACE_TREES_CHECKBOX WIDGETS_END, }; @@ -290,8 +302,10 @@ static uint64_t PageDisabledWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { }; static uint64_t HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { - (1ULL << WIDX_MAP_SIZE_UP) | - (1ULL << WIDX_MAP_SIZE_DOWN) | + (1ULL << WIDX_MAP_SIZE_Y_UP) | + (1ULL << WIDX_MAP_SIZE_Y_DOWN) | + (1ULL << WIDX_MAP_SIZE_X_UP) | + (1ULL << WIDX_MAP_SIZE_X_DOWN) | (1ULL << WIDX_BASE_HEIGHT_UP) | (1ULL << WIDX_BASE_HEIGHT_DOWN) | (1ULL << WIDX_WATER_LEVEL_UP) | @@ -307,8 +321,10 @@ static uint64_t HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { (1ULL << WIDX_SIMPLEX_BASE_FREQ_DOWN) | (1ULL << WIDX_SIMPLEX_OCTAVES_UP) | (1ULL << WIDX_SIMPLEX_OCTAVES_DOWN) | - (1ULL << WIDX_SIMPLEX_MAP_SIZE_UP) | - (1ULL << WIDX_SIMPLEX_MAP_SIZE_DOWN) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE_Y_UP) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE_Y_DOWN) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE_X_UP) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE_X_DOWN) | (1ULL << WIDX_SIMPLEX_WATER_LEVEL_UP) | (1ULL << WIDX_SIMPLEX_WATER_LEVEL_DOWN), @@ -450,11 +466,11 @@ static void WindowMapgenBaseMouseup(rct_window* w, rct_widgetindex widgetIndex) mapgen_generate_blank(&mapgenSettings); gfx_invalidate_screen(); break; - case WIDX_MAP_SIZE: + case WIDX_MAP_SIZE_Y: ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); ft.Add(MAXIMUM_MAP_SIZE_PRACTICAL); // Practical map size is 2 lower than the technical map size - WindowTextInputOpen(w, WIDX_MAP_SIZE, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize - 2, 4); + WindowTextInputOpen(w, WIDX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize - 2, 4); break; case WIDX_BASE_HEIGHT: ft.Add((BASESIZE_MIN - 12) / 2); @@ -475,11 +491,11 @@ static void WindowMapgenBaseMousedown(rct_window* w, rct_widgetindex widgetIndex { switch (widgetIndex) { - case WIDX_MAP_SIZE_UP: + case WIDX_MAP_SIZE_Y_UP: _mapSize = std::min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; - case WIDX_MAP_SIZE_DOWN: + case WIDX_MAP_SIZE_Y_DOWN: _mapSize = std::max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; @@ -576,8 +592,8 @@ static void WindowMapgenTextinput(rct_window* w, rct_widgetindex widgetIndex, ch switch (widgetIndex) { - case WIDX_MAP_SIZE: - case WIDX_SIMPLEX_MAP_SIZE: + case WIDX_MAP_SIZE_Y: + case WIDX_SIMPLEX_MAP_SIZE_Y: // The practical size is 2 lower than the technical size value += 2; _mapSize = std::clamp(value, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL); @@ -661,7 +677,8 @@ static void WindowMapgenBasePaint(rct_window* w, rct_drawpixelinfo* dpi) const auto textColour = w->colours[1]; - DrawTextBasic(dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_MAP_SIZE].top + 1 }, STR_MAP_SIZE, {}, { textColour }); + DrawTextBasic( + dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_COMMA16, {}, { textColour }); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, { textColour }); @@ -677,7 +694,7 @@ static void WindowMapgenBasePaint(rct_window* w, rct_drawpixelinfo* dpi) ft.Add(static_cast(_mapSize - 2)); ft.Add(static_cast(_mapSize - 2)); DrawTextBasic( - dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_MAP_SIZE].left + 1, w->widgets[WIDX_MAP_SIZE].top + 1 }, + dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_MAP_SIZE_Y].left + 1, w->widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_RESOLUTION_X_BY_Y, ft, { w->colours[1] }); ft = Formatter(); @@ -777,14 +794,14 @@ static void WindowMapgenSimplexMouseup(rct_window* w, rct_widgetindex widgetInde switch (widgetIndex) { - case WIDX_SIMPLEX_MAP_SIZE: + case WIDX_SIMPLEX_MAP_SIZE_Y: { Formatter ft; ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); ft.Add(MAXIMUM_MAP_SIZE_PRACTICAL); // Practical map size is 2 lower than the technical map size WindowTextInputOpen( - w, WIDX_SIMPLEX_MAP_SIZE, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize - 2, 4); + w, WIDX_SIMPLEX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize - 2, 4); break; } case WIDX_SIMPLEX_GENERATE: @@ -843,11 +860,11 @@ static void WindowMapgenSimplexMousedown(rct_window* w, rct_widgetindex widgetIn _simplex_octaves = std::max(_simplex_octaves - 1, 1); w->Invalidate(); break; - case WIDX_SIMPLEX_MAP_SIZE_UP: + case WIDX_SIMPLEX_MAP_SIZE_Y_UP: _mapSize = std::min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; - case WIDX_SIMPLEX_MAP_SIZE_DOWN: + case WIDX_SIMPLEX_MAP_SIZE_Y_DOWN: _mapSize = std::max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; @@ -974,7 +991,7 @@ static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi) dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES, {}, { textColour }); DrawTextBasic( - dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_MAP_SIZE].top + 1 }, STR_MAP_SIZE, {}, { textColour }); + dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, STR_COMMA16, {}, { textColour }); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, { textColour }); @@ -1016,7 +1033,7 @@ static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi) ft.Add(static_cast(_mapSize - 2)); DrawTextBasic( dpi, - w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_SIMPLEX_MAP_SIZE].left + 1, w->widgets[WIDX_SIMPLEX_MAP_SIZE].top + 1 }, + w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].left + 1, w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, STR_RESOLUTION_X_BY_Y, ft, { textColour }); ft = Formatter(); From 49c3f49535b648feb3cb4e53c66bea69872dc9e6 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 4 Jun 2022 19:56:31 +0200 Subject: [PATCH 3/6] Split X and Y size in mapgen logic --- src/openrct2-ui/windows/MapGen.cpp | 65 ++++++++++++++++++++++++------ src/openrct2/world/MapGen.cpp | 57 +++++++++++++------------- src/openrct2/world/MapGen.h | 3 +- 3 files changed, 83 insertions(+), 42 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 6ab3212989..4ffd9bba73 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -378,7 +378,7 @@ static void WindowMapgenSetPage(rct_window* w, int32_t page); static void WindowMapgenSetPressedTab(rct_window* w); static void WindowMapgenDrawTabImages(rct_drawpixelinfo* dpi, rct_window* w); -static int32_t _mapSize = 150; +static TileCoordsXY _mapSize{ 150, 150 }; static int32_t _baseHeight = 12; static int32_t _waterLevel = 6; static int32_t _floorTexture = 0; @@ -470,7 +470,13 @@ static void WindowMapgenBaseMouseup(rct_window* w, rct_widgetindex widgetIndex) ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); ft.Add(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 - 2, 4); + WindowTextInputOpen(w, WIDX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.y - 2, 4); + break; + case WIDX_MAP_SIZE_X: // TODO: Dedupe code - handle similar to Map.cpp + ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); + ft.Add(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); break; case WIDX_BASE_HEIGHT: ft.Add((BASESIZE_MIN - 12) / 2); @@ -492,11 +498,19 @@ static void WindowMapgenBaseMousedown(rct_window* w, rct_widgetindex widgetIndex switch (widgetIndex) { case WIDX_MAP_SIZE_Y_UP: - _mapSize = std::min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL); + _mapSize.y = std::min(_mapSize.y + 1, MAXIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; case WIDX_MAP_SIZE_Y_DOWN: - _mapSize = std::max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL); + _mapSize.y = std::max(_mapSize.y - 1, MINIMUM_MAP_SIZE_TECHNICAL); + w->Invalidate(); + break; + case WIDX_MAP_SIZE_X_UP: + _mapSize.x = std::min(_mapSize.x + 1, MAXIMUM_MAP_SIZE_TECHNICAL); + w->Invalidate(); + break; + case WIDX_MAP_SIZE_X_DOWN: + _mapSize.x = std::max(_mapSize.x - 1, MINIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; case WIDX_BASE_HEIGHT_UP: @@ -596,7 +610,13 @@ static void WindowMapgenTextinput(rct_window* w, rct_widgetindex widgetIndex, ch case WIDX_SIMPLEX_MAP_SIZE_Y: // The practical size is 2 lower than the technical size value += 2; - _mapSize = std::clamp(value, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL); + _mapSize.y = std::clamp(value, MINIMUM_MAP_SIZE_TECHNICAL, MAXIMUM_MAP_SIZE_TECHNICAL); + break; + case WIDX_MAP_SIZE_X: + 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); break; case WIDX_BASE_HEIGHT: _baseHeight = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); @@ -691,8 +711,8 @@ static void WindowMapgenBasePaint(rct_window* w, rct_drawpixelinfo* dpi) // The practical map size is 2 lower than the technical map size // This needs to be cast down to a uint16_t because that's what the STR_RESOLUTION_X_BY_Y string takes. auto ft = Formatter(); - ft.Add(static_cast(_mapSize - 2)); - ft.Add(static_cast(_mapSize - 2)); + ft.Add(static_cast(_mapSize.y - 2)); + ft.Add(static_cast(_mapSize.x - 2)); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_MAP_SIZE_Y].left + 1, w->widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_RESOLUTION_X_BY_Y, ft, { w->colours[1] }); @@ -801,7 +821,17 @@ static void WindowMapgenSimplexMouseup(rct_window* w, rct_widgetindex widgetInde ft.Add(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 - 2, 4); + w, WIDX_SIMPLEX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.y - 2, 4); + break; + } + case WIDX_SIMPLEX_MAP_SIZE_X: // TODO: Dedupe code - handle similar to Map.cpp + { + Formatter ft; + ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); + ft.Add(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); break; } case WIDX_SIMPLEX_GENERATE: @@ -861,11 +891,19 @@ static void WindowMapgenSimplexMousedown(rct_window* w, rct_widgetindex widgetIn w->Invalidate(); break; case WIDX_SIMPLEX_MAP_SIZE_Y_UP: - _mapSize = std::min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL); + _mapSize.y = std::min(_mapSize.y + 1, MAXIMUM_MAP_SIZE_TECHNICAL); w->Invalidate(); break; case WIDX_SIMPLEX_MAP_SIZE_Y_DOWN: - _mapSize = std::max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL); + _mapSize.y = std::max(_mapSize.y - 1, MINIMUM_MAP_SIZE_TECHNICAL); + 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); + 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); w->Invalidate(); break; case WIDX_SIMPLEX_WATER_LEVEL_UP: @@ -952,6 +990,9 @@ static void WindowMapgenSimplexInvalidate(rct_window* w) WindowInitScrollWidgets(w); } + // Only allow linking the map size when X and Y are the same + WidgetSetDisabled(w, WIDX_SIMPLEX_MAP_SIZE_LINK, gMapSize.x != gMapSize.y); + WidgetSetCheckboxValue(w, WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX, _randomTerrain != 0); WidgetSetCheckboxValue(w, WIDX_SIMPLEX_PLACE_TREES_CHECKBOX, _placeTrees != 0); @@ -1029,8 +1070,8 @@ static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi) // The practical map size is 2 lower than the technical map size. // This needs to be cast down to a uint16_t because that's what the STR_RESOLUTION_X_BY_Y string takes. ft = Formatter(); - ft.Add(static_cast(_mapSize - 2)); - ft.Add(static_cast(_mapSize - 2)); + ft.Add(static_cast(_mapSize.y - 2)); + ft.Add(static_cast(_mapSize.x - 2)); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].left + 1, w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index d99ffbc12c..8f2700d083 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -98,21 +98,21 @@ static void mapgen_set_height(mapgen_settings* settings); static float fractal_noise(int32_t x, int32_t y, float frequency, int32_t octaves, float lacunarity, float persistence); static void mapgen_simplex(mapgen_settings* settings); -static int32_t _heightSize; +static TileCoordsXY _heightSize; static uint8_t* _height; static int32_t get_height(int32_t x, int32_t y) { - if (x >= 0 && y >= 0 && x < _heightSize && y < _heightSize) - return _height[x + y * _heightSize]; + if (x >= 0 && y >= 0 && x < _heightSize.x && y < _heightSize.y) + return _height[x + y * _heightSize.x]; return 0; } static void set_height(int32_t x, int32_t y, int32_t height) { - if (x >= 0 && y >= 0 && x < _heightSize && y < _heightSize) - _height[x + y * _heightSize] = height; + if (x >= 0 && y >= 0 && x < _heightSize.x && y < _heightSize.y) + _height[x + y * _heightSize.x] = height; } void mapgen_generate_blank(mapgen_settings* settings) @@ -120,10 +120,10 @@ void mapgen_generate_blank(mapgen_settings* settings) int32_t x, y; map_clear_all_elements(); - map_init({ settings->mapSize, settings->mapSize }); - for (y = 1; y < settings->mapSize - 1; y++) + map_init(settings->mapSize); + for (y = 1; y < settings->mapSize.y - 1; y++) { - for (x = 1; x < settings->mapSize - 1; x++) + for (x = 1; x < settings->mapSize.x - 1; x++) { auto surfaceElement = map_get_surface_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (surfaceElement != nullptr) @@ -141,7 +141,7 @@ void mapgen_generate_blank(mapgen_settings* settings) void mapgen_generate(mapgen_settings* settings) { - auto mapSize = settings->mapSize; + const auto& mapSize = settings->mapSize; auto waterLevel = settings->water_level; const auto selectedFloor = TerrainSurfaceObject::GetById(settings->floor); std::string_view floorTexture = selectedFloor != nullptr ? selectedFloor->GetIdentifier() : ""; @@ -184,10 +184,10 @@ void mapgen_generate(mapgen_settings* settings) map_clear_all_elements(); // Initialise the base map - map_init({ mapSize, mapSize }); - for (auto y = 1; y < mapSize - 1; y++) + map_init(mapSize); + for (auto y = 1; y < mapSize.y - 1; y++) { - for (auto x = 1; x < mapSize - 1; x++) + for (auto x = 1; x < mapSize.x - 1; x++) { auto surfaceElement = map_get_surface_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (surfaceElement != nullptr) @@ -201,9 +201,9 @@ void mapgen_generate(mapgen_settings* settings) } // Create the temporary height map and initialise - _heightSize = mapSize * 2; - _height = new uint8_t[_heightSize * _heightSize]; - std::fill_n(_height, _heightSize * _heightSize, 0x00); + _heightSize = { mapSize.x * 2, mapSize.y * 2 }; + _height = new uint8_t[_heightSize.y * _heightSize.x]; + std::fill_n(_height, _heightSize.y * _heightSize.x, 0x00); mapgen_simplex(settings); mapgen_smooth_height(2 + (util_rand() % 6)); @@ -213,7 +213,7 @@ void mapgen_generate(mapgen_settings* settings) delete[] _height; // Set the tile slopes so that there are no cliffs - while (map_smooth(1, 1, mapSize - 1, mapSize - 1)) + while (map_smooth(1, 1, mapSize.x - 1, mapSize.y - 1)) { } @@ -235,9 +235,9 @@ void mapgen_generate(mapgen_settings* settings) } auto beachTextureId = objectManager.GetLoadedObjectEntryIndex(ObjectEntryDescriptor(beachTexture)); - for (auto y = 1; y < mapSize - 1; y++) + for (auto y = 1; y < mapSize.y - 1; y++) { - for (auto x = 1; x < mapSize - 1; x++) + for (auto x = 1; x < mapSize.x - 1; x++) { auto surfaceElement = map_get_surface_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); @@ -431,22 +431,22 @@ static void mapgen_set_water_level(int32_t waterLevel) static void mapgen_smooth_height(int32_t iterations) { int32_t i, x, y, xx, yy, avg; - int32_t arraySize = _heightSize * _heightSize * sizeof(uint8_t); + int32_t arraySize = _heightSize.y * _heightSize.x * sizeof(uint8_t); uint8_t* copyHeight = new uint8_t[arraySize]; for (i = 0; i < iterations; i++) { std::memcpy(copyHeight, _height, arraySize); - for (y = 1; y < _heightSize - 1; y++) + for (y = 1; y < _heightSize.y - 1; y++) { - for (x = 1; x < _heightSize - 1; x++) + for (x = 1; x < _heightSize.x - 1; x++) { avg = 0; for (yy = -1; yy <= 1; yy++) { for (xx = -1; xx <= 1; xx++) { - avg += copyHeight[(y + yy) * _heightSize + (x + xx)]; + avg += copyHeight[(y + yy) * _heightSize.x + (x + xx)]; } } avg /= 9; @@ -463,12 +463,11 @@ static void mapgen_smooth_height(int32_t iterations) */ static void mapgen_set_height(mapgen_settings* settings) { - int32_t x, y, heightX, heightY, mapSize; + int32_t x, y, heightX, heightY; - mapSize = _heightSize / 2; - for (y = 1; y < mapSize - 1; y++) + for (y = 1; y < _heightSize.y / 2 - 1; y++) { - for (x = 1; x < mapSize - 1; x++) + for (x = 1; x < _heightSize.x / 2 - 1; x++) { heightX = x * 2; heightY = y * 2; @@ -646,16 +645,16 @@ static void mapgen_simplex(mapgen_settings* settings) { int32_t x, y; - float freq = settings->simplex_base_freq * (1.0f / _heightSize); + float freq = settings->simplex_base_freq * (1.0f / _heightSize.x); int32_t octaves = settings->simplex_octaves; int32_t low = settings->simplex_low; int32_t high = settings->simplex_high; noise_rand(); - for (y = 0; y < _heightSize; y++) + for (y = 0; y < _heightSize.y; y++) { - for (x = 0; x < _heightSize; x++) + for (x = 0; x < _heightSize.x; x++) { float noiseValue = std::clamp(fractal_noise(x, y, freq, octaves, 2.0f, 0.65f), -1.0f, 1.0f); float normalisedNoiseValue = (noiseValue + 1.0f) / 2.0f; diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index cd8bfbfec9..61036adb81 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -11,11 +11,12 @@ #include "../common.h" #include "../core/String.hpp" +#include "Location.hpp" struct mapgen_settings { // Base - int32_t mapSize; + TileCoordsXY mapSize; int32_t height; int32_t water_level; int32_t floor; From 7f2f27e8266f0466f8ee7b3927856e4bd6a36aa6 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 4 Jun 2022 23:22:42 +0200 Subject: [PATCH 4/6] Show map size inside spinner widgets --- src/openrct2-ui/windows/MapGen.cpp | 63 +++++++++++++++++------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 4ffd9bba73..5bd485b72c 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -135,9 +135,9 @@ static constexpr const int32_t WH = 273; 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 ), // NB: 3 widgets + 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 ), // NB: 3 widgets + MakeSpinnerWidgets({176, 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 ), @@ -161,9 +161,9 @@ static rct_widget SimplexWidgets[] = { MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} 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 ), // WIDX_SIMPLEX_MAP_SIZE_Y{,_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 ), // WIDX_SIMPLEX_MAP_SIZE_X{,_UP,_DOWN} + MakeSpinnerWidgets({176, 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 @@ -378,7 +378,16 @@ static void WindowMapgenSetPage(rct_window* w, int32_t page); static void WindowMapgenSetPressedTab(rct_window* w); static void WindowMapgenDrawTabImages(rct_drawpixelinfo* dpi, rct_window* w); +enum class ResizeDirection +{ + Both, + X, + Y, +}; + static TileCoordsXY _mapSize{ 150, 150 }; +static ResizeDirection _resizeDirection{ ResizeDirection::Both }; +static bool _mapWidthAndHeightLinked{ true }; static int32_t _baseHeight = 12; static int32_t _waterLevel = 6; static int32_t _floorTexture = 0; @@ -470,13 +479,15 @@ static void WindowMapgenBaseMouseup(rct_window* w, rct_widgetindex widgetIndex) ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); ft.Add(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); + WindowTextInputOpen( + w, WIDX_MAP_SIZE_Y, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.y - 2, 4); break; case WIDX_MAP_SIZE_X: // TODO: Dedupe code - handle similar to Map.cpp ft.Add(MINIMUM_MAP_SIZE_PRACTICAL); ft.Add(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); + WindowTextInputOpen( + w, WIDX_MAP_SIZE_X, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize.x - 2, 4); break; case WIDX_BASE_HEIGHT: ft.Add((BASESIZE_MIN - 12) / 2); @@ -637,7 +648,16 @@ static void WindowMapgenBaseInvalidate(rct_window* w) WindowInitScrollWidgets(w); } + // Only allow linking the map size when X and Y are the same + WidgetSetPressed(w, WIDX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); + WidgetSetDisabled(w, WIDX_MAP_SIZE_LINK, _mapSize.x != _mapSize.y); + WindowMapgenSetPressedTab(w); + + // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use + auto ft = Formatter::Common(); + ft.Add(_mapSize.y - 2); + ft.Add(_mapSize.x - 2); } static void WindowMapgenDrawDropdownButton(rct_window* w, rct_drawpixelinfo* dpi, rct_widgetindex widgetIndex, ImageId image) @@ -698,7 +718,7 @@ static void WindowMapgenBasePaint(rct_window* w, rct_drawpixelinfo* dpi) const auto textColour = w->colours[1]; DrawTextBasic( - dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_COMMA16, {}, { textColour }); + dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, { textColour }); @@ -708,16 +728,7 @@ static void WindowMapgenBasePaint(rct_window* w, rct_drawpixelinfo* dpi) DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, { textColour }); - // The practical map size is 2 lower than the technical map size - // This needs to be cast down to a uint16_t because that's what the STR_RESOLUTION_X_BY_Y string takes. auto ft = Formatter(); - ft.Add(static_cast(_mapSize.y - 2)); - ft.Add(static_cast(_mapSize.x - 2)); - DrawTextBasic( - dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_MAP_SIZE_Y].left + 1, w->widgets[WIDX_MAP_SIZE_Y].top + 1 }, - STR_RESOLUTION_X_BY_Y, ft, { w->colours[1] }); - - ft = Formatter(); ft.Add((_baseHeight - 12) / 2); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_BASE_HEIGHT].left + 1, w->widgets[WIDX_BASE_HEIGHT].top + 1 }, @@ -991,7 +1002,8 @@ static void WindowMapgenSimplexInvalidate(rct_window* w) } // Only allow linking the map size when X and Y are the same - WidgetSetDisabled(w, WIDX_SIMPLEX_MAP_SIZE_LINK, gMapSize.x != gMapSize.y); + WidgetSetPressed(w, WIDX_SIMPLEX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); + WidgetSetDisabled(w, WIDX_SIMPLEX_MAP_SIZE_LINK, _mapSize.x != _mapSize.y); WidgetSetCheckboxValue(w, WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX, _randomTerrain != 0); WidgetSetCheckboxValue(w, WIDX_SIMPLEX_PLACE_TREES_CHECKBOX, _placeTrees != 0); @@ -1009,6 +1021,11 @@ static void WindowMapgenSimplexInvalidate(rct_window* w) } WindowMapgenSetPressedTab(w); + + // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use + auto ft = Formatter::Common(); + ft.Add(_mapSize.y - 2); + ft.Add(_mapSize.x - 2); } static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi) @@ -1032,7 +1049,7 @@ static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi) dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES, {}, { textColour }); DrawTextBasic( - dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, STR_COMMA16, {}, { textColour }); + dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); DrawTextBasic( dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, { textColour }); @@ -1067,16 +1084,6 @@ static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi) dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_PLACE_TREES_CHECKBOX].top + 1 }, STR_MAPGEN_OPTION_PLACE_TREES, {}, { textColour }); - // The practical map size is 2 lower than the technical map size. - // This needs to be cast down to a uint16_t because that's what the STR_RESOLUTION_X_BY_Y string takes. - ft = Formatter(); - ft.Add(static_cast(_mapSize.y - 2)); - ft.Add(static_cast(_mapSize.x - 2)); - DrawTextBasic( - dpi, - w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].left + 1, w->widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, - STR_RESOLUTION_X_BY_Y, ft, { textColour }); - ft = Formatter(); ft.Add((_waterLevel - 12) / 2); DrawTextBasic( From 6d04e21518e396c4d5f579087a2dcf2cb94e7471 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sun, 5 Jun 2022 00:25:00 +0200 Subject: [PATCH 5/6] Make map size spinners in mapgen window functional --- src/openrct2-ui/windows/MapGen.cpp | 113 +++++++++++++++++------------ 1 file changed, 65 insertions(+), 48 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 5bd485b72c..9a756e0a7e 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -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(MINIMUM_MAP_SIZE_PRACTICAL); + ft.Add(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(MINIMUM_MAP_SIZE_PRACTICAL); - ft.Add(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(MINIMUM_MAP_SIZE_PRACTICAL); - ft.Add(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((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(MINIMUM_MAP_SIZE_PRACTICAL); - ft.Add(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(MINIMUM_MAP_SIZE_PRACTICAL); - ft.Add(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: From 5592e88ea73c9da0bb749fe8ecf4f5ebebe9209c Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sun, 5 Jun 2022 09:53:25 +0200 Subject: [PATCH 6/6] Add changelog entry --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 90286c4dd6..efef6c1557 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -11,6 +11,7 @@ - Improved: [#17059] Show Tile Inspector usage hint when nothing is selected. - Improved: [#17199] Allow creation of Spiral Slide reskins. - Improved: [#17242] More natural looking shorelines in map generator. +- Improved: [#17328] Parks can now be resized into rectangular shapes from the map and map generation windows. - Change: [#16952] Make “Object Selection” order more coherent. - Change: [#17294] New ride window remembers scroll position per tab instead of highlighted ride. - Removed: [#16864] Title sequence editor (replaced by plug-in).