implement rating calculations for g forces and drops

This commit is contained in:
IntelOrca 2014-10-11 23:50:04 +01:00
parent c91c4f7ea0
commit 8190fa48be
1 changed files with 69 additions and 27 deletions

View File

@ -638,12 +638,41 @@ static rating_tuple sub_65E1C2(rct_ride *ride)
*/
static rating_tuple ride_ratings_get_gforce_ratings(rct_ride *ride)
{
int eax, ebx, ecx, edx, esi, edi, ebp;
edi = (int)ride;
RCT2_CALLFUNC_X(0x0065DCDC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
rating_tuple result;
fixed16_2dp gforce;
rating_tuple rating = { ebx, ecx, ebp };
return rating;
result.excitement = 0;
result.intensity = 0;
result.nausea = 0;
// Apply maximum positive G force factor
result.excitement += (ride->max_positive_vertical_g * 5242) >> 16;
result.intensity += (ride->max_positive_vertical_g * 52428) >> 16;
result.nausea += (ride->max_positive_vertical_g * 17039) >> 16;
// Apply maximum negative G force factor
gforce = ride->max_negative_vertical_g;
result.excitement += (clamp(-FIXED_2DP(2,50), gforce, FIXED_2DP(0,00)) * -15728) >> 16;
result.intensity += ((gforce - FIXED_2DP(1,00)) * -52428) >> 16;
result.nausea += ((gforce - FIXED_2DP(1,00)) * -14563) >> 16;
// Apply lateral G force factor
result.excitement += (min(FIXED_2DP(1,50), ride->max_lateral_g) * 26214) >> 16;
result.intensity += (ride->max_lateral_g * 65536) >> 16;
result.nausea += (ride->max_lateral_g * 21845) >> 16;
// Very high lateral G force penalty
if (ride->max_lateral_g > FIXED_2DP(2,80)) {
result.intensity += FIXED_2DP(3,75);
result.nausea += FIXED_2DP(2,00);
}
if (ride->max_lateral_g > FIXED_2DP(3,10)) {
result.excitement /= 2;
result.intensity += FIXED_2DP(8,50);
result.nausea += FIXED_2DP(4,00);
}
return result;
}
/**
@ -652,12 +681,25 @@ static rating_tuple ride_ratings_get_gforce_ratings(rct_ride *ride)
*/
static rating_tuple ride_ratings_get_drop_ratings(rct_ride *ride)
{
int eax, ebx, ecx, edx, esi, edi, ebp;
edi = (int)ride;
RCT2_CALLFUNC_X(0x0065E139, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
rating_tuple result;
int drops;
rating_tuple rating = { ebx, ecx, ebp };
return rating;
result.excitement = 0;
result.intensity = 0;
result.nausea = 0;
// Apply number of drops factor
drops = ride->drops & 0x3F;
result.excitement += (min(9, drops) * 728177) >> 16;
result.intensity += (drops * 928426) >> 16;
result.nausea += (drops * 655360) >> 16;
// Apply highest drop factor
result.excitement += ((ride->highest_drop_height * 2) * 16000) >> 16;
result.intensity += ((ride->highest_drop_height * 2) * 32000) >> 16;
result.nausea += ((ride->highest_drop_height * 2) * 10240) >> 16;
return result;
}
/**
@ -713,7 +755,7 @@ static int ride_ratings_get_scenery_score(rct_ride *ride)
static void ride_ratings_calculate_mine_train_coaster(rct_ride *ride)
{
rating_tuple ratings, unkRating;
rating_tuple ratings, subRating;
int totalLength, time;
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
@ -754,28 +796,28 @@ static void ride_ratings_calculate_mine_train_coaster(rct_ride *ride)
ratings.excitement += (min(150, time) * 26214) >> 16;
// Apply G forces factor
unkRating = ride_ratings_get_gforce_ratings(ride);
ratings.excitement += (unkRating.excitement * 40960) >> 16;
ratings.intensity += (unkRating.intensity * 35746) >> 16;
ratings.nausea += (unkRating.nausea * 49648) >> 16;
subRating = ride_ratings_get_gforce_ratings(ride);
ratings.excitement += (subRating.excitement * 40960) >> 16;
ratings.intensity += (subRating.intensity * 35746) >> 16;
ratings.nausea += (subRating.nausea * 49648) >> 16;
// Apply ?
unkRating = sub_65DDD1(ride);
ratings.excitement += (unkRating.excitement * 29721) >> 16;
ratings.intensity += (unkRating.intensity * 34767) >> 16;
ratings.nausea += (unkRating.nausea * 45749) >> 16;
subRating = sub_65DDD1(ride);
ratings.excitement += (subRating.excitement * 29721) >> 16;
ratings.intensity += (subRating.intensity * 34767) >> 16;
ratings.nausea += (subRating.nausea * 45749) >> 16;
// Apply drops factor
unkRating = ride_ratings_get_drop_ratings(ride);
ratings.excitement += (unkRating.excitement * 29127) >> 16;
ratings.intensity += (unkRating.intensity * 46811) >> 16;
ratings.nausea += (unkRating.nausea * 49152) >> 16;
subRating = ride_ratings_get_drop_ratings(ride);
ratings.excitement += (subRating.excitement * 29127) >> 16;
ratings.intensity += (subRating.intensity * 46811) >> 16;
ratings.nausea += (subRating.nausea * 49152) >> 16;
// Apply ?
unkRating = sub_65E1C2(ride);
ratings.excitement += (unkRating.excitement * 19275) >> 16;
ratings.intensity += (unkRating.intensity * 32768) >> 16;
ratings.nausea += (unkRating.nausea * 35108) >> 16;
subRating = sub_65E1C2(ride);
ratings.excitement += (subRating.excitement * 19275) >> 16;
ratings.intensity += (subRating.intensity * 32768) >> 16;
ratings.nausea += (subRating.nausea * 35108) >> 16;
// Apply ?
ratings.excitement += (sub_65E277() * 21472) >> 16;