@@ -104,7 +104,6 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
104104 public float AccelerationRampMaxMpSSS = 0.7f ;
105105 public float AccelerationDemandMpSS ;
106106 public float AccelerationRampMinMpSSS = 0.01f ;
107- public bool ResetForceAfterAnyBraking = false ;
108107 public float ThrottleFullRangeIncreaseTimeSeconds = 6 ;
109108 public float ThrottleFullRangeDecreaseTimeSeconds = 6 ;
110109 public float DynamicBrakeFullRangeIncreaseTimeSeconds ;
@@ -134,10 +133,10 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
134133 public bool DisableCruiseControlOnThrottleAndZeroForce = false ;
135134 public bool DisableCruiseControlOnThrottleAndZeroForceAndZeroSpeed = false ;
136135 public bool ForceResetRequiredAfterBraking = false ;
137- public bool ForceResetIncludeDynamicBrake = false ;
138136 public bool ZeroSelectedSpeedWhenPassingToThrottleMode = false ;
139137 public bool DynamicBrakeCommandHasPriorityOverCruiseControl = true ;
140138 public bool TrainBrakeCommandHasPriorityOverCruiseControl = true ;
139+ public bool TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl = true ;
141140 public bool HasIndependentThrottleDynamicBrakeLever = false ;
142141 public bool HasProportionalSpeedSelector = false ;
143142 public bool SpeedSelectorIsDiscrete = false ;
@@ -146,6 +145,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
146145 public bool EnableSelectedSpeedSelectionWhenManualModeSet = false ;
147146 public bool ModeSwitchAllowedWithThrottleNotAtZero = false ;
148147 public bool UseTrainBrakeAndDynBrake = false ;
148+ public bool UseDynBrake = true ;
149149 protected float SpeedDeltaToEnableTrainBrake = 5 ;
150150 protected float SpeedDeltaToEnableFullTrainBrake = 10 ;
151151 public float MinimumSpeedForCCEffectMpS = 0 ;
@@ -167,6 +167,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
167167 protected bool reducingForce = false ;
168168 protected float skidSpeedDegratation = 0 ;
169169 public bool TrainBrakePriority = false ;
170+ public bool TrainBrakePriorityIfCCAccelerating = false ;
170171 public bool WasBraking = false ;
171172 public bool WasForceReset = true ;
172173
@@ -218,7 +219,6 @@ public CruiseControl(CruiseControl other, MSTSLocomotive locomotive)
218219 AccelerationTable = other . AccelerationTable ;
219220 AccelerationRampMaxMpSSS = other . AccelerationRampMaxMpSSS ;
220221 AccelerationRampMinMpSSS = other . AccelerationRampMinMpSSS ;
221- ResetForceAfterAnyBraking = other . ResetForceAfterAnyBraking ;
222222 ThrottleFullRangeIncreaseTimeSeconds = other . ThrottleFullRangeIncreaseTimeSeconds ;
223223 ThrottleFullRangeDecreaseTimeSeconds = other . ThrottleFullRangeDecreaseTimeSeconds ;
224224 DynamicBrakeFullRangeIncreaseTimeSeconds = other . DynamicBrakeFullRangeIncreaseTimeSeconds ;
@@ -246,17 +246,18 @@ public CruiseControl(CruiseControl other, MSTSLocomotive locomotive)
246246 DisableCruiseControlOnThrottleAndZeroForce = other . DisableCruiseControlOnThrottleAndZeroForce ;
247247 DisableCruiseControlOnThrottleAndZeroForceAndZeroSpeed = other . DisableCruiseControlOnThrottleAndZeroForceAndZeroSpeed ;
248248 ForceResetRequiredAfterBraking = other . ForceResetRequiredAfterBraking ;
249- ForceResetIncludeDynamicBrake = other . ForceResetIncludeDynamicBrake ;
250249 ZeroSelectedSpeedWhenPassingToThrottleMode = other . ZeroSelectedSpeedWhenPassingToThrottleMode ;
251250 DynamicBrakeCommandHasPriorityOverCruiseControl = other . DynamicBrakeCommandHasPriorityOverCruiseControl ;
252251 TrainBrakeCommandHasPriorityOverCruiseControl = other . TrainBrakeCommandHasPriorityOverCruiseControl ;
252+ TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl = other . TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl ;
253253 HasIndependentThrottleDynamicBrakeLever = other . HasIndependentThrottleDynamicBrakeLever ;
254254 HasProportionalSpeedSelector = other . HasProportionalSpeedSelector ;
255255 DisableManualSwitchToAutoWhenSetSpeedNotAtTop = other . DisableManualSwitchToAutoWhenSetSpeedNotAtTop ;
256256 EnableSelectedSpeedSelectionWhenManualModeSet = other . EnableSelectedSpeedSelectionWhenManualModeSet ;
257257 SpeedSelectorIsDiscrete = other . SpeedSelectorIsDiscrete ;
258258 DoComputeNumberOfAxles = other . DoComputeNumberOfAxles ;
259259 UseTrainBrakeAndDynBrake = other . UseTrainBrakeAndDynBrake ;
260+ UseDynBrake = other . UseDynBrake ;
260261 SpeedDeltaToEnableTrainBrake = other . SpeedDeltaToEnableTrainBrake ;
261262 SpeedDeltaToEnableFullTrainBrake = other . SpeedDeltaToEnableFullTrainBrake ;
262263 MinimumSpeedForCCEffectMpS = other . MinimumSpeedForCCEffectMpS ;
@@ -280,7 +281,6 @@ public void Parse(STFReader stf)
280281 case "speedselectorsteptimeseconds" : SpeedSelectorStepTimeSeconds = stf . ReadFloatBlock ( STFReader . UNITS . Any , 0.1f ) ; break ;
281282 case "throttlefullrangeincreasetimeseconds" : ThrottleFullRangeIncreaseTimeSeconds = stf . ReadFloatBlock ( STFReader . UNITS . Any , 5 ) ; break ;
282283 case "throttlefullrangedecreasetimeseconds" : ThrottleFullRangeDecreaseTimeSeconds = stf . ReadFloatBlock ( STFReader . UNITS . Any , 5 ) ; break ;
283- case "resetforceafteranybraking" : ResetForceAfterAnyBraking = stf . ReadBoolBlock ( false ) ; break ;
284284 case "dynamicbrakefullrangeincreasetimeseconds" : DynamicBrakeFullRangeIncreaseTimeSeconds = stf . ReadFloatBlock ( STFReader . UNITS . Any , 5 ) ; break ;
285285 case "dynamicbrakefullrangedecreasetimeseconds" : DynamicBrakeFullRangeDecreaseTimeSeconds = stf . ReadFloatBlock ( STFReader . UNITS . Any , 5 ) ; break ;
286286 case "trainbrakefullrangeincreasetimeseconds" : TrainBrakeFullRangeIncreaseTimeSeconds = stf . ReadFloatBlock ( STFReader . UNITS . Any , 10 ) ; break ;
@@ -341,14 +341,15 @@ public void Parse(STFReader stf)
341341 case "usethrottleasspeedselector" : UseThrottleAsSpeedSelector = stf . ReadBoolBlock ( false ) ; break ;
342342 case "usethrottleasforceselector" : UseThrottleAsForceSelector = stf . ReadBoolBlock ( false ) ; break ;
343343 case "forceresetrequiredafterbraking" : ForceResetRequiredAfterBraking = stf . ReadBoolBlock ( false ) ; break ;
344- case "forceresetincludedynamicbrake" : ForceResetIncludeDynamicBrake = stf . ReadBoolBlock ( false ) ; break ;
345344 case "zeroselectedspeedwhenpassingtothrottlemode" : ZeroSelectedSpeedWhenPassingToThrottleMode = stf . ReadBoolBlock ( false ) ; break ;
346345 case "dynamicbrakecommandhaspriorityovercruisecontrol" : DynamicBrakeCommandHasPriorityOverCruiseControl = stf . ReadBoolBlock ( true ) ; break ;
347346 case "trainbrakecommandhaspriorityovercruisecontrol" : TrainBrakeCommandHasPriorityOverCruiseControl = stf . ReadBoolBlock ( true ) ; break ;
347+ case "trainbrakecommandhaspriorityoveracceleratingcruisecontrol" : TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl = stf . ReadBoolBlock ( true ) ; break ;
348348 case "hasindependentthrottledynamicbrakelever" : HasIndependentThrottleDynamicBrakeLever = stf . ReadBoolBlock ( false ) ; break ;
349349 case "hasproportionalspeedselector" : HasProportionalSpeedSelector = stf . ReadBoolBlock ( false ) ; break ;
350350 case "speedselectorisdiscrete" : SpeedSelectorIsDiscrete = stf . ReadBoolBlock ( false ) ; break ;
351351 case "usetrainbrakeanddynbrake" : UseTrainBrakeAndDynBrake = stf . ReadBoolBlock ( false ) ; break ;
352+ case "usedynbrake" : UseDynBrake = stf . ReadBoolBlock ( false ) ; break ;
352353 case "speeddeltatoenabletrainbrake" : SpeedDeltaToEnableTrainBrake = stf . ReadFloatBlock ( STFReader . UNITS . Speed , 5f ) ; break ;
353354 case "speeddeltatoenablefulltrainbrake" : SpeedDeltaToEnableFullTrainBrake = stf . ReadFloatBlock ( STFReader . UNITS . Speed , 10f ) ; break ;
354355 case "minimumspeedforcceffect" : MinimumSpeedForCCEffectMpS = stf . ReadFloatBlock ( STFReader . UNITS . Speed , 0f ) ; break ;
@@ -506,15 +507,16 @@ public void Update(float elapsedClockSeconds)
506507 trainBrakePercent = 0 ;
507508 }
508509 else if ( ( Locomotive . TrainBrakeController . MaxPressurePSI - Locomotive . BrakeSystem . BrakeLine1PressurePSI > 1 ||
509- Locomotive . Train . BrakeLine4 > 0 ) && TrainBrakePriority && ! CCIsUsingTrainBrake )
510+ Locomotive . Train . BrakeLine4 > 0 ) && TrainBrakePriority && ! CCIsUsingTrainBrake && ( TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && ( CCThrottleOrDynBrakePercent > 0 || TrainBrakeCommandHasPriorityOverCruiseControl ) ) )
510511 {
511512 reducingForce = true ;
512513 timeFromEngineMoved = 0 ;
513514 if ( CCThrottleOrDynBrakePercent > 0 )
514515 CCThrottleOrDynBrakePercent = 0 ;
515516 }
516- else if ( TrainBrakePriority || DynamicBrakePriority || ( ThrottleNeutralPosition && SelectedSpeedMpS == 0 ) || SelectedMaxAccelerationPercent == 0 ||
517- ( ForceResetRequiredAfterBraking &&
517+ else if ( TrainBrakePriority && ( TrainBrakeCommandHasPriorityOverCruiseControl || TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && CCThrottleOrDynBrakePercent > 0 )
518+ || DynamicBrakePriority || ( ThrottleNeutralPosition && SelectedSpeedMpS == 0 ) || SelectedMaxAccelerationPercent == 0 ||
519+ ( ForceResetRequiredAfterBraking && ( TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && ( CCThrottleOrDynBrakePercent > 0 || TrainBrakeCommandHasPriorityOverCruiseControl ) ) &&
518520 ( ! WasForceReset || ( WasBraking && SelectedMaxAccelerationPercent > 0 ) ) ) )
519521 {
520522 if ( SpeedSelMode == SpeedSelectorMode . Parking )
@@ -528,6 +530,10 @@ public void Update(float elapsedClockSeconds)
528530 float prevTrainBrakePercent = trainBrakePercent ;
529531 CalculateRequiredForce ( elapsedClockSeconds , Locomotive . AbsWheelSpeedMpS ) ;
530532 CCThrottleOrDynBrakePercent = MathHelper . Clamp ( CCThrottleOrDynBrakePercent , - 100 , 100 ) ;
533+ if ( CCThrottleOrDynBrakePercent > 0 && ForceResetRequiredAfterBraking && ( ! WasForceReset || WasBraking && SelectedMaxAccelerationPercent > 0 ) )
534+ {
535+ CCThrottleOrDynBrakePercent = 0 ;
536+ }
531537 if ( CCThrottleOrDynBrakePercent >= 0 )
532538 {
533539 Locomotive . ThrottlePercent = CCThrottleOrDynBrakePercent ;
@@ -1191,7 +1197,7 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
11911197 else
11921198 {
11931199 deltaSpeedMpS = SetSpeedMpS + ( trainElevation < - 0.01 ? trainElevation * ( SelectedNumberOfAxles / 12 ) : 0 ) - AbsWheelSpeedMpS ;
1194- if ( Locomotive . DynamicBrakeAvailable )
1200+ if ( Locomotive . DynamicBrakeAvailable && UseDynBrake )
11951201 {
11961202 AccelerationDemandMpSS = ( float ) - Math . Sqrt ( - StartReducingSpeedDeltaDownwards * deltaSpeedMpS ) ;
11971203
@@ -1237,7 +1243,7 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
12371243 }
12381244 else
12391245 {
1240- if ( Locomotive . DynamicBrakeAvailable )
1246+ if ( Locomotive . DynamicBrakeAvailable && UseDynBrake )
12411247 {
12421248 float val = ( float ) Math . Abs ( StartReducingSpeedDeltaDownwards * coeff * ( ( deltaSpeedMpS + 0.5f ) / 3 ) ) ;
12431249 AccelerationDemandMpSS = - ( float ) Math . Sqrt ( val ) ;
@@ -1346,7 +1352,10 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
13461352 if ( speedDiff < AntiWheelSpinSpeedDiffThreshold - 0.05f )
13471353 skidSpeedDegratation = 0 ;
13481354 if ( AntiWheelSpinEquipped ) CCThrottleOrDynBrakePercent = Math . Max ( CCThrottleOrDynBrakePercent - skidSpeedDegratation , 0 ) ;
1349- if ( breakout || Locomotive . TrainBrakeController . MaxPressurePSI - Locomotive . BrakeSystem . BrakeLine1PressurePSI > 1 )
1355+ if ( breakout || Locomotive . TrainBrakeController . MaxPressurePSI - Locomotive . BrakeSystem . BrakeLine1PressurePSI > 1
1356+ // Following commented line can enable traction also when train is braking
1357+ // && TrainBrakeCommandHasPriorityOverCruiseControl
1358+ )
13501359 {
13511360 CCThrottleOrDynBrakePercent = 0 ;
13521361 }
@@ -1385,7 +1394,7 @@ void SetTrainBrake(ref float brakePercent, float elapsedClockSeconds, float delt
13851394 {
13861395 if ( deltaSpeedMpS > - SpeedDeltaToEnableFullTrainBrake )
13871396 {
1388- bool dynamicBrakeAvailable = Locomotive . DynamicBrakeAvailable && Locomotive . LocomotivePowerSupply . DynamicBrakeAvailable && Locomotive . AbsSpeedMpS > Locomotive . DynamicBrakeSpeed1MpS ;
1397+ bool dynamicBrakeAvailable = Locomotive . DynamicBrakeAvailable && Locomotive . LocomotivePowerSupply . DynamicBrakeAvailable && UseDynBrake && Locomotive . AbsSpeedMpS > Locomotive . DynamicBrakeSpeed1MpS ;
13891398 if ( ! dynamicBrakeAvailable || deltaSpeedMpS < - SpeedDeltaToEnableTrainBrake )
13901399 {
13911400 CCIsUsingTrainBrake = true ;
0 commit comments