diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index fb1a6f3184..51e7d9fdf7 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -4044,7 +4044,7 @@ void rct_peep::UpdateRideLeaveVehicle() if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_16)) { - for (; vehicle->IsChild(); vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride)) + for (; !vehicle->IsHead(); vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride)) { uint16_t trackType = vehicle->track_type >> 2; if (trackType == TRACK_ELEM_FLAT || trackType > TRACK_ELEM_MIDDLE_STATION) diff --git a/src/openrct2/peep/Staff.cpp b/src/openrct2/peep/Staff.cpp index 02b3e54135..02b2f4175f 100644 --- a/src/openrct2/peep/Staff.cpp +++ b/src/openrct2/peep/Staff.cpp @@ -2549,7 +2549,7 @@ bool rct_peep::UpdateFixingMoveToBrokenDownVehicle(bool firstRun, Ride* ride) while (true) { - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { break; } diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index b399843a43..26889027af 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1150,7 +1150,7 @@ private: ImportVehicle(vehicle, srcVehicle); // If vehicle is the first car on a train add to train list - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { move_sprite_to_list((rct_sprite*)vehicle, SPRITE_LIST_TRAIN * 2); } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index a42468c4d7..39cc51a48c 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -4941,7 +4941,7 @@ static rct_vehicle* vehicle_create_car( } if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_4) { - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { dl = 15; } diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index e34a1364bf..6f63a16b6c 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -5280,7 +5280,7 @@ static void vehicle_crash_on_land(rct_vehicle* vehicle) ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; - if (vehicle->IsChild() == 0) + if (vehicle->IsHead()) { vehicle_kill_all_passengers(vehicle); } @@ -5334,7 +5334,7 @@ static void vehicle_crash_on_water(rct_vehicle* vehicle) ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED; ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; - if (vehicle->IsChild() == 0) + if (vehicle->IsHead()) { vehicle_kill_all_passengers(vehicle); } @@ -6192,12 +6192,7 @@ void vehicle_set_map_toolbar(const rct_vehicle* vehicle) int32_t vehicleIndex; ride = get_ride(vehicle->ride); - - while (vehicle->IsChild()) - { - vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride); - } - + vehicle = vehicle->GetHead(); for (vehicleIndex = 0; vehicleIndex < 32; vehicleIndex++) if (ride->vehicles[vehicleIndex] == vehicle->sprite_index) break; @@ -7561,7 +7556,7 @@ static void vehicle_update_handle_water_splash(rct_vehicle* vehicle) { if (rideEntry->flags & RIDE_ENTRY_FLAG_PLAY_SPLASH_SOUND_SLIDE) { - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { if (track_element_is_covered(trackType)) { @@ -7588,7 +7583,7 @@ static void vehicle_update_handle_water_splash(rct_vehicle* vehicle) } } } - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { if (trackType == TRACK_ELEM_WATER_SPLASH) { @@ -8028,7 +8023,7 @@ loc_6DB358: if (tileElement->AsTrack()->GetTrackType() == TRACK_ELEM_LEFT_REVERSER || tileElement->AsTrack()->GetTrackType() == TRACK_ELEM_RIGHT_REVERSER) { - if (!vehicle->IsChild() && vehicle->velocity <= 0x30000) + if (vehicle->IsHead() && vehicle->velocity <= 0x30000) { vehicle->velocity = 0; } @@ -8192,7 +8187,7 @@ loc_6DAEB9: } if (trackType == TRACK_ELEM_BRAKE_FOR_DROP) { - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { if (!(vehicle->update_flags & VEHICLE_UPDATE_FLAG_ON_BREAK_FOR_DROP)) { @@ -8761,7 +8756,7 @@ loc_6DC476: if (vehicle->mini_golf_flags & (1 << 0)) { - regs.di = vehicle->IsChild() ? vehicle->prev_vehicle_on_ride : vehicle->next_vehicle_on_ride; + regs.di = vehicle->IsHead() ? vehicle->next_vehicle_on_ride : vehicle->prev_vehicle_on_ride; rct_vehicle* vEDI = GET_VEHICLE(regs.di); if (!(vEDI->mini_golf_flags & (1 << 0)) || (vEDI->mini_golf_flags & (1 << 2))) { @@ -8777,7 +8772,7 @@ loc_6DC476: if (vehicle->mini_golf_flags & (1 << 1)) { - regs.di = vehicle->IsChild() ? vehicle->prev_vehicle_on_ride : vehicle->next_vehicle_on_ride; + regs.di = vehicle->IsHead() ? vehicle->next_vehicle_on_ride : vehicle->prev_vehicle_on_ride; rct_vehicle* vEDI = GET_VEHICLE(regs.di); if (!(vEDI->mini_golf_flags & (1 << 1)) || (vEDI->mini_golf_flags & (1 << 2))) { @@ -8802,7 +8797,7 @@ loc_6DC476: { break; } - if (!vEDI->IsChild()) + if (vEDI->IsHead()) continue; if (!(vEDI->mini_golf_flags & (1 << 4))) continue; @@ -8883,7 +8878,7 @@ loc_6DC476: vehicle->track_y = y; vehicle->track_z = z; - if (vehicle->IsChild()) + if (!vehicle->IsHead()) { rct_vehicle* prevVehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride); regs.al = prevVehicle->var_CD; @@ -8901,7 +8896,7 @@ loc_6DC476: loc_6DC743: vehicle->track_progress = regs.ax; - if (vehicle->IsChild()) + if (!vehicle->IsHead()) { vehicle->animation_frame++; if (vehicle->animation_frame >= 6) @@ -8920,7 +8915,7 @@ loc_6DC743: switch (moveInfo->y) { case 0: // loc_6DC7B4 - if (vehicle->IsChild()) + if (!vehicle->IsHead()) { vehicle->mini_golf_flags |= (1 << 3); } @@ -9802,7 +9797,7 @@ int32_t vehicle_update_track_motion(rct_vehicle* vehicle, int32_t* outStation) if (rideEntry->flags & RIDE_ENTRY_FLAG_PLAY_SPLASH_SOUND_SLIDE) { - if (!vehicle->IsChild()) + if (vehicle->IsHead()) { if (track_element_is_covered(vehicle->track_type >> 2)) { @@ -10011,9 +10006,14 @@ void vehicle_claxon(const rct_vehicle* vehicle) rct_vehicle* rct_vehicle::GetHead() { auto v = this; - while (v != nullptr && v->IsChild()) + while (v != nullptr && !v->IsHead()) { v = GET_VEHICLE(v->prev_vehicle_on_ride); } return v; } + +const rct_vehicle* rct_vehicle::GetHead() const +{ + return ((rct_vehicle*)this)->GetHead(); +} diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index 909258dc28..69cee8379d 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -221,8 +221,9 @@ struct rct_vehicle : rct_sprite_common uint8_t seat_rotation; // 0xD8 uint8_t target_seat_rotation; // 0xD9 - constexpr bool IsChild() const { return type != 0; } + constexpr bool IsHead() const { return type == 0; } rct_vehicle* GetHead(); + const rct_vehicle* GetHead() const; }; struct train_ref diff --git a/src/openrct2/ride/water/SplashBoats.cpp b/src/openrct2/ride/water/SplashBoats.cpp index caa91f0d87..ddbf89e0e9 100644 --- a/src/openrct2/ride/water/SplashBoats.cpp +++ b/src/openrct2/ride/water/SplashBoats.cpp @@ -1250,13 +1250,13 @@ void vehicle_visual_splash_boats_or_water_coaster( paint_session* session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const rct_vehicle* vehicle, const rct_ride_entry_vehicle* vehicleEntry) { - if (vehicle->IsChild()) + if (vehicle->IsHead()) { - vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride); + vehicle = GET_VEHICLE(vehicle->next_vehicle_on_ride); } else { - vehicle = GET_VEHICLE(vehicle->next_vehicle_on_ride); + vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride); } session->CurrentlyDrawnItem = vehicle; imageDirection = ((session->CurrentRotation * 8) + vehicle->sprite_direction) & 0x1F;