Skip to content

Commit 0a9108c

Browse files
committed
Automatic merge of T1.5.1-870-ge0bf062eb and 18 pull requests
- Pull request #570 at 3539862: Experimental glTF 2.0 support with PBR lighting - Pull request #839 at d00beb9: First phase of https://blueprints.launchpad.net/or/+spec/additional-cruise-control-parameters - Pull request #876 at f92de76: docs: add source for documents previously on website to source Documentation folder - Pull request #882 at 9c456aa: Blueprint/train car operations UI window - Pull request #885 at 8f94333: feat: Add notifications to Menu - Pull request #886 at 6c0785b: Scene viewer extension to TrackViewer - Pull request #892 at 1f5ba4c: Signal Function OPP_SIG_ID_TRAINPATH - Pull request #896 at 5866028: First implementation of https://blueprints.launchpad.net/or/+spec/specific-sounds-for-ai-trains - Pull request #897 at 42f1dd9: feat: Improved system information collection - Pull request #903 at 0d6d045: Downloading route content (Github, zip) - Pull request #907 at 9b0b04f: Bug fix for https://bugs.launchpad.net/or/+bug/2047300 Dynamic tracks disappear after long tunnel - Pull request #911 at 6834af0: docs: Add refactoring as a special type of PR - Pull request #912 at 659396e: New Triple Valve Features Vol. 2 - Pull request #914 at f29be1e: Adjustments to Duplex steam - Pull request #915 at 6d911d7: Correct calculation error with curve friction - Pull request #916 at 11ac52c: Distributed Power Air Brake Synchronization - Pull request #917 at fde18cf: Lighting Configuration Enhancements - Pull request #918 at f7ba507: Manual - News topics updated since 1.5.1
20 parents 966bc5a + e0bf062 + 3539862 + d00beb9 + f92de76 + 9c456aa + 8f94333 + 6c0785b + 1f5ba4c + 5866028 + 42f1dd9 + 0d6d045 + 9b0b04f + 6834af0 + 659396e + f29be1e + 6d911d7 + 11ac52c + fde18cf + f7ba507 commit 0a9108c

File tree

3 files changed

+87
-43
lines changed

3 files changed

+87
-43
lines changed

Source/ORTS.Common/Conversions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,12 @@ public static string FormatVolume(float volumeM3, bool isMetric)
732732
return String.Format(CultureInfo.CurrentCulture, "{0:F0} {1}", volume, isMetric ? m3 : ft3);
733733
}
734734

