Merge pull request #10229 from tupaschoal/refactor_ride_get_entrance_or_exit

Refactor ride_get_entrance_or_exit_position_from_screen_position()
This commit is contained in:
Duncan 2019-11-14 12:42:38 +00:00 committed by GitHub
commit 3f7a4a9f42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 79 additions and 67 deletions

View File

@ -362,10 +362,7 @@ static void window_maze_construction_entrance_tooldown(ScreenCoordsXY screenCoor
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE;
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW;
int32_t direction = 0; CoordsXYZD entranceOrExitCoords = ride_get_entrance_or_exit_position_from_screen_position(screenCoords);
CoordsXY entranceOrExitCoords;
ride_get_entrance_or_exit_position_from_screen_position(
screenCoords.x, screenCoords.y, &entranceOrExitCoords.x, &entranceOrExitCoords.y, &direction);
if (entranceOrExitCoords.x == LOCATION_NULL) if (entranceOrExitCoords.x == LOCATION_NULL)
return; return;
@ -375,7 +372,7 @@ static void window_maze_construction_entrance_tooldown(ScreenCoordsXY screenCoor
ride_id_t rideIndex = gRideEntranceExitPlaceRideIndex; ride_id_t rideIndex = gRideEntranceExitPlaceRideIndex;
auto rideEntranceExitPlaceAction = RideEntranceExitPlaceAction( auto rideEntranceExitPlaceAction = RideEntranceExitPlaceAction(
entranceOrExitCoords, direction_reverse(direction), rideIndex, gRideEntranceExitPlaceStationIndex, entranceOrExitCoords, direction_reverse(entranceOrExitCoords.direction), rideIndex, gRideEntranceExitPlaceStationIndex,
gRideEntranceExitPlaceType == ENTRANCE_TYPE_RIDE_EXIT); gRideEntranceExitPlaceType == ENTRANCE_TYPE_RIDE_EXIT);
rideEntranceExitPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) { rideEntranceExitPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) {

View File

@ -3688,7 +3688,6 @@ void ride_construction_toolupdate_construct(ScreenCoordsXY screenCoords)
*/ */
void ride_construction_toolupdate_entrance_exit(ScreenCoordsXY screenCoords) void ride_construction_toolupdate_entrance_exit(ScreenCoordsXY screenCoords)
{ {
int32_t x, y, direction;
uint8_t stationNum; uint8_t stationNum;
map_invalidate_selection_rect(); map_invalidate_selection_rect();
@ -3696,7 +3695,7 @@ void ride_construction_toolupdate_entrance_exit(ScreenCoordsXY screenCoords)
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE;
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_CONSTRUCT; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_CONSTRUCT;
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW;
ride_get_entrance_or_exit_position_from_screen_position(screenCoords.x, screenCoords.y, &x, &y, &direction); CoordsXYZD entranceOrExitCoords = ride_get_entrance_or_exit_position_from_screen_position(screenCoords);
if (gRideEntranceExitPlaceDirection == 255) if (gRideEntranceExitPlaceDirection == 255)
{ {
ride_construction_invalidate_current_track(); ride_construction_invalidate_current_track();
@ -3705,26 +3704,27 @@ void ride_construction_toolupdate_entrance_exit(ScreenCoordsXY screenCoords)
gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE;
gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE_ARROW; gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE_ARROW;
gMapSelectType = MAP_SELECT_TYPE_FULL; gMapSelectType = MAP_SELECT_TYPE_FULL;
gMapSelectPositionA.x = x; gMapSelectPositionA.x = entranceOrExitCoords.x;
gMapSelectPositionA.y = y; gMapSelectPositionA.y = entranceOrExitCoords.y;
gMapSelectPositionB.x = x; gMapSelectPositionB.x = entranceOrExitCoords.x;
gMapSelectPositionB.y = y; gMapSelectPositionB.y = entranceOrExitCoords.y;
gMapSelectArrowDirection = direction_reverse(direction); gMapSelectArrowDirection = direction_reverse(entranceOrExitCoords.direction);
gMapSelectArrowPosition.x = x; gMapSelectArrowPosition.x = entranceOrExitCoords.x;
gMapSelectArrowPosition.y = y; gMapSelectArrowPosition.y = entranceOrExitCoords.y;
gMapSelectArrowPosition.z = _unkF44188.z * 8; gMapSelectArrowPosition.z = entranceOrExitCoords.z * 8;
map_invalidate_selection_rect(); map_invalidate_selection_rect();
direction = direction_reverse(gRideEntranceExitPlaceDirection); entranceOrExitCoords.direction = direction_reverse(gRideEntranceExitPlaceDirection);
stationNum = gRideEntranceExitPlaceStationIndex; stationNum = gRideEntranceExitPlaceStationIndex;
if (!(_currentTrackSelectionFlags & TRACK_SELECTION_FLAG_ENTRANCE_OR_EXIT) || x != gRideEntranceExitGhostPosition.x if (!(_currentTrackSelectionFlags & TRACK_SELECTION_FLAG_ENTRANCE_OR_EXIT)
|| y != gRideEntranceExitGhostPosition.y || direction != gRideEntranceExitGhostPosition.direction || entranceOrExitCoords != gRideEntranceExitGhostPosition || stationNum != gRideEntranceExitGhostStationIndex)
|| stationNum != gRideEntranceExitGhostStationIndex)
{ {
auto ride = get_ride(_currentRideIndex); auto ride = get_ride(_currentRideIndex);
if (ride != nullptr) if (ride != nullptr)
{ {
_currentTrackPrice = ride_entrance_exit_place_ghost(ride, x, y, direction, gRideEntranceExitPlaceType, stationNum); _currentTrackPrice = ride_entrance_exit_place_ghost(
ride, entranceOrExitCoords.x, entranceOrExitCoords.y, entranceOrExitCoords.direction,
gRideEntranceExitPlaceType, stationNum);
} }
window_ride_construction_update_active_elements(); window_ride_construction_update_active_elements();
} }
@ -3936,13 +3936,12 @@ static void ride_construction_tooldown_entrance_exit(ScreenCoordsXY screenCoords
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE;
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW;
int32_t mapX, mapY, direction; CoordsXYZD entranceOrExitCoords = ride_get_entrance_or_exit_position_from_screen_position(screenCoords);
ride_get_entrance_or_exit_position_from_screen_position(screenCoords.x, screenCoords.y, &mapX, &mapY, &direction);
if (gRideEntranceExitPlaceDirection == 255) if (gRideEntranceExitPlaceDirection == 255)
return; return;
auto rideEntranceExitPlaceAction = RideEntranceExitPlaceAction( auto rideEntranceExitPlaceAction = RideEntranceExitPlaceAction(
{ _unkF44188.x, _unkF44188.y }, direction_reverse(gRideEntranceExitPlaceDirection), gRideEntranceExitPlaceRideIndex, entranceOrExitCoords, direction_reverse(gRideEntranceExitPlaceDirection), gRideEntranceExitPlaceRideIndex,
gRideEntranceExitPlaceStationIndex, gRideEntranceExitPlaceType == ENTRANCE_TYPE_RIDE_EXIT); gRideEntranceExitPlaceStationIndex, gRideEntranceExitPlaceType == ENTRANCE_TYPE_RIDE_EXIT);
rideEntranceExitPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) { rideEntranceExitPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) {

View File

@ -111,8 +111,6 @@ CoordsXYZ _previousTrackPiece;
uint8_t _currentBrakeSpeed2; uint8_t _currentBrakeSpeed2;
uint8_t _currentSeatRotationAngle; uint8_t _currentSeatRotationAngle;
LocationXYZ16 _unkF44188;
CoordsXYZD _unkF440C5; CoordsXYZD _unkF440C5;
uint8_t gRideEntranceExitPlaceType; uint8_t gRideEntranceExitPlaceType;
@ -6173,18 +6171,20 @@ static int32_t loc_6CD18E(
* *
* rct2: 0x006CCF70 * rct2: 0x006CCF70
*/ */
void ride_get_entrance_or_exit_position_from_screen_position( CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(ScreenCoordsXY screenCoords)
int32_t screenX, int32_t screenY, int32_t* outX, int32_t* outY, int32_t* outDirection)
{ {
int16_t mapX, mapY; int16_t mapX, mapY;
int16_t entranceMinX, entranceMinY, entranceMaxX, entranceMaxY, word_F4418C, word_F4418E; int16_t entranceMinX, entranceMinY, entranceMaxX, entranceMaxY, word_F4418C, word_F4418E;
int32_t interactionType, direction, stationHeight, stationDirection; int32_t interactionType, stationDirection;
uint8_t stationHeight;
TileElement* tileElement; TileElement* tileElement;
rct_viewport* viewport; rct_viewport* viewport;
Ride* ride; Ride* ride;
CoordsXYZD entranceExitCoords{};
gRideEntranceExitPlaceDirection = 255; gRideEntranceExitPlaceDirection = 255;
get_map_coordinates_from_pos(screenX, screenY, 0xFFFB, &mapX, &mapY, &interactionType, &tileElement, &viewport); get_map_coordinates_from_pos(
screenCoords.x, screenCoords.y, 0xFFFB, &mapX, &mapY, &interactionType, &tileElement, &viewport);
if (interactionType != 0) if (interactionType != 0)
{ {
if (tileElement->GetType() == TILE_ELEMENT_TYPE_TRACK) if (tileElement->GetType() == TILE_ELEMENT_TYPE_TRACK)
@ -6208,32 +6208,37 @@ void ride_get_entrance_or_exit_position_from_screen_position(
ride = get_ride(gRideEntranceExitPlaceRideIndex); ride = get_ride(gRideEntranceExitPlaceRideIndex);
if (ride == nullptr) if (ride == nullptr)
return; {
entranceExitCoords.x = LOCATION_NULL;
return entranceExitCoords;
}
stationHeight = ride->stations[gRideEntranceExitPlaceStationIndex].Height; stationHeight = ride->stations[gRideEntranceExitPlaceStationIndex].Height;
screen_get_map_xy_with_z(screenX, screenY, stationHeight * 8, &mapX, &mapY); screen_get_map_xy_with_z(screenCoords.x, screenCoords.y, stationHeight * 8, &mapX, &mapY);
if (mapX == LOCATION_NULL) if (mapX == LOCATION_NULL)
{ {
*outX = 0x8000; entranceExitCoords.x = LOCATION_NULL;
return; return entranceExitCoords;
} }
word_F4418C = mapX; word_F4418C = mapX;
word_F4418E = mapY; word_F4418E = mapY;
_unkF44188.x = floor2(mapX, 32);
_unkF44188.y = floor2(mapY, 32); entranceExitCoords = { floor2(mapX, 32), floor2(mapY, 32), stationHeight, INVALID_DIRECTION };
*outX = _unkF44188.x;
*outY = _unkF44188.y;
if (ride->type == RIDE_TYPE_NULL) if (ride->type == RIDE_TYPE_NULL)
return; {
entranceExitCoords.x = LOCATION_NULL;
return entranceExitCoords;
}
LocationXY8 stationStart = ride->stations[gRideEntranceExitPlaceStationIndex].Start; LocationXY8 stationStart = ride->stations[gRideEntranceExitPlaceStationIndex].Start;
if (stationStart.xy == RCT_XY8_UNDEFINED) if (stationStart.xy == RCT_XY8_UNDEFINED)
return; {
entranceExitCoords.x = LOCATION_NULL;
_unkF44188.z = stationHeight; return entranceExitCoords;
}
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_3)) if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_3))
{ {
@ -6241,17 +6246,17 @@ void ride_get_entrance_or_exit_position_from_screen_position(
mapY = (word_F4418E & 0x1F) - 16; mapY = (word_F4418E & 0x1F) - 16;
if (std::abs(mapX) < std::abs(mapY)) if (std::abs(mapX) < std::abs(mapY))
{ {
direction = mapY < 0 ? 3 : 1; entranceExitCoords.direction = mapY < 0 ? 3 : 1;
} }
else else
{ {
direction = mapX < 0 ? 0 : 2; entranceExitCoords.direction = mapX < 0 ? 0 : 2;
} }
for (int32_t i = 0; i < MAX_STATIONS; i++) for (int32_t i = 0; i < MAX_STATIONS; i++)
{ {
mapX = _unkF44188.x + CoordsDirectionDelta[direction].x; mapX = entranceExitCoords.x + CoordsDirectionDelta[entranceExitCoords.direction].x;
mapY = _unkF44188.y + CoordsDirectionDelta[direction].y; mapY = entranceExitCoords.y + CoordsDirectionDelta[entranceExitCoords.direction].y;
if (mapX >= 0 && mapY >= 0 && mapX < (256 * 32) && mapY < (256 * 32)) if (mapX >= 0 && mapY >= 0 && mapX < (256 * 32) && mapY < (256 * 32))
{ {
tileElement = map_get_first_element_at(mapX >> 5, mapY >> 5); tileElement = map_get_first_element_at(mapX >> 5, mapY >> 5);
@ -6267,25 +6272,26 @@ void ride_get_entrance_or_exit_position_from_screen_position(
continue; continue;
if (tileElement->AsTrack()->GetTrackType() == TRACK_ELEM_MAZE) if (tileElement->AsTrack()->GetTrackType() == TRACK_ELEM_MAZE)
{ {
gRideEntranceExitPlaceDirection = direction_reverse(direction); entranceExitCoords.direction = direction_reverse(entranceExitCoords.direction);
*outDirection = direction_reverse(direction); gRideEntranceExitPlaceDirection = entranceExitCoords.direction;
return; return entranceExitCoords;
} }
if (tileElement->AsTrack()->GetStationIndex() != gRideEntranceExitPlaceStationIndex) if (tileElement->AsTrack()->GetStationIndex() != gRideEntranceExitPlaceStationIndex)
continue; continue;
int32_t eax = (direction + 2 - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; int32_t eax = (entranceExitCoords.direction + 2 - tileElement->GetDirection())
& TILE_ELEMENT_DIRECTION_MASK;
if (FlatRideTrackSequenceProperties[tileElement->AsTrack()->GetTrackType()] if (FlatRideTrackSequenceProperties[tileElement->AsTrack()->GetTrackType()]
[tileElement->AsTrack()->GetSequenceIndex()] [tileElement->AsTrack()->GetSequenceIndex()]
& (1 << eax)) & (1 << eax))
{ {
gRideEntranceExitPlaceDirection = direction_reverse(direction); entranceExitCoords.direction = direction_reverse(entranceExitCoords.direction);
*outDirection = direction_reverse(direction); gRideEntranceExitPlaceDirection = entranceExitCoords.direction;
return; return entranceExitCoords;
} }
} while (!(tileElement++)->IsLastForTile()); } while (!(tileElement++)->IsLastForTile());
} }
direction = (direction + 1) & 3; entranceExitCoords.direction = (entranceExitCoords.direction + 1) & 3;
} }
gRideEntranceExitPlaceDirection = 0xFF; gRideEntranceExitPlaceDirection = 0xFF;
} }
@ -6299,18 +6305,18 @@ void ride_get_entrance_or_exit_position_from_screen_position(
tileElement = ride_get_station_start_track_element(ride, gRideEntranceExitPlaceStationIndex); tileElement = ride_get_station_start_track_element(ride, gRideEntranceExitPlaceStationIndex);
if (tileElement == nullptr) if (tileElement == nullptr)
{ {
*outX = 0x8000; entranceExitCoords.x = LOCATION_NULL;
return; return entranceExitCoords;
} }
direction = tileElement->GetDirection(); entranceExitCoords.direction = tileElement->GetDirection();
stationDirection = direction; stationDirection = entranceExitCoords.direction;
while (true) while (true)
{ {
entranceMaxX = mapX; entranceMaxX = mapX;
entranceMaxY = mapY; entranceMaxY = mapY;
mapX -= CoordsDirectionDelta[direction].x; mapX -= CoordsDirectionDelta[entranceExitCoords.direction].x;
mapY -= CoordsDirectionDelta[direction].y; mapY -= CoordsDirectionDelta[entranceExitCoords.direction].y;
tileElement = map_get_first_element_at(mapX >> 5, mapY >> 5); tileElement = map_get_first_element_at(mapX >> 5, mapY >> 5);
if (tileElement == nullptr) if (tileElement == nullptr)
break; break;
@ -6352,14 +6358,17 @@ void ride_get_entrance_or_exit_position_from_screen_position(
entranceMaxY = mapY; entranceMaxY = mapY;
} }
direction = loc_6CD18E(*outX, *outY, entranceMinX - 32, entranceMinY - 32, entranceMaxX + 32, entranceMaxY + 32); auto direction = loc_6CD18E(
entranceExitCoords.x, entranceExitCoords.y, entranceMinX - 32, entranceMinY - 32, entranceMaxX + 32,
entranceMaxY + 32);
if (direction != -1 && direction != stationDirection && direction != direction_reverse(stationDirection)) if (direction != -1 && direction != stationDirection && direction != direction_reverse(stationDirection))
{ {
gRideEntranceExitPlaceDirection = direction; entranceExitCoords.direction = direction;
*outDirection = direction; gRideEntranceExitPlaceDirection = entranceExitCoords.direction;
return; return entranceExitCoords;
} }
} }
return entranceExitCoords;
} }
bool ride_select_backwards_from_front() bool ride_select_backwards_from_front()

View File

@ -1120,8 +1120,6 @@ extern CoordsXYZ _previousTrackPiece;
extern uint8_t _currentBrakeSpeed2; extern uint8_t _currentBrakeSpeed2;
extern uint8_t _currentSeatRotationAngle; extern uint8_t _currentSeatRotationAngle;
extern LocationXYZ16 _unkF44188;
extern CoordsXYZD _unkF440C5; extern CoordsXYZD _unkF440C5;
extern uint8_t gRideEntranceExitPlaceType; extern uint8_t gRideEntranceExitPlaceType;
@ -1227,8 +1225,7 @@ void window_ride_construction_update_active_elements();
void ride_construction_remove_ghosts(); void ride_construction_remove_ghosts();
money32 ride_entrance_exit_place_ghost( money32 ride_entrance_exit_place_ghost(
Ride* ride, int32_t x, int32_t y, int32_t direction, int32_t placeType, int32_t stationNum); Ride* ride, int32_t x, int32_t y, int32_t direction, int32_t placeType, int32_t stationNum);
void ride_get_entrance_or_exit_position_from_screen_position( CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(ScreenCoordsXY screenCoords);
int32_t x, int32_t y, int32_t* outX, int32_t* outY, int32_t* outDirection);
bool ride_select_backwards_from_front(); bool ride_select_backwards_from_front();
bool ride_select_forwards_from_back(); bool ride_select_forwards_from_back();

View File

@ -323,6 +323,16 @@ struct CoordsXYZD : public CoordsXYZ
{ {
} }
bool operator==(const CoordsXYZD& other) const
{
return x == other.x && y == other.y && z == other.z && direction == other.direction;
}
bool operator!=(const CoordsXYZD& other) const
{
return !(*this == other);
}
bool isNull() const bool isNull() const
{ {
return x == COORDS_NULL; return x == COORDS_NULL;