From 80418efafbe34cbf92f2d0db6e86d481f7ccff38 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 09:42:27 -0400 Subject: [PATCH] Part of #13874: Replace TrackCoordinates --- src/openrct2-ui/windows/TrackDesignPlace.cpp | 4 +++- src/openrct2/actions/WallPlaceAction.cpp | 13 ++++++++----- src/openrct2/ride/Ride.cpp | 16 +++++++++++----- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 1 - src/openrct2/ride/TrackDesign.cpp | 13 ++++++++----- src/openrct2/ride/Vehicle.cpp | 7 +++++-- src/openrct2/windows/_legacy.cpp | 7 +++++-- 8 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 4a3db512f6..2e2b25bbf9 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -594,7 +594,9 @@ static void window_track_place_draw_mini_preview_track( // Change rotation and next position based on track curvature curTrackRotation &= 3; - const rct_track_coordinates* track_coordinate = &TrackCoordinates[trackType]; + using namespace OpenRCT2::TrackMetaData; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates* track_coordinate = &teDescriptor.Coordinates; curTrackStart += CoordsXY{ track_coordinate->x, track_coordinate->y }.Rotate(curTrackRotation); curTrackRotation += track_coordinate->rotation_end - track_coordinate->rotation_begin; diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 466f90c252..9c948c9439 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -405,6 +405,9 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( WallSceneryEntry* wall, int32_t z0, TrackElement* trackElement, bool* wallAcrossTrack) const { track_type_t trackType = trackElement->GetTrackType(); + + using namespace OpenRCT2::TrackMetaData; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); int32_t sequence = trackElement->GetSequenceIndex(); int32_t direction = (_edge - trackElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; auto ride = get_ride(trackElement->GetRideIndex()); @@ -444,13 +447,13 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( if (TrackDefinitions[trackType].bank_start == 0) { - if (!(TrackCoordinates[trackType].rotation_begin & 4)) + if (!(teDescriptor.Coordinates.rotation_begin & 4)) { direction = direction_reverse(trackElement->GetDirection()); if (direction == _edge) { const rct_preview_track* trackBlock = &TrackBlocks[trackType][sequence]; - z = TrackCoordinates[trackType].z_begin; + z = teDescriptor.Coordinates.z_begin; z = trackElement->base_height + ((z - trackBlock->z) * 8); if (z == z0) { @@ -472,20 +475,20 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( return false; } - direction = TrackCoordinates[trackType].rotation_end; + direction = teDescriptor.Coordinates.rotation_end; if (direction & 4) { return false; } - direction = (trackElement->GetDirection() + TrackCoordinates[trackType].rotation_end) & TILE_ELEMENT_DIRECTION_MASK; + direction = (trackElement->GetDirection() + teDescriptor.Coordinates.rotation_end) & TILE_ELEMENT_DIRECTION_MASK; if (direction != _edge) { return false; } trackBlock = &TrackBlocks[trackType][sequence]; - z = TrackCoordinates[trackType].z_end; + z = teDescriptor.Coordinates.z_end; z = trackElement->base_height + ((z - trackBlock->z) * 8); return z == z0; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 0cc906322d..b6b7ba338a 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -73,6 +73,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::TrackMetaData; RideMode& operator++(RideMode& d, int) { @@ -478,11 +479,12 @@ bool track_block_get_next_from_zero( if (tileElement->IsGhost() != isGhost) continue; + const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); auto nextTrackBlock = TrackBlocks[trackElement->GetTrackType()]; if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = TrackCoordinates[trackElement->GetTrackType()]; + auto nextTrackCoordinate = teDescriptor.Coordinates; uint8_t nextRotation = tileElement->GetDirectionWithOffset(nextTrackCoordinate.rotation_begin) | (nextTrackCoordinate.rotation_begin & TRACK_BLOCK_2); @@ -519,6 +521,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 return false; auto inputElement = input->element->AsTrack(); + const auto& teDescriptor = GetTrackElementDescriptor(inputElement->GetTrackType()); if (inputElement == nullptr) return false; @@ -533,7 +536,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 trackBlock += inputElement->GetSequenceIndex(); - auto trackCoordinate = TrackCoordinates[inputElement->GetTrackType()]; + auto trackCoordinate = teDescriptor.Coordinates; int32_t x = input->x; int32_t y = input->y; @@ -599,7 +602,8 @@ bool track_block_get_previous_from_zero( if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = TrackCoordinates[trackElement->GetTrackType()]; + const auto& teDesc = GetTrackElementDescriptor(trackElement->GetTrackType()); + auto nextTrackCoordinate = teDesc.Coordinates; nextTrackBlock += trackElement->GetSequenceIndex(); if ((nextTrackBlock + 1)->index != 255) @@ -663,6 +667,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra return false; auto trackElement = trackPos.element->AsTrack(); + const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); if (trackElement == nullptr) return false; @@ -677,7 +682,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra trackBlock += trackElement->GetSequenceIndex(); - auto trackCoordinate = TrackCoordinates[trackElement->GetTrackType()]; + auto trackCoordinate = teDescriptor.Coordinates; int32_t z = trackElement->GetBaseZ(); @@ -2857,7 +2862,8 @@ static void ride_set_boat_hire_return_point(Ride* ride, CoordsXYE* startElement) }; trackType = returnPos.element->AsTrack()->GetTrackType(); - int32_t elementReturnDirection = TrackCoordinates[trackType].rotation_begin; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + int32_t elementReturnDirection = teDescriptor.Coordinates.rotation_begin; ride->boat_hire_return_direction = returnPos.element->GetDirectionWithOffset(elementReturnDirection); ride->boat_hire_return_position = TileCoordsXY{ returnPos }; } diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 560258ba2c..ccb5301b03 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -16,7 +16,7 @@ #include // clang-format off -const rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { +const static rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT { 0, 0, 0, 0, 0, 0 }, // ELEM_END_STATION { 0, 0, 0, 0, 0, 0 }, // ELEM_BEGIN_STATION diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index ff61c6efca..dcdaaa1c55 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -16,7 +16,6 @@ constexpr const uint8_t MaxSequencesPerPiece = 16; // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 -extern const rct_track_coordinates TrackCoordinates[TrackElemType::Count]; extern const uint8_t TrackSequenceProperties[TrackElemType::Count][MaxSequencesPerPiece]; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 63e9dfc8d2..ef996c45ea 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -65,6 +65,7 @@ using namespace OpenRCT2; using namespace OpenRCT2::Drawing; +using namespace OpenRCT2::TrackMetaData; bool gTrackDesignSceneryToggle; static CoordsXYZ _trackPreviewMin; @@ -182,7 +183,8 @@ rct_string_id TrackDesign::CreateTrackDesignTrack(const Ride& ride) trackElement.y = newCoords->y; z = newCoords->z; - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackElement.element->AsTrack()->GetTrackType()]; + const auto& teDescriptor = GetTrackElementDescriptor(trackElement.element->AsTrack()->GetTrackType()); + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto trackBlock = TrackBlocks[trackType]; // Used in the following loop to know when we have // completed all of the elements and are back at the @@ -1519,6 +1521,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co for (const auto& track : td6->track_elements) { auto trackType = track.type; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); track_design_update_max_min_coordinates(newCoords); @@ -1534,7 +1537,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co break; case PTD_OPERATION_REMOVE_GHOST: { - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; const rct_preview_track* trackBlock = TrackBlocks[trackType]; int32_t tempZ = newCoords.z - trackCoordinates->z_begin + trackBlock->z; auto trackRemoveAction = TrackRemoveAction( @@ -1549,7 +1552,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co case PTD_OPERATION_PLACE_GHOST: case PTD_OPERATION_PLACE_TRACK_PREVIEW: { - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; // di int16_t tempZ = newCoords.z - trackCoordinates->z_begin; @@ -1606,7 +1609,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } case PTD_OPERATION_GET_PLACE_Z: { - int32_t tempZ = newCoords.z - TrackCoordinates[trackType].z_begin; + int32_t tempZ = newCoords.z - teDescriptor.Coordinates.z_begin; for (const rct_preview_track* trackBlock = TrackBlocks[trackType]; trackBlock->index != 0xFF; trackBlock++) { auto tile = CoordsXY{ newCoords } + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(rotation); @@ -1646,7 +1649,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } } - const rct_track_coordinates* track_coordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* track_coordinates = &teDescriptor.Coordinates; auto offsetAndRotatedTrack = CoordsXY{ newCoords } + CoordsXY{ track_coordinates->x, track_coordinates->y }.Rotate(rotation); diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 50f1c0c22d..7b25234d35 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -50,6 +50,7 @@ #include #include +using namespace OpenRCT2::TrackMetaData; static bool vehicle_boat_is_location_accessible(const CoordsXYZ& location); constexpr int16_t VEHICLE_MAX_SPIN_SPEED = 1536; @@ -7493,12 +7494,13 @@ static void AnimateSceneryDoor(const CoordsXYZD& doorLocation, const CoordsXYZ& void Vehicle::UpdateSceneryDoor() const { auto trackType = GetTrackType(); + const auto& teDescriptor = GetTrackElementDescriptor(trackType); const rct_preview_track* trackBlock = TrackBlocks[trackType]; while ((trackBlock + 1)->index != 255) { trackBlock++; } - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto wallCoords = CoordsXYZ{ x, y, TrackLocation.z - trackBlock->z + trackCoordinates->z_end }.ToTileStart(); int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_end) & 3; @@ -7590,8 +7592,9 @@ static void trigger_on_ride_photo(const CoordsXYZ& loc, TileElement* tileElement void Vehicle::UpdateSceneryDoorBackwards() const { auto trackType = GetTrackType(); + const auto& teDescriptor = GetTrackElementDescriptor(trackType); const rct_preview_track* trackBlock = TrackBlocks[trackType]; - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto wallCoords = CoordsXYZ{ TrackLocation, TrackLocation.z - trackBlock->z + trackCoordinates->z_begin }; int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_begin) & 3; direction = direction_reverse(direction); diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index bfbcb7da71..9c3691c30a 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -27,6 +27,7 @@ #include #include +using namespace OpenRCT2::TrackMetaData; bool gDisableErrorWindowSound = false; uint64_t _enabledRidePieces; @@ -90,7 +91,8 @@ money32 place_provisional_track_piece( return result; int16_t z_begin, z_end; - const rct_track_coordinates& coords = TrackCoordinates[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates& coords = teDescriptor.Coordinates; if (!ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_HAS_NO_TRACK)) { z_begin = coords.z_begin; @@ -312,7 +314,8 @@ bool window_ride_construction_update_state( } } - const rct_track_coordinates& trackCoordinates = TrackCoordinates[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates& trackCoordinates = teDescriptor.Coordinates; x = _currentTrackBegin.x; y = _currentTrackBegin.y;