Give monorail/maglev larger realistic braking deceleration limits

This commit is contained in:
Jonathan G Rennison
2021-02-03 21:22:09 +00:00
parent 4e1b1bc91e
commit c1f1b5f3b3
3 changed files with 11 additions and 4 deletions

View File

@@ -156,7 +156,8 @@ GroundVehicleAcceleration GroundVehicle<T, Type>::GetAcceleration()
*/ */
int64 resistance = 0; int64 resistance = 0;
bool maglev = v->GetAccelerationType() == 2; int accleration_type = v->GetAccelerationType();
bool maglev = (accleration_type == 2);
const int area = v->GetAirDragArea(); const int area = v->GetAirDragArea();
if (!maglev) { if (!maglev) {
@@ -250,7 +251,7 @@ GroundVehicleAcceleration GroundVehicle<T, Type>::GetAcceleration()
/* Defensive driving: prevent ridiculously fast deceleration. /* Defensive driving: prevent ridiculously fast deceleration.
* -130 corresponds to a braking distance of about 6.2 tiles from 160 km/h. */ * -130 corresponds to a braking distance of about 6.2 tiles from 160 km/h. */
braking_accel = std::max(braking_accel, -130); braking_accel = std::max(braking_accel, -(GetTrainRealisticBrakingTargetDecelerationLimit(accleration_type) + 10));
} else { } else {
braking_accel = ClampToI32(std::min<int64>(-braking_force - resistance, -10000) / mass); braking_accel = ClampToI32(std::min<int64>(-braking_force - resistance, -10000) / mass);
} }

View File

@@ -83,6 +83,11 @@ void DeleteVisibleTrain(Train *v);
void CheckBreakdownFlags(Train *v); void CheckBreakdownFlags(Train *v);
void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type); void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);
inline int GetTrainRealisticBrakingTargetDecelerationLimit(int acceleration_type)
{
return 120 + (acceleration_type * 48);
}
/** Variables that are cached to improve performance and such */ /** Variables that are cached to improve performance and such */
struct TrainCache { struct TrainCache {
/* Cached wagon override spritegroup */ /* Cached wagon override spritegroup */

View File

@@ -1030,7 +1030,8 @@ void Train::UpdateAcceleration()
break; break;
case AM_REALISTIC: { case AM_REALISTIC: {
bool maglev = this->GetAccelerationType() == 2; int accleration_type = this->GetAccelerationType();
bool maglev = (accleration_type == 2);
int64 power_w = power * 746ll; int64 power_w = power * 746ll;
int64 min_braking_force = this->gcache.cached_total_length * 300; int64 min_braking_force = this->gcache.cached_total_length * 300;
if (!maglev) { if (!maglev) {
@@ -1072,7 +1073,7 @@ void Train::UpdateAcceleration()
} }
min_braking_force -= (min_braking_force >> 3); // Slightly underestimate braking for defensive driving purposes min_braking_force -= (min_braking_force >> 3); // Slightly underestimate braking for defensive driving purposes
this->tcache.cached_uncapped_decel = Clamp(min_braking_force / weight, 1, UINT16_MAX); this->tcache.cached_uncapped_decel = Clamp(min_braking_force / weight, 1, UINT16_MAX);
this->tcache.cached_deceleration = Clamp(this->tcache.cached_uncapped_decel, 1, 120); this->tcache.cached_deceleration = Clamp(this->tcache.cached_uncapped_decel, 1, GetTrainRealisticBrakingTargetDecelerationLimit(accleration_type));
break; break;
} }
} }