From 1406002b6068fdae96632271aa1f01a210bf22fb Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Sun, 29 Mar 2015 19:30:47 -0700 Subject: [PATCH 1/6] Decompile sub_65DDD1 --- src/ride/ride_ratings.c | 205 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 4 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index a442459877..821d456ad4 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -599,17 +599,214 @@ static int sub_65E72D(rct_ride *ride) return edx & 0xFFFF; } +static rating_tuple get_var_10E_rating(uint16 var_10E) { + int al; + al = var_10E >> 8; + al = al & 7; + int excitement = (al * 163840) >> 16; + + al = var_10E >> 5; + al = al & 7; + excitement += (al * 196608) >> 16; + + // Low bits, 0x0065DF3A + al = var_10E & 0x1F; + excitement += (al * 63421) >> 16; + + al = var_10E >> 8; + al = al & 7; + int intensity = (al * 81920) >> 16; + + al = var_10E >> 5; + al = al & 7; + intensity += (al * 49152) >> 16; + + al = var_10E & 0x1F; + intensity += (al * 21140) >> 16; + + al = var_10E >> 8; + al = al & 7; + int nausea = (al * 327680) >> 16; + + al = var_10E >> 5; + al = al & 7; + nausea += (al * 204800) >> 16; + + al = var_10E & 0x1F; + nausea += (al * 42281) >> 16; + + rating_tuple rating = { excitement, intensity, nausea }; + return rating; +} + /** + * rct2: 0x0065DF72 + */ +static rating_tuple get_var_110_rating(uint16 var_110) { + int al; + + al = var_110 >> 8; + al = al & 7; + int excitement = (al * 245760) >> 16; + + al = var_110 >> 5; + al = al & 7; + excitement += (al * 245760) >> 16; + + al = var_110 & 0x1F; + excitement += (al * 73992) >> 16; + + al = var_110 >> 8; + al = al & 7; + int intensity = (al * 81920) >> 16; + + al = var_110 >> 5; + al = al & 7; + intensity += (al * 49152) >> 16; + + al = var_110 & 0x1F; + intensity += (al * 21140) >> 16; + + al = var_110 >> 8; + al = al & 7; + int nausea = (al * 327680) >> 16; + + al = var_110 >> 5; + al = al & 7; + nausea += (al * 204800) >> 16; + + al = var_110 & 0x1F; + nausea += (al * 48623) >> 16; + + rating_tuple rating = { excitement, intensity, nausea }; + return rating; +} + +/** + * rct2: 0x0065E047 + */ +static rating_tuple get_var_112_rating(uint16 var_112) { + int al; + + al = var_112 >> 11; + al = min(al & 0x3F, 4); + int excitement = (al * 491520) >> 16; + + al = var_112 >> 11; + al = min(al & 0x3F, 8); + int nausea = (al * 491520) >> 16; + + al = var_112 >> 8; + al = min(al & 7, 6); + excitement += (al * 273066) >> 16; + + al = var_112 >> 5; + al = min(al & 7, 6); + excitement += (al * 240298) >> 16; + + al = min(var_112 & 0x1F, 7); + excitement += (al * 187245) >> 16; + + rating_tuple rating = { excitement, 0, nausea }; + return rating; +} + +/** + * rct2: 0x0065E0F2 + */ +static rating_tuple get_inversions_ratings(uint8 inversions) { + inversions = inversions & 0x1F; + + int a = min(inversions, 6); + int excitement = (a * 1747626) >> 16; + + int intensity = (inversions * 3276800) >> 16; + int nausea = (inversions * 1419946) >> 16; + + rating_tuple rating = { excitement, intensity, nausea }; + return rating; +} + +/* * + */ +static rating_tuple get_var_0D5_rating(uint8 type, uint8 var_0D5) { + int excitement = 0, intensity = 0, nausea = 0; + if (type == RIDE_TYPE_GHOST_TRAIN) { + if (var_0D5 & 0x20) { + excitement += 40; + intensity += 25; + nausea += 55; + } + } else if (type == RIDE_TYPE_LOG_FLUME) { + if (var_0D5 & 0x40) { + excitement += 48; + intensity += 55; + nausea += 65; + } + } else { + if (var_0D5 & 0x20) { + excitement += 50; + intensity += 30; + nausea += 20; + } + if (var_0D5 & 0x40) { + excitement += 55; + intensity += 30; + } + if (var_0D5 & 0x80) { + excitement += 35; + intensity += 20; + nausea += 23; + } + } + int al = min(var_0D5, 9); + excitement += (al * 254862) >> 16; + + al = min(var_0D5, 11); + intensity += (al * 148945) >> 16; + + al = max(var_0D5 - 5, 0); + al = min(al, 10); + nausea += (al * 1310720) >> 16; + + rating_tuple rating = { excitement, intensity, nausea }; + return rating; +} + +/** * rct2: 0x0065DDD1 */ static rating_tuple sub_65DDD1(rct_ride *ride) { - int eax, ebx, ecx, edx, esi, edi, ebp; - edi = (int)ride; - RCT2_CALLFUNC_X(0x0065DDD1, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + int excitement = 0, intensity = 0, nausea = 0; - rating_tuple rating = { ebx, ecx, ebp }; + rating_tuple var_0D5_rating = get_var_0D5_rating(ride->type, ride->var_0D5); + excitement += var_0D5_rating.excitement; + intensity += var_0D5_rating.intensity; + nausea += var_0D5_rating.nausea; + + rating_tuple var_10E_rating = get_var_10E_rating(ride->var_10E); + excitement += var_10E_rating.excitement; + intensity += var_10E_rating.intensity; + nausea += var_10E_rating.nausea; + + rating_tuple var_110_rating = get_var_110_rating(ride->var_110); + excitement += var_110_rating.excitement; + intensity += var_110_rating.intensity; + nausea += var_110_rating.nausea; + + rating_tuple var_112_rating = get_var_112_rating(ride->var_112); + excitement += var_112_rating.excitement; + intensity += var_112_rating.intensity; + nausea += var_112_rating.nausea; + + rating_tuple inversions_rating = get_inversions_ratings(ride->inversions); + excitement += inversions_rating.excitement; + intensity += inversions_rating.intensity; + nausea += inversions_rating.nausea; + + rating_tuple rating = { excitement, intensity, nausea }; return rating; } From 6f5bbe1588f8241f3a1e4674b45a2ac4ad0e1ae1 Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Mon, 30 Mar 2015 21:07:06 -0700 Subject: [PATCH 2/6] Add helper functions for accessing data in var_0D5 --- src/ride/ride.c | 29 +++++++++++++++++++++++++++++ src/ride/ride.h | 25 ++++++++++++++++++++++--- src/ride/ride_ratings.c | 27 ++++++++++++++------------- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index dc0d97637b..cbe720a661 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3590,3 +3590,32 @@ bool ride_type_has_flag(int rideType, int flag) { return (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (rideType * 8), uint32) & flag) != 0; } + +bool ride_has_spinning_tunnel(rct_ride *ride) { + return ride->special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; +} + +bool ride_has_water_splash(rct_ride *ride) { + return ride->special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; +} + +bool ride_has_rapids(rct_ride *ride) { + return ride->special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; +} + +bool ride_has_log_reverser(rct_ride *ride) { + return ride->special_track_elements & RIDE_ELEMENT_REVERSER_OR_WATERFALL; +} + +bool ride_has_waterfall(rct_ride *ride) { + return ride->special_track_elements & RIDE_ELEMENT_REVERSER_OR_WATERFALL; +} + +bool ride_has_whirlpool(rct_ride *ride) { + return ride->special_track_elements & RIDE_ELEMENT_WHIRLPOOL; +} + +uint8 ride_get_helix_sections(rct_ride *ride) { + // Helix sections stored in the low 5 bits. + return ride->special_track_elements & 0x1F; +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 2567e6e661..4d16de8900 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -172,13 +172,17 @@ typedef struct { }; uint8 pad_0D1[0x3]; uint8 measurement_index; // 0x0D4 - uint8 var_0D5; - uint8 pad_0D6[0x2]; + // bits 0 through 4 are the number of helix sections + // bit 5: spinning tunnel, water splash, or rapids + // bit 6: log reverser, waterfall + // bit 7: whirlpool + uint8 special_track_elements; // 0x0D5 + uint8 pad_0D6[2]; // Divide this value by 29127 to get the human-readable max speed // (in RCT2, display_speed = (max_speed * 9) >> 18) sint32 max_speed; // 0x0D8 sint32 average_speed; // 0x0DC - uint8 pad_0E0[0x4]; + uint8 pad_0E0[4]; sint32 length[4]; // 0x0E4 uint16 time[4]; // 0x0F4 fixed16_2dp max_positive_vertical_g; // 0x0FC @@ -646,6 +650,13 @@ enum { RIDE_MEASUREMENT_FLAG_G_FORCES = 1 << 2 }; +// Constants for ride->special_track_elements +enum { + RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS = 1 << 5, + RIDE_ELEMENT_REVERSER_OR_WATERFALL = 1 << 6, + RIDE_ELEMENT_WHIRLPOOL = 1 << 7 +}; + enum { RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN = 1 << 0, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL = 1 << 1, @@ -753,6 +764,14 @@ void ride_set_name(int rideIndex, const char *name); void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +uint8 ride_get_helix_sections(rct_ride *ride); +bool ride_has_spinning_tunnel(rct_ride *ride); +bool ride_has_water_splash(rct_ride *ride); +bool ride_has_rapids(rct_ride *ride); +bool ride_has_log_reverser(rct_ride *ride); +bool ride_has_waterfall(rct_ride *ride); +bool ride_has_whirlpool(rct_ride *ride); + bool ride_type_has_flag(int rideType, int flag); #endif diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 821d456ad4..3393382017 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -730,43 +730,44 @@ static rating_tuple get_inversions_ratings(uint8 inversions) { /* * */ -static rating_tuple get_var_0D5_rating(uint8 type, uint8 var_0D5) { +static rating_tuple get_special_track_elements_rating(uint8 type, uint8 special_track_elements) { int excitement = 0, intensity = 0, nausea = 0; if (type == RIDE_TYPE_GHOST_TRAIN) { - if (var_0D5 & 0x20) { + if (special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS) { excitement += 40; intensity += 25; nausea += 55; } } else if (type == RIDE_TYPE_LOG_FLUME) { - if (var_0D5 & 0x40) { + // Reverser for log flume + if (special_track_elements & RIDE_ELEMENT_REVERSER_OR_WATERFALL) { excitement += 48; intensity += 55; nausea += 65; } } else { - if (var_0D5 & 0x20) { + if (special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS) { excitement += 50; intensity += 30; nausea += 20; } - if (var_0D5 & 0x40) { + if (special_track_elements & RIDE_ELEMENT_REVERSER_OR_WATERFALL) { excitement += 55; intensity += 30; } - if (var_0D5 & 0x80) { + if (special_track_elements & RIDE_ELEMENT_WHIRLPOOL) { excitement += 35; intensity += 20; nausea += 23; } } - int al = min(var_0D5, 9); + int al = min(special_track_elements, 9); excitement += (al * 254862) >> 16; - al = min(var_0D5, 11); + al = min(special_track_elements, 11); intensity += (al * 148945) >> 16; - al = max(var_0D5 - 5, 0); + al = max(special_track_elements - 5, 0); al = min(al, 10); nausea += (al * 1310720) >> 16; @@ -781,10 +782,10 @@ static rating_tuple sub_65DDD1(rct_ride *ride) { int excitement = 0, intensity = 0, nausea = 0; - rating_tuple var_0D5_rating = get_var_0D5_rating(ride->type, ride->var_0D5); - excitement += var_0D5_rating.excitement; - intensity += var_0D5_rating.intensity; - nausea += var_0D5_rating.nausea; + rating_tuple special_track_element_rating = get_special_track_elements_rating(ride->type, ride->special_track_elements); + excitement += special_track_element_rating.excitement; + intensity += special_track_element_rating.intensity; + nausea += special_track_element_rating.nausea; rating_tuple var_10E_rating = get_var_10E_rating(ride->var_10E); excitement += var_10E_rating.excitement; From fc5cfe252db275a7a691eeb0b522494ffa196aaf Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Tue, 31 Mar 2015 20:15:41 -0700 Subject: [PATCH 3/6] call new functions --- src/ride/ride_ratings.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 3393382017..aee5bd6e29 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -730,44 +730,45 @@ static rating_tuple get_inversions_ratings(uint8 inversions) { /* * */ -static rating_tuple get_special_track_elements_rating(uint8 type, uint8 special_track_elements) { +static rating_tuple get_special_track_elements_rating(uint8 type, rct_ride *ride) { int excitement = 0, intensity = 0, nausea = 0; if (type == RIDE_TYPE_GHOST_TRAIN) { - if (special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS) { + if (ride_has_spinning_tunnel(ride)) { excitement += 40; intensity += 25; nausea += 55; } } else if (type == RIDE_TYPE_LOG_FLUME) { // Reverser for log flume - if (special_track_elements & RIDE_ELEMENT_REVERSER_OR_WATERFALL) { + if (ride_has_log_reverser(ride)) { excitement += 48; intensity += 55; nausea += 65; } } else { - if (special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS) { + if (ride_has_water_splash(ride)) { excitement += 50; intensity += 30; nausea += 20; } - if (special_track_elements & RIDE_ELEMENT_REVERSER_OR_WATERFALL) { + if (ride_has_waterfall(ride)) { excitement += 55; intensity += 30; } - if (special_track_elements & RIDE_ELEMENT_WHIRLPOOL) { + if (ride_has_whirlpool(ride)) { excitement += 35; intensity += 20; nausea += 23; } } - int al = min(special_track_elements, 9); + uint8 helix_sections = ride_get_helix_sections(ride); + int al = min(helix_sections, 9); excitement += (al * 254862) >> 16; - al = min(special_track_elements, 11); + al = min(helix_sections, 11); intensity += (al * 148945) >> 16; - al = max(special_track_elements - 5, 0); + al = max(helix_sections - 5, 0); al = min(al, 10); nausea += (al * 1310720) >> 16; @@ -782,7 +783,7 @@ static rating_tuple sub_65DDD1(rct_ride *ride) { int excitement = 0, intensity = 0, nausea = 0; - rating_tuple special_track_element_rating = get_special_track_elements_rating(ride->type, ride->special_track_elements); + rating_tuple special_track_element_rating = get_special_track_elements_rating(ride->type, ride); excitement += special_track_element_rating.excitement; intensity += special_track_element_rating.intensity; nausea += special_track_element_rating.nausea; From dd133d4313ee41bf2c87ccbef79960f31bb68a4b Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Tue, 31 Mar 2015 22:04:23 -0700 Subject: [PATCH 4/6] move var_10E functions into their own accessor --- src/ride/ride.c | 21 ++++++++++++ src/ride/ride.h | 4 +++ src/ride/ride_ratings.c | 73 +++++++++++++++-------------------------- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index cbe720a661..9e6e2bfe76 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3591,6 +3591,27 @@ bool ride_type_has_flag(int rideType, int flag) return (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (rideType * 8), uint32) & flag) != 0; } +/* + * The next three functions are helpers to access ride data at the offset 10E. + * We believe it stores three distinct values in the following format: + * + * unknown1: bits 9-11 + * unknown2: bits 6-8 + * unknown3: low 5 bits + */ + +int get_var_10E_unk_1(rct_ride* ride) { + return (ride->var_10E >> 8) & 0x7; +} + +int get_var_10E_unk_2(rct_ride* ride) { + return (ride->var_10E >> 5) & 0x7; +} + +int get_var_10E_unk_3(rct_ride* ride) { + return ride->var_10E & 0x1F; +} + bool ride_has_spinning_tunnel(rct_ride *ride) { return ride->special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; } diff --git a/src/ride/ride.h b/src/ride/ride.h index 4d16de8900..8e2f2c6cef 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -764,6 +764,10 @@ void ride_set_name(int rideIndex, const char *name); void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +int get_var_10E_unk_1(rct_ride* ride); +int get_var_10E_unk_2(rct_ride* ride); +int get_var_10E_unk_3(rct_ride* ride); + uint8 ride_get_helix_sections(rct_ride *ride); bool ride_has_spinning_tunnel(rct_ride *ride); bool ride_has_water_splash(rct_ride *ride); diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index aee5bd6e29..b78cfe1ead 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -599,41 +599,22 @@ static int sub_65E72D(rct_ride *ride) return edx & 0xFFFF; } -static rating_tuple get_var_10E_rating(uint16 var_10E) { - int al; - al = var_10E >> 8; - al = al & 7; - int excitement = (al * 163840) >> 16; +static rating_tuple get_var_10E_rating(rct_ride* ride) { + int var_10E_unk_1 = get_var_10E_unk_1(ride); + int var_10E_unk_2 = get_var_10E_unk_2(ride); + int var_10E_unk_3 = get_var_10E_unk_3(ride); - al = var_10E >> 5; - al = al & 7; - excitement += (al * 196608) >> 16; + int excitement = (var_10E_unk_1 * 0x28000) >> 16; + excitement += var_10E_unk_2 / 3; + excitement += (var_10E_unk_3 * 63421) >> 16; - // Low bits, 0x0065DF3A - al = var_10E & 0x1F; - excitement += (al * 63421) >> 16; + int intensity = (var_10E_unk_1 * 81920) >> 16; + intensity += (var_10E_unk_2 * 49152) >> 16; + intensity += (var_10E_unk_3 * 21140) >> 16; - al = var_10E >> 8; - al = al & 7; - int intensity = (al * 81920) >> 16; - - al = var_10E >> 5; - al = al & 7; - intensity += (al * 49152) >> 16; - - al = var_10E & 0x1F; - intensity += (al * 21140) >> 16; - - al = var_10E >> 8; - al = al & 7; - int nausea = (al * 327680) >> 16; - - al = var_10E >> 5; - al = al & 7; - nausea += (al * 204800) >> 16; - - al = var_10E & 0x1F; - nausea += (al * 42281) >> 16; + int nausea = var_10E_unk_1 / 5; + nausea += (var_10E_unk_2 * 0x3200) >> 16; + nausea += (var_10E_unk_3 * 42281) >> 16; rating_tuple rating = { excitement, intensity, nausea }; return rating; @@ -647,18 +628,18 @@ static rating_tuple get_var_110_rating(uint16 var_110) { al = var_110 >> 8; al = al & 7; - int excitement = (al * 245760) >> 16; + int excitement = (al * 0x3c000) >> 16; al = var_110 >> 5; al = al & 7; - excitement += (al * 245760) >> 16; + excitement += (al * 0x3c000) >> 16; al = var_110 & 0x1F; excitement += (al * 73992) >> 16; al = var_110 >> 8; al = al & 7; - int intensity = (al * 81920) >> 16; + int intensity = (al * 0x14000) >> 16; al = var_110 >> 5; al = al & 7; @@ -669,11 +650,11 @@ static rating_tuple get_var_110_rating(uint16 var_110) { al = var_110 >> 8; al = al & 7; - int nausea = (al * 327680) >> 16; + int nausea = al / 5; al = var_110 >> 5; al = al & 7; - nausea += (al * 204800) >> 16; + nausea += (al * 0x32000) >> 16; al = var_110 & 0x1F; nausea += (al * 48623) >> 16; @@ -690,11 +671,11 @@ static rating_tuple get_var_112_rating(uint16 var_112) { al = var_112 >> 11; al = min(al & 0x3F, 4); - int excitement = (al * 491520) >> 16; + int excitement = (al * 0x78000) >> 16; al = var_112 >> 11; al = min(al & 0x3F, 8); - int nausea = (al * 491520) >> 16; + int nausea = (al * 0x78000) >> 16; al = var_112 >> 8; al = min(al & 7, 6); @@ -702,7 +683,7 @@ static rating_tuple get_var_112_rating(uint16 var_112) { al = var_112 >> 5; al = min(al & 7, 6); - excitement += (al * 240298) >> 16; + excitement += (al * 0x3aaaa) >> 16; al = min(var_112 & 0x1F, 7); excitement += (al * 187245) >> 16; @@ -718,10 +699,10 @@ static rating_tuple get_inversions_ratings(uint8 inversions) { inversions = inversions & 0x1F; int a = min(inversions, 6); - int excitement = (a * 1747626) >> 16; + int excitement = (a * 0x1aaaaa) >> 16; - int intensity = (inversions * 3276800) >> 16; - int nausea = (inversions * 1419946) >> 16; + int intensity = inversions / 5; + int nausea = (inversions * 0x15aaaa) >> 16; rating_tuple rating = { excitement, intensity, nausea }; return rating; @@ -770,7 +751,7 @@ static rating_tuple get_special_track_elements_rating(uint8 type, rct_ride *ride al = max(helix_sections - 5, 0); al = min(al, 10); - nausea += (al * 1310720) >> 16; + nausea += (al * 0x140000) >> 16; rating_tuple rating = { excitement, intensity, nausea }; return rating; @@ -788,7 +769,7 @@ static rating_tuple sub_65DDD1(rct_ride *ride) intensity += special_track_element_rating.intensity; nausea += special_track_element_rating.nausea; - rating_tuple var_10E_rating = get_var_10E_rating(ride->var_10E); + rating_tuple var_10E_rating = get_var_10E_rating(ride); excitement += var_10E_rating.excitement; intensity += var_10E_rating.intensity; nausea += var_10E_rating.nausea; @@ -852,7 +833,7 @@ static rating_tuple ride_ratings_get_gforce_ratings(rct_ride *ride) // 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.intensity += ride->max_lateral_g; result.nausea += (ride->max_lateral_g * 21845) >> 16; // Very high lateral G force penalty From 8c210d834c3e3749c4940a46bf533cc09906012c Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Tue, 31 Mar 2015 22:09:05 -0700 Subject: [PATCH 5/6] Decompile var_110 --- src/ride/ride.c | 16 ++++++++++++-- src/ride/ride.h | 3 +++ src/ride/ride_ratings.c | 47 ++++++++++++----------------------------- 3 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 9e6e2bfe76..e83714b864 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3592,8 +3592,8 @@ bool ride_type_has_flag(int rideType, int flag) } /* - * The next three functions are helpers to access ride data at the offset 10E. - * We believe it stores three distinct values in the following format: + * The next six functions are helpers to access ride data at the offset 10E & + * 110. We believe it stores three distinct values in the following format: * * unknown1: bits 9-11 * unknown2: bits 6-8 @@ -3612,6 +3612,18 @@ int get_var_10E_unk_3(rct_ride* ride) { return ride->var_10E & 0x1F; } +int get_var_110_unk_1(rct_ride* ride) { + return (ride->var_110 >> 8) & 0x7; +} + +int get_var_110_unk_2(rct_ride* ride) { + return (ride->var_110 >> 5) & 0x7; +} + +int get_var_110_unk_3(rct_ride* ride) { + return ride->var_110 & 0x1F; +} + bool ride_has_spinning_tunnel(rct_ride *ride) { return ride->special_track_elements & RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; } diff --git a/src/ride/ride.h b/src/ride/ride.h index 8e2f2c6cef..47ccb3923d 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -767,6 +767,9 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); int get_var_10E_unk_3(rct_ride* ride); +int get_var_110_unk_1(rct_ride* ride); +int get_var_110_unk_2(rct_ride* ride); +int get_var_110_unk_3(rct_ride* ride); uint8 ride_get_helix_sections(rct_ride *ride); bool ride_has_spinning_tunnel(rct_ride *ride); diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index b78cfe1ead..97a2cc19a3 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -623,41 +623,22 @@ static rating_tuple get_var_10E_rating(rct_ride* ride) { /** * rct2: 0x0065DF72 */ -static rating_tuple get_var_110_rating(uint16 var_110) { - int al; +static rating_tuple get_var_110_rating(rct_ride* ride) { + int var_10E_unk_1 = get_var_10E_unk_1(ride); + int var_10E_unk_2 = get_var_10E_unk_2(ride); + int var_10E_unk_3 = get_var_10E_unk_3(ride); - al = var_110 >> 8; - al = al & 7; - int excitement = (al * 0x3c000) >> 16; + int excitement = (var_10E_unk_1 * 0x3c000) >> 16; + excitement += (var_10E_unk_2 * 0x3c000) >> 16; + excitement += (var_10E_unk_3 * 73992) >> 16; - al = var_110 >> 5; - al = al & 7; - excitement += (al * 0x3c000) >> 16; + int intensity = (var_10E_unk_1 * 0x14000) >> 16; + intensity += (var_10E_unk_2 * 49152) >> 16; + intensity += (var_10E_unk_3 * 21140) >> 16; - al = var_110 & 0x1F; - excitement += (al * 73992) >> 16; - - al = var_110 >> 8; - al = al & 7; - int intensity = (al * 0x14000) >> 16; - - al = var_110 >> 5; - al = al & 7; - intensity += (al * 49152) >> 16; - - al = var_110 & 0x1F; - intensity += (al * 21140) >> 16; - - al = var_110 >> 8; - al = al & 7; - int nausea = al / 5; - - al = var_110 >> 5; - al = al & 7; - nausea += (al * 0x32000) >> 16; - - al = var_110 & 0x1F; - nausea += (al * 48623) >> 16; + int nausea = var_10E_unk_1 / 5; + nausea += (var_10E_unk_2 * 0x32000) >> 16; + nausea += (var_10E_unk_3 * 48623) >> 16; rating_tuple rating = { excitement, intensity, nausea }; return rating; @@ -774,7 +755,7 @@ static rating_tuple sub_65DDD1(rct_ride *ride) intensity += var_10E_rating.intensity; nausea += var_10E_rating.nausea; - rating_tuple var_110_rating = get_var_110_rating(ride->var_110); + rating_tuple var_110_rating = get_var_110_rating(ride); excitement += var_110_rating.excitement; intensity += var_110_rating.intensity; nausea += var_110_rating.nausea; From 0ad89da51c07bad2915cd418f4e96f3fb9508806 Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Tue, 31 Mar 2015 22:11:03 -0700 Subject: [PATCH 6/6] division -> multiplication --- src/ride/ride_ratings.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 97a2cc19a3..7b8cd55775 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -605,14 +605,14 @@ 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 * 3; 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; + int nausea = var_10E_unk_1 * 5; nausea += (var_10E_unk_2 * 0x3200) >> 16; nausea += (var_10E_unk_3 * 42281) >> 16; @@ -636,7 +636,7 @@ static rating_tuple get_var_110_rating(rct_ride* ride) { intensity += (var_10E_unk_2 * 49152) >> 16; intensity += (var_10E_unk_3 * 21140) >> 16; - int nausea = var_10E_unk_1 / 5; + int nausea = var_10E_unk_1 * 5; nausea += (var_10E_unk_2 * 0x32000) >> 16; nausea += (var_10E_unk_3 * 48623) >> 16; @@ -682,7 +682,7 @@ static rating_tuple get_inversions_ratings(uint8 inversions) { int a = min(inversions, 6); int excitement = (a * 0x1aaaaa) >> 16; - int intensity = inversions / 5; + int intensity = inversions * 5; int nausea = (inversions * 0x15aaaa) >> 16; rating_tuple rating = { excitement, intensity, nausea }; @@ -1044,7 +1044,7 @@ static void ride_ratings_calculate_maze(rct_ride *ride) // Apply size factor int unk = min(ride->maze_tiles, 100); ratings.excitement += unk; - ratings.intensity += unk / 2; + ratings.intensity += unk * 2; ratings.excitement += (ride_ratings_get_scenery_score(ride) * 22310) >> 16;