Skip to content

Commit 17c8d18

Browse files
committed
Made Axle Count corrections suggested in the PR review.
The axle count now reflects what the simulation is actually using. The code is the same as in the simulation classes MSTSWagon and MSTSLocomotive. There is a special condition for Steam engines that is not practical to correctly reproduce (WheelAxles array). Thus the count may be off for some steam engines. It matches the sim for the Flying Scottsman, but not for the Gölsdorf 380. I don't have other steam engines to test.
1 parent 382ea6d commit 17c8d18

File tree

5 files changed

+52
-28
lines changed

5 files changed

+52
-28
lines changed

Source/Contrib/ContentManager/Models/Car.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class Car
4343
public readonly float MassKG;
4444
public readonly float LengthM;
4545
public readonly int NumDriveAxles;
46+
public readonly int NumIdleAxles;
4647
public readonly int NumAllAxles;
4748
public readonly float MaxBrakeForceN;
4849
public readonly float MaxPowerW;
@@ -57,8 +58,6 @@ public Car(Content content)
5758

5859
const float GravitationalAccelerationMpS2 = 9.80665f;
5960

60-
int ortsEngAxles = -1; // not present
61-
6261
// .eng files also have a wagon block
6362
var wagFile = new WagonFile(content.PathName);
6463
Type = CarType.Wagon;
@@ -81,20 +80,27 @@ public Car(Content content)
8180
Description = engFile.Description;
8281

8382
// see MSTSLocomotive.Initialize()
84-
ortsEngAxles = engFile.NumDriveAxles;
85-
if (ortsEngAxles >= 0) { NumDriveAxles = ortsEngAxles; }
86-
else if (engFile.NumEngWheels >= 7f) { NumDriveAxles = (int)(engFile.NumEngWheels / 2f); }
87-
else if (engFile.NumEngWheels > 0f) { NumDriveAxles = (int)engFile.NumEngWheels; }
88-
else { NumDriveAxles = 4; }
83+
NumDriveAxles = engFile.NumDriveAxles;
84+
if (NumDriveAxles == 0)
85+
{
86+
if (engFile.NumEngWheels != 0 && engFile.NumEngWheels < 7) { NumDriveAxles = (int)engFile.NumEngWheels; }
87+
else { NumDriveAxles = 4; }
88+
}
8989
}
9090

9191
// see MSTSWagon.LoadFromWagFile()
92-
if (ortsEngAxles >= 0 && wagFile.NumWagAxles >= 0) { NumAllAxles = ortsEngAxles + wagFile.NumWagAxles; }
93-
else if (wagFile.NumWagAxles >= 0) { NumAllAxles = wagFile.NumWagAxles; }
94-
else if (wagFile.NumWagWheels >= 7f) { NumAllAxles = (int)(wagFile.NumWagWheels / 2f); }
95-
else if (wagFile.NumWagWheels > 0f) { NumAllAxles = (int)wagFile.NumWagWheels; }
96-
else { NumAllAxles = 4; }
97-
if (NumDriveAxles > NumAllAxles) { NumAllAxles = NumDriveAxles; }
92+
NumIdleAxles = wagFile.NumWagAxles;
93+
if ((NumIdleAxles == 0) && Type != CarType.Engine)
94+
{
95+
if (wagFile.NumWagWheels != 0 && wagFile.NumWagWheels < 6) { NumIdleAxles = (int)wagFile.NumWagWheels; }
96+
else { NumIdleAxles = 4; }
97+
}
98+
99+
// correction for steam engines; see TrainCar.Update()
100+
// this is not always correct as TrainCar uses the WheelAxles array for the count; that is too complex to do here
101+
if (SubType.Equals("Steam") && NumDriveAxles >= (NumDriveAxles + NumIdleAxles)) { NumDriveAxles /= 2; }
102+
103+
NumAllAxles = NumDriveAxles + NumIdleAxles;
98104

99105
// see TrainCar.UpdateTrainDerailmentRisk()
100106
var numWheels = NumAllAxles * 2;

