mirror of https://github.com/OpenRCT2/OpenRCT2.git
implement ride_ratings_check_valid_configuration and finalise other ride rating functions
This commit is contained in:
parent
6acf52ce63
commit
c36e9d9cb8
|
@ -554,6 +554,9 @@ bool track_block_get_previous_from_zero(sint16 x, sint16 y, sint16 z, uint8 ride
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* rct2: 0x006C6402
|
* rct2: 0x006C6402
|
||||||
|
*
|
||||||
|
* @remarks outTrackBeginEnd.begin_x and outTrackBeginEnd.begin_y will be in the higher two bytes of ecx and edx where as
|
||||||
|
outTrackBeginEnd.end_x and outTrackBeginEnd.end_y will be in the lower two bytes (cx and dx).
|
||||||
*/
|
*/
|
||||||
bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd)
|
bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,6 +50,8 @@ static void ride_ratings_update_state_5();
|
||||||
static void loc_6B5BB2();
|
static void loc_6B5BB2();
|
||||||
static void ride_ratings_calculate(rct_ride *ride);
|
static void ride_ratings_calculate(rct_ride *ride);
|
||||||
static void ride_ratings_calculate_value(rct_ride *ride);
|
static void ride_ratings_calculate_value(rct_ride *ride);
|
||||||
|
static void sub_6B5F9D(rct_map_element *mapElement);
|
||||||
|
static void ride_ratings_check_valid_configuration(int rideIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -189,10 +191,6 @@ static void loc_6B5BB2()
|
||||||
*/
|
*/
|
||||||
static void ride_ratings_update_state_2()
|
static void ride_ratings_update_state_2()
|
||||||
{
|
{
|
||||||
// TODO test this function
|
|
||||||
RCT2_CALLPROC_EBPSAFE(0x006B5C66);
|
|
||||||
return;
|
|
||||||
|
|
||||||
rct_ride *ride;
|
rct_ride *ride;
|
||||||
rct_map_element *mapElement;
|
rct_map_element *mapElement;
|
||||||
rct_xy_element trackElement, nextTrackElement;
|
rct_xy_element trackElement, nextTrackElement;
|
||||||
|
@ -225,7 +223,7 @@ static void ride_ratings_update_state_2()
|
||||||
RCT2_GLOBAL(0x0138B5CE, uint16) |= 1;
|
RCT2_GLOBAL(0x0138B5CE, uint16) |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0);
|
sub_6B5F9D(mapElement);
|
||||||
|
|
||||||
trackElement.x = RCT2_GLOBAL(0x0138B584, uint16);
|
trackElement.x = RCT2_GLOBAL(0x0138B584, uint16);
|
||||||
trackElement.y = RCT2_GLOBAL(0x0138B586, uint16);
|
trackElement.y = RCT2_GLOBAL(0x0138B586, uint16);
|
||||||
|
@ -268,7 +266,7 @@ static void ride_ratings_update_state_3()
|
||||||
}
|
}
|
||||||
|
|
||||||
ride_ratings_calculate(ride);
|
ride_ratings_calculate(ride);
|
||||||
RCT2_CALLPROC_X(0x00655F64, 0, 0, 0, 0, 0, (int)ride, 0);
|
ride_ratings_check_valid_configuration(_rideRatingsCurrentRide);
|
||||||
ride_ratings_calculate_value(ride);
|
ride_ratings_calculate_value(ride);
|
||||||
|
|
||||||
window_invalidate_by_number(WC_RIDE, _rideRatingsCurrentRide);
|
window_invalidate_by_number(WC_RIDE, _rideRatingsCurrentRide);
|
||||||
|
@ -291,13 +289,9 @@ static void ride_ratings_update_state_4()
|
||||||
*/
|
*/
|
||||||
static void ride_ratings_update_state_5()
|
static void ride_ratings_update_state_5()
|
||||||
{
|
{
|
||||||
// sub_6C6402 returns a carry, CALLFUNC doesn't support this
|
|
||||||
// so have to wait for sub_6C6402 to be decompiled
|
|
||||||
RCT2_CALLPROC_EBPSAFE(0x006B5D72);
|
|
||||||
return;
|
|
||||||
|
|
||||||
rct_ride *ride;
|
rct_ride *ride;
|
||||||
rct_map_element *mapElement;
|
rct_map_element *mapElement;
|
||||||
|
track_begin_end trackBeginEnd;
|
||||||
int x, y, z, trackType;
|
int x, y, z, trackType;
|
||||||
|
|
||||||
ride = GET_RIDE(_rideRatingsCurrentRide);
|
ride = GET_RIDE(_rideRatingsCurrentRide);
|
||||||
|
@ -320,17 +314,17 @@ static void ride_ratings_update_state_5()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (trackType == 255 || trackType == mapElement->properties.track.type) {
|
if (trackType == 255 || trackType == mapElement->properties.track.type) {
|
||||||
RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0);
|
sub_6B5F9D(mapElement);
|
||||||
|
|
||||||
x = RCT2_GLOBAL(0x0138B584, uint16);
|
x = RCT2_GLOBAL(0x0138B584, uint16);
|
||||||
y = RCT2_GLOBAL(0x0138B586, uint16);
|
y = RCT2_GLOBAL(0x0138B586, uint16);
|
||||||
if (!track_block_get_previous(x, y, mapElement, NULL)) {
|
if (!track_block_get_previous(x, y, mapElement, &trackBeginEnd)) {
|
||||||
_rideRatingsState = RIDE_RATINGS_STATE_CALCULATE;
|
_rideRatingsState = RIDE_RATINGS_STATE_CALCULATE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
x >>= 16;
|
x = trackBeginEnd.begin_x;
|
||||||
y >>= 16;
|
y = trackBeginEnd.begin_y;
|
||||||
if (x == RCT2_GLOBAL(0x0138B58A, uint16) && y == RCT2_GLOBAL(0x0138B58C, uint16) && z == RCT2_GLOBAL(0x0138B58E, uint16)) {
|
if (x == RCT2_GLOBAL(0x0138B58A, uint16) && y == RCT2_GLOBAL(0x0138B58C, uint16) && z == RCT2_GLOBAL(0x0138B58E, uint16)) {
|
||||||
_rideRatingsState = RIDE_RATINGS_STATE_CALCULATE;
|
_rideRatingsState = RIDE_RATINGS_STATE_CALCULATE;
|
||||||
return;
|
return;
|
||||||
|
@ -345,6 +339,61 @@ static void ride_ratings_update_state_5()
|
||||||
_rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE;
|
_rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* rct2: 0x006B5F9D
|
||||||
|
*/
|
||||||
|
static void sub_6B5F9D(rct_map_element *mapElement)
|
||||||
|
{
|
||||||
|
RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* rct2: 0x00655F64
|
||||||
|
*/
|
||||||
|
static void ride_ratings_check_valid_configuration(int rideIndex)
|
||||||
|
{
|
||||||
|
rct_ride *ride = GET_RIDE(rideIndex);
|
||||||
|
|
||||||
|
// Check if launch speed is valid
|
||||||
|
switch (ride->mode) {
|
||||||
|
case RIDE_MODE_POWERED_LAUNCH_PASSTROUGH:
|
||||||
|
case RIDE_MODE_UPWARD_LAUNCH:
|
||||||
|
case RIDE_MODE_LIM_POWERED_LAUNCH:
|
||||||
|
case RIDE_MODE_POWERED_LAUNCH:
|
||||||
|
case RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED:
|
||||||
|
if (ride->launch_speed > RCT2_GLOBAL(0x0097CF40 + (ride->type * 8) + 5, uint8)) {
|
||||||
|
ride->unreliability_factor = 255;
|
||||||
|
ride->reliability /= 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if number of vehicles is valid
|
||||||
|
ride_update_max_vehicles(rideIndex);
|
||||||
|
if (ride->num_vehicles > ride->max_trains) {
|
||||||
|
ride->unreliability_factor = 255;
|
||||||
|
ride->reliability /= 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if ride entry is valid
|
||||||
|
uint8 *availableRideEntries = (uint8*)0x009E32F8;
|
||||||
|
for (int i = 0; i < ride->type; i++) {
|
||||||
|
while (*availableRideEntries != 255) availableRideEntries++;
|
||||||
|
*availableRideEntries++;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (ride->subtype == *availableRideEntries) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} while (*++availableRideEntries != 255);
|
||||||
|
|
||||||
|
ride->unreliability_factor = 255;
|
||||||
|
ride->reliability /= 8;
|
||||||
|
}
|
||||||
|
|
||||||
static void ride_ratings_calculate(rct_ride *ride)
|
static void ride_ratings_calculate(rct_ride *ride)
|
||||||
{
|
{
|
||||||
ride_ratings_calculation calcFunc;
|
ride_ratings_calculation calcFunc;
|
||||||
|
|
Loading…
Reference in New Issue