735+
public static string FormatSmallVolume(float volumeM3, bool isMetric)
736+
{
737+
var volume = isMetric ? volumeM3 : Me3.ToFt3(volumeM3);
738+
return String.Format(CultureInfo.CurrentCulture, "{0:N3} {1}", volume, isMetric ? m3 : ft3);
739+
}
740+
735741
public static string FormatFuelVolume(float volumeL, bool isMetric, bool isUK)
736742
{
737743
var volume = isMetric ? volumeL : isUK ? L.ToGUK(volumeL) : L.ToGUS(volumeL);

Source/Orts.Simulation/Simulation/RollingStocks/MSTSLocomotive.cs

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,16 @@ public enum SlipControlType
259259

260260
// parameters for Track Sander based upon compressor air and abrasive table for 1/2" sand blasting nozzle @ 50psi
261261
public float MaxTrackSandBoxCapacityM3; // Capacity of sandbox
262-
public float TrackSanderAirComsumptionForwardM3pS;
263-
public float TrackSanderAirComsumptionReverseM3pS = 0;
264-
public float TrackSanderSandConsumptionForwardM3pS;
262+
public float MaxTrackSanderAirComsumptionForwardM3pS;
263+
public float MaxTrackSanderAirComsumptionReverseM3pS = 0;
264+
public float MaxTrackSanderSandConsumptionForwardM3pS;
265265
public float CurrentTrackSanderAirConsumptionM3pS;
266266
public float CurrentTrackSanderSandConsumptionM3pS;
267267
public float CurrentTrackSandBoxCapacityM3;
268-
public float TrackSanderSandConsumptionReverseM3pS = 0;
268+
public float MaxTrackSanderSandConsumptionReverseM3pS = 0;
269269
public float SandWeightKgpM3 = 1600; // One cubic metre of sand weighs about 1.54-1.78 tonnes.
270-
public float TrackSanderSteamConsumptionForwardLbpS;
271-
public float TrackSanderSteamConsumptionReverseLbpS = 0;
270+
public float MaxTrackSanderSteamConsumptionForwardLbpS;
271+
public float MaxTrackSanderSteamConsumptionReverseLbpS = 0;
272272

273273

274274
// Vacuum Braking parameters
@@ -1177,20 +1177,20 @@ public override void Parse(string lowercasetoken, STFReader stf)
11771177
MaxTrackSandBoxCapacityM3 = Me3.FromFt3(MaxTrackSandBoxCapacityM3);
11781178
break;
11791179
case "engine(ortsmaxtracksandersandconsumptionforward":
1180-
Me3.FromFt3( TrackSanderSandConsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1181-
TrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(TrackSanderSandConsumptionForwardM3pS);
1180+
Me3.FromFt3( MaxTrackSanderSandConsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1181+
MaxTrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(MaxTrackSanderSandConsumptionForwardM3pS);
11821182
break;
11831183
case "engine(ortsmaxtracksandersandconsumptionreverse":
1184-
Me3.FromFt3(TrackSanderSandConsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1185-
TrackSanderSandConsumptionReverseM3pS = Me3.FromFt3(TrackSanderSandConsumptionReverseM3pS);
1184+
Me3.FromFt3(MaxTrackSanderSandConsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1185+
MaxTrackSanderSandConsumptionReverseM3pS = Me3.FromFt3(MaxTrackSanderSandConsumptionReverseM3pS);
11861186
break;
11871187
case "engine(ortsmaxtracksanderairconsumptionforward":
1188-
Me3.FromFt3( TrackSanderAirComsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1189-
TrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(TrackSanderAirComsumptionForwardM3pS);
1188+
Me3.FromFt3( MaxTrackSanderAirComsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1189+
MaxTrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(MaxTrackSanderAirComsumptionForwardM3pS);
11901190
break;
11911191
case "engine(ortsmaxtracksanderairconsumptionreverse":
1192-
Me3.FromFt3(TrackSanderAirComsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1193-
TrackSanderAirComsumptionReverseM3pS = Me3.FromFt3(TrackSanderAirComsumptionReverseM3pS);
1192+
Me3.FromFt3(MaxTrackSanderAirComsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1193+
MaxTrackSanderAirComsumptionReverseM3pS = Me3.FromFt3(MaxTrackSanderAirComsumptionReverseM3pS);
11941194
break;
11951195
case "engine(ortscruisecontrol": SetUpCruiseControl(stf); break;
11961196
case "engine(ortsmultipositioncontroller": SetUpMPC(stf); break;
@@ -1248,10 +1248,10 @@ public override void Copy(MSTSWagon copy)
12481248
SanderSpeedEffectUpToMpS = locoCopy.SanderSpeedEffectUpToMpS;
12491249
SanderSpeedOfMpS = locoCopy.SanderSpeedOfMpS;
12501250
MaxTrackSandBoxCapacityM3 = locoCopy.MaxTrackSandBoxCapacityM3;
1251-
TrackSanderSandConsumptionForwardM3pS = locoCopy.TrackSanderSandConsumptionForwardM3pS;
1252-
TrackSanderSandConsumptionReverseM3pS = locoCopy.TrackSanderSandConsumptionReverseM3pS;
1253-
TrackSanderAirComsumptionForwardM3pS = locoCopy.TrackSanderAirComsumptionForwardM3pS;
1254-
TrackSanderAirComsumptionReverseM3pS = locoCopy.TrackSanderAirComsumptionReverseM3pS;
1251+
MaxTrackSanderSandConsumptionForwardM3pS = locoCopy.MaxTrackSanderSandConsumptionForwardM3pS;
1252+
MaxTrackSanderSandConsumptionReverseM3pS = locoCopy.MaxTrackSanderSandConsumptionReverseM3pS;
1253+
MaxTrackSanderAirComsumptionForwardM3pS = locoCopy.MaxTrackSanderAirComsumptionForwardM3pS;
1254+
MaxTrackSanderAirComsumptionReverseM3pS = locoCopy.MaxTrackSanderAirComsumptionReverseM3pS;
12551255
PowerOnDelayS = locoCopy.PowerOnDelayS;
12561256
DoesHornTriggerBell = locoCopy.DoesHornTriggerBell;
12571257
MaxSteamHeatPressurePSI = locoCopy.MaxSteamHeatPressurePSI;
@@ -1360,7 +1360,6 @@ public override void Save(BinaryWriter outf)
13601360
outf.Write(PowerReduction);
13611361
outf.Write(ScoopIsBroken);
13621362
outf.Write(IsWaterScoopDown);
1363-
outf.Write(CurrentTrackSandBoxCapacityM3);
13641363
outf.Write(SaveAdhesionFilter);
13651364
outf.Write(GenericItem1);
13661365
outf.Write(GenericItem2);
@@ -1370,6 +1369,10 @@ public override void Save(BinaryWriter outf)
13701369
outf.Write(previousChangedGearBoxNotch);
13711370
outf.Write(DynamicBrake);
13721371
outf.Write(DynamicBrakeIntervention);
1372+
outf.Write(CurrentTrackSandBoxCapacityM3);
1373+
outf.Write(CurrentTrackSanderSandConsumptionM3pS);
1374+
outf.Write(CurrentTrackSanderAirConsumptionM3pS);
1375+
13731376

13741377
base.Save(outf);
13751378

@@ -1412,7 +1415,6 @@ public override void Restore(BinaryReader inf)
14121415
PowerReduction = inf.ReadSingle();
14131416
ScoopIsBroken = inf.ReadBoolean();
14141417
IsWaterScoopDown = inf.ReadBoolean();
1415-
CurrentTrackSandBoxCapacityM3 = inf.ReadSingle();
14161418

14171419
SaveAdhesionFilter = inf.ReadSingle();
14181420

@@ -1427,6 +1429,9 @@ public override void Restore(BinaryReader inf)
14271429

14281430
DynamicBrake = inf.ReadBoolean();
14291431
DynamicBrakeIntervention = inf.ReadSingle();
1432+
CurrentTrackSandBoxCapacityM3 = inf.ReadSingle();
1433+
CurrentTrackSanderSandConsumptionM3pS = inf.ReadSingle();
1434+
CurrentTrackSanderAirConsumptionM3pS = inf.ReadSingle();
14301435

14311436
base.Restore(inf);
14321437

@@ -1802,19 +1807,19 @@ public override void Initialize()
18021807
MaxTrackSandBoxCapacityM3 = Me3.FromFt3(40.0f); // Capacity of sandbox - assume 40.0 cu ft
18031808
}
18041809

1805-
if (TrackSanderAirComsumptionForwardM3pS == 0)
1810+
if (MaxTrackSanderAirComsumptionForwardM3pS == 0 && SandingSystemType == SandingSystemTypes.Air)
18061811
{
1807-
TrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(56.0f) / 60.0f; // Default value - cubic feet per min (CFM) 28 ft3/m x 2 sanders @ 140 psi - convert to /sec values
1812+
MaxTrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(56.0f) / 60.0f; // Default value - cubic feet per min (CFM) 28 ft3/m x 2 sanders @ 140 psi - convert to /sec values
18081813
}
18091814

1810-
if (TrackSanderSandConsumptionForwardM3pS == 0)
1815+
if (MaxTrackSanderSandConsumptionForwardM3pS == 0)
18111816
{
1812-
TrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(3.4f) / 3600.0f; // Default value - 1.7 ft3/h x 2 sanders @ 140 psi - convert to /sec values
1817+
MaxTrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(3.4f) / 3600.0f; // Default value - 1.7 ft3/h x 2 sanders @ 140 psi - convert to /sec values
18131818
}
18141819

1815-
if (TrackSanderSteamConsumptionForwardLbpS == 0 && SandingSystemType == SandingSystemTypes.Steam)
1820+
if (MaxTrackSanderSteamConsumptionForwardLbpS == 0 && SandingSystemType == SandingSystemTypes.Steam)
18161821
{
1817-
TrackSanderSteamConsumptionForwardLbpS = 300f / 3600f; // Default value - 300lbs/hr - this value is un confirmed at this stage.
1822+
MaxTrackSanderSteamConsumptionForwardLbpS = 300f / 3600f; // Default value - 300lbs/hr - this value is un confirmed at this stage.
18181823
}
18191824

18201825
base.Initialize();
@@ -3325,13 +3330,13 @@ public void UpdateTrackSander(float elapsedClockSeconds)
33253330

33263331
if (Direction == Direction.Reverse)
33273332
{
3328-
sandingSteamConsumptionLbpS = TrackSanderSteamConsumptionReverseLbpS;
3329-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionReverseM3pS;
3333+
sandingSteamConsumptionLbpS = MaxTrackSanderSteamConsumptionReverseLbpS;
3334+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionReverseM3pS;
33303335
}
33313336
else
33323337
{
3333-
sandingSteamConsumptionLbpS = TrackSanderSteamConsumptionForwardLbpS;
3334-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionForwardM3pS;
3338+
sandingSteamConsumptionLbpS = MaxTrackSanderSteamConsumptionForwardLbpS;
3339+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionForwardM3pS;
33353340
}
33363341

33373342
// Calculate steam consumption
@@ -3357,20 +3362,20 @@ public void UpdateTrackSander(float elapsedClockSeconds)
33573362

33583363
if (Direction == Direction.Reverse)
33593364
{
3360-
sandingAirConsumptionM3pS = TrackSanderAirComsumptionReverseM3pS;
3361-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionReverseM3pS;
3365+
sandingAirConsumptionM3pS = MaxTrackSanderAirComsumptionReverseM3pS;
3366+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionReverseM3pS;
33623367
}
33633368
else
33643369
{
3365-
sandingAirConsumptionM3pS = TrackSanderAirComsumptionForwardM3pS;
3366-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionForwardM3pS;
3367-
}
3370+
sandingAirConsumptionM3pS = MaxTrackSanderAirComsumptionForwardM3pS;
3371+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionForwardM3pS;
3372+
}
33683373

3369-
// Calculate air consumption and change in main air reservoir pressure
3374+
// Calculate air consumption and change in main air reservoir pressure
33703375
CurrentTrackSanderAirConsumptionM3pS = (MainResPressurePSI / MaxMainResPressurePSI) * sandingAirConsumptionM3pS * elapsedClockSeconds;
33713376
float SanderPressureDiffPSI = CurrentTrackSanderAirConsumptionM3pS / Me3.ToFt3(MainResVolumeM3);
3372-
MainResPressurePSI -= SanderPressureDiffPSI;
3373-
MainResPressurePSI = MathHelper.Clamp(MainResPressurePSI, 0.001f, MaxMainResPressurePSI);
3377+
MainResPressurePSI -= SanderPressureDiffPSI;
3378+
MainResPressurePSI = MathHelper.Clamp(MainResPressurePSI, 0.001f, MaxMainResPressurePSI);
33743379

33753380
// Calculate sand consumption for sander
33763381
if (CurrentTrackSandBoxCapacityM3 > 0.0) // if sand still in sandbox then sanding is available
@@ -3386,7 +3391,12 @@ public void UpdateTrackSander(float elapsedClockSeconds)
33863391
}
33873392
}
33883393
}
3389-
3394+
else // reset to zero if sander is off
3395+
{
3396+
CurrentTrackSanderSandConsumptionM3pS = 0;
3397+
CurrentTrackSanderAirConsumptionM3pS = 0;
3398+
SandingSteamUsageLBpS = 0;
3399+
}
33903400
}
33913401

33923402
public override bool GetSanderOn()

Source/Orts.Simulation/Simulation/RollingStocks/MSTSSteamLocomotive.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,12 @@ public override void Parse(string lowercasetoken, STFReader stf)
889889
MSTSNumCylinders = stf.ReadIntBlock(null); break; // retained for legacy purposes
890890
case "engine(numberofcylinders":
891891
MSTSNumCylinders = stf.ReadIntBlock(null); break;
892+
case "engine(ortsmaxtracksandersteamconsumptionforward":
893+
Me3.FromFt3(MaxTrackSanderSteamConsumptionForwardLbpS = stf.ReadFloatBlock(STFReader.UNITS.Mass, null));
894+
break;
895+
case "engine(ortsmaxtracksandersteamconsumptionreverse":
896+
Me3.FromFt3(MaxTrackSanderSteamConsumptionReverseLbpS = stf.ReadFloatBlock(STFReader.UNITS.Mass, null));
897+
break;
892898
case "engine(cylinderstroke": MSTSCylinderStrokeM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
893899
case "engine(cylinderdiameter": MSTSCylinderDiameterM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
894900
case "engine(lpnumcylinders": MSTSLPNumCylinders = stf.ReadIntBlock(null); break;
@@ -1014,6 +1020,8 @@ public override void Copy(MSTSWagon copy)
10141020
MaxSuperheatRefTempF = locoCopy.MaxSuperheatRefTempF;
10151021
MaxIndicatedHorsePowerHP = locoCopy.MaxIndicatedHorsePowerHP;
10161022
SuperheatCutoffPressureFactor = locoCopy.SuperheatCutoffPressureFactor;
1023+
MaxTrackSanderSteamConsumptionForwardLbpS = locoCopy.MaxTrackSanderSteamConsumptionForwardLbpS;
1024+
MaxTrackSanderSteamConsumptionReverseLbpS = locoCopy.MaxTrackSanderSteamConsumptionReverseLbpS;
10171025
EjectorSmallSteamConsumptionLbpS = locoCopy.EjectorSmallSteamConsumptionLbpS;
10181026
EjectorLargeSteamConsumptionLbpS = locoCopy.EjectorLargeSteamConsumptionLbpS;
10191027
ShovelMassKG = locoCopy.ShovelMassKG;
@@ -1111,6 +1119,7 @@ public override void Save(BinaryWriter outf)
11111119
outf.Write(EvaporationLBpS);
11121120
outf.Write(FireMassKG);
11131121
outf.Write(FlueTempK);
1122+
outf.Write(SandingSteamUsageLBpS);
11141123
outf.Write(SteamGearPosition);
11151124
ControllerFactory.Save(CutoffController, outf);
11161125
ControllerFactory.Save(Injector1Controller, outf);
@@ -1174,6 +1183,7 @@ public override void Restore(BinaryReader inf)
11741183
EvaporationLBpS = inf.ReadSingle();
11751184
FireMassKG = inf.ReadSingle();
11761185
FlueTempK = inf.ReadSingle();
1186+
SandingSteamUsageLBpS = inf.ReadSingle();
11771187
SteamGearPosition = inf.ReadSingle();
11781188
ControllerFactory.Restore(CutoffController, inf);
11791189
ControllerFactory.Restore(Injector1Controller, inf);
@@ -8003,17 +8013,35 @@ public override string GetDebugStatus()
80038013
SteamEngines[i].CalculatedFactorOfAdhesion);
80048014
}
80058015

8006-
status.AppendFormat("{0}\t{1}\t{2:N2}\t{3}\t{4:N8}/{9}\t\t{5}\t{6:N3}/{9}\t{7}\t{8:N1}\n",
8016+
if (SandingSystemType == SandingSystemTypes.Steam)
8017+
{
8018+
status.AppendFormat("{0}\t{1}\t{22}\t{3}\t{4}/{7}\t\t{5}\t{6}/{7}\n",
8019+
Simulator.Catalog.GetString("Sand:"),
8020+
Simulator.Catalog.GetString("S/Box"),
8021+
FormatStrings.FormatVolume(CurrentTrackSandBoxCapacityM3, IsMetric),
8022+
Simulator.Catalog.GetString("S/Use"),
8023+
FormatStrings.FormatSmallVolume(pS.TopH(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
8024+
Simulator.Catalog.GetString("St/Use"),
8025+
FormatStrings.FormatMass(pS.TopH(SandingSteamUsageLBpS), IsMetric),
8026+
FormatStrings.h);
8027+
8028+
}
8029+
else
8030+
{
8031+
8032+
status.AppendFormat("{0}\t{1}\t{2}\t{3}\t{4}/{9}\t\t{5}\t{6}/{9}\t\t{7}\t{8:N1}\n",
80078033
Simulator.Catalog.GetString("Sand:"),
80088034
Simulator.Catalog.GetString("S/Box"),
80098035
FormatStrings.FormatVolume(CurrentTrackSandBoxCapacityM3, IsMetric),
80108036
Simulator.Catalog.GetString("S/Use"),
8011-
FormatStrings.FormatVolume(pS.TopM(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
8037+
FormatStrings.FormatSmallVolume(pS.TopH(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
80128038
Simulator.Catalog.GetString("A/Use"),
8013-
FormatStrings.FormatVolume(pS.TopM(CurrentTrackSanderAirConsumptionM3pS), IsMetric),
8039+
FormatStrings.FormatSmallVolume(pS.TopH(CurrentTrackSanderAirConsumptionM3pS), IsMetric),
80148040
Simulator.Catalog.GetString("M/Press"),
80158041
MainResPressurePSI,
8016-
FormatStrings.min);
8042+
FormatStrings.h);
8043+
8044+
}
80178045

80188046
status.AppendFormat("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\n",
80198047
Simulator.Catalog.GetString("CylE:"),

0 commit comments

Comments
 (0)