From fe219281ec6b66e3a47c67125c939bc1f01d1274 Mon Sep 17 00:00:00 2001 From: kyphii <8711258+kyphii@users.noreply.github.com> Date: Sat, 29 Apr 2023 16:03:25 -0400 Subject: [PATCH] Refactor Ride Ratings --- src/openrct2/ride/RideData.h | 103 +- src/openrct2/ride/RideRatings.cpp | 3461 +++-------------- src/openrct2/ride/RideRatings.h | 88 - .../coaster/meta/AirPoweredVerticalCoaster.h | 20 +- .../ride/coaster/meta/AlpineCoaster.h | 24 +- .../ride/coaster/meta/BobsleighCoaster.h | 27 +- .../coaster/meta/ClassicMiniRollerCoaster.h | 27 +- .../coaster/meta/ClassicWoodenRollerCoaster.h | 29 +- .../coaster/meta/CompactInvertedCoaster.h | 27 +- .../coaster/meta/CorkscrewRollerCoaster.h | 28 +- .../ride/coaster/meta/FlyingRollerCoaster.h | 56 +- src/openrct2/ride/coaster/meta/GigaCoaster.h | 28 +- .../coaster/meta/HeartlineTwisterCoaster.h | 26 +- .../ride/coaster/meta/HybridCoaster.h | 28 +- src/openrct2/ride/coaster/meta/HyperTwister.h | 28 +- src/openrct2/ride/coaster/meta/Hypercoaster.h | 28 +- .../coaster/meta/InvertedHairpinCoaster.h | 30 +- .../coaster/meta/InvertedImpulseCoaster.h | 26 +- .../ride/coaster/meta/InvertedRollerCoaster.h | 27 +- .../ride/coaster/meta/JuniorRollerCoaster.h | 27 +- .../coaster/meta/LIMLaunchedRollerCoaster.h | 28 +- .../ride/coaster/meta/LayDownRollerCoaster.h | 56 +- .../ride/coaster/meta/LoopingRollerCoaster.h | 28 +- src/openrct2/ride/coaster/meta/MineRide.h | 25 +- .../ride/coaster/meta/MineTrainCoaster.h | 29 +- .../ride/coaster/meta/MiniRollerCoaster.h | 28 +- .../ride/coaster/meta/MiniSuspendedCoaster.h | 28 +- .../meta/MultiDimensionRollerCoaster.h | 56 +- .../coaster/meta/ReverseFreefallCoaster.h | 19 +- .../ride/coaster/meta/ReverserRollerCoaster.h | 28 +- .../coaster/meta/SideFrictionRollerCoaster.h | 28 +- .../coaster/meta/SingleRailRollerCoaster.h | 28 +- .../ride/coaster/meta/SpinningWildMouse.h | 29 +- .../ride/coaster/meta/SpiralRollerCoaster.h | 28 +- .../ride/coaster/meta/StandUpRollerCoaster.h | 27 +- .../ride/coaster/meta/SteelWildMouse.h | 29 +- src/openrct2/ride/coaster/meta/Steeplechase.h | 29 +- .../coaster/meta/SuspendedSwingingCoaster.h | 29 +- .../ride/coaster/meta/TwisterRollerCoaster.h | 28 +- .../ride/coaster/meta/VerticalDropCoaster.h | 27 +- src/openrct2/ride/coaster/meta/VirginiaReel.h | 26 +- src/openrct2/ride/coaster/meta/WaterCoaster.h | 28 +- .../ride/coaster/meta/WoodenRollerCoaster.h | 29 +- .../ride/coaster/meta/WoodenWildMouse.h | 30 +- src/openrct2/ride/gentle/meta/CarRide.h | 23 +- src/openrct2/ride/gentle/meta/Circus.h | 10 +- src/openrct2/ride/gentle/meta/CrookedHouse.h | 10 +- src/openrct2/ride/gentle/meta/Dodgems.h | 15 +- src/openrct2/ride/gentle/meta/FerrisWheel.h | 13 +- src/openrct2/ride/gentle/meta/FlyingSaucers.h | 15 +- src/openrct2/ride/gentle/meta/GhostTrain.h | 22 +- src/openrct2/ride/gentle/meta/HauntedHouse.h | 10 +- src/openrct2/ride/gentle/meta/Maze.h | 13 +- src/openrct2/ride/gentle/meta/MerryGoRound.h | 13 +- src/openrct2/ride/gentle/meta/MiniGolf.h | 18 +- .../ride/gentle/meta/MiniHelicopters.h | 23 +- .../ride/gentle/meta/MonorailCycles.h | 23 +- src/openrct2/ride/gentle/meta/MonsterTrucks.h | 23 +- .../ride/gentle/meta/ObservationTower.h | 15 +- src/openrct2/ride/gentle/meta/SpaceRings.h | 12 +- src/openrct2/ride/gentle/meta/SpiralSlide.h | 13 +- src/openrct2/ride/shops/meta/CashMachine.h | 10 +- src/openrct2/ride/shops/meta/DrinkStall.h | 10 +- src/openrct2/ride/shops/meta/FirstAid.h | 10 +- src/openrct2/ride/shops/meta/FoodStall.h | 10 +- .../ride/shops/meta/InformationKiosk.h | 10 +- src/openrct2/ride/shops/meta/Shop.h | 10 +- src/openrct2/ride/shops/meta/Toilets.h | 10 +- src/openrct2/ride/thrill/meta/3DCinema.h | 12 +- src/openrct2/ride/thrill/meta/Enterprise.h | 13 +- src/openrct2/ride/thrill/meta/GoKarts.h | 19 +- .../ride/thrill/meta/LaunchedFreefall.h | 15 +- src/openrct2/ride/thrill/meta/MagicCarpet.h | 13 +- .../ride/thrill/meta/MotionSimulator.h | 12 +- src/openrct2/ride/thrill/meta/RotoDrop.h | 14 +- .../ride/thrill/meta/SwingingInverterShip.h | 13 +- src/openrct2/ride/thrill/meta/SwingingShip.h | 13 +- src/openrct2/ride/thrill/meta/TopSpin.h | 13 +- src/openrct2/ride/thrill/meta/Twist.h | 13 +- src/openrct2/ride/transport/meta/Chairlift.h | 23 +- src/openrct2/ride/transport/meta/Lift.h | 15 +- .../ride/transport/meta/MiniatureRailway.h | 21 +- src/openrct2/ride/transport/meta/Monorail.h | 21 +- .../ride/transport/meta/SuspendedMonorail.h | 21 +- src/openrct2/ride/water/meta/BoatHire.h | 14 +- src/openrct2/ride/water/meta/DinghySlide.h | 27 +- src/openrct2/ride/water/meta/LogFlume.h | 21 +- src/openrct2/ride/water/meta/RiverRafts.h | 19 +- src/openrct2/ride/water/meta/RiverRapids.h | 22 +- src/openrct2/ride/water/meta/SplashBoats.h | 21 +- src/openrct2/ride/water/meta/SubmarineRide.h | 14 +- 91 files changed, 2471 insertions(+), 3117 deletions(-) diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index b457c3b9e5ce..90dbc549a5f9 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -38,8 +38,6 @@ enum class ResearchCategory : uint8_t; -using ride_ratings_calculation = void (*)(Ride& ride, RideRatingUpdateState& state); - constexpr const uint8_t DefaultFoodStallHeight = 8 * COORDS_Z_STEP; constexpr const uint8_t DefaultDrinksStallHeight = 8 * COORDS_Z_STEP; constexpr const uint8_t DefaultShopHeight = 8 * COORDS_Z_STEP; @@ -96,6 +94,71 @@ enum class TrackDesignCreateMode : uint_fast8_t Maze }; +enum class RatingsCalculationType : uint8_t +{ + Normal, + FlatRide, + Stall, +}; + +enum class RatingsModifierType : uint8_t +{ + NoModifier, + // General Rating Bonuses + BonusLength, + BonusSynchronisation, + BonusTrainLength, + BonusMaxSpeed, + BonusAverageSpeed, + BonusDuration, + BonusGForces, + BonusTurns, + BonusDrops, + BonusSheltered, + BonusProximity, + BonusScenery, + BonusRotations, + BonusOperationOption, + // Ride-specific Rating Bonuses + BonusGoKartRace, + BonusTowerRide, + BonusRotoDrop, + BonusMazeSize, + BonusBoatHireNoCircuit, + BonusSlideUnlimitedRides, + BonusMotionSimulatorMode, + Bonus3DCinemaMode, + BonusTopSpinMode, + // Number of reversals BONUS for reverser coaster + BonusReversals, + // Number of hole BONUS for mini golf + BonusHoles, + // Number of cars bonus for dodgems/flying saucers + BonusNumTrains, + // Bonus for launched freefall in downward launch mode + BonusDownwardLaunch, + // Bonus with further mode-dependent logic for LF + BonusLaunchedFreefallSpecial, + // General Rating Requirements + RequirementLength, + RequirementDropHeight, + RequirementNumDrops, + RequirementMaxSpeed, + RequirementNegativeGs, + RequirementLateralGs, + RequirementInversions, + RequirementUnsheltered, + // Number of reversals REQUIREMENT for reverser coaster + RequirementReversals, + // Number of hole REQUIREMENT for mini golf + RequirementHoles, + // 2 Station requirement for Chairlift + RequirementStations, + // Water section requirement for Water Coaster + RequirementSplashdown, + PenaltyLateralGs, +}; + struct RideNameConvention { RideComponentType vehicle; @@ -143,6 +206,26 @@ struct RideOperatingSettings uint8_t OperatingSettingMultiplier = 1; // Used for the Ride window, cosmetic only. }; +struct RatingsModifier +{ + RatingsModifierType Type; + int32_t Threshold; + int32_t Excitement; + int32_t Intensity; + int32_t Nausea; +}; + +struct RideRatingsDescriptor +{ + RatingsCalculationType Type; + RatingTuple BaseRatings; + uint8_t Unreliability; + // Used for rides with a set sheltered 8ths value (-1 = normal calculation) + int8_t RideShelter; + bool RelaxRequirementsIfInversions; + RatingsModifier Modifiers[32]; +}; + struct UpkeepCostsDescriptor { /** @@ -211,8 +294,6 @@ struct RideTypeDescriptor uint8_t MaxMass; /** rct2: 0x0097D7C8, 0x0097D7C9, 0x0097D7CA */ RideLiftData LiftData; - // rct2: 0x0097E050 - ride_ratings_calculation RatingsCalculationFunction; // rct2: 0x0097CD1E RatingTuple RatingsMultipliers; UpkeepCostsDescriptor UpkeepCosts; @@ -231,6 +312,8 @@ struct RideTypeDescriptor // json name lookup std::string_view Name; + RideRatingsDescriptor RatingsData; + UpdateRotatingFunction UpdateRotating = UpdateRotatingDefault; LightFXAddLightsMagicVehicleFunction LightFXAddLightsMagicVehicle = nullptr; @@ -440,7 +523,6 @@ constexpr const RideTypeDescriptor DummyRTD = SET_FIELD(Heights, { 12, 64, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, nullptr), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 0.00_GBP, 0.00_GBP, 1 }), @@ -452,6 +534,17 @@ constexpr const RideTypeDescriptor DummyRTD = SET_FIELD(ColourPreview, { static_cast(SPR_NONE), static_cast(SPR_NONE) }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "invalid"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 00), RIDE_RATING(1, 00), RIDE_RATING(1, 00) }, + 1, + -1, + false, + { + { RatingsModifierType::NoModifier, 0, 0, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 1155cc0e649b..faf2eeed4bc9 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -95,7 +95,61 @@ static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state); static void RideRatingsCalculate(RideRatingUpdateState& state, Ride& ride); static void RideRatingsCalculateValue(Ride& ride); 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); +static void RideRatingsAdd(RatingTuple& ratings, int32_t excitement, int32_t intensity, int32_t nausea); + +static ShelteredEights GetNumOfShelteredEighths(const Ride& ride); +static money64 RideComputeUpkeep(RideRatingUpdateState& state, const Ride& ride); +static void SetUnreliabilityFactor(Ride& ride); + +static void RideRatingsApplyAdjustments(const Ride& ride, RatingTuple& ratings); +static void RideRatingsApplyIntensityPenalty(RatingTuple& ratings); + +static void RideRatingsApplyBonusLength(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusSynchronisation(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusTrainLength(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusMaxSpeed(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusAverageSpeed(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusDuration(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusGForces(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusTurns(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusDrops(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusSheltered(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusRotations(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusOperationOption(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusGoKartRace(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusTowerRide(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusRotoDrop(RatingTuple& ratings, const Ride& ride); +static void RideRatingsApplyBonusMazeSize(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusBoatHireNoCircuit(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusSlideUnlimitedRides(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusMotionSimulatorMode(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonus3DCinemaMode(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusTopSpinMode(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusReversals( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier); +static void RideRatingsApplyBonusHoles(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusNumTrains(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusDownwardLaunch(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyBonusLaunchedFreefallSpecial( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier); +static void RideRatingsApplyBonusProximity( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier); +static void RideRatingsApplyBonusScenery(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementLength(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementDropHeight(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementMaxSpeed(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementNumDrops(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementNegativeGs(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementLateralGs(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementInversions(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementUnsheltered( + RatingTuple& ratings, const Ride& ride, uint8_t shelteredEighths, RatingsModifier modifier); +static void RideRatingsApplyRequirementReversals( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier); +static void RideRatingsApplyRequirementHoles(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementStations(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyRequirementSplashdown(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); +static void RideRatingsApplyPenaltyLateralGs(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier); RideRatingUpdateStates& RideRatingGetUpdateStates() { @@ -816,11 +870,181 @@ static void ride_ratings_score_close_proximity(RideRatingUpdateState& state, Til static void RideRatingsCalculate(RideRatingUpdateState& state, Ride& ride) { - auto calcFunc = RideRatingsGetCalculateFunc(ride.type); - if (calcFunc != nullptr) + const auto& rrd = ride.GetRideTypeDescriptor().RatingsData; + + switch (rrd.Type) + { + case RatingsCalculationType::Normal: + if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) + return; + break; + case RatingsCalculationType::FlatRide: + ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; + ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; + break; + case RatingsCalculationType::Stall: + ride.upkeep_cost = RideComputeUpkeep(state, ride); + ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; + // Exit ratings + return; + } + + ride.unreliability_factor = rrd.Unreliability; + SetUnreliabilityFactor(ride); + + const auto shelteredEighths = GetNumOfShelteredEighths(ride); + ride.sheltered_eighths = (rrd.RideShelter == -1) ? shelteredEighths.TotalShelteredEighths : rrd.RideShelter; + + RatingTuple ratings = rrd.BaseRatings; + // Apply Modifiers + for (const auto& modifier : rrd.Modifiers) { - calcFunc(ride, state); + switch (modifier.Type) + { + case RatingsModifierType::BonusLength: + RideRatingsApplyBonusLength(ratings, ride, modifier); + break; + case RatingsModifierType::BonusSynchronisation: + RideRatingsApplyBonusSynchronisation(ratings, ride, modifier); + break; + case RatingsModifierType::BonusTrainLength: + RideRatingsApplyBonusTrainLength(ratings, ride, modifier); + break; + case RatingsModifierType::BonusMaxSpeed: + RideRatingsApplyBonusMaxSpeed(ratings, ride, modifier); + break; + case RatingsModifierType::BonusAverageSpeed: + RideRatingsApplyBonusAverageSpeed(ratings, ride, modifier); + break; + case RatingsModifierType::BonusDuration: + RideRatingsApplyBonusDuration(ratings, ride, modifier); + break; + case RatingsModifierType::BonusGForces: + RideRatingsApplyBonusGForces(ratings, ride, modifier); + break; + case RatingsModifierType::BonusTurns: + RideRatingsApplyBonusTurns(ratings, ride, modifier); + break; + case RatingsModifierType::BonusDrops: + RideRatingsApplyBonusDrops(ratings, ride, modifier); + break; + case RatingsModifierType::BonusSheltered: + RideRatingsApplyBonusSheltered(ratings, ride, modifier); + break; + case RatingsModifierType::BonusProximity: + RideRatingsApplyBonusProximity(ratings, ride, state, modifier); + break; + case RatingsModifierType::BonusScenery: + RideRatingsApplyBonusScenery(ratings, ride, modifier); + break; + case RatingsModifierType::BonusRotations: + RideRatingsApplyBonusRotations(ratings, ride, modifier); + break; + case RatingsModifierType::BonusOperationOption: + RideRatingsApplyBonusOperationOption(ratings, ride, modifier); + break; + case RatingsModifierType::BonusGoKartRace: + RideRatingsApplyBonusGoKartRace(ratings, ride, modifier); + break; + case RatingsModifierType::BonusTowerRide: + RideRatingsApplyBonusTowerRide(ratings, ride, modifier); + break; + case RatingsModifierType::BonusRotoDrop: + RideRatingsApplyBonusRotoDrop(ratings, ride); + break; + case RatingsModifierType::BonusMazeSize: + RideRatingsApplyBonusMazeSize(ratings, ride, modifier); + break; + case RatingsModifierType::BonusBoatHireNoCircuit: + RideRatingsApplyBonusBoatHireNoCircuit(ratings, ride, modifier); + break; + case RatingsModifierType::BonusSlideUnlimitedRides: + RideRatingsApplyBonusSlideUnlimitedRides(ratings, ride, modifier); + break; + case RatingsModifierType::BonusMotionSimulatorMode: + RideRatingsApplyBonusMotionSimulatorMode(ratings, ride, modifier); + break; + case RatingsModifierType::Bonus3DCinemaMode: + RideRatingsApplyBonus3DCinemaMode(ratings, ride, modifier); + break; + case RatingsModifierType::BonusTopSpinMode: + RideRatingsApplyBonusTopSpinMode(ratings, ride, modifier); + break; + case RatingsModifierType::BonusReversals: + RideRatingsApplyBonusReversals(ratings, ride, state, modifier); + break; + case RatingsModifierType::BonusHoles: + RideRatingsApplyBonusHoles(ratings, ride, modifier); + break; + case RatingsModifierType::BonusNumTrains: + RideRatingsApplyBonusNumTrains(ratings, ride, modifier); + break; + case RatingsModifierType::BonusDownwardLaunch: + RideRatingsApplyBonusDownwardLaunch(ratings, ride, modifier); + break; + case RatingsModifierType::BonusLaunchedFreefallSpecial: + RideRatingsApplyBonusLaunchedFreefallSpecial(ratings, ride, state, modifier); + break; + case RatingsModifierType::RequirementLength: + RideRatingsApplyRequirementLength(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementMaxSpeed: + RideRatingsApplyRequirementMaxSpeed(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementLateralGs: + RideRatingsApplyRequirementLateralGs(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementInversions: + RideRatingsApplyRequirementInversions(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementUnsheltered: + RideRatingsApplyRequirementUnsheltered(ratings, ride, shelteredEighths.TrackShelteredEighths, modifier); + break; + case RatingsModifierType::RequirementReversals: + RideRatingsApplyRequirementReversals(ratings, ride, state, modifier); + break; + case RatingsModifierType::RequirementHoles: + RideRatingsApplyRequirementHoles(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementStations: + RideRatingsApplyRequirementStations(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementSplashdown: + RideRatingsApplyRequirementSplashdown(ratings, ride, modifier); + break; + case RatingsModifierType::PenaltyLateralGs: + RideRatingsApplyPenaltyLateralGs(ratings, ride, modifier); + break; + default: + break; + } + + // Requirements that may be ignored if the ride has inversions + if (ride.inversions == 0 || !rrd.RelaxRequirementsIfInversions) + { + switch (modifier.Type) + { + case RatingsModifierType::RequirementDropHeight: + RideRatingsApplyRequirementDropHeight(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementNumDrops: + RideRatingsApplyRequirementNumDrops(ratings, ride, modifier); + break; + case RatingsModifierType::RequirementNegativeGs: + RideRatingsApplyRequirementNegativeGs(ratings, ride, modifier); + break; + default: + break; + } + } } + // Universl ratings adjustments + RideRatingsApplyIntensityPenalty(ratings); + RideRatingsApplyAdjustments(ride, ratings); + ride.ratings = ratings; + + ride.upkeep_cost = RideComputeUpkeep(state, ride); + ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; #ifdef ORIGINAL_RATINGS if (ride.ratings.excitement != -1) @@ -966,7 +1190,7 @@ static void RideRatingsCalculateValue(Ride& ride) * inputs * - edi: ride ptr */ -static money64 ride_compute_upkeep(RideRatingUpdateState& state, const Ride& ride) +static money64 RideComputeUpkeep(RideRatingUpdateState& state, const Ride& ride) { // data stored at 0x0057E3A8, incrementing 18 bytes at a time auto upkeep = ride.GetRideTypeDescriptor().UpkeepCosts.BaseCost; @@ -1046,7 +1270,7 @@ static money64 ride_compute_upkeep(RideRatingUpdateState& state, const Ride& rid * - bp: nausea * - edi: ride ptr */ -static void ride_ratings_apply_adjustments(const Ride& ride, RatingTuple* ratings) +static void RideRatingsApplyAdjustments(const Ride& ride, RatingTuple& ratings) { const auto* rideEntry = GetRideEntryByIndex(ride.subtype); @@ -1056,10 +1280,10 @@ static void ride_ratings_apply_adjustments(const Ride& ride, RatingTuple* rating } // Apply ride entry multipliers - ride_ratings_add( - ratings, ((static_cast(ratings->Excitement) * rideEntry->excitement_multiplier) >> 7), - ((static_cast(ratings->Intensity) * rideEntry->intensity_multiplier) >> 7), - ((static_cast(ratings->Nausea) * rideEntry->nausea_multiplier) >> 7)); + RideRatingsAdd( + ratings, ((static_cast(ratings.Excitement) * rideEntry->excitement_multiplier) >> 7), + ((static_cast(ratings.Intensity) * rideEntry->intensity_multiplier) >> 7), + ((static_cast(ratings.Nausea) * rideEntry->nausea_multiplier) >> 7)); // Apply total air time #ifdef ORIGINAL_RATINGS @@ -1071,14 +1295,14 @@ static void ride_ratings_apply_adjustments(const Ride& ride, RatingTuple* rating if (totalAirTime >= 96) { totalAirTime -= 96; - ratings->excitement -= totalAirTime / 8; - ratings->nausea += totalAirTime / 16; + ratings.excitement -= totalAirTime / 8; + ratings.nausea += totalAirTime / 16; } } else { - ratings->excitement += totalAirTime / 8; - ratings->nausea += totalAirTime / 16; + ratings.excitement += totalAirTime / 8; + ratings.nausea += totalAirTime / 16; } } #else @@ -1096,7 +1320,7 @@ static void ride_ratings_apply_adjustments(const Ride& ride, RatingTuple* rating } int32_t nauseaModifier = ride.total_air_time / 16; - ride_ratings_add(ratings, excitementModifier, 0, nauseaModifier); + RideRatingsAdd(ratings, excitementModifier, 0, nauseaModifier); } #endif } @@ -1105,26 +1329,39 @@ static void ride_ratings_apply_adjustments(const Ride& ride, RatingTuple* rating * Lowers excitement, the higher the intensity. * rct2: 0x0065E7A3 */ -static void ride_ratings_apply_intensity_penalty(RatingTuple* ratings) +static void RideRatingsApplyIntensityPenalty(RatingTuple& ratings) { static constexpr ride_rating intensityBounds[] = { 1000, 1100, 1200, 1320, 1450 }; - ride_rating excitement = ratings->Excitement; + ride_rating excitement = ratings.Excitement; for (auto intensityBound : intensityBounds) { - if (ratings->Intensity >= intensityBound) + if (ratings.Intensity >= intensityBound) { excitement -= excitement / 4; } } - ratings->Excitement = excitement; + ratings.Excitement = excitement; } /** * * rct2: 0x00655FD6 */ -static void set_unreliability_factor(Ride& ride) +static void SetUnreliabilityFactor(Ride& ride) { + // Special unreliability for a few ride types + if (ride.type == RIDE_TYPE_COMPACT_INVERTED_COASTER && ride.mode == RideMode::ReverseInclineLaunchedShuttle) + { + ride.unreliability_factor += 10; + } + else if (ride.type == RIDE_TYPE_LOOPING_ROLLER_COASTER && ride.IsPoweredLaunched()) + { + ride.unreliability_factor += 5; + } + else if (ride.type == RIDE_TYPE_CHAIRLIFT) + { + ride.unreliability_factor += (ride.speed * 2); + } // The bigger the difference in lift speed and minimum the higher the unreliability uint8_t minLiftSpeed = ride.GetRideTypeDescriptor().LiftData.minimum_speed; ride.unreliability_factor += (ride.lift_hill_speed - minLiftSpeed) * 2; @@ -1190,7 +1427,7 @@ static uint32_t ride_ratings_get_proximity_score(RideRatingUpdateState& state) * Calculates how much of the track is sheltered in eighths. * rct2: 0x0065E72D */ -static ShelteredEights get_num_of_sheltered_eighths(const Ride& ride) +static ShelteredEights GetNumOfShelteredEighths(const Ride& ride) { int32_t totalLength = ride.GetTotalLength(); int32_t shelteredLength = ride.sheltered_length; @@ -1510,8 +1747,8 @@ static RatingTuple ride_ratings_get_drop_ratings(const Ride& ride) result.Nausea += (drops * 655360) >> 16; // Apply highest drop factor - ride_ratings_add( - &result, ((ride.highest_drop_height * 2) * 16000) >> 16, ((ride.highest_drop_height * 2) * 32000) >> 16, + RideRatingsAdd( + result, ((ride.highest_drop_height * 2) * 16000) >> 16, ((ride.highest_drop_height * 2) * 32000) >> 16, ((ride.highest_drop_height * 2) * 10240) >> 16); return result; @@ -1577,3084 +1814,442 @@ static int32_t ride_ratings_get_scenery_score(const Ride& ride) #pragma region Ride rating calculation helpers -static void ride_ratings_set(RatingTuple* ratings, int32_t excitement, int32_t intensity, int32_t nausea) +static void RideRatingsSet(RatingTuple& ratings, int32_t excitement, int32_t intensity, int32_t nausea) { - ratings->Excitement = 0; - ratings->Intensity = 0; - ratings->Nausea = 0; - ride_ratings_add(ratings, excitement, intensity, nausea); + ratings.Excitement = 0; + ratings.Intensity = 0; + ratings.Nausea = 0; + RideRatingsAdd(ratings, excitement, intensity, nausea); } /** * Add to a ride rating with overflow protection. */ -static void ride_ratings_add(RatingTuple* rating, int32_t excitement, int32_t intensity, int32_t nausea) +static void RideRatingsAdd(RatingTuple& ratings, int32_t excitement, int32_t intensity, int32_t nausea) { - int32_t newExcitement = rating->Excitement + excitement; - int32_t newIntensity = rating->Intensity + intensity; - int32_t newNausea = rating->Nausea + nausea; - rating->Excitement = std::clamp(newExcitement, 0, INT16_MAX); - rating->Intensity = std::clamp(newIntensity, 0, INT16_MAX); - rating->Nausea = std::clamp(newNausea, 0, INT16_MAX); + int32_t newExcitement = ratings.Excitement + excitement; + int32_t newIntensity = ratings.Intensity + intensity; + int32_t newNausea = ratings.Nausea + nausea; + ratings.Excitement = std::clamp(newExcitement, 0, INT16_MAX); + ratings.Intensity = std::clamp(newIntensity, 0, INT16_MAX); + ratings.Nausea = std::clamp(newNausea, 0, INT16_MAX); } -static void ride_ratings_apply_length(RatingTuple* ratings, const Ride& ride, int32_t maxLength, int32_t excitementMultiplier) +static void RideRatingsApplyBonusLength(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add(ratings, (std::min(ride.GetTotalLength() >> 16, maxLength) * excitementMultiplier) >> 16, 0, 0); + RideRatingsAdd(ratings, (std::min(ride.GetTotalLength() >> 16, modifier.Threshold) * modifier.Excitement) >> 16, 0, 0); } -static void ride_ratings_apply_synchronisation(RatingTuple* ratings, const Ride& ride, int32_t excitement, int32_t intensity) +static void RideRatingsApplyBonusSynchronisation(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { if ((ride.depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) && RideHasAdjacentStation(ride)) { - ride_ratings_add(ratings, excitement, intensity, 0); + RideRatingsAdd(ratings, modifier.Excitement, modifier.Intensity, modifier.Nausea); } } -static void ride_ratings_apply_train_length(RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier) +static void RideRatingsApplyBonusTrainLength(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add(ratings, ((ride.num_cars_per_train - 1) * excitementMultiplier) >> 16, 0, 0); + RideRatingsAdd(ratings, ((ride.num_cars_per_train - 1) * modifier.Excitement) >> 16, 0, 0); } -static void ride_ratings_apply_max_speed( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusMaxSpeed(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - int32_t modifier = ride.max_speed >> 16; - ride_ratings_add( - ratings, (modifier * excitementMultiplier) >> 16, (modifier * intensityMultiplier) >> 16, - (modifier * nauseaMultiplier) >> 16); + int32_t maxSpeedMod = ride.max_speed >> 16; + RideRatingsAdd( + ratings, (maxSpeedMod * modifier.Excitement) >> 16, (maxSpeedMod * modifier.Intensity) >> 16, + (maxSpeedMod * modifier.Nausea) >> 16); } -static void ride_ratings_apply_average_speed( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier) +static void RideRatingsApplyBonusAverageSpeed(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - int32_t modifier = ride.average_speed >> 16; - ride_ratings_add(ratings, (modifier * excitementMultiplier) >> 16, (modifier * intensityMultiplier) >> 16, 0); + int32_t avgSpeedMod = ride.average_speed >> 16; + RideRatingsAdd(ratings, (avgSpeedMod * modifier.Excitement) >> 16, (avgSpeedMod * modifier.Intensity) >> 16, 0); } -static void ride_ratings_apply_duration( - RatingTuple* ratings, const Ride& ride, int32_t maxDuration, int32_t excitementMultiplier) +static void RideRatingsApplyBonusDuration(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add(ratings, (std::min(ride.GetTotalTime(), maxDuration) * excitementMultiplier) >> 16, 0, 0); + RideRatingsAdd(ratings, (std::min(ride.GetTotalTime(), modifier.Threshold) * modifier.Excitement) >> 16, 0, 0); } -static void ride_ratings_apply_gforces( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusGForces(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { RatingTuple subRating = ride_ratings_get_gforce_ratings(ride); - ride_ratings_add( - ratings, (subRating.Excitement * excitementMultiplier) >> 16, (subRating.Intensity * intensityMultiplier) >> 16, - (subRating.Nausea * nauseaMultiplier) >> 16); + RideRatingsAdd( + ratings, (subRating.Excitement * modifier.Excitement) >> 16, (subRating.Intensity * modifier.Intensity) >> 16, + (subRating.Nausea * modifier.Nausea) >> 16); } -static void ride_ratings_apply_turns( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusTurns(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { RatingTuple subRating = ride_ratings_get_turns_ratings(ride); - ride_ratings_add( - ratings, (subRating.Excitement * excitementMultiplier) >> 16, (subRating.Intensity * intensityMultiplier) >> 16, - (subRating.Nausea * nauseaMultiplier) >> 16); + RideRatingsAdd( + ratings, (subRating.Excitement * modifier.Excitement) >> 16, (subRating.Intensity * modifier.Intensity) >> 16, + (subRating.Nausea * modifier.Nausea) >> 16); } -static void ride_ratings_apply_drops( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusDrops(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { RatingTuple subRating = ride_ratings_get_drop_ratings(ride); - ride_ratings_add( - ratings, (subRating.Excitement * excitementMultiplier) >> 16, (subRating.Intensity * intensityMultiplier) >> 16, - (subRating.Nausea * nauseaMultiplier) >> 16); + RideRatingsAdd( + ratings, (subRating.Excitement * modifier.Excitement) >> 16, (subRating.Intensity * modifier.Intensity) >> 16, + (subRating.Nausea * modifier.Nausea) >> 16); } -static void ride_ratings_apply_sheltered_ratings( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusSheltered(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { RatingTuple subRating = ride_ratings_get_sheltered_ratings(ride); - ride_ratings_add( - ratings, (subRating.Excitement * excitementMultiplier) >> 16, (subRating.Intensity * intensityMultiplier) >> 16, - (subRating.Nausea * nauseaMultiplier) >> 16); + RideRatingsAdd( + ratings, (subRating.Excitement * modifier.Excitement) >> 16, (subRating.Intensity * modifier.Intensity) >> 16, + (subRating.Nausea * modifier.Nausea) >> 16); } -static void ride_ratings_apply_operation_option( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusRotations(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add( - ratings, (ride.operation_option * excitementMultiplier) >> 16, (ride.operation_option * intensityMultiplier) >> 16, - (ride.operation_option * nauseaMultiplier) >> 16); + RideRatingsAdd( + ratings, ride.rotations * modifier.Excitement, ride.rotations * modifier.Intensity, ride.rotations * modifier.Nausea); } -static void ride_ratings_apply_rotations( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusOperationOption(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add( - ratings, ride.rotations * excitementMultiplier, ride.rotations * intensityMultiplier, - ride.rotations * nauseaMultiplier); + int32_t intensity = (modifier.Intensity >= 0) ? (ride.operation_option * modifier.Intensity) + : (ride.operation_option / std::abs(modifier.Intensity)); + RideRatingsAdd(ratings, ride.operation_option * modifier.Excitement, intensity, ride.operation_option * modifier.Nausea); } -static void ride_ratings_apply_proximity(RideRatingUpdateState& state, RatingTuple* ratings, int32_t excitementMultiplier) +static void RideRatingsApplyBonusGoKartRace(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add(ratings, (ride_ratings_get_proximity_score(state) * excitementMultiplier) >> 16, 0, 0); + if (ride.mode == RideMode::Race && ride.NumTrains >= modifier.Threshold) + { + RideRatingsAdd(ratings, modifier.Excitement, modifier.Intensity, modifier.Nausea); + + int32_t lapsFactor = (ride.NumLaps - 1) * 30; + RideRatingsAdd(ratings, lapsFactor, lapsFactor / 2, 0); + } } -static void ride_ratings_apply_scenery(RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier) +static void RideRatingsApplyBonusTowerRide(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride_ratings_add(ratings, (ride_ratings_get_scenery_score(ride) * excitementMultiplier) >> 16, 0, 0); + int32_t lengthFactor = (ride.GetTotalLength() >> 16); + RideRatingsAdd( + ratings, (lengthFactor * modifier.Excitement) >> 16, (lengthFactor * modifier.Intensity) >> 16, + (lengthFactor * modifier.Nausea) >> 16); } -static void ride_ratings_apply_highest_drop_height_penalty( - RatingTuple* ratings, const Ride& ride, int32_t minHighestDropHeight, int32_t excitementPenalty, int32_t intensityPenalty, - int32_t nauseaPenalty) +static void RideRatingsApplyBonusRotoDrop(RatingTuple& ratings, const Ride& ride) { - if (ride.highest_drop_height < minHighestDropHeight) - { - ratings->Excitement /= excitementPenalty; - ratings->Intensity /= intensityPenalty; - ratings->Nausea /= nauseaPenalty; - } + int32_t lengthFactor = ((ride.GetTotalLength() >> 16) * 209715) >> 16; + RideRatingsAdd(ratings, lengthFactor, lengthFactor * 2, lengthFactor * 2); } -static void ride_ratings_apply_max_speed_penalty( - RatingTuple* ratings, const Ride& ride, int32_t minMaxSpeed, int32_t excitementPenalty, int32_t intensityPenalty, - int32_t nauseaPenalty) +static void RideRatingsApplyBonusMazeSize(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (ride.max_speed < minMaxSpeed) - { - ratings->Excitement /= excitementPenalty; - ratings->Intensity /= intensityPenalty; - ratings->Nausea /= nauseaPenalty; - } + int32_t size = std::min(ride.maze_tiles, modifier.Threshold); + RideRatingsAdd(ratings, size * modifier.Excitement, size * modifier.Intensity, size * modifier.Nausea); } -static void ride_ratings_apply_num_drops_penalty( - RatingTuple* ratings, const Ride& ride, int32_t minNumDrops, int32_t excitementPenalty, int32_t intensityPenalty, - int32_t nauseaPenalty) +static void RideRatingsApplyBonusBoatHireNoCircuit(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if ((ride.drops & 0x3F) < minNumDrops) + // Most likely checking if the ride has does not have a circuit + if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) { - ratings->Excitement /= excitementPenalty; - ratings->Intensity /= intensityPenalty; - ratings->Nausea /= nauseaPenalty; + RideRatingsAdd(ratings, modifier.Excitement, modifier.Intensity, modifier.Nausea); } } -static void ride_ratings_apply_max_negative_g_penalty( - RatingTuple* ratings, const Ride& ride, int32_t maxMaxNegativeVerticalG, int32_t excitementPenalty, - int32_t intensityPenalty, int32_t nauseaPenalty) +static void RideRatingsApplyBonusSlideUnlimitedRides(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (ride.max_negative_vertical_g >= maxMaxNegativeVerticalG) + if (ride.mode == RideMode::UnlimitedRidesPerAdmission) { - ratings->Excitement /= excitementPenalty; - ratings->Intensity /= intensityPenalty; - ratings->Nausea /= nauseaPenalty; + RideRatingsAdd(ratings, modifier.Excitement, modifier.Intensity, modifier.Nausea); } } -static void ride_ratings_apply_max_lateral_g_penalty( - RatingTuple* ratings, const Ride& ride, int32_t minMaxLateralG, int32_t excitementPenalty, int32_t intensityPenalty, - int32_t nauseaPenalty) +static void RideRatingsApplyBonusMotionSimulatorMode(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (ride.max_lateral_g < minMaxLateralG) + // Hardcoded until ride mode refactor + if (ride.mode == RideMode::FilmThrillRiders) + { + RideRatingsSet(ratings, RIDE_RATING(3, 25), RIDE_RATING(4, 10), RIDE_RATING(3, 30)); + } + else { - ratings->Excitement /= excitementPenalty; - ratings->Intensity /= intensityPenalty; - ratings->Nausea /= nauseaPenalty; + RideRatingsSet(ratings, RIDE_RATING(2, 90), RIDE_RATING(3, 50), RIDE_RATING(3, 00)); } } -static RatingTuple ride_ratings_get_excessive_lateral_g_penalty(const Ride& ride) +static void RideRatingsApplyBonus3DCinemaMode(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - RatingTuple result{}; - if (ride.max_lateral_g > FIXED_2DP(2, 80)) + // Hardcoded until ride mode refactor + switch (ride.mode) { - result.Intensity = FIXED_2DP(3, 75); - result.Nausea = FIXED_2DP(2, 00); + default: + case RideMode::MouseTails3DFilm: + RideRatingsSet(ratings, RIDE_RATING(3, 50), RIDE_RATING(2, 40), RIDE_RATING(1, 40)); + break; + case RideMode::StormChasers3DFilm: + RideRatingsSet(ratings, RIDE_RATING(4, 00), RIDE_RATING(2, 65), RIDE_RATING(1, 55)); + break; + case RideMode::SpaceRaiders3DFilm: + RideRatingsSet(ratings, RIDE_RATING(4, 20), RIDE_RATING(2, 60), RIDE_RATING(1, 48)); + break; } +} - if (ride.max_lateral_g > FIXED_2DP(3, 10)) +static void RideRatingsApplyBonusTopSpinMode(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) +{ + // Hardcoded until ride mode refactor + switch (ride.mode) { - // Remove half of the ride_ratings_get_gforce_ratings - result.Excitement = (ride.max_positive_vertical_g * 5242) >> 16; - - // Apply maximum negative G force factor - fixed16_2dp gforce = ride.max_negative_vertical_g; - result.Excitement += (std::clamp(gforce, -FIXED_2DP(2, 50), FIXED_2DP(0, 00)) * -15728) >> 16; - - // Apply lateral G force factor - result.Excitement += (std::min(FIXED_2DP(1, 50), ride.max_lateral_g) * 26214) >> 16; - - // Remove half of the ride_ratings_get_gforce_ratings - result.Excitement /= 2; - result.Excitement *= -1; - result.Intensity = FIXED_2DP(12, 25); - result.Nausea = FIXED_2DP(6, 00); + default: + case RideMode::Beginners: + RideRatingsSet(ratings, RIDE_RATING(2, 00), RIDE_RATING(4, 80), RIDE_RATING(5, 74)); + break; + case RideMode::Intense: + RideRatingsSet(ratings, RIDE_RATING(3, 00), RIDE_RATING(5, 75), RIDE_RATING(6, 64)); + break; + case RideMode::Berserk: + RideRatingsSet(ratings, RIDE_RATING(3, 20), RIDE_RATING(6, 80), RIDE_RATING(7, 94)); + break; } - return result; } -static void ride_ratings_apply_excessive_lateral_g_penalty( - RatingTuple* ratings, const Ride& ride, int32_t excitementMultiplier, int32_t intensityMultiplier, int32_t nauseaMultiplier) +static void RideRatingsApplyBonusReversals( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier) { -#ifndef ORIGINAL_RATINGS - RatingTuple subRating = ride_ratings_get_excessive_lateral_g_penalty(ride); - ride_ratings_add( - ratings, (subRating.Excitement * excitementMultiplier) >> 16, (subRating.Intensity * intensityMultiplier) >> 16, - (subRating.Nausea * nauseaMultiplier) >> 16); -#endif + int32_t numReversers = std::min(state.AmountOfReversers, modifier.Threshold); + RideRatingsAdd( + ratings, numReversers * modifier.Excitement, numReversers * modifier.Intensity, numReversers * modifier.Nausea); +} + +static void RideRatingsApplyBonusHoles(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) +{ + RideRatingsAdd( + ratings, (ride.holes) * modifier.Excitement, (ride.holes) * modifier.Intensity, (ride.holes) * modifier.Nausea); } -static void ride_ratings_apply_first_length_penalty( - RatingTuple* ratings, const Ride& ride, int32_t minFirstLength, int32_t excitementPenalty, int32_t intensityPenalty, - int32_t nauseaPenalty) +static void RideRatingsApplyBonusNumTrains(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (ride.GetStation().SegmentLength < minFirstLength) + // For some reason the original code ran this twice, before and after the operation option bonus + // Has been changed to call once with double value + if (ride.NumTrains >= modifier.Threshold) { - ratings->Excitement /= excitementPenalty; - ratings->Intensity /= intensityPenalty; - ratings->Nausea /= nauseaPenalty; + RideRatingsAdd(ratings, modifier.Excitement, modifier.Intensity, modifier.Nausea); } } -#pragma endregion - -#pragma region Ride rating calculation functions - -void RideRatingsCalculateSpiralRollerCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyBonusDownwardLaunch(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 30), RIDE_RATING(0, 30), RIDE_RATING(0, 30)); - ride_ratings_apply_length(&ratings, ride, 6000, 819); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); - ride_ratings_apply_train_length(&ratings, ride, 140434); - ride_ratings_apply_max_speed(&ratings, ride, 51366, 85019, 35424); - ride_ratings_apply_average_speed(&ratings, ride, 364088, 400497); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 36864, 30384, 49648); - 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(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - 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); - - if (ride.inversions == 0) + if (ride.mode == RideMode::DownwardLaunch) { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); + RideRatingsAdd(ratings, modifier.Excitement, modifier.Intensity, modifier.Nausea); } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 36864, 30384, 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 RideRatingsCalculateStandUpRollerCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyBonusOperationOptionFreefall(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 17; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 50), RIDE_RATING(3, 00), RIDE_RATING(3, 00)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 10)); - ride_ratings_apply_train_length(&ratings, ride, 187245); - ride_ratings_apply_max_speed(&ratings, ride, 44281, 123987, 35424); - ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 24576, 35746, 59578); - 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(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); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 50), 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 59578); - 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; + RideRatingsAdd( + ratings, (ride.operation_option * modifier.Excitement) >> 16, (ride.operation_option * modifier.Intensity) >> 16, + (ride.operation_option * modifier.Nausea) >> 16); } -void RideRatingsCalculateSuspendedSwingingCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyBonusLaunchedFreefallSpecial( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 18; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 30), RIDE_RATING(2, 90), RIDE_RATING(3, 50)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 10)); - 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, 32768, 23831, 79437); - 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(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); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 60), 2, 2, 2); - ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 50), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 32768, 23831, 79437); - ride_ratings_apply_intensity_penalty(&ratings); - ride_ratings_apply_adjustments(ride, &ratings); + int32_t excitement = ((ride.GetTotalLength() >> 16) * 32768) >> 16; + RideRatingsAdd(ratings, excitement, 0, 0); - 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; +#ifdef ORIGINAL_RATINGS + RideRatingsApplyBonusOperationOptionFreefall(&ratings, ride, modifier); +#else + // Only apply "launch speed" effects when the setting can be modified + if (ride.mode == RideMode::UpwardLaunch) + { + RideRatingsApplyBonusOperationOptionFreefall(ratings, ride, modifier); + } + else + { + // Fix #3282: When the ride mode is in downward launch mode, the intensity and + // nausea were fixed regardless of how high the ride is. The following + // calculation is based on roto-drop which is a similar mechanic. + int32_t lengthFactor = ((ride.GetTotalLength() >> 16) * 209715) >> 16; + RideRatingsAdd(ratings, lengthFactor, lengthFactor * 2, lengthFactor * 2); + } +#endif } -void RideRatingsCalculateInvertedRollerCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyBonusProximity( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 17; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 60), RIDE_RATING(2, 80), RIDE_RATING(3, 20)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 42), 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, 24576, 29789, 55606); - 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(state, &ratings, 15657); - ride_ratings_apply_scenery(&ratings, ride, 8366); - - if (ride.inversions == 0) - 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); - - if (ride.inversions == 0) - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 30), 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 29789, 55606); - 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; + RideRatingsAdd(ratings, (ride_ratings_get_proximity_score(state) * modifier.Excitement) >> 16, 0, 0); } -void RideRatingsCalculateJuniorRollerCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyBonusScenery(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - 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, 50), RIDE_RATING(1, 80)); - 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, 1, 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; + RideRatingsAdd(ratings, (ride_ratings_get_scenery_score(ride) * modifier.Excitement) >> 16, 0, 0); } -void RideRatingsCalculateMiniatureRailway(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementLength(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 11; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 50), RIDE_RATING(0, 00), RIDE_RATING(0, 00)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_train_length(&ratings, ride, 140434); - 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_sheltered_ratings(&ratings, ride, -6425, 6553, 23405); - 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); - - 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; - - auto shelteredEighths = get_num_of_sheltered_eighths(ride); - if (shelteredEighths.TrackShelteredEighths >= 4) - ride.excitement /= 4; - - ride.sheltered_eighths = shelteredEighths.TotalShelteredEighths; + if (ride.GetStation().SegmentLength < modifier.Threshold) + { + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; + } } -void RideRatingsCalculateMonorail(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementDropHeight(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 00), RIDE_RATING(0, 00), RIDE_RATING(0, 00)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_train_length(&ratings, ride, 93622); - ride_ratings_apply_max_speed(&ratings, ride, 44281, 70849, 35424); - 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(state, &ratings, 8946); - ride_ratings_apply_scenery(&ratings, ride, 16732); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); - - 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; - - auto shelteredEighths = get_num_of_sheltered_eighths(ride); - if (shelteredEighths.TrackShelteredEighths >= 4) - ride.excitement /= 4; - - ride.sheltered_eighths = shelteredEighths.TotalShelteredEighths; + if (ride.highest_drop_height < modifier.Threshold) + { + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; + } } -void RideRatingsCalculateMiniSuspendedCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementMaxSpeed(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 80), RIDE_RATING(2, 50), RIDE_RATING(2, 70)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 45), RIDE_RATING(0, 15)); - 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, 24576, 35746, 49648); - 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(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); - ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 30), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 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; + if (ride.max_speed < modifier.Threshold) + { + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; + } } -void RideRatingsCalculateBoatHire(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementNumDrops(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride.unreliability_factor = 7; - set_unreliability_factor(ride); - - // NOTE In the original game, the ratings were zeroed before calling set_unreliability_factor which is unusual as rest - // of the calculation functions do this before hand. This is because set_unreliability_factor alters the value of ebx - // (excitement). This is assumed to be a bug and therefore fixed. - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 90), RIDE_RATING(0, 80), RIDE_RATING(0, 90)); - - // Most likely checking if the ride has does not have a circuit - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) + if ((ride.drops & 0x3F) < modifier.Threshold) { - ride_ratings_add(&ratings, RIDE_RATING(0, 20), 0, 0); + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; } - - ride_ratings_apply_proximity(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 22310); - - 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 = 0; } -void RideRatingsCalculateWoodenWildMouse(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementNegativeGs(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 90), RIDE_RATING(2, 90), RIDE_RATING(2, 10)); - ride_ratings_apply_length(&ratings, ride, 6000, 873); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 8)); - 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, 102400, 35746, 49648); - 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(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); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); - ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 50), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 3, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 102400, 35746, 49648); - ride_ratings_apply_intensity_penalty(&ratings); - ride_ratings_apply_adjustments(ride, &ratings); - - ride.ratings = ratings; + if (ride.max_negative_vertical_g >= modifier.Threshold) + { + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; + } +} - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; +static void RideRatingsApplyRequirementLateralGs(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) +{ + if (ride.max_lateral_g < modifier.Threshold) + { + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; + } +} - ride.sheltered_eighths = get_num_of_sheltered_eighths(ride).TotalShelteredEighths; +static void RideRatingsApplyRequirementInversions(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) +{ + if (ride.inversions < modifier.Threshold) + { + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; + } } -void RideRatingsCalculateSteeplechase(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementUnsheltered( + RatingTuple& ratings, const Ride& ride, uint8_t shelteredEighths, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 70), RIDE_RATING(2, 40), RIDE_RATING(1, 80)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 75), RIDE_RATING(0, 9)); - 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, 20852, 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, 4, 2, 2, 2); - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 50), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xF00000, 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, 20852, 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 RideRatingsCalculateCarRide(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 12; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 00)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 15), RIDE_RATING(0, 00)); - 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_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(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 8366); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 8, 2, 2); - - 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 RideRatingsCalculateLaunchedFreefall(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 70), RIDE_RATING(3, 00), RIDE_RATING(3, 50)); - - if (ride.mode == RideMode::DownwardLaunch) - { - ride_ratings_add(&ratings, RIDE_RATING(0, 30), RIDE_RATING(0, 65), RIDE_RATING(0, 45)); - } - - int32_t excitementModifier = ((ride.GetTotalLength() >> 16) * 32768) >> 16; - ride_ratings_add(&ratings, excitementModifier, 0, 0); - -#ifdef ORIGINAL_RATINGS - ride_ratings_apply_operation_option(&ratings, ride, 0, 1355917, 451972); -#else - // Only apply "launch speed" effects when the setting can be modified - if (ride.mode == RideMode::UpwardLaunch) - { - ride_ratings_apply_operation_option(&ratings, ride, 0, 1355917, 451972); - } - else - { - // Fix #3282: When the ride mode is in downward launch mode, the intensity and - // nausea were fixed regardless of how high the ride is. The following - // calculation is based on roto-drop which is a similar mechanic. - int32_t lengthFactor = ((ride.GetTotalLength() >> 16) * 209715) >> 16; - ride_ratings_add(&ratings, lengthFactor, lengthFactor * 2, lengthFactor * 2); - } -#endif - - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 25098); - - 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 RideRatingsCalculateBobsleighCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 80), RIDE_RATING(3, 20), RIDE_RATING(2, 50)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 20), RIDE_RATING(0, 00)); - 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, 65536, 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, 15420, 32768, 35108); - 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); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 65536, 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 RideRatingsCalculateObservationTower(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(0, 00), RIDE_RATING(0, 10)); - ride_ratings_add(&ratings, ((ride.GetTotalLength() >> 16) * 45875) >> 16, 0, ((ride.GetTotalLength() >> 16) * 26214) >> 16); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 83662); - - 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 = 7; - - auto shelteredEighths = get_num_of_sheltered_eighths(ride); - if (shelteredEighths.TrackShelteredEighths >= 5) - ride.excitement /= 4; -} - -void RideRatingsCalculateLoopingRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = ride.IsPoweredLaunched() ? 20 : 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 20)); - 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, 24576, 35746, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 14, 2, 2, 2); - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - - if (ride.inversions == 0) + if (shelteredEighths >= modifier.Threshold) { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 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 RideRatingsCalculateDinghySlide(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, 70), RIDE_RATING(2, 00), RIDE_RATING(1, 50)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 50), 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, 65536, 29789, 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, 15420, 32768, 35108); - 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); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x8C0000, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 65536, 29789, 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 RideRatingsCalculateMineTrainCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 90), RIDE_RATING(2, 30), RIDE_RATING(2, 10)); - 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, 40960, 35746, 49648); - 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(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); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 40960, 35746, 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 RideRatingsCalculateChairlift(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementReversals( + RatingTuple& ratings, const Ride& ride, RideRatingUpdateState& state, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14 + (ride.speed * 2); - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 60), RIDE_RATING(0, 40), RIDE_RATING(0, 50)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - 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_turns(&ratings, ride, 7430, 3476, 4574); - ride_ratings_apply_sheltered_ratings(&ratings, ride, -19275, 21845, 23405); - 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); - - ride_ratings_apply_intensity_penalty(&ratings); - ride_ratings_apply_adjustments(ride, &ratings); - - if (ride.num_stations <= 1) + if (state.AmountOfReversers < modifier.Threshold) { - ratings.Excitement = 0; - ratings.Intensity /= 2; + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; } - - ride.ratings = ratings; - - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; - - auto shelteredEighths = get_num_of_sheltered_eighths(ride); - if (shelteredEighths.TrackShelteredEighths >= 4) - ride.excitement /= 4; - - ride.sheltered_eighths = shelteredEighths.TotalShelteredEighths; } -void RideRatingsCalculateCorkscrewRollerCoaster(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementHoles(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 20)); - 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, 24576, 35746, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - 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); - - if (ride.inversions == 0) + if (ride.holes < modifier.Threshold) { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 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 RideRatingsCalculateMaze(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 8; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 30), RIDE_RATING(0, 50), RIDE_RATING(0, 00)); - - int32_t size = std::min(ride.maze_tiles, 100); - ride_ratings_add(&ratings, size, size * 2, 0); - - ride_ratings_apply_scenery(&ratings, ride, 22310); - - 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 = 0; } -void RideRatingsCalculateSpiralSlide(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementStations(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 8; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(1, 40), RIDE_RATING(0, 90)); - - // Unlimited slides boost - if (ride.mode == RideMode::UnlimitedRidesPerAdmission) + if (ride.num_stations <= modifier.Threshold) { - ride_ratings_add(&ratings, RIDE_RATING(0, 40), RIDE_RATING(0, 20), RIDE_RATING(0, 25)); + // Excitement is set to 0 in original code - this could be changed for consistency + ratings.Excitement = 0; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; } - - ride_ratings_apply_scenery(&ratings, ride, 25098); - - 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 = 2; } -void RideRatingsCalculateGoKarts(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyRequirementSplashdown(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 42), RIDE_RATING(1, 73), RIDE_RATING(0, 40)); - ride_ratings_apply_length(&ratings, ride, 700, 32768); - - if (ride.mode == RideMode::Race && ride.NumTrains >= 4) + if (!(ride.special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS)) { - ride_ratings_add(&ratings, RIDE_RATING(1, 40), RIDE_RATING(0, 50), 0); - - int32_t lapsFactor = (ride.NumLaps - 1) * 30; - ride_ratings_add(&ratings, lapsFactor, lapsFactor / 2, 0); + ratings.Excitement /= modifier.Excitement; + ratings.Intensity /= modifier.Intensity; + ratings.Nausea /= modifier.Nausea; } - - 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(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 16732); - - 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; - - auto shelteredEighths = get_num_of_sheltered_eighths(ride); - ride.sheltered_eighths = shelteredEighths.TotalShelteredEighths; - - if (shelteredEighths.TrackShelteredEighths >= 6) - ride.excitement /= 2; -} - -void RideRatingsCalculateLogFlume(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(0, 55), RIDE_RATING(0, 30)); - ride_ratings_apply_length(&ratings, ride, 2000, 7208); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); - ride_ratings_apply_max_speed(&ratings, ride, 531372, 655360, 301111); - ride_ratings_apply_duration(&ratings, ride, 300, 13107); - 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(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_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 RideRatingsCalculateRiverRapids(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 20), RIDE_RATING(0, 70), RIDE_RATING(0, 50)); - ride_ratings_apply_length(&ratings, ride, 2000, 6225); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 30), RIDE_RATING(0, 05)); - ride_ratings_apply_max_speed(&ratings, ride, 115130, 159411, 106274); - ride_ratings_apply_duration(&ratings, ride, 500, 13107); - 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(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); - - 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 RideRatingsCalculateDodgems(Ride& ride, RideRatingUpdateState& state) +static RatingTuple ride_ratings_get_excessive_lateral_g_penalty(const Ride& ride) { - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 30), RIDE_RATING(0, 50), RIDE_RATING(0, 35)); - - if (ride.NumTrains >= 4) + RatingTuple result{}; + if (ride.max_lateral_g > FIXED_2DP(2, 80)) { - ride_ratings_add(&ratings, RIDE_RATING(0, 40), 0, 0); + result.Intensity = FIXED_2DP(3, 75); + result.Nausea = FIXED_2DP(2, 00); } - ride_ratings_add(&ratings, ride.operation_option, ride.operation_option / 2, 0); - - if (ride.NumTrains >= 4) + if (ride.max_lateral_g > FIXED_2DP(3, 10)) { - ride_ratings_add(&ratings, RIDE_RATING(0, 40), 0, 0); - } - - ride_ratings_apply_scenery(&ratings, ride, 5577); - - 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 = 7; -} - -void RideRatingsCalculateSwingingShip(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 10; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(1, 90), RIDE_RATING(1, 41)); - - ride_ratings_add(&ratings, ride.operation_option * 5, ride.operation_option * 5, ride.operation_option * 10); - - ride_ratings_apply_scenery(&ratings, ride, 16732); - - 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 = 0; -} - -void RideRatingsCalculateInverterShip(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 50), RIDE_RATING(2, 70), RIDE_RATING(2, 74)); - - ride_ratings_add(&ratings, ride.operation_option * 11, ride.operation_option * 22, ride.operation_option * 22); - - ride_ratings_apply_scenery(&ratings, ride, 11155); - - 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 = 0; -} + // Remove half of the ride_ratings_get_gforce_ratings + result.Excitement = (ride.max_positive_vertical_g * 5242) >> 16; -void RideRatingsCalculateFoodStall(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; -} + // Apply maximum negative G force factor + fixed16_2dp gforce = ride.max_negative_vertical_g; + result.Excitement += (std::clamp(gforce, -FIXED_2DP(2, 50), FIXED_2DP(0, 00)) * -15728) >> 16; -void RideRatingsCalculateDrinkStall(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; -} + // Apply lateral G force factor + result.Excitement += (std::min(FIXED_2DP(1, 50), ride.max_lateral_g) * 26214) >> 16; -void RideRatingsCalculateShop(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; + // Remove half of the ride_ratings_get_gforce_ratings + result.Excitement /= 2; + result.Excitement *= -1; + result.Intensity = FIXED_2DP(12, 25); + result.Nausea = FIXED_2DP(6, 00); + } + return result; } -void RideRatingsCalculateMerryGoRound(Ride& ride, RideRatingUpdateState& state) +static void RideRatingsApplyPenaltyLateralGs(RatingTuple& ratings, const Ride& ride, RatingsModifier modifier) { - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(0, 60), RIDE_RATING(0, 15), RIDE_RATING(0, 30)); - ride_ratings_apply_rotations(&ratings, ride, 5, 5, 5); - ride_ratings_apply_scenery(&ratings, ride, 19521); - 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 = 7; -} - -void RideRatingsCalculateInformationKiosk(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; -} - -void RideRatingsCalculateToilets(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; -} - -void RideRatingsCalculateFerrisWheel(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(0, 60), RIDE_RATING(0, 25), RIDE_RATING(0, 30)); - ride_ratings_apply_rotations(&ratings, ride, 25, 25, 25); - ride_ratings_apply_scenery(&ratings, ride, 41831); - 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 = 0; -} - -void RideRatingsCalculateMotionSimulator(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 21; - set_unreliability_factor(ride); - - // Base ratings - RatingTuple ratings; - if (ride.mode == RideMode::FilmThrillRiders) - { - ratings.Excitement = RIDE_RATING(3, 25); - ratings.Intensity = RIDE_RATING(4, 10); - ratings.Nausea = RIDE_RATING(3, 30); - } - else - { - ratings.Excitement = RIDE_RATING(2, 90); - ratings.Intensity = RIDE_RATING(3, 50); - ratings.Nausea = RIDE_RATING(3, 00); - } - - 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 = 7; -} - -void RideRatingsCalculate3dCinema(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 21; - set_unreliability_factor(ride); - - // Base ratings - RatingTuple ratings; - switch (ride.mode) - { - default: - case RideMode::MouseTails3DFilm: - ratings.Excitement = RIDE_RATING(3, 50); - ratings.Intensity = RIDE_RATING(2, 40); - ratings.Nausea = RIDE_RATING(1, 40); - break; - case RideMode::StormChasers3DFilm: - ratings.Excitement = RIDE_RATING(4, 00); - ratings.Intensity = RIDE_RATING(2, 65); - ratings.Nausea = RIDE_RATING(1, 55); - break; - case RideMode::SpaceRaiders3DFilm: - ratings.Excitement = RIDE_RATING(4, 20); - ratings.Intensity = RIDE_RATING(2, 60); - ratings.Nausea = RIDE_RATING(1, 48); - break; - } - - 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 |= 7; -} - -void RideRatingsCalculateTopSpin(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 19; - set_unreliability_factor(ride); - - // Base ratings - RatingTuple ratings; - switch (ride.mode) - { - default: - case RideMode::Beginners: - ratings.Excitement = RIDE_RATING(2, 00); - ratings.Intensity = RIDE_RATING(4, 80); - ratings.Nausea = RIDE_RATING(5, 74); - break; - case RideMode::Intense: - ratings.Excitement = RIDE_RATING(3, 00); - ratings.Intensity = RIDE_RATING(5, 75); - ratings.Nausea = RIDE_RATING(6, 64); - break; - case RideMode::Berserk: - ratings.Excitement = RIDE_RATING(3, 20); - ratings.Intensity = RIDE_RATING(6, 80); - ratings.Nausea = RIDE_RATING(7, 94); - break; - } - - ride_ratings_apply_scenery(&ratings, ride, 11155); - - 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 = 0; -} - -void RideRatingsCalculateSpaceRings(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 7; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(2, 10), RIDE_RATING(6, 50)); - ride_ratings_apply_scenery(&ratings, ride, 25098); - - 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 = 0; -} - -void RideRatingsCalculateReverseFreefallCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 25; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 00), RIDE_RATING(3, 20), RIDE_RATING(2, 80)); - ride_ratings_apply_length(&ratings, ride, 6000, 327); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 60), RIDE_RATING(0, 15)); - 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(state, &ratings, 17893); - ride_ratings_apply_scenery(&ratings, ride, 11155); - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 2, 2); - - 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 RideRatingsCalculateLift(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 11), RIDE_RATING(0, 35), RIDE_RATING(0, 30)); - - int32_t totalLength = ride.GetTotalLength() >> 16; - ride_ratings_add(&ratings, (totalLength * 45875) >> 16, 0, (totalLength * 26214) >> 16); - - ride_ratings_apply_proximity(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 83662); - - 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 = 7; - - if ((get_num_of_sheltered_eighths(ride).TrackShelteredEighths) >= 5) - ride.excitement /= 4; -} - -void RideRatingsCalculateVerticalDropRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 20), RIDE_RATING(0, 80), RIDE_RATING(0, 30)); - ride_ratings_apply_length(&ratings, ride, 4000, 1146); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); - ride_ratings_apply_max_speed(&ratings, ride, 97418, 141699, 70849); - ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 40960, 35746, 49648); - 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(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); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 1, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 40960, 35746, 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 RideRatingsCalculateCashMachine(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; -} - -void RideRatingsCalculateTwist(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 13), RIDE_RATING(0, 97), RIDE_RATING(1, 90)); - ride_ratings_apply_rotations(&ratings, ride, 20, 20, 20); - ride_ratings_apply_scenery(&ratings, ride, 13943); - 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 = 0; -} - -void RideRatingsCalculateHauntedHouse(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 8; - set_unreliability_factor(ride); - - RatingTuple ratings = { - /* .excitement = */ RIDE_RATING(3, 41), - /* .intensity = */ RIDE_RATING(1, 53), - /* .nausea = */ RIDE_RATING(0, 10), - }; - - 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 = 7; -} - -void RideRatingsCalculateFlyingRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 17; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(4, 35), RIDE_RATING(1, 85), RIDE_RATING(4, 33)); - 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, 24576, 38130, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - ratings.Excitement /= 2; - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 1, 1); - - if (ride.inversions == 0) - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 1, 1); - - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 1, 1); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 38130, 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 RideRatingsCalculateVirginiaReel(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, 10), RIDE_RATING(1, 90), RIDE_RATING(3, 70)); - 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, 110592, 29789, 59578); - 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(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); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 110592, 29789, 59578); - 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 RideRatingsCalculateSplashBoats(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 46), RIDE_RATING(0, 35), RIDE_RATING(0, 30)); - ride_ratings_apply_length(&ratings, ride, 2000, 7208); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); - ride_ratings_apply_max_speed(&ratings, ride, 797059, 655360, 301111); - ride_ratings_apply_duration(&ratings, ride, 500, 13107); - 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(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_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 RideRatingsCalculateMiniHelicopters(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 12; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 60), RIDE_RATING(0, 40), RIDE_RATING(0, 00)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 15), RIDE_RATING(0, 00)); - 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_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(state, &ratings, 8946); - ride_ratings_apply_scenery(&ratings, ride, 8366); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xA00000, 2, 2, 2); - - 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 = 6; -} - -void RideRatingsCalculateLayDownRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 18; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 85), RIDE_RATING(1, 15), RIDE_RATING(2, 75)); - 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, 24576, 38130, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - { - ratings.Excitement /= 4; - ratings.Intensity /= 2; - ratings.Nausea /= 2; - } - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - - if (ride.inversions == 0) - { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 38130, 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 RideRatingsCalculateSuspendedMonorail(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 15), RIDE_RATING(0, 23), RIDE_RATING(0, 8)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_train_length(&ratings, ride, 93622); - ride_ratings_apply_max_speed(&ratings, ride, 44281, 70849, 35424); - 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(state, &ratings, 12525); - ride_ratings_apply_scenery(&ratings, ride, 25098); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); - - 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; - - auto shelteredEighths = get_num_of_sheltered_eighths(ride); - if (shelteredEighths.TrackShelteredEighths >= 4) - ride.excitement /= 4; - - ride.sheltered_eighths = shelteredEighths.TotalShelteredEighths; -} - -void RideRatingsCalculateReverserRollerCoaster(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, 40), RIDE_RATING(1, 80), RIDE_RATING(1, 70)); - 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); - - int32_t numReversers = std::min(state.AmountOfReversers, 6); - ride_rating reverserRating = numReversers * RIDE_RATING(0, 20); - ride_ratings_add(&ratings, reverserRating, reverserRating, reverserRating); - - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 28672, 23831, 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); - - if (state.AmountOfReversers < 1) - { - ratings.Excitement /= 8; - } - - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 1, 1); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 1, 1); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 28672, 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 RideRatingsCalculateHeartlineTwisterCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 18; - set_unreliability_factor(ride); - - RatingTuple ratings; -#ifdef ORIGINAL_RATINGS - ride_ratings_set(&ratings, RIDE_RATING(1, 40), RIDE_RATING(1, 70), RIDE_RATING(1, 65)); -#else - ride_ratings_set(&ratings, RIDE_RATING(3, 00), RIDE_RATING(1, 70), RIDE_RATING(1, 65)); -#endif - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 20), RIDE_RATING(0, 04)); - ride_ratings_apply_train_length(&ratings, ride, 187245); - ride_ratings_apply_max_speed(&ratings, ride, 97418, 123987, 70849); - ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 24576, 44683, 89367); - 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(state, &ratings, 9841); - ride_ratings_apply_scenery(&ratings, ride, 3904); - - if (ride.inversions == 0) - ratings.Excitement /= 4; - - ride_ratings_apply_num_drops_penalty(&ratings, ride, 1, 4, 1, 1); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 44683, 89367); - 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 RideRatingsCalculateMiniGolf(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 0; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 50), RIDE_RATING(0, 90), RIDE_RATING(0, 00)); - 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(state, &ratings, 15657); - ride_ratings_apply_scenery(&ratings, ride, 27887); - - // Apply golf holes factor - ride_ratings_add(&ratings, (ride.holes) * 5, 0, 0); - - // Apply no golf holes penalty - if (ride.holes == 0) - { - ratings.Excitement /= 8; - ratings.Intensity /= 2; - ratings.Nausea /= 2; - } - - 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 RideRatingsCalculateFirstAid(Ride& ride, RideRatingUpdateState& state) -{ - ride.upkeep_cost = ride_compute_upkeep(state, ride); - ride.window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; -} - -void RideRatingsCalculateCircus(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 9; - set_unreliability_factor(ride); - - RatingTuple ratings = { - /* .excitement = */ RIDE_RATING(2, 10), - /* .intensity = */ RIDE_RATING(0, 30), - /* .nausea = */ RIDE_RATING(0, 0), - }; - - 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 = 7; -} - -void RideRatingsCalculateGhostTrain(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 12; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 00), RIDE_RATING(0, 20), RIDE_RATING(0, 03)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 15), RIDE_RATING(0, 00)); - 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_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(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 8366); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xB40000, 2, 2, 2); - - 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 RideRatingsCalculateTwisterRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 15; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 50), RIDE_RATING(0, 40), RIDE_RATING(0, 30)); - 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, 24576, 32768, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - 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); - - if (ride.inversions == 0) - { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 32768, 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 RideRatingsCalculateWoodenRollerCoaster(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(3, 20), 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, 2, 2); - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 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; -} - -void RideRatingsCalculateSideFrictionRollerCoaster(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, 50), RIDE_RATING(2, 00), RIDE_RATING(1, 50)); - 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, 28672, 35746, 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, 6, 2, 2, 2); - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x50000, 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xFA0000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 28672, 35746, 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 RideRatingsCalculateWildMouse(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 80), RIDE_RATING(2, 50), RIDE_RATING(2, 10)); - ride_ratings_apply_length(&ratings, ride, 6000, 873); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 8)); - 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, 102400, 35746, 49648); - 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(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); - ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 50), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 102400, 35746, 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 RideRatingsCalculateMultiDimensionRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 18; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 75), RIDE_RATING(1, 95), RIDE_RATING(4, 79)); - 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, 24576, 38130, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - ratings.Excitement /= 4; - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 1, 1); - if (ride.inversions == 0) - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 1, 1); - - if (ride.inversions == 0) - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 1, 1); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 38130, 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 RideRatingsCalculateGigaCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 85), RIDE_RATING(0, 40), RIDE_RATING(0, 35)); - ride_ratings_apply_length(&ratings, ride, 6000, 819); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); - ride_ratings_apply_train_length(&ratings, ride, 140434); - ride_ratings_apply_max_speed(&ratings, ride, 51366, 85019, 35424); - ride_ratings_apply_average_speed(&ratings, ride, 364088, 400497); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 36864, 30384, 49648); - 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(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 16, 2, 2, 2); - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - - if (ride.inversions == 0) - { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 36864, 30384, 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 RideRatingsCalculateRotoDrop(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 24; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 80), RIDE_RATING(3, 50), RIDE_RATING(3, 50)); - - int32_t lengthFactor = ((ride.GetTotalLength() >> 16) * 209715) >> 16; - ride_ratings_add(&ratings, lengthFactor, lengthFactor * 2, lengthFactor * 2); - - ride_ratings_apply_proximity(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 25098); - - 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 RideRatingsCalculateFlyingSaucers(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 32; - set_unreliability_factor(ride); - - RatingTuple ratings = { - /* .excitement = */ RIDE_RATING(2, 40), - /* .intensity = */ RIDE_RATING(0, 55), - /* .nausea = */ RIDE_RATING(0, 39), - }; - - if (ride.NumTrains >= 4) - { - ride_ratings_add(&ratings, RIDE_RATING(0, 40), 0, 0); - } - - ride_ratings_add(&ratings, ride.time_limit, ride.time_limit / 2, 0); - - if (ride.NumTrains >= 4) - { - ride_ratings_add(&ratings, RIDE_RATING(0, 40), 0, 0); - } - - ride_ratings_apply_scenery(&ratings, ride, 5577); - - 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 = 0; -} - -void RideRatingsCalculateCrookedHouse(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 5; - set_unreliability_factor(ride); - - RatingTuple ratings = { - /* .excitement = */ RIDE_RATING(2, 15), - /* .intensity = */ RIDE_RATING(0, 62), - /* .nausea = */ RIDE_RATING(0, 34), - }; - - 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 = 7; -} - -void RideRatingsCalculateMonorailCycles(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 4; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 40), RIDE_RATING(0, 20), RIDE_RATING(0, 00)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 15), RIDE_RATING(0, 00)); - 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_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(state, &ratings, 8946); - ride_ratings_apply_scenery(&ratings, ride, 11155); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x8C0000, 2, 2, 2); - - 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 RideRatingsCalculateCompactInvertedCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = ride.mode == RideMode::ReverseInclineLaunchedShuttle ? 31 : 21; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 15), RIDE_RATING(2, 80), RIDE_RATING(3, 20)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 42), 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, 24576, 30980, 55606); - 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(state, &ratings, 15657); - ride_ratings_apply_scenery(&ratings, ride, 8366); - - if (ride.inversions == 0) - 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); - - if (ride.inversions == 0) - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 30), 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 30980, 55606); - 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 RideRatingsCalculateWaterCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 70), RIDE_RATING(2, 80), RIDE_RATING(2, 10)); - 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, 8, 2, 2, 2); - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 1, 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); - - if (!(ride.special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS)) - ratings.Excitement /= 8; - - 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 RideRatingsCalculateAirPoweredVerticalCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 28; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(4, 13), RIDE_RATING(2, 50), RIDE_RATING(2, 80)); - ride_ratings_apply_length(&ratings, ride, 6000, 327); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 60), RIDE_RATING(0, 05)); - 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(state, &ratings, 17893); - ride_ratings_apply_scenery(&ratings, ride, 11155); - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 4, 1, 1); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 59578); - 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 RideRatingsCalculateInvertedHairpinCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 14; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 00), RIDE_RATING(2, 65), RIDE_RATING(2, 25)); - ride_ratings_apply_length(&ratings, ride, 6000, 873); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 8)); - 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, 102400, 35746, 49648); - 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(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); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); - ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1, 50), 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 3, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 102400, 35746, 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 RideRatingsCalculateMagicCarpet(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 45), RIDE_RATING(1, 60), RIDE_RATING(2, 60)); - - ride_ratings_add(&ratings, ride.operation_option * 10, ride.operation_option * 20, ride.operation_option * 20); - - ride_ratings_apply_scenery(&ratings, ride, 11155); - - 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 = 0; -} - -void RideRatingsCalculateSubmarineRide(Ride& ride, RideRatingUpdateState& state) -{ - ride.unreliability_factor = 7; - set_unreliability_factor(ride); - - // NOTE Fixed bug from original game, see boat Hire. - - 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(state, &ratings, 11183); - ride_ratings_apply_scenery(&ratings, ride, 22310); - - 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; - - // 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 RideRatingsCalculateRiverRafts(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 12; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(1, 45), RIDE_RATING(0, 25), RIDE_RATING(0, 34)); - ride_ratings_apply_length(&ratings, ride, 2000, 7208); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 40), RIDE_RATING(0, 05)); - ride_ratings_apply_max_speed(&ratings, ride, 531372, 655360, 301111); - 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(state, &ratings, 13420); - ride_ratings_apply_scenery(&ratings, ride, 11155); - - 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 RideRatingsCalculateEnterprise(Ride& ride, RideRatingUpdateState& state) -{ - ride.lifecycle_flags |= RIDE_LIFECYCLE_TESTED; - ride.lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; - ride.unreliability_factor = 22; - set_unreliability_factor(ride); - - // Base ratings - RatingTuple ratings = { - /* .excitement = */ RIDE_RATING(3, 60), - /* .intensity = */ RIDE_RATING(4, 55), - /* .nausea = */ RIDE_RATING(5, 72), - }; - - ride_ratings_add(&ratings, ride.operation_option, ride.operation_option * 16, ride.operation_option * 16); - - ride_ratings_apply_scenery(&ratings, ride, 19521); - - 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 = 3; -} - -void RideRatingsCalculateInvertedImpulseCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 20; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(4, 00), RIDE_RATING(3, 00), RIDE_RATING(3, 20)); - ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 42), 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, 24576, 29789, 55606); - 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(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); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 29789, 55606); - 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 RideRatingsCalculateMiniRollerCoaster(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, 55), RIDE_RATING(2, 40), RIDE_RATING(1, 85)); - 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, 12, 2, 2, 2); - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 50), 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 RideRatingsCalculateMineRide(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 75), RIDE_RATING(1, 00), RIDE_RATING(1, 80)); - 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, 40960, 29789, 49648); - 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(state, &ratings, 21472); - ride_ratings_apply_scenery(&ratings, ride, 16732); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x10E0000, 2, 2, 2); - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 40960, 29789, 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 RideRatingsCalculateLimLaunchedRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 25; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 90), RIDE_RATING(1, 50), RIDE_RATING(2, 20)); - 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, 24576, 35746, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 20130); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 10, 2, 2, 2); - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - - if (ride.inversions == 0) - { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, 10, 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 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 RideRatingsCalculateClassicMiniRollerCoaster(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 RideRatingsCalculateHybridCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 80), RIDE_RATING(1, 00), RIDE_RATING(0, 45)); - 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, 364088, 400497); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 40960, 35746, 49648); - 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(state, &ratings, 22367); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - { - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 14, 2, 2, 2); - } - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - - if (ride.inversions == 0) - { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); - } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 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 RideRatingsCalculateSingleRailRollerCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 16; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(3, 50), RIDE_RATING(0, 60), RIDE_RATING(0, 40)); - 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, 364088, 436906); - ride_ratings_apply_duration(&ratings, ride, 150, 26214); - ride_ratings_apply_gforces(&ratings, ride, 36864, 35746, 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, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 22367); - ride_ratings_apply_scenery(&ratings, ride, 6693); - - if (ride.inversions == 0) - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 14, 2, 2, 2); // Done - - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); // Done - - if (ride.inversions == 0) - { - ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); // Done - ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); // Done - } - - ride_ratings_apply_excessive_lateral_g_penalty(&ratings, ride, 24576, 35746, 49648); // Done - 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 RideRatingsCalculateAlpineCoaster(Ride& ride, RideRatingUpdateState& state) -{ - if (!(ride.lifecycle_flags & RIDE_LIFECYCLE_TESTED)) - return; - - ride.unreliability_factor = 7; - set_unreliability_factor(ride); - - RatingTuple ratings; - ride_ratings_set(&ratings, RIDE_RATING(2, 30), RIDE_RATING(2, 10), RIDE_RATING(1, 4)); - ride_ratings_apply_length(&ratings, ride, 6000, 873); - ride_ratings_apply_synchronisation(&ratings, ride, RIDE_RATING(0, 75), RIDE_RATING(0, 5)); - 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, 300, 26214); - ride_ratings_apply_turns(&ratings, ride, 29721, 34767, 45749); - ride_ratings_apply_drops(&ratings, ride, 8738, 5461, 6553); - ride_ratings_apply_sheltered_ratings(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_proximity(state, &ratings, 22367); - ride_ratings_apply_scenery(&ratings, ride, 11155); - ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x50000, 2, 2, 2); - ride_ratings_apply_first_length_penalty(&ratings, ride, 0x1720000, 2, 2, 2); - 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 RideRatingsCalculateClassicWoodenRollerCoaster(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 - -ride_ratings_calculation RideRatingsGetCalculateFunc(ride_type_t rideType) -{ - return GetRideTypeDescriptor(rideType).RatingsCalculationFunction; +#ifndef ORIGINAL_RATINGS + RatingTuple subRating = ride_ratings_get_excessive_lateral_g_penalty(ride); + RideRatingsAdd( + ratings, (subRating.Excitement * modifier.Excitement) >> 16, (subRating.Intensity * modifier.Intensity) >> 16, + (subRating.Nausea * modifier.Nausea) >> 16); +#endif } #pragma endregion diff --git a/src/openrct2/ride/RideRatings.h b/src/openrct2/ride/RideRatings.h index 3ed048174465..60013a2bb0fa 100644 --- a/src/openrct2/ride/RideRatings.h +++ b/src/openrct2/ride/RideRatings.h @@ -64,94 +64,6 @@ void RideRatingResetUpdateStates(); void RideRatingsUpdateRide(const Ride& ride); void RideRatingsUpdateAll(); -using ride_ratings_calculation = void (*)(Ride& ride, RideRatingUpdateState& state); -ride_ratings_calculation RideRatingsGetCalculateFunc(ride_type_t rideType); - -void RideRatingsCalculateSpiralRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateStandUpRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSuspendedSwingingCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateInvertedRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateJuniorRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMiniatureRailway(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMonorail(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMiniSuspendedCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateBoatHire(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateWoodenWildMouse(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSteeplechase(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateCarRide(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateLaunchedFreefall(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateBobsleighCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateObservationTower(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateLoopingRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateDinghySlide(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMineTrainCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateChairlift(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateCorkscrewRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMaze(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSpiralSlide(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateGoKarts(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateLogFlume(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateRiverRapids(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateDodgems(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSwingingShip(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateInverterShip(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateFoodStall(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateShop(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMerryGoRound(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateInformationKiosk(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateToilets(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateFerrisWheel(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMotionSimulator(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculate3dCinema(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateTopSpin(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSpaceRings(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateReverseFreefallCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateLift(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateVerticalDropRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateCashMachine(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateTwist(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateHauntedHouse(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateFirstAid(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateCircus(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateGhostTrain(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateTwisterRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateWoodenRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSideFrictionRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateWildMouse(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMultiDimensionRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateFlyingRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateVirginiaReel(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSplashBoats(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMiniHelicopters(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateLayDownRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSuspendedMonorail(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateReverserRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateHeartlineTwisterCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMiniGolf(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateGigaCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateRotoDrop(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateFlyingSaucers(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateCrookedHouse(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMonorailCycles(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateCompactInvertedCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateWaterCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateAirPoweredVerticalCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateInvertedHairpinCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMagicCarpet(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSubmarineRide(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateRiverRafts(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateEnterprise(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateInvertedImpulseCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMiniRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateMineRide(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateLimLaunchedRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateClassicMiniRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateHybridCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateSingleRailRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateAlpineCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateClassicWoodenRollerCoaster(Ride& ride, RideRatingUpdateState& state); -void RideRatingsCalculateDrinkStall(Ride& ride, RideRatingUpdateState& state); - // Special Track Element Adjustment functions for RTDs void SpecialTrackElementRatingsAjustment_Default(const Ride& ride, int32_t& excitement, int32_t& intensity, int32_t& nausea); void SpecialTrackElementRatingsAjustment_GhostTrain(const Ride& ride, int32_t& excitement, int32_t& intensity, int32_t& nausea); diff --git a/src/openrct2/ride/coaster/meta/AirPoweredVerticalCoaster.h b/src/openrct2/ride/coaster/meta/AirPoweredVerticalCoaster.h index 8dbaae9c6243..5cfa20f9dc8e 100644 --- a/src/openrct2/ride/coaster/meta/AirPoweredVerticalCoaster.h +++ b/src/openrct2/ride/coaster/meta/AirPoweredVerticalCoaster.h @@ -35,7 +35,6 @@ constexpr const RideTypeDescriptor AirPoweredVerticalCoasterRTD = SET_FIELD(Heights, { 255, 32, 4, 7, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateAirPoweredVerticalCoaster), SET_FIELD(RatingsMultipliers, { 44, 66, 10 }), SET_FIELD(UpkeepCosts, { 90, 20, 0, 0, 0, 10 }), SET_FIELD(BuildCosts, { 100.00_GBP, 0.00_GBP, 45, }), @@ -51,5 +50,24 @@ constexpr const RideTypeDescriptor AirPoweredVerticalCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_AIR_POWERED_VERTICAL_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_AIR_POWERED_VERTICAL_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "air_powered_vertical_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(4, 13), RIDE_RATING(2, 50), RIDE_RATING(2, 80) }, + 28, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 327, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 60), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 509724, 364088, 320398 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 59578 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 21845, 11702 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 34, 4, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 59578 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/AlpineCoaster.h b/src/openrct2/ride/coaster/meta/AlpineCoaster.h index 052174ad2f55..22f8e330f01e 100644 --- a/src/openrct2/ride/coaster/meta/AlpineCoaster.h +++ b/src/openrct2/ride/coaster/meta/AlpineCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor AlpineCoasterRTD = SET_FIELD(Heights, {18, 24, 3, 7}), SET_FIELD(MaxMass, 4), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateAlpineCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 35, 20, 80, 8, 3, 10 }), SET_FIELD(BuildCosts, { 22.50_GBP, 2.50_GBP, 50}), @@ -52,5 +51,28 @@ constexpr const RideTypeDescriptor AlpineCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_ALPINE_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "alpine_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 30), RIDE_RATING(2, 10), RIDE_RATING(1, 4) }, + 7, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 75), RIDE_RATING(0, 5), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 300, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 29721, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 8738, 5461, 6553 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementMaxSpeed, 0x50000, 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 2, 2 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/BobsleighCoaster.h b/src/openrct2/ride/coaster/meta/BobsleighCoaster.h index 61ba4fab9013..653725818ad3 100644 --- a/src/openrct2/ride/coaster/meta/BobsleighCoaster.h +++ b/src/openrct2/ride/coaster/meta/BobsleighCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor BobsleighCoasterRTD = SET_FIELD(Heights, { 19, 24, 5, 7, }), SET_FIELD(MaxMass, 25), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateBobsleighCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 40.00_GBP, 2.50_GBP, 45, }), @@ -53,5 +52,31 @@ constexpr const RideTypeDescriptor BobsleighCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_BOBSLEIGH_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_BOBSLEIGH_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "bobsleigh_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 80), RIDE_RATING(3, 20), RIDE_RATING(2, 50) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 20), RIDE_RATING(0, 00), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 65536, 23831, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementMaxSpeed, 0xC0000, 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 20), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 65536, 23831, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h b/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h index c789618c7cbf..61ff7af2a920 100644 --- a/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h @@ -37,7 +37,6 @@ 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, RideRatingsCalculateClassicMiniRollerCoaster), 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, }), @@ -55,5 +54,31 @@ constexpr const RideTypeDescriptor ClassicMiniRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_JUNIOR_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_JUNIOR_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "classic_mini_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 40), RIDE_RATING(2, 80), RIDE_RATING(1, 90) }, + 13, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 20480, 23831, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 25700, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 9760, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 20480, 23831, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h b/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h index 88234aab0a11..9531e08df08b 100644 --- a/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/ClassicWoodenRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor ClassicWoodenRollerCoasterRTD = SET_FIELD(Heights, { 41, 24, 8, 11, }), SET_FIELD(MaxMass, 19), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 3, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateClassicWoodenRollerCoaster), 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, }), @@ -54,5 +53,33 @@ constexpr const RideTypeDescriptor ClassicWoodenRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CLASSIC_WOODEN_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_CLASSIC_WOODEN_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "classic_wooden_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 80), RIDE_RATING(2, 60), RIDE_RATING(2, 00) }, + 19, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 34555, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 1, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 1, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 1, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 1, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 1, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 40960, 34555, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h b/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h index 74fdc736491b..7952ff2ffd8f 100644 --- a/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h +++ b/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor CompactInvertedCoasterRTD = SET_FIELD(Heights, { 27, 40, 29, 8, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCompactInvertedCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 13, 3, 10 }), SET_FIELD(BuildCosts, { 50.00_GBP, 2.50_GBP, 50, }), @@ -54,5 +53,31 @@ constexpr const RideTypeDescriptor CompactInvertedCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_COMPACT_INVERTED_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_COMPACT_INVERTED_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "compact_inverted_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 15), RIDE_RATING(2, 80), RIDE_RATING(3, 20) }, + 21, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 42), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 30980, 55606 }, + { RatingsModifierType::BonusTurns, 0, 26749, 29552, 57186 }, + { RatingsModifierType::BonusDrops, 0, 29127, 39009, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 15291, 35108 }, + { RatingsModifierType::BonusProximity, 0, 15657, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 8366, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 30), 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 30980, 55606 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h b/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h index 11a8d7a209a5..95a4e29f8d86 100644 --- a/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor CorkscrewRollerCoasterRTD = SET_FIELD(Heights, { 28, 24, 8, 11, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftArrow, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCorkscrewRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 52.50_GBP, 2.50_GBP, 50, }), @@ -55,5 +54,32 @@ constexpr const RideTypeDescriptor CorkscrewRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CORKSCREW_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_CORKSCREW_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "corkscrew_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 20) }, + 16, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/FlyingRollerCoaster.h b/src/openrct2/ride/coaster/meta/FlyingRollerCoaster.h index f35252bba15a..441e1f008e8f 100644 --- a/src/openrct2/ride/coaster/meta/FlyingRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/FlyingRollerCoaster.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor FlyingRollerCoasterRTD = SET_FIELD(Heights, { 30, 24, 8, 11, }), SET_FIELD(MaxMass, 35), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateFlyingRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(BuildCosts, { 62.50_GBP, 2.50_GBP, 50, }), @@ -58,6 +57,33 @@ constexpr const RideTypeDescriptor FlyingRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_FLYING_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_FLYING_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "flying_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(4, 35), RIDE_RATING(1, 85), RIDE_RATING(4, 33) }, + 17, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 38130, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 2, 1, 1 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 1, 1 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 1, 1 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 38130, 49648 }, + }, + }), }; // Inverted variant @@ -82,7 +108,6 @@ constexpr const RideTypeDescriptor FlyingRollerCoasterAltRTD = SET_FIELD(Heights, { 30, 24, 8, 11, }), SET_FIELD(MaxMass, 35), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateFlyingRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(BuildCosts, { 62.50_GBP, 2.50_GBP, 50, }), @@ -98,5 +123,32 @@ constexpr const RideTypeDescriptor FlyingRollerCoasterAltRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_FLYING_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_FLYING_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "flying_rc_alt"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(4, 35), RIDE_RATING(1, 85), RIDE_RATING(4, 33) }, + 17, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 38130, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 2, 1, 1 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 1, 1 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 1, 1 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 38130, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/GigaCoaster.h b/src/openrct2/ride/coaster/meta/GigaCoaster.h index d59aea9f1949..0660547f6c46 100644 --- a/src/openrct2/ride/coaster/meta/GigaCoaster.h +++ b/src/openrct2/ride/coaster/meta/GigaCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor GigaCoasterRTD = SET_FIELD(Heights, { 86, 24, 9, 11, }), SET_FIELD(MaxMass, 31), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 5, 8 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateGigaCoaster), SET_FIELD(RatingsMultipliers, { 51, 32, 10 }), SET_FIELD(UpkeepCosts, { 10, 20, 80, 12, 3, 40 }), SET_FIELD(BuildCosts, { 60.00_GBP, 2.50_GBP, 55, }), @@ -55,5 +54,32 @@ constexpr const RideTypeDescriptor GigaCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_GIGA_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_GIGA_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "giga_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 85), RIDE_RATING(0, 40), RIDE_RATING(0, 35) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 819, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 140434, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 51366, 85019, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 400497, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 36864, 30384, 49648 }, + { RatingsModifierType::BonusTurns, 0, 28235, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 43690, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 16, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 36864, 30384, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/HeartlineTwisterCoaster.h b/src/openrct2/ride/coaster/meta/HeartlineTwisterCoaster.h index 5c60b31b59ad..dba7753a3f4c 100644 --- a/src/openrct2/ride/coaster/meta/HeartlineTwisterCoaster.h +++ b/src/openrct2/ride/coaster/meta/HeartlineTwisterCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor HeartlineTwisterCoasterRTD = SET_FIELD(Heights, { 22, 24, 15, 9, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateHeartlineTwisterCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 47, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 72.50_GBP, 3.50_GBP, 30, }), @@ -53,5 +52,30 @@ constexpr const RideTypeDescriptor HeartlineTwisterCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_HEARTLINE_TWISTER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_HEARTLINE_TWISTER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "heartline_twister_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 00), RIDE_RATING(1, 70), RIDE_RATING(1, 65) }, + 18, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 20), RIDE_RATING(0, 04), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 97418, 123987, 70849 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 44683, 89367 }, + { RatingsModifierType::BonusTurns, 0, 26749, 52150, 57186 }, + { RatingsModifierType::BonusDrops, 0, 29127, 53052, 55705 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 34952, 35108 }, + { RatingsModifierType::BonusProximity, 0, 9841, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 3904, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 4, 1, 1 }, + { RatingsModifierType::RequirementNumDrops, 1, 4, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 44683, 89367 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/HybridCoaster.h b/src/openrct2/ride/coaster/meta/HybridCoaster.h index 2c00f58e14d3..0783d5cbf6b2 100644 --- a/src/openrct2/ride/coaster/meta/HybridCoaster.h +++ b/src/openrct2/ride/coaster/meta/HybridCoaster.h @@ -35,7 +35,6 @@ constexpr const RideTypeDescriptor HybridCoasterRTD = SET_FIELD(Heights, { 43, 24, 13, 13}), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftRMC, 5, 8 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateHybridCoaster), SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 65.00_GBP, 3.50_GBP, 55}), @@ -51,5 +50,32 @@ constexpr const RideTypeDescriptor HybridCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_HYBRID_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_HYBRID_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "hybrid_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 80), RIDE_RATING(1, 00), RIDE_RATING(0, 45) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 400497, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 34179, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 34952, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 14, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/HyperTwister.h b/src/openrct2/ride/coaster/meta/HyperTwister.h index cd56722a0e1d..c3d75a856629 100644 --- a/src/openrct2/ride/coaster/meta/HyperTwister.h +++ b/src/openrct2/ride/coaster/meta/HyperTwister.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor HyperTwisterRTD = SET_FIELD(Heights, { 54, 24, 8, 9, }), SET_FIELD(MaxMass, 31), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 5, 8 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateTwisterRollerCoaster), SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 60.00_GBP, 2.50_GBP, 55, }), @@ -57,5 +56,32 @@ constexpr const RideTypeDescriptor HyperTwisterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_TWISTER_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_TWISTER_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "hyper_twister"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 50), RIDE_RATING(0, 40), RIDE_RATING(0, 30) }, + 15, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 32768, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 32768, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/Hypercoaster.h b/src/openrct2/ride/coaster/meta/Hypercoaster.h index 96ff03302941..7aa2d908b996 100644 --- a/src/openrct2/ride/coaster/meta/Hypercoaster.h +++ b/src/openrct2/ride/coaster/meta/Hypercoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor HypercoasterRTD = SET_FIELD(Heights, { 55, 24, 8, 11, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftArrow, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCorkscrewRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 52.50_GBP, 2.50_GBP, 50, }), @@ -54,5 +53,32 @@ constexpr const RideTypeDescriptor HypercoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CORKSCREW_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_CORKSCREW_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "hypercoaster"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 20) }, + 16, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/InvertedHairpinCoaster.h b/src/openrct2/ride/coaster/meta/InvertedHairpinCoaster.h index a12d81776fb2..c4b18c553cb5 100644 --- a/src/openrct2/ride/coaster/meta/InvertedHairpinCoaster.h +++ b/src/openrct2/ride/coaster/meta/InvertedHairpinCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor InvertedHairpinCoasterRTD = SET_FIELD(Heights, { 16, 24, 24, 7, }), SET_FIELD(MaxMass, 4), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWildMouse, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateInvertedHairpinCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(BuildCosts, { 33.50_GBP, 2.00_GBP, 40, }), @@ -53,5 +52,34 @@ constexpr const RideTypeDescriptor InvertedHairpinCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_INVERTED_HAIRPIN_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_INVERTED_HAIRPIN_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "inverted_hairpin_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 00), RIDE_RATING(2, 65), RIDE_RATING(2, 25) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 8), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 102400, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 29721, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 8, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xAA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 3, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 102400, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/InvertedImpulseCoaster.h b/src/openrct2/ride/coaster/meta/InvertedImpulseCoaster.h index 9bf9cecccdba..eb15961b05cf 100644 --- a/src/openrct2/ride/coaster/meta/InvertedImpulseCoaster.h +++ b/src/openrct2/ride/coaster/meta/InvertedImpulseCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor InvertedImpulseCoasterRTD = SET_FIELD(Heights, { 45, 40, 29, 8, }), SET_FIELD(MaxMass, 23), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 7 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateInvertedImpulseCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 180, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 62.50_GBP, 2.50_GBP, 25, }), @@ -54,5 +53,30 @@ constexpr const RideTypeDescriptor InvertedImpulseCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_INVERTED_IMPULSE_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_INVERTED_IMPULSE_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "inverted_impulse_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(4, 00), RIDE_RATING(3, 00), RIDE_RATING(3, 20) }, + 20, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 42), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 29789, 55606 }, + { RatingsModifierType::BonusTurns, 0, 26749, 29552, 57186 }, + { RatingsModifierType::BonusDrops, 0, 29127, 39009, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 15291, 35108 }, + { RatingsModifierType::BonusProximity, 0, 15657, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 9760, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 20, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 29789, 55606 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h b/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h index 6a8132aacd1e..840e5c76291a 100644 --- a/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor InvertedRollerCoasterRTD = SET_FIELD(Heights, { 38, 40, 29, 8, }), SET_FIELD(MaxMass, 27), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 5, 7 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateInvertedRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 13, 3, 10 }), SET_FIELD(BuildCosts, { 65.00_GBP, 2.50_GBP, 50, }), @@ -57,5 +56,31 @@ constexpr const RideTypeDescriptor InvertedRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_INVERTED_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_INVERTED_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "inverted_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 60), RIDE_RATING(2, 80), RIDE_RATING(3, 20) }, + 17, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 42), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 29789, 55606 }, + { RatingsModifierType::BonusTurns, 0, 26749, 29552, 57186 }, + { RatingsModifierType::BonusDrops, 0, 29127, 39009, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 15291, 35108 }, + { RatingsModifierType::BonusProximity, 0, 15657, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 8366, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 30), 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 29789, 55606 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h b/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h index 7b20d2e9b26f..d0aa30e77820 100644 --- a/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor JuniorRollerCoasterRTD = SET_FIELD(Heights, { 12, 24, 4, 7, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateJuniorRollerCoaster), 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, }), @@ -56,5 +55,31 @@ constexpr const RideTypeDescriptor JuniorRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_JUNIOR_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_JUNIOR_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "junior_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 40), RIDE_RATING(2, 50), RIDE_RATING(1, 80) }, + 13, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 20480, 23831, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 25700, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 9760, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 1, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 20480, 23831, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h b/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h index a1e391046dd9..02d505fa39da 100644 --- a/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor LIMLaunchedRollerCoasterRTD = SET_FIELD(Heights, { 35, 24, 5, 7, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLimLaunchedRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 42, 20, 80, 9, 3, 10 }), SET_FIELD(BuildCosts, { 47.50_GBP, 2.50_GBP, 50, }), @@ -54,5 +53,32 @@ constexpr const RideTypeDescriptor LIMLaunchedRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LIM_LAUNCHED_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_LIM_LAUNCHED_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "lim_launched_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 90), RIDE_RATING(1, 50), RIDE_RATING(2, 20) }, + 25, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 10, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, 10, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h b/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h index cbb6a8be33f8..adaf8546a45f 100644 --- a/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor LayDownRollerCoasterRTD = SET_FIELD(Heights, { 26, 24, 8, 11, }), SET_FIELD(MaxMass, 25), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLayDownRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(BuildCosts, { 53.50_GBP, 2.50_GBP, 50, }), @@ -53,6 +52,33 @@ constexpr const RideTypeDescriptor LayDownRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LAY_DOWN_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_LAY_DOWN_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "lay_down_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 85), RIDE_RATING(1, 15), RIDE_RATING(2, 75) }, + 18, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 38130, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 4, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 38130, 49648 }, + }, + }), }; constexpr const RideTypeDescriptor LayDownRollerCoasterAltRTD = @@ -76,7 +102,6 @@ constexpr const RideTypeDescriptor LayDownRollerCoasterAltRTD = SET_FIELD(Heights, { 26, 24, 8, 11, }), SET_FIELD(MaxMass, 25), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLayDownRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(BuildCosts, { 53.50_GBP, 2.50_GBP, 50, }), @@ -92,5 +117,32 @@ constexpr const RideTypeDescriptor LayDownRollerCoasterAltRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LAY_DOWN_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_LAY_DOWN_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "lay_down_rc_alt"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 85), RIDE_RATING(1, 15), RIDE_RATING(2, 75) }, + 18, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 38130, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 4, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 38130, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h b/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h index d8337124e18e..9132ae6e3eec 100644 --- a/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor LoopingRollerCoasterRTD = SET_FIELD(Heights, { 35, 24, 5, 7, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLoopingRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 45.00_GBP, 2.50_GBP, 50, }), @@ -58,5 +57,32 @@ constexpr const RideTypeDescriptor LoopingRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LOOPING_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_LOOPING_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "looping_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 20) }, + 15, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 14, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/MineRide.h b/src/openrct2/ride/coaster/meta/MineRide.h index b119b5af0eac..ea9408c2c33c 100644 --- a/src/openrct2/ride/coaster/meta/MineRide.h +++ b/src/openrct2/ride/coaster/meta/MineRide.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor MineRideRTD = SET_FIELD(Heights, { 13, 24, 9, 11, }), SET_FIELD(MaxMass, 27), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMineRide), SET_FIELD(RatingsMultipliers, { 60, 20, 10 }), SET_FIELD(UpkeepCosts, { 50, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 42.50_GBP, 2.00_GBP, 40, }), @@ -53,5 +52,29 @@ constexpr const RideTypeDescriptor MineRideRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINE_RIDE_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINE_RIDE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mine_ride"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 75), RIDE_RATING(1, 00), RIDE_RATING(1, 80) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 29789, 49648 }, + { RatingsModifierType::BonusTurns, 0, 29721, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 19275, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 21472, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 16732, 0, 0 }, + { RatingsModifierType::RequirementLength, 0x10E0000, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 40960, 29789, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/MineTrainCoaster.h b/src/openrct2/ride/coaster/meta/MineTrainCoaster.h index 5f5b20d63a0c..dbbe57799f4a 100644 --- a/src/openrct2/ride/coaster/meta/MineTrainCoaster.h +++ b/src/openrct2/ride/coaster/meta/MineTrainCoaster.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor MineTrainCoasterRTD = SET_FIELD(Heights, { 21, 24, 4, 7, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftArrow, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMineTrainCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 41.00_GBP, 3.00_GBP, 50, }), @@ -54,6 +53,34 @@ constexpr const RideTypeDescriptor MineTrainCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINE_TRAIN_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINE_TRAIN_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mine_train_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 90), RIDE_RATING(2, 30), RIDE_RATING(2, 10) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 29721, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 19275, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 21472, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 16732, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 8, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 40960, 35746, 49648 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_MineTrainCoaster), }; diff --git a/src/openrct2/ride/coaster/meta/MiniRollerCoaster.h b/src/openrct2/ride/coaster/meta/MiniRollerCoaster.h index 5bfe53a52afb..37599209fda3 100644 --- a/src/openrct2/ride/coaster/meta/MiniRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/MiniRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor MiniRollerCoasterRTD = SET_FIELD(Heights, { 16, 24, 9, 11, }), SET_FIELD(MaxMass, 10), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMiniRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 35, 20, 80, 8, 3, 10 }), SET_FIELD(BuildCosts, { 32.50_GBP, 2.00_GBP, 40, }), @@ -54,5 +53,32 @@ constexpr const RideTypeDescriptor MiniRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINI_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINI_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mini_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 55), RIDE_RATING(2, 40), RIDE_RATING(1, 85) }, + 13, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 20480, 23831, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 25700, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 9760, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 20480, 23831, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/MiniSuspendedCoaster.h b/src/openrct2/ride/coaster/meta/MiniSuspendedCoaster.h index cbdbb2393c39..0398a729e69e 100644 --- a/src/openrct2/ride/coaster/meta/MiniSuspendedCoaster.h +++ b/src/openrct2/ride/coaster/meta/MiniSuspendedCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor MiniSuspendedCoasterRTD = SET_FIELD(Heights, { 10, 24, 24, 8, }), SET_FIELD(MaxMass, 3), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMiniSuspendedCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 30.00_GBP, 2.50_GBP, 40, }), @@ -53,5 +52,32 @@ constexpr const RideTypeDescriptor MiniSuspendedCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINI_SUSPENDED_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINI_SUSPENDED_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mini_suspended_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 80), RIDE_RATING(2, 50), RIDE_RATING(2, 70) }, + 15, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 45), RIDE_RATING(0, 15), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 34179, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 58254, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 19275, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 13943, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x80000, 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 30), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xC80000, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h b/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h index a9cd2d72eca7..60dd7591d8ee 100644 --- a/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor MultiDimensionRollerCoasterRTD = SET_FIELD(Heights, { 40, 24, 8, 11, }), SET_FIELD(MaxMass, 78), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMultiDimensionRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 75, 20, 90, 11, 3, 15 }), SET_FIELD(BuildCosts, { 90.00_GBP, 2.50_GBP, 50, }), @@ -55,6 +54,33 @@ constexpr const RideTypeDescriptor MultiDimensionRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MULTI_DIMENSION_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_MULTI_DIMENSION_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "multi_dimension_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 75), RIDE_RATING(1, 95), RIDE_RATING(4, 79) }, + 18, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 38130, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 4, 1, 1 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 1, 1 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 1, 1 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 38130, 49648 }, + }, + }), }; constexpr const RideTypeDescriptor MultiDimensionRollerCoasterAltRTD = @@ -78,7 +104,6 @@ constexpr const RideTypeDescriptor MultiDimensionRollerCoasterAltRTD = SET_FIELD(Heights, { 40, 24, 8, 11, }), SET_FIELD(MaxMass, 78), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMultiDimensionRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 75, 20, 90, 11, 3, 15 }), SET_FIELD(BuildCosts, { 90.00_GBP, 2.50_GBP, 50, }), @@ -94,5 +119,32 @@ constexpr const RideTypeDescriptor MultiDimensionRollerCoasterAltRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MULTI_DIMENSION_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_MULTI_DIMENSION_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "multi_dimension_rc_alt"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 75), RIDE_RATING(1, 95), RIDE_RATING(4, 79) }, + 18, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 38130, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementInversions, 1, 4, 1, 1 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 1, 1 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 1, 1 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 38130, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/ReverseFreefallCoaster.h b/src/openrct2/ride/coaster/meta/ReverseFreefallCoaster.h index 2b59f1a42717..1c261ff45de9 100644 --- a/src/openrct2/ride/coaster/meta/ReverseFreefallCoaster.h +++ b/src/openrct2/ride/coaster/meta/ReverseFreefallCoaster.h @@ -35,7 +35,6 @@ constexpr const RideTypeDescriptor ReverseFreefallCoasterRTD = SET_FIELD(Heights, { 255, 32, 4, 7, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateReverseFreefallCoaster), SET_FIELD(RatingsMultipliers, { 44, 66, 10 }), SET_FIELD(UpkeepCosts, { 80, 20, 0, 0, 0, 10 }), SET_FIELD(BuildCosts, { 100.00_GBP, 0.00_GBP, 45, }), @@ -51,5 +50,23 @@ constexpr const RideTypeDescriptor ReverseFreefallCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_REVERSE_FREEFALL_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_REVERSE_FREEFALL_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "reverse_freefall_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 00), RIDE_RATING(3, 20), RIDE_RATING(2, 80) }, + 25, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 327, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 60), RIDE_RATING(0, 15), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 436906, 436906, 320398 }, + { RatingsModifierType::BonusGForces, 0, 24576, 41704, 59578 }, + { RatingsModifierType::BonusSheltered, 0, 12850, 28398, 11702 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 34, 2, 2, 2 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/ReverserRollerCoaster.h b/src/openrct2/ride/coaster/meta/ReverserRollerCoaster.h index b44378323246..8610d9f92db9 100644 --- a/src/openrct2/ride/coaster/meta/ReverserRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/ReverserRollerCoaster.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor ReverserRollerCoasterRTD = SET_FIELD(Heights, { 18, 24, 8, 11, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 3, 4 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateReverserRollerCoaster), SET_FIELD(RatingsMultipliers, { 48, 28, 7 }), SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 27.50_GBP, 3.00_GBP, 37, }), @@ -51,5 +50,32 @@ constexpr const RideTypeDescriptor ReverserRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_REVERSER_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_REVERSER_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "reverser_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 40), RIDE_RATING(1, 80), RIDE_RATING(1, 70) }, + 19, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusReversals, 6, RIDE_RATING(0, 20), RIDE_RATING(0, 20), RIDE_RATING(0, 20) }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 28672, 23831, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementReversals, 1, 8, 1, 1 }, + { RatingsModifierType::RequirementLength, 0xC80000, 2, 1, 1 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 28672, 23831, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/SideFrictionRollerCoaster.h b/src/openrct2/ride/coaster/meta/SideFrictionRollerCoaster.h index a2b7ae465529..4428c32a19df 100644 --- a/src/openrct2/ride/coaster/meta/SideFrictionRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/SideFrictionRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor SideFrictionRollerCoasterRTD = SET_FIELD(Heights, { 15, 24, 4, 11, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 3, 4 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSideFrictionRollerCoaster), SET_FIELD(RatingsMultipliers, { 48, 28, 7 }), SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 27.50_GBP, 3.00_GBP, 37, }), @@ -54,5 +53,32 @@ constexpr const RideTypeDescriptor SideFrictionRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SIDE_FRICTION_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_SIDE_FRICTION_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "side_friction_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 50), RIDE_RATING(2, 00), RIDE_RATING(1, 50) }, + 19, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 28672, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x50000, 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xFA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 28672, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/SingleRailRollerCoaster.h b/src/openrct2/ride/coaster/meta/SingleRailRollerCoaster.h index a0dccda0445f..bd5653038035 100644 --- a/src/openrct2/ride/coaster/meta/SingleRailRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/SingleRailRollerCoaster.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor SingleRailRollerCoasterRTD = SET_FIELD(Heights, { 28, 24, 5, 7}), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftRMC, 5, 8 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSingleRailRollerCoaster), SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 37.50_GBP, 2.50_GBP, 50}), @@ -52,5 +51,32 @@ constexpr const RideTypeDescriptor SingleRailRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SINGLE_RAIL_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_SINGLE_RAIL_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "single_rail_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 50), RIDE_RATING(0, 60), RIDE_RATING(0, 40) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 36864, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 14, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/SpinningWildMouse.h b/src/openrct2/ride/coaster/meta/SpinningWildMouse.h index 9c9cbbf8dcee..63f23a89e96d 100644 --- a/src/openrct2/ride/coaster/meta/SpinningWildMouse.h +++ b/src/openrct2/ride/coaster/meta/SpinningWildMouse.h @@ -35,7 +35,6 @@ constexpr const RideTypeDescriptor SpinningWildMouseRTD = SET_FIELD(Heights, { 16, 24, 4, 7, }), SET_FIELD(MaxMass, 4), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWildMouse, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateWildMouse), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(BuildCosts, { 27.50_GBP, 2.00_GBP, 40, }), @@ -52,5 +51,33 @@ constexpr const RideTypeDescriptor SpinningWildMouseRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_WILD_MOUSE_TRACK, SPR_RIDE_DESIGN_PREVIEW_WILD_MOUSE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "spinning_wild_mouse"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 80), RIDE_RATING(2, 50), RIDE_RATING(2, 10) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 8), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 102400, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 29721, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xAA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 102400, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/SpiralRollerCoaster.h b/src/openrct2/ride/coaster/meta/SpiralRollerCoaster.h index 91ba5f55a9a0..54e0a5408937 100644 --- a/src/openrct2/ride/coaster/meta/SpiralRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/SpiralRollerCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor SpiralRollerCoasterRTD = SET_FIELD(Heights, { 19, 24, 9, 11, }), SET_FIELD(MaxMass, 31), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 7, 7 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSpiralRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 41, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 35.00_GBP, 2.50_GBP, 50, }), @@ -52,5 +51,32 @@ constexpr const RideTypeDescriptor SpiralRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SPIRAL_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_SPIRAL_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "spiral_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 30), RIDE_RATING(0, 30), RIDE_RATING(0, 30) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 819, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 140434, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 51366, 85019, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 400497, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 36864, 30384, 49648 }, + { RatingsModifierType::BonusTurns, 0, 28235, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 43690, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 36864, 30384, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h b/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h index bd1407502701..28815e50a7d4 100644 --- a/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor StandUpRollerCoasterRTD = SET_FIELD(Heights, { 25, 24, 9, 11, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateStandUpRollerCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 50.00_GBP, 2.50_GBP, 50, }), @@ -57,5 +56,31 @@ constexpr const RideTypeDescriptor StandUpRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_STAND_UP_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_STAND_UP_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "stand_up_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 50), RIDE_RATING(3, 00), RIDE_RATING(3, 00) }, + 17, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 10), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 123987, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 59578 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 34952, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 12850, 28398, 30427 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 50), 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 59578 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/SteelWildMouse.h b/src/openrct2/ride/coaster/meta/SteelWildMouse.h index a0dc9c337228..749136dc2e8c 100644 --- a/src/openrct2/ride/coaster/meta/SteelWildMouse.h +++ b/src/openrct2/ride/coaster/meta/SteelWildMouse.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor SteelWildMouseRTD = SET_FIELD(Heights, { 16, 24, 4, 7, }), SET_FIELD(MaxMass, 4), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWildMouse, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateWildMouse), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(BuildCosts, { 27.50_GBP, 2.00_GBP, 40, }), @@ -54,5 +53,33 @@ constexpr const RideTypeDescriptor SteelWildMouseRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_WILD_MOUSE_TRACK, SPR_RIDE_DESIGN_PREVIEW_WILD_MOUSE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "steel_wild_mouse"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 80), RIDE_RATING(2, 50), RIDE_RATING(2, 10) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 8), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 102400, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 29721, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xAA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 102400, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/Steeplechase.h b/src/openrct2/ride/coaster/meta/Steeplechase.h index cdaefd8004d4..3e7f15fb51ea 100644 --- a/src/openrct2/ride/coaster/meta/Steeplechase.h +++ b/src/openrct2/ride/coaster/meta/Steeplechase.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor SteeplechaseRTD = SET_FIELD(Heights, { 14, 24, 7, 7, }), SET_FIELD(MaxMass, 4), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSteeplechase), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 28.50_GBP, 2.00_GBP, 40, }), @@ -57,5 +56,33 @@ constexpr const RideTypeDescriptor SteeplechaseRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_STEEPLECHASE_TRACK, SPR_RIDE_DESIGN_PREVIEW_STEEPLECHASE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "steeplechase"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 70), RIDE_RATING(2, 40), RIDE_RATING(1, 80) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 75), RIDE_RATING(0, 9), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 20480, 20852, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 25700, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 9760, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 4, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x80000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xF00000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 20480, 20852, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/SuspendedSwingingCoaster.h b/src/openrct2/ride/coaster/meta/SuspendedSwingingCoaster.h index e3ef011df4f7..0dd2ea934d15 100644 --- a/src/openrct2/ride/coaster/meta/SuspendedSwingingCoaster.h +++ b/src/openrct2/ride/coaster/meta/SuspendedSwingingCoaster.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor SuspendedSwingingCoasterRTD = SET_FIELD(Heights, { 24, 40, 29, 8, }), SET_FIELD(MaxMass, 26), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSuspendedSwingingCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 20, 3, 10 }), SET_FIELD(BuildCosts, { 47.50_GBP, 2.50_GBP, 50, }), @@ -54,5 +53,33 @@ constexpr const RideTypeDescriptor SuspendedSwingingCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SUSPENDED_SWINGING_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_SUSPENDED_SWINGING_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "suspended_swinging_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 30), RIDE_RATING(2, 90), RIDE_RATING(3, 50) }, + 18, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 10), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 32768, 23831, 79437 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 48036 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6971, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 8, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xC0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 60), 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 32768, 23831, 79437 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h b/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h index 7f4138faad1d..0ff7f2be615a 100644 --- a/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor TwisterRollerCoasterRTD = SET_FIELD(Heights, { 40, 24, 8, 9, }), SET_FIELD(MaxMass, 31), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 5, 8 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateTwisterRollerCoaster), SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 60.00_GBP, 2.50_GBP, 55, }), @@ -58,5 +57,32 @@ constexpr const RideTypeDescriptor TwisterRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_TWISTER_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_TWISTER_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "twister_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 50), RIDE_RATING(0, 40), RIDE_RATING(0, 30) }, + 15, + -1, + true, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 32768, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 40), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 32768, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/VerticalDropCoaster.h b/src/openrct2/ride/coaster/meta/VerticalDropCoaster.h index 26ee2a46e35d..5ca82ac36cac 100644 --- a/src/openrct2/ride/coaster/meta/VerticalDropCoaster.h +++ b/src/openrct2/ride/coaster/meta/VerticalDropCoaster.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor VerticalDropCoasterRTD = SET_FIELD(Heights, { 53, 24, 8, 11, }), SET_FIELD(MaxMass, 25), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateVerticalDropRollerCoaster), SET_FIELD(RatingsMultipliers, { 52, 38, 10 }), SET_FIELD(UpkeepCosts, { 44, 20, 80, 11, 3, 10 }), SET_FIELD(BuildCosts, { 60.00_GBP, 2.50_GBP, 42, }), @@ -54,5 +53,31 @@ constexpr const RideTypeDescriptor VerticalDropCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_VERTICAL_DROP_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_VERTICAL_DROP_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "vertical_drop_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 20), RIDE_RATING(0, 80), RIDE_RATING(0, 30) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 4000, 1146, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 97418, 141699, 70849 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 58254, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 20, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 1, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 40960, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/VirginiaReel.h b/src/openrct2/ride/coaster/meta/VirginiaReel.h index b66febfb2524..c5bc3d284fd4 100644 --- a/src/openrct2/ride/coaster/meta/VirginiaReel.h +++ b/src/openrct2/ride/coaster/meta/VirginiaReel.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor VirginiaReelRTD = SET_FIELD(Heights, { 14, 24, 6, 7, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 3, 4 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateVirginiaReel), SET_FIELD(RatingsMultipliers, { 30, 15, 25 }), SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 26.50_GBP, 3.00_GBP, 25, }), @@ -52,5 +51,30 @@ constexpr const RideTypeDescriptor VirginiaReelRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_VIRGINIA_REEL_TRACK, SPR_RIDE_DESIGN_PREVIEW_VIRGINIA_REEL_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "virginia_reel"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 10), RIDE_RATING(1, 90), RIDE_RATING(3, 70) }, + 19, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 110592, 29789, 59578 }, + { RatingsModifierType::BonusTurns, 0, 52012, 26075, 45749 }, + { RatingsModifierType::BonusDrops, 0, 43690, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xD20000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 110592, 29789, 59578 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/WaterCoaster.h b/src/openrct2/ride/coaster/meta/WaterCoaster.h index 5c6962260c9e..3bed25612c80 100644 --- a/src/openrct2/ride/coaster/meta/WaterCoaster.h +++ b/src/openrct2/ride/coaster/meta/WaterCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor WaterCoasterRTD = SET_FIELD(Heights, { 18, 24, 4, 7, }), SET_FIELD(MaxMass, 13), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateWaterCoaster), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 60, 20, 80, 8, 3, 10 }), SET_FIELD(BuildCosts, { 27.50_GBP, 2.00_GBP, 40, }), @@ -54,6 +53,33 @@ constexpr const RideTypeDescriptor WaterCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_WATER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_WATER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "water_coaster"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 70), RIDE_RATING(2, 80), RIDE_RATING(2, 10) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 20480, 23831, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 25700, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 9760, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 8, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 1, 2, 2, 2 }, + { RatingsModifierType::RequirementSplashdown, 0, 8, 1, 1 }, + { RatingsModifierType::PenaltyLateralGs, 0, 20480, 23831, 49648 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h b/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h index 9b8a151aee10..9ffc82593d30 100644 --- a/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/WoodenRollerCoaster.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor WoodenRollerCoasterRTD = SET_FIELD(Heights, { 41, 24, 8, 11, }), SET_FIELD(MaxMass, 19), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 5, 7 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateWoodenRollerCoaster), SET_FIELD(RatingsMultipliers, { 52, 33, 8 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(BuildCosts, { 37.50_GBP, 3.50_GBP, 50, }), @@ -56,5 +55,33 @@ constexpr const RideTypeDescriptor WoodenRollerCoasterRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_WOODEN_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_WOODEN_ROLLER_COASTER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "wooden_rc"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 20), RIDE_RATING(2, 60), RIDE_RATING(2, 00) }, + 19, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 34555, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 40960, 34555, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/coaster/meta/WoodenWildMouse.h b/src/openrct2/ride/coaster/meta/WoodenWildMouse.h index 8e854f4f6ec8..006d37e274e1 100644 --- a/src/openrct2/ride/coaster/meta/WoodenWildMouse.h +++ b/src/openrct2/ride/coaster/meta/WoodenWildMouse.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor WoodenWildMouseRTD = SET_FIELD(Heights, { 14, 24, 4, 7, }), SET_FIELD(MaxMass, 4), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateWoodenWildMouse), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(BuildCosts, { 25.00_GBP, 3.00_GBP, 40, }), @@ -54,5 +53,34 @@ constexpr const RideTypeDescriptor WoodenWildMouseRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_WOODEN_WILD_MOUSE_TRACK, SPR_RIDE_DESIGN_PREVIEW_WOODEN_WILD_MOUSE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "wooden_wild_mouse"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 90), RIDE_RATING(2, 90), RIDE_RATING(2, 10) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 8), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 102400, 35746, 49648 }, + { RatingsModifierType::BonusTurns, 0, 29721, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 8, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementLateralGs, FIXED_2DP(1, 50), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xAA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 3, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 102400, 35746, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/CarRide.h b/src/openrct2/ride/gentle/meta/CarRide.h index c963301e85fa..a26d559d46a7 100644 --- a/src/openrct2/ride/gentle/meta/CarRide.h +++ b/src/openrct2/ride/gentle/meta/CarRide.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor CarRideRTD = SET_FIELD(Heights, { 6, 24, 4, 7, }), SET_FIELD(MaxMass, 2), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCarRide), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }), SET_FIELD(BuildCosts, { 12.50_GBP, 2.50_GBP, 30, }), @@ -63,6 +62,28 @@ constexpr const RideTypeDescriptor CarRideRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CAR_RIDE_TRACK, SPR_RIDE_DESIGN_PREVIEW_CAR_RIDE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "car_ride"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 00) }, + 12, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 15), RIDE_RATING(0, 00), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 14860, 0, 11437 }, + { RatingsModifierType::BonusDrops, 0, 8738, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 12850, 6553, 4681 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 8366, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xC80000, 8, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/gentle/meta/Circus.h b/src/openrct2/ride/gentle/meta/Circus.h index 386406292ebe..3132d8d7ce1d 100644 --- a/src/openrct2/ride/gentle/meta/Circus.h +++ b/src/openrct2/ride/gentle/meta/Circus.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor CircusRTD = SET_FIELD(Heights, { 12, 128, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCircus), SET_FIELD(RatingsMultipliers, { 20, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 62.50_GBP, 1.00_GBP, 1, }), @@ -50,6 +49,15 @@ constexpr const RideTypeDescriptor CircusRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "circus"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(2, 10), RIDE_RATING(0, 30), RIDE_RATING(0, 0) }, + 9, + 7, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::CircusStartRideMusicChannel), diff --git a/src/openrct2/ride/gentle/meta/CrookedHouse.h b/src/openrct2/ride/gentle/meta/CrookedHouse.h index ef962e7f6ef2..9a4105bb7958 100644 --- a/src/openrct2/ride/gentle/meta/CrookedHouse.h +++ b/src/openrct2/ride/gentle/meta/CrookedHouse.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor CrookedHouseRTD = SET_FIELD(Heights, { 16, 96, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCrookedHouse), SET_FIELD(RatingsMultipliers, { 15, 8, 0 }), SET_FIELD(UpkeepCosts, { 30, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 32.50_GBP, 1.00_GBP, 1, }), @@ -52,5 +51,14 @@ constexpr const RideTypeDescriptor CrookedHouseRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "crooked_house"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(2, 15), RIDE_RATING(0, 62), RIDE_RATING(0, 34) }, + 5, + 7, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/Dodgems.h b/src/openrct2/ride/gentle/meta/Dodgems.h index e73765afbcde..5cf3ae6b2776 100644 --- a/src/openrct2/ride/gentle/meta/Dodgems.h +++ b/src/openrct2/ride/gentle/meta/Dodgems.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor DodgemsRTD = SET_FIELD(Heights, { 9, 48, 2, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateDodgems), SET_FIELD(RatingsMultipliers, { 40, 20, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 5, 0, 0 }), SET_FIELD(BuildCosts, { 27.50_GBP, 1.00_GBP, 1, }), @@ -57,6 +56,20 @@ constexpr const RideTypeDescriptor DodgemsRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_DODGEMS_TRACK, SPR_RIDE_DESIGN_PREVIEW_DODGEMS_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "dodgems"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 30), RIDE_RATING(0, 50), RIDE_RATING(0, 35) }, + 16, + 7, + false, + { + // Special case, passing -2 to represent division by 2 + { RatingsModifierType::BonusOperationOption, 0, 1, -2, 0 }, + { RatingsModifierType::BonusNumTrains, 4, RIDE_RATING(0, 80), 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/gentle/meta/FerrisWheel.h b/src/openrct2/ride/gentle/meta/FerrisWheel.h index e22f5d9fc652..453f65985670 100644 --- a/src/openrct2/ride/gentle/meta/FerrisWheel.h +++ b/src/openrct2/ride/gentle/meta/FerrisWheel.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor FerrisWheelRTD = SET_FIELD(Heights, { 16, 176, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateFerrisWheel), SET_FIELD(RatingsMultipliers, { 60, 20, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 112.50_GBP, 1.00_GBP, 1, }), @@ -53,5 +52,17 @@ constexpr const RideTypeDescriptor FerrisWheelRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_FERRIS_WHEEL_TRACK, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "ferris_wheel"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(0, 60), RIDE_RATING(0, 25), RIDE_RATING(0, 30) }, + 16, + 0, + false, + { + { RatingsModifierType::BonusRotations, 0, 25, 25, 25 }, + { RatingsModifierType::BonusScenery, 0, 41831, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/FlyingSaucers.h b/src/openrct2/ride/gentle/meta/FlyingSaucers.h index d7bbfe9b0d17..e9308d823d35 100644 --- a/src/openrct2/ride/gentle/meta/FlyingSaucers.h +++ b/src/openrct2/ride/gentle/meta/FlyingSaucers.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor FlyingSaucersRTD = SET_FIELD(Heights, { 9, 48, 2, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateFlyingSaucers), SET_FIELD(RatingsMultipliers, { 50, 25, 0 }), SET_FIELD(UpkeepCosts, { 90, 1, 0, 5, 0, 0 }), SET_FIELD(BuildCosts, { 35.00_GBP, 2.00_GBP, 1, }), @@ -56,5 +55,19 @@ constexpr const RideTypeDescriptor FlyingSaucersRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_FLYING_SAUCERS_TRACK, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "flying_saucers"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(2, 40), RIDE_RATING(0, 55), RIDE_RATING(0, 39) }, + 32, + 0, + false, + { + // Special case, passing -2 to represent division by 2 + { RatingsModifierType::BonusOperationOption, 0, 1, -2, 0 }, + { RatingsModifierType::BonusNumTrains, 4, RIDE_RATING(0, 80), 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/GhostTrain.h b/src/openrct2/ride/gentle/meta/GhostTrain.h index dd8d2ad93910..dc506379b9db 100644 --- a/src/openrct2/ride/gentle/meta/GhostTrain.h +++ b/src/openrct2/ride/gentle/meta/GhostTrain.h @@ -42,7 +42,6 @@ constexpr const RideTypeDescriptor GhostTrainRTD = SET_FIELD(Heights, { 8, 24, 6, 7, }), SET_FIELD(MaxMass, 2), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateGhostTrain), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(UpkeepCosts, { 80, 20, 0, 8, 3, 5 }), SET_FIELD(BuildCosts, { 13.00_GBP, 2.50_GBP, 30, }), @@ -59,6 +58,27 @@ constexpr const RideTypeDescriptor GhostTrainRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_GHOST_TRAIN_TRACK, SPR_RIDE_DESIGN_PREVIEW_GHOST_TRAIN_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "ghost_train"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 00), RIDE_RATING(0, 20), RIDE_RATING(0, 03) }, + 12, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 15), RIDE_RATING(0, 00), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 14860, 0, 11437 }, + { RatingsModifierType::BonusDrops, 0, 8738, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 25700, 6553, 4681 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 8366, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xB40000, 2, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_MineTrainCoaster), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/gentle/meta/HauntedHouse.h b/src/openrct2/ride/gentle/meta/HauntedHouse.h index 34f70e7315a5..1e33059fe7e1 100644 --- a/src/openrct2/ride/gentle/meta/HauntedHouse.h +++ b/src/openrct2/ride/gentle/meta/HauntedHouse.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor HauntedHouseRTD = SET_FIELD(Heights, { 16, 160, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateHauntedHouse), SET_FIELD(RatingsMultipliers, { 20, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 42.50_GBP, 1.00_GBP, 1, }), @@ -50,5 +49,14 @@ constexpr const RideTypeDescriptor HauntedHouseRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "haunted_house"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(3, 41), RIDE_RATING(1, 53), RIDE_RATING(0, 10) }, + 8, + 7, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/Maze.h b/src/openrct2/ride/gentle/meta/Maze.h index 2e09d7e172a2..92772f7fd5ff 100644 --- a/src/openrct2/ride/gentle/meta/Maze.h +++ b/src/openrct2/ride/gentle/meta/Maze.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor MazeRTD = SET_FIELD(Heights, { 6, 24, 0, 1, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMaze), SET_FIELD(RatingsMultipliers, { 50, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 27.50_GBP, 1.00_GBP, 8, }), @@ -52,6 +51,18 @@ constexpr const RideTypeDescriptor MazeRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "maze"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 30), RIDE_RATING(0, 50), RIDE_RATING(0, 00) }, + 8, + 0, + false, + { + { RatingsModifierType::BonusMazeSize, 100, 1, 2, 0 }, + { RatingsModifierType::BonusScenery, 0, 22310, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/gentle/meta/MerryGoRound.h b/src/openrct2/ride/gentle/meta/MerryGoRound.h index aed7ea8be342..bee3a74958f4 100644 --- a/src/openrct2/ride/gentle/meta/MerryGoRound.h +++ b/src/openrct2/ride/gentle/meta/MerryGoRound.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor MerryGoRoundRTD = SET_FIELD(Heights, { 12, 64, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMerryGoRound), SET_FIELD(RatingsMultipliers, { 50, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 57.50_GBP, 1.00_GBP, 1, }), @@ -50,5 +49,17 @@ constexpr const RideTypeDescriptor MerryGoRoundRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "merry_go_round"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(0, 60), RIDE_RATING(0, 15), RIDE_RATING(0, 30) }, + 16, + 7, + false, + { + { RatingsModifierType::BonusRotations, 0, 5, 5, 5 }, + { RatingsModifierType::BonusScenery, 0, 19521, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/MiniGolf.h b/src/openrct2/ride/gentle/meta/MiniGolf.h index 95e7b011c40b..ff93fd3badf3 100644 --- a/src/openrct2/ride/gentle/meta/MiniGolf.h +++ b/src/openrct2/ride/gentle/meta/MiniGolf.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor MiniGolfRTD = SET_FIELD(Heights, { 7, 32, 2, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMiniGolf), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 30, 60, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 25.00_GBP, 3.50_GBP, 20, }), @@ -52,6 +51,23 @@ constexpr const RideTypeDescriptor MiniGolfRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINI_GOLF_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINI_GOLF_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mini_golf"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 50), RIDE_RATING(0, 90), RIDE_RATING(0, 00) }, + 0, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 14860, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 5140, 6553, 4681 }, + { RatingsModifierType::BonusProximity, 0, 15657, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 27887, 0, 0 }, + { RatingsModifierType::BonusHoles, 0, 5, 0, 0 }, + { RatingsModifierType::RequirementHoles, 1, 8, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/gentle/meta/MiniHelicopters.h b/src/openrct2/ride/gentle/meta/MiniHelicopters.h index d34f4d8a47ed..cf7fcf963416 100644 --- a/src/openrct2/ride/gentle/meta/MiniHelicopters.h +++ b/src/openrct2/ride/gentle/meta/MiniHelicopters.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor MiniHelicoptersRTD = SET_FIELD(Heights, { 7, 24, 4, 7, }), SET_FIELD(MaxMass, 2), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMiniHelicopters), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }), SET_FIELD(BuildCosts, { 12.50_GBP, 2.50_GBP, 30, }), @@ -59,6 +58,28 @@ constexpr const RideTypeDescriptor MiniHelicoptersRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINI_HELICOPTERS_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINI_HELICOPTERS_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mini_helicopters"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 60), RIDE_RATING(0, 40), RIDE_RATING(0, 00) }, + 12, + 6, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 15), RIDE_RATING(0, 00), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 14860, 0, 4574 }, + { RatingsModifierType::BonusDrops, 0, 8738, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 12850, 6553, 4681 }, + { RatingsModifierType::BonusProximity, 0, 8946, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 8366, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xA00000, 2, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/gentle/meta/MonorailCycles.h b/src/openrct2/ride/gentle/meta/MonorailCycles.h index 8ba17eab6480..bb265fbed6d4 100644 --- a/src/openrct2/ride/gentle/meta/MonorailCycles.h +++ b/src/openrct2/ride/gentle/meta/MonorailCycles.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor MonorailCyclesRTD = SET_FIELD(Heights, { 5, 24, 8, 7, }), SET_FIELD(MaxMass, 2), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMonorailCycles), SET_FIELD(RatingsMultipliers, { 50, 10, 10 }), SET_FIELD(UpkeepCosts, { 47, 20, 0, 8, 3, 5 }), SET_FIELD(BuildCosts, { 10.00_GBP, 2.50_GBP, 30, }), @@ -55,6 +54,28 @@ constexpr const RideTypeDescriptor MonorailCyclesRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MONORAIL_CYCLES_TRACK, SPR_RIDE_DESIGN_PREVIEW_MONORAIL_CYCLES_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "monorail_cycles"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 40), RIDE_RATING(0, 20), RIDE_RATING(0, 00) }, + 4, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 15), RIDE_RATING(0, 00), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 14860, 0, 4574 }, + { RatingsModifierType::BonusDrops, 0, 8738, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 5140, 6553, 2340 }, + { RatingsModifierType::BonusProximity, 0, 8946, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementLength, 0x8C0000, 2, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/gentle/meta/MonsterTrucks.h b/src/openrct2/ride/gentle/meta/MonsterTrucks.h index 505345df0198..7ce9b5f59799 100644 --- a/src/openrct2/ride/gentle/meta/MonsterTrucks.h +++ b/src/openrct2/ride/gentle/meta/MonsterTrucks.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor MonsterTrucksRTD = SET_FIELD(Heights, { 18, 24, 4, 7, }), SET_FIELD(MaxMass, 2), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCarRide), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }), SET_FIELD(BuildCosts, { 12.50_GBP, 2.50_GBP, 30, }), @@ -57,6 +56,28 @@ constexpr const RideTypeDescriptor MonsterTrucksRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CAR_RIDE_TRACK, SPR_RIDE_DESIGN_PREVIEW_CAR_RIDE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "monster_trucks"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 00), RIDE_RATING(0, 50), RIDE_RATING(0, 00) }, + 12, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 15), RIDE_RATING(0, 00), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 14860, 0, 11437 }, + { RatingsModifierType::BonusDrops, 0, 8738, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 12850, 6553, 4681 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 8366, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xC80000, 8, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/gentle/meta/ObservationTower.h b/src/openrct2/ride/gentle/meta/ObservationTower.h index 3930110efc1b..b87c0d8f5e70 100644 --- a/src/openrct2/ride/gentle/meta/ObservationTower.h +++ b/src/openrct2/ride/gentle/meta/ObservationTower.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor ObservationTowerRTD = SET_FIELD(Heights, { 255, 32, 3, 2, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateObservationTower), SET_FIELD(RatingsMultipliers, { 80, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 20, 0, 10, 0, 0 }), SET_FIELD(BuildCosts, { 18.50_GBP, 0.00_GBP, 4, }), @@ -54,6 +53,20 @@ constexpr const RideTypeDescriptor ObservationTowerRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_OBSERVATION_TOWER_TRACK, SPR_RIDE_DESIGN_PREVIEW_OBSERVATION_TOWER_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "observation_tower"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 50), RIDE_RATING(0, 00), RIDE_RATING(0, 10) }, + 15, + 7, + false, + { + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 83662, 0, 0 }, + { RatingsModifierType::BonusTowerRide, 0, 45875, 0, 26214 }, + { RatingsModifierType::RequirementUnsheltered, 5, 4, 1, 1 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_ObservationTower), }; diff --git a/src/openrct2/ride/gentle/meta/SpaceRings.h b/src/openrct2/ride/gentle/meta/SpaceRings.h index 74308527e8d4..5bc6ae601784 100644 --- a/src/openrct2/ride/gentle/meta/SpaceRings.h +++ b/src/openrct2/ride/gentle/meta/SpaceRings.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor SpaceRingsRTD = SET_FIELD(Heights, { 16, 48, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSpaceRings), SET_FIELD(RatingsMultipliers, { 12, 4, 4 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 36.00_GBP, 1.00_GBP, 1, }), @@ -50,5 +49,16 @@ constexpr const RideTypeDescriptor SpaceRingsRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "space_rings"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 50), RIDE_RATING(2, 10), RIDE_RATING(6, 50) }, + 7, + 0, + false, + { + { RatingsModifierType::BonusScenery, 0, 25098, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/SpiralSlide.h b/src/openrct2/ride/gentle/meta/SpiralSlide.h index a1631acbd4b8..1d57a2ba20c7 100644 --- a/src/openrct2/ride/gentle/meta/SpiralSlide.h +++ b/src/openrct2/ride/gentle/meta/SpiralSlide.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor SpiralSlideRTD = SET_FIELD(Heights, { 15, 128, 0, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSpiralSlide), SET_FIELD(RatingsMultipliers, { 50, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 82.50_GBP, 1.00_GBP, 1, }), @@ -55,6 +54,18 @@ constexpr const RideTypeDescriptor SpiralSlideRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SPIRAL_SLIDE_TRACK, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "spiral_slide"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 50), RIDE_RATING(1, 40), RIDE_RATING(0, 90) }, + 8, + 2, + false, + { + { RatingsModifierType::BonusSlideUnlimitedRides, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 20), RIDE_RATING(0, 25) }, + { RatingsModifierType::BonusScenery, 0, 25098, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/CashMachine.h b/src/openrct2/ride/shops/meta/CashMachine.h index 8af5f9a1bc7a..9777b990eb95 100644 --- a/src/openrct2/ride/shops/meta/CashMachine.h +++ b/src/openrct2/ride/shops/meta/CashMachine.h @@ -35,7 +35,6 @@ constexpr const RideTypeDescriptor CashMachineRTD = SET_FIELD(Heights, { 12, DefaultCashMachineHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateCashMachine), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 40, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 200.00_GBP, 0.00_GBP, 1, }), @@ -47,6 +46,15 @@ constexpr const RideTypeDescriptor CashMachineRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::CashMachine), SET_FIELD(Name, "cash_machine"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/DrinkStall.h b/src/openrct2/ride/shops/meta/DrinkStall.h index eeb7ff390df4..5d3e9e7686cc 100644 --- a/src/openrct2/ride/shops/meta/DrinkStall.h +++ b/src/openrct2/ride/shops/meta/DrinkStall.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor DrinkStallRTD = SET_FIELD(Heights, { 12, DefaultDrinksStallHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateDrinkStall), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 250.00_GBP, 0.00_GBP, 1, }), @@ -48,6 +47,15 @@ constexpr const RideTypeDescriptor DrinkStallRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Drink), SET_FIELD(Name, "drink_stall"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/FirstAid.h b/src/openrct2/ride/shops/meta/FirstAid.h index 28fed938937b..f3dc8ea1dab3 100644 --- a/src/openrct2/ride/shops/meta/FirstAid.h +++ b/src/openrct2/ride/shops/meta/FirstAid.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor FirstAidRTD = SET_FIELD(Heights, { 12, DefaultFirstAidHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateFirstAid), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 45, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 250.00_GBP, 0.00_GBP, 1, }), @@ -48,6 +47,15 @@ constexpr const RideTypeDescriptor FirstAidRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::FirstAid), SET_FIELD(Name, "first_aid"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/FoodStall.h b/src/openrct2/ride/shops/meta/FoodStall.h index 87a2dc0a7d3b..95c4d05e00c5 100644 --- a/src/openrct2/ride/shops/meta/FoodStall.h +++ b/src/openrct2/ride/shops/meta/FoodStall.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor FoodStallRTD = SET_FIELD(Heights, { 12, DefaultFoodStallHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateFoodStall), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 300.00_GBP, 0.00_GBP, 1, }), @@ -48,6 +47,15 @@ constexpr const RideTypeDescriptor FoodStallRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Food), SET_FIELD(Name, "food_stall"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/InformationKiosk.h b/src/openrct2/ride/shops/meta/InformationKiosk.h index e896b35d3f96..a8a32d78fe9c 100644 --- a/src/openrct2/ride/shops/meta/InformationKiosk.h +++ b/src/openrct2/ride/shops/meta/InformationKiosk.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor InformationKioskRTD = SET_FIELD(Heights, { 12, DefaultInformationKioskHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateInformationKiosk), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 250.00_GBP, 0.00_GBP, 1, }), @@ -48,6 +47,15 @@ constexpr const RideTypeDescriptor InformationKioskRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::InfoKiosk), SET_FIELD(Name, "information_kiosk"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/Shop.h b/src/openrct2/ride/shops/meta/Shop.h index bf53ebdfa450..508eebd52a21 100644 --- a/src/openrct2/ride/shops/meta/Shop.h +++ b/src/openrct2/ride/shops/meta/Shop.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor ShopRTD = SET_FIELD(Heights, { 12, DefaultShopHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateShop), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 200.00_GBP, 0.00_GBP, 1, }), @@ -48,6 +47,15 @@ constexpr const RideTypeDescriptor ShopRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Shop), SET_FIELD(Name, "shop"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/shops/meta/Toilets.h b/src/openrct2/ride/shops/meta/Toilets.h index f97f3a86cb94..a04101289e0e 100644 --- a/src/openrct2/ride/shops/meta/Toilets.h +++ b/src/openrct2/ride/shops/meta/Toilets.h @@ -36,7 +36,6 @@ constexpr const RideTypeDescriptor ToiletsRTD = SET_FIELD(Heights, { 12, DefaultToiletHeight, 0, 0, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateToilets), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 225.00_GBP, 0.00_GBP, 1, }), @@ -48,6 +47,15 @@ constexpr const RideTypeDescriptor ToiletsRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Toilets), SET_FIELD(Name, "toilets"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Stall, + { 1, 1, 1 }, + 1, + -1, + false, + { { RatingsModifierType::NoModifier, 0, 0, 0, 0 } } + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/thrill/meta/3DCinema.h b/src/openrct2/ride/thrill/meta/3DCinema.h index b664a854f30b..2f9c97b723d1 100644 --- a/src/openrct2/ride/thrill/meta/3DCinema.h +++ b/src/openrct2/ride/thrill/meta/3DCinema.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor CinemaRTD = SET_FIELD(Heights, { 12, 128, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculate3dCinema), SET_FIELD(RatingsMultipliers, { 20, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 70.00_GBP, 1.00_GBP, 1, }), @@ -50,5 +49,16 @@ constexpr const RideTypeDescriptor CinemaRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "3d_cinema"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { 1, 1, 1 }, + 21, + 7, + false, + { + { RatingsModifierType::Bonus3DCinemaMode, 0, 0, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/Enterprise.h b/src/openrct2/ride/thrill/meta/Enterprise.h index 5e1569e8514e..39f0a100984d 100644 --- a/src/openrct2/ride/thrill/meta/Enterprise.h +++ b/src/openrct2/ride/thrill/meta/Enterprise.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor EnterpriseRTD = SET_FIELD(Heights, { 16, 160, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateEnterprise), SET_FIELD(RatingsMultipliers, { 50, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 50.00_GBP, 1.00_GBP, 1, }), @@ -50,6 +49,18 @@ constexpr const RideTypeDescriptor EnterpriseRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "enterprise"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(3, 60), RIDE_RATING(4, 55), RIDE_RATING(5, 72) }, + 22, + 3, + false, + { + { RatingsModifierType::BonusOperationOption, 0, 1, 16, 16 }, + { RatingsModifierType::BonusScenery, 0, 19521, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingEnterprise), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/thrill/meta/GoKarts.h b/src/openrct2/ride/thrill/meta/GoKarts.h index 85a393ca1f26..6eecb2cb98cd 100644 --- a/src/openrct2/ride/thrill/meta/GoKarts.h +++ b/src/openrct2/ride/thrill/meta/GoKarts.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor GoKartsRTD = SET_FIELD(Heights, { 7, 24, 2, 1, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateGoKarts), SET_FIELD(RatingsMultipliers, { 120, 20, 0 }), SET_FIELD(UpkeepCosts, { 50, 20, 0, 8, 0, 0 }), SET_FIELD(BuildCosts, { 31.00_GBP, 2.00_GBP, 20, }), @@ -55,6 +54,24 @@ constexpr const RideTypeDescriptor GoKartsRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_GO_KARTS_TRACK, SPR_RIDE_DESIGN_PREVIEW_GO_KARTS_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "go_karts"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 42), RIDE_RATING(1, 73), RIDE_RATING(0, 40) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 700, 32768, 0, 0 }, + { RatingsModifierType::BonusGoKartRace, 4, RIDE_RATING(1, 40), RIDE_RATING(0, 50), 0 }, + { RatingsModifierType::BonusTurns, 0, 4458, 3476, 5718 }, + { RatingsModifierType::BonusDrops, 0, 8738, 5461, 6553 }, + { RatingsModifierType::BonusSheltered, 0, 2570, 8738, 2340 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 16732, 0, 0 }, + { RatingsModifierType::RequirementUnsheltered, 6, 2, 1, 1 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/thrill/meta/LaunchedFreefall.h b/src/openrct2/ride/thrill/meta/LaunchedFreefall.h index 7e63f0a5d427..b5644ab2e6b8 100644 --- a/src/openrct2/ride/thrill/meta/LaunchedFreefall.h +++ b/src/openrct2/ride/thrill/meta/LaunchedFreefall.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor LaunchedFreefallRTD = SET_FIELD(Heights, { 255, 32, 3, 2, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLaunchedFreefall), SET_FIELD(RatingsMultipliers, { 50, 50, 10 }), SET_FIELD(UpkeepCosts, { 50, 20, 0, 10, 0, 0 }), SET_FIELD(BuildCosts, { 25.00_GBP, 0.00_GBP, 4, }), @@ -53,5 +52,19 @@ constexpr const RideTypeDescriptor LaunchedFreefallRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LAUNCHED_FREEFALL_TRACK, SPR_RIDE_DESIGN_PREVIEW_LAUNCHED_FREEFALL_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "launched_freefall"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 70), RIDE_RATING(3, 00), RIDE_RATING(3, 50) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusDownwardLaunch, 0, RIDE_RATING(0, 30), RIDE_RATING(0, 65), RIDE_RATING(0, 45) }, + { RatingsModifierType::BonusLaunchedFreefallSpecial, 0, 0, 1355917, 451972 }, + { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 25098, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/MagicCarpet.h b/src/openrct2/ride/thrill/meta/MagicCarpet.h index 2720774b7cb8..ba3c09829d7a 100644 --- a/src/openrct2/ride/thrill/meta/MagicCarpet.h +++ b/src/openrct2/ride/thrill/meta/MagicCarpet.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor MagicCarpetRTD = SET_FIELD(Heights, { 15, 176, 7, 11, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMagicCarpet), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 99.00_GBP, 1.00_GBP, 1, }), @@ -55,5 +54,17 @@ constexpr const RideTypeDescriptor MagicCarpetRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MAGIC_CARPET_TRACK, SPR_RIDE_DESIGN_PREVIEW_MAGIC_CARPET_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "magic_carpet"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(2, 45), RIDE_RATING(1, 60), RIDE_RATING(2, 60) }, + 16, + 0, + false, + { + { RatingsModifierType::BonusOperationOption, 0, 10, 20, 20 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/MotionSimulator.h b/src/openrct2/ride/thrill/meta/MotionSimulator.h index aaec99840850..d3e33c94c785 100644 --- a/src/openrct2/ride/thrill/meta/MotionSimulator.h +++ b/src/openrct2/ride/thrill/meta/MotionSimulator.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor MotionSimulatorRTD = SET_FIELD(Heights, { 12, 64, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMotionSimulator), SET_FIELD(RatingsMultipliers, { 24, 20, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 110.00_GBP, 1.00_GBP, 1, }), @@ -50,6 +49,17 @@ constexpr const RideTypeDescriptor MotionSimulatorRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "motion_simulator"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { 1, 1, 1 }, + 21, + 7, + false, + { + { RatingsModifierType::BonusMotionSimulatorMode, 0, 0, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/thrill/meta/RotoDrop.h b/src/openrct2/ride/thrill/meta/RotoDrop.h index c1fc18255d6b..34caa17903bb 100644 --- a/src/openrct2/ride/thrill/meta/RotoDrop.h +++ b/src/openrct2/ride/thrill/meta/RotoDrop.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor RotoDropRTD = SET_FIELD(Heights, { 255, 32, 3, 2, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateRotoDrop), SET_FIELD(RatingsMultipliers, { 50, 50, 10 }), SET_FIELD(UpkeepCosts, { 50, 20, 0, 10, 0, 0 }), SET_FIELD(BuildCosts, { 22.50_GBP, 0.00_GBP, 4, }), @@ -54,5 +53,18 @@ constexpr const RideTypeDescriptor RotoDropRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_ROTO_DROP_TRACK, SPR_RIDE_DESIGN_PREVIEW_ROTO_DROP_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "roto_drop"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 80), RIDE_RATING(3, 50), RIDE_RATING(3, 50) }, + 24, + -1, + false, + { + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 25098, 0, 0 }, + { RatingsModifierType::BonusRotoDrop, 0, 0, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/SwingingInverterShip.h b/src/openrct2/ride/thrill/meta/SwingingInverterShip.h index cd55609c1cd3..51c8fdb11039 100644 --- a/src/openrct2/ride/thrill/meta/SwingingInverterShip.h +++ b/src/openrct2/ride/thrill/meta/SwingingInverterShip.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor SwingingInverterShipRTD = SET_FIELD(Heights, { 15, 176, 7, 11, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateInverterShip), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 106.00_GBP, 1.00_GBP, 1, }), @@ -53,5 +52,17 @@ constexpr const RideTypeDescriptor SwingingInverterShipRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SWINGING_INVERTER_SHIP_TRACK, SPR_RIDE_DESIGN_PREVIEW_SWINGING_INVERTER_SHIP_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "swinging_inverter_ship"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(2, 50), RIDE_RATING(2, 70), RIDE_RATING(2, 74) }, + 16, + 0, + false, + { + { RatingsModifierType::BonusOperationOption, 0, 11, 22, 22 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/SwingingShip.h b/src/openrct2/ride/thrill/meta/SwingingShip.h index 55fc165d68f5..1bf9374e597d 100644 --- a/src/openrct2/ride/thrill/meta/SwingingShip.h +++ b/src/openrct2/ride/thrill/meta/SwingingShip.h @@ -39,7 +39,6 @@ constexpr const RideTypeDescriptor SwingingShipRTD = SET_FIELD(Heights, { 12, 112, 7, 11, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSwingingShip), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 77.50_GBP, 1.00_GBP, 1, }), @@ -53,5 +52,17 @@ constexpr const RideTypeDescriptor SwingingShipRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SWINGING_SHIP_TRACK, SPR_RIDE_DESIGN_PREVIEW_SWINGING_SHIP_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "swinging_ship"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 50), RIDE_RATING(1, 90), RIDE_RATING(1, 41) }, + 10, + 0, + false, + { + { RatingsModifierType::BonusOperationOption, 0, 5, 5, 10 }, + { RatingsModifierType::BonusScenery, 0, 16732, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/TopSpin.h b/src/openrct2/ride/thrill/meta/TopSpin.h index 7fe761b86807..5e5085d1c2fe 100644 --- a/src/openrct2/ride/thrill/meta/TopSpin.h +++ b/src/openrct2/ride/thrill/meta/TopSpin.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor TopSpinRTD = SET_FIELD(Heights, { 16, 112, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateTopSpin), SET_FIELD(RatingsMultipliers, { 24, 20, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 72.50_GBP, 1.00_GBP, 1, }), @@ -54,5 +53,17 @@ constexpr const RideTypeDescriptor TopSpinRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_TOP_SPIN_TRACK, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "top_spin"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { 1, 1, 1 }, + 19, + 0, + false, + { + { RatingsModifierType::BonusTopSpinMode, 0, 0, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/thrill/meta/Twist.h b/src/openrct2/ride/thrill/meta/Twist.h index 854d00f2a366..b122c9cfed3d 100644 --- a/src/openrct2/ride/thrill/meta/Twist.h +++ b/src/openrct2/ride/thrill/meta/Twist.h @@ -37,7 +37,6 @@ constexpr const RideTypeDescriptor TwistRTD = SET_FIELD(Heights, { 12, 64, 3, 2, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateTwist), SET_FIELD(RatingsMultipliers, { 40, 20, 10 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(BuildCosts, { 45.00_GBP, 1.00_GBP, 1, }), @@ -49,5 +48,17 @@ constexpr const RideTypeDescriptor TwistRTD = SET_FIELD(ColourPreview, { 0, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "twist"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::FlatRide, + { RIDE_RATING(1, 13), RIDE_RATING(0, 97), RIDE_RATING(1, 90) }, + 16, + 0, + false, + { + { RatingsModifierType::BonusRotations, 0, 20, 20, 20 }, + { RatingsModifierType::BonusScenery, 0, 13943, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/transport/meta/Chairlift.h b/src/openrct2/ride/transport/meta/Chairlift.h index 275863e6094e..ec0ee5e6b76e 100644 --- a/src/openrct2/ride/transport/meta/Chairlift.h +++ b/src/openrct2/ride/transport/meta/Chairlift.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor ChairliftRTD = SET_FIELD(Heights, { 40, 32, 28, 2, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateChairlift), SET_FIELD(RatingsMultipliers, { 70, 10, 0 }), SET_FIELD(UpkeepCosts, { 60, 20, 0, 4, 3, 10 }), SET_FIELD(BuildCosts, { 32.50_GBP, 0.50_GBP, 30, }), @@ -56,6 +55,28 @@ constexpr const RideTypeDescriptor ChairliftRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CHAIRLIFT_TRACK, SPR_RIDE_DESIGN_PREVIEW_CHAIRLIFT_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "chairlift"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 60), RIDE_RATING(0, 40), RIDE_RATING(0, 50) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 7430, 3476, 4574 }, + { RatingsModifierType::BonusSheltered, 0, -19275, 21845, 23405 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 25098, 0, 0 }, + { RatingsModifierType::RequirementLength, 0x960000, 2, 2, 2 }, + { RatingsModifierType::RequirementStations, 1, 0, 2, 1 }, + { RatingsModifierType::RequirementUnsheltered, 4, 4, 1, 1 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_ChairLift), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/transport/meta/Lift.h b/src/openrct2/ride/transport/meta/Lift.h index 823f32ac0e81..b622c4476989 100644 --- a/src/openrct2/ride/transport/meta/Lift.h +++ b/src/openrct2/ride/transport/meta/Lift.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor LiftRTD = SET_FIELD(Heights, { 255, 32, 3, 2, }), SET_FIELD(MaxMass, 15), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLift), SET_FIELD(RatingsMultipliers, { 80, 10, 0 }), SET_FIELD(UpkeepCosts, { 50, 20, 0, 10, 0, 0 }), SET_FIELD(BuildCosts, { 19.50_GBP, 0.00_GBP, 4, }), @@ -54,5 +53,19 @@ constexpr const RideTypeDescriptor LiftRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LIFT_TRACK, 0 }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "lift"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 11), RIDE_RATING(0, 35), RIDE_RATING(0, 30) }, + 15, + 7, + false, + { + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 83662, 0, 0 }, + { RatingsModifierType::BonusTowerRide, 0, 45875, 0, 26214 }, + { RatingsModifierType::RequirementUnsheltered, 5, 4, 1, 1 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/transport/meta/MiniatureRailway.h b/src/openrct2/ride/transport/meta/MiniatureRailway.h index a74ff81a8d58..9da7b3b49105 100644 --- a/src/openrct2/ride/transport/meta/MiniatureRailway.h +++ b/src/openrct2/ride/transport/meta/MiniatureRailway.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor MiniatureRailwayRTD = SET_FIELD(Heights, { 7, 32, 5, 9, }), SET_FIELD(MaxMass, 39), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMiniatureRailway), SET_FIELD(RatingsMultipliers, { 70, 6, -10 }), SET_FIELD(UpkeepCosts, { 60, 20, 0, 10, 3, 5 }), SET_FIELD(BuildCosts, { 17.50_GBP, 3.00_GBP, 50, }), @@ -56,6 +55,26 @@ constexpr const RideTypeDescriptor MiniatureRailwayRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINIATURE_RAILWAY_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINIATURE_RAILWAY_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "miniature_railway"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 50), RIDE_RATING(0, 00), RIDE_RATING(0, 00) }, + 11, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusTrainLength, 0, 140434, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, -6425, 6553, 23405 }, + { RatingsModifierType::BonusProximity, 0, 8946, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 20915 , 0, 0}, + { RatingsModifierType::RequirementLength, 0xC80000, 2, 2, 2 }, + { RatingsModifierType::RequirementUnsheltered, 4, 4, 1, 1 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_MiniatureRailway), }; diff --git a/src/openrct2/ride/transport/meta/Monorail.h b/src/openrct2/ride/transport/meta/Monorail.h index 2b030bf044ac..f2005464e3ed 100644 --- a/src/openrct2/ride/transport/meta/Monorail.h +++ b/src/openrct2/ride/transport/meta/Monorail.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor MonorailRTD = SET_FIELD(Heights, { 8, 32, 8, 9, }), SET_FIELD(MaxMass, 78), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateMonorail), SET_FIELD(RatingsMultipliers, { 70, 6, -10 }), SET_FIELD(UpkeepCosts, { 65, 20, 0, 10, 3, 10 }), SET_FIELD(BuildCosts, { 21.00_GBP, 2.50_GBP, 50, }), @@ -59,6 +58,26 @@ constexpr const RideTypeDescriptor MonorailRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MONORAIL_TRACK, SPR_RIDE_DESIGN_PREVIEW_MONORAIL_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "monorail"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 00), RIDE_RATING(0, 00), RIDE_RATING(0, 00) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusTrainLength, 0, 93622, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 70849, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 218453, 0 }, + { RatingsModifierType::BonusDuration, 150, 21845, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 5140, 6553, 18724 }, + { RatingsModifierType::BonusProximity, 0, 8946, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 16732, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xAA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementUnsheltered, 4, 4, 1, 1 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_Monorail), }; diff --git a/src/openrct2/ride/transport/meta/SuspendedMonorail.h b/src/openrct2/ride/transport/meta/SuspendedMonorail.h index 811c79e50048..2517c5c5cf12 100644 --- a/src/openrct2/ride/transport/meta/SuspendedMonorail.h +++ b/src/openrct2/ride/transport/meta/SuspendedMonorail.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor SuspendedMonorailRTD = SET_FIELD(Heights, { 12, 40, 32, 8, }), SET_FIELD(MaxMass, 78), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSuspendedMonorail), SET_FIELD(RatingsMultipliers, { 70, 6, -10 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 10, 3, 10 }), SET_FIELD(BuildCosts, { 32.50_GBP, 2.50_GBP, 50, }), @@ -57,5 +56,25 @@ constexpr const RideTypeDescriptor SuspendedMonorailRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SUSPENDED_MONORAIL_TRACK, SPR_RIDE_DESIGN_PREVIEW_SUSPENDED_MONORAIL_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "suspended_monorail"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 15), RIDE_RATING(0, 23), RIDE_RATING(0, 8) }, + 14, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusTrainLength, 0, 93622, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 70849, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 218453, 0 }, + { RatingsModifierType::BonusDuration, 150, 21845, 0, 0 }, + { RatingsModifierType::BonusSheltered, 0, 5140, 6553, 18724 }, + { RatingsModifierType::BonusProximity, 0, 12525, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 25098, 0, 0 }, + { RatingsModifierType::RequirementLength, 0xAA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementUnsheltered, 4, 4, 1, 1 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/water/meta/BoatHire.h b/src/openrct2/ride/water/meta/BoatHire.h index 65f2ea10df09..28ae70de1c8c 100644 --- a/src/openrct2/ride/water/meta/BoatHire.h +++ b/src/openrct2/ride/water/meta/BoatHire.h @@ -38,7 +38,6 @@ constexpr const RideTypeDescriptor BoatHireRTD = SET_FIELD(Heights, { 255, 16, 0, 3, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateBoatHire), SET_FIELD(RatingsMultipliers, { 70, 6, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 4, 0, 0 }), SET_FIELD(BuildCosts, { 27.50_GBP, 0.00_GBP, 5, }), @@ -59,6 +58,19 @@ constexpr const RideTypeDescriptor BoatHireRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_BOAT_HIRE_TRACK, SPR_RIDE_DESIGN_PREVIEW_BOAT_HIRE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "boat_hire"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 90), RIDE_RATING(0, 80), RIDE_RATING(0, 90) }, + 7, + 0, + false, + { + { RatingsModifierType::BonusBoatHireNoCircuit, 0, RIDE_RATING(0, 20), 0, 0 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 22310, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/water/meta/DinghySlide.h b/src/openrct2/ride/water/meta/DinghySlide.h index 7fe5100a9b10..ca9e83eac56a 100644 --- a/src/openrct2/ride/water/meta/DinghySlide.h +++ b/src/openrct2/ride/water/meta/DinghySlide.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor DinghySlideRTD = SET_FIELD(Heights, { 15, 24, 5, 7, }), SET_FIELD(MaxMass, 5), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateDinghySlide), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 4, 3, 10 }), SET_FIELD(BuildCosts, { 20.00_GBP, 2.00_GBP, 40, }), @@ -57,5 +56,31 @@ constexpr const RideTypeDescriptor DinghySlideRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_DINGHY_SLIDE_TRACK, SPR_RIDE_DESIGN_PREVIEW_DINGHY_SLIDE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "dinghy_slide"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 70), RIDE_RATING(2, 00), RIDE_RATING(1, 50) }, + 13, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 50), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 65536, 29789, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0x70000, 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x8C0000, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 65536, 29789, 49648 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/water/meta/LogFlume.h b/src/openrct2/ride/water/meta/LogFlume.h index fa735ee7f226..739b7814a217 100644 --- a/src/openrct2/ride/water/meta/LogFlume.h +++ b/src/openrct2/ride/water/meta/LogFlume.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor LogFlumeRTD = SET_FIELD(Heights, { 10, 24, 7, 9, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateLogFlume), SET_FIELD(RatingsMultipliers, { 80, 34, 6 }), SET_FIELD(UpkeepCosts, { 80, 20, 0, 9, 0, 10 }), SET_FIELD(BuildCosts, { 22.50_GBP, 2.50_GBP, 40, }), @@ -55,6 +54,26 @@ constexpr const RideTypeDescriptor LogFlumeRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_LOG_FLUME_TRACK, SPR_RIDE_DESIGN_PREVIEW_LOG_FLUME_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "log_flume"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 50), RIDE_RATING(0, 55), RIDE_RATING(0, 30) }, + 15, + -1, + false, + { + { RatingsModifierType::BonusLength, 2000, 7208, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 531372, 655360, 301111 }, + { RatingsModifierType::BonusDuration, 300, 13107, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 22291, 20860, 4574 }, + { RatingsModifierType::BonusDrops, 0, 69905, 62415, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/water/meta/RiverRafts.h b/src/openrct2/ride/water/meta/RiverRafts.h index deb43198e524..0c14f79c6b17 100644 --- a/src/openrct2/ride/water/meta/RiverRafts.h +++ b/src/openrct2/ride/water/meta/RiverRafts.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor RiverRaftsRTD = SET_FIELD(Heights, { 12, 24, 7, 11, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateRiverRafts), SET_FIELD(RatingsMultipliers, { 80, 34, 6 }), SET_FIELD(UpkeepCosts, { 50, 20, 0, 9, 0, 10 }), SET_FIELD(BuildCosts, { 20.00_GBP, 2.50_GBP, 30, }), @@ -54,5 +53,23 @@ constexpr const RideTypeDescriptor RiverRaftsRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_RIVER_RAFTS_TRACK, SPR_RIDE_DESIGN_PREVIEW_RIVER_RAFTS_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "river_rafts"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 45), RIDE_RATING(0, 25), RIDE_RATING(0, 34) }, + 12, + -1, + false, + { + { RatingsModifierType::BonusLength, 2000, 7208, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 531372, 655360, 301111 }, + { RatingsModifierType::BonusDuration, 500, 13107, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 22291, 20860, 4574 }, + { RatingsModifierType::BonusDrops, 0, 78643, 93622, 62259 }, + { RatingsModifierType::BonusProximity, 0, 13420, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + }, + }), }; // clang-format on diff --git a/src/openrct2/ride/water/meta/RiverRapids.h b/src/openrct2/ride/water/meta/RiverRapids.h index a0121a0ddbf5..2445c3aa4a72 100644 --- a/src/openrct2/ride/water/meta/RiverRapids.h +++ b/src/openrct2/ride/water/meta/RiverRapids.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor RiverRapidsRTD = SET_FIELD(Heights, { 9, 32, 14, 15, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateRiverRapids), SET_FIELD(RatingsMultipliers, { 72, 26, 6 }), SET_FIELD(UpkeepCosts, { 82, 20, 0, 10, 0, 10 }), SET_FIELD(BuildCosts, { 31.00_GBP, 3.00_GBP, 40, }), @@ -55,6 +54,27 @@ constexpr const RideTypeDescriptor RiverRapidsRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_RIVER_RAPIDS_TRACK, SPR_RIDE_DESIGN_PREVIEW_RIVER_RAPIDS_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "river_rapids"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 20), RIDE_RATING(0, 70), RIDE_RATING(0, 50) }, + 16, + -1, + false, + { + { RatingsModifierType::BonusLength, 2000, 6225, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 30), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 115130, 159411, 106274 }, + { RatingsModifierType::BonusDuration, 500, 13107, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 29721, 22598, 5718 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 31314, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 13943, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 2, 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0xC80000, 2, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), diff --git a/src/openrct2/ride/water/meta/SplashBoats.h b/src/openrct2/ride/water/meta/SplashBoats.h index 890ba4d39dfd..7646ecf62326 100644 --- a/src/openrct2/ride/water/meta/SplashBoats.h +++ b/src/openrct2/ride/water/meta/SplashBoats.h @@ -41,7 +41,6 @@ constexpr const RideTypeDescriptor SplashBoatsRTD = SET_FIELD(Heights, { 16, 24, 7, 11, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSplashBoats), SET_FIELD(RatingsMultipliers, { 80, 34, 6 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 9, 0, 10 }), SET_FIELD(BuildCosts, { 28.50_GBP, 2.50_GBP, 30, }), @@ -56,6 +55,26 @@ constexpr const RideTypeDescriptor SplashBoatsRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SPLASH_BOATS_TRACK, SPR_RIDE_DESIGN_PREVIEW_SPLASH_BOATS_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "splash_boats"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(1, 46), RIDE_RATING(0, 35), RIDE_RATING(0, 30) }, + 15, + -1, + false, + { + { RatingsModifierType::BonusLength, 2000, 7208, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 797059, 655360, 301111 }, + { RatingsModifierType::BonusDuration, 500, 13107, 0, 0 }, + { RatingsModifierType::BonusTurns, 0, 22291, 20860, 4574 }, + { RatingsModifierType::BonusDrops, 0, 87381, 93622, 62259 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 6, 2, 2, 2 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), }; diff --git a/src/openrct2/ride/water/meta/SubmarineRide.h b/src/openrct2/ride/water/meta/SubmarineRide.h index 6f497abbd7b5..1e615400fce7 100644 --- a/src/openrct2/ride/water/meta/SubmarineRide.h +++ b/src/openrct2/ride/water/meta/SubmarineRide.h @@ -40,7 +40,6 @@ constexpr const RideTypeDescriptor SubmarineRideRTD = SET_FIELD(Heights, { 255, 16, 0, 3, }), SET_FIELD(MaxMass, 255), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }), - SET_FIELD(RatingsCalculationFunction, RideRatingsCalculateSubmarineRide), SET_FIELD(RatingsMultipliers, { 70, 6, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 4, 0, 0 }), SET_FIELD(BuildCosts, { 35.00_GBP, 2.50_GBP, 5, }), @@ -54,6 +53,19 @@ constexpr const RideTypeDescriptor SubmarineRideRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_SUBMARINE_RIDE_TRACK, SPR_RIDE_DESIGN_PREVIEW_SUBMARINE_RIDE_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "submarine_ride"), + SET_FIELD(RatingsData, + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 20), RIDE_RATING(1, 80), RIDE_RATING(1, 40) }, + 7, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusProximity, 0, 11183, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 22310, 0, 0 }, + }, + }), SET_FIELD(UpdateRotating, UpdateRotatingDefault), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), };