mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #17328
This commit is contained in:
commit
d1d1a8507b
|
@ -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 #
|
||||
|
|
|
@ -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).
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 154 B |
|
@ -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,
|
||||
|
|
|
@ -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<uint16_t>(gMapSize.x - 2);
|
||||
ft.Add<uint16_t>(gMapSize.y - 2);
|
||||
ft.Add<uint16_t>(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<int16_t>(MINIMUM_MAP_SIZE_PRACTICAL);
|
||||
ft.Add<int16_t>(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<uint8_t> _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
|
||||
|
|
|
@ -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, STR_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 ),
|
||||
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, STR_COMMA16 ), // WIDX_SIMPLEX_MAP_SIZE_Y{,_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
|
||||
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),
|
||||
|
||||
|
@ -362,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);
|
||||
|
||||
static int32_t _mapSize = 150;
|
||||
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;
|
||||
|
@ -383,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);
|
||||
|
@ -430,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)
|
||||
|
@ -450,11 +497,16 @@ static void WindowMapgenBaseMouseup(rct_window* w, rct_widgetindex widgetIndex)
|
|||
mapgen_generate_blank(&mapgenSettings);
|
||||
gfx_invalidate_screen();
|
||||
break;
|
||||
case WIDX_MAP_SIZE:
|
||||
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, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize - 2, 4);
|
||||
case WIDX_MAP_SIZE_Y:
|
||||
_resizeDirection = ResizeDirection::Y;
|
||||
WindowMapgenInputMapSize(w, WIDX_MAP_SIZE_Y, _mapSize.y);
|
||||
break;
|
||||
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);
|
||||
|
@ -475,12 +527,24 @@ static void WindowMapgenBaseMousedown(rct_window* w, rct_widgetindex widgetIndex
|
|||
{
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WIDX_MAP_SIZE_UP:
|
||||
_mapSize = std::min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL);
|
||||
case WIDX_MAP_SIZE_Y_UP:
|
||||
_resizeDirection = ResizeDirection::Y;
|
||||
WindowMapgenChangeMapSize(+1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_MAP_SIZE_DOWN:
|
||||
_mapSize = std::max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL);
|
||||
case WIDX_MAP_SIZE_Y_DOWN:
|
||||
_resizeDirection = ResizeDirection::Y;
|
||||
WindowMapgenChangeMapSize(-1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_MAP_SIZE_X_UP:
|
||||
_resizeDirection = ResizeDirection::X;
|
||||
WindowMapgenChangeMapSize(+1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_MAP_SIZE_X_DOWN:
|
||||
_resizeDirection = ResizeDirection::X;
|
||||
WindowMapgenChangeMapSize(-1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_BASE_HEIGHT_UP:
|
||||
|
@ -576,11 +640,16 @@ 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_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 = 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);
|
||||
|
@ -601,7 +670,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<uint16_t>(_mapSize.y - 2);
|
||||
ft.Add<uint16_t>(_mapSize.x - 2);
|
||||
}
|
||||
|
||||
static void WindowMapgenDrawDropdownButton(rct_window* w, rct_drawpixelinfo* dpi, rct_widgetindex widgetIndex, ImageId image)
|
||||
|
@ -661,7 +739,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_MAP_SIZE, {}, { textColour });
|
||||
DrawTextBasic(
|
||||
dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {},
|
||||
{ textColour });
|
||||
|
@ -671,16 +750,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<uint16_t>(static_cast<uint16_t>(_mapSize - 2));
|
||||
ft.Add<uint16_t>(static_cast<uint16_t>(_mapSize - 2));
|
||||
DrawTextBasic(
|
||||
dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_MAP_SIZE].left + 1, w->widgets[WIDX_MAP_SIZE].top + 1 },
|
||||
STR_RESOLUTION_X_BY_Y, ft, { w->colours[1] });
|
||||
|
||||
ft = Formatter();
|
||||
ft.Add<uint16_t>((_baseHeight - 12) / 2);
|
||||
DrawTextBasic(
|
||||
dpi, w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_BASE_HEIGHT].left + 1, w->widgets[WIDX_BASE_HEIGHT].top + 1 },
|
||||
|
@ -777,16 +847,17 @@ static void WindowMapgenSimplexMouseup(rct_window* w, rct_widgetindex widgetInde
|
|||
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WIDX_SIMPLEX_MAP_SIZE:
|
||||
{
|
||||
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, STR_MAP_SIZE_2, STR_ENTER_MAP_SIZE, ft, STR_FORMAT_INTEGER, _mapSize - 2, 4);
|
||||
case WIDX_SIMPLEX_MAP_SIZE_Y:
|
||||
_resizeDirection = ResizeDirection::Y;
|
||||
WindowMapgenInputMapSize(w, WIDX_SIMPLEX_MAP_SIZE_Y, _mapSize.y);
|
||||
break;
|
||||
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;
|
||||
|
||||
|
@ -843,12 +914,24 @@ 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:
|
||||
_mapSize = std::min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL);
|
||||
case WIDX_SIMPLEX_MAP_SIZE_Y_UP:
|
||||
_resizeDirection = ResizeDirection::Y;
|
||||
WindowMapgenChangeMapSize(+1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_SIMPLEX_MAP_SIZE_DOWN:
|
||||
_mapSize = std::max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL);
|
||||
case WIDX_SIMPLEX_MAP_SIZE_Y_DOWN:
|
||||
_resizeDirection = ResizeDirection::Y;
|
||||
WindowMapgenChangeMapSize(-1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_SIMPLEX_MAP_SIZE_X_UP:
|
||||
_resizeDirection = ResizeDirection::X;
|
||||
WindowMapgenChangeMapSize(+1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_SIMPLEX_MAP_SIZE_X_DOWN:
|
||||
_resizeDirection = ResizeDirection::X;
|
||||
WindowMapgenChangeMapSize(-1);
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_SIMPLEX_WATER_LEVEL_UP:
|
||||
|
@ -935,6 +1018,10 @@ static void WindowMapgenSimplexInvalidate(rct_window* w)
|
|||
WindowInitScrollWidgets(w);
|
||||
}
|
||||
|
||||
// Only allow linking the map size when X and Y are the same
|
||||
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);
|
||||
|
||||
|
@ -951,6 +1038,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<uint16_t>(_mapSize.y - 2);
|
||||
ft.Add<uint16_t>(_mapSize.x - 2);
|
||||
}
|
||||
|
||||
static void WindowMapgenSimplexPaint(rct_window* w, rct_drawpixelinfo* dpi)
|
||||
|
@ -974,7 +1066,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_MAP_SIZE, {}, { textColour });
|
||||
DrawTextBasic(
|
||||
dpi, w->windowPos + ScreenCoordsXY{ 5, w->widgets[WIDX_SIMPLEX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {},
|
||||
{ textColour });
|
||||
|
@ -1009,16 +1101,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<uint16_t>(static_cast<uint16_t>(_mapSize - 2));
|
||||
ft.Add<uint16_t>(static_cast<uint16_t>(_mapSize - 2));
|
||||
DrawTextBasic(
|
||||
dpi,
|
||||
w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_SIMPLEX_MAP_SIZE].left + 1, w->widgets[WIDX_SIMPLEX_MAP_SIZE].top + 1 },
|
||||
STR_RESOLUTION_X_BY_Y, ft, { textColour });
|
||||
|
||||
ft = Formatter();
|
||||
ft.Add<uint16_t>((_waterLevel - 12) / 2);
|
||||
DrawTextBasic(
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue