diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index de18b4b479..265d6ac42c 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -3484,12 +3484,12 @@ void Vehicle::CheckIfMissing() } } -static void vehicle_simulate_crash(Vehicle* vehicle) +void Vehicle::SimulateCrash() const { - auto ride = get_ride(vehicle->ride); - if (ride != nullptr) + auto curRide = get_ride(ride); + if (curRide != nullptr) { - ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; + curRide->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; } } @@ -3507,7 +3507,7 @@ void Vehicle::UpdateCollisionSetup() if (curRide->status == RIDE_STATUS_SIMULATING) { - vehicle_simulate_crash(this); + SimulateCrash(); return; } @@ -3589,7 +3589,7 @@ void Vehicle::UpdateCrashSetup() auto curRide = get_ride(ride); if (curRide != nullptr && curRide->status == RIDE_STATUS_SIMULATING) { - vehicle_simulate_crash(this); + SimulateCrash(); return; } SetState(VEHICLE_STATUS_CRASHING, sub_state); @@ -5230,131 +5230,131 @@ static void vehicle_kill_all_passengers(Vehicle* vehicle) } } -static void vehicle_crash_on_land(Vehicle* vehicle) +void Vehicle::CrashOnLand() { - auto ride = get_ride(vehicle->ride); - if (ride == nullptr) + auto curRide = get_ride(ride); + if (curRide == nullptr) return; - if (ride->status == RIDE_STATUS_SIMULATING) + if (curRide->status == RIDE_STATUS_SIMULATING) { - vehicle_simulate_crash(vehicle); + SimulateCrash(); return; } - vehicle->SetState(VEHICLE_STATUS_CRASHED, vehicle->sub_state); + SetState(VEHICLE_STATUS_CRASHED, sub_state); - if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED)) + if (!(curRide->lifecycle_flags & RIDE_LIFECYCLE_CRASHED)) { - auto frontVehicle = vehicle->GetHead(); - auto trainIndex = ride_get_train_index_from_vehicle(ride, frontVehicle->sprite_index); + auto frontVehicle = GetHead(); + auto trainIndex = ride_get_train_index_from_vehicle(curRide, frontVehicle->sprite_index); if (!trainIndex) { return; } - ride->Crash(*trainIndex); + curRide->Crash(*trainIndex); - if (ride->status != RIDE_STATUS_CLOSED) + if (curRide->status != RIDE_STATUS_CLOSED) { // We require this to execute right away during the simulation, always ignore network and queue. - auto gameAction = RideSetStatusAction(ride->id, RIDE_STATUS_CLOSED); + auto gameAction = RideSetStatusAction(curRide->id, RIDE_STATUS_CLOSED); GameActions::ExecuteNested(&gameAction); } } - ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; - ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + curRide->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; + curRide->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; - if (vehicle->IsHead()) + if (IsHead()) { - vehicle_kill_all_passengers(vehicle); + vehicle_kill_all_passengers(this); } - vehicle->sub_state = 2; - audio_play_sound_at_location(SoundId::Crash, { vehicle->x, vehicle->y, vehicle->z }); + sub_state = 2; + audio_play_sound_at_location(SoundId::Crash, { x, y, z }); - sprite_misc_explosion_cloud_create(vehicle->x, vehicle->y, vehicle->z); - sprite_misc_explosion_flare_create(vehicle->x, vehicle->y, vehicle->z); + sprite_misc_explosion_cloud_create(x, y, z); + sprite_misc_explosion_flare_create(x, y, z); - uint8_t numParticles = std::min(vehicle->sprite_width, static_cast(7)); + uint8_t numParticles = std::min(sprite_width, static_cast(7)); while (numParticles-- != 0) - crashed_vehicle_particle_create(vehicle->colours, vehicle->x, vehicle->y, vehicle->z); + crashed_vehicle_particle_create(colours, x, y, z); - vehicle->flags |= SPRITE_FLAGS_IS_CRASHED_VEHICLE_SPRITE; - vehicle->animation_frame = 0; - vehicle->var_C8 = 0; - vehicle->sprite_width = 13; - vehicle->sprite_height_negative = 45; - vehicle->sprite_height_positive = 5; + flags |= SPRITE_FLAGS_IS_CRASHED_VEHICLE_SPRITE; + animation_frame = 0; + var_C8 = 0; + sprite_width = 13; + sprite_height_negative = 45; + sprite_height_positive = 5; - sprite_move(vehicle->x, vehicle->y, vehicle->z, vehicle); - vehicle->Invalidate(); + sprite_move(x, y, z, this); + Invalidate(); - vehicle->crash_z = 0; + crash_z = 0; } -static void vehicle_crash_on_water(Vehicle* vehicle) +void Vehicle::CrashOnWater() { - auto ride = get_ride(vehicle->ride); - if (ride == nullptr) + auto curRide = get_ride(ride); + if (curRide == nullptr) return; - if (ride->status == RIDE_STATUS_SIMULATING) + if (curRide->status == RIDE_STATUS_SIMULATING) { - vehicle_simulate_crash(vehicle); + SimulateCrash(); return; } - vehicle->SetState(VEHICLE_STATUS_CRASHED, vehicle->sub_state); + SetState(VEHICLE_STATUS_CRASHED, sub_state); - if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED)) + if (!(curRide->lifecycle_flags & RIDE_LIFECYCLE_CRASHED)) { - auto frontVehicle = vehicle->GetHead(); - auto trainIndex = ride_get_train_index_from_vehicle(ride, frontVehicle->sprite_index); + auto frontVehicle = GetHead(); + auto trainIndex = ride_get_train_index_from_vehicle(curRide, frontVehicle->sprite_index); if (!trainIndex) { return; } - ride->Crash(*trainIndex); + curRide->Crash(*trainIndex); - if (ride->status != RIDE_STATUS_CLOSED) + if (curRide->status != RIDE_STATUS_CLOSED) { // We require this to execute right away during the simulation, always ignore network and queue. - auto gameAction = RideSetStatusAction(ride->id, RIDE_STATUS_CLOSED); + auto gameAction = RideSetStatusAction(curRide->id, RIDE_STATUS_CLOSED); GameActions::ExecuteNested(&gameAction); } } - ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; - ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + curRide->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; + curRide->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; - if (vehicle->IsHead()) + if (IsHead()) { - vehicle_kill_all_passengers(vehicle); + vehicle_kill_all_passengers(this); } - vehicle->sub_state = 2; - audio_play_sound_at_location(SoundId::Water1, { vehicle->x, vehicle->y, vehicle->z }); + sub_state = 2; + audio_play_sound_at_location(SoundId::Water1, { x, y, z }); - crash_splash_create(vehicle->x, vehicle->y, vehicle->z); - crash_splash_create(vehicle->x - 8, vehicle->y - 9, vehicle->z); - crash_splash_create(vehicle->x + 11, vehicle->y - 9, vehicle->z); - crash_splash_create(vehicle->x + 11, vehicle->y + 8, vehicle->z); - crash_splash_create(vehicle->x - 4, vehicle->y + 8, vehicle->z); + crash_splash_create(x, y, z); + crash_splash_create(x - 8, y - 9, z); + crash_splash_create(x + 11, y - 9, z); + crash_splash_create(x + 11, y + 8, z); + crash_splash_create(x - 4, y + 8, z); for (int32_t i = 0; i < 10; ++i) - crashed_vehicle_particle_create(vehicle->colours, vehicle->x - 4, vehicle->y + 8, vehicle->z); + crashed_vehicle_particle_create(colours, x - 4, y + 8, z); - vehicle->flags |= SPRITE_FLAGS_IS_CRASHED_VEHICLE_SPRITE; - vehicle->animation_frame = 0; - vehicle->var_C8 = 0; - vehicle->sprite_width = 13; - vehicle->sprite_height_negative = 45; - vehicle->sprite_height_positive = 5; + flags |= SPRITE_FLAGS_IS_CRASHED_VEHICLE_SPRITE; + animation_frame = 0; + var_C8 = 0; + sprite_width = 13; + sprite_height_negative = 45; + sprite_height_positive = 5; - sprite_move(vehicle->x, vehicle->y, vehicle->z, vehicle); - vehicle->Invalidate(); + sprite_move(x, y, z, this); + Invalidate(); - vehicle->crash_z = -1; + crash_z = -1; } /** @@ -5398,7 +5398,7 @@ void Vehicle::UpdateCrash() } else if (curVehicle->sub_state == 1) { - vehicle_crash_on_land(curVehicle); + curVehicle->CrashOnLand(); continue; } @@ -5410,7 +5410,7 @@ void Vehicle::UpdateCrash() zDiff = curVehicle->z - waterHeight; if (zDiff <= 0 && zDiff >= -20) { - vehicle_crash_on_water(curVehicle); + curVehicle->CrashOnWater(); continue; } } @@ -5418,7 +5418,7 @@ void Vehicle::UpdateCrash() zDiff = curVehicle->z - height; if ((zDiff <= 0 && zDiff >= -20) || curVehicle->z < 16) { - vehicle_crash_on_land(curVehicle); + curVehicle->CrashOnLand(); continue; } @@ -5433,7 +5433,7 @@ void Vehicle::UpdateCrash() if (!map_is_location_valid(curPosition)) { - vehicle_crash_on_land(curVehicle); + curVehicle->CrashOnLand(); continue; } diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index e88d7c9f98..9ec071a63c 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -384,6 +384,9 @@ private: void UpdateVelocity(); bool OpenRestraints(); bool CloseRestraints(); + void CrashOnWater(); + void CrashOnLand(); + void SimulateCrash() const; }; struct train_ref