1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-23 23:04:36 +01:00

refactor entrance hut finding function (#15360)

This commit is contained in:
spacek531
2021-09-07 23:33:48 -07:00
committed by GitHub
parent 75c2dbcf74
commit dba4518d11

View File

@@ -1202,35 +1202,36 @@ money32 set_operating_setting_nested(ride_id_t rideId, RideSetSetting setting, u
return res->Error == GameActions::Status::Ok ? 0 : MONEY32_UNDEFINED;
}
// Finds the direction a station should face for an NxN station when called with an N+2xN+2 grid size.
// Direction is valid only if the tile in question is on the outer tiles of the grid
static Direction GetEntranceExitDirection(
int16_t mapX, int16_t mapY, int16_t entranceMinX, int16_t entranceMinY, int16_t entranceMaxX, int16_t entranceMaxY)
// Finds the direction a ride entrance should face for an NxN station.
// Direction is valid if queryLocation is directly adjacent to this station.
static Direction GetRideEntranceDirection(CoordsXY& queryLocation, CoordsXY& entranceMin, CoordsXY& entranceMax)
{
if (mapX == entranceMinX)
entranceMin -= CoordsXY(32, 32);
entranceMax += CoordsXY(32, 32);
if (queryLocation.x == entranceMax.x)
{
if (mapY > entranceMinY && mapY < entranceMaxY)
if (queryLocation.y > entranceMin.y && queryLocation.y < entranceMax.y)
{
return 0;
}
}
if (mapY == entranceMaxY)
if (queryLocation.y == entranceMax.y)
{
if (mapX > entranceMinX && mapX < entranceMaxX)
if (queryLocation.x > entranceMin.x && queryLocation.x < entranceMax.x)
{
return 1;
}
}
if (mapX == entranceMaxX)
if (queryLocation.x == entranceMin.x)
{
if (mapY > entranceMinY && mapY < entranceMaxY)
if (queryLocation.y > entranceMin.y && queryLocation.y < entranceMax.y)
{
return 2;
}
}
if (mapY == entranceMinY)
if (queryLocation.y == entranceMin.y)
{
if (mapX > entranceMinX && mapX < entranceMaxX)
if (queryLocation.x > entranceMin.x && queryLocation.x < entranceMax.x)
{
return 3;
}
@@ -1322,8 +1323,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC
entranceExitCoords.direction = (startDirection + directionIncrement) & 3;
// search for TrackElement one tile over, shifted in the search direction
auto nextLocation = entranceExitCoords;
nextLocation.x += CoordsDirectionDelta[entranceExitCoords.direction].x;
nextLocation.y += CoordsDirectionDelta[entranceExitCoords.direction].y;
nextLocation += CoordsDirectionDelta[entranceExitCoords.direction];
if (map_is_location_valid(nextLocation))
{
// iterate over every element in the tile until we find what we want
@@ -1366,14 +1366,12 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC
}
gRideEntranceExitPlaceDirection = INVALID_DIRECTION;
}
// tracked rides excluding tower rides
else
{
// create a 2-point rectangle. The rectangle will have a width or height of 0 depending on station direction or length
// (if the station is 0) The 2-point rectangle is ballooned on all four sides by 1 tile for a 3xN or Nx3 rectangle.
// Whatever edge the ride entrance is on, rotate it outward to get entrance direction.
CoordsXY nextLocation = { stationStart };
CoordsXY entranceMin = { nextLocation };
CoordsXY entranceMax = { nextLocation };
// create a 2-point rectangle. The rectangle will have a width or height of 0 depending on station direction
CoordsXY entranceMin = { stationStart };
CoordsXY entranceMax = { stationStart };
// get the beginning of the station TrackElement
auto tileElement = ride_get_station_start_track_element(ride, gRideEntranceExitPlaceStationIndex);
@@ -1382,16 +1380,13 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC
entranceExitCoords.setNull();
return entranceExitCoords;
}
entranceExitCoords.direction = tileElement->GetDirection();
auto stationDirection = entranceExitCoords.direction;
auto stationDirection = tileElement->GetDirection();
// find additional station TrackElements and extend the line of valid entrance locations
while (true)
{
entranceMax = { nextLocation };
nextLocation.x -= CoordsDirectionDelta[entranceExitCoords.direction].x;
nextLocation.y -= CoordsDirectionDelta[entranceExitCoords.direction].y;
tileElement = map_get_first_element_at(nextLocation);
entranceMax -= CoordsDirectionDelta[stationDirection];
tileElement = map_get_first_element_at(entranceMax);
if (tileElement == nullptr)
break;
bool goToNextTile = false;
@@ -1414,24 +1409,17 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC
if (!goToNextTile)
break;
}
// entranceMax increments before the check
entranceMax += CoordsDirectionDelta[stationDirection];
// swap variables for valid ranges
nextLocation.x = entranceMin.x;
if (nextLocation.x > entranceMax.x)
{
entranceMin.x = entranceMax.x;
entranceMax.x = nextLocation.x;
}
if (entranceMin.x > entranceMax.x)
std::swap(entranceMin.x, entranceMax.x);
if (entranceMin.y > entranceMax.y)
std::swap(entranceMin.y, entranceMax.y);
// get the station direction from its position
auto direction = GetRideEntranceDirection(entranceExitCoords, entranceMin, entranceMax);
nextLocation.y = entranceMin.y;
if (nextLocation.y > entranceMax.y)
{
entranceMin.y = entranceMax.y;
entranceMax.y = nextLocation.y;
}
// for a 3xN or Nx3 grid, determine the direction toward the center
auto direction = GetEntranceExitDirection(
entranceExitCoords.x, entranceExitCoords.y, entranceMin.x - 32, entranceMin.y - 32, entranceMax.x + 32,
entranceMax.y + 32);
if (direction != INVALID_DIRECTION && direction != stationDirection && direction != direction_reverse(stationDirection))
{
entranceExitCoords.direction = direction;