Create CoordsXY::ToTileStart() and CoordsXY::ToTileCentre()

This commit is contained in:
Tulio Leao 2019-11-30 12:47:23 -03:00 committed by Michael Steenbeek
parent 58948793e9
commit 1532ee2b23
10 changed files with 39 additions and 27 deletions

View File

@ -695,5 +695,5 @@ CoordsXY sub_68A15E(ScreenCoordsXY screenCoords)
mapPos.y = std::clamp(mapPos.y, initialPos.y, initialPos.y + 31); mapPos.y = std::clamp(mapPos.y, initialPos.y, initialPos.y + 31);
} }
return { mapPos.x & ~0x1F, mapPos.y & ~0x1F }; return mapPos.ToTileStart();
} }

View File

@ -330,8 +330,7 @@ static void window_land_rights_tool_update_land_rights(ScreenCoordsXY screenCoor
// Move to tool bottom left // Move to tool bottom left
mapTile->x -= (tool_size - 1) * 16; mapTile->x -= (tool_size - 1) * 16;
mapTile->y -= (tool_size - 1) * 16; mapTile->y -= (tool_size - 1) * 16;
mapTile->x &= 0xFFE0; mapTile = mapTile->ToTileStart();
mapTile->y &= 0xFFE0;
if (gMapSelectPositionA.x != mapTile->x) if (gMapSelectPositionA.x != mapTile->x)
{ {

View File

@ -2212,7 +2212,7 @@ static std::optional<CoordsXY> ride_get_place_position_from_screen_position(Scre
if (mapCoords.x == LOCATION_NULL) if (mapCoords.x == LOCATION_NULL)
return std::nullopt; return std::nullopt;
return CoordsXY{ floor2(mapCoords.x, 32), floor2(mapCoords.y, 32) }; return mapCoords.ToTileStart();
} }
/** /**

View File

@ -2048,8 +2048,7 @@ static uint8_t top_toolbar_tool_update_land_paint(int16_t x, int16_t y)
// Move to tool bottom left // Move to tool bottom left
mapTile->x -= (tool_size - 1) * 16; mapTile->x -= (tool_size - 1) * 16;
mapTile->y -= (tool_size - 1) * 16; mapTile->y -= (tool_size - 1) * 16;
mapTile->x &= 0xFFE0; mapTile = mapTile->ToTileStart();
mapTile->y &= 0xFFE0;
if (gMapSelectPositionA.x != mapTile->x) if (gMapSelectPositionA.x != mapTile->x)
{ {
@ -2263,20 +2262,19 @@ static void top_toolbar_tool_update_land(int16_t x, int16_t y)
case MAP_SELECT_TYPE_EDGE_2: case MAP_SELECT_TYPE_EDGE_2:
// Line // Line
mapTile->y -= (tool_size - 1) * 16; mapTile->y -= (tool_size - 1) * 16;
mapTile->y &= 0xFFE0; mapTile->y = mapTile->ToTileStart().y;
break; break;
case MAP_SELECT_TYPE_EDGE_1: case MAP_SELECT_TYPE_EDGE_1:
case MAP_SELECT_TYPE_EDGE_3: case MAP_SELECT_TYPE_EDGE_3:
// Line // Line
mapTile->x -= (tool_size - 1) * 16; mapTile->x -= (tool_size - 1) * 16;
mapTile->x &= 0xFFE0; mapTile->x = mapTile->ToTileStart().x;
break; break;
default: default:
// Move to tool bottom left // Move to tool bottom left
mapTile->x -= (tool_size - 1) * 16; mapTile->x -= (tool_size - 1) * 16;
mapTile->y -= (tool_size - 1) * 16; mapTile->y -= (tool_size - 1) * 16;
mapTile->x &= 0xFFE0; mapTile = mapTile->ToTileStart();
mapTile->y &= 0xFFE0;
break; break;
} }

View File

@ -1037,11 +1037,9 @@ CoordsXY screen_pos_to_map_pos(ScreenCoordsXY screenCoords, int32_t* direction)
} }
} }
mapCoords->x = mapCoords->x & ~0x1F;
mapCoords->y = mapCoords->y & ~0x1F;
if (direction != nullptr) if (direction != nullptr)
*direction = my_direction; *direction = my_direction;
return *mapCoords; return mapCoords->ToTileStart();
} }
LocationXY16 screen_coord_to_viewport_coord(rct_viewport* viewport, ScreenCoordsXY screenCoords) LocationXY16 screen_coord_to_viewport_coord(rct_viewport* viewport, ScreenCoordsXY screenCoords)
@ -1815,7 +1813,7 @@ std::optional<CoordsXY> screen_get_map_xy_quadrant(ScreenCoordsXY screenCoords,
return std::nullopt; return std::nullopt;
*quadrant = map_get_tile_quadrant(mapCoords->x, mapCoords->y); *quadrant = map_get_tile_quadrant(mapCoords->x, mapCoords->y);
return CoordsXY(floor2(mapCoords->x, 32), floor2(mapCoords->y, 32)); return mapCoords->ToTileStart();
} }
/** /**
@ -1829,7 +1827,7 @@ std::optional<CoordsXY> screen_get_map_xy_quadrant_with_z(ScreenCoordsXY screenC
return std::nullopt; return std::nullopt;
*quadrant = map_get_tile_quadrant(mapCoords->x, mapCoords->y); *quadrant = map_get_tile_quadrant(mapCoords->x, mapCoords->y);
return CoordsXY(floor2(mapCoords->x, 32), floor2(mapCoords->y, 32)); return mapCoords->ToTileStart();
} }
/** /**
@ -1843,7 +1841,7 @@ std::optional<CoordsXY> screen_get_map_xy_side(ScreenCoordsXY screenCoords, uint
return std::nullopt; return std::nullopt;
*side = map_get_tile_side(mapCoords->x, mapCoords->y); *side = map_get_tile_side(mapCoords->x, mapCoords->y);
return CoordsXY(floor2(mapCoords->x, 32), floor2(mapCoords->y, 32)); return mapCoords->ToTileStart();
} }
/** /**
@ -1857,7 +1855,7 @@ std::optional<CoordsXY> screen_get_map_xy_side_with_z(ScreenCoordsXY screenCoord
return std::nullopt; return std::nullopt;
*side = map_get_tile_side(mapCoords->x, mapCoords->y); *side = map_get_tile_side(mapCoords->x, mapCoords->y);
return CoordsXY(floor2(mapCoords->x, 32), floor2(mapCoords->y, 32)); return mapCoords->ToTileStart();
} }
/** /**

View File

@ -4981,13 +4981,11 @@ void Guest::UpdateRideMazePathfinding()
targetLoc.y = destination_y; targetLoc.y = destination_y;
if (chosenEdge & 1) if (chosenEdge & 1)
{ {
targetLoc.x &= 0xFFE0; targetLoc.x = targetLoc.ToTileCentre().x;
targetLoc.x += 16;
} }
else else
{ {
targetLoc.y &= 0xFFE0; targetLoc.y = targetLoc.ToTileCentre().y;
targetLoc.y += 16;
} }
destination_x = targetLoc.x; destination_x = targetLoc.x;
destination_y = targetLoc.y; destination_y = targetLoc.y;

View File

@ -3078,7 +3078,8 @@ void Peep::PerformNextAction(uint8_t& pathing_result, TileElement*& tile_result)
} }
auto newLoc = *loc; auto newLoc = *loc;
if ((newLoc.x & 0xFFE0) == next_x && (newLoc.y & 0xFFE0) == next_y) CoordsXY truncatedNewLoc = newLoc.ToTileStart();
if (truncatedNewLoc.x == next_x && truncatedNewLoc.y == next_y)
{ {
int16_t height = GetZOnSlope(newLoc.x, newLoc.y); int16_t height = GetZOnSlope(newLoc.x, newLoc.y);
MoveTo(newLoc.x, newLoc.y, height); MoveTo(newLoc.x, newLoc.y, height);
@ -3175,8 +3176,8 @@ void Peep::PerformNextAction(uint8_t& pathing_result, TileElement*& tile_result)
} }
// The peep is on a surface and not on a path // The peep is on a surface and not on a path
next_x = newLoc.x & 0xFFE0; next_x = truncatedNewLoc.x;
next_y = newLoc.y & 0xFFE0; next_y = truncatedNewLoc.y;
next_z = surfaceElement->base_height; next_z = surfaceElement->base_height;
SetNextFlags(0, false, true); SetNextFlags(0, false, true);

View File

@ -6227,7 +6227,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(ScreenCoordsX
word_F4418C = coords->x; word_F4418C = coords->x;
word_F4418E = coords->y; word_F4418E = coords->y;
entranceExitCoords = { floor2(coords->x, 32), floor2(coords->y, 32), stationHeight, INVALID_DIRECTION }; entranceExitCoords = { coords->ToTileStart(), stationHeight, INVALID_DIRECTION };
if (ride->type == RIDE_TYPE_NULL) if (ride->type == RIDE_TYPE_NULL)
{ {

View File

@ -323,10 +323,12 @@ void footpath_get_coordinates_from_pos(
} }
} }
position = position.ToTileStart();
if (x != nullptr) if (x != nullptr)
*x = position.x & ~0x1F; *x = position.x;
if (y != nullptr) if (y != nullptr)
*y = position.y & ~0x1F; *y = position.y;
if (direction != nullptr) if (direction != nullptr)
*direction = myDirection; *direction = myDirection;
if (tileElement != nullptr) if (tileElement != nullptr)

View File

@ -139,6 +139,16 @@ struct CoordsXY
return rotatedCoords; return rotatedCoords;
} }
CoordsXY ToTileCentre() const
{
return ToTileStart() + CoordsXY{ 16, 16 };
}
CoordsXY ToTileStart() const
{
return { floor2(x, 32), floor2(y, 32) };
}
}; };
struct TileCoordsXY struct TileCoordsXY
@ -328,6 +338,12 @@ struct CoordsXYZD : public CoordsXYZ
{ {
} }
constexpr CoordsXYZD(CoordsXY _c, int32_t _z, Direction _d)
: CoordsXYZ(_c, _z)
, direction(_d)
{
}
bool operator==(const CoordsXYZD& other) const bool operator==(const CoordsXYZD& other) const
{ {
return x == other.x && y == other.y && z == other.z && direction == other.direction; return x == other.x && y == other.y && z == other.z && direction == other.direction;