From 98ad3a23a45efa029e89aa99843436e400c212b0 Mon Sep 17 00:00:00 2001 From: hdpoliveira Date: Sat, 30 May 2020 20:56:42 -0300 Subject: [PATCH 1/3] Issue #9473: UpdateTrackMotionPoweredRideAcceleration --- src/openrct2/ride/Vehicle.cpp | 57 +++++++++++++++++------------------ src/openrct2/ride/Vehicle.h | 2 ++ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 7e9d58c7ea..0ab91005d8 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -9433,21 +9433,21 @@ loc_6DD069: * * rct2: 0x006DC1E4 */ -static void vehicle_update_track_motion_powered_ride_acceleration( - Vehicle* vehicle, rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, int32_t* acceleration) +void Vehicle::UpdateTrackMotionPoweredRideAcceleration( + rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, int32_t* curAcceleration) { if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED_RIDE_UNRESTRICTED_GRAVITY) { - if (vehicle->velocity > (vehicle->speed * 0x4000)) + if (velocity > (speed * 0x4000)) { // Same code as none powered rides - if (*acceleration <= 0) + if (*curAcceleration <= 0) { - if (*acceleration >= -500) + if (*curAcceleration >= -500) { - if (vehicle->velocity <= 0x8000) + if (velocity <= 0x8000) { - *acceleration += 400; + *curAcceleration += 400; } } } @@ -9463,38 +9463,36 @@ static void vehicle_update_track_motion_powered_ride_acceleration( }; uint8_t speedModifier = FULL_SPEED; - uint16_t trackType = vehicle->track_direction >> 2; + uint16_t trackType = track_type >> 2; if (trackType == TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE) { - speedModifier = (vehicle->TrackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_LEFT_LANE) ? HALF_SPEED - : THREE_QUARTER_SPEED; + speedModifier = (TrackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_LEFT_LANE) ? HALF_SPEED : THREE_QUARTER_SPEED; } else if (trackType == TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE) { - speedModifier = (vehicle->TrackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_RIGHT_LANE) ? HALF_SPEED - : THREE_QUARTER_SPEED; + speedModifier = (TrackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_RIGHT_LANE) ? HALF_SPEED : THREE_QUARTER_SPEED; } - uint8_t speed = vehicle->speed; + uint8_t curSpeed = speed; switch (speedModifier) { case HALF_SPEED: - speed = vehicle->speed >> 1; + curSpeed = speed >> 1; break; case THREE_QUARTER_SPEED: - speed = vehicle->speed - (vehicle->speed >> 2); + curSpeed = speed - (speed >> 2); break; } - int32_t poweredAcceleration = speed << 14; - int32_t quarterForce = (speed * totalMass) >> 2; - if (vehicle->UpdateFlag(VEHICLE_UPDATE_FLAG_REVERSING_SHUTTLE)) + int32_t poweredAcceleration = curSpeed << 14; + int32_t quarterForce = (curSpeed * totalMass) >> 2; + if (UpdateFlag(VEHICLE_UPDATE_FLAG_REVERSING_SHUTTLE)) { poweredAcceleration = -poweredAcceleration; } - poweredAcceleration -= vehicle->velocity; - poweredAcceleration *= vehicle->powered_acceleration << 1; + poweredAcceleration -= velocity; + poweredAcceleration *= powered_acceleration << 1; if (quarterForce != 0) { poweredAcceleration /= quarterForce; @@ -9514,11 +9512,10 @@ static void vehicle_update_track_motion_powered_ride_acceleration( if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SPINNING) { - vehicle->spin_speed = std::clamp( - vehicle->spin_speed, VEHICLE_MIN_SPIN_SPEED_WATER_RIDE, VEHICLE_MAX_SPIN_SPEED_WATER_RIDE); + spin_speed = std::clamp(spin_speed, VEHICLE_MIN_SPIN_SPEED_WATER_RIDE, VEHICLE_MAX_SPIN_SPEED_WATER_RIDE); } - if (vehicle->vehicle_sprite_type != 0) + if (vehicle_sprite_type != 0) { if (poweredAcceleration < 0) { @@ -9528,22 +9525,22 @@ static void vehicle_update_track_motion_powered_ride_acceleration( if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_SPINNING) { // If the vehicle is on the up slope kill the spin speedModifier - if (vehicle->vehicle_sprite_type == 2) + if (vehicle_sprite_type == 2) { - vehicle->spin_speed = 0; + spin_speed = 0; } } - *acceleration += poweredAcceleration; + *curAcceleration += poweredAcceleration; return; } } - if (std::abs(vehicle->velocity) <= 0x10000) + if (std::abs(velocity) <= 0x10000) { - *acceleration = 0; + *curAcceleration = 0; } - *acceleration += poweredAcceleration; + *curAcceleration += poweredAcceleration; } /** @@ -9762,7 +9759,7 @@ int32_t Vehicle::UpdateTrackMotion(int32_t* outStation) if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED) { - vehicle_update_track_motion_powered_ride_acceleration(vehicle, vehicleEntry, totalMass, &curAcceleration); + vehicle->UpdateTrackMotionPoweredRideAcceleration(vehicleEntry, totalMass, &curAcceleration); } else if (curAcceleration <= 0 && curAcceleration >= -500) { diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index 79b2222998..ce80a4df76 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -378,6 +378,8 @@ private: bool CurrentTowerElementIsTop(); bool UpdateTrackMotionForwards(rct_ride_entry_vehicle* vehicleEntry, Ride* curRide, rct_ride_entry* rideEntry); bool UpdateTrackMotionBackwards(rct_ride_entry_vehicle* vehicleEntry, Ride* curRide, rct_ride_entry* rideEntry); + void UpdateTrackMotionPoweredRideAcceleration( + rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, int32_t* curAcceleration); int32_t NumPeepsUntilTrainTail() const; void InvalidateWindow(); void TestReset(); From a66b23ffeaf77b7430cc0bdd08b042779d4840cf Mon Sep 17 00:00:00 2001 From: hdpoliveira Date: Sun, 31 May 2020 14:44:40 -0300 Subject: [PATCH 2/3] Return new acceleration value --- src/openrct2/ride/Vehicle.cpp | 24 ++++++++++-------------- src/openrct2/ride/Vehicle.h | 4 ++-- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 0ab91005d8..57af3ffe85 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -9433,24 +9433,21 @@ loc_6DD069: * * rct2: 0x006DC1E4 */ -void Vehicle::UpdateTrackMotionPoweredRideAcceleration( - rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, int32_t* curAcceleration) +int32_t Vehicle::UpdateTrackMotionPoweredRideAcceleration( + rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, const int32_t curAcceleration) { if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED_RIDE_UNRESTRICTED_GRAVITY) { if (velocity > (speed * 0x4000)) { // Same code as none powered rides - if (*curAcceleration <= 0) + if (curAcceleration <= 0 && curAcceleration >= -500 && velocity <= 0x8000) { - if (*curAcceleration >= -500) - { - if (velocity <= 0x8000) - { - *curAcceleration += 400; - } - } + return curAcceleration + 400; } + return curAcceleration; + } + } return; } } @@ -9530,17 +9527,16 @@ void Vehicle::UpdateTrackMotionPoweredRideAcceleration( spin_speed = 0; } } - *curAcceleration += poweredAcceleration; - return; + return curAcceleration + poweredAcceleration; } } if (std::abs(velocity) <= 0x10000) { - *curAcceleration = 0; + return poweredAcceleration; } - *curAcceleration += poweredAcceleration; + return curAcceleration + poweredAcceleration; } /** diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index ce80a4df76..f0798c95be 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -378,8 +378,8 @@ private: bool CurrentTowerElementIsTop(); bool UpdateTrackMotionForwards(rct_ride_entry_vehicle* vehicleEntry, Ride* curRide, rct_ride_entry* rideEntry); bool UpdateTrackMotionBackwards(rct_ride_entry_vehicle* vehicleEntry, Ride* curRide, rct_ride_entry* rideEntry); - void UpdateTrackMotionPoweredRideAcceleration( - rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, int32_t* curAcceleration); + int32_t UpdateTrackMotionPoweredRideAcceleration( + rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, const int32_t curAcceleration); int32_t NumPeepsUntilTrainTail() const; void InvalidateWindow(); void TestReset(); From ca1a107a8d2635261e6e7d2433e453b68d495f31 Mon Sep 17 00:00:00 2001 From: hdpoliveira Date: Sun, 31 May 2020 14:46:11 -0300 Subject: [PATCH 3/3] Extract function modified_speed --- src/openrct2/ride/Vehicle.cpp | 71 +++++++++++++++++------------------ 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 57af3ffe85..756ff8906f 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -9433,6 +9433,36 @@ loc_6DD069: * * rct2: 0x006DC1E4 */ +static uint8_t modified_speed(uint16_t trackType, uint8_t trackSubposition, uint8_t speed) +{ + enum + { + FULL_SPEED, + THREE_QUARTER_SPEED, + HALF_SPEED + }; + + uint8_t speedModifier = FULL_SPEED; + + if (trackType == TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE) + { + speedModifier = (trackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_LEFT_LANE) ? HALF_SPEED : THREE_QUARTER_SPEED; + } + else if (trackType == TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE) + { + speedModifier = (trackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_RIGHT_LANE) ? HALF_SPEED : THREE_QUARTER_SPEED; + } + + switch (speedModifier) + { + case HALF_SPEED: + return speed >> 1; + case THREE_QUARTER_SPEED: + return speed - (speed >> 2); + } + return speed; +} + int32_t Vehicle::UpdateTrackMotionPoweredRideAcceleration( rct_ride_entry_vehicle* vehicleEntry, uint32_t totalMass, const int32_t curAcceleration) { @@ -9448,42 +9478,9 @@ int32_t Vehicle::UpdateTrackMotionPoweredRideAcceleration( return curAcceleration; } } - return; - } - } - - enum - { - FULL_SPEED, - THREE_QUARTER_SPEED, - HALF_SPEED - }; - - uint8_t speedModifier = FULL_SPEED; - uint16_t trackType = track_type >> 2; - - if (trackType == TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE) - { - speedModifier = (TrackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_LEFT_LANE) ? HALF_SPEED : THREE_QUARTER_SPEED; - } - else if (trackType == TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE) - { - speedModifier = (TrackSubposition == VEHICLE_TRACK_SUBPOSITION_GO_KARTS_RIGHT_LANE) ? HALF_SPEED : THREE_QUARTER_SPEED; - } - - uint8_t curSpeed = speed; - switch (speedModifier) - { - case HALF_SPEED: - curSpeed = speed >> 1; - break; - case THREE_QUARTER_SPEED: - curSpeed = speed - (speed >> 2); - break; - } - - int32_t poweredAcceleration = curSpeed << 14; - int32_t quarterForce = (curSpeed * totalMass) >> 2; + uint8_t modifiedSpeed = modified_speed(track_type >> 2, TrackSubposition, speed); + int32_t poweredAcceleration = modifiedSpeed << 14; + int32_t quarterForce = (modifiedSpeed * totalMass) >> 2; if (UpdateFlag(VEHICLE_UPDATE_FLAG_REVERSING_SHUTTLE)) { poweredAcceleration = -poweredAcceleration; @@ -9755,7 +9752,7 @@ int32_t Vehicle::UpdateTrackMotion(int32_t* outStation) if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED) { - vehicle->UpdateTrackMotionPoweredRideAcceleration(vehicleEntry, totalMass, &curAcceleration); + curAcceleration = vehicle->UpdateTrackMotionPoweredRideAcceleration(vehicleEntry, totalMass, curAcceleration); } else if (curAcceleration <= 0 && curAcceleration >= -500) {