mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #980 from kevinburke/sub_65DDD1
Decompile sub_65DDD1
This commit is contained in:
commit
11efc58374
|
@ -3594,3 +3594,65 @@ bool ride_type_has_flag(int rideType, int flag)
|
||||||
{
|
{
|
||||||
return (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (rideType * 8), uint32) & flag) != 0;
|
return (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (rideType * 8), uint32) & flag) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -169,13 +169,17 @@ typedef struct {
|
||||||
};
|
};
|
||||||
uint8 pad_0D1[0x3];
|
uint8 pad_0D1[0x3];
|
||||||
uint8 measurement_index; // 0x0D4
|
uint8 measurement_index; // 0x0D4
|
||||||
uint8 var_0D5;
|
// bits 0 through 4 are the number of helix sections
|
||||||
uint8 pad_0D6[0x2];
|
// 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
|
// Divide this value by 29127 to get the human-readable max speed
|
||||||
// (in RCT2, display_speed = (max_speed * 9) >> 18)
|
// (in RCT2, display_speed = (max_speed * 9) >> 18)
|
||||||
sint32 max_speed; // 0x0D8
|
sint32 max_speed; // 0x0D8
|
||||||
sint32 average_speed; // 0x0DC
|
sint32 average_speed; // 0x0DC
|
||||||
uint8 pad_0E0[0x4];
|
uint8 pad_0E0[4];
|
||||||
sint32 length[4]; // 0x0E4
|
sint32 length[4]; // 0x0E4
|
||||||
uint16 time[4]; // 0x0F4
|
uint16 time[4]; // 0x0F4
|
||||||
fixed16_2dp max_positive_vertical_g; // 0x0FC
|
fixed16_2dp max_positive_vertical_g; // 0x0FC
|
||||||
|
@ -643,6 +647,13 @@ enum {
|
||||||
RIDE_MEASUREMENT_FLAG_G_FORCES = 1 << 2
|
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 {
|
enum {
|
||||||
RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN = 1 << 0,
|
RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN = 1 << 0,
|
||||||
RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL = 1 << 1,
|
RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL = 1 << 1,
|
||||||
|
@ -750,6 +761,21 @@ 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_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);
|
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);
|
||||||
|
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);
|
||||||
|
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);
|
bool ride_type_has_flag(int rideType, int flag);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -599,17 +599,178 @@ static int sub_65E72D(rct_ride *ride)
|
||||||
return edx & 0xFFFF;
|
return edx & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
int excitement = (var_10E_unk_1 * 0x28000) >> 16;
|
||||||
|
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;
|
||||||
|
nausea += (var_10E_unk_2 * 0x3200) >> 16;
|
||||||
|
nausea += (var_10E_unk_3 * 42281) >> 16;
|
||||||
|
|
||||||
|
rating_tuple rating = { excitement, intensity, nausea };
|
||||||
|
return rating;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* rct2: 0x0065DF72
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
|
||||||
|
int excitement = (var_10E_unk_1 * 0x3c000) >> 16;
|
||||||
|
excitement += (var_10E_unk_2 * 0x3c000) >> 16;
|
||||||
|
excitement += (var_10E_unk_3 * 73992) >> 16;
|
||||||
|
|
||||||
|
int intensity = (var_10E_unk_1 * 0x14000) >> 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 * 0x32000) >> 16;
|
||||||
|
nausea += (var_10E_unk_3 * 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 * 0x78000) >> 16;
|
||||||
|
|
||||||
|
al = var_112 >> 11;
|
||||||
|
al = min(al & 0x3F, 8);
|
||||||
|
int nausea = (al * 0x78000) >> 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 * 0x3aaaa) >> 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 * 0x1aaaaa) >> 16;
|
||||||
|
|
||||||
|
int intensity = inversions * 5;
|
||||||
|
int nausea = (inversions * 0x15aaaa) >> 16;
|
||||||
|
|
||||||
|
rating_tuple rating = { excitement, intensity, nausea };
|
||||||
|
return rating;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
*
|
*
|
||||||
|
*/
|
||||||
|
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 (ride_has_spinning_tunnel(ride)) {
|
||||||
|
excitement += 40;
|
||||||
|
intensity += 25;
|
||||||
|
nausea += 55;
|
||||||
|
}
|
||||||
|
} else if (type == RIDE_TYPE_LOG_FLUME) {
|
||||||
|
// Reverser for log flume
|
||||||
|
if (ride_has_log_reverser(ride)) {
|
||||||
|
excitement += 48;
|
||||||
|
intensity += 55;
|
||||||
|
nausea += 65;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ride_has_water_splash(ride)) {
|
||||||
|
excitement += 50;
|
||||||
|
intensity += 30;
|
||||||
|
nausea += 20;
|
||||||
|
}
|
||||||
|
if (ride_has_waterfall(ride)) {
|
||||||
|
excitement += 55;
|
||||||
|
intensity += 30;
|
||||||
|
}
|
||||||
|
if (ride_has_whirlpool(ride)) {
|
||||||
|
excitement += 35;
|
||||||
|
intensity += 20;
|
||||||
|
nausea += 23;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint8 helix_sections = ride_get_helix_sections(ride);
|
||||||
|
int al = min(helix_sections, 9);
|
||||||
|
excitement += (al * 254862) >> 16;
|
||||||
|
|
||||||
|
al = min(helix_sections, 11);
|
||||||
|
intensity += (al * 148945) >> 16;
|
||||||
|
|
||||||
|
al = max(helix_sections - 5, 0);
|
||||||
|
al = min(al, 10);
|
||||||
|
nausea += (al * 0x140000) >> 16;
|
||||||
|
|
||||||
|
rating_tuple rating = { excitement, intensity, nausea };
|
||||||
|
return rating;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* rct2: 0x0065DDD1
|
* rct2: 0x0065DDD1
|
||||||
*/
|
*/
|
||||||
static rating_tuple sub_65DDD1(rct_ride *ride)
|
static rating_tuple sub_65DDD1(rct_ride *ride)
|
||||||
{
|
{
|
||||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
int excitement = 0, intensity = 0, nausea = 0;
|
||||||
edi = (int)ride;
|
|
||||||
RCT2_CALLFUNC_X(0x0065DDD1, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
|
||||||
|
|
||||||
rating_tuple rating = { ebx, ecx, ebp };
|
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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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;
|
return rating;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,7 +814,7 @@ static rating_tuple ride_ratings_get_gforce_ratings(rct_ride *ride)
|
||||||
|
|
||||||
// Apply lateral G force factor
|
// Apply lateral G force factor
|
||||||
result.excitement += (min(FIXED_2DP(1,50), ride->max_lateral_g) * 26214) >> 16;
|
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;
|
result.nausea += (ride->max_lateral_g * 21845) >> 16;
|
||||||
|
|
||||||
// Very high lateral G force penalty
|
// Very high lateral G force penalty
|
||||||
|
@ -883,7 +1044,7 @@ static void ride_ratings_calculate_maze(rct_ride *ride)
|
||||||
// Apply size factor
|
// Apply size factor
|
||||||
int unk = min(ride->maze_tiles, 100);
|
int unk = min(ride->maze_tiles, 100);
|
||||||
ratings.excitement += unk;
|
ratings.excitement += unk;
|
||||||
ratings.intensity += unk / 2;
|
ratings.intensity += unk * 2;
|
||||||
|
|
||||||
ratings.excitement += (ride_ratings_get_scenery_score(ride) * 22310) >> 16;
|
ratings.excitement += (ride_ratings_get_scenery_score(ride) * 22310) >> 16;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue