diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 2499a8b719..a612e6af35 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -779,7 +779,7 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src) void S6Exporter::ExportRideRatingsCalcData() { - const auto& src = gRideRatingsCalcData; + const auto& src = gRideRatingUpdateState; auto& dst = _s6.ride_ratings_calc_data; dst.proximity_x = src.Proximity.x; dst.proximity_y = src.Proximity.y; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 283842f286..d4120c213b 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -807,7 +807,7 @@ public: void ImportRideRatingsCalcData() { const auto& src = _s6.ride_ratings_calc_data; - auto& dst = gRideRatingsCalcData; + auto& dst = gRideRatingUpdateState; dst = {}; dst.Proximity = { src.proximity_x, src.proximity_y, src.proximity_z }; dst.ProximityStart = { src.proximity_start_x, src.proximity_start_y, src.proximity_start_z }; diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index 83a56c06b4..a55effda55 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -32,7 +32,8 @@ enum class ResearchCategory : uint8_t; -using ride_ratings_calculation = void (*)(Ride* ride); +using ride_ratings_calculation = void (*)(Ride* ride, RideRatingUpdateState& state); + struct RideComponentName { rct_string_id singular; diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 6bb33639f4..58265bbbb9 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -76,19 +76,19 @@ struct ShelteredEights uint8_t TotalShelteredEighths; }; -RideRatingCalculationData gRideRatingsCalcData; +RideRatingUpdateState gRideRatingUpdateState; -static void ride_ratings_update_state(); -static void ride_ratings_update_state_0(); -static void ride_ratings_update_state_1(); -static void ride_ratings_update_state_2(); -static void ride_ratings_update_state_3(); -static void ride_ratings_update_state_4(); -static void ride_ratings_update_state_5(); -static void ride_ratings_begin_proximity_loop(); -static void ride_ratings_calculate(Ride* ride); +static void ride_ratings_update_state(RideRatingUpdateState& state); +static void ride_ratings_update_state_0(RideRatingUpdateState& state); +static void ride_ratings_update_state_1(RideRatingUpdateState& state); +static void ride_ratings_update_state_2(RideRatingUpdateState& state); +static void ride_ratings_update_state_3(RideRatingUpdateState& state); +static void ride_ratings_update_state_4(RideRatingUpdateState& state); +static void ride_ratings_update_state_5(RideRatingUpdateState& state); +static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state); +static void ride_ratings_calculate(RideRatingUpdateState& state, Ride* ride); static void ride_ratings_calculate_value(Ride* ride); -static void ride_ratings_score_close_proximity(TileElement* inputTileElement); +static void ride_ratings_score_close_proximity(RideRatingUpdateState& state, TileElement* inputTileElement); static void ride_ratings_add(RatingTuple* rating, int32_t excitement, int32_t intensity, int32_t nausea); @@ -100,13 +100,14 @@ static void ride_ratings_add(RatingTuple* rating, int32_t excitement, int32_t in */ void ride_ratings_update_ride(const Ride& ride) { + RideRatingUpdateState state; if (ride.status != RideStatus::Closed) { - gRideRatingsCalcData.CurrentRide = ride.id; - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_INITIALISE; - while (gRideRatingsCalcData.State != RIDE_RATINGS_STATE_FIND_NEXT_RIDE) + state.CurrentRide = ride.id; + state.State = RIDE_RATINGS_STATE_INITIALISE; + while (state.State != RIDE_RATINGS_STATE_FIND_NEXT_RIDE) { - ride_ratings_update_state(); + ride_ratings_update_state(state); } } } @@ -120,30 +121,32 @@ void ride_ratings_update_all() if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) return; - ride_ratings_update_state(); + // NOTE: Until the new save format only one ride can be updated at once. + // The SV6 format can store only a single state. + ride_ratings_update_state(gRideRatingUpdateState); } -static void ride_ratings_update_state() +static void ride_ratings_update_state(RideRatingUpdateState& state) { - switch (gRideRatingsCalcData.State) + switch (state.State) { case RIDE_RATINGS_STATE_FIND_NEXT_RIDE: - ride_ratings_update_state_0(); + ride_ratings_update_state_0(state); break; case RIDE_RATINGS_STATE_INITIALISE: - ride_ratings_update_state_1(); + ride_ratings_update_state_1(state); break; case RIDE_RATINGS_STATE_2: - ride_ratings_update_state_2(); + ride_ratings_update_state_2(state); break; case RIDE_RATINGS_STATE_CALCULATE: - ride_ratings_update_state_3(); + ride_ratings_update_state_3(state); break; case RIDE_RATINGS_STATE_4: - ride_ratings_update_state_4(); + ride_ratings_update_state_4(state); break; case RIDE_RATINGS_STATE_5: - ride_ratings_update_state_5(); + ride_ratings_update_state_5(state); break; } } @@ -152,9 +155,9 @@ static void ride_ratings_update_state() * * rct2: 0x006B5A5C */ -static void ride_ratings_update_state_0() +static void ride_ratings_update_state_0(RideRatingUpdateState& state) { - ride_id_t currentRide = gRideRatingsCalcData.CurrentRide; + ride_id_t currentRide = state.CurrentRide; currentRide++; if (currentRide >= MAX_RIDES) @@ -165,50 +168,50 @@ static void ride_ratings_update_state_0() auto ride = get_ride(currentRide); if (ride != nullptr && ride->status != RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_INITIALISE; + state.State = RIDE_RATINGS_STATE_INITIALISE; } - gRideRatingsCalcData.CurrentRide = currentRide; + state.CurrentRide = currentRide; } /** * * rct2: 0x006B5A94 */ -static void ride_ratings_update_state_1() +static void ride_ratings_update_state_1(RideRatingUpdateState& state) { - gRideRatingsCalcData.ProximityTotal = 0; + state.ProximityTotal = 0; for (int32_t i = 0; i < PROXIMITY_COUNT; i++) { - gRideRatingsCalcData.ProximityScores[i] = 0; + state.ProximityScores[i] = 0; } - gRideRatingsCalcData.AmountOfBrakes = 0; - gRideRatingsCalcData.AmountOfReversers = 0; - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_2; - gRideRatingsCalcData.StationFlags = 0; - ride_ratings_begin_proximity_loop(); + state.AmountOfBrakes = 0; + state.AmountOfReversers = 0; + state.State = RIDE_RATINGS_STATE_2; + state.StationFlags = 0; + ride_ratings_begin_proximity_loop(state); } /** * * rct2: 0x006B5C66 */ -static void ride_ratings_update_state_2() +static void ride_ratings_update_state_2(RideRatingUpdateState& state) { - const ride_id_t rideIndex = gRideRatingsCalcData.CurrentRide; + const ride_id_t rideIndex = state.CurrentRide; auto ride = get_ride(rideIndex); if (ride == nullptr || ride->status == RideStatus::Closed || ride->type >= RIDE_TYPE_COUNT) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } - auto loc = gRideRatingsCalcData.Proximity; - track_type_t trackType = gRideRatingsCalcData.ProximityTrackType; + auto loc = state.Proximity; + track_type_t trackType = state.ProximityTrackType; TileElement* tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } do @@ -233,89 +236,89 @@ static void ride_ratings_update_state_2() if (trackType == TrackElemType::EndStation) { int32_t entranceIndex = tileElement->AsTrack()->GetStationIndex(); - gRideRatingsCalcData.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; if (ride_get_entrance_location(ride, entranceIndex).isNull()) { - gRideRatingsCalcData.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; } } - ride_ratings_score_close_proximity(tileElement); + ride_ratings_score_close_proximity(state, tileElement); - CoordsXYE trackElement = { gRideRatingsCalcData.Proximity, tileElement }; + CoordsXYE trackElement = { state.Proximity, tileElement }; CoordsXYE nextTrackElement; if (!track_block_get_next(&trackElement, &nextTrackElement, nullptr, nullptr)) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_4; + state.State = RIDE_RATINGS_STATE_4; return; } loc = { nextTrackElement, nextTrackElement.element->GetBaseZ() }; tileElement = nextTrackElement.element; - if (loc == gRideRatingsCalcData.ProximityStart) + if (loc == state.ProximityStart) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } - gRideRatingsCalcData.Proximity = loc; - gRideRatingsCalcData.ProximityTrackType = tileElement->AsTrack()->GetTrackType(); + state.Proximity = loc; + state.ProximityTrackType = tileElement->AsTrack()->GetTrackType(); return; } } while (!(tileElement++)->IsLastForTile()); - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } /** * * rct2: 0x006B5E4D */ -static void ride_ratings_update_state_3() +static void ride_ratings_update_state_3(RideRatingUpdateState& state) { - auto ride = get_ride(gRideRatingsCalcData.CurrentRide); + auto ride = get_ride(state.CurrentRide); if (ride == nullptr || ride->status == RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } - ride_ratings_calculate(ride); + ride_ratings_calculate(state, ride); ride_ratings_calculate_value(ride); - window_invalidate_by_number(WC_RIDE, gRideRatingsCalcData.CurrentRide); - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + window_invalidate_by_number(WC_RIDE, state.CurrentRide); + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } /** * * rct2: 0x006B5BAB */ -static void ride_ratings_update_state_4() +static void ride_ratings_update_state_4(RideRatingUpdateState& state) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_5; - ride_ratings_begin_proximity_loop(); + state.State = RIDE_RATINGS_STATE_5; + ride_ratings_begin_proximity_loop(state); } /** * * rct2: 0x006B5D72 */ -static void ride_ratings_update_state_5() +static void ride_ratings_update_state_5(RideRatingUpdateState& state) { - auto ride = get_ride(gRideRatingsCalcData.CurrentRide); + auto ride = get_ride(state.CurrentRide); if (ride == nullptr || ride->status == RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } - auto loc = gRideRatingsCalcData.Proximity; - track_type_t trackType = gRideRatingsCalcData.ProximityTrackType; + auto loc = state.Proximity; + track_type_t trackType = state.ProximityTrackType; TileElement* tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } do @@ -336,48 +339,48 @@ static void ride_ratings_update_state_5() // TODO: Hack to be removed with new save format - trackType 0xFF should not be here. if (trackType == 0xFF || trackType == TrackElemType::None || trackType == tileElement->AsTrack()->GetTrackType()) { - ride_ratings_score_close_proximity(tileElement); + ride_ratings_score_close_proximity(state, tileElement); track_begin_end trackBeginEnd; - if (!track_block_get_previous({ gRideRatingsCalcData.Proximity, tileElement }, &trackBeginEnd)) + if (!track_block_get_previous({ state.Proximity, tileElement }, &trackBeginEnd)) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } loc.x = trackBeginEnd.begin_x; loc.y = trackBeginEnd.begin_y; loc.z = trackBeginEnd.begin_z; - if (loc == gRideRatingsCalcData.ProximityStart) + if (loc == state.ProximityStart) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } - gRideRatingsCalcData.Proximity = loc; - gRideRatingsCalcData.ProximityTrackType = trackBeginEnd.begin_element->AsTrack()->GetTrackType(); + state.Proximity = loc; + state.ProximityTrackType = trackBeginEnd.begin_element->AsTrack()->GetTrackType(); return; } } while (!(tileElement++)->IsLastForTile()); - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } /** * * rct2: 0x006B5BB2 */ -static void ride_ratings_begin_proximity_loop() +static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state) { - auto ride = get_ride(gRideRatingsCalcData.CurrentRide); + auto ride = get_ride(state.CurrentRide); if (ride == nullptr || ride->status == RideStatus::Closed) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; return; } if (ride->type == RIDE_TYPE_MAZE) { - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_CALCULATE; + state.State = RIDE_RATINGS_STATE_CALCULATE; return; } @@ -385,35 +388,36 @@ static void ride_ratings_begin_proximity_loop() { if (!ride->stations[i].Start.isNull()) { - gRideRatingsCalcData.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; if (ride_get_entrance_location(ride, i).isNull()) { - gRideRatingsCalcData.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; + state.StationFlags |= RIDE_RATING_STATION_FLAG_NO_ENTRANCE; } auto location = ride->stations[i].GetStart(); - gRideRatingsCalcData.Proximity = location; - gRideRatingsCalcData.ProximityTrackType = TrackElemType::None; - gRideRatingsCalcData.ProximityStart = location; + state.Proximity = location; + state.ProximityTrackType = TrackElemType::None; + state.ProximityStart = location; return; } } - gRideRatingsCalcData.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + state.State = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } -static void proximity_score_increment(int32_t type) +static void proximity_score_increment(RideRatingUpdateState& state, int32_t type) { - gRideRatingsCalcData.ProximityScores[type]++; + state.ProximityScores[type]++; } /** * * rct2: 0x006B6207 */ -static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTileElement, int32_t direction) +static void ride_ratings_score_close_proximity_in_direction( + RideRatingUpdateState& state, TileElement* inputTileElement, int32_t direction) { - auto scorePos = CoordsXY{ CoordsXY{ gRideRatingsCalcData.Proximity } + CoordsDirectionDelta[direction] }; + auto scorePos = CoordsXY{ CoordsXY{ state.Proximity } + CoordsDirectionDelta[direction] }; if (!map_is_location_valid(scorePos)) return; @@ -428,18 +432,18 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi switch (tileElement->GetType()) { case TILE_ELEMENT_TYPE_SURFACE: - if (gRideRatingsCalcData.ProximityBaseHeight <= inputTileElement->base_height) + if (state.ProximityBaseHeight <= inputTileElement->base_height) { if (inputTileElement->clearance_height <= tileElement->base_height) { - proximity_score_increment(PROXIMITY_SURFACE_SIDE_CLOSE); + proximity_score_increment(state, PROXIMITY_SURFACE_SIDE_CLOSE); } } break; case TILE_ELEMENT_TYPE_PATH: if (abs(inputTileElement->GetBaseZ() - tileElement->GetBaseZ()) <= 2 * COORDS_Z_STEP) { - proximity_score_increment(PROXIMITY_PATH_SIDE_CLOSE); + proximity_score_increment(state, PROXIMITY_PATH_SIDE_CLOSE); } break; case TILE_ELEMENT_TYPE_TRACK: @@ -447,7 +451,7 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi { if (abs(inputTileElement->GetBaseZ() - tileElement->GetBaseZ()) <= 2 * COORDS_Z_STEP) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE); } } break; @@ -457,11 +461,11 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi { if (inputTileElement->GetBaseZ() > tileElement->GetClearanceZ()) { - proximity_score_increment(PROXIMITY_SCENERY_SIDE_ABOVE); + proximity_score_increment(state, PROXIMITY_SCENERY_SIDE_ABOVE); } else { - proximity_score_increment(PROXIMITY_SCENERY_SIDE_BELOW); + proximity_score_increment(state, PROXIMITY_SCENERY_SIDE_BELOW); } } break; @@ -469,7 +473,7 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi } while (!(tileElement++)->IsLastForTile()); } -static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coordsElement) +static void ride_ratings_score_close_proximity_loops_helper(RideRatingUpdateState& state, const CoordsXYE& coordsElement) { TileElement* tileElement = map_get_first_element_at(coordsElement); if (tileElement == nullptr) @@ -487,7 +491,7 @@ static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coo - static_cast(coordsElement.element->base_height); if (zDiff >= 0 && zDiff <= 16) { - proximity_score_increment(PROXIMITY_PATH_TROUGH_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_PATH_TROUGH_VERTICAL_LOOP); } } break; @@ -501,11 +505,11 @@ static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coo - static_cast(coordsElement.element->base_height); if (zDiff >= 0 && zDiff <= 16) { - proximity_score_increment(PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP); if (tileElement->AsTrack()->GetTrackType() == TrackElemType::LeftVerticalLoop || tileElement->AsTrack()->GetTrackType() == TrackElemType::RightVerticalLoop) { - proximity_score_increment(PROXIMITY_INTERSECTING_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_INTERSECTING_VERTICAL_LOOP); } } } @@ -519,16 +523,16 @@ static void ride_ratings_score_close_proximity_loops_helper(const CoordsXYE& coo * * rct2: 0x006B62DA */ -static void ride_ratings_score_close_proximity_loops(TileElement* inputTileElement) +static void ride_ratings_score_close_proximity_loops(RideRatingUpdateState& state, TileElement* inputTileElement) { auto trackType = inputTileElement->AsTrack()->GetTrackType(); if (trackType == TrackElemType::LeftVerticalLoop || trackType == TrackElemType::RightVerticalLoop) { - ride_ratings_score_close_proximity_loops_helper({ gRideRatingsCalcData.Proximity, inputTileElement }); + ride_ratings_score_close_proximity_loops_helper(state, { state.Proximity, inputTileElement }); int32_t direction = inputTileElement->GetDirection(); ride_ratings_score_close_proximity_loops_helper( - { CoordsXY{ gRideRatingsCalcData.Proximity } + CoordsDirectionDelta[direction], inputTileElement }); + state, { CoordsXY{ state.Proximity } + CoordsDirectionDelta[direction], inputTileElement }); } } @@ -536,15 +540,15 @@ static void ride_ratings_score_close_proximity_loops(TileElement* inputTileEleme * * rct2: 0x006B5F9D */ -static void ride_ratings_score_close_proximity(TileElement* inputTileElement) +static void ride_ratings_score_close_proximity(RideRatingUpdateState& state, TileElement* inputTileElement) { - if (gRideRatingsCalcData.StationFlags & RIDE_RATING_STATION_FLAG_NO_ENTRANCE) + if (state.StationFlags & RIDE_RATING_STATION_FLAG_NO_ENTRANCE) { return; } - gRideRatingsCalcData.ProximityTotal++; - TileElement* tileElement = map_get_first_element_at(gRideRatingsCalcData.Proximity); + state.ProximityTotal++; + TileElement* tileElement = map_get_first_element_at(state.Proximity); if (tileElement == nullptr) return; do @@ -556,31 +560,31 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) switch (tileElement->GetType()) { case TILE_ELEMENT_TYPE_SURFACE: - gRideRatingsCalcData.ProximityBaseHeight = tileElement->base_height; - if (tileElement->GetBaseZ() == gRideRatingsCalcData.Proximity.z) + state.ProximityBaseHeight = tileElement->base_height; + if (tileElement->GetBaseZ() == state.Proximity.z) { - proximity_score_increment(PROXIMITY_SURFACE_TOUCH); + proximity_score_increment(state, PROXIMITY_SURFACE_TOUCH); } waterHeight = tileElement->AsSurface()->GetWaterHeight(); if (waterHeight != 0) { auto z = waterHeight; - if (z <= gRideRatingsCalcData.Proximity.z) + if (z <= state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_OVER); - if (z == gRideRatingsCalcData.Proximity.z) + proximity_score_increment(state, PROXIMITY_WATER_OVER); + if (z == state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_TOUCH); + proximity_score_increment(state, PROXIMITY_WATER_TOUCH); } z += 16; - if (z == gRideRatingsCalcData.Proximity.z) + if (z == state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_LOW); + proximity_score_increment(state, PROXIMITY_WATER_LOW); } z += 112; - if (z <= gRideRatingsCalcData.Proximity.z) + if (z <= state.Proximity.z) { - proximity_score_increment(PROXIMITY_WATER_HIGH); + proximity_score_increment(state, PROXIMITY_WATER_HIGH); } } } @@ -591,11 +595,11 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) { if (tileElement->GetClearanceZ() == inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_PATH_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_PATH_TOUCH_ABOVE); } if (tileElement->GetBaseZ() == inputTileElement->GetClearanceZ()) { - proximity_score_increment(PROXIMITY_PATH_TOUCH_UNDER); + proximity_score_increment(state, PROXIMITY_PATH_TOUCH_UNDER); } } else @@ -603,15 +607,15 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) // Bonus for path in first object entry if (tileElement->GetClearanceZ() <= inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_PATH_ZERO_OVER); + proximity_score_increment(state, PROXIMITY_PATH_ZERO_OVER); } if (tileElement->GetClearanceZ() == inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_PATH_ZERO_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_PATH_ZERO_TOUCH_ABOVE); } if (tileElement->GetBaseZ() == inputTileElement->GetClearanceZ()) { - proximity_score_increment(PROXIMITY_PATH_ZERO_TOUCH_UNDER); + proximity_score_increment(state, PROXIMITY_PATH_ZERO_TOUCH_UNDER); } } break; @@ -625,33 +629,33 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) { if (tileElement->base_height - inputTileElement->clearance_height <= 10) { - proximity_score_increment(PROXIMITY_THROUGH_VERTICAL_LOOP); + proximity_score_increment(state, PROXIMITY_THROUGH_VERTICAL_LOOP); } } } if (inputTileElement->AsTrack()->GetRideIndex() != tileElement->AsTrack()->GetRideIndex()) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW); if (tileElement->GetClearanceZ() == inputTileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); } if (tileElement->clearance_height + 2 <= inputTileElement->base_height) { if (tileElement->clearance_height + 10 >= inputTileElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); } } if (inputTileElement->clearance_height == tileElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); } if (inputTileElement->clearance_height + 2 == tileElement->base_height) { if (static_cast(inputTileElement->clearance_height + 10) >= tileElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); } } } @@ -660,40 +664,40 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) bool isStation = tileElement->AsTrack()->IsStation(); if (tileElement->clearance_height == inputTileElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_TOUCH_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_TOUCH_ABOVE); } } if (tileElement->clearance_height + 2 <= inputTileElement->base_height) { if (tileElement->clearance_height + 10 >= inputTileElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_CLOSE_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_CLOSE_ABOVE); } } } if (inputTileElement->GetClearanceZ() == tileElement->GetBaseZ()) { - proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_TOUCH_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_TOUCH_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_TOUCH_ABOVE); } } if (inputTileElement->clearance_height + 2 <= tileElement->base_height) { if (inputTileElement->clearance_height + 10 >= tileElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_TRACK_CLOSE_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_OWN_STATION_CLOSE_ABOVE); + proximity_score_increment(state, PROXIMITY_OWN_STATION_CLOSE_ABOVE); } } } @@ -704,28 +708,28 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) } while (!(tileElement++)->IsLastForTile()); uint8_t direction = inputTileElement->GetDirection(); - ride_ratings_score_close_proximity_in_direction(inputTileElement, (direction + 1) & 3); - ride_ratings_score_close_proximity_in_direction(inputTileElement, (direction - 1) & 3); - ride_ratings_score_close_proximity_loops(inputTileElement); + ride_ratings_score_close_proximity_in_direction(state, inputTileElement, (direction + 1) & 3); + ride_ratings_score_close_proximity_in_direction(state, inputTileElement, (direction - 1) & 3); + ride_ratings_score_close_proximity_loops(state, inputTileElement); - switch (gRideRatingsCalcData.ProximityTrackType) + switch (state.ProximityTrackType) { case TrackElemType::Brakes: - gRideRatingsCalcData.AmountOfBrakes++; + state.AmountOfBrakes++; break; case TrackElemType::LeftReverser: case TrackElemType::RightReverser: - gRideRatingsCalcData.AmountOfReversers++; + state.AmountOfReversers++; break; } } -static void ride_ratings_calculate(Ride* ride) +static void ride_ratings_calculate(RideRatingUpdateState& state, Ride* ride) { auto calcFunc = ride_ratings_get_calculate_func(ride->type); if (calcFunc != nullptr) { - calcFunc(ride); + calcFunc(ride, state); } #ifdef ORIGINAL_RATINGS @@ -867,7 +871,7 @@ static void ride_ratings_calculate_value(Ride* ride) * inputs * - edi: ride ptr */ -static uint16_t ride_compute_upkeep(Ride* ride) +static uint16_t ride_compute_upkeep(RideRatingUpdateState& state, Ride* ride) { // data stored at 0x0057E3A8, incrementing 18 bytes at a time uint16_t upkeep = ride->GetRideTypeDescriptor().UpkeepCosts.BaseCost; @@ -903,10 +907,10 @@ static uint16_t ride_compute_upkeep(Ride* ride) { reverserMaintenanceCost = 10; } - upkeep += reverserMaintenanceCost * gRideRatingsCalcData.AmountOfReversers; + upkeep += reverserMaintenanceCost * state.AmountOfReversers; // Add maintenance cost for brake track pieces - upkeep += 20 * gRideRatingsCalcData.AmountOfBrakes; + upkeep += 20 * state.AmountOfBrakes; // these seem to be adhoc adjustments to a ride's upkeep/cost, times // various variables set on the ride itself. @@ -1058,9 +1062,9 @@ static uint32_t get_proximity_score_helper_3(uint16_t x, uint16_t resultIfNotZer * * rct2: 0x0065E277 */ -static uint32_t ride_ratings_get_proximity_score() +static uint32_t ride_ratings_get_proximity_score(RideRatingUpdateState& state) { - const uint16_t* scores = gRideRatingsCalcData.ProximityScores; + const uint16_t* scores = state.ProximityScores; uint32_t result = 0; result += get_proximity_score_helper_1(scores[PROXIMITY_WATER_OVER], 60, 0x00AAAA); @@ -1591,9 +1595,9 @@ static void ride_ratings_apply_rotations( ride->rotations * nauseaMultiplier); } -static void ride_ratings_apply_proximity(RatingTuple* ratings, int32_t excitementMultiplier) +static void ride_ratings_apply_proximity(RideRatingUpdateState& state, RatingTuple* ratings, int32_t excitementMultiplier) { - ride_ratings_add(ratings, (ride_ratings_get_proximity_score() * excitementMultiplier) >> 16, 0, 0); + ride_ratings_add(ratings, (ride_ratings_get_proximity_score(state) * excitementMultiplier) >> 16, 0, 0); } static void ride_ratings_apply_scenery(RatingTuple* ratings, Ride* ride, int32_t excitementMultiplier) @@ -1718,7 +1722,7 @@ static void ride_ratings_apply_first_length_penalty( #pragma region Ride rating calculation functions -void ride_ratings_calculate_spiral_roller_coaster(Ride* ride) +void ride_ratings_calculate_spiral_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1738,7 +1742,7 @@ void ride_ratings_calculate_spiral_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 28235, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -1758,13 +1762,13 @@ void ride_ratings_calculate_spiral_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride) +void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1784,7 +1788,7 @@ void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 34952, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 28398, 30427); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -1796,13 +1800,13 @@ void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride) +void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1822,7 +1826,7 @@ void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 48036); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6971); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xC0000, 2, 2, 2); @@ -1836,13 +1840,13 @@ void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_inverted_roller_coaster(Ride* ride) +void ride_ratings_calculate_inverted_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1862,7 +1866,7 @@ void ride_ratings_calculate_inverted_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); if (ride->inversions == 0) @@ -1879,13 +1883,13 @@ void ride_ratings_calculate_inverted_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_junior_roller_coaster(Ride* ride) +void ride_ratings_calculate_junior_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1905,7 +1909,7 @@ void ride_ratings_calculate_junior_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -1917,13 +1921,13 @@ void ride_ratings_calculate_junior_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_miniature_railway(Ride* ride) +void ride_ratings_calculate_miniature_railway(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1939,7 +1943,7 @@ void ride_ratings_calculate_miniature_railway(Ride* ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); ride_ratings_apply_duration(&ratings, ride, 150, 26214); ride_ratings_apply_sheltered_ratings(&ratings, ride, -6425, 6553, 23405); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 20915); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); @@ -1948,7 +1952,7 @@ void ride_ratings_calculate_miniature_railway(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -1958,7 +1962,7 @@ void ride_ratings_calculate_miniature_railway(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_monorail(Ride* ride) +void ride_ratings_calculate_monorail(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -1974,7 +1978,7 @@ void ride_ratings_calculate_monorail(Ride* ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 218453); ride_ratings_apply_duration(&ratings, ride, 150, 21845); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 18724); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); @@ -1983,7 +1987,7 @@ void ride_ratings_calculate_monorail(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -1993,7 +1997,7 @@ void ride_ratings_calculate_monorail(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_mini_suspended_coaster(Ride* ride) +void ride_ratings_calculate_mini_suspended_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2013,7 +2017,7 @@ void ride_ratings_calculate_mini_suspended_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 34179, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 58254, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 13943); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); @@ -2026,13 +2030,13 @@ void ride_ratings_calculate_mini_suspended_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_boat_hire(Ride* ride) +void ride_ratings_calculate_boat_hire(Ride* ride, RideRatingUpdateState& state) { ride->unreliability_factor = 7; set_unreliability_factor(ride); @@ -2050,7 +2054,7 @@ void ride_ratings_calculate_boat_hire(Ride* ride) ride_ratings_add(&ratings, RIDE_RATING(0, 20), 0, 0); } - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -2058,13 +2062,13 @@ void ride_ratings_calculate_boat_hire(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_wooden_wild_mouse(Ride* ride) +void ride_ratings_calculate_wooden_wild_mouse(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2084,7 +2088,7 @@ void ride_ratings_calculate_wooden_wild_mouse(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -2099,13 +2103,13 @@ void ride_ratings_calculate_wooden_wild_mouse(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_steeplechase(Ride* ride) +void ride_ratings_calculate_steeplechase(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2125,7 +2129,7 @@ void ride_ratings_calculate_steeplechase(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 4, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); @@ -2139,13 +2143,13 @@ void ride_ratings_calculate_steeplechase(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_car_ride(Ride* ride) +void ride_ratings_calculate_car_ride(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2164,7 +2168,7 @@ void ride_ratings_calculate_car_ride(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 11437); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 8, 2, 2); @@ -2173,13 +2177,13 @@ void ride_ratings_calculate_car_ride(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_launched_freefall(Ride* ride) +void ride_ratings_calculate_launched_freefall(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2216,7 +2220,7 @@ void ride_ratings_calculate_launched_freefall(Ride* ride) } #endif - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_intensity_penalty(&ratings); @@ -2224,13 +2228,13 @@ void ride_ratings_calculate_launched_freefall(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_bobsleigh_coaster(Ride* ride) +void ride_ratings_calculate_bobsleigh_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2250,7 +2254,7 @@ void ride_ratings_calculate_bobsleigh_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xC0000, 2, 2, 2); ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 20), 2, 2, 2); @@ -2262,13 +2266,13 @@ void ride_ratings_calculate_bobsleigh_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_observation_tower(Ride* ride) +void ride_ratings_calculate_observation_tower(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2280,7 +2284,7 @@ void ride_ratings_calculate_observation_tower(Ride* ride) ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(0, 00), RIDE_RATING(0, 10)); ride_ratings_add( &ratings, ((ride_get_total_length(ride) >> 16) * 45875) >> 16, 0, ((ride_get_total_length(ride) >> 16) * 26214) >> 16); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 83662); ride_ratings_apply_intensity_penalty(&ratings); @@ -2288,7 +2292,7 @@ void ride_ratings_calculate_observation_tower(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; @@ -2298,7 +2302,7 @@ void ride_ratings_calculate_observation_tower(Ride* ride) ride->excitement /= 4; } -void ride_ratings_calculate_looping_roller_coaster(Ride* ride) +void ride_ratings_calculate_looping_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2318,7 +2322,7 @@ void ride_ratings_calculate_looping_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -2338,13 +2342,13 @@ void ride_ratings_calculate_looping_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_dinghy_slide(Ride* ride) +void ride_ratings_calculate_dinghy_slide(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2364,7 +2368,7 @@ void ride_ratings_calculate_dinghy_slide(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -2376,13 +2380,13 @@ void ride_ratings_calculate_dinghy_slide(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mine_train_coaster(Ride* ride) +void ride_ratings_calculate_mine_train_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2402,7 +2406,7 @@ void ride_ratings_calculate_mine_train_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 21472); + ride_ratings_apply_proximity(state, &ratings, 21472); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -2416,13 +2420,13 @@ void ride_ratings_calculate_mine_train_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_chairlift(Ride* ride) +void ride_ratings_calculate_chairlift(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2439,7 +2443,7 @@ void ride_ratings_calculate_chairlift(Ride* ride) ride_ratings_apply_duration(&ratings, ride, 150, 26214); ride_ratings_apply_turns(&ratings, ride, 7430, 3476, 4574); ride_ratings_apply_sheltered_ratings(&ratings, ride, -19275, 21845, 23405); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x960000, 2, 2, 2); @@ -2454,7 +2458,7 @@ void ride_ratings_calculate_chairlift(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -2464,7 +2468,7 @@ void ride_ratings_calculate_chairlift(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride) +void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2484,7 +2488,7 @@ void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -2504,13 +2508,13 @@ void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_maze(Ride* ride) +void ride_ratings_calculate_maze(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2530,13 +2534,13 @@ void ride_ratings_calculate_maze(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_spiral_slide(Ride* ride) +void ride_ratings_calculate_spiral_slide(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2559,13 +2563,13 @@ void ride_ratings_calculate_spiral_slide(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 2; } -void ride_ratings_calculate_go_karts(Ride* ride) +void ride_ratings_calculate_go_karts(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2588,7 +2592,7 @@ void ride_ratings_calculate_go_karts(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 4458, 3476, 5718); ride_ratings_apply_drops(&ratings, ride, 8738, 5461, 6553); ride_ratings_apply_sheltered_ratings(&ratings, ride, 2570, 8738, 2340); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_intensity_penalty(&ratings); @@ -2596,7 +2600,7 @@ void ride_ratings_calculate_go_karts(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -2606,7 +2610,7 @@ void ride_ratings_calculate_go_karts(Ride* ride) ride->excitement /= 2; } -void ride_ratings_calculate_log_flume(Ride* ride) +void ride_ratings_calculate_log_flume(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2623,7 +2627,7 @@ void ride_ratings_calculate_log_flume(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 69905, 62415, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); @@ -2632,13 +2636,13 @@ void ride_ratings_calculate_log_flume(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_river_rapids(Ride* ride) +void ride_ratings_calculate_river_rapids(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2655,7 +2659,7 @@ void ride_ratings_calculate_river_rapids(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 22598, 5718); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 31314); + ride_ratings_apply_proximity(state, &ratings, 31314); ride_ratings_apply_scenery(&ratings, ride, 13943); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 2, 2, 2, 2); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); @@ -2665,13 +2669,13 @@ void ride_ratings_calculate_river_rapids(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_dodgems(Ride* ride) +void ride_ratings_calculate_dodgems(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2700,13 +2704,13 @@ void ride_ratings_calculate_dodgems(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_swinging_ship(Ride* ride) +void ride_ratings_calculate_swinging_ship(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2725,13 +2729,13 @@ void ride_ratings_calculate_swinging_ship(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_inverter_ship(Ride* ride) +void ride_ratings_calculate_inverter_ship(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2750,31 +2754,31 @@ void ride_ratings_calculate_inverter_ship(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_food_stall(Ride* ride) +void ride_ratings_calculate_food_stall(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_drink_stall(Ride* ride) +void ride_ratings_calculate_drink_stall(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_shop(Ride* ride) +void ride_ratings_calculate_shop(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_merry_go_round(Ride* ride) +void ride_ratings_calculate_merry_go_round(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2790,25 +2794,25 @@ void ride_ratings_calculate_merry_go_round(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_information_kiosk(Ride* ride) +void ride_ratings_calculate_information_kiosk(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_toilets(Ride* ride) +void ride_ratings_calculate_toilets(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_ferris_wheel(Ride* ride) +void ride_ratings_calculate_ferris_wheel(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2824,13 +2828,13 @@ void ride_ratings_calculate_ferris_wheel(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_motion_simulator(Ride* ride) +void ride_ratings_calculate_motion_simulator(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2857,13 +2861,13 @@ void ride_ratings_calculate_motion_simulator(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_3d_cinema(Ride* ride) +void ride_ratings_calculate_3d_cinema(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2897,13 +2901,13 @@ void ride_ratings_calculate_3d_cinema(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths |= 7; } -void ride_ratings_calculate_top_spin(Ride* ride) +void ride_ratings_calculate_top_spin(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2939,13 +2943,13 @@ void ride_ratings_calculate_top_spin(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_space_rings(Ride* ride) +void ride_ratings_calculate_space_rings(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -2961,13 +2965,13 @@ void ride_ratings_calculate_space_rings(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride) +void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -2982,7 +2986,7 @@ void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride) ride_ratings_apply_max_speed(&ratings, ride, 436906, 436906, 320398); ride_ratings_apply_gforces(&ratings, ride, 24576, 41704, 59578); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 28398, 11702); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 2, 2); @@ -2991,13 +2995,13 @@ void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_lift(Ride* ride) +void ride_ratings_calculate_lift(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3011,7 +3015,7 @@ void ride_ratings_calculate_lift(Ride* ride) int32_t totalLength = ride_get_total_length(ride) >> 16; ride_ratings_add(&ratings, (totalLength * 45875) >> 16, 0, (totalLength * 26214) >> 16); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 83662); ride_ratings_apply_intensity_penalty(&ratings); @@ -3019,7 +3023,7 @@ void ride_ratings_calculate_lift(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; @@ -3028,7 +3032,7 @@ void ride_ratings_calculate_lift(Ride* ride) ride->excitement /= 4; } -void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride) +void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3047,7 +3051,7 @@ void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 58254, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 20, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -3060,19 +3064,19 @@ void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_cash_machine(Ride* ride) +void ride_ratings_calculate_cash_machine(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_twist(Ride* ride) +void ride_ratings_calculate_twist(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3088,13 +3092,13 @@ void ride_ratings_calculate_twist(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_haunted_house(Ride* ride) +void ride_ratings_calculate_haunted_house(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3112,13 +3116,13 @@ void ride_ratings_calculate_haunted_house(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_flying_roller_coaster(Ride* ride) +void ride_ratings_calculate_flying_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3138,7 +3142,7 @@ void ride_ratings_calculate_flying_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3157,13 +3161,13 @@ void ride_ratings_calculate_flying_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_virginia_reel(Ride* ride) +void ride_ratings_calculate_virginia_reel(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3183,7 +3187,7 @@ void ride_ratings_calculate_virginia_reel(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 52012, 26075, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xD20000, 2, 2, 2); ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); @@ -3194,13 +3198,13 @@ void ride_ratings_calculate_virginia_reel(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_splash_boats(Ride* ride) +void ride_ratings_calculate_splash_boats(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3217,7 +3221,7 @@ void ride_ratings_calculate_splash_boats(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 87381, 93622, 62259); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); @@ -3226,13 +3230,13 @@ void ride_ratings_calculate_splash_boats(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mini_helicopters(Ride* ride) +void ride_ratings_calculate_mini_helicopters(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3251,7 +3255,7 @@ void ride_ratings_calculate_mini_helicopters(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 4574); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 12850, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xA00000, 2, 2, 2); @@ -3260,13 +3264,13 @@ void ride_ratings_calculate_mini_helicopters(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 6; } -void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride) +void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3286,7 +3290,7 @@ void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3310,13 +3314,13 @@ void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_suspended_monorail(Ride* ride) +void ride_ratings_calculate_suspended_monorail(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3332,7 +3336,7 @@ void ride_ratings_calculate_suspended_monorail(Ride* ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 218453); ride_ratings_apply_duration(&ratings, ride, 150, 21845); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 18724); - ride_ratings_apply_proximity(&ratings, 12525); + ride_ratings_apply_proximity(state, &ratings, 12525); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); @@ -3341,7 +3345,7 @@ void ride_ratings_calculate_suspended_monorail(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; auto shelteredEighths = get_num_of_sheltered_eighths(ride); @@ -3351,7 +3355,7 @@ void ride_ratings_calculate_suspended_monorail(Ride* ride) ride->sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) +void ride_ratings_calculate_reverser_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3367,7 +3371,7 @@ void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) ride_ratings_apply_max_speed(&ratings, ride, 44281, 88562, 35424); ride_ratings_apply_average_speed(&ratings, ride, 364088, 655360); - int32_t numReversers = std::min(gRideRatingsCalcData.AmountOfReversers, 6); + int32_t numReversers = std::min(state.AmountOfReversers, 6); ride_rating reverserRating = numReversers * RIDE_RATING(0, 20); ride_ratings_add(&ratings, reverserRating, reverserRating, reverserRating); @@ -3376,10 +3380,10 @@ void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); - if (gRideRatingsCalcData.AmountOfReversers < 1) + if (state.AmountOfReversers < 1) { ratings.Excitement /= 8; } @@ -3393,13 +3397,13 @@ void ride_ratings_calculate_reverser_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_heartline_twister_coaster(Ride* ride) +void ride_ratings_calculate_heartline_twister_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3419,7 +3423,7 @@ void ride_ratings_calculate_heartline_twister_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 52150, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 53052, 55705); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 34952, 35108); - ride_ratings_apply_proximity(&ratings, 9841); + ride_ratings_apply_proximity(state, &ratings, 9841); ride_ratings_apply_scenery(&ratings, ride, 3904); if (ride->inversions == 0) @@ -3433,13 +3437,13 @@ void ride_ratings_calculate_heartline_twister_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mini_golf(Ride* ride) +void ride_ratings_calculate_mini_golf(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3452,7 +3456,7 @@ void ride_ratings_calculate_mini_golf(Ride* ride) ride_ratings_apply_length(&ratings, ride, 6000, 873); ride_ratings_apply_turns(&ratings, ride, 14860, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 27887); // Apply golf holes factor @@ -3471,19 +3475,19 @@ void ride_ratings_calculate_mini_golf(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_first_aid(Ride* ride) +void ride_ratings_calculate_first_aid(Ride* ride, RideRatingUpdateState& state) { - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; } -void ride_ratings_calculate_circus(Ride* ride) +void ride_ratings_calculate_circus(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3501,13 +3505,13 @@ void ride_ratings_calculate_circus(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_ghost_train(Ride* ride) +void ride_ratings_calculate_ghost_train(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3525,7 +3529,7 @@ void ride_ratings_calculate_ghost_train(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 11437); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 6553, 4681); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xB40000, 2, 2, 2); @@ -3534,13 +3538,13 @@ void ride_ratings_calculate_ghost_train(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_twister_roller_coaster(Ride* ride) +void ride_ratings_calculate_twister_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3560,7 +3564,7 @@ void ride_ratings_calculate_twister_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3580,13 +3584,13 @@ void ride_ratings_calculate_twister_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_wooden_roller_coaster(Ride* ride) +void ride_ratings_calculate_wooden_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3606,7 +3610,7 @@ void ride_ratings_calculate_wooden_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -3620,13 +3624,13 @@ void ride_ratings_calculate_wooden_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride) +void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3646,7 +3650,7 @@ void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x50000, 2, 2, 2); @@ -3659,13 +3663,13 @@ void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_wild_mouse(Ride* ride) +void ride_ratings_calculate_wild_mouse(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3685,7 +3689,7 @@ void ride_ratings_calculate_wild_mouse(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3699,13 +3703,13 @@ void ride_ratings_calculate_wild_mouse(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride) +void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3725,7 +3729,7 @@ void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3744,13 +3748,13 @@ void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_giga_coaster(Ride* ride) +void ride_ratings_calculate_giga_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3770,7 +3774,7 @@ void ride_ratings_calculate_giga_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 28235, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -3790,13 +3794,13 @@ void ride_ratings_calculate_giga_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_roto_drop(Ride* ride) +void ride_ratings_calculate_roto_drop(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3810,7 +3814,7 @@ void ride_ratings_calculate_roto_drop(Ride* ride) int32_t lengthFactor = ((ride_get_total_length(ride) >> 16) * 209715) >> 16; ride_ratings_add(&ratings, lengthFactor, lengthFactor * 2, lengthFactor * 2); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_intensity_penalty(&ratings); @@ -3818,13 +3822,13 @@ void ride_ratings_calculate_roto_drop(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_flying_saucers(Ride* ride) +void ride_ratings_calculate_flying_saucers(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3856,13 +3860,13 @@ void ride_ratings_calculate_flying_saucers(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_crooked_house(Ride* ride) +void ride_ratings_calculate_crooked_house(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -3880,13 +3884,13 @@ void ride_ratings_calculate_crooked_house(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 7; } -void ride_ratings_calculate_monorail_cycles(Ride* ride) +void ride_ratings_calculate_monorail_cycles(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3905,7 +3909,7 @@ void ride_ratings_calculate_monorail_cycles(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 14860, 0, 4574); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_sheltered_ratings(&ratings, ride, 5140, 6553, 2340); - ride_ratings_apply_proximity(&ratings, 8946); + ride_ratings_apply_proximity(state, &ratings, 8946); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x8C0000, 2, 2, 2); @@ -3914,13 +3918,13 @@ void ride_ratings_calculate_monorail_cycles(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_compact_inverted_coaster(Ride* ride) +void ride_ratings_calculate_compact_inverted_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3940,7 +3944,7 @@ void ride_ratings_calculate_compact_inverted_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); if (ride->inversions == 0) @@ -3957,13 +3961,13 @@ void ride_ratings_calculate_compact_inverted_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_water_coaster(Ride* ride) +void ride_ratings_calculate_water_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -3983,7 +3987,7 @@ void ride_ratings_calculate_water_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3998,13 +4002,13 @@ void ride_ratings_calculate_water_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride) +void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4019,7 +4023,7 @@ void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride) ride_ratings_apply_max_speed(&ratings, ride, 509724, 364088, 320398); ride_ratings_apply_gforces(&ratings, ride, 24576, 35746, 59578); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 21845, 11702); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 1, 1); @@ -4029,13 +4033,13 @@ void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride) +void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4055,7 +4059,7 @@ void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 17893); + ride_ratings_apply_proximity(state, &ratings, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -4070,13 +4074,13 @@ void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_magic_carpet(Ride* ride) +void ride_ratings_calculate_magic_carpet(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -4095,13 +4099,13 @@ void ride_ratings_calculate_magic_carpet(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 0; } -void ride_ratings_calculate_submarine_ride(Ride* ride) +void ride_ratings_calculate_submarine_ride(Ride* ride, RideRatingUpdateState& state) { ride->unreliability_factor = 7; set_unreliability_factor(ride); @@ -4111,7 +4115,7 @@ void ride_ratings_calculate_submarine_ride(Ride* ride) RatingTuple ratings; ride_ratings_set(&ratings, RIDE_RATING(2, 20), RIDE_RATING(1, 80), RIDE_RATING(1, 40)); ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_proximity(&ratings, 11183); + ride_ratings_apply_proximity(state, &ratings, 11183); ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -4119,14 +4123,14 @@ void ride_ratings_calculate_submarine_ride(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; // Originally, this was always to zero, even though the default vehicle is completely enclosed. ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_river_rafts(Ride* ride) +void ride_ratings_calculate_river_rafts(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4142,7 +4146,7 @@ void ride_ratings_calculate_river_rafts(Ride* ride) ride_ratings_apply_duration(&ratings, ride, 500, 13107); ride_ratings_apply_turns(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 78643, 93622, 62259); - ride_ratings_apply_proximity(&ratings, 13420); + ride_ratings_apply_proximity(state, &ratings, 13420); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_intensity_penalty(&ratings); @@ -4150,13 +4154,13 @@ void ride_ratings_calculate_river_rafts(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_enterprise(Ride* ride) +void ride_ratings_calculate_enterprise(Ride* ride, RideRatingUpdateState& state) { ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; @@ -4179,13 +4183,13 @@ void ride_ratings_calculate_enterprise(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = 3; } -void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride) +void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4205,7 +4209,7 @@ void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_proximity(&ratings, 15657); + ride_ratings_apply_proximity(state, &ratings, 15657); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 20, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -4216,13 +4220,13 @@ void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mini_roller_coaster(Ride* ride) +void ride_ratings_calculate_mini_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4242,7 +4246,7 @@ void ride_ratings_calculate_mini_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -4255,13 +4259,13 @@ void ride_ratings_calculate_mini_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_mine_ride(Ride* ride) +void ride_ratings_calculate_mine_ride(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4281,7 +4285,7 @@ void ride_ratings_calculate_mine_ride(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 29721, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 21472); + ride_ratings_apply_proximity(state, &ratings, 21472); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x10E0000, 2, 2, 2); @@ -4291,13 +4295,13 @@ void ride_ratings_calculate_mine_ride(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride) +void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4317,7 +4321,7 @@ void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 20130); + ride_ratings_apply_proximity(state, &ratings, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -4337,13 +4341,13 @@ void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_hybrid_coaster(Ride* ride) +void ride_ratings_calculate_hybrid_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4363,7 +4367,7 @@ void ride_ratings_calculate_hybrid_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 34179, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 34952, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -4383,12 +4387,12 @@ void ride_ratings_calculate_hybrid_coaster(Ride* ride) ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } -void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride) +void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; @@ -4408,7 +4412,7 @@ void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride) ride_ratings_apply_turns(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(&ratings, 22367); + ride_ratings_apply_proximity(state, &ratings, 22367); ride_ratings_apply_scenery(&ratings, ride, 6693); if (ride->inversions == 0) @@ -4428,7 +4432,7 @@ void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride) ride->ratings = ratings; - ride->upkeep_cost = ride_compute_upkeep(ride); + ride->upkeep_cost = ride_compute_upkeep(state, ride); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index 5496137151..449c42daa8 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -39,7 +39,7 @@ enum RIDE_RATING_STATION_FLAG_NO_ENTRANCE = 1 << 0 }; -struct RideRatingCalculationData +struct RideRatingUpdateState { CoordsXYZ Proximity; CoordsXYZ ProximityStart; @@ -54,92 +54,92 @@ struct RideRatingCalculationData uint16_t StationFlags; }; -extern RideRatingCalculationData gRideRatingsCalcData; +extern RideRatingUpdateState gRideRatingUpdateState; void ride_ratings_update_ride(const Ride& ride); void ride_ratings_update_all(); -using ride_ratings_calculation = void (*)(Ride* ride); +using ride_ratings_calculation = void (*)(Ride* ride, RideRatingUpdateState& state); ride_ratings_calculation ride_ratings_get_calculate_func(uint8_t rideType); -void ride_ratings_calculate_spiral_roller_coaster(Ride* ride); -void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride); -void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride); -void ride_ratings_calculate_inverted_roller_coaster(Ride* ride); -void ride_ratings_calculate_junior_roller_coaster(Ride* ride); -void ride_ratings_calculate_miniature_railway(Ride* ride); -void ride_ratings_calculate_monorail(Ride* ride); -void ride_ratings_calculate_mini_suspended_coaster(Ride* ride); -void ride_ratings_calculate_boat_hire(Ride* ride); -void ride_ratings_calculate_wooden_wild_mouse(Ride* ride); -void ride_ratings_calculate_steeplechase(Ride* ride); -void ride_ratings_calculate_car_ride(Ride* ride); -void ride_ratings_calculate_launched_freefall(Ride* ride); -void ride_ratings_calculate_bobsleigh_coaster(Ride* ride); -void ride_ratings_calculate_observation_tower(Ride* ride); -void ride_ratings_calculate_looping_roller_coaster(Ride* ride); -void ride_ratings_calculate_dinghy_slide(Ride* ride); -void ride_ratings_calculate_mine_train_coaster(Ride* ride); -void ride_ratings_calculate_chairlift(Ride* ride); -void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride); -void ride_ratings_calculate_maze(Ride* ride); -void ride_ratings_calculate_spiral_slide(Ride* ride); -void ride_ratings_calculate_go_karts(Ride* ride); -void ride_ratings_calculate_log_flume(Ride* ride); -void ride_ratings_calculate_river_rapids(Ride* ride); -void ride_ratings_calculate_dodgems(Ride* ride); -void ride_ratings_calculate_swinging_ship(Ride* ride); -void ride_ratings_calculate_inverter_ship(Ride* ride); -void ride_ratings_calculate_food_stall(Ride* ride); -void ride_ratings_calculate_shop(Ride* ride); -void ride_ratings_calculate_merry_go_round(Ride* ride); -void ride_ratings_calculate_information_kiosk(Ride* ride); -void ride_ratings_calculate_toilets(Ride* ride); -void ride_ratings_calculate_ferris_wheel(Ride* ride); -void ride_ratings_calculate_motion_simulator(Ride* ride); -void ride_ratings_calculate_3d_cinema(Ride* ride); -void ride_ratings_calculate_top_spin(Ride* ride); -void ride_ratings_calculate_space_rings(Ride* ride); -void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride); -void ride_ratings_calculate_lift(Ride* ride); -void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride); -void ride_ratings_calculate_cash_machine(Ride* ride); -void ride_ratings_calculate_twist(Ride* ride); -void ride_ratings_calculate_haunted_house(Ride* ride); -void ride_ratings_calculate_first_aid(Ride* ride); -void ride_ratings_calculate_circus(Ride* ride); -void ride_ratings_calculate_ghost_train(Ride* ride); -void ride_ratings_calculate_twister_roller_coaster(Ride* ride); -void ride_ratings_calculate_wooden_roller_coaster(Ride* ride); -void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride); -void ride_ratings_calculate_wild_mouse(Ride* ride); -void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride); -void ride_ratings_calculate_flying_roller_coaster(Ride* ride); -void ride_ratings_calculate_virginia_reel(Ride* ride); -void ride_ratings_calculate_splash_boats(Ride* ride); -void ride_ratings_calculate_mini_helicopters(Ride* ride); -void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride); -void ride_ratings_calculate_suspended_monorail(Ride* ride); -void ride_ratings_calculate_reverser_roller_coaster(Ride* ride); -void ride_ratings_calculate_heartline_twister_coaster(Ride* ride); -void ride_ratings_calculate_mini_golf(Ride* ride); -void ride_ratings_calculate_giga_coaster(Ride* ride); -void ride_ratings_calculate_roto_drop(Ride* ride); -void ride_ratings_calculate_flying_saucers(Ride* ride); -void ride_ratings_calculate_crooked_house(Ride* ride); -void ride_ratings_calculate_monorail_cycles(Ride* ride); -void ride_ratings_calculate_compact_inverted_coaster(Ride* ride); -void ride_ratings_calculate_water_coaster(Ride* ride); -void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride); -void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride); -void ride_ratings_calculate_magic_carpet(Ride* ride); -void ride_ratings_calculate_submarine_ride(Ride* ride); -void ride_ratings_calculate_river_rafts(Ride* ride); -void ride_ratings_calculate_enterprise(Ride* ride); -void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride); -void ride_ratings_calculate_mini_roller_coaster(Ride* ride); -void ride_ratings_calculate_mine_ride(Ride* ride); -void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride); -void ride_ratings_calculate_hybrid_coaster(Ride* ride); -void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride); -void ride_ratings_calculate_drink_stall(Ride* ride); +void ride_ratings_calculate_spiral_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_stand_up_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_suspended_swinging_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverted_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_junior_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_miniature_railway(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_monorail(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_suspended_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_boat_hire(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_wooden_wild_mouse(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_steeplechase(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_car_ride(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_launched_freefall(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_bobsleigh_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_observation_tower(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_looping_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_dinghy_slide(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mine_train_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_chairlift(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_corkscrew_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_maze(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_spiral_slide(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_go_karts(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_log_flume(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_river_rapids(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_dodgems(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_swinging_ship(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverter_ship(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_food_stall(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_shop(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_merry_go_round(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_information_kiosk(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_toilets(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_ferris_wheel(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_motion_simulator(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_3d_cinema(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_top_spin(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_space_rings(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_reverse_freefall_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_lift(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_vertical_drop_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_cash_machine(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_twist(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_haunted_house(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_first_aid(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_circus(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_ghost_train(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_twister_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_wooden_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_side_friction_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_wild_mouse(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_multi_dimension_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_flying_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_virginia_reel(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_splash_boats(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_helicopters(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_lay_down_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_suspended_monorail(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_reverser_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_heartline_twister_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_golf(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_giga_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_roto_drop(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_flying_saucers(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_crooked_house(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_monorail_cycles(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_compact_inverted_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_water_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_air_powered_vertical_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverted_hairpin_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_magic_carpet(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_submarine_ride(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_river_rafts(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_enterprise(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mini_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_mine_ride(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_hybrid_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_single_rail_roller_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_drink_stall(Ride* ride, RideRatingUpdateState& state);