1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-24 00:03:11 +01:00

Added sub_state_4, 5, 6, fixed crash caused by too many peeps on ferris wheel

This commit is contained in:
Duncan Frost
2015-03-21 12:12:59 +00:00
parent bfe92e07f4
commit 4971a69a93

View File

@@ -1030,7 +1030,7 @@ static void peep_update_ride_sub_state_0(rct_peep* peep){
if (ride->mode == RIDE_MODE_FORWARD_ROTATION ||
ride->mode == RIDE_MODE_BACKWARD_ROTATION)
{
uint8 position = ((~vehicle->var_1F + 1) >> 3) & 0xF;
uint8 position = (((~vehicle->var_1F + 1) >> 3) & 0xF) * 2;
if (vehicle->peep[position] != 0xFFFF)
continue;
}
@@ -1508,8 +1508,8 @@ static void peep_update_ride_sub_state_2(rct_peep* peep){
!(GET_VEHICLE(ride->vehicles[peep->current_train]))->var_48 & (1 << 4))
return;
if (!ride->mode == RIDE_MODE_FORWARD_ROTATION &&
!ride->mode == RIDE_MODE_BACKWARD_ROTATION){
if (ride->mode != RIDE_MODE_FORWARD_ROTATION &&
ride->mode != RIDE_MODE_BACKWARD_ROTATION){
if (vehicle->next_free_seat - 1 != peep->current_seat)
return;
}
@@ -1520,6 +1520,59 @@ static void peep_update_ride_sub_state_2(rct_peep* peep){
peep_update_ride_sub_state_2_rejoin_queue(peep, ride);
}
static void peep_update_ride_sub_state_5(rct_peep* peep){
rct_ride* ride = GET_RIDE(peep->current_ride);
rct_vehicle* vehicle = GET_VEHICLE(ride->vehicles[peep->current_train]);
for (int i = peep->current_car; i != 0; --i){
vehicle = GET_VEHICLE(vehicle->next_vehicle_on_train);
}
if (ride->mode != RIDE_MODE_FORWARD_ROTATION &&
ride->mode != RIDE_MODE_BACKWARD_ROTATION){
if (peep->current_seat != vehicle->num_peeps)
return;
}
if (vehicle->num_seats & 0x80){
rct_peep* seated_peep = GET_PEEP(vehicle->peep[peep->current_seat ^ 1]);
if (seated_peep->sub_state != 5)
return;
vehicle->num_peeps++;
ride->var_120++;
vehicle->var_46 += seated_peep->var_41;
invalidate_sprite((rct_sprite*)seated_peep);
sprite_move(0x8000, 0, 0, (rct_sprite*)seated_peep);
peep_decrement_num_riders(seated_peep);
seated_peep->state = PEEP_STATE_ON_RIDE;
peep_window_state_update(seated_peep);
seated_peep->var_E2 = 0;
seated_peep->sub_state = 6;
RCT2_CALLPROC_X(0x00695444, 0, 0, 0, seated_peep->current_ride, (int)seated_peep, 0, 0);
}
vehicle->num_peeps++;
ride->var_120++;
vehicle->var_46 += peep->var_41;
invalidate_sprite((rct_sprite*)vehicle);
invalidate_sprite((rct_sprite*)peep);
sprite_move(0x8000, 0, 0, (rct_sprite*)peep);
peep_decrement_num_riders(peep);
peep->state = PEEP_STATE_ON_RIDE;
peep_window_state_update(peep);
peep->var_E2 = 0;
peep->sub_state = 6;
RCT2_CALLPROC_X(0x00695444, 0, 0, 0, peep->current_ride, (int)peep, 0, 0);
}
/* rct2: 0x691A30
* Used by entering_ride and queueing_front */
static void peep_update_ride(rct_peep* peep){
@@ -1536,6 +1589,26 @@ static void peep_update_ride(rct_peep* peep){
case 3:
peep_update_ride_sub_state_1(peep);
break;
case 4:
{
sint16 x, y, xy_distance;
if (!peep_update_action(&x, &y, &xy_distance, peep))
{
peep->sub_state = 5;
break;
}
invalidate_sprite((rct_sprite*)peep);
sprite_move(x, y, peep->z, (rct_sprite*)peep);
invalidate_sprite((rct_sprite*)peep);
break;
}
case 5:
peep_update_ride_sub_state_5(peep);
break;
case 6:
// No action, on ride.
break;
default:
RCT2_CALLPROC_X(RCT2_ADDRESS(0x9820DC, int)[peep->sub_state], 0, 0, 0, 0, (int)peep, 0, 0);
}