From 3c9136ac4ffca5aff833504e2a81024ec58c2a97 Mon Sep 17 00:00:00 2001 From: mix Date: Sat, 17 May 2025 21:21:47 +0100 Subject: [PATCH] Prevent ride ratings from invalidating ride windows unnecessarily --- src/openrct2-ui/windows/Ride.cpp | 7 +++++++ src/openrct2/ride/Ride.h | 1 + src/openrct2/ride/RideRatings.cpp | 9 +++++---- src/openrct2/ride/RideRatings.h | 2 ++ src/openrct2/ride/Vehicle.cpp | 1 + 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 0b2e397e17..a6c9e7fe2c 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -5511,6 +5511,13 @@ namespace OpenRCT2::Ui::Windows frame_no++; OnPrepareDraw(); InvalidateWidget(WIDX_TAB_7); + + Ride* const ride = GetRide(rideId); + if (ride && ride->windowInvalidateFlags & RIDE_INVALIDATE_RIDE_RATINGS) + { + Invalidate(); + ride->windowInvalidateFlags &= ~RIDE_INVALIDATE_RIDE_RATINGS; + } } void MeasurementsOnToolDown(WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 92405060ac..abf2ed9237 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -797,6 +797,7 @@ enum RIDE_INVALIDATE_RIDE_OPERATING = 1 << 4, RIDE_INVALIDATE_RIDE_MAINTENANCE = 1 << 5, RIDE_INVALIDATE_RIDE_MUSIC = 1 << 6, + RIDE_INVALIDATE_RIDE_RATINGS = 1 << 7, }; enum diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 7cd0504fa1..458d85df2d 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -433,9 +433,6 @@ static void ride_ratings_update_state_3(RideRatingUpdateState& state) RideRatingsCalculate(state, *ride); RideRatingsCalculateValue(*ride); - auto* windowMgr = Ui::GetWindowManager(); - windowMgr->InvalidateByNumber(WindowClass::Ride, state.CurrentRide.ToUnderlying()); - state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } @@ -1049,7 +1046,11 @@ static void RideRatingsCalculate(RideRatingUpdateState& state, Ride& ride) // Universl ratings adjustments RideRatingsApplyIntensityPenalty(ratings); RideRatingsApplyAdjustments(ride, ratings); - ride.ratings = ratings; + if (ride.ratings != ratings) + { + ride.ratings = ratings; + ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_RATINGS; + } ride.upkeepCost = RideComputeUpkeep(state, ride); ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_INCOME; diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index 9bf582d58b..451489c6d0 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -39,6 +39,8 @@ struct RatingTuple bool isNull() const; void setNull(); + + bool operator==(const RatingTuple& rhs) const = default; }; static_assert(sizeof(RatingTuple) == 6); diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 9a8db2c315..3e71a11316 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -2318,6 +2318,7 @@ static void test_finish(Ride& ride) { ride.lifecycleFlags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS; ride.lifecycleFlags |= RIDE_LIFECYCLE_TESTED; + ride.windowInvalidateFlags |= RIDE_INVALIDATE_RIDE_RATINGS; auto rideStations = ride.getStations(); for (int32_t i = ride.numStations - 1; i >= 1; i--)