@@ -1165,6 +1165,12 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
11651165 {
11661166 IncreaseForce ( ref CCThrottleOrDynBrakePercent , elapsedClockSeconds , 0 ) ;
11671167 }
1168+ if ( DynamicBrakeIsSelectedForceDependant )
1169+ {
1170+ float maxPercent = ( MaxForceSelectorIsDiscrete ? ( int ) SelectedMaxAccelerationStep : SelectedMaxAccelerationStep ) * 100 / SpeedRegulatorMaxForceSteps ;
1171+ if ( CCThrottleOrDynBrakePercent < - maxPercent )
1172+ CCThrottleOrDynBrakePercent = - maxPercent ;
1173+ }
11681174 }
11691175 if ( UseTrainBrakeAndDynBrake || ! Locomotive . DynamicBrakeAvailable ) // use TrainBrake
11701176 SetTrainBrake ( ref trainBrakePercent , elapsedClockSeconds , deltaSpeedMpS ) ;
@@ -1186,7 +1192,7 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
11861192 }
11871193 else // start braking
11881194 {
1189- if ( CCThrottleOrDynBrakePercent >= 0 )
1195+ if ( CCThrottleOrDynBrakePercent > 0 )
11901196 {
11911197 DecreaseForce ( ref CCThrottleOrDynBrakePercent , elapsedClockSeconds , 0 ) ;
11921198 }
@@ -1198,12 +1204,19 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
11981204 AccelerationDemandMpSS = - ( float ) Math . Sqrt ( val ) ;
11991205 if ( RelativeAccelerationMpSS > AccelerationDemandMpSS )
12001206 {
1201- float maxPercent = DynamicBrakeIsSelectedForceDependant ? ( ( MaxForceSelectorIsDiscrete ? ( int ) SelectedMaxAccelerationStep : SelectedMaxAccelerationStep ) * 100 / SpeedRegulatorMaxForceSteps ) : 100 ;
1202- DecreaseForce ( ref CCThrottleOrDynBrakePercent , elapsedClockSeconds , - maxPercent ) ;
1207+ float maxStep = ( RelativeAccelerationMpSS - AccelerationDemandMpSS ) * 2 ;
1208+ DecreaseForce ( ref CCThrottleOrDynBrakePercent , elapsedClockSeconds , Math . Max ( CCThrottleOrDynBrakePercent - maxStep , - 100 ) ) ;
12031209 }
12041210 else if ( RelativeAccelerationMpSS + 0.01f < AccelerationDemandMpSS )
12051211 {
1206- IncreaseForce ( ref CCThrottleOrDynBrakePercent , elapsedClockSeconds , 0 ) ;
1212+ float maxStep = ( AccelerationDemandMpSS - RelativeAccelerationMpSS ) * 2 ;
1213+ IncreaseForce ( ref CCThrottleOrDynBrakePercent , elapsedClockSeconds , Math . Min ( CCThrottleOrDynBrakePercent + maxStep , 0 ) ) ;
1214+ }
1215+ if ( DynamicBrakeIsSelectedForceDependant )
1216+ {
1217+ float maxPercent = ( MaxForceSelectorIsDiscrete ? ( int ) SelectedMaxAccelerationStep : SelectedMaxAccelerationStep ) * 100 / SpeedRegulatorMaxForceSteps ;
1218+ if ( CCThrottleOrDynBrakePercent < - maxPercent )
1219+ CCThrottleOrDynBrakePercent = - maxPercent ;
12071220 }
12081221 }
12091222 if ( UseTrainBrakeAndDynBrake || ! Locomotive . DynamicBrakeAvailable ) // use TrainBrake
0 commit comments