Refactor import/export to support multiple ride rating update states

This commit is contained in:
ζeh Matt 2023-03-20 12:47:13 +02:00
parent 6170bb05e2
commit 72a76a0ea5
No known key found for this signature in database
GPG Key ID: 18CE582C71A225B0
4 changed files with 50 additions and 5 deletions

View File

@ -536,7 +536,25 @@ namespace OpenRCT2
cs.ReadWrite(gGrassSceneryTileLoopPosition);
cs.ReadWrite(gWidePathTileLoopPosition);
ReadWriteRideRatingCalculationData(cs, gRideRatingUpdateState);
auto& rideRatings = RideRatingGetUpdateStates();
if (os.GetHeader().TargetVersion >= 21)
{
cs.ReadWriteArray(rideRatings, [this, &cs](RideRatingUpdateState& calcData) {
ReadWriteRideRatingCalculationData(cs, calcData);
return true;
});
}
else
{
// Only single state was stored prior to version 20.
if (os.GetMode() == OrcaStream::Mode::READING)
{
// Since we read only one state ensure the rest is reset.
RideRatingResetUpdateStates();
}
auto& rideRatingUpdateState = rideRatings[0];
ReadWriteRideRatingCalculationData(cs, rideRatingUpdateState);
}
if (os.GetHeader().TargetVersion >= 14)
{

View File

@ -1097,7 +1097,10 @@ namespace RCT2
void ImportRideRatingsCalcData()
{
const auto& src = _s6.RideRatingsCalcData;
auto& dst = gRideRatingUpdateState;
// S6 has only one state, ensure we reset all states before reading the first one.
RideRatingResetUpdateStates();
auto& rideRatingStates = RideRatingGetUpdateStates();
auto& dst = rideRatingStates[0];
dst = {};
dst.Proximity = { src.ProximityX, src.ProximityY, src.ProximityZ };
dst.ProximityStart = { src.ProximityStartX, src.ProximityStartY, src.ProximityStartZ };

View File

@ -77,7 +77,7 @@ struct ShelteredEights
uint8_t TotalShelteredEighths;
};
RideRatingUpdateState gRideRatingUpdateState;
static RideRatingUpdateStates gRideRatingUpdateStates;
static void ride_ratings_update_state(RideRatingUpdateState& state);
static void ride_ratings_update_state_0(RideRatingUpdateState& state);
@ -93,6 +93,25 @@ static void ride_ratings_score_close_proximity(RideRatingUpdateState& state, Til
static void ride_ratings_add(RatingTuple* rating, int32_t excitement, int32_t intensity, int32_t nausea);
RideRatingUpdateStates& RideRatingGetUpdateStates()
{
return gRideRatingUpdateStates;
}
void RideRatingResetUpdateStates()
{
RideRatingUpdateState nullState{};
nullState.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE;
std::fill(gRideRatingUpdateStates.begin(), gRideRatingUpdateStates.end(), nullState);
}
RideRatingUpdateState& RideRatingGetUpdateState(size_t index)
{
Guard::IndexInRange(index, gRideRatingUpdateStates);
return gRideRatingUpdateStates[index];
}
/**
* This is a small hack function to keep calling the ride rating processor until
* the given ride's ratings have been calculated. Whatever is currently being
@ -126,7 +145,7 @@ void RideRatingsUpdateAll()
// NOTE: With the new save format more than one ride can be updated at once, but this has not yet been implemented.
// The SV6 format could store only a single state.
ride_ratings_update_state(gRideRatingUpdateState);
ride_ratings_update_state(gRideRatingUpdateStates[0]);
}
static void ride_ratings_update_state(RideRatingUpdateState& state)

View File

@ -54,7 +54,12 @@ struct RideRatingUpdateState
uint16_t StationFlags;
};
extern RideRatingUpdateState gRideRatingUpdateState;
static constexpr size_t RideRatingMaxUpdateStates = 4;
using RideRatingUpdateStates = std::array<RideRatingUpdateState, RideRatingMaxUpdateStates>;
RideRatingUpdateStates& RideRatingGetUpdateStates();
void RideRatingResetUpdateStates();
void RideRatingsUpdateRide(const Ride& ride);
void RideRatingsUpdateAll();