vehicle chooses between brake speed and block brake speed

This commit is contained in:
Spacek531 2023-03-05 22:25:38 -08:00
parent 6488f0397e
commit 7fe9580131
3 changed files with 67 additions and 5 deletions

View File

@ -455,6 +455,7 @@ struct GameStateSnapshots final : public IGameStateSnapshots
COMPARE_FIELD(Vehicle, target_seat_rotation);
COMPARE_FIELD(Vehicle, BoatLocation.x);
COMPARE_FIELD(Vehicle, BoatLocation.y);
COMPARE_FIELD(Vehicle, BlockBrakeSpeed);
}
void CompareSpriteDataLitter(const Litter& spriteBase, const Litter& spriteCmp, GameStateSpriteChange& changeData) const

View File

@ -7381,6 +7381,60 @@ void Vehicle::Sub6DBF3E()
}
}
/**
* Determine whether to use block brake speed or brake speed. If block brake is closed or no block brake present, use the
* brake's speed; if block brake is open, use maximum of brake speed or block brake speed.
*/
uint8_t Vehicle::ChooseBrakeSpeed() const
{
if (GetTrackType() != TrackElemType::Brakes)
return brake_speed;
auto trackElement = MapGetTrackElementAtOfTypeSeq(TrackLocation, GetTrackType(), 0);
if (trackElement != nullptr)
{
if (trackElement->AsTrack()->IsBrakeClosed())
return brake_speed;
else
return std::max<uint8_t>(brake_speed, BlockBrakeSpeed);
}
return brake_speed;
}
/**
* Populate the vehicle's brake_speed and BlockBrakeSpeed values.
*/
void Vehicle::PopulateBrakeSpeed(const CoordsXYZ& vehicleTrackLocation, TrackElement& brake)
{
auto trackSpeed = brake.GetBrakeBoosterSpeed();
brake_speed = trackSpeed;
if (brake.GetTrackType() != TrackElemType::Brakes)
{
BlockBrakeSpeed = trackSpeed;
return;
}
// As soon as feasible, encode block brake speed into track element so the lookforward can be skipped here.
CoordsXYE output = CoordsXYE(vehicleTrackLocation.x, vehicleTrackLocation.y, reinterpret_cast<TileElement*>(&brake));
int32_t outputZ = vehicleTrackLocation.z;
uint16_t timeoutCount = 256;
do
{
if (output.element->AsTrack()->GetTrackType() == TrackElemType::BlockBrakes)
{
BlockBrakeSpeed = output.element->AsTrack()->GetBrakeBoosterSpeed();
return;
}
if (output.element->AsTrack()->GetTrackType() != TrackElemType::Brakes)
{
break;
}
timeoutCount--;
} while (TrackBlockGetNext(&output, &output, &outputZ, nullptr) && timeoutCount);
// If block brake is not found, use the track's speed
BlockBrakeSpeed = trackSpeed;
}
/**
*
* rct2: 0x006DB08C
@ -7550,7 +7604,7 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, const Rid
}
SetTrackDirection(location.direction);
SetTrackType(trackType);
brake_speed = tileElement->AsTrack()->GetBrakeBoosterSpeed();
PopulateBrakeSpeed(TrackLocation, *tileElement->AsTrack());
if (trackType == TrackElemType::OnRidePhoto)
{
trigger_on_ride_photo(TrackLocation, tileElement);
@ -7597,8 +7651,9 @@ Loc6DAEB9:
&& curRide.breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE;
if (!hasBrakesFailure || curRide.mechanic_status == RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES)
{
auto brakeSpeed = brake_speed << 16;
if (brakeSpeed < _vehicleVelocityF64E08)
auto brakeSpeed = ChooseBrakeSpeed();
if ((brakeSpeed << 16) < _vehicleVelocityF64E08)
{
acceleration = -_vehicleVelocityF64E08 * 16;
}
@ -7955,7 +8010,7 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(uint16_t trackType, const Ri
direction &= 3;
SetTrackType(trackType);
SetTrackDirection(direction);
brake_speed = tileElement->AsTrack()->GetBrakeBoosterSpeed();
PopulateBrakeSpeed(TrackLocation, *tileElement->AsTrack());
// There are two bytes before the move info list
uint16_t trackTotalProgress = GetTrackProgress();
@ -7986,7 +8041,9 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
if (trackType == TrackElemType::Brakes)
{
if (-(brake_speed << 16) > _vehicleVelocityF64E08)
auto brakeSpeed = ChooseBrakeSpeed();
if (-(brakeSpeed << 16) > _vehicleVelocityF64E08)
{
acceleration = _vehicleVelocityF64E08 * -16;
}
@ -9408,4 +9465,5 @@ void Vehicle::Serialise(DataSerialiser& stream)
stream << seat_rotation;
stream << target_seat_rotation;
stream << BoatLocation;
stream << BlockBrakeSpeed;
}

View File

@ -210,6 +210,7 @@ struct Vehicle : EntityBase
uint8_t seat_rotation;
uint8_t target_seat_rotation;
CoordsXY BoatLocation;
uint8_t BlockBrakeSpeed;
constexpr bool IsHead() const
{
@ -377,6 +378,8 @@ private:
void UpdateLandscapeDoor() const;
void UpdateLandscapeDoorBackwards() const;
int32_t CalculateRiderBraking() const;
uint8_t ChooseBrakeSpeed() const;
void PopulateBrakeSpeed(const CoordsXYZ& vehicleTrackLocation, TrackElement& brake);
void Loc6DCE02(const Ride& curRide);
};