Ride rating calculation
This is an (incomplete) attempt to document some of the ride rating calculations as found in ride_ratings.c.
Effect of G-force on ride ratings (ride_ratings_get_g_force_ratings)
The effect of G-force on the ratings is calculated in the same manner for each ride, and then the results are multiplied by ride-specific coefficients and added to the current total. The ride-independent portion of this is:
excitement=0.08*max_positive_g-0.24*clamp(-2.5,max_negative_g,0)+0.4*min(1.5,max_lateral_g) intensity=0.8*max_positive_g+0.8*(1-max_negative_g)+max_lateral_g nausea=0.26*max_positive_g+0.22*(1-max_negative_g)+0.33*max_lateral_g
where clamp(-2.5,max_negative_g,0) indicates that negative gs below 2.5 will not cause any further improvement in excitement, and negative gs above 0 don't count. min(1.5,max_lateral_g) indicates that lateral Gs above 1.5 cause no further increase in excitement. After calculating these three values, the game applies a penalty if the lateral Gs are too high:
- For lateral Gs above 2.8, a value of 3.75 is added to the intensity, and 2 is added to the nausea.
- If the lateral Gs also exceed 3.1, the excitement rating is halved, and a further 8.5 is added to the intensity, and 4 is added to the nausea.
All three values are then multiplied by a constant which depends on the type of ride.
Therefore, there is a large penalty for excessive lateral Gs, while there is no direct penalty for excessive positive or negative Gs (however, they can raise your intensity, which you may then be penalized for).
Effect of drops on ratings (ride_ratings_get_drop_ratings)
Again, the effect of drops on the ride is calculated in the same way for each ride, and then the results are multiplied by a set of ride-specific coefficients. Here is the ride-independent part of the calculation:
excitement=0.11*min(9,num_drops)+0.0049*highest_drop intensity=0.14*num_drops+0.0098*highest_drop nausea=0.1*num_drops+0.0016*highest_drop
Beyond 9 drops there is no further increase in excitement, but intensity and nausea will continue to increase
Effect of inversions on ratings (get_inversions_ratings)
The effect of inversions appears to be the same for every ride - there's no multiplier that I can find. This effect is calculated as follows:
excitement=0.27*min(6,num_inversions) intensity=0.5*num_inversions nausea=0.22*num_inversions
It seems that after 6 inversions, there is no further increase in excitement
Effect of scenery on excitement (ride_ratings_get_scenery_score)
The effect of scenery is again calculated in the same manner for every ride. If the station is underground, a fixed value of 0.4 is returned. If not, the game counts all the scenery items within 5 tiles of the (first?) station (I think. The code here isn't quite clear). This total is then multiplied by 0.05. If there are more than 47 scenery items found, additional items have no further effect. The value is then multiplied by a constant that depends on the ride type, and added to the excitement rating (scenery has no effect on intensity or nausea).
Effect of proximity on excitement (ride_ratings_get_proximity_score)
This is probably the most interesting routine if only because I never knew this was taken into account. Unfortunately, I'm not quite sure how this method works - it accesses a (presumably global?) array and I don't know where that is initialised. However, it appear that points are awarded for:
- Passing close to another point on the track
- Passing close to the station
- Passing close to the track of a different ride
- Passing close to paths
- Passing close to scenery
- Passing close to water (more points are awarded the closer the track is to the water)
- Passing through a vertical loop
- Looping around a path
- Interlocking loops
The score from each of these is totalled up, multiplied by a ride-specific constant, and then added to the excitement rating
Effect of synchronized stations on ratings (ride_ratings_apply_synchronisation)
If "synchronize with adjacent stations" is checked, a fixed constant is added to both excitement and intensity. A different constant is used for each, and the value depends on the ride type. It doesn't matter how many tracks/stations there are - or even if there's no actual station to synchronize with - this constant is always the same.
Effect of track length on excitement (ride_ratings_apply_length)
The track length is multiplied by a ride specific value and added to the excitement rating. Each ride type has its own threshold above which further increase in length does not result in any gain in excitement. Ride length does not directly affect intensity or nausea.
Effect of train length on excitement (ride_ratings_apply_train_length)
Single car trains have no effect on ratings. Each additional car adds to the excitement rating a fixed quantity , the value of which depends on the ride type.
Effect of speed on ratings (ride_ratings_apply_max_speed)
The maximum speed is multiplied by three ride-specific constants and then added to each of excitement,intensity,and nausea respectively. Average speed is handled similarly, but there are only two constants because nausea is not affected.
Penalties for low stats (ride_ratings_apply_highest_drop_height_penalty)
Each ride has it's own minimum threshold for highest drop height, maximum speed, number of drops, and max negative and lateral Gs. Failing to meet each of these thresholds causes all three ratings to be divided by ride type specific constants.
Effect of excessive intensity on excitement (ride_ratings_apply_intensity_penalty)
If the intensity is above ten, the excitement is decreased by 25%. It is decreased again by 25% if the intensity exceeds 11, again if the intensity exceeds 12, again if the intensity exceeds 13.2, and finally if the intensity exceeds 14.5.