1616// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
1717
1818using System ;
19- using System . Collections ;
2019using System . IO ;
2120using 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