diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 71c732463d..ec2ecd1118 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1104,7 +1104,6 @@ private: if (ride != nullptr) { ride->measurement = std::make_unique(); - ride->measurement->ride = ride; ImportRideMeasurement(*ride->measurement, src); } } diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index ba0f0dfa17..97f488f0e1 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -729,34 +729,34 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src) void S6Exporter::ExportRideMeasurements() { // Get all the ride measurements - std::vector rideMeasurements; + std::vector ridesWithMeasurements; for (ride_id_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++) { auto ride = get_ride(i); if (ride != nullptr && ride->measurement != nullptr) { - rideMeasurements.push_back(ride->measurement.get()); + ridesWithMeasurements.push_back(ride); } } // If there are more than S6 can hold, trim it by LRU - if (rideMeasurements.size() > RCT12_RIDE_MEASUREMENT_MAX_ITEMS) + if (ridesWithMeasurements.size() > RCT12_RIDE_MEASUREMENT_MAX_ITEMS) { // Sort in order of last recently used - std::sort(rideMeasurements.begin(), rideMeasurements.end(), [](const RideMeasurement* a, const RideMeasurement* b) { - return a->last_use_tick > b->last_use_tick; + std::sort(ridesWithMeasurements.begin(), ridesWithMeasurements.end(), [](const Ride* a, const Ride* b) { + return a->measurement->last_use_tick > b->measurement->last_use_tick; }); - rideMeasurements.resize(RCT12_RIDE_MEASUREMENT_MAX_ITEMS); + ridesWithMeasurements.resize(RCT12_RIDE_MEASUREMENT_MAX_ITEMS); } // Convert ride measurements to S6 format uint8_t i{}; - for (auto src : rideMeasurements) + for (auto src : ridesWithMeasurements) { auto& dst = _s6.ride_measurements[i]; - ExportRideMeasurement(_s6.ride_measurements[i], *src); + ExportRideMeasurement(_s6.ride_measurements[i], *src->measurement.get()); - auto rideId = src->ride->id; + auto rideId = src->id; dst.ride_index = rideId; _s6.rides[rideId].measurement_index = i; i++; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 0c73a0b1a6..16a5c9739f 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -755,7 +755,6 @@ public: if (ride != nullptr) { ride->measurement = std::make_unique(); - ride->measurement->ride = ride; ImportRideMeasurement(*ride->measurement, src); } } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index f466557002..08288ee795 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -2917,13 +2917,12 @@ static void ride_music_update(Ride* ride) * * rct2: 0x006B64F2 */ -static void ride_measurement_update(RideMeasurement* measurement) +static void ride_measurement_update(Ride& ride, RideMeasurement& measurement) { - auto ride = measurement->ride; - if (ride == nullptr || measurement->vehicle_index >= std::size(ride->vehicles)) + if (measurement.vehicle_index >= std::size(ride.vehicles)) return; - auto spriteIndex = ride->vehicles[measurement->vehicle_index]; + auto spriteIndex = ride.vehicles[measurement.vehicle_index]; if (spriteIndex == SPRITE_INDEX_NULL) return; @@ -2931,19 +2930,19 @@ static void ride_measurement_update(RideMeasurement* measurement) if (vehicle == nullptr) return; - if (measurement->flags & RIDE_MEASUREMENT_FLAG_UNLOADING) + if (measurement.flags & RIDE_MEASUREMENT_FLAG_UNLOADING) { if (vehicle->status != VEHICLE_STATUS_DEPARTING && vehicle->status != VEHICLE_STATUS_TRAVELLING_CABLE_LIFT) return; - measurement->flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING; - if (measurement->current_station == vehicle->current_station) - measurement->current_item = 0; + measurement.flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING; + if (measurement.current_station == vehicle->current_station) + measurement.current_item = 0; } if (vehicle->status == VEHICLE_STATUS_UNLOADING_PASSENGERS) { - measurement->flags |= RIDE_MEASUREMENT_FLAG_UNLOADING; + measurement.flags |= RIDE_MEASUREMENT_FLAG_UNLOADING; return; } @@ -2954,10 +2953,10 @@ static void ride_measurement_update(RideMeasurement* measurement) if (vehicle->velocity == 0) return; - if (measurement->current_item >= RideMeasurement::MAX_ITEMS) + if (measurement.current_item >= RideMeasurement::MAX_ITEMS) return; - if (measurement->flags & RIDE_MEASUREMENT_FLAG_G_FORCES) + if (measurement.flags & RIDE_MEASUREMENT_FLAG_G_FORCES) { auto gForces = vehicle_get_g_forces(vehicle); gForces.VerticalG = std::clamp(gForces.VerticalG / 8, -127, 127); @@ -2965,12 +2964,12 @@ static void ride_measurement_update(RideMeasurement* measurement) if (gScenarioTicks & 1) { - gForces.VerticalG = (gForces.VerticalG + measurement->vertical[measurement->current_item]) / 2; - gForces.LateralG = (gForces.LateralG + measurement->lateral[measurement->current_item]) / 2; + gForces.VerticalG = (gForces.VerticalG + measurement.vertical[measurement.current_item]) / 2; + gForces.LateralG = (gForces.LateralG + measurement.lateral[measurement.current_item]) / 2; } - measurement->vertical[measurement->current_item] = gForces.VerticalG & 0xFF; - measurement->lateral[measurement->current_item] = gForces.LateralG & 0xFF; + measurement.vertical[measurement.current_item] = gForces.VerticalG & 0xFF; + measurement.lateral[measurement.current_item] = gForces.LateralG & 0xFF; } auto velocity = std::min(std::abs((vehicle->velocity * 5) >> 16), 255); @@ -2978,17 +2977,17 @@ static void ride_measurement_update(RideMeasurement* measurement) if (gScenarioTicks & 1) { - velocity = (velocity + measurement->velocity[measurement->current_item]) / 2; - altitude = (altitude + measurement->altitude[measurement->current_item]) / 2; + velocity = (velocity + measurement.velocity[measurement.current_item]) / 2; + altitude = (altitude + measurement.altitude[measurement.current_item]) / 2; } - measurement->velocity[measurement->current_item] = velocity & 0xFF; - measurement->altitude[measurement->current_item] = altitude & 0xFF; + measurement.velocity[measurement.current_item] = velocity & 0xFF; + measurement.altitude[measurement.current_item] = altitude & 0xFF; if (gScenarioTicks & 1) { - measurement->current_item++; - measurement->num_items = std::max(measurement->num_items, measurement->current_item); + measurement.current_item++; + measurement.num_items = std::max(measurement.num_items, measurement.current_item); } } @@ -3009,7 +3008,7 @@ void ride_measurements_update() { if (measurement->flags & RIDE_MEASUREMENT_FLAG_RUNNING) { - ride_measurement_update(measurement); + ride_measurement_update(ride, *measurement); } else { @@ -3027,7 +3026,7 @@ void ride_measurements_update() measurement->current_station = vehicle->current_station; measurement->flags |= RIDE_MEASUREMENT_FLAG_RUNNING; measurement->flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING; - ride_measurement_update(measurement); + ride_measurement_update(ride, *measurement); break; } } @@ -3079,7 +3078,6 @@ std::pair ride_get_measurement(Ride* ride) if (measurement == nullptr) { measurement = std::make_unique(); - measurement->ride = ride; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_G_FORCES)) { measurement->flags |= RIDE_MEASUREMENT_FLAG_G_FORCES; diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 53037cd572..95b8906886 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -182,7 +182,6 @@ struct RideMeasurement { static constexpr size_t MAX_ITEMS = 4800; - Ride* ride{}; uint8_t flags{}; uint32_t last_use_tick{}; uint16_t num_items{};