From 72a76a0ea59c68ce1446947e43da4fde271c50d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Mon, 20 Mar 2023 12:47:13 +0200 Subject: [PATCH] Refactor import/export to support multiple ride rating update states --- src/openrct2/park/ParkFile.cpp | 20 +++++++++++++++++++- src/openrct2/rct2/S6Importer.cpp | 5 ++++- src/openrct2/ride/RideRatings.cpp | 23 +++++++++++++++++++++-- src/openrct2/ride/RideRatings.h | 7 ++++++- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index a30fe38b1a..53d6421f68 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -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) { diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 76fe31644a..9ee12d3c7c 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -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 }; diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index c6afa920a3..e95be1f15e 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -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) diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index 7ca932121d..3ed0481744 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -54,7 +54,12 @@ struct RideRatingUpdateState uint16_t StationFlags; }; -extern RideRatingUpdateState gRideRatingUpdateState; +static constexpr size_t RideRatingMaxUpdateStates = 4; + +using RideRatingUpdateStates = std::array; + +RideRatingUpdateStates& RideRatingGetUpdateStates(); +void RideRatingResetUpdateStates(); void RideRatingsUpdateRide(const Ride& ride); void RideRatingsUpdateAll();