1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-23 07:43:01 +01:00

Merge pull request #11560 from tupaschoal/more-coordz

Scours through openrct2-ui to use more coords structs
This commit is contained in:
Michael Steenbeek
2020-05-01 19:01:37 +02:00
committed by GitHub
5 changed files with 126 additions and 155 deletions

View File

@@ -202,24 +202,20 @@ rct_window* window_create_auto_pos(
// }
// Place window in an empty corner of the screen
int32_t x = 0;
int32_t y = 30;
if (window_fits_within_space({ x, y }, width, height))
auto screenPos = ScreenCoordsXY{ 0, 30 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = screenWidth - width;
y = 30;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { screenWidth - width, 30 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = 0;
y = screenHeight - 34 - height;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { 0, screenHeight - 34 - height };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = screenWidth - width;
y = screenHeight - 34 - height;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { screenWidth - width, screenHeight - 34 - height };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
// Place window next to another
@@ -228,44 +224,36 @@ rct_window* window_create_auto_pos(
if (w->flags & WF_STICK_TO_BACK)
continue;
x = w->windowPos.x + w->width + 2;
y = w->windowPos.y;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x + w->width + 2, w->windowPos.y };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x - w->width - 2;
y = w->windowPos.y;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x - w->width - 2, w->windowPos.y };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x;
y = w->windowPos.y + w->height + 2;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x, w->windowPos.y + w->height + 2 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x;
y = w->windowPos.y - w->height - 2;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x, w->windowPos.y - w->height - 2 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x + w->width + 2;
y = w->windowPos.y - w->height - 2;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x + w->width + 2, w->windowPos.y - w->height - 2 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x - w->width - 2;
y = w->windowPos.y - w->height - 2;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x - w->width - 2, w->windowPos.y - w->height - 2 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x + w->width + 2;
y = w->windowPos.y + w->height + 2;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x + w->width + 2, w->windowPos.y + w->height + 2 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x - w->width - 2;
y = w->windowPos.y + w->height + 2;
if (window_fits_within_space({ x, y }, width, height))
screenPos = { w->windowPos.x - w->width - 2, w->windowPos.y + w->height + 2 };
if (window_fits_within_space(screenPos, width, height))
goto foundSpace;
}
@@ -275,47 +263,42 @@ rct_window* window_create_auto_pos(
if (w->flags & WF_STICK_TO_BACK)
continue;
x = w->windowPos.x + w->width + 2;
y = w->windowPos.y;
if (window_fits_on_screen({ x, y }, width, height))
screenPos = { w->windowPos.x + w->width + 2, w->windowPos.y };
if (window_fits_on_screen(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x - w->width - 2;
y = w->windowPos.y;
if (window_fits_on_screen({ x, y }, width, height))
screenPos = { w->windowPos.x - w->width - 2, w->windowPos.y };
if (window_fits_on_screen(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x;
y = w->windowPos.y + w->height + 2;
if (window_fits_on_screen({ x, y }, width, height))
screenPos = { w->windowPos.x, w->windowPos.y + w->height + 2 };
if (window_fits_on_screen(screenPos, width, height))
goto foundSpace;
x = w->windowPos.x;
y = w->windowPos.y - w->height - 2;
if (window_fits_on_screen({ x, y }, width, height))
screenPos = { w->windowPos.x, w->windowPos.y - w->height - 2 };
if (window_fits_on_screen(screenPos, width, height))
goto foundSpace;
}
// Cascade
x = 0;
y = 30;
screenPos = { 0, 30 };
for (auto& w : g_window_list)
{
if (x == w->windowPos.x && y == w->windowPos.y)
if (screenPos == w->windowPos)
{
x += 5;
y += 5;
screenPos.x += 5;
screenPos.y += 5;
}
}
// Clamp to inside the screen
foundSpace:
if (x < 0)
x = 0;
if (x + width > screenWidth)
x = screenWidth - width;
if (screenPos.x < 0)
screenPos.x = 0;
if (screenPos.x + width > screenWidth)
screenPos.x = screenWidth - width;
return window_create(ScreenCoordsXY(x, y), width, height, event_handlers, cls, flags);
return window_create(screenPos, width, height, event_handlers, cls, flags);
}
rct_window* window_create_centred(
@@ -325,9 +308,8 @@ rct_window* window_create_centred(
auto screenWidth = uiContext->GetWidth();
auto screenHeight = uiContext->GetHeight();
int32_t x = (screenWidth - width) / 2;
int32_t y = std::max(TOP_TOOLBAR_HEIGHT + 1, (screenHeight - height) / 2);
return window_create(ScreenCoordsXY(x, y), width, height, event_handlers, cls, flags);
auto screenPos = ScreenCoordsXY{ (screenWidth - width) / 2, std::max(TOP_TOOLBAR_HEIGHT + 1, (screenHeight - height) / 2) };
return window_create(screenPos, width, height, event_handlers, cls, flags);
}
static int32_t window_get_widget_index(rct_window* w, rct_widget* widget)

View File

@@ -4407,7 +4407,7 @@ static int32_t window_ride_has_track_colour(Ride* ride, int32_t trackColour)
}
}
static void window_ride_set_track_colour_scheme(rct_window* w, int32_t x, int32_t y)
static void window_ride_set_track_colour_scheme(rct_window* w, const ScreenCoordsXY& screenPos)
{
TileElement* tileElement;
uint8_t newColourScheme;
@@ -4416,9 +4416,7 @@ static void window_ride_set_track_colour_scheme(rct_window* w, int32_t x, int32_
newColourScheme = static_cast<uint8_t>(w->ride_colour);
CoordsXY mapCoord = {};
get_map_coordinates_from_pos({ x, y }, VIEWPORT_INTERACTION_MASK_RIDE, mapCoord, &interactionType, &tileElement, nullptr);
x = mapCoord.x;
y = mapCoord.y;
get_map_coordinates_from_pos(screenPos, VIEWPORT_INTERACTION_MASK_RIDE, mapCoord, &interactionType, &tileElement, nullptr);
if (interactionType != VIEWPORT_INTERACTION_ITEM_RIDE)
return;
@@ -4432,7 +4430,7 @@ static void window_ride_set_track_colour_scheme(rct_window* w, int32_t x, int32_
z = tileElement->GetBaseZ();
direction = tileElement->GetDirection();
auto gameAction = RideSetColourSchemeAction(
CoordsXYZD{ x, y, z, static_cast<Direction>(direction) }, tileElement->AsTrack()->GetTrackType(), newColourScheme);
CoordsXYZD{ mapCoord, z, static_cast<Direction>(direction) }, tileElement->AsTrack()->GetTrackType(), newColourScheme);
GameActions::Execute(&gameAction);
}
@@ -4749,7 +4747,7 @@ static void window_ride_colour_update(rct_window* w)
static void window_ride_colour_tooldown(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords)
{
if (widgetIndex == WIDX_PAINT_INDIVIDUAL_AREA)
window_ride_set_track_colour_scheme(w, screenCoords.x, screenCoords.y);
window_ride_set_track_colour_scheme(w, screenCoords);
}
/**
@@ -4759,7 +4757,7 @@ static void window_ride_colour_tooldown(rct_window* w, rct_widgetindex widgetInd
static void window_ride_colour_tooldrag(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords)
{
if (widgetIndex == WIDX_PAINT_INDIVIDUAL_AREA)
window_ride_set_track_colour_scheme(w, screenCoords.x, screenCoords.y);
window_ride_set_track_colour_scheme(w, screenCoords);
}
/**

View File

@@ -214,9 +214,8 @@ static void window_sign_mouseup(rct_window* w, rct_widgetindex widgetIndex)
case WIDX_SIGN_DEMOLISH:
{
auto banner = GetBanner(w->number);
int32_t x = banner->position.x << 5;
int32_t y = banner->position.y << 5;
auto tile_element = map_get_first_element_at({ x, y });
auto bannerCoords = banner->position.ToCoordsXY();
auto tile_element = map_get_first_element_at(bannerCoords);
if (tile_element == nullptr)
return;
while (1)
@@ -235,7 +234,7 @@ static void window_sign_mouseup(rct_window* w, rct_widgetindex widgetIndex)
}
auto sceneryRemoveAction = LargeSceneryRemoveAction(
{ x, y, tile_element->GetBaseZ(), tile_element->GetDirection() },
{ bannerCoords, tile_element->GetBaseZ(), tile_element->GetDirection() },
tile_element->AsLargeScenery()->GetSequenceIndex());
GameActions::Execute(&sceneryRemoveAction);
break;
@@ -458,9 +457,8 @@ static void window_sign_small_mouseup(rct_window* w, rct_widgetindex widgetIndex
case WIDX_SIGN_DEMOLISH:
{
auto banner = GetBanner(w->number);
int32_t x = banner->position.x << 5;
int32_t y = banner->position.y << 5;
auto tile_element = map_get_first_element_at({ x, y });
auto bannerCoords = banner->position.ToCoordsXY();
auto tile_element = map_get_first_element_at(bannerCoords);
if (tile_element == nullptr)
return;
while (true)
@@ -476,7 +474,7 @@ static void window_sign_small_mouseup(rct_window* w, rct_widgetindex widgetIndex
}
tile_element++;
}
CoordsXYZD wallLocation = { x, y, tile_element->GetBaseZ(), tile_element->GetDirection() };
CoordsXYZD wallLocation = { bannerCoords, tile_element->GetBaseZ(), tile_element->GetDirection() };
auto wallRemoveAction = WallRemoveAction(wallLocation);
GameActions::Execute(&wallRemoveAction);
break;

View File

@@ -995,7 +995,7 @@ static void window_top_toolbar_paint(rct_window* w, rct_drawpixelinfo* dpi)
*
* rct2: 0x006E3158
*/
static void repaint_scenery_tool_down(int16_t x, int16_t y, rct_widgetindex widgetIndex)
static void repaint_scenery_tool_down(const ScreenCoordsXY& windowPos, rct_widgetindex widgetIndex)
{
// ax, cx, bl
int32_t type;
@@ -1008,7 +1008,7 @@ static void repaint_scenery_tool_down(int16_t x, int16_t y, rct_widgetindex widg
// not used
rct_viewport* viewport;
CoordsXY gridCoords;
get_map_coordinates_from_pos({ x, y }, flags, gridCoords, &type, &tile_element, &viewport);
get_map_coordinates_from_pos(windowPos, flags, gridCoords, &type, &tile_element, &viewport);
switch (type)
{
@@ -1081,7 +1081,7 @@ static void repaint_scenery_tool_down(int16_t x, int16_t y, rct_widgetindex widg
}
}
static void scenery_eyedropper_tool_down(int16_t x, int16_t y, rct_widgetindex widgetIndex)
static void scenery_eyedropper_tool_down(const ScreenCoordsXY& windowPos, rct_widgetindex widgetIndex)
{
auto flags = VIEWPORT_INTERACTION_MASK_SCENERY & VIEWPORT_INTERACTION_MASK_WALL & VIEWPORT_INTERACTION_MASK_LARGE_SCENERY
& VIEWPORT_INTERACTION_MASK_BANNER & VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM;
@@ -1090,7 +1090,7 @@ static void scenery_eyedropper_tool_down(int16_t x, int16_t y, rct_widgetindex w
TileElement* tileElement;
rct_viewport* viewport;
CoordsXY unusedCoords;
get_map_coordinates_from_pos({ x, y }, flags, unusedCoords, &type, &tileElement, &viewport);
get_map_coordinates_from_pos(windowPos, flags, unusedCoords, &type, &tileElement, &viewport);
switch (type)
{
@@ -1186,8 +1186,8 @@ static void scenery_eyedropper_tool_down(int16_t x, int16_t y, rct_widgetindex w
* edi : parameter_3
*/
static void sub_6E1F34(
int16_t x, int16_t y, ScenerySelection selection, CoordsXY& gridPos, uint32_t* parameter_1, uint32_t* parameter_2,
uint32_t* parameter_3)
const ScreenCoordsXY& sourceScreenPos, ScenerySelection selection, CoordsXY& gridPos, uint32_t* parameter_1,
uint32_t* parameter_2, uint32_t* parameter_3)
{
rct_window* w = window_find_by_class(WC_SCENERY);
@@ -1197,6 +1197,7 @@ static void sub_6E1F34(
return;
}
auto screenPos = sourceScreenPos;
uint16_t maxPossibleHeight = (std::numeric_limits<decltype(TileElement::base_height)>::max() - 32) * ZoomLevel::max();
bool can_raise_item = false;
@@ -1251,7 +1252,7 @@ static void sub_6E1F34(
& VIEWPORT_INTERACTION_MASK_LARGE_SCENERY;
int32_t interaction_type;
CoordsXY unusedCoords;
get_map_coordinates_from_pos({ x, y }, flags, unusedCoords, &interaction_type, &tile_element, nullptr);
get_map_coordinates_from_pos(screenPos, flags, unusedCoords, &interaction_type, &tile_element, nullptr);
if (interaction_type != VIEWPORT_INTERACTION_ITEM_NONE)
{
@@ -1275,8 +1276,8 @@ static void sub_6E1F34(
{
// SHIFT pressed
gSceneryShiftPressed = true;
gSceneryShiftPressX = x;
gSceneryShiftPressY = y;
gSceneryShiftPressX = screenPos.x;
gSceneryShiftPressY = screenPos.y;
gSceneryShiftPressZOffset = 0;
}
}
@@ -1285,7 +1286,7 @@ static void sub_6E1F34(
if (input_test_place_object_modifier(PLACE_OBJECT_MODIFIER_SHIFT_Z))
{
// SHIFT pressed
gSceneryShiftPressZOffset = (gSceneryShiftPressY - y + 4);
gSceneryShiftPressZOffset = (gSceneryShiftPressY - screenPos.y + 4);
// Scale delta by zoom to match mouse position.
auto* mainWnd = window_get_main();
if (mainWnd && mainWnd->viewport)
@@ -1294,8 +1295,8 @@ static void sub_6E1F34(
}
gSceneryShiftPressZOffset = floor2(gSceneryShiftPressZOffset, 8);
x = gSceneryShiftPressX;
y = gSceneryShiftPressY;
screenPos.x = gSceneryShiftPressX;
screenPos.y = gSceneryShiftPressY;
}
else
{
@@ -1318,7 +1319,7 @@ static void sub_6E1F34(
// If CTRL not pressed
if (!gSceneryCtrlPressed)
{
auto gridCoords = screen_get_map_xy_quadrant({ x, y }, &quadrant);
auto gridCoords = screen_get_map_xy_quadrant(screenPos, &quadrant);
if (!gridCoords)
{
gridPos.setNull();
@@ -1351,7 +1352,7 @@ static void sub_6E1F34(
{
int16_t z = gSceneryCtrlPressZ;
auto mapCoords = screen_get_map_xy_quadrant_with_z({ x, y }, z, &quadrant);
auto mapCoords = screen_get_map_xy_quadrant_with_z(screenPos, z, &quadrant);
if (!mapCoords)
{
gridPos.setNull();
@@ -1404,7 +1405,7 @@ static void sub_6E1F34(
TileElement* tile_element;
CoordsXY gridCoords;
get_map_coordinates_from_pos({ x, y }, flags, gridCoords, &interaction_type, &tile_element, nullptr);
get_map_coordinates_from_pos(screenPos, flags, gridCoords, &interaction_type, &tile_element, nullptr);
gridPos = gridCoords;
if (interaction_type == VIEWPORT_INTERACTION_ITEM_NONE)
@@ -1438,7 +1439,7 @@ static void sub_6E1F34(
else
{
int16_t z = gSceneryCtrlPressZ;
auto coords = screen_get_map_xy_with_z({ x, y }, z);
auto coords = screen_get_map_xy_with_z(screenPos, z);
if (coords)
{
gridPos = *coords;
@@ -1486,7 +1487,7 @@ static void sub_6E1F34(
TileElement* tile_element;
CoordsXY gridCoords;
get_map_coordinates_from_pos({ x, y }, flags, gridCoords, &interaction_type, &tile_element, nullptr);
get_map_coordinates_from_pos(screenPos, flags, gridCoords, &interaction_type, &tile_element, nullptr);
gridPos = gridCoords;
if (interaction_type == VIEWPORT_INTERACTION_ITEM_NONE)
@@ -1514,7 +1515,7 @@ static void sub_6E1F34(
// If CTRL not pressed
if (!gSceneryCtrlPressed)
{
auto gridCoords = screen_get_map_xy_side({ x, y }, &cl);
auto gridCoords = screen_get_map_xy_side(screenPos, &cl);
if (!gridCoords)
{
gridPos.setNull();
@@ -1546,7 +1547,7 @@ static void sub_6E1F34(
else
{
int16_t z = gSceneryCtrlPressZ;
auto mapCoords = screen_get_map_xy_side_with_z({ x, y }, z, &cl);
auto mapCoords = screen_get_map_xy_side_with_z(screenPos, z, &cl);
if (!mapCoords)
{
gridPos.setNull();
@@ -1582,7 +1583,7 @@ static void sub_6E1F34(
// If CTRL not pressed
if (!gSceneryCtrlPressed)
{
const CoordsXY mapCoords = sub_68A15E({ x, y });
const CoordsXY mapCoords = sub_68A15E(screenPos);
gridPos = mapCoords;
if (gridPos.isNull())
@@ -1612,7 +1613,7 @@ static void sub_6E1F34(
else
{
int16_t z = gSceneryCtrlPressZ;
auto coords = screen_get_map_xy_with_z({ x, y }, z);
auto coords = screen_get_map_xy_with_z(screenPos, z);
if (coords)
{
gridPos = *coords;
@@ -1655,7 +1656,7 @@ static void sub_6E1F34(
TileElement* tile_element;
CoordsXY gridCoords;
get_map_coordinates_from_pos({ x, y }, flags, gridCoords, &interaction_type, &tile_element, nullptr);
get_map_coordinates_from_pos(screenPos, flags, gridCoords, &interaction_type, &tile_element, nullptr);
gridPos = gridCoords;
if (interaction_type == VIEWPORT_INTERACTION_ITEM_NONE)
@@ -1699,8 +1700,7 @@ static void sub_6E1F34_small_scenery(
colour_t* outPrimaryColour, colour_t* outSecondaryColour)
{
uint32_t parameter1 = 0, parameter2 = 0, parameter3 = 0;
sub_6E1F34(
screenCoords.x, screenCoords.y, { SCENERY_TYPE_SMALL, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
sub_6E1F34(screenCoords, { SCENERY_TYPE_SMALL, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
*outQuadrant = parameter2 & 0xFF;
*outPrimaryColour = (parameter2 >> 8) & 0xFF;
@@ -1710,9 +1710,7 @@ static void sub_6E1F34_small_scenery(
static void sub_6E1F34_path_item(const ScreenCoordsXY& screenCoords, uint16_t sceneryIndex, CoordsXY& gridPos, int32_t* outZ)
{
uint32_t parameter1 = 0, parameter2 = 0, parameter3 = 0;
sub_6E1F34(
screenCoords.x, screenCoords.y, { SCENERY_TYPE_PATH_ITEM, sceneryIndex }, gridPos, &parameter1, &parameter2,
&parameter3);
sub_6E1F34(screenCoords, { SCENERY_TYPE_PATH_ITEM, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
*outZ = (parameter2 & 0xFF) * COORDS_Z_STEP;
}
@@ -1721,8 +1719,7 @@ static void sub_6E1F34_wall(
const ScreenCoordsXY& screenCoords, uint16_t sceneryIndex, CoordsXY& gridPos, colour_t* outPrimaryColour, uint8_t* outEdges)
{
uint32_t parameter1 = 0, parameter2 = 0, parameter3 = 0;
sub_6E1F34(
screenCoords.x, screenCoords.y, { SCENERY_TYPE_WALL, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
sub_6E1F34(screenCoords, { SCENERY_TYPE_WALL, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
*outPrimaryColour = (parameter2 >> 8) & 0xFF;
*outEdges = parameter2 & 0xFF;
@@ -1733,8 +1730,7 @@ static void sub_6E1F34_large_scenery(
colour_t* outSecondaryColour, Direction* outDirection)
{
uint32_t parameter1 = 0, parameter2 = 0, parameter3 = 0;
sub_6E1F34(
screenCoords.x, screenCoords.y, { SCENERY_TYPE_LARGE, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
sub_6E1F34(screenCoords, { SCENERY_TYPE_LARGE, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
*outPrimaryColour = parameter2 & 0xFF;
*outSecondaryColour = (parameter2 >> 8) & 0xFF;
@@ -1745,8 +1741,7 @@ static void sub_6E1F34_banner(
const ScreenCoordsXY& screenCoords, uint16_t sceneryIndex, CoordsXY& gridPos, int32_t* outZ, Direction* outDirection)
{
uint32_t parameter1 = 0, parameter2 = 0, parameter3 = 0;
sub_6E1F34(
screenCoords.x, screenCoords.y, { SCENERY_TYPE_BANNER, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
sub_6E1F34(screenCoords, { SCENERY_TYPE_BANNER, sceneryIndex }, gridPos, &parameter1, &parameter2, &parameter3);
*outDirection = (parameter2 >> 8) & 0xFF;
*outZ = (parameter2 & 0xFF) * COORDS_Z_PER_TINY_Z;
@@ -1756,17 +1751,17 @@ static void sub_6E1F34_banner(
*
* rct2: 0x006E2CC6
*/
static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_window* w, rct_widgetindex widgetIndex)
static void window_top_toolbar_scenery_tool_down(const ScreenCoordsXY& windowPos, rct_window* w, rct_widgetindex widgetIndex)
{
scenery_remove_ghost_tool_placement();
if (gWindowSceneryPaintEnabled & 1)
{
repaint_scenery_tool_down(x, y, widgetIndex);
repaint_scenery_tool_down(windowPos, widgetIndex);
return;
}
else if (gWindowSceneryEyedropperEnabled)
{
scenery_eyedropper_tool_down(x, y, widgetIndex);
scenery_eyedropper_tool_down(windowPos, widgetIndex);
return;
}
@@ -1786,7 +1781,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo
uint8_t quadrant;
colour_t primaryColour;
colour_t secondaryColour;
sub_6E1F34_small_scenery({ x, y }, selectedScenery, gridPos, &quadrant, &primaryColour, &secondaryColour);
sub_6E1F34_small_scenery(windowPos, selectedScenery, gridPos, &quadrant, &primaryColour, &secondaryColour);
if (gridPos.isNull())
return;
@@ -1906,7 +1901,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo
case SCENERY_TYPE_PATH_ITEM:
{
int32_t z;
sub_6E1F34_path_item({ x, y }, selectedScenery, gridPos, &z);
sub_6E1F34_path_item(windowPos, selectedScenery, gridPos, &z);
if (gridPos.isNull())
return;
@@ -1926,7 +1921,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo
{
colour_t primaryColour;
uint8_t edges;
sub_6E1F34_wall({ x, y }, selectedScenery, gridPos, &primaryColour, &edges);
sub_6E1F34_wall(windowPos, selectedScenery, gridPos, &primaryColour, &edges);
if (gridPos.isNull())
return;
@@ -1978,7 +1973,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo
colour_t primaryColour;
colour_t secondaryColour;
Direction direction;
sub_6E1F34_large_scenery({ x, y }, selectedScenery, gridPos, &primaryColour, &secondaryColour, &direction);
sub_6E1F34_large_scenery(windowPos, selectedScenery, gridPos, &primaryColour, &secondaryColour, &direction);
if (gridPos.isNull())
return;
@@ -2034,7 +2029,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo
{
int32_t z;
Direction direction;
sub_6E1F34_banner({ x, y }, selectedScenery, gridPos, &z, &direction);
sub_6E1F34_banner(windowPos, selectedScenery, gridPos, &z, &direction);
if (gridPos.isNull())
return;
@@ -2060,14 +2055,14 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo
}
}
static uint8_t top_toolbar_tool_update_land_paint(int16_t x, int16_t y)
static uint8_t top_toolbar_tool_update_land_paint(const ScreenCoordsXY& screenPos)
{
uint8_t state_changed = 0;
map_invalidate_selection_rect();
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE;
auto mapTile = screen_get_map_xy({ x, y }, nullptr);
auto mapTile = screen_get_map_xy(screenPos, nullptr);
if (!mapTile)
{
@@ -2134,9 +2129,9 @@ static uint8_t top_toolbar_tool_update_land_paint(int16_t x, int16_t y)
*
* rct2: 0x0068E213
*/
static void top_toolbar_tool_update_scenery_clear(int16_t x, int16_t y)
static void top_toolbar_tool_update_scenery_clear(const ScreenCoordsXY& screenPos)
{
if (!top_toolbar_tool_update_land_paint(x, y))
if (!top_toolbar_tool_update_land_paint(screenPos))
return;
auto action = GetClearAction();
@@ -2153,7 +2148,7 @@ static void top_toolbar_tool_update_scenery_clear(int16_t x, int16_t y)
*
* rct2: 0x00664280
*/
static void top_toolbar_tool_update_land(int16_t x, int16_t y)
static void top_toolbar_tool_update_land(const ScreenCoordsXY& screenPos)
{
const bool mapCtrlPressed = input_test_place_object_modifier(PLACE_OBJECT_MODIFIER_COPY_Z);
@@ -2185,8 +2180,8 @@ static void top_toolbar_tool_update_land(int16_t x, int16_t y)
{
int32_t selectionType;
// Get selection type and map coordinates from mouse x,y position
screen_pos_to_map_pos({ x, y }, &selectionType);
mapTile = screen_get_map_xy_side({ x, y }, &side);
screen_pos_to_map_pos(screenPos, &selectionType);
mapTile = screen_get_map_xy_side(screenPos, &side);
if (!mapTile)
{
@@ -2263,7 +2258,7 @@ static void top_toolbar_tool_update_land(int16_t x, int16_t y)
}
// Get map coordinates and the side of the tile that is being hovered over
mapTile = screen_get_map_xy_side({ x, y }, &side);
mapTile = screen_get_map_xy_side(screenPos, &side);
if (!mapTile)
{
@@ -2391,7 +2386,7 @@ static void top_toolbar_tool_update_land(int16_t x, int16_t y)
*
* rct2: 0x006E6BDC
*/
static void top_toolbar_tool_update_water(int16_t x, int16_t y)
static void top_toolbar_tool_update_water(const ScreenCoordsXY& screenPos)
{
map_invalidate_selection_rect();
@@ -2425,7 +2420,7 @@ static void top_toolbar_tool_update_water(int16_t x, int16_t y)
CoordsXY mapTile = {};
int32_t interaction_type = 0;
get_map_coordinates_from_pos(
{ x, y }, VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER, mapTile, &interaction_type, nullptr,
screenPos, VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER, mapTile, &interaction_type, nullptr,
nullptr);
if (interaction_type == VIEWPORT_INTERACTION_ITEM_NONE)
@@ -2693,7 +2688,7 @@ static money32 try_place_ghost_scenery(
*
* rct2: 0x006E287B
*/
static void top_toolbar_tool_update_scenery(int16_t x, int16_t y)
static void top_toolbar_tool_update_scenery(const ScreenCoordsXY& screenPos)
{
map_invalidate_selection_rect();
map_invalidate_map_selection_tiles();
@@ -2724,7 +2719,7 @@ static void top_toolbar_tool_update_scenery(int16_t x, int16_t y)
CoordsXY mapTile = {};
uint32_t parameter1, parameter2, parameter3;
sub_6E1F34(x, y, selection, mapTile, &parameter1, &parameter2, &parameter3);
sub_6E1F34(screenPos, selection, mapTile, &parameter1, &parameter2, &parameter3);
if (mapTile.isNull())
{
@@ -2952,19 +2947,19 @@ static void window_top_toolbar_tool_update(rct_window* w, rct_widgetindex widget
switch (widgetIndex)
{
case WIDX_CLEAR_SCENERY:
top_toolbar_tool_update_scenery_clear(screenCoords.x, screenCoords.y);
top_toolbar_tool_update_scenery_clear(screenCoords);
break;
case WIDX_LAND:
if (gLandPaintMode)
top_toolbar_tool_update_land_paint(screenCoords.x, screenCoords.y);
top_toolbar_tool_update_land_paint(screenCoords);
else
top_toolbar_tool_update_land(screenCoords.x, screenCoords.y);
top_toolbar_tool_update_land(screenCoords);
break;
case WIDX_WATER:
top_toolbar_tool_update_water(screenCoords.x, screenCoords.y);
top_toolbar_tool_update_water(screenCoords);
break;
case WIDX_SCENERY:
top_toolbar_tool_update_scenery(screenCoords.x, screenCoords.y);
top_toolbar_tool_update_scenery(screenCoords);
break;
}
}
@@ -3012,7 +3007,7 @@ static void window_top_toolbar_tool_down(rct_window* w, rct_widgetindex widgetIn
}
break;
case WIDX_SCENERY:
window_top_toolbar_scenery_tool_down(screenCoords.x, screenCoords.y, w, widgetIndex);
window_top_toolbar_scenery_tool_down(screenCoords, w, widgetIndex);
break;
}
}
@@ -3087,12 +3082,12 @@ static money32 selection_lower_land(uint8_t flags)
* part of window_top_toolbar_tool_drag(0x0066CB4E)
* rct2: 0x00664454
*/
static void window_top_toolbar_land_tool_drag(int16_t x, int16_t y)
static void window_top_toolbar_land_tool_drag(const ScreenCoordsXY& screenPos)
{
rct_window* window = window_find_from_point(ScreenCoordsXY(x, y));
rct_window* window = window_find_from_point(screenPos);
if (!window)
return;
rct_widgetindex widget_index = window_find_widget_from_point(window, ScreenCoordsXY(x, y));
rct_widgetindex widget_index = window_find_widget_from_point(window, screenPos);
if (widget_index == -1)
return;
rct_widget* widget = &window->widgets[widget_index];
@@ -3104,7 +3099,7 @@ static void window_top_toolbar_land_tool_drag(int16_t x, int16_t y)
int16_t tile_height = -16 / viewport->zoom;
int32_t y_diff = y - gInputDragLast.y;
int32_t y_diff = screenPos.y - gInputDragLast.y;
if (y_diff <= tile_height)
{
@@ -3130,12 +3125,12 @@ static void window_top_toolbar_land_tool_drag(int16_t x, int16_t y)
* part of window_top_toolbar_tool_drag(0x0066CB4E)
* rct2: 0x006E6D4B
*/
static void window_top_toolbar_water_tool_drag(int16_t x, int16_t y)
static void window_top_toolbar_water_tool_drag(const ScreenCoordsXY& screenPos)
{
rct_window* window = window_find_from_point(ScreenCoordsXY(x, y));
rct_window* window = window_find_from_point(screenPos);
if (!window)
return;
rct_widgetindex widget_index = window_find_widget_from_point(window, ScreenCoordsXY(x, y));
rct_widgetindex widget_index = window_find_widget_from_point(window, screenPos);
if (widget_index == -1)
return;
rct_widget* widget = &window->widgets[widget_index];
@@ -3147,9 +3142,9 @@ static void window_top_toolbar_water_tool_drag(int16_t x, int16_t y)
int16_t dx = -16 / viewport->zoom;
y -= gInputDragLast.y;
auto offsetPos = screenPos - ScreenCoordsXY{ 0, gInputDragLast.y };
if (y <= dx)
if (offsetPos.y <= dx)
{
gInputDragLast.y += dx;
@@ -3165,7 +3160,7 @@ static void window_top_toolbar_water_tool_drag(int16_t x, int16_t y)
dx = -dx;
if (y >= dx)
if (offsetPos.y >= dx)
{
gInputDragLast.y += dx;
@@ -3216,21 +3211,21 @@ static void window_top_toolbar_tool_drag(rct_window* w, rct_widgetindex widgetIn
{
if (!_landToolBlocked)
{
window_top_toolbar_land_tool_drag(screenCoords.x, screenCoords.y);
window_top_toolbar_land_tool_drag(screenCoords);
}
}
break;
case WIDX_WATER:
if (!_landToolBlocked)
{
window_top_toolbar_water_tool_drag(screenCoords.x, screenCoords.y);
window_top_toolbar_water_tool_drag(screenCoords);
}
break;
case WIDX_SCENERY:
if (gWindowSceneryPaintEnabled & 1)
window_top_toolbar_scenery_tool_down(screenCoords.x, screenCoords.y, w, widgetIndex);
window_top_toolbar_scenery_tool_down(screenCoords, w, widgetIndex);
if (gWindowSceneryEyedropperEnabled)
window_top_toolbar_scenery_tool_down(screenCoords.x, screenCoords.y, w, widgetIndex);
window_top_toolbar_scenery_tool_down(screenCoords, w, widgetIndex);
break;
}
}

View File

@@ -123,21 +123,19 @@ rct_window* window_track_list_open(RideSelection item)
String::Set(_filterString, sizeof(_filterString), "");
track_list_load_designs(item);
int32_t x, y;
ScreenCoordsXY screenPos{};
if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)
{
int32_t screenWidth = context_get_width();
int32_t screenHeight = context_get_height();
x = screenWidth / 2 - 300;
y = std::max(TOP_TOOLBAR_HEIGHT + 1, screenHeight / 2 - 200);
screenPos = { screenWidth / 2 - 300, std::max(TOP_TOOLBAR_HEIGHT + 1, screenHeight / 2 - 200) };
}
else
{
x = 0;
y = TOP_TOOLBAR_HEIGHT + 2;
screenPos = { 0, TOP_TOOLBAR_HEIGHT + 2 };
}
rct_window* w = window_create(ScreenCoordsXY(x, y), 600, 432, &window_track_list_events, WC_TRACK_DESIGN_LIST, 0);
rct_window* w = window_create(screenPos, 600, 432, &window_track_list_events, WC_TRACK_DESIGN_LIST, 0);
window_track_list_widgets[WIDX_FILTER_STRING].string = _filterString;
w->widgets = window_track_list_widgets;