@@ -181,6 +181,9 @@ public struct SpeedValues
181
181
public float routeSpeedMpS; // Route defined max speed
182
182
public float consistSpeedMpS; // Consist defined max speed
183
183
public bool restrictedSet; // Special speed has been set
184
+ public bool gradient; // gradient definition has been set
185
+ public float? gradPerc; // gradient percentage
186
+ public float? gradMinSpeed; // gradient minimum speed
184
187
}
185
188
186
189
public DelayedStartValues DelayedStartSettings = new DelayedStartValues();
@@ -259,6 +262,9 @@ public TTTrain(Simulator simulator)
259
262
SpeedSettings.detachSpeedMpS = null;
260
263
SpeedSettings.movingtableSpeedMpS = null;
261
264
SpeedSettings.restrictedSet = false;
265
+ SpeedSettings.gradient = false;
266
+ SpeedSettings.gradPerc = null;
267
+ SpeedSettings.gradMinSpeed = null;
262
268
}
263
269
264
270
//================================================================================================//
@@ -528,9 +534,18 @@ public TTTrain(Simulator simulator, BinaryReader inf, AI airef)
528
534
attachSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
529
535
detachSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
530
536
movingtableSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
531
- restrictedSet = inf.ReadBoolean()
537
+ restrictedSet = inf.ReadBoolean(),
538
+ gradient = inf.ReadBoolean(),
539
+ gradPerc = null,
540
+ gradMinSpeed = null
532
541
};
533
542
543
+ if (SpeedSettings.gradient)
544
+ {
545
+ SpeedSettings.gradPerc = inf.ReadSingle();
546
+ SpeedSettings.gradMinSpeed = inf.ReadSingle();
547
+ }
548
+
534
549
DriverOnlyOperation = inf.ReadBoolean();
535
550
ForceReversal = inf.ReadBoolean();
536
551
@@ -840,6 +855,13 @@ public override void Save(BinaryWriter outf)
840
855
outf.Write(SpeedSettings.movingtableSpeedMpS.Value);
841
856
}
842
857
outf.Write(SpeedSettings.restrictedSet);
858
+ outf.Write(SpeedSettings.gradient);
859
+ if (SpeedSettings.gradient)
860
+ {
861
+ outf.Write(SpeedSettings.gradPerc.Value);
862
+ outf.Write(SpeedSettings.gradMinSpeed.Value);
863
+ }
864
+
843
865
outf.Write(DriverOnlyOperation);
844
866
outf.Write(ForceReversal);
845
867
outf.Write(Briefing);
@@ -5792,6 +5814,70 @@ public override void StartMoving(AI_START_MOVEMENT reason)
5792
5814
#endif
5793
5815
}
5794
5816
5817
+ //================================================================================================//
5818
+ /// <summary>
5819
+ /// Train control routine for full acceleration
5820
+ /// Overrride for AITrain.cs
5821
+ /// </summary>
5822
+
5823
+ public override void AdjustControlsAccelMore(float reqAccelMpSS, float timeS, int stepSize)
5824
+ {
5825
+ if (AITrainBrakePercent > 0)
5826
+ {
5827
+ AdjustControlsBrakeOff();
5828
+ }
5829
+
5830
+ if (AITrainThrottlePercent < 100)
5831
+ {
5832
+ AITrainThrottlePercent += stepSize;
5833
+ if (AITrainThrottlePercent > 100)
5834
+ AITrainThrottlePercent = 100;
5835
+ }
5836
+ else if (LastSpeedMpS == 0 || (((SpeedMpS - LastSpeedMpS) / timeS) < 0.5f * MaxAccelMpSS))
5837
+ {
5838
+ bool forceaccreq = true;
5839
+
5840
+ // test for train on gradient
5841
+ if (SpeedSettings.gradient)
5842
+ {
5843
+ bool ongrad = false;
5844
+ foreach (TrainCar car in Cars)
5845
+ {
5846
+ if (car.CurrentElevationPercent > SpeedSettings.gradPerc)
5847
+ {
5848
+ ongrad = true;
5849
+ continue;
5850
+ }
5851
+ }
5852
+ if (ongrad && SpeedMpS > SpeedSettings.gradMinSpeed)
5853
+ {
5854
+ forceaccreq = false;
5855
+ }
5856
+ }
5857
+
5858
+ // forced acc is required
5859
+ if (forceaccreq)
5860
+ {
5861
+ float ds = timeS * (reqAccelMpSS);
5862
+ SpeedMpS = LastSpeedMpS + ds;
5863
+ foreach (TrainCar car in Cars)
5864
+ {
5865
+ //TODO: next code line has been modified to flip trainset physics in order to get viewing direction coincident with loco direction when using rear cab.
5866
+ // To achieve the same result with other means, without flipping trainset physics, the line should be changed as follows:
5867
+ // car.SpeedMpS = car.Flipped ? -SpeedMpS : SpeedMpS;
5868
+ car.SpeedMpS = car.Flipped ^ (car.IsDriveable && car.Train.IsActualPlayerTrain && ((MSTSLocomotive)car).UsingRearCab) ? -SpeedMpS : SpeedMpS;
5869
+ }
5870
+
5871
+ if (CheckTrain)
5872
+ {
5873
+ File.AppendAllText(@"C:\temp\checktrain.txt", "Forced speed increase : was " + LastSpeedMpS + " - now " + SpeedMpS + "\n");
5874
+ }
5875
+ }
5876
+ }
5877
+
5878
+ SetPercentsFromTrainToTrainset();
5879
+ }
5880
+
5795
5881
//================================================================================================//
5796
5882
/// <summary>
5797
5883
/// Calculate initial position
0 commit comments