Skip to content

Commit 35839a7

Browse files
committed
Fix calculation of axles for mic of ORTS Axles and MSTS Wheels.
1 parent 792d23a commit 35839a7

File tree

4 files changed

+38
-23
lines changed

4 files changed

+38
-23
lines changed

Source/Contrib/ContentManager/Models/Car.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public Car(Content content)
5757

5858
const float GravitationalAccelerationMpS2 = 9.80665f;
5959

60+
int ortsEngAxles = -1; // not present
61+
6062
// .eng files also have a wagon block
6163
var wagFile = new WagonFile(content.PathName);
6264
Type = CarType.Wagon;
@@ -77,15 +79,18 @@ public Car(Content content)
7779
MaxForceN = engFile.MaxForceN;
7880
MaxSpeedMps = engFile.MaxSpeedMps;
7981
Description = engFile.Description;
82+
8083
// see MSTSLocomotive.Initialize()
81-
if (engFile.NumDriveAxles > 0) { NumDriveAxles = engFile.NumDriveAxles; }
84+
ortsEngAxles = engFile.NumDriveAxles;
85+
if (ortsEngAxles >= 0) { NumDriveAxles = ortsEngAxles; }
8286
else if (engFile.NumEngWheels >= 7f) { NumDriveAxles = (int)(engFile.NumEngWheels / 2f); }
8387
else if (engFile.NumEngWheels > 0f) { NumDriveAxles = (int)engFile.NumEngWheels; }
8488
else { NumDriveAxles = 4; }
8589
}
8690

8791
// see MSTSWagon.LoadFromWagFile()
88-
if (wagFile.NumWagAxles > 0) { NumAllAxles = wagFile.NumWagAxles + NumDriveAxles; }
92+
if (ortsEngAxles >= 0 && wagFile.NumWagAxles >= 0) { NumAllAxles = ortsEngAxles + wagFile.NumWagAxles; }
93+
else if (wagFile.NumWagAxles >= 0) { NumAllAxles = wagFile.NumWagAxles; }
8994
else if (wagFile.NumWagWheels >= 7f) { NumAllAxles = (int)(wagFile.NumWagWheels / 2f); }
9095
else if (wagFile.NumWagWheels > 0f) { NumAllAxles = (int)wagFile.NumWagWheels; }
9196
else { NumAllAxles = 4; }

