mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-28 09:14:58 +01:00
We can not store a ride pointer in ride measurement as rides are now stored in a vector which means their addresses can change when rides are constructed / removed.
This commit is contained in:
@@ -1104,7 +1104,6 @@ private:
|
||||
if (ride != nullptr)
|
||||
{
|
||||
ride->measurement = std::make_unique<RideMeasurement>();
|
||||
ride->measurement->ride = ride;
|
||||
ImportRideMeasurement(*ride->measurement, src);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -729,34 +729,34 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src)
|
||||
void S6Exporter::ExportRideMeasurements()
|
||||
{
|
||||
// Get all the ride measurements
|
||||
std::vector<const RideMeasurement*> rideMeasurements;
|
||||
std::vector<Ride*> 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++;
|
||||
|
||||
@@ -755,7 +755,6 @@ public:
|
||||
if (ride != nullptr)
|
||||
{
|
||||
ride->measurement = std::make_unique<RideMeasurement>();
|
||||
ride->measurement->ride = ride;
|
||||
ImportRideMeasurement(*ride->measurement, src);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<RideMeasurement*, rct_string_id> ride_get_measurement(Ride* ride)
|
||||
if (measurement == nullptr)
|
||||
{
|
||||
measurement = std::make_unique<RideMeasurement>();
|
||||
measurement->ride = ride;
|
||||
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_G_FORCES))
|
||||
{
|
||||
measurement->flags |= RIDE_MEASUREMENT_FLAG_G_FORCES;
|
||||
|
||||
@@ -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{};
|
||||
|
||||
Reference in New Issue
Block a user