@@ -138,6 +138,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
138
138
public bool ZeroSelectedSpeedWhenPassingToThrottleMode = false ;
139
139
public bool DynamicBrakeCommandHasPriorityOverCruiseControl = true ;
140
140
public bool TrainBrakeCommandHasPriorityOverCruiseControl = true ;
141
+ public bool TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl = true ;
141
142
public bool HasIndependentThrottleDynamicBrakeLever = false ;
142
143
public bool HasProportionalSpeedSelector = false ;
143
144
public bool SpeedSelectorIsDiscrete = false ;
@@ -146,6 +147,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
146
147
public bool EnableSelectedSpeedSelectionWhenManualModeSet = false ;
147
148
public bool ModeSwitchAllowedWithThrottleNotAtZero = false ;
148
149
public bool UseTrainBrakeAndDynBrake = false ;
150
+ public bool UseDynBrake = true ;
149
151
protected float SpeedDeltaToEnableTrainBrake = 5 ;
150
152
protected float SpeedDeltaToEnableFullTrainBrake = 10 ;
151
153
public float MinimumSpeedForCCEffectMpS = 0 ;
@@ -167,6 +169,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
167
169
protected bool reducingForce = false ;
168
170
protected float skidSpeedDegratation = 0 ;
169
171
public bool TrainBrakePriority = false ;
172
+ public bool TrainBrakePriorityIfCCAccelerating = false ;
170
173
public bool WasBraking = false ;
171
174
public bool WasForceReset = true ;
172
175
@@ -250,13 +253,15 @@ public CruiseControl(CruiseControl other, MSTSLocomotive locomotive)
250
253
ZeroSelectedSpeedWhenPassingToThrottleMode = other . ZeroSelectedSpeedWhenPassingToThrottleMode ;
251
254
DynamicBrakeCommandHasPriorityOverCruiseControl = other . DynamicBrakeCommandHasPriorityOverCruiseControl ;
252
255
TrainBrakeCommandHasPriorityOverCruiseControl = other . TrainBrakeCommandHasPriorityOverCruiseControl ;
256
+ TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl = other . TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl ;
253
257
HasIndependentThrottleDynamicBrakeLever = other . HasIndependentThrottleDynamicBrakeLever ;
254
258
HasProportionalSpeedSelector = other . HasProportionalSpeedSelector ;
255
259
DisableManualSwitchToAutoWhenSetSpeedNotAtTop = other . DisableManualSwitchToAutoWhenSetSpeedNotAtTop ;
256
260
EnableSelectedSpeedSelectionWhenManualModeSet = other . EnableSelectedSpeedSelectionWhenManualModeSet ;
257
261
SpeedSelectorIsDiscrete = other . SpeedSelectorIsDiscrete ;
258
262
DoComputeNumberOfAxles = other . DoComputeNumberOfAxles ;
259
263
UseTrainBrakeAndDynBrake = other . UseTrainBrakeAndDynBrake ;
264
+ UseDynBrake = other . UseDynBrake ;
260
265
SpeedDeltaToEnableTrainBrake = other . SpeedDeltaToEnableTrainBrake ;
261
266
SpeedDeltaToEnableFullTrainBrake = other . SpeedDeltaToEnableFullTrainBrake ;
262
267
MinimumSpeedForCCEffectMpS = other . MinimumSpeedForCCEffectMpS ;
@@ -345,10 +350,12 @@ public void Parse(STFReader stf)
345
350
case "zeroselectedspeedwhenpassingtothrottlemode" : ZeroSelectedSpeedWhenPassingToThrottleMode = stf . ReadBoolBlock ( false ) ; break ;
346
351
case "dynamicbrakecommandhaspriorityovercruisecontrol" : DynamicBrakeCommandHasPriorityOverCruiseControl = stf . ReadBoolBlock ( true ) ; break ;
347
352
case "trainbrakecommandhaspriorityovercruisecontrol" : TrainBrakeCommandHasPriorityOverCruiseControl = stf . ReadBoolBlock ( true ) ; break ;
353
+ case "trainbrakecommandhaspriorityoveracceleratingcruisecontrol" : TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl = stf . ReadBoolBlock ( true ) ; break ;
348
354
case "hasindependentthrottledynamicbrakelever" : HasIndependentThrottleDynamicBrakeLever = stf . ReadBoolBlock ( false ) ; break ;
349
355
case "hasproportionalspeedselector" : HasProportionalSpeedSelector = stf . ReadBoolBlock ( false ) ; break ;
350
356
case "speedselectorisdiscrete" : SpeedSelectorIsDiscrete = stf . ReadBoolBlock ( false ) ; break ;
351
357
case "usetrainbrakeanddynbrake" : UseTrainBrakeAndDynBrake = stf . ReadBoolBlock ( false ) ; break ;
358
+ case "usedynbrake" : UseDynBrake = stf . ReadBoolBlock ( false ) ; break ;
352
359
case "speeddeltatoenabletrainbrake" : SpeedDeltaToEnableTrainBrake = stf . ReadFloatBlock ( STFReader . UNITS . Speed , 5f ) ; break ;
353
360
case "speeddeltatoenablefulltrainbrake" : SpeedDeltaToEnableFullTrainBrake = stf . ReadFloatBlock ( STFReader . UNITS . Speed , 10f ) ; break ;
354
361
case "minimumspeedforcceffect" : MinimumSpeedForCCEffectMpS = stf . ReadFloatBlock ( STFReader . UNITS . Speed , 0f ) ; break ;
@@ -506,15 +513,16 @@ public void Update(float elapsedClockSeconds)
506
513
trainBrakePercent = 0 ;
507
514
}
508
515
else if ( ( Locomotive . TrainBrakeController . MaxPressurePSI - Locomotive . BrakeSystem . BrakeLine1PressurePSI > 1 ||
509
- Locomotive . Train . BrakeLine4 > 0 ) && TrainBrakePriority && ! CCIsUsingTrainBrake )
516
+ Locomotive . Train . BrakeLine4 > 0 ) && TrainBrakePriority && ! CCIsUsingTrainBrake && ( ! ( TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && CCThrottleOrDynBrakePercent <= 0 ) || TrainBrakeCommandHasPriorityOverCruiseControl ) )
510
517
{
511
518
reducingForce = true ;
512
519
timeFromEngineMoved = 0 ;
513
520
if ( CCThrottleOrDynBrakePercent > 0 )
514
521
CCThrottleOrDynBrakePercent = 0 ;
515
522
}
516
- else if ( TrainBrakePriority || DynamicBrakePriority || ( ThrottleNeutralPosition && SelectedSpeedMpS == 0 ) || SelectedMaxAccelerationPercent == 0 ||
517
- ( ForceResetRequiredAfterBraking &&
523
+ else if ( TrainBrakePriority && ( TrainBrakeCommandHasPriorityOverCruiseControl || TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && CCThrottleOrDynBrakePercent > 0 )
524
+ || DynamicBrakePriority || ( ThrottleNeutralPosition && SelectedSpeedMpS == 0 ) || SelectedMaxAccelerationPercent == 0 ||
525
+ ( ForceResetRequiredAfterBraking && ( ! ( TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && CCThrottleOrDynBrakePercent <= 0 ) || TrainBrakeCommandHasPriorityOverCruiseControl ) &&
518
526
( ! WasForceReset || ( WasBraking && SelectedMaxAccelerationPercent > 0 ) ) ) )
519
527
{
520
528
if ( SpeedSelMode == SpeedSelectorMode . Parking )
@@ -528,6 +536,10 @@ public void Update(float elapsedClockSeconds)
528
536
float prevTrainBrakePercent = trainBrakePercent ;
529
537
CalculateRequiredForce ( elapsedClockSeconds , Locomotive . AbsWheelSpeedMpS ) ;
530
538
CCThrottleOrDynBrakePercent = MathHelper . Clamp ( CCThrottleOrDynBrakePercent , - 100 , 100 ) ;
539
+ if ( CCThrottleOrDynBrakePercent > 0 && ForceResetRequiredAfterBraking && ( ! WasForceReset || WasBraking && SelectedMaxAccelerationPercent > 0 ) )
540
+ {
541
+ CCThrottleOrDynBrakePercent = 0 ;
542
+ }
531
543
if ( CCThrottleOrDynBrakePercent >= 0 )
532
544
{
533
545
Locomotive . ThrottlePercent = CCThrottleOrDynBrakePercent ;
@@ -1194,7 +1206,7 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
1194
1206
else
1195
1207
{
1196
1208
deltaSpeedMpS = SetSpeedMpS + ( trainElevation < - 0.01 ? trainElevation * ( SelectedNumberOfAxles / 12 ) : 0 ) - AbsWheelSpeedMpS ;
1197
- if ( Locomotive . DynamicBrakeAvailable )
1209
+ if ( Locomotive . DynamicBrakeAvailable && UseDynBrake )
1198
1210
{
1199
1211
AccelerationDemandMpSS = ( float ) - Math . Sqrt ( - StartReducingSpeedDeltaDownwards * deltaSpeedMpS ) ;
1200
1212
@@ -1240,7 +1252,7 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
1240
1252
}
1241
1253
else
1242
1254
{
1243
- if ( Locomotive . DynamicBrakeAvailable )
1255
+ if ( Locomotive . DynamicBrakeAvailable && UseDynBrake )
1244
1256
{
1245
1257
float val = ( float ) Math . Abs ( StartReducingSpeedDeltaDownwards * coeff * ( ( deltaSpeedMpS + 0.5f ) / 3 ) ) ;
1246
1258
AccelerationDemandMpSS = - ( float ) Math . Sqrt ( val ) ;
0 commit comments