@@ -146,6 +146,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
146
146
public bool DisableManualSwitchToAutoWhenThrottleNotAtZero = false ;
147
147
public bool DisableManualSwitchToAutoWhenSetSpeedNotAtTop = false ;
148
148
public bool EnableSelectedSpeedSelectionWhenManualModeSet = false ;
149
+ public bool ModeSwitchAllowedWithThrottleNotAtZero = false ;
149
150
public bool UseTrainBrakeAndDynBrake = false ;
150
151
protected float SpeedDeltaToEnableTrainBrake = 5 ;
151
152
protected float SpeedDeltaToEnableFullTrainBrake = 10 ;
@@ -267,6 +268,7 @@ public CruiseControl(CruiseControl other, MSTSLocomotive locomotive)
267
268
TrainBrakeMaxPercentValue = other . TrainBrakeMaxPercentValue ;
268
269
StartInAutoMode = other . StartInAutoMode ;
269
270
ThrottleNeutralPosition = other . ThrottleNeutralPosition ;
271
+ ModeSwitchAllowedWithThrottleNotAtZero = other . ModeSwitchAllowedWithThrottleNotAtZero ;
270
272
271
273
}
272
274
@@ -360,6 +362,7 @@ public void Parse(STFReader stf)
360
362
case "trainbrakemaxpercentvalue" : TrainBrakeMaxPercentValue = stf . ReadFloatBlock ( STFReader . UNITS . Any , 0.85f ) ; break ;
361
363
case "startinautomode" : StartInAutoMode = stf . ReadBoolBlock ( false ) ; break ;
362
364
case "throttleneutralposition" : ThrottleNeutralPosition = stf . ReadBoolBlock ( false ) ; break ;
365
+ case "modeswitchallowedwiththrottlenotatzero" : ModeSwitchAllowedWithThrottleNotAtZero = stf . ReadBoolBlock ( false ) ; break ;
363
366
case "docomputenumberofaxles" : DoComputeNumberOfAxles = stf . ReadBoolBlock ( false ) ; break ;
364
367
case "options" :
365
368
foreach ( var speedRegulatorOption in stf . ReadStringBlock ( "" ) . ToLower ( ) . Replace ( " " , "" ) . Split ( ',' ) )
@@ -497,7 +500,7 @@ public void Update(float elapsedClockSeconds)
497
500
}
498
501
else if ( DynamicBrakePriority ) WasForceReset = false ;
499
502
else if ( SpeedSelMode == SpeedSelectorMode . Start ) WasForceReset = true ;
500
- else if ( SelectedMaxAccelerationPercent == 0 )
503
+ else if ( SelectedMaxAccelerationPercent == 0 || ModeSwitchAllowedWithThrottleNotAtZero && UseThrottleAsForceSelector )
501
504
{
502
505
WasBraking = false ;
503
506
WasForceReset = true ;
@@ -556,7 +559,6 @@ public void Update(float elapsedClockSeconds)
556
559
if ( SpeedRegMode == SpeedRegulatorMode . Manual )
557
560
SkipThrottleDisplay = false ;
558
561
559
- if ( maxForceIncreasing ) SpeedRegulatorMaxForceIncrease ( elapsedClockSeconds ) ;
560
562
if ( maxForceIncreasing ) SpeedRegulatorMaxForceIncrease ( elapsedClockSeconds ) ;
561
563
if ( maxForceDecreasing )
562
564
{
@@ -621,7 +623,7 @@ public void SpeedRegulatorModeIncrease()
621
623
SpeedRegulatorMode previousMode = SpeedRegMode ;
622
624
if ( SpeedRegMode == SpeedRegulatorMode . Testing ) return ;
623
625
if ( SpeedRegMode == SpeedRegulatorMode . Manual &&
624
- ( ( DisableManualSwitchToAutoWhenThrottleNotAtZero && ( Locomotive . ThrottlePercent != 0 ||
626
+ ( ( ! ModeSwitchAllowedWithThrottleNotAtZero && ( Locomotive . ThrottlePercent != 0 ||
625
627
( Locomotive . DynamicBrakePercent != - 1 && Locomotive . DynamicBrakePercent != 0 ) ) ) ||
626
628
( DisableManualSwitchToAutoWhenSetSpeedNotAtTop && SelectedSpeedMpS != Locomotive . MaxSpeedMpS && Locomotive . AbsSpeedMpS > Simulator . MaxStoppedMpS ) ) )
627
629
return ;
@@ -635,6 +637,7 @@ public void SpeedRegulatorModeIncrease()
635
637
{
636
638
if ( SpeedRegulatorOptions . Contains ( "regulatorauto" ) ) test = true ;
637
639
if ( ! DisableManualSwitchToAutoWhenSetSpeedNotAtTop && ! KeepSelectedSpeedWhenManualModeSet ) SelectedSpeedMpS = Locomotive . AbsSpeedMpS ;
640
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero ) SelectedMaxAccelerationPercent = Locomotive . ThrottleController . CurrentValue * 100 ;
638
641
break ;
639
642
}
640
643
case SpeedRegulatorMode . Testing : if ( SpeedRegulatorOptions . Contains ( "regulatortest" ) ) test = true ; break ;
@@ -652,7 +655,7 @@ public void SpeedRegulatorModeDecrease()
652
655
Locomotive . SignalEvent ( Common . Event . CruiseControlSpeedRegulator ) ;
653
656
if ( SpeedRegMode == SpeedRegulatorMode . Manual ) return ;
654
657
if ( SpeedRegMode == SpeedRegulatorMode . Auto &&
655
- ( DisableManualSwitchToManualWhenSetForceNotAtZero && SelectedMaxAccelerationPercent != 0 ) )
658
+ ( ! ModeSwitchAllowedWithThrottleNotAtZero && SelectedMaxAccelerationPercent != 0 ) )
656
659
return ;
657
660
bool test = false ;
658
661
while ( ! test )
@@ -663,7 +666,8 @@ public void SpeedRegulatorModeDecrease()
663
666
case SpeedRegulatorMode . Auto : if ( SpeedRegulatorOptions . Contains ( "regulatorauto" ) ) test = true ; break ;
664
667
case SpeedRegulatorMode . Manual :
665
668
{
666
- Locomotive . ThrottleController . SetPercent ( 0 ) ;
669
+ if ( ! ModeSwitchAllowedWithThrottleNotAtZero )
670
+ Locomotive . ThrottleController . SetPercent ( 0 ) ;
667
671
if ( SpeedRegulatorOptions . Contains ( "regulatormanual" ) ) test = true ;
668
672
if ( ZeroSelectedSpeedWhenPassingToThrottleMode || UseThrottleAsSpeedSelector ) SelectedSpeedMpS = 0 ;
669
673
if ( UseThrottleAsForceSelector ) SelectedMaxAccelerationPercent = 0 ;
@@ -779,13 +783,17 @@ protected void SpeedRegulatorMaxForceIncrease(float elapsedClockSeconds)
779
783
return ;
780
784
speedRegulatorIntermediateValue += StepSize * elapsedClockSeconds ;
781
785
selectedMaxAccelerationPercent = Math . Min ( ( float ) Math . Truncate ( speedRegulatorIntermediateValue + 1 ) , 100 ) ;
786
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
787
+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationPercent ) ;
782
788
}
783
789
else
784
790
{
785
791
if ( selectedMaxAccelerationStep == SpeedRegulatorMaxForceSteps )
786
792
return ;
787
793
speedRegulatorIntermediateValue += MaxForceSelectorIsDiscrete ? elapsedClockSeconds : StepSize * elapsedClockSeconds * SpeedRegulatorMaxForceSteps / 100.0f ;
788
794
selectedMaxAccelerationStep = Math . Min ( ( float ) Math . Truncate ( speedRegulatorIntermediateValue + 1 ) , SpeedRegulatorMaxForceSteps ) ;
795
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
796
+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationStep * 100 / SpeedRegulatorMaxForceSteps ) ;
789
797
}
790
798
Simulator . Confirmer . ConfirmWithPerCent ( CabControl . MaxAcceleration , SelectedMaxAccelerationPercent ) ;
791
799
}
@@ -811,6 +819,8 @@ protected void SpeedRegulatorMaxForceDecrease(float elapsedClockSeconds)
811
819
return ;
812
820
speedRegulatorIntermediateValue -= StepSize * elapsedClockSeconds ;
813
821
selectedMaxAccelerationPercent = Math . Max ( ( int ) speedRegulatorIntermediateValue , 100 ) ;
822
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
823
+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationPercent ) ;
814
824
if ( selectedMaxAccelerationPercent == 0 )
815
825
{
816
826
Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -823,6 +833,8 @@ protected void SpeedRegulatorMaxForceDecrease(float elapsedClockSeconds)
823
833
return ;
824
834
speedRegulatorIntermediateValue -= MaxForceSelectorIsDiscrete ? elapsedClockSeconds : StepSize * elapsedClockSeconds * SpeedRegulatorMaxForceSteps / 100.0f ;
825
835
selectedMaxAccelerationStep = Math . Max ( ( int ) speedRegulatorIntermediateValue , DisableZeroForceStep ? 1 : 0 ) ;
836
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
837
+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationStep * 100 / SpeedRegulatorMaxForceSteps ) ;
826
838
if ( selectedMaxAccelerationStep <= ( DisableZeroForceStep ? 1 : 0 ) )
827
839
{
828
840
Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -855,6 +867,8 @@ public void SpeedRegulatorMaxForceChangeByMouse(float movExtension, float maxVal
855
867
{
856
868
selectedMaxAccelerationPercent += movExtension * maxValue ;
857
869
selectedMaxAccelerationPercent = MathHelper . Clamp ( selectedMaxAccelerationPercent , 0 , 100 ) ;
870
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
871
+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationPercent ) ;
858
872
if ( selectedMaxAccelerationPercent == 0 )
859
873
{
860
874
Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -875,6 +889,8 @@ public void SpeedRegulatorMaxForceChangeByMouse(float movExtension, float maxVal
875
889
{
876
890
selectedMaxAccelerationStep += movExtension * maxValue ;
877
891
selectedMaxAccelerationStep = MathHelper . Clamp ( selectedMaxAccelerationStep , DisableZeroForceStep ? 1 : 0 , SpeedRegulatorMaxForceSteps ) ;
892
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero && ! UseThrottleInCombinedControl )
893
+ Locomotive . ThrottleController . SetPercent ( selectedMaxAccelerationStep * 100 / SpeedRegulatorMaxForceSteps ) ;
878
894
if ( selectedMaxAccelerationStep == ( DisableZeroForceStep ? 1 : 0 ) )
879
895
{
880
896
Locomotive . SignalEvent ( Common . Event . LeverToZero ) ;
@@ -897,6 +913,7 @@ public void SpeedRegulatorSelectedSpeedStartIncrease()
897
913
Locomotive . ThrottleController . CurrentValue == 0 && Locomotive . DynamicBrakeController . CurrentValue == 0 ) )
898
914
{
899
915
SpeedRegMode = SpeedRegulatorMode . Auto ;
916
+ if ( UseThrottleAsForceSelector && ModeSwitchAllowedWithThrottleNotAtZero ) SelectedMaxAccelerationPercent = Locomotive . ThrottleController . CurrentValue * 100 ;
900
917
}
901
918
902
919
mpc . DoMovement ( MultiPositionController . Movement . Forward ) ;
0 commit comments