@@ -146,6 +146,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
146146 public bool DisableManualSwitchToAutoWhenThrottleNotAtZero = false ;
147147 public bool DisableManualSwitchToAutoWhenSetSpeedNotAtTop = false ;
148148 public bool EnableSelectedSpeedSelectionWhenManualModeSet = false ;
149+ public bool ModeSwitchAllowedWithThrottleNotAtZero = false ;
149150 public bool UseTrainBrakeAndDynBrake = false ;
150151 protected float SpeedDeltaToEnableTrainBrake = 5 ;
151152 protected float SpeedDeltaToEnableFullTrainBrake = 10 ;
@@ -267,6 +268,7 @@ public CruiseControl(CruiseControl other, MSTSLocomotive locomotive)
267268 TrainBrakeMaxPercentValue = other . TrainBrakeMaxPercentValue ;
268269 StartInAutoMode = other . StartInAutoMode ;
269270 ThrottleNeutralPosition = other . ThrottleNeutralPosition ;
271+ ModeSwitchAllowedWithThrottleNotAtZero = other . ModeSwitchAllowedWithThrottleNotAtZero ;
270272
271273 }
272274
@@ -360,6 +362,7 @@ public void Parse(STFReader stf)
360362 case "trainbrakemaxpercentvalue" : TrainBrakeMaxPercentValue = stf . ReadFloatBlock ( STFReader . UNITS . Any , 0.85f ) ; break ;
361363 case "startinautomode" : StartInAutoMode = stf . ReadBoolBlock ( false ) ; break ;
362364 case "throttleneutralposition" : ThrottleNeutralPosition = stf . ReadBoolBlock ( false ) ; break ;
365+ case "modeswitchallowedwiththrottlenotatzero" : ModeSwitchAllowedWithThrottleNotAtZero = stf . ReadBoolBlock ( false ) ; break ;
363366 case "docomputenumberofaxles" : DoComputeNumberOfAxles = stf . ReadBoolBlock ( false ) ; break ;
364367 case "options" :
365368 foreach ( var speedRegulatorOption in stf . ReadStringBlock ( "" ) . ToLower ( ) . Replace ( " " , "" ) . Split ( ',' ) )
@@ -497,7 +500,7 @@ public void Update(float elapsedClockSeconds)
497500 }
498501 else if ( DynamicBrakePriority ) WasForceReset = false ;
499502 else if ( SpeedSelMode == SpeedSelectorMode . Start ) WasForceReset = true ;
500- else if ( SelectedMaxAccelerationPercent == 0 )
503+ else if ( SelectedMaxAccelerationPercent == 0 || ModeSwitchAllowedWithThrottleNotAtZero && UseThrottleAsForceSelector )
501504 {
502505 WasBraking = false ;
503506 WasForceReset = true ;
@@ -556,7 +559,6 @@ public void Update(float elapsedClockSeconds)
556559 if ( SpeedRegMode == SpeedRegulatorMode . Manual )
557560 SkipThrottleDisplay = false ;
558561
559- if ( maxForceIncreasing ) SpeedRegulatorMaxForceIncrease ( elapsedClockSeconds ) ;
560562 if ( maxForceIncreasing ) SpeedRegulatorMaxForceIncrease ( elapsedClockSeconds ) ;
561563 if ( maxForceDecreasing )
562564 {
@@ -621,7 +623,7 @@ public void SpeedRegulatorModeIncrease()
621623 SpeedRegulatorMode previousMode = SpeedRegMode ;
622624 if ( SpeedRegMode == SpeedRegulatorMode . Testing ) return ;
623625 if ( SpeedRegMode == SpeedRegulatorMode . Manual &&
624- ( ( DisableManualSwitchToAutoWhenThrottleNotAtZero && ( Locomotive . ThrottlePercent != 0 ||
626+ ( ( ! ModeSwitchAllowedWithThrottleNotAtZero && ( Locomotive . ThrottlePercent != 0 ||
625627 ( Locomotive . DynamicBrakePercent != - 1 && Locomotive . DynamicBrakePercent != 0 ) ) ) ||
626628 ( DisableManualSwitchToAutoWhenSetSpeedNotAtTop && SelectedSpeedMpS != Locomotive . MaxSpeedMpS && Locomotive . AbsSpeedMpS > Simulator . MaxStoppedMpS ) ) )
627629 return ;
@@ -635,6 +637,7 @@ public void SpeedRegulatorModeIncrease()
635637 {
636638 if ( SpeedRegulatorOptions . Contains ( "regulatorauto" ) ) test = true ;
637639 if ( ! DisableManualSwitchToAutoWhenSetSpeedNotAtTop && ! KeepSelectedSpeedWhenManualModeSet ) SelectedSpeedMpS = Locomotive . AbsSpeedMpS ;
640+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero ) SelectedMaxAccelerationPercent = Locomotive . ThrottleController . CurrentValue * 100 ;
638641 break ;
639642 }
640643 case SpeedRegulatorMode . Testing : if ( SpeedRegulatorOptions . Contains ( "regulatortest" ) ) test = true ; break ;
@@ -652,7 +655,7 @@ public void SpeedRegulatorModeDecrease()
652655 Locomotive . SignalEvent ( Common . Event . CruiseControlSpeedRegulator ) ;
653656 if ( SpeedRegMode == SpeedRegulatorMode . Manual ) return ;
654657 if ( SpeedRegMode == SpeedRegulatorMode . Auto &&
655- ( DisableManualSwitchToManualWhenSetForceNotAtZero && SelectedMaxAccelerationPercent != 0 ) )
658+ ( ! ModeSwitchAllowedWithThrottleNotAtZero && SelectedMaxAccelerationPercent != 0 ) )
656659 return ;
657660 bool test = false ;
658661 while ( ! test )
@@ -663,7 +666,8 @@ public void SpeedRegulatorModeDecrease()
663666 case SpeedRegulatorMode . Auto : if ( SpeedRegulatorOptions . Contains ( "regulatorauto" ) ) test = true ; break ;
664667 case SpeedRegulatorMode . Manual :
665668 {
666- Locomotive . ThrottleController . SetPercent ( 0 ) ;
669+ if ( ! ModeSwitchAllowedWithThrottleNotAtZero )
670+ Locomotive . ThrottleController . SetPercent ( 0 ) ;
667671 if ( SpeedRegulatorOptions . Contains ( "regulatormanual" ) ) test = true ;
668672 if ( ZeroSelectedSpeedWhenPassingToThrottleMode || UseThrottleAsSpeedSelector ) SelectedSpeedMpS = 0 ;
669673 if ( UseThrottleAsForceSelector ) SelectedMaxAccelerationPercent = 0 ;
@@ -779,13 +783,17 @@ protected void SpeedRegulatorMaxForceIncrease(float elapsedClockSeconds)
779783 return ;
780784 speedRegulatorIntermediateValue += StepSize * elapsedClockSeconds ;
781785 selectedMaxAccelerationPercent = Math . Min ( ( float ) Math . Truncate ( speedRegulatorIntermediateValue + 1 ) , 100 ) ;
786+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
787+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationPercent ) ;
782788 }
783789 else
784790 {
785791 if ( selectedMaxAccelerationStep == SpeedRegulatorMaxForceSteps )
786792 return ;
787793 speedRegulatorIntermediateValue += MaxForceSelectorIsDiscrete ? elapsedClockSeconds : StepSize * elapsedClockSeconds * SpeedRegulatorMaxForceSteps / 100.0f ;
788794 selectedMaxAccelerationStep = Math . Min ( ( float ) Math . Truncate ( speedRegulatorIntermediateValue + 1 ) , SpeedRegulatorMaxForceSteps ) ;
795+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
796+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationStep * 100 / SpeedRegulatorMaxForceSteps ) ;
789797 }
790798 Simulator . Confirmer . ConfirmWithPerCent ( CabControl . MaxAcceleration , SelectedMaxAccelerationPercent ) ;
791799 }
@@ -811,6 +819,8 @@ protected void SpeedRegulatorMaxForceDecrease(float elapsedClockSeconds)
811819 return ;
812820 speedRegulatorIntermediateValue -= StepSize * elapsedClockSeconds ;
813821 selectedMaxAccelerationPercent = Math . Max ( ( int ) speedRegulatorIntermediateValue , 100 ) ;
822+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
823+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationPercent ) ;
814824 if ( selectedMaxAccelerationPercent == 0 )
815825 {
816826 Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -823,6 +833,8 @@ protected void SpeedRegulatorMaxForceDecrease(float elapsedClockSeconds)
823833 return ;
824834 speedRegulatorIntermediateValue -= MaxForceSelectorIsDiscrete ? elapsedClockSeconds : StepSize * elapsedClockSeconds * SpeedRegulatorMaxForceSteps / 100.0f ;
825835 selectedMaxAccelerationStep = Math . Max ( ( int ) speedRegulatorIntermediateValue , DisableZeroForceStep ? 1 : 0 ) ;
836+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
837+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationStep * 100 / SpeedRegulatorMaxForceSteps ) ;
826838 if ( selectedMaxAccelerationStep <= ( DisableZeroForceStep ? 1 : 0 ) )
827839 {
828840 Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -855,6 +867,8 @@ public void SpeedRegulatorMaxForceChangeByMouse(float movExtension, float maxVal
855867 {
856868 selectedMaxAccelerationPercent += movExtension * maxValue ;
857869 selectedMaxAccelerationPercent = MathHelper . Clamp ( selectedMaxAccelerationPercent , 0 , 100 ) ;
870+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
871+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationPercent ) ;
858872 if ( selectedMaxAccelerationPercent == 0 )
859873 {
860874 Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -875,6 +889,8 @@ public void SpeedRegulatorMaxForceChangeByMouse(float movExtension, float maxVal
875889 {
876890 selectedMaxAccelerationStep += movExtension * maxValue ;
877891 selectedMaxAccelerationStep = MathHelper . Clamp ( selectedMaxAccelerationStep , DisableZeroForceStep ? 1 : 0 , SpeedRegulatorMaxForceSteps ) ;
892+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
893+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationStep * 100 / SpeedRegulatorMaxForceSteps ) ;
878894 if ( selectedMaxAccelerationStep == ( DisableZeroForceStep ? 1 : 0 ) )
879895 {
880896 Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -897,6 +913,7 @@ public void SpeedRegulatorSelectedSpeedStartIncrease()
897913 Locomotive . ThrottleController . CurrentValue == 0 && Locomotive . DynamicBrakeController . CurrentValue == 0 ) )
898914 {
899915 SpeedRegMode = SpeedRegulatorMode . Auto ;
916+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero ) SelectedMaxAccelerationPercent = Locomotive . ThrottleController . CurrentValue * 100 ;
900917 }
901918
902919 mpc . DoMovement ( MultiPositionController . Movement . Forward ) ;
0 commit comments