From d93edf77d6b01ad8a9b313ad448d781cf71fd3a9 Mon Sep 17 00:00:00 2001 From: hdpoliveira <35645457+hdpoliveira@users.noreply.github.com> Date: Sun, 17 May 2020 23:11:19 -0300 Subject: [PATCH] Part of #9473: Create Vehicle::KillPassengers() (#11714) * Part of #9473: Create Vehicle::KillPassengers() Converted from vehicle_kill_all_passengers Co-authored-by: Michael Steenbeek --- src/openrct2/ride/Vehicle.cpp | 90 +++++++++++++++++------------------ src/openrct2/ride/Vehicle.h | 2 + 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 91a77e6185..334fc52e11 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -49,8 +49,6 @@ static bool vehicle_boat_is_location_accessible(const CoordsXYZ& location); static bool vehicle_update_motion_collision_detection( Vehicle* vehicle, int16_t x, int16_t y, int16_t z, uint16_t* otherVehicleIndex); -static void vehicle_kill_all_passengers(Vehicle* vehicle); - constexpr int16_t VEHICLE_MAX_SPIN_SPEED = 1536; constexpr int16_t VEHICLE_MIN_SPIN_SPEED = -VEHICLE_MAX_SPIN_SPEED; constexpr int16_t VEHICLE_MAX_SPIN_SPEED_FOR_STOPPING = 700; @@ -3599,7 +3597,7 @@ void Vehicle::UpdateCollisionSetup() curRide->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; curRide->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; - vehicle_kill_all_passengers(this); + KillAllPassengersInTrain(); Vehicle* lastVehicle = this; uint16_t spriteId = sprite_index; @@ -5225,24 +5223,8 @@ static TileElement* vehicle_check_collision(int16_t x, int16_t y, int16_t z) return nullptr; } -/** - * - * rct2: 0x006DE6C6 - */ -static void vehicle_kill_all_passengers(Vehicle* vehicle) +static void ride_train_crash(Ride* ride, uint16_t numFatalities) { - auto ride = get_ride(vehicle->ride); - if (ride == nullptr) - return; - - uint16_t numFatalities = 0; - uint16_t spriteId = vehicle->sprite_index; - for (Vehicle* curVehicle; spriteId != SPRITE_INDEX_NULL; spriteId = curVehicle->next_vehicle_on_train) - { - curVehicle = GET_VEHICLE(spriteId); - numFatalities += curVehicle->num_peeps; - } - auto ft = Formatter::Common(); ft.Add(numFatalities); @@ -5257,7 +5239,7 @@ static void vehicle_kill_all_passengers(Vehicle* vehicle) { ride->FormatNameTo(ft); news_item_add_to_queue( - NEWS_ITEM_RIDE, numFatalities == 1 ? STR_X_PERSON_DIED_ON_X : STR_X_PEOPLE_DIED_ON_X, vehicle->ride); + NEWS_ITEM_RIDE, numFatalities == 1 ? STR_X_PERSON_DIED_ON_X : STR_X_PEOPLE_DIED_ON_X, ride->id); } if (gParkRatingCasualtyPenalty < 500) @@ -5265,36 +5247,52 @@ static void vehicle_kill_all_passengers(Vehicle* vehicle) gParkRatingCasualtyPenalty += 200; } } +} +/** + * + * rct2: 0x006DE6C6 + */ +void Vehicle::KillAllPassengersInTrain() +{ + auto curRide = get_ride(ride); + if (curRide == nullptr) + return; - spriteId = vehicle->sprite_index; + ride_train_crash(curRide, NumPeepsUntilTrainTail()); + + uint16_t spriteId = sprite_index; for (Vehicle* curVehicle; spriteId != SPRITE_INDEX_NULL; spriteId = curVehicle->next_vehicle_on_train) { curVehicle = GET_VEHICLE(spriteId); - - if (curVehicle->num_peeps != curVehicle->next_free_seat) - continue; - - if (curVehicle->num_peeps == 0) - continue; - - for (uint8_t i = 0; i < curVehicle->num_peeps; i++) - { - Peep* peep = GET_PEEP(curVehicle->peep[i]); - if (peep->outside_of_park == 0) - { - decrement_guests_in_park(); - auto intent = Intent(INTENT_ACTION_UPDATE_GUEST_COUNT); - context_broadcast_intent(&intent); - } - ride->num_riders--; - peep_sprite_remove(peep); - } - - curVehicle->num_peeps = 0; - curVehicle->next_free_seat = 0; + curVehicle->KillPassengers(curRide); } } +void Vehicle::KillPassengers(Ride* curRide) +{ + if (num_peeps != next_free_seat) + return; + + if (num_peeps == 0) + return; + + for (auto i = 0; i < num_peeps; i++) + { + Peep* curPeep = GET_PEEP(peep[i]); + if (curPeep->outside_of_park == 0) + { + decrement_guests_in_park(); + auto intent = Intent(INTENT_ACTION_UPDATE_GUEST_COUNT); + context_broadcast_intent(&intent); + } + curRide->num_riders--; + peep_sprite_remove(curPeep); + } + + num_peeps = 0; + next_free_seat = 0; +} + void Vehicle::CrashOnLand() { auto curRide = get_ride(ride); @@ -5331,7 +5329,7 @@ void Vehicle::CrashOnLand() if (IsHead()) { - vehicle_kill_all_passengers(this); + KillAllPassengersInTrain(); } sub_state = 2; @@ -5394,7 +5392,7 @@ void Vehicle::CrashOnWater() if (IsHead()) { - vehicle_kill_all_passengers(this); + KillAllPassengersInTrain(); } sub_state = 2; diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index 41b7ac0db3..25759cd94f 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -388,6 +388,8 @@ private: void CrashOnWater(); void CrashOnLand(); void SimulateCrash() const; + void KillAllPassengersInTrain(); + void KillPassengers(Ride* curRide); void TrainReadyToDepart(uint8_t num_peeps_on_train, uint8_t num_used_seats); };