Source/Contrib/ContentManager/Models/Consist.cs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public Consist(Content content)
5959
var CarList = new List<Car>();
6060
foreach (Wagon wag in file.Train.TrainCfg.WagonList)
6161
{
62-
float wagonMassKG = 0; int numEngAxlesOrts = 0;
62+
float wagonMassKG = 0; int ortsEngAxles = -1; int numDriveAxles = 0; int numAllAxles = 0;
6363
try
6464
{
6565
var fileType = wag.IsEngine ? ".eng" : ".wag";
@@ -74,36 +74,46 @@ public Consist(Content content)
7474
MinCouplerStrengthN = Math.Min(MinCouplerStrengthN, wagonFile.MinCouplerStrengthN);
7575
if (wagonFile.MaxBrakeForceN > 0) { NumOperativeBrakes++; }
7676

77-
if (wag.IsEngine && engFile.MaxForceN > 25000) // exclude legacy driving trailers / cab-cars
77+
if (wag.IsEngine)
7878
{
79-
EngCount++;
80-
MaxPowerW += engFile.MaxPowerW;
81-
MaxTractiveForceN += engFile.MaxForceN;
82-
numEngAxlesOrts = engFile.NumDriveAxles;
79+
// see MSTSLocomotive.Initialize()
80+
ortsEngAxles = engFile.NumDriveAxles;
81+
if (ortsEngAxles >= 0) { numDriveAxles = ortsEngAxles; }
82+
else if (engFile.NumEngWheels > 7f) { numDriveAxles = (int)(engFile.NumEngWheels / 2f); }
83+
else if (engFile.NumEngWheels > 0) { numDriveAxles = (int)engFile.NumEngWheels; }
84+
else { numDriveAxles = 4; }
85+
86+
if (engFile.MaxForceN > 25000) // exclude legacy driving trailers / cab-cars
87+
{
88+
EngCount++;
89+
MaxPowerW += engFile.MaxPowerW;
90+
MaxTractiveForceN += engFile.MaxForceN;
91+
}
92+
else { WagCount++; }
8393
}
8494
else if (!wag.IsEOT && wagonFile.WagonSize.LengthM > 1.1) // exclude legacy EOT
8595
{
8696
WagCount++;
8797
}
8898

89-
int totAxles = 0;
9099
// see MSTSWagon.LoadFromWagFile()
91-
if (numEngAxlesOrts > 0) { totAxles = numEngAxlesOrts + wagonFile.NumWagAxles; }
92-
else if (wagonFile.NumWagAxles > 0) { totAxles = wagonFile.NumWagAxles; }
93-
else if (wagonFile.NumWagWheels >= 7f) { totAxles = (int)(wagonFile.NumWagWheels / 2f); }
94-
else if (wagonFile.NumWagWheels >= 0f) { totAxles = (int)wagonFile.NumWagWheels; }
95-
else { totAxles = 4; }
100+
if (ortsEngAxles >= 0 && wagonFile.NumWagAxles >= 0) { numAllAxles = ortsEngAxles + wagonFile.NumWagAxles; }
101+
else if (wagonFile.NumWagAxles >= 0) { numAllAxles = wagonFile.NumWagAxles; }
102+
else if (wagonFile.NumWagWheels >= 7f) { numAllAxles = (int)(wagonFile.NumWagWheels / 2f); }
103+
else if (wagonFile.NumWagWheels >= 0f) { numAllAxles = (int)wagonFile.NumWagWheels; }
104+
else { numAllAxles = 4; }
105+
if (numDriveAxles > numAllAxles) { numAllAxles = numDriveAxles; }
96106

97107
// exclude legacy EOT from total axle count
98108
if (!wag.IsEOT && wagonFile.WagonSize.LengthM > 1.1)
99109
{
100-
NumAxles += totAxles;
110+
NumAxles += numAllAxles;
101111
}
102112

103-
if (totAxles > 0 && wagonFile.MassKG > 1000)
113+
if (numAllAxles > 0 && wagonFile.MassKG > 1000)
104114
{
105115
const float GravitationalAccelerationMpS2 = 9.80665f;
106-
var derailForce = wagonFile.MassKG / totAxles / 2f * GravitationalAccelerationMpS2;
116+
var derailForce = wagonFile.MassKG / numAllAxles / 2f * GravitationalAccelerationMpS2;
107117
if (derailForce > 1000f) { MinDerailForceN = Math.Min(MinDerailForceN, derailForce); }
108118
}
109119
}

Source/Orts.Formats.Msts/EngineFile.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class EngineFile
3232
public float MaxPowerW;
3333
public float MaxForceN;
3434
public float MaxSpeedMps;
35-
public int NumDriveAxles; // ORTS
35+
public int NumDriveAxles = -1; // ORTS; -1 indicates absent
3636
public float NumEngWheels; // MSTS
3737
public string Description;
3838
public string CabViewFile;
@@ -51,8 +51,8 @@ public EngineFile(string filePath)
5151
new STFReader.TokenProcessor("maxpower", ()=>{ MaxPowerW = stf.ReadFloatBlock( STFReader.UNITS.Power, null); }),
5252
new STFReader.TokenProcessor("maxforce", ()=>{ MaxForceN = stf.ReadFloatBlock( STFReader.UNITS.Force, null); }),
5353
new STFReader.TokenProcessor("maxvelocity", ()=>{ MaxSpeedMps = stf.ReadFloatBlock( STFReader.UNITS.Speed, null); }),
54-
new STFReader.TokenProcessor("ortsnumberdriveaxles", ()=>{ NumDriveAxles = stf.ReadIntBlock( 0); }),
55-
new STFReader.TokenProcessor("numwheels", ()=>{ NumEngWheels = stf.ReadFloatBlock( STFReader.UNITS.None, 0f); }),
54+
new STFReader.TokenProcessor("ortsnumberdriveaxles", ()=>{ NumDriveAxles = stf.ReadIntBlock(null); }),
55+
new STFReader.TokenProcessor("numwheels", ()=>{ NumEngWheels = stf.ReadFloatBlock( STFReader.UNITS.None, null); }),
5656
new STFReader.TokenProcessor("description", ()=>{ Description = stf.ReadStringBlock(null); }),
5757
new STFReader.TokenProcessor("cabview", ()=>{ CabViewFile = stf.ReadStringBlock(null); }),
5858
});

Source/Orts.Formats.Msts/WagonFile.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class WagonFile
3232
public string WagonType;
3333
public float MassKG;
3434
public CarSize WagonSize;
35-
public int NumWagAxles; // ORTS
35+
public int NumWagAxles = -1; // ORTS; -1 indicates absent
3636
public float NumWagWheels; // MSTS
3737
public float MaxBrakeForceN;
3838
public float MinCouplerStrengthN = ImpossiblyHighForceN;
@@ -109,8 +109,8 @@ public WagonFile(string filePath)
109109
new STFReader.TokenProcessor("type", ()=>{ WagonType = stf.ReadStringBlock(null); }),
110110
new STFReader.TokenProcessor("mass", ()=>{ MassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); }),
111111
new STFReader.TokenProcessor("size", ()=>{ WagonSize = new CarSize( stf); }),
112-
new STFReader.TokenProcessor("ortsnumberaxles", ()=>{ NumWagAxles = stf.ReadIntBlock( 0); }),
113-
new STFReader.TokenProcessor("numwheels", ()=>{ NumWagWheels = stf.ReadFloatBlock( STFReader.UNITS.None, 0f); }),
112+
new STFReader.TokenProcessor("ortsnumberaxles", ()=>{ NumWagAxles = stf.ReadIntBlock(null); }),
113+
new STFReader.TokenProcessor("numwheels", ()=>{ NumWagWheels = stf.ReadFloatBlock( STFReader.UNITS.None, null); }),
114114
new STFReader.TokenProcessor("maxbrakeforce", ()=>{ MaxBrakeForceN = stf.ReadFloatBlock(STFReader.UNITS.Force, null); }),
115115
new STFReader.TokenProcessor("coupling", ()=>{ new CouplingSpring( ref MinCouplerStrengthN, stf); })
116116
});

0 commit comments

Comments
 (0)