@@ -181,6 +181,9 @@ public struct SpeedValues
181181 public float routeSpeedMpS; // Route defined max speed
182182 public float consistSpeedMpS; // Consist defined max speed
183183 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
184187 }
185188
186189 public DelayedStartValues DelayedStartSettings = new DelayedStartValues();
@@ -259,6 +262,9 @@ public TTTrain(Simulator simulator)
259262 SpeedSettings.detachSpeedMpS = null;
260263 SpeedSettings.movingtableSpeedMpS = null;
261264 SpeedSettings.restrictedSet = false;
265+ SpeedSettings.gradient = false;
266+ SpeedSettings.gradPerc = null;
267+ SpeedSettings.gradMinSpeed = null;
262268 }
263269
264270 //================================================================================================//
@@ -528,9 +534,18 @@ public TTTrain(Simulator simulator, BinaryReader inf, AI airef)
528534 attachSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
529535 detachSpeedMpS = inf.ReadBoolean() ? inf.ReadSingle() : (float?)null,
530536 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
532541 };
533542
543+ if (SpeedSettings.gradient)
544+ {
545+ SpeedSettings.gradPerc = inf.ReadSingle();
546+ SpeedSettings.gradMinSpeed = inf.ReadSingle();
547+ }
548+
534549 DriverOnlyOperation = inf.ReadBoolean();
535550 ForceReversal = inf.ReadBoolean();
536551
@@ -840,6 +855,13 @@ public override void Save(BinaryWriter outf)
840855 outf.Write(SpeedSettings.movingtableSpeedMpS.Value);
841856 }
842857 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+
843865 outf.Write(DriverOnlyOperation);
844866 outf.Write(ForceReversal);
845867 outf.Write(Briefing);
@@ -5792,6 +5814,70 @@ public override void StartMoving(AI_START_MOVEMENT reason)
57925814#endif
57935815 }
57945816
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+
57955881 //================================================================================================//
57965882 /// <summary>
57975883 /// Calculate initial position
0 commit comments