From 01cd900a1c95bd77c98d2cbccd075f1af98fa540 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek <1478678+Gymnasiast@users.noreply.github.com> Date: Fri, 4 Oct 2024 13:49:21 +0200 Subject: [PATCH] Eliminate Loc6DAEB9 (#22899) --- src/openrct2/ride/Vehicle.cpp | 431 +++++++++++++++++----------------- 1 file changed, 217 insertions(+), 214 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index da4b8734bf..51701479d5 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -7062,234 +7062,237 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, const Rid bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& curRide, const RideObjectEntry& rideEntry) { EntityId otherVehicleIndex = EntityId::GetNull(); -Loc6DAEB9: - auto trackType = GetTrackType(); - if (trackType == TrackElemType::HeartLineTransferUp || trackType == TrackElemType::HeartLineTransferDown) + while (true) { - if (track_progress == 80) + auto trackType = GetTrackType(); + if (trackType == TrackElemType::HeartLineTransferUp || trackType == TrackElemType::HeartLineTransferDown) { - vehicle_type ^= 1; - carEntry = Entry(); - } - if (_vehicleVelocityF64E08 >= 0x40000) - { - acceleration = -_vehicleVelocityF64E08 * 8; - } - else if (_vehicleVelocityF64E08 < 0x20000) - { - acceleration = 0x50000; - } - } - else if (TrackTypeIsBrakes(trackType)) - { - bool hasBrakesFailure = curRide.lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN - && curRide.breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE; - if (!hasBrakesFailure || curRide.mechanic_status == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) - { - auto brakeSpeed = ChooseBrakeSpeed(); - - if ((brakeSpeed << 16) < _vehicleVelocityF64E08) + if (track_progress == 80) { - acceleration = -_vehicleVelocityF64E08 * 16; - } - else if (!(GetGameState().CurrentTicks & 0x0F)) - { - if (_vehicleF64E2C == 0) - { - _vehicleF64E2C++; - OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BrakeRelease, { x, y, z }); - } - } - } - } - else if (TrackTypeIsBooster(trackType)) - { - auto boosterSpeed = GetBoosterSpeed(curRide.type, (brake_speed << 16)); - if (boosterSpeed > _vehicleVelocityF64E08) - { - acceleration = GetRideTypeDescriptor(curRide.type).LegacyBoosterSettings.BoosterAcceleration - << 16; //_vehicleVelocityF64E08 * 1.2; - } - } - else if (rideEntry.flags & RIDE_ENTRY_FLAG_RIDER_CONTROLS_SPEED && num_peeps > 0) - { - acceleration += CalculateRiderBraking(); - } - - if ((trackType == TrackElemType::Flat && curRide.GetRideTypeDescriptor().HasFlag(RtdFlag::hasLsmBehaviourOnFlat)) - || (trackType == TrackElemType::PoweredLift)) - { - acceleration = GetRideTypeDescriptor(curRide.type).LegacyBoosterSettings.PoweredLiftAcceleration << 16; - } - if (trackType == TrackElemType::BrakeForDrop) - { - if (IsHead()) - { - if (!HasFlag(VehicleFlags::StoppedOnHoldingBrake)) - { - if (track_progress >= 8) - { - acceleration = -_vehicleVelocityF64E08 * 16; - if (track_progress >= 24) - { - SetFlag(VehicleFlags::StoppedOnHoldingBrake); - vertical_drop_countdown = 90; - } - } - } - } - } - if (trackType == TrackElemType::LogFlumeReverser) - { - if (track_progress != 16 || velocity < 4.0_mph) - { - if (track_progress == 32) - { - vehicle_type = carEntry->ReversedCarIndex; + vehicle_type ^= 1; carEntry = Entry(); } - } - else - { - track_progress += 17; - } - } - - uint16_t newTrackProgress = track_progress + 1; - - // Track Total Progress is in the two bytes before the move info list - uint16_t trackTotalProgress = GetTrackProgress(); - if (newTrackProgress >= trackTotalProgress) - { - UpdateCrossings(); - - if (!UpdateTrackMotionForwardsGetNewTrack(trackType, curRide, rideEntry)) - { - _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5; - _vehicleVelocityF64E0C -= remaining_distance + 1; - remaining_distance = -1; - return false; - } - newTrackProgress = 0; - } - - track_progress = newTrackProgress; - UpdateHandleWaterSplash(); - - // Loc6DB706 - const auto moveInfo = GetMoveInfo(); - trackType = GetTrackType(); - uint8_t moveInfovehicleAnimationGroup; - { - auto nextVehiclePosition = TrackLocation - + CoordsXYZ{ moveInfo->x, moveInfo->y, moveInfo->z + GetRideTypeDescriptor(curRide.type).Heights.VehicleZOffset }; - - uint8_t remainingDistanceFlags = 0; - if (nextVehiclePosition.x != _vehicleCurPosition.x) - { - remainingDistanceFlags |= 1; - } - if (nextVehiclePosition.y != _vehicleCurPosition.y) - { - remainingDistanceFlags |= 2; - } - if (nextVehiclePosition.z != _vehicleCurPosition.z) - { - remainingDistanceFlags |= 4; - } - - if (TrackSubposition == VehicleTrackSubposition::ReverserRCFrontBogie - && (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) && track_progress >= 30 - && track_progress <= 66) - { - remainingDistanceFlags |= 8; - } - - if (TrackSubposition == VehicleTrackSubposition::ReverserRCRearBogie - && (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) && track_progress == 96) - { - ReverseReverserCar(); - - const VehicleInfo* moveInfo2 = GetMoveInfo(); - nextVehiclePosition.x = x + moveInfo2->x; - nextVehiclePosition.y = y + moveInfo2->y; - } - - // Loc6DB8A5 - remaining_distance -= SubpositionTranslationDistances[remainingDistanceFlags]; - _vehicleCurPosition = nextVehiclePosition; - Orientation = moveInfo->direction; - bank_rotation = moveInfo->bank_rotation; - Pitch = moveInfo->Pitch; - - moveInfovehicleAnimationGroup = moveInfo->Pitch; - - if ((carEntry->flags & CAR_ENTRY_FLAG_WOODEN_WILD_MOUSE_SWING) && moveInfo->Pitch != 0) - { - SwingSprite = 0; - SwingPosition = 0; - SwingSpeed = 0; - } - - // this == frontVehicle - if (this == _vehicleFrontVehicle) - { - if (_vehicleVelocityF64E08 >= 0) + if (_vehicleVelocityF64E08 >= 0x40000) { - otherVehicleIndex = prev_vehicle_on_ride; - if (UpdateMotionCollisionDetection(nextVehiclePosition, &otherVehicleIndex)) + acceleration = -_vehicleVelocityF64E08 * 8; + } + else if (_vehicleVelocityF64E08 < 0x20000) + { + acceleration = 0x50000; + } + } + else if (TrackTypeIsBrakes(trackType)) + { + bool hasBrakesFailure = curRide.lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN + && curRide.breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE; + if (!hasBrakesFailure || curRide.mechanic_status == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) + { + auto brakeSpeed = ChooseBrakeSpeed(); + + if ((brakeSpeed << 16) < _vehicleVelocityF64E08) { - _vehicleVelocityF64E0C -= remaining_distance + 1; - remaining_distance = -1; - - // Might need to be bp rather than this, but hopefully not - auto otherVeh = GetEntity(otherVehicleIndex); - if (otherVeh == nullptr) + acceleration = -_vehicleVelocityF64E08 * 16; + } + else if (!(GetGameState().CurrentTicks & 0x0F)) + { + if (_vehicleF64E2C == 0) { - // This can never happen as prev_vehicle_on_ride will always be set to a vehicle - LOG_ERROR("Failed to get next vehicle during update!"); - return true; + _vehicleF64E2C++; + OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BrakeRelease, { x, y, z }); } - auto head = otherVeh->TrainHead(); - - auto velocityDelta = abs(velocity - head->velocity); - if (!(rideEntry.flags & RIDE_ENTRY_FLAG_DISABLE_COLLISION_CRASHES)) - { - if (velocityDelta > 14.0_mph) - { - if (!(carEntry->flags & CAR_ENTRY_FLAG_BOAT_HIRE_COLLISION_DETECTION)) - { - _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_COLLISION; - } - } - } - - if (carEntry->flags & CAR_ENTRY_FLAG_GO_KART) - { - velocity -= velocity >> 2; - } - else - { - int32_t newHeadVelocity = velocity >> 1; - velocity = head->velocity >> 1; - head->velocity = newHeadVelocity; - } - _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_1; - return false; } } } - } + else if (TrackTypeIsBooster(trackType)) + { + auto boosterSpeed = GetBoosterSpeed(curRide.type, (brake_speed << 16)); + if (boosterSpeed > _vehicleVelocityF64E08) + { + acceleration = GetRideTypeDescriptor(curRide.type).LegacyBoosterSettings.BoosterAcceleration + << 16; //_vehicleVelocityF64E08 * 1.2; + } + } + else if (rideEntry.flags & RIDE_ENTRY_FLAG_RIDER_CONTROLS_SPEED && num_peeps > 0) + { + acceleration += CalculateRiderBraking(); + } - // Loc6DB928 - if (remaining_distance < 0x368A) - { - return true; - } + if ((trackType == TrackElemType::Flat && curRide.GetRideTypeDescriptor().HasFlag(RtdFlag::hasLsmBehaviourOnFlat)) + || (trackType == TrackElemType::PoweredLift)) + { + acceleration = GetRideTypeDescriptor(curRide.type).LegacyBoosterSettings.PoweredLiftAcceleration << 16; + } + if (trackType == TrackElemType::BrakeForDrop) + { + if (IsHead()) + { + if (!HasFlag(VehicleFlags::StoppedOnHoldingBrake)) + { + if (track_progress >= 8) + { + acceleration = -_vehicleVelocityF64E08 * 16; + if (track_progress >= 24) + { + SetFlag(VehicleFlags::StoppedOnHoldingBrake); + vertical_drop_countdown = 90; + } + } + } + } + } + if (trackType == TrackElemType::LogFlumeReverser) + { + if (track_progress != 16 || velocity < 4.0_mph) + { + if (track_progress == 32) + { + vehicle_type = carEntry->ReversedCarIndex; + carEntry = Entry(); + } + } + else + { + track_progress += 17; + } + } - acceleration += AccelerationFromPitch[moveInfovehicleAnimationGroup]; - _vehicleUnkF64E10++; - goto Loc6DAEB9; + uint16_t newTrackProgress = track_progress + 1; + + // Track Total Progress is in the two bytes before the move info list + uint16_t trackTotalProgress = GetTrackProgress(); + if (newTrackProgress >= trackTotalProgress) + { + UpdateCrossings(); + + if (!UpdateTrackMotionForwardsGetNewTrack(trackType, curRide, rideEntry)) + { + _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5; + _vehicleVelocityF64E0C -= remaining_distance + 1; + remaining_distance = -1; + return false; + } + newTrackProgress = 0; + } + + track_progress = newTrackProgress; + UpdateHandleWaterSplash(); + + // Loc6DB706 + const auto moveInfo = GetMoveInfo(); + trackType = GetTrackType(); + uint8_t moveInfovehicleAnimationGroup; + { + auto nextVehiclePosition = TrackLocation + + CoordsXYZ{ moveInfo->x, moveInfo->y, + moveInfo->z + GetRideTypeDescriptor(curRide.type).Heights.VehicleZOffset }; + + uint8_t remainingDistanceFlags = 0; + if (nextVehiclePosition.x != _vehicleCurPosition.x) + { + remainingDistanceFlags |= 1; + } + if (nextVehiclePosition.y != _vehicleCurPosition.y) + { + remainingDistanceFlags |= 2; + } + if (nextVehiclePosition.z != _vehicleCurPosition.z) + { + remainingDistanceFlags |= 4; + } + + if (TrackSubposition == VehicleTrackSubposition::ReverserRCFrontBogie + && (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) + && track_progress >= 30 && track_progress <= 66) + { + remainingDistanceFlags |= 8; + } + + if (TrackSubposition == VehicleTrackSubposition::ReverserRCRearBogie + && (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser) + && track_progress == 96) + { + ReverseReverserCar(); + + const VehicleInfo* moveInfo2 = GetMoveInfo(); + nextVehiclePosition.x = x + moveInfo2->x; + nextVehiclePosition.y = y + moveInfo2->y; + } + + // Loc6DB8A5 + remaining_distance -= SubpositionTranslationDistances[remainingDistanceFlags]; + _vehicleCurPosition = nextVehiclePosition; + Orientation = moveInfo->direction; + bank_rotation = moveInfo->bank_rotation; + Pitch = moveInfo->Pitch; + + moveInfovehicleAnimationGroup = moveInfo->Pitch; + + if ((carEntry->flags & CAR_ENTRY_FLAG_WOODEN_WILD_MOUSE_SWING) && moveInfo->Pitch != 0) + { + SwingSprite = 0; + SwingPosition = 0; + SwingSpeed = 0; + } + + // this == frontVehicle + if (this == _vehicleFrontVehicle) + { + if (_vehicleVelocityF64E08 >= 0) + { + otherVehicleIndex = prev_vehicle_on_ride; + if (UpdateMotionCollisionDetection(nextVehiclePosition, &otherVehicleIndex)) + { + _vehicleVelocityF64E0C -= remaining_distance + 1; + remaining_distance = -1; + + // Might need to be bp rather than this, but hopefully not + auto otherVeh = GetEntity(otherVehicleIndex); + if (otherVeh == nullptr) + { + // This can never happen as prev_vehicle_on_ride will always be set to a vehicle + LOG_ERROR("Failed to get next vehicle during update!"); + return true; + } + auto head = otherVeh->TrainHead(); + + auto velocityDelta = abs(velocity - head->velocity); + if (!(rideEntry.flags & RIDE_ENTRY_FLAG_DISABLE_COLLISION_CRASHES)) + { + if (velocityDelta > 14.0_mph) + { + if (!(carEntry->flags & CAR_ENTRY_FLAG_BOAT_HIRE_COLLISION_DETECTION)) + { + _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_COLLISION; + } + } + } + + if (carEntry->flags & CAR_ENTRY_FLAG_GO_KART) + { + velocity -= velocity >> 2; + } + else + { + int32_t newHeadVelocity = velocity >> 1; + velocity = head->velocity >> 1; + head->velocity = newHeadVelocity; + } + _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_1; + return false; + } + } + } + } + + // Loc6DB928 + if (remaining_distance < 0x368A) + { + return true; + } + + acceleration += AccelerationFromPitch[moveInfovehicleAnimationGroup]; + _vehicleUnkF64E10++; + } } static PitchAndRoll PitchAndRollEnd(const Ride& curRide, bool useInvertedSprites, uint16_t trackType, TileElement* tileElement)