16
16
// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
17
17
18
18
using System ;
19
- using System . Collections ;
20
19
using System . IO ;
21
20
using Orts . Parsers . Msts ;
22
21
@@ -27,6 +26,15 @@ namespace Orts.Formats.Msts
27
26
/// </summary>
28
27
public class WagonFile
29
28
{
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
+
30
38
public class CarSize
31
39
{
32
40
public float WidthM ;
@@ -48,16 +56,49 @@ public override string ToString()
48
56
}
49
57
}
50
58
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
+ }
56
96
57
97
public WagonFile ( string filePath )
58
98
{
59
99
Name = Path . GetFileNameWithoutExtension ( filePath ) ;
60
100
using ( var stf = new STFReader ( filePath , false ) )
101
+ {
61
102
stf . ParseFile ( new STFReader . TokenProcessor [ ] {
62
103
new STFReader . TokenProcessor ( "wagon" , ( ) => {
63
104
stf . ReadString ( ) ;
@@ -67,9 +108,11 @@ public WagonFile(string filePath)
67
108
new STFReader . TokenProcessor ( "mass" , ( ) => { MassKG = stf . ReadFloatBlock ( STFReader . UNITS . Mass , null ) ; } ) ,
68
109
new STFReader . TokenProcessor ( "size" , ( ) => { WagonSize = new CarSize ( stf ) ; } ) ,
69
110
new STFReader . TokenProcessor ( "maxbrakeforce" , ( ) => { MaxBrakeForceN = stf . ReadFloatBlock ( STFReader . UNITS . Force , null ) ; } ) ,
111
+ new STFReader . TokenProcessor ( "coupling" , ( ) => { new CouplingSpring ( ref MinCouplerStrengthN , stf ) ; } )
70
112
} ) ;
71
113
} ) ,
72
114
} ) ;
115
+ }
73
116
}
74
117
75
118
public override string ToString ( )
0 commit comments