From ff85b6bcc3de7b05935f82182b8b4b31c006e870 Mon Sep 17 00:00:00 2001 From: ZeeMajora <42477864+ZeeMajora@users.noreply.github.com> Date: Tue, 27 Sep 2022 12:47:16 -0400 Subject: [PATCH 1/2] More accurate rating calculations for the classic coasters --- src/openrct2/ride/RideRatings.cpp | 78 +++++++++++++++++++ src/openrct2/ride/RideRatings.h | 2 + .../coaster/meta/ClassicMiniRollerCoaster.h | 2 +- .../coaster/meta/ClassicWoodenRollerCoaster.h | 4 +- 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 2848664877..a3d12a07f5 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -4349,6 +4349,44 @@ void ride_ratings_calculate_lim_launched_roller_coaster(Ride* ride, RideRatingUp ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } +void ride_ratings_calculate_classic_mini_roller_coaster(Ride* ride, RideRatingUpdateState& state) +{ + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) + return; + + ride->unreliability_factor = 13; + set_unreliability_factor(ride); + + RatingTuple ratings; + ride_ratings_set(&ratings, RIDE_RATING(2, 40), RIDE_RATING(2, 80), RIDE_RATING(1, 90)); + ride_ratings_apply_length(&ratings, ride, 6000, 764); + ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); + ride_ratings_apply_train_length(&ratings, ride, 187245); + ride_ratings_apply_max_speed(&ratings, ride, 44281, 88562, 35424); + ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); + ride_ratings_apply_duration(&ratings, ride, 150, 26214); + ride_ratings_apply_gforces(&ratings, ride, 20480, 23831, 49648); + 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(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); + ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); + + ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 20480, 23831, 49648); + ride_ratings_apply_intensity_penalty(&ratings); + ride_ratings_apply_adjustments(ride, &ratings); + + ride->ratings = ratings; + + 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, RideRatingUpdateState& state) { if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) @@ -4474,6 +4512,46 @@ void ride_ratings_calculate_alpine_coaster(Ride* ride, RideRatingUpdateState& st ride->sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; } +void ride_ratings_calculate_classic_wooden_roller_coaster(Ride* ride, RideRatingUpdateState& state) +{ + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) + return; + + ride->unreliability_factor = 19; + set_unreliability_factor(ride); + + RatingTuple ratings; + ride_ratings_set(&ratings, RIDE_RATING(2, 80), RIDE_RATING(2, 60), RIDE_RATING(2, 00)); + ride_ratings_apply_length(&ratings, ride, 6000, 873); + ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); + ride_ratings_apply_train_length(&ratings, ride, 187245); + ride_ratings_apply_max_speed(&ratings, ride, 44281, 88562, 35424); + ride_ratings_apply_average_speed(&ratings, ride, 364088, 655360); + ride_ratings_apply_duration(&ratings, ride, 150, 26214); + ride_ratings_apply_gforces(&ratings, ride, 40960, 34555, 49648); + 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(state, &ratings, 22367); + ride_ratings_apply_scenery(&ratings, ride, 11155); + ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 1, 2); + ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 1, 2); + ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 1, 2); + ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 1, 2); + ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 1, 2); + + ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 40960, 34555, 49648); + ride_ratings_apply_intensity_penalty(&ratings); + ride_ratings_apply_adjustments(ride, &ratings); + + ride->ratings = ratings; + + 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; +} + #pragma endregion #pragma region Ride rating calculation function table diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index e9507ce792..e3b7a7bb64 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -140,9 +140,11 @@ void ride_ratings_calculate_inverted_impulse_coaster(Ride* ride, RideRatingUpdat 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_classic_mini_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_alpine_coaster(Ride* ride, RideRatingUpdateState& state); +void ride_ratings_calculate_classic_wooden_roller_coaster(Ride* ride, RideRatingUpdateState& state); void ride_ratings_calculate_drink_stall(Ride* ride, RideRatingUpdateState& state); // Special Track Element Adjustment functions for RTDs diff --git a/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h b/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h index 8669ed19b8..0f68a30985 100644 --- a/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h @@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor ClassicMiniRollerCoasterRTD = SET_FIELD(Heights, { 15, 24, 4, 7, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_classic_mini_roller_coaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 8, 3, 5 }), SET_FIELD(BuildCosts, { 22.50_GBP, 2.00_GBP, 40, }), diff --git a/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h b/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h index bbefe7ad79..12da063942 100644 --- a/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h @@ -37,8 +37,8 @@ constexpr const RideTypeDescriptor ClassicWoodenRollerCoasterRTD = SET_FIELD(Heights, { 41, 24, 8, 11, }), SET_FIELD(MaxMass, 19), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 5, 7 }), - SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wooden_roller_coaster), - SET_FIELD(RatingsMultipliers, { 52, 33, 8 }), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_classic_wooden_roller_coaster), + SET_FIELD(RatingsMultipliers, { 52, 33, 4 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, {37.50_GBP, 3.50_GBP, 50, }), SET_FIELD(DefaultPrices, { 20, 20 }), From 234c125a733d58bf42cf38054a0ebe166a177469 Mon Sep 17 00:00:00 2001 From: ZeeMajora <42477864+ZeeMajora@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:45:18 -0400 Subject: [PATCH 2/2] Attempt to fix ratings test --- test/tests/testdata/ratings/bpb.sv6.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests/testdata/ratings/bpb.sv6.txt b/test/tests/testdata/ratings/bpb.sv6.txt index e79b29c231..c3d1da1555 100644 --- a/test/tests/testdata/ratings/bpb.sv6.txt +++ b/test/tests/testdata/ratings/bpb.sv6.txt @@ -16,7 +16,7 @@ RIDE_TYPE_WOODEN_ROLLER_COASTER: (634, 648, 377) RIDE_TYPE_WOODEN_ROLLER_COASTER: (71, 68, 41) RIDE_TYPE_STEEPLECHASE: (609, 509, 351) RIDE_TYPE_STEEPLECHASE: (587, 492, 338) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (489, 460, 331) +RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (244, 245, 170) RIDE_TYPE_SHOP: (-1, 0, 0) RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) RIDE_TYPE_FOOD_STALL: (-1, 0, 0)