@@ -183,6 +183,9 @@ public struct SpeedValues
183183 public float routeSpeedMpS; // Route defined max speed
184184 public float consistSpeedMpS; // Consist defined max speed
185185 public bool restrictedSet; // Special speed has been set
186+ public bool gradient; // gradient definition has been set
187+ public float? gradPerc; // gradient percentage
188+ public float? gradMinSpeed; // gradient minimum speed
186189 }
187190
188191 public DelayedStartValues DelayedStartSettings = new DelayedStartValues();
@@ -261,6 +264,9 @@ public TTTrain(Simulator simulator)
261264 SpeedSettings.detachSpeedMpS = null;
262265 SpeedSettings.movingtableSpeedMpS = null;
263266 SpeedSettings.restrictedSet = false;
267+ SpeedSettings.gradient = false;
268+ SpeedSettings.gradPerc = null;
269+ SpeedSettings.gradMinSpeed = null;
264270 }
265271
266272 //================================================================================================//
@@ -530,9 +536,18 @@ public TTTrain(Simulator simulator, BinaryReader inf, AI airef)
530536 attachSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
531537 detachSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
532538 movingtableSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
533- restrictedSet = inf.ReadBoolean()
539+ restrictedSet = inf.ReadBoolean(),
540+ gradient = inf.ReadBoolean(),
541+ gradPerc = null,
542+ gradMinSpeed = null
534543 };
535544
545+ if (SpeedSettings.gradient)
546+ {
547+ SpeedSettings.gradPerc = inf.ReadSingle();
548+ SpeedSettings.gradMinSpeed = inf.ReadSingle();
549+ }
550+
536551 DriverOnlyOperation = inf.ReadBoolean();
537552 ForceReversal = inf.ReadBoolean();
538553
@@ -843,6 +858,13 @@ public override void Save(BinaryWriter outf)
843858 outf.Write(SpeedSettings.movingtableSpeedMpS.Value);
844859 }
845860 outf.Write(SpeedSettings.restrictedSet);
861+ outf.Write(SpeedSettings.gradient);
862+ if (SpeedSettings.gradient)
863+ {
864+ outf.Write(SpeedSettings.gradPerc.Value);
865+ outf.Write(SpeedSettings.gradMinSpeed.Value);
866+ }
867+
846868 outf.Write(DriverOnlyOperation);
847869 outf.Write(ForceReversal);
848870 outf.Write(Briefing);
@@ -5911,6 +5933,70 @@ public override void StartMoving(AI_START_MOVEMENT reason)
59115933#endif
59125934 }
59135935
5936+ //================================================================================================//
5937+ /// <summary>
5938+ /// Train control routine for full acceleration
5939+ /// Overrride for AITrain.cs
5940+ /// </summary>
5941+
5942+ public override void AdjustControlsAccelMore(float reqAccelMpSS, float timeS, int stepSize)
5943+ {
5944+ if (AITrainBrakePercent > 0)
5945+ {
5946+ AdjustControlsBrakeOff();
5947+ }
5948+
5949+ if (AITrainThrottlePercent < 100)
5950+ {
5951+ AITrainThrottlePercent += stepSize;
5952+ if (AITrainThrottlePercent > 100)
5953+ AITrainThrottlePercent = 100;
5954+ }
5955+ else if (LastSpeedMpS == 0 || (((SpeedMpS - LastSpeedMpS) / timeS) < 0.5f * MaxAccelMpSS))
5956+ {
5957+ bool forceaccreq = true;
5958+
5959+ // test for train on gradient
5960+ if (SpeedSettings.gradient)
5961+ {
5962+ bool ongrad = false;
5963+ foreach (TrainCar car in Cars)
5964+ {
5965+ if (car.CurrentElevationPercent > SpeedSettings.gradPerc)
5966+ {
5967+ ongrad = true;
5968+ continue;
5969+ }
5970+ }
5971+ if (ongrad && SpeedMpS > SpeedSettings.gradMinSpeed)
5972+ {
5973+ forceaccreq = false;
5974+ }
5975+ }
5976+
5977+ // forced acc is required
5978+ if (forceaccreq)
5979+ {
5980+ float ds = timeS * (reqAccelMpSS);
5981+ SpeedMpS = LastSpeedMpS + ds;
5982+ foreach (TrainCar car in Cars)
5983+ {
5984+ //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.
5985+ // To achieve the same result with other means, without flipping trainset physics, the line should be changed as follows:
5986+ // car.SpeedMpS = car.Flipped ? -SpeedMpS : SpeedMpS;
5987+ car.SpeedMpS = car.Flipped ^ (car.IsDriveable && car.Train.IsActualPlayerTrain && ((MSTSLocomotive)car).UsingRearCab) ? -SpeedMpS : SpeedMpS;
5988+ }
5989+
5990+ if (CheckTrain)
5991+ {
5992+ File.AppendAllText(@"C:\temp\checktrain.txt", "Forced speed increase : was " + LastSpeedMpS + " - now " + SpeedMpS + "\n");
5993+ }
5994+ }
5995+ }
5996+
5997+ SetPercentsFromTrainToTrainset();
5998+ }
5999+
59146000 //================================================================================================//
59156001 /// <summary>
59166002 /// Calculate initial position
0 commit comments