Skip to content

Commit 35a890e

Browse files
committed
Add lowest coupler strength to consist (and car).
1 parent 4025666 commit 35a890e

File tree

4 files changed

+55
-6
lines changed

4 files changed

+55
-6
lines changed

Source/Contrib/ContentManager/ContentInfo.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ public static string GetText(Content content)
193193
details.AppendFormat("Length:\t{1}{0}", Environment.NewLine, FormatStrings.FormatShortDistanceDisplay(data.LengthM, IsMetric));
194194
details.AppendFormat("Power:\t{1}{0}", Environment.NewLine, FormatStrings.FormatPower(data.MaxPowerW, IsMetric, IsImperialBHP, IsImperialBTUpS));
195195
details.AppendFormat("MaxTE:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxTractiveForceN, IsMetric));
196+
details.AppendFormat("MinCouplerStrength:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MinCouplerStrengthN, IsMetric));
196197
if (!IsMetric && !IsUK) { details.AppendFormat("HPT:\t{1}{0}", Environment.NewLine, FormatHPT(data.MaxPowerW, data.MassKG)); }
197198
if (!IsMetric && !IsUK) { details.AppendFormat("TPOB:\t{1}{0}", Environment.NewLine, FormatTPOB(data.MassKG, data.NumOperativeBrakes)); }
198199
details.AppendLine();
@@ -216,6 +217,7 @@ public static string GetText(Content content)
216217
details.AppendFormat("MaxSpeed:\t{1}{0}", Environment.NewLine, FormatStrings.FormatSpeedLimit(data.MaxSpeedMps, IsMetric));
217218
}
218219
details.AppendFormat("MaxBrakeF:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxBarkeForceN, IsMetric));
220+
details.AppendFormat("MinCouplerStrength:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MinCouplerStrengthN, IsMetric));
219221
details.AppendLine();
220222
details.AppendFormat("Description:\t{0}{0}{1}{0}{0}", Environment.NewLine, data.Description);
221223
}

Source/Contrib/ContentManager/Models/Car.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class Car
4242
public readonly float MaxPowerW;
4343
public readonly float MaxForceN;
4444
public readonly float MaxSpeedMps;
45+
public readonly float MinCouplerStrengthN;
4546

4647
public Car(Content content)
4748
{
@@ -55,6 +56,7 @@ public Car(Content content)
5556
MassKG = wagFile.MassKG;
5657
LengthM = wagFile.WagonSize.LengthM;
5758
MaxBarkeForceN = wagFile.MaxBrakeForceN;
59+
MinCouplerStrengthN = wagFile.MinCouplerStrengthN;
5860

5961
if (System.IO.Path.GetExtension(content.PathName).Equals(".eng", StringComparison.OrdinalIgnoreCase))
6062
{

Source/Contrib/ContentManager/Models/Consist.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class Consist
3838
public readonly float MaxTractiveForceN = 0F;
3939
public readonly float MaxBrakeForce = 0F;
4040
public readonly int NumOperativeBrakes = 0;
41+
public readonly float MinCouplerStrengthN = 9.999e8f; // impossible high force
4142

4243
public readonly IEnumerable<Car> Cars;
4344

@@ -71,6 +72,7 @@ public Consist(Content content)
7172
MassKG += wagonFile.MassKG;
7273
wagonMassKG = wagonFile.MassKG;
7374
MaxBrakeForce += wagonFile.MaxBrakeForceN;
75+
MinCouplerStrengthN = Math.Min(MinCouplerStrengthN, wagonFile.MinCouplerStrengthN);
7476
if (wagonFile.MaxBrakeForceN > 0) { NumOperativeBrakes++; }
7577

7678
if (wag.IsEngine && engFile.MaxForceN > 25000) // exclude legacy driving trailers / cab-cars

Source/Orts.Formats.Msts/WagonFile.cs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
1717

1818
using System;
19-
using System.Collections;
2019
using System.IO;
2120
using Orts.Parsers.Msts;
2221

@@ -27,6 +26,15 @@ namespace Orts.Formats.Msts
2726
/// </summary>
2827
public class WagonFile
2928
{
29+
public const float ImpossiblyHighForceN = 9.999e8f;
30+
31+
public string Name;
32+
public string WagonType;
33+
public float MassKG;
34+
public CarSize WagonSize;
35+
public float MaxBrakeForceN;
36+
public float MinCouplerStrengthN = ImpossiblyHighForceN;
37+
3038
public class CarSize
3139
{
3240
public float WidthM;
@@ -48,16 +56,49 @@ public override string ToString()
4856
}
4957
}
5058

51-
public string Name;
52-
public string WagonType;
53-
public float MassKG;
54-
public CarSize WagonSize;
55-
public float MaxBrakeForceN;
59+
public class CouplingSpring
60+
{
61+
public CouplingSpring(ref float minCouplerStrength, STFReader stf)
62+
{
63+
float breakVal = ImpossiblyHighForceN;
64+
float ortsBreakVal = ImpossiblyHighForceN;
65+
66+
stf.MustMatch("(");
67+
stf.ParseBlock(new STFReader.TokenProcessor[] {
68+
new STFReader.TokenProcessor("spring", () =>
69+
{
70+
stf.MustMatch("(");
71+
stf.ParseBlock(new STFReader.TokenProcessor[] {
72+
new STFReader.TokenProcessor("ortsbreak", ()=>
73+
{
74+
stf.MustMatch("(");
75+
float val = stf.ReadFloat(STFReader.UNITS.Force, null);
76+
if (val > 9.9) ortsBreakVal = Math.Min(val, ortsBreakVal);
77+
val = stf.ReadFloat(STFReader.UNITS.Force, null);
78+
if (val > 9.9) ortsBreakVal = Math.Min(val, ortsBreakVal);
79+
stf.SkipRestOfBlock();
80+
}),
81+
new STFReader.TokenProcessor("break", () =>
82+
{
83+
stf.MustMatch("(");
84+
float val = stf.ReadFloat(STFReader.UNITS.Force, null);
85+
if (val > 9.9) breakVal = Math.Min(val, breakVal);
86+
val = stf.ReadFloat(STFReader.UNITS.Force, null);
87+
if (val > 9.9) breakVal = Math.Min(val, breakVal);
88+
stf.SkipRestOfBlock();
89+
})
90+
});
91+
})
92+
});
93+
minCouplerStrength = Math.Min(minCouplerStrength, ortsBreakVal < ImpossiblyHighForceN ? ortsBreakVal : breakVal);
94+
}
95+
}
5696

5797
public WagonFile(string filePath)
5898
{
5999
Name = Path.GetFileNameWithoutExtension(filePath);
60100
using (var stf = new STFReader(filePath, false))
101+
{
61102
stf.ParseFile(new STFReader.TokenProcessor[] {
62103
new STFReader.TokenProcessor("wagon", ()=>{
63104
stf.ReadString();
@@ -67,9 +108,11 @@ public WagonFile(string filePath)
67108
new STFReader.TokenProcessor("mass", ()=>{ MassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); }),
68109
new STFReader.TokenProcessor("size", ()=>{ WagonSize = new CarSize( stf); }),
69110
new STFReader.TokenProcessor("maxbrakeforce", ()=>{ MaxBrakeForceN = stf.ReadFloatBlock(STFReader.UNITS.Force, null); }),
111+
new STFReader.TokenProcessor("coupling", ()=>{ new CouplingSpring( ref MinCouplerStrengthN, stf); })
70112
});
71113
}),
72114
});
115+
}
73116
}
74117

75118
public override string ToString()

0 commit comments

Comments
 (0)