mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-04 13:42:55 +01:00
implement more ride rating calculations and fix bugs
This commit is contained in:
@@ -446,6 +446,14 @@ int ride_get_total_length(rct_ride *ride)
|
||||
return totalLength;
|
||||
}
|
||||
|
||||
int ride_get_total_time(rct_ride *ride)
|
||||
{
|
||||
int i, totalTime = 0;
|
||||
for (i = 0; i < ride->num_stations; i++)
|
||||
totalTime += ride->time[i];
|
||||
return totalTime;
|
||||
}
|
||||
|
||||
int ride_can_have_multiple_circuits(rct_ride *ride)
|
||||
{
|
||||
if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x200))
|
||||
|
||||
@@ -747,6 +747,7 @@ int ride_modify(rct_xy_element *input);
|
||||
void ride_get_status(int rideIndex, int *formatSecondary, int *argument);
|
||||
rct_peep *ride_get_assigned_mechanic(rct_ride *ride);
|
||||
int ride_get_total_length(rct_ride *ride);
|
||||
int ride_get_total_time(rct_ride *ride);
|
||||
int ride_can_have_multiple_circuits(rct_ride *ride);
|
||||
track_colour ride_get_track_colour(rct_ride *ride, int colourScheme);
|
||||
vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex);
|
||||
|
||||
@@ -606,15 +606,15 @@ static rating_tuple get_var_10E_rating(rct_ride* ride) {
|
||||
int var_10E_unk_3 = get_var_10E_unk_3(ride);
|
||||
|
||||
int excitement = (var_10E_unk_1 * 0x28000) >> 16;
|
||||
excitement += var_10E_unk_2 * 3;
|
||||
excitement += (var_10E_unk_2 * 0x30000) >> 16;
|
||||
excitement += (var_10E_unk_3 * 63421) >> 16;
|
||||
|
||||
int intensity = (var_10E_unk_1 * 81920) >> 16;
|
||||
intensity += (var_10E_unk_2 * 49152) >> 16;
|
||||
intensity += (var_10E_unk_3 * 21140) >> 16;
|
||||
|
||||
int nausea = var_10E_unk_1 * 5;
|
||||
nausea += (var_10E_unk_2 * 0x3200) >> 16;
|
||||
int nausea = (var_10E_unk_1 * 0x50000) >> 16;
|
||||
nausea += (var_10E_unk_2 * 0x32000) >> 16;
|
||||
nausea += (var_10E_unk_3 * 42281) >> 16;
|
||||
|
||||
rating_tuple rating = { excitement, intensity, nausea };
|
||||
@@ -629,15 +629,15 @@ static rating_tuple get_var_110_rating(rct_ride* ride) {
|
||||
int var_110_unk_2 = get_var_110_unk_2(ride);
|
||||
int var_110_unk_3 = get_var_110_unk_3(ride);
|
||||
|
||||
int excitement = (var_110_unk_1 * 0x3c000) >> 16;
|
||||
excitement += (var_110_unk_2 * 0x3c000) >> 16;
|
||||
int excitement = (var_110_unk_1 * 0x3C000) >> 16;
|
||||
excitement += (var_110_unk_2 * 0x3C000) >> 16;
|
||||
excitement += (var_110_unk_3 * 73992) >> 16;
|
||||
|
||||
int intensity = (var_110_unk_1 * 0x14000) >> 16;
|
||||
intensity += (var_110_unk_2 * 49152) >> 16;
|
||||
intensity += (var_110_unk_3 * 21140) >> 16;
|
||||
|
||||
int nausea = var_110_unk_1 * 5;
|
||||
int nausea = (var_110_unk_1 * 0x50000) >> 16;
|
||||
nausea += (var_110_unk_2 * 0x32000) >> 16;
|
||||
nausea += (var_110_unk_3 * 48623) >> 16;
|
||||
|
||||
@@ -665,7 +665,7 @@ static rating_tuple get_var_112_rating(rct_ride *ride) {
|
||||
|
||||
al = get_var_112_unk_3(ride);
|
||||
al = min(al, 6);
|
||||
excitement += (al * 0x3aaaa) >> 16;
|
||||
excitement += (al * 0x3AAAA) >> 16;
|
||||
|
||||
al = get_var_112_unk_4(ride);
|
||||
al = min(al, 7);
|
||||
@@ -682,10 +682,10 @@ static rating_tuple get_inversions_ratings(uint8 inversions) {
|
||||
inversions = inversions & 0x1F;
|
||||
|
||||
int a = min(inversions, 6);
|
||||
int excitement = (a * 0x1aaaaa) >> 16;
|
||||
int excitement = (a * 0x1AAAAA) >> 16;
|
||||
|
||||
int intensity = inversions * 5;
|
||||
int nausea = (inversions * 0x15aaaa) >> 16;
|
||||
int nausea = (inversions * 0x15AAAA) >> 16;
|
||||
|
||||
rating_tuple rating = { excitement, intensity, nausea };
|
||||
return rating;
|
||||
@@ -906,7 +906,7 @@ static int ride_ratings_get_scenery_score(rct_ride *ride)
|
||||
|
||||
x = stationXY & 0xFF;
|
||||
y = stationXY >> 8;
|
||||
z = map_element_height(x * 32, y * 32);
|
||||
z = map_element_height(x * 32, y * 32) & 0xFFFF;
|
||||
|
||||
// Check if station is underground, returns a fixed mediocre score since you can't have scenery underground
|
||||
if (z > ride->station_heights[i] * 8)
|
||||
@@ -1254,6 +1254,174 @@ static void ride_ratings_calculate_go_karts(rct_ride *ride)
|
||||
ride->excitement /= 2;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_log_flume(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings, subRating;
|
||||
|
||||
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
|
||||
return;
|
||||
|
||||
ride->unreliability_factor = 15;
|
||||
set_unreliability_factor(ride);
|
||||
|
||||
ratings.excitement = RIDE_RATING(1,50);
|
||||
ratings.intensity = RIDE_RATING(0,55);
|
||||
ratings.nausea = RIDE_RATING(0,30);
|
||||
|
||||
ratings.excitement += (min(ride_get_total_length(ride) >> 16, 2000) * 7208) >> 16;
|
||||
|
||||
if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) {
|
||||
ratings.excitement += RIDE_RATING(0,40);
|
||||
ratings.intensity += RIDE_RATING(0,05);
|
||||
}
|
||||
|
||||
ratings.excitement += (ride->max_speed >> 16) * 531372 >> 16;
|
||||
ratings.intensity += (ride->max_speed >> 16) * 655360 >> 16;
|
||||
ratings.nausea += (ride->max_speed >> 16) * 301111 >> 16;
|
||||
|
||||
ratings.excitement += (min(ride_get_total_time(ride), 300) * 13107) >> 16;
|
||||
|
||||
subRating = sub_65DDD1(ride);
|
||||
ratings.excitement += (subRating.excitement * 22291) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 20860) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 4574) >> 16;
|
||||
|
||||
subRating = ride_ratings_get_drop_ratings(ride);
|
||||
ratings.excitement += (subRating.excitement * 69905) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 62415) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 49152) >> 16;
|
||||
|
||||
subRating = sub_65E1C2(ride);
|
||||
ratings.excitement += (subRating.excitement * 16705) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 30583) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 35108) >> 16;
|
||||
|
||||
ratings.excitement += (sub_65E277() * 22367) >> 16;
|
||||
ratings.excitement += (ride_ratings_get_scenery_score(ride) * 11155) >> 16;
|
||||
|
||||
if (ride->highest_drop_height < 2) {
|
||||
ratings.excitement /= 2;
|
||||
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(ride);
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
|
||||
ride->inversions &= 0x1F;
|
||||
ride->inversions |= sub_65E72D(ride) << 5;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_river_rapids(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings, subRating;
|
||||
|
||||
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
|
||||
return;
|
||||
|
||||
ride->unreliability_factor = 16;
|
||||
set_unreliability_factor(ride);
|
||||
|
||||
ratings.excitement = RIDE_RATING(1,20);
|
||||
ratings.intensity = RIDE_RATING(0,70);
|
||||
ratings.nausea = RIDE_RATING(0,50);
|
||||
|
||||
ratings.excitement += (min(ride_get_total_length(ride) >> 16, 2000) * 6225) >> 16;
|
||||
|
||||
if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) {
|
||||
ratings.excitement += RIDE_RATING(0,30);
|
||||
ratings.intensity += RIDE_RATING(0,05);
|
||||
}
|
||||
|
||||
ratings.excitement += (ride->max_speed >> 16) * 115130 >> 16;
|
||||
ratings.intensity += (ride->max_speed >> 16) * 159411 >> 16;
|
||||
ratings.nausea += (ride->max_speed >> 16) * 106274 >> 16;
|
||||
|
||||
ratings.excitement += (min(ride_get_total_time(ride), 500) * 13107) >> 16;
|
||||
|
||||
subRating = sub_65DDD1(ride);
|
||||
ratings.excitement += (subRating.excitement * 29721) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 22598) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 5718) >> 16;
|
||||
|
||||
subRating = ride_ratings_get_drop_ratings(ride);
|
||||
ratings.excitement += (subRating.excitement * 40777) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 46811) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 49152) >> 16;
|
||||
|
||||
subRating = sub_65E1C2(ride);
|
||||
ratings.excitement += (subRating.excitement * 16705) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 30583) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 35108) >> 16;
|
||||
|
||||
ratings.excitement += (sub_65E277() * 31314) >> 16;
|
||||
ratings.excitement += (ride_ratings_get_scenery_score(ride) * 13943) >> 16;
|
||||
|
||||
if (ride->highest_drop_height < 2) {
|
||||
ratings.excitement /= 2;
|
||||
ratings.intensity /= 2;
|
||||
ratings.nausea /= 2;
|
||||
}
|
||||
|
||||
if (ride->length[0] < 0xC80000) {
|
||||
ratings.excitement /= 2;
|
||||
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(ride);
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
|
||||
ride->inversions &= 0x1F;
|
||||
ride->inversions |= sub_65E72D(ride) << 5;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_dodgems(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings;
|
||||
|
||||
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
|
||||
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
|
||||
ride->unreliability_factor = 16;
|
||||
set_unreliability_factor(ride);
|
||||
|
||||
ratings.excitement = RIDE_RATING(1,30);
|
||||
ratings.intensity = RIDE_RATING(0,50);
|
||||
ratings.nausea = RIDE_RATING(0,35);
|
||||
|
||||
if (ride->num_vehicles >= 4)
|
||||
ratings.excitement += RIDE_RATING(0,40);
|
||||
|
||||
ratings.excitement += ride->operation_option;
|
||||
ratings.intensity += ride->operation_option / 2;
|
||||
|
||||
if (ride->num_vehicles >= 4)
|
||||
ratings.excitement += RIDE_RATING(0,40);
|
||||
|
||||
ratings.excitement += (ride_ratings_get_scenery_score(ride) * 5577) >> 16;
|
||||
|
||||
ride_ratings_apply_intensity_penalty(&ratings);
|
||||
ride_ratings_apply_adjustments(ride, &ratings);
|
||||
|
||||
ride->ratings = ratings;
|
||||
|
||||
ride->upkeep_cost = ride_compute_upkeep(ride);
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
|
||||
ride->inversions &= 0x1F;
|
||||
ride->inversions |= 7 << 5;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_pirate_ship(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings;
|
||||
@@ -1368,7 +1536,7 @@ static void ride_ratings_calculate_information_kiosk(rct_ride *ride)
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_bathroom(rct_ride *ride)
|
||||
static void ride_ratings_calculate_toilets(rct_ride *ride)
|
||||
{
|
||||
ride->upkeep_cost = ride_compute_upkeep(ride);
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
@@ -1544,7 +1712,7 @@ static void ride_ratings_calculate_space_rings(rct_ride *ride)
|
||||
ride->inversions |= 0 << 5;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_elevator(rct_ride *ride)
|
||||
static void ride_ratings_calculate_lift(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings;
|
||||
int totalLength;
|
||||
@@ -1582,7 +1750,7 @@ static void ride_ratings_calculate_elevator(rct_ride *ride)
|
||||
ride->excitement /= 4;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_atm(rct_ride *ride)
|
||||
static void ride_ratings_calculate_cash_machine(rct_ride *ride)
|
||||
{
|
||||
ride->upkeep_cost = ride_compute_upkeep(ride);
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
@@ -1860,6 +2028,58 @@ static void ride_ratings_calculate_magic_carpet(rct_ride *ride)
|
||||
ride->inversions |= 0 << 5;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_river_rafts(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings, subRating;
|
||||
|
||||
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
|
||||
return;
|
||||
|
||||
ride->unreliability_factor = 12;
|
||||
set_unreliability_factor(ride);
|
||||
|
||||
ratings.excitement = RIDE_RATING(1,45);
|
||||
ratings.intensity = RIDE_RATING(0,25);
|
||||
ratings.nausea = RIDE_RATING(0,34);
|
||||
|
||||
ratings.excitement += ((min(ride_get_total_length(ride) >> 16, 2000)) * 7208) >> 16;
|
||||
|
||||
if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) {
|
||||
ratings.intensity += RIDE_RATING(0,40);
|
||||
ratings.nausea += RIDE_RATING(0,05);
|
||||
}
|
||||
|
||||
ratings.excitement += ((ride->max_speed >> 16) * 531372) >> 16;
|
||||
ratings.intensity += ((ride->max_speed >> 16) * 655360) >> 16;
|
||||
ratings.nausea += ((ride->max_speed >> 16) * 301111) >> 16;
|
||||
|
||||
ratings.excitement += (min(ride_get_total_time(ride), 500) * 13107) >> 16;
|
||||
|
||||
subRating = sub_65DDD1(ride);
|
||||
ratings.excitement += (subRating.excitement * 22291) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 20860) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 4574) >> 16;
|
||||
|
||||
subRating = ride_ratings_get_drop_ratings(ride);
|
||||
ratings.excitement += (subRating.excitement * 78643) >> 16;
|
||||
ratings.intensity += (subRating.intensity * 93622) >> 16;
|
||||
ratings.nausea += (subRating.nausea * 62259) >> 16;
|
||||
|
||||
ratings.excitement += (sub_65E277() * 13420) >> 16;
|
||||
ratings.excitement += (ride_ratings_get_scenery_score(ride) * 11155) >> 16;
|
||||
|
||||
ride_ratings_apply_intensity_penalty(&ratings);
|
||||
ride_ratings_apply_adjustments(ride, &ratings);
|
||||
|
||||
ride->ratings = ratings;
|
||||
|
||||
ride->upkeep_cost = ride_compute_upkeep(ride);
|
||||
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME;
|
||||
|
||||
ride->inversions &= 0x1F;
|
||||
ride->inversions |= sub_65E72D(ride) << 5;
|
||||
}
|
||||
|
||||
static void ride_ratings_calculate_enterprise(rct_ride *ride)
|
||||
{
|
||||
rating_tuple ratings;
|
||||
@@ -1906,7 +2126,7 @@ static const ride_ratings_calculation ride_ratings_calculate_func_table[91] = {
|
||||
NULL, // MINIATURE_RAILWAY
|
||||
NULL, // MONORAIL
|
||||
NULL, // MINI_SUSPENDED_COASTER
|
||||
NULL, // BUMPER_BOATS
|
||||
NULL, // BOAT_RIDE
|
||||
NULL, // WOODEN_WILD_MOUSE
|
||||
NULL, // STEEPLECHASE
|
||||
NULL, // CAR_RIDE
|
||||
@@ -1921,9 +2141,9 @@ static const ride_ratings_calculation ride_ratings_calculate_func_table[91] = {
|
||||
ride_ratings_calculate_maze, // MAZE
|
||||
ride_ratings_calculate_spiral_slide, // SPIRAL_SLIDE
|
||||
ride_ratings_calculate_go_karts, // GO_KARTS
|
||||
NULL, // LOG_FLUME
|
||||
NULL, // RIVER_RAPIDS
|
||||
NULL, // BUMPER_CARS
|
||||
ride_ratings_calculate_log_flume, // LOG_FLUME
|
||||
ride_ratings_calculate_river_rapids, // RIVER_RAPIDS
|
||||
ride_ratings_calculate_dodgems, // DODGEMS
|
||||
ride_ratings_calculate_pirate_ship, // PIRATE_SHIP
|
||||
ride_ratings_calculate_inverter_ship, // SWINGING_INVERTER_SHIP
|
||||
ride_ratings_calculate_food_stall, // FOOD_STALL
|
||||
@@ -1934,16 +2154,16 @@ static const ride_ratings_calculation ride_ratings_calculate_func_table[91] = {
|
||||
ride_ratings_calculate_merry_go_round, // MERRY_GO_ROUND
|
||||
NULL, // 22
|
||||
ride_ratings_calculate_information_kiosk, // INFORMATION_KIOSK
|
||||
ride_ratings_calculate_bathroom, // BATHROOM
|
||||
ride_ratings_calculate_toilets, // TOILETS
|
||||
ride_ratings_calculate_ferris_wheel, // FERRIS_WHEEL
|
||||
ride_ratings_calculate_motion_simulator, // MOTION_SIMULATOR
|
||||
ride_ratings_calculate_3d_cinema, // 3D_CINEMA
|
||||
ride_ratings_calculate_top_spin, // TOP_SPIN
|
||||
ride_ratings_calculate_space_rings, // SPACE_RINGS
|
||||
NULL, // REVERSE_FREEFALL_COASTER
|
||||
ride_ratings_calculate_elevator, // ELEVATOR
|
||||
ride_ratings_calculate_lift, // LIFT
|
||||
NULL, // VERTICAL_DROP_ROLLER_COASTER
|
||||
ride_ratings_calculate_atm, // ATM
|
||||
ride_ratings_calculate_cash_machine, // CASH_MACHINE
|
||||
ride_ratings_calculate_twist, // TWIST
|
||||
ride_ratings_calculate_haunted_house, // HAUNTED_HOUSE
|
||||
ride_ratings_calculate_first_aid, // FIRST_AID
|
||||
@@ -1977,7 +2197,7 @@ static const ride_ratings_calculation ride_ratings_calculate_func_table[91] = {
|
||||
NULL, // INVERTED_HAIRPIN_COASTER
|
||||
ride_ratings_calculate_magic_carpet, // MAGIC_CARPET
|
||||
NULL, // SUBMARINE_RIDE
|
||||
NULL, // RIVER_RAFTS
|
||||
ride_ratings_calculate_river_rafts, // RIVER_RAFTS
|
||||
NULL, // 50
|
||||
ride_ratings_calculate_enterprise, // ENTERPRISE
|
||||
NULL, // 52
|
||||
@@ -1987,8 +2207,8 @@ static const ride_ratings_calculation ride_ratings_calculate_func_table[91] = {
|
||||
NULL, // INVERTED_IMPULSE_COASTER
|
||||
NULL, // MINI_ROLLER_COASTER
|
||||
NULL, // MINE_RIDE
|
||||
NULL, // 59
|
||||
NULL, // LIM_LAUNCHED_ROLLER_COASTER
|
||||
NULL, // 90
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
Reference in New Issue
Block a user