Source/Contrib/ContentManager/Models/Consist.cs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public Consist(Content content)
6060
var CarList = new List<Car>();
6161
foreach (Wagon wag in file.Train.TrainCfg.WagonList)
6262
{
63-
float wagonMassKG = 0; int ortsEngAxles = -1; int numDriveAxles = 0; int numAllAxles = 0;
63+
float wagonMassKG = 0; int numDriveAxles = 0; int numIdleAxles = 0; int numAllAxles = 0;
6464
try
6565
{
6666
var fileType = wag.IsEngine ? ".eng" : ".wag";
@@ -73,16 +73,20 @@ public Consist(Content content)
7373
wagonMassKG = wagonFile.MassKG;
7474
MaxBrakeForce += wagonFile.MaxBrakeForceN;
7575
MinCouplerStrengthN = Math.Min(MinCouplerStrengthN, wagonFile.MinCouplerStrengthN);
76+
var subType = wagonFile.WagonType;
7677
if (wagonFile.MaxBrakeForceN > 0) { NumOperativeBrakes++; }
7778

78-
if (wag.IsEngine)
79+
if (engFile != null)
7980
{
81+
subType = engFile.EngineType;
82+
8083
// see MSTSLocomotive.Initialize()
81-
ortsEngAxles = engFile.NumDriveAxles;
82-
if (ortsEngAxles >= 0) { numDriveAxles = ortsEngAxles; }
83-
else if (engFile.NumEngWheels > 7f) { numDriveAxles = (int)(engFile.NumEngWheels / 2f); }
84-
else if (engFile.NumEngWheels > 0) { numDriveAxles = (int)engFile.NumEngWheels; }
85-
else { numDriveAxles = 4; }
84+
numDriveAxles = engFile.NumDriveAxles;
85+
if (numDriveAxles == 0)
86+
{
87+
if (engFile.NumEngWheels != 0 && engFile.NumEngWheels < 7) { numDriveAxles = (int)engFile.NumEngWheels; }
88+
else { numDriveAxles = 4; }
89+
}
8690

8791
if (engFile.MaxForceN > 25000) // exclude legacy driving trailers / cab-cars
8892
{
@@ -99,12 +103,18 @@ public Consist(Content content)
99103
}
100104

101105
// see MSTSWagon.LoadFromWagFile()
102-
if (ortsEngAxles >= 0 && wagonFile.NumWagAxles >= 0) { numAllAxles = ortsEngAxles + wagonFile.NumWagAxles; }
103-
else if (wagonFile.NumWagAxles >= 0) { numAllAxles = wagonFile.NumWagAxles; }
104-
else if (wagonFile.NumWagWheels >= 7f) { numAllAxles = (int)(wagonFile.NumWagWheels / 2f); }
105-
else if (wagonFile.NumWagWheels >= 0f) { numAllAxles = (int)wagonFile.NumWagWheels; }
106-
else { numAllAxles = 4; }
107-
if (numDriveAxles > numAllAxles) { numAllAxles = numDriveAxles; }
106+
numIdleAxles = wagonFile.NumWagAxles;
107+
if (numIdleAxles == 0 && !wag.IsEngine)
108+
{
109+
if (wagonFile.NumWagWheels != 0 && wagonFile.NumWagWheels < 6) { numIdleAxles = (int)wagonFile.NumWagWheels; }
110+
else { numIdleAxles = 4; }
111+
}
112+
113+
// correction for steam engines; see TrainCar.Update()
114+
// this is not always correct as TrainCar uses the WheelAxles array for the count; that is too complex to do here
115+
if (subType.Equals("Steam") && numDriveAxles >= (numDriveAxles + numIdleAxles)) { numDriveAxles /= 2; }
116+
117+
numAllAxles = numDriveAxles + numIdleAxles;
108118

109119
// exclude legacy EOT from total axle count
110120
if (!wag.IsEOT && wagonFile.WagonSize.LengthM > 1.1)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"profiles": {
3+
"SettingsExporter": {
4+
"commandName": "Project",
5+
"commandLineArgs": "REG INI"
6+
}
7+
}
8+
}

Source/Orts.Formats.Msts/EngineFile.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class EngineFile
3333
public float MaxForceN;
3434
public float MaxDynamicBrakeForceN;
3535
public float MaxSpeedMps;
36-
public int NumDriveAxles = -1; // ORTS; -1 indicates absent
36+
public int NumDriveAxles; // ORTS
3737
public float NumEngWheels; // MSTS
3838
public string Description;
3939
public string CabViewFile;

Source/Orts.Formats.Msts/WagonFile.cs

Lines changed: 1 addition & 1 deletion
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 = -1; // ORTS; -1 indicates absent
35+
public int NumWagAxles; // ORTS
3636
public float NumWagWheels; // MSTS
3737
public float MaxBrakeForceN;
3838
public float MinCouplerStrengthN = ImpossiblyHighForceN;

0 commit comments

Comments
 (0)