Skip to content

Commit 63139e2

Browse files
committed
Automatic merge of T1.5.1-1695-gade019506 and 17 pull requests
- Pull request #570 at f11a428: glTF 2.0 support with PBR lighting - Pull request #900 at 4629736: DMI in 3D cab + two more dials - Pull request #1030 at d3ae4a2: Refactor settings, in prep for settings exporter - Pull request #1045 at cc4d53c: Bugfix: Empty Start Time for Explore, and other issues loading from Menu Selection and Content Routes - Pull request #1052 at 3b5cb90: Content Manager: Add axle count, and lowest derail force - Pull request #1062 at b96d6fa: Train Forces popup Window. - Pull request #1064 at a57d23d: Add Train Info tab to Help window (F1) - Pull request #1066 at 62c89c1: Log derailment, using TraceInformation. - Pull request #892 at 1f5ba4c: Signal Function OPP_SIG_ID_TRAINPATH - Pull request #1000 at d8d9709: Locomotive operation from control car - Pull request #1029 at 92c74ef: Superelevation Follow Up Fixes - Pull request #1057 at 50c3789: Switchable brake system - Pull request #1069 at 3f153f0: Mouse wheel control only with Alt – Followup for #1051 - Pull request #1070 at f818e40: Fix a NullReferenceException in TCS scripts - Pull request #1055 at 5c78967: Route Based TTrack Sounds - Pull request #896 at f1681df: First implementation of https://blueprints.launchpad.net/or/+spec/specific-sounds-for-ai-trains - Pull request #1049 at 4dd8c4f: Re-organise document storage and access
19 parents 99ca163 + ade0195 + f11a428 + 4629736 + d3ae4a2 + cc4d53c + 3b5cb90 + b96d6fa + a57d23d + 62c89c1 + 1f5ba4c + d8d9709 + 92c74ef + 50c3789 + 3f153f0 + f818e40 + 5c78967 + f1681df + 4dd8c4f commit 63139e2

File tree

6 files changed

+39
-15
lines changed

6 files changed

+39
-15
lines changed

Diff for: Source/Contrib/ContentManager/ContentInfo.cs

+15-11
Original file line numberDiff line numberDiff line change
@@ -189,19 +189,21 @@ public static string GetText(Content content)
189189
details.AppendFormat("NumEngines:\t{1}{0}", Environment.NewLine, data.NumEngines);
190190
details.AppendFormat("NumCars:\t{1}{0}", Environment.NewLine, data.NumCars);
191191
details.AppendFormat("Axles:\t{1}{0}", Environment.NewLine, data.NumAxles);
192-
details.AppendFormat("MaxSpeed:\t{1}{0}", Environment.NewLine, FormatStrings.FormatSpeedLimit(data.MaxSpeedMps, IsMetric));
193-
details.AppendFormat("Weight:\t{1}{0}", Environment.NewLine, FormatStrings.FormatLargeMass(data.MassKG, IsMetric, IsUK));
192+
details.AppendFormat("Weight:\t{1} (trailing: {2}){0}", Environment.NewLine, FormatStrings.FormatLargeMass(data.MassKG, IsMetric, IsUK),
193+
FormatStrings.FormatLargeMass(data.TrailingMassKG, IsMetric, IsUK));
194194
details.AppendFormat("Length:\t{1}{0}", Environment.NewLine, FormatStrings.FormatShortDistanceDisplay(data.LengthM, IsMetric));
195-
details.AppendFormat("Power:\t{1}{0}", Environment.NewLine, FormatStrings.FormatPower(data.MaxPowerW, IsMetric, IsImperialBHP, IsImperialBTUpS));
195+
details.AppendFormat("MaxPower:\t{1}{0}", Environment.NewLine, FormatStrings.FormatPower(data.MaxPowerW, IsMetric, IsImperialBHP, IsImperialBTUpS));
196196
details.AppendFormat("MaxTE:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxTractiveForceN, IsMetric));
197+
details.AppendFormat("MaxContTE:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxContinuousTractiveForceN, IsMetric));
197198
details.AppendFormat("MaxDynBrk:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxDynamicBrakeForceN, IsMetric));
198199
if (!IsMetric && !IsUK)
199200
{
200-
details.AppendFormat("HPT:\t{1}{0}", Environment.NewLine, FormatHPT(data.MaxPowerW, data.MassKG));
201-
details.AppendFormat("TpOB:\t{1}{0}", Environment.NewLine, FormatTPOB(data.MassKG, data.NumOperativeBrakes));
202-
details.AppendFormat("TpEPA:\t{1}{0}", Environment.NewLine, FormatTonsPerEPA(data.MassKG, data.MaxTractiveForceN));
203-
details.AppendFormat("TpEDBA:\t{1}{0}", Environment.NewLine, FormatTonsPerEDBA(data.MassKG, data.MaxDynamicBrakeForceN));
201+
details.AppendFormat("HPT:\t{1}{0}", Environment.NewLine, FormatHPT(data.MaxPowerW, data.TrailingMassKG));
202+
details.AppendFormat("TpOB:\t{1}{0}", Environment.NewLine, FormatTPOB(data.TrailingMassKG, data.NumOperativeBrakes));
203+
details.AppendFormat("TpEPA:\t{1}{0}", Environment.NewLine, FormatTonsPerEPA(data.TrailingMassKG, data.MaxContinuousTractiveForceN));
204+
details.AppendFormat("TpEDBA:\t{1}{0}", Environment.NewLine, FormatTonsPerEDBA(data.TrailingMassKG, data.MaxDynamicBrakeForceN));
204205
}
206+
details.AppendFormat("MaxSpeed:\t{1}{0}", Environment.NewLine, FormatStrings.FormatSpeedLimit(data.MaxSpeedMps, IsMetric));
205207
details.AppendFormat("MinCouplerStrength:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MinCouplerStrengthN, IsMetric));
206208
details.AppendFormat("MinDerailForce:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MinDerailForceN, IsMetric));
207209
details.AppendLine();
@@ -216,7 +218,7 @@ public static string GetText(Content content)
216218
details.AppendFormat("Type:\t{1}{0}", Environment.NewLine, data.Type);
217219
details.AppendFormat("SubType:\t{1}{0}", Environment.NewLine, data.SubType);
218220
details.AppendFormat("Name:\t{1}{0}", Environment.NewLine, data.Name);
219-
details.AppendFormat("Weight:\t{1} ({2}){0}", Environment.NewLine, FormatStrings.FormatMass(data.MassKG, IsMetric), FormatStrings.FormatLargeMass(data.MassKG, IsMetric, IsUK));
221+
details.AppendFormat("Weight:\t{1} ({2}){0}", Environment.NewLine, FormatStrings.FormatMass(data.MassKG, IsMetric), FormatStrings.FormatLargeMass(data.MassKG, IsMetric, IsUK));
220222
details.AppendFormat("Length:\t{1}{0}", Environment.NewLine, FormatStrings.FormatShortDistanceDisplay(data.LengthM, IsMetric));
221223
if (data.Type != CarType.Engine)
222224
{
@@ -225,11 +227,13 @@ public static string GetText(Content content)
225227
else
226228
{
227229
details.AppendFormat("Axles:\t{1}+{2}{0}", Environment.NewLine, data.NumDriveAxles, data.NumAllAxles - data.NumDriveAxles);
228-
details.AppendFormat("MaxPowerW:\t{1}{0}", Environment.NewLine, FormatStrings.FormatPower(data.MaxPowerW, IsMetric, IsImperialBHP, IsImperialBTUpS));
229-
details.AppendFormat("MaxForce:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxForceN, IsMetric));
230-
details.AppendFormat("MaxSpeed:\t{1}{0}", Environment.NewLine, FormatStrings.FormatSpeedLimit(data.MaxSpeedMps, IsMetric));
230+
details.AppendFormat("MaxPower:\t{1}{0}", Environment.NewLine, FormatStrings.FormatPower(data.MaxPowerW, IsMetric, IsImperialBHP, IsImperialBTUpS));
231+
details.AppendFormat("MaxTE:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxForceN, IsMetric));
232+
details.AppendFormat("MaxContTE:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxContinuousForceN, IsMetric));
233+
details.AppendFormat("MaxDynBrk:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxDynamicBrakeForceN, IsMetric));
231234
}
232235
details.AppendFormat("MaxBrakeF:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxBrakeForceN, IsMetric));
236+
if (data.MaxSpeedMps > 0f) { details.AppendFormat("MaxSpeed:\t{1}{0}", Environment.NewLine, FormatStrings.FormatSpeedLimit(data.MaxSpeedMps, IsMetric)); }
233237
details.AppendFormat("MinCouplerStrength:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MinCouplerStrengthN, IsMetric));
234238
details.AppendFormat("MinDerailForce:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MinDerailForceN, IsMetric));
235239
details.AppendLine();

Diff for: Source/Contrib/ContentManager/Models/Car.cs

+4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public class Car
4848
public readonly float MaxBrakeForceN;
4949
public readonly float MaxPowerW;
5050
public readonly float MaxForceN;
51+
public readonly float MaxContinuousForceN;
52+
public readonly float MaxDynamicBrakeForceN;
5153
public readonly float MaxSpeedMps;
5254
public readonly float MinCouplerStrengthN;
5355
public readonly float MinDerailForceN;
@@ -76,6 +78,8 @@ public Car(Content content)
7678
Name = engFile.Name;
7779
MaxPowerW = engFile.MaxPowerW;
7880
MaxForceN = engFile.MaxForceN;
81+
MaxContinuousForceN = engFile.MaxContinuousForceN;
82+
MaxDynamicBrakeForceN = engFile.MaxDynamicBrakeForceN;
7983
MaxSpeedMps = engFile.MaxSpeedMps;
8084
Description = engFile.Description;
8185

Diff for: Source/Contrib/ContentManager/Models/Consist.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ public class Consist
3232
public readonly float LengthM = 0F;
3333
public readonly int NumAxles = 0;
3434
public readonly float MassKG = 0F;
35+
public readonly float TrailingMassKG = 0F;
3536
public readonly float MaxPowerW = 0F;
3637
public readonly float MaxTractiveForceN = 0F;
38+
public readonly float MaxContinuousTractiveForceN = 0F;
3739
public readonly float MaxDynamicBrakeForceN = 0F;
3840
public readonly float MaxBrakeForce = 0F;
3941
public readonly int NumOperativeBrakes = 0;
@@ -74,7 +76,6 @@ public Consist(Content content)
7476
MaxBrakeForce += wagonFile.MaxBrakeForceN;
7577
MinCouplerStrengthN = Math.Min(MinCouplerStrengthN, wagonFile.MinCouplerStrengthN);
7678
var subType = wagonFile.WagonType;
77-
if (wagonFile.MaxBrakeForceN > 0) { NumOperativeBrakes++; }
7879

7980
if (engFile != null)
8081
{
@@ -93,13 +94,20 @@ public Consist(Content content)
9394
EngCount++;
9495
MaxPowerW += engFile.MaxPowerW;
9596
MaxTractiveForceN += engFile.MaxForceN;
97+
MaxContinuousTractiveForceN += engFile.MaxContinuousForceN > 0f ? engFile.MaxContinuousForceN : engFile.MaxForceN;
9698
MaxDynamicBrakeForceN += engFile.MaxDynamicBrakeForceN;
9799
}
98100
else { WagCount++; }
99101
}
100102
else if (!wag.IsEOT && wagonFile.WagonSize.LengthM > 1.1) // exclude legacy EOT
101103
{
102104
WagCount++;
105+
TrailingMassKG += wagonFile.MassKG;
106+
if (wagonFile.MaxBrakeForceN > 0 && wagonFile.BrakeSystemType != null && !wagonFile.BrakeSystemType.Contains("manual_braking") &&
107+
!wagonFile.BrakeSystemType.Contains("air_piped") && !wagonFile.BrakeSystemType.Contains("vacuum_piped"))
108+
{
109+
NumOperativeBrakes++;
110+
}
103111
}
104112

105113
// see MSTSWagon.LoadFromWagFile()

Diff for: Source/Orts.Formats.Msts/EngineFile.cs

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class EngineFile
3131
public string EngineType;
3232
public float MaxPowerW;
3333
public float MaxForceN;
34+
public float MaxContinuousForceN;
3435
public float MaxDynamicBrakeForceN;
3536
public float MaxSpeedMps;
3637
public int NumDriveAxles; // ORTS
@@ -51,6 +52,7 @@ public EngineFile(string filePath)
5152
new STFReader.TokenProcessor("type", ()=>{ EngineType = stf.ReadStringBlock(null); }),
5253
new STFReader.TokenProcessor("maxpower", ()=>{ MaxPowerW = stf.ReadFloatBlock( STFReader.UNITS.Power, null); }),
5354
new STFReader.TokenProcessor("maxforce", ()=>{ MaxForceN = stf.ReadFloatBlock( STFReader.UNITS.Force, null); }),
55+
new STFReader.TokenProcessor("maxcontinuousforce", ()=>{ MaxContinuousForceN = stf.ReadFloatBlock( STFReader.UNITS.Force, null); }),
5456
new STFReader.TokenProcessor("dynamicbrakesmaximumforce", ()=>{ MaxDynamicBrakeForceN = stf.ReadFloatBlock( STFReader.UNITS.Force, null); }),
5557
new STFReader.TokenProcessor("maxvelocity", ()=>{ MaxSpeedMps = stf.ReadFloatBlock( STFReader.UNITS.Speed, null); }),
5658
new STFReader.TokenProcessor("ortsnumberdriveaxles", ()=>{ NumDriveAxles = stf.ReadIntBlock(null); }),

Diff for: Source/Orts.Formats.Msts/WagonFile.cs

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public class WagonFile
3434
public CarSize WagonSize;
3535
public int NumWagAxles; // ORTS
3636
public float NumWagWheels; // MSTS
37+
public string BrakeSystemType;
38+
public string BrakeEquipmentType;
3739
public float MaxBrakeForceN;
3840
public float MinCouplerStrengthN = ImpossiblyHighForceN;
3941

@@ -111,6 +113,8 @@ public WagonFile(string filePath)
111113
new STFReader.TokenProcessor("size", ()=>{ WagonSize = new CarSize( stf); }),
112114
new STFReader.TokenProcessor("ortsnumberaxles", ()=>{ NumWagAxles = stf.ReadIntBlock(null); }),
113115
new STFReader.TokenProcessor("numwheels", ()=>{ NumWagWheels = stf.ReadFloatBlock( STFReader.UNITS.None, null); }),
116+
new STFReader.TokenProcessor("brakesystemtype", ()=>{ BrakeSystemType = stf.ReadStringBlock(null).ToLower(); }),
117+
new STFReader.TokenProcessor("brakeequipmenttype", ()=>{ BrakeEquipmentType = stf.ReadStringBlock(null).ToLower(); }),
114118
new STFReader.TokenProcessor("maxbrakeforce", ()=>{ MaxBrakeForceN = stf.ReadFloatBlock(STFReader.UNITS.Force, null); }),
115119
new STFReader.TokenProcessor("coupling", ()=>{ new CouplingSpring( ref MinCouplerStrengthN, stf); })
116120
});

Diff for: Source/RunActivity/Viewer3D/Popups/HelpWindow.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
using SharpFont;
3838
using static Orts.Viewer3D.WebServices.TrainCarOperationsWebpage.OperationsSend;
3939
using SharpDX.Direct3D9;
40+
using Orts.Simulation.RollingStocks.SubSystems.Brakes.MSTS;
4041

4142
namespace Orts.Viewer3D.Popups
4243
{
@@ -1209,7 +1210,7 @@ private void AddAggregatedTrainInfo(Train playerTrain, ControlLayout scrollbox,
12091210
float engMaxContTractiveForceN = 0f; float engMaxDynBrakeForceN = 0f; string forceSeparator = ""; // when set, indicates that subsequent engines are in a separate block
12101211

12111212
float wagMassKg = 0f; string massSeparator = ""; // when set, indicates that subsequent engines are in a separate block
1212-
int numOperativeBrakes = 0;
1213+
float trailingMassKg = 0f; int numOperativeBrakes = 0;
12131214
bool isMetric = false; bool isUK = false; // isImperial* does not seem to be used in simulation
12141215

12151216
if (TrainInfoSpriteSheet == null) { TrainInfoSpriteSheet = SharedTextureManager.Get(Owner.Viewer.RenderProcess.GraphicsDevice, Path.Combine(Owner.Viewer.ContentPath, "TrainInfoSprites.png")); }
@@ -1250,6 +1251,8 @@ private void AddAggregatedTrainInfo(Train playerTrain, ControlLayout scrollbox,
12501251
numCars++;
12511252
numAxles += wag.GetWagonNumAxles();
12521253
wagMassKg += wag.MassKG;
1254+
trailingMassKg += wag.MassKG;
1255+
if (wag.MaxBrakeForceN > 0 && car.BrakeSystem != null && !(car.BrakeSystem is SingleTransferPipe) && !(car.BrakeSystem is ManualBraking)) { numOperativeBrakes++; }
12531256

12541257
// handle transition from engines to wagons
12551258
if (engCount > 0 || (engCount == 0 && numCars == 0))
@@ -1270,7 +1273,6 @@ private void AddAggregatedTrainInfo(Train playerTrain, ControlLayout scrollbox,
12701273
if (couplerStrength < lowestCouplerStrengthN) { lowestCouplerStrengthN = couplerStrength; }
12711274
var derailForce = GetDerailForce(wag);
12721275
if (derailForce < lowestDerailForceN) { lowestDerailForceN = derailForce; }
1273-
if (wag.MaxBrakeForceN > 0) { numOperativeBrakes++; } // simplistic: real world has cutout brakes, and no brakes on some articulated car-segments
12741276

12751277
carInfoList.Add(new CarInfo(wag.MassKG, isEng));
12761278
}
@@ -1328,7 +1330,7 @@ private void AddAggregatedTrainInfo(Train playerTrain, ControlLayout scrollbox,
13281330
line.Add(new Label(labelWidth, line.RemainingHeight, Viewer.Catalog.GetString("Horespower per Ton:"), LabelAlignment.Left));
13291331
line.Add(new Label(line.RemainingWidth, line.RemainingHeight, string.Format("{0:0.0}", hpt), LabelAlignment.Left));
13301332

1331-
float tpob = numOperativeBrakes > 0 ? Kg.ToTUS(totMassKg) / numOperativeBrakes : 0;
1333+
float tpob = numOperativeBrakes > 0 ? Kg.ToTUS(trailingMassKg) / numOperativeBrakes : 0;
13321334
line = scrollbox.AddLayoutHorizontalLineOfText();
13331335
line.Add(new Label(labelWidth, line.RemainingHeight, Viewer.Catalog.GetString("Tons per Operative Brake:"), LabelAlignment.Left));
13341336
line.Add(new Label(line.RemainingWidth, line.RemainingHeight, string.Format("{0:0}", tpob), LabelAlignment.Left));

0 commit comments

Comments
 (0)