@@ -673,8 +673,9 @@ public virtual void LoadFromWagFile(string wagFilePath)
673673 CentreOfGravityM = InitialCentreOfGravityM ;
674674
675675 // Initialize the switchable brake system
676- if ( BrakeModeNames ? . Length > 0 ) // If the filter is set, enforce it
676+ if ( BrakeModeNames ? . Length > 0 )
677677 {
678+ // If the filter is set, enforce it
678679 foreach ( var key in BrakeSystems . Keys . ToArray ( ) )
679680 if ( ! BrakeModeNames . Contains ( key . BrakeMode . ToString ( ) ) )
680681 BrakeSystems . Remove ( key ) ;
@@ -1055,68 +1056,77 @@ public void SetBrakeSystemMode(BrakeModes mode, float massKg, bool forceSwitch =
10551056
10561057 if ( BrakeSystems ? . Count > 0 )
10571058 {
1059+ // 1) First get the values from the zero load stage / base stage
1060+ if ( mode != BrakeSystem . BrakeMode && BrakeSystems . TryGetValue ( ( mode , 0 ) , out var brakeSystem ) )
1061+ {
1062+ HandleIncompatibleBrakesystems ( brakeSystem ) ;
1063+ BrakeSystem . InitializeFromCopy ( brakeSystem , true ) ;
1064+ }
1065+
1066+ // 2) Then try to auto-switch to / get values from the appropriate load stage
10581067 var max = 0f ;
10591068 foreach ( var key in BrakeSystems . Keys )
10601069 if ( key . BrakeMode == mode && key . MinMass <= massKg )
10611070 max = Math . Max ( max , key . MinMass ) ;
1062-
1063- if ( BrakeSystems . TryGetValue ( ( mode , max ) , out var brakeSystem ) )
1071+ if ( ( BrakeSystem . BrakeMode , BrakeSystem . LoadStageMinMassKg ) != ( mode , max ) && BrakeSystems . TryGetValue ( ( mode , max ) , out brakeSystem ) )
10641072 {
1065- if ( brakeSystem is VacuumSinglePipe ^ BrakeSystem is VacuumSinglePipe )
1066- {
1067- if ( BrakeSystemAlt == null )
1068- {
1069- BrakeSystemAlt = BrakeSystem . CreateNewLike ( brakeSystem , this ) . InitializeDefault ( ) ;
1070-
1071- // Leave the car in a working state. However the train should reinitialize the car with correct values when all the switchings were finished.
1072- ( var maxPressurePSI , var fullServPressurePSI ) = brakeSystem . GetDefaultPressures ( ) ;
1073- var handbrakeOn = BrakeSystem . GetHandbrakeStatus ( ) ;
1074- var immediateRelease = BrakeSystem . GetCylPressurePSI ( ) == 0 ;
1075- BrakeSystemAlt . Initialize ( handbrakeOn , maxPressurePSI , fullServPressurePSI , immediateRelease ) ;
1076- }
1077- BrakeSystemAlt . FrontBrakeHoseConnected = BrakeSystem . FrontBrakeHoseConnected ;
1078- BrakeSystemAlt . RearBrakeHoseConnected = BrakeSystem . RearBrakeHoseConnected ;
1079- BrakeSystemAlt . AngleCockAOpen = BrakeSystem . AngleCockAOpen ;
1080- BrakeSystemAlt . AngleCockAOpenAmount = BrakeSystem . AngleCockAOpenAmount ;
1081- BrakeSystemAlt . AngleCockAOpenTime = BrakeSystem . AngleCockAOpenTime ;
1082- BrakeSystemAlt . AngleCockBOpen = BrakeSystem . AngleCockBOpen ;
1083- BrakeSystemAlt . AngleCockBOpenAmount = BrakeSystem . AngleCockBOpenAmount ;
1084- BrakeSystemAlt . AngleCockBOpenTime = BrakeSystem . AngleCockBOpenTime ;
1085- BrakeSystemAlt . BleedOffValveOpen = BrakeSystem . BleedOffValveOpen ;
1086- BrakeSystemAlt . TwoPipes = BrakeSystem . TwoPipes ;
1087-
1088- ( BrakeSystem , BrakeSystemAlt ) = ( BrakeSystemAlt , BrakeSystem ) ;
1089- }
1073+ HandleIncompatibleBrakesystems ( brakeSystem ) ;
10901074 BrakeSystem . InitializeFromCopy ( brakeSystem , true ) ;
1091- }
1092- else
1093- {
1094- brakeSystem = BrakeSystem ;
1095- }
10961075
1097- LoadEmptyMaxHandbrakeForceN = brakeSystem . InitialMaxHandbrakeForceN ;
1098- LoadEmptyMaxBrakeForceN = brakeSystem . MaxBrakeShoeForceN != 0 && BrakeShoeType != BrakeShoeTypes . Unknown ? brakeSystem . MaxBrakeShoeForceN : brakeSystem . InitialMaxBrakeForceN ;
1099- LoadEmptyRelayValveRatio = ( brakeSystem as AirSinglePipe ) ? . RelayValveRatio ?? 0 ;
1100- LoadEmptyInshotPSI = ( brakeSystem as AirSinglePipe ) ? . RelayValveInshotPSI ?? 0 ;
1101- FrictionBrakeBlendingMaxForceN = brakeSystem . InitialMaxBrakeForceN ; // set the value of braking when blended with dynamic brakes
1076+ LoadEmptyMaxHandbrakeForceN = brakeSystem . InitialMaxHandbrakeForceN ;
1077+ LoadEmptyMaxBrakeForceN = brakeSystem . MaxBrakeShoeForceN != 0 && BrakeShoeType != BrakeShoeTypes . Unknown ? brakeSystem . MaxBrakeShoeForceN : brakeSystem . InitialMaxBrakeForceN ;
1078+ LoadEmptyRelayValveRatio = ( brakeSystem as AirSinglePipe ) ? . RelayValveRatio ?? 0 ;
1079+ LoadEmptyInshotPSI = ( brakeSystem as AirSinglePipe ) ? . RelayValveInshotPSI ?? 0 ;
1080+ FrictionBrakeBlendingMaxForceN = brakeSystem . InitialMaxBrakeForceN ; // set the value of braking when blended with dynamic brakes
1081+
1082+ // 3) Finally try to find the next load stage for being able to interpolate if necessary
1083+ var next = float . MaxValue ;
1084+ foreach ( var key in BrakeSystems . Keys )
1085+ if ( key . BrakeMode == mode && massKg <= key . MinMass )
1086+ next = Math . Min ( next , key . MinMass ) ;
1087+ if ( next == float . MaxValue )
1088+ next = max ;
1089+
1090+ if ( ! BrakeSystems . TryGetValue ( ( mode , next ) , out var brakeSystemNext ) )
1091+ brakeSystemNext = BrakeSystem ;
1092+
1093+ LoadFullMaxHandbrakeForceN = brakeSystemNext . InitialMaxHandbrakeForceN ;
1094+ LoadFullMaxBrakeForceN = brakeSystemNext . MaxBrakeShoeForceN != 0 && BrakeShoeType != BrakeShoeTypes . Unknown ? brakeSystemNext . MaxBrakeShoeForceN : brakeSystemNext . InitialMaxBrakeForceN ;
1095+ LoadFullRelayValveRatio = ( brakeSystemNext as AirSinglePipe ) ? . RelayValveRatio ?? 0 ;
1096+ LoadFullInshotPSI = ( brakeSystemNext as AirSinglePipe ) ? . RelayValveInshotPSI ?? 0 ;
1097+ }
1098+ }
11021099
1103- var next = float . MaxValue ;
1104- foreach ( var key in BrakeSystems . Keys )
1105- if ( key . BrakeMode == mode && massKg <= key . MinMass )
1106- next = Math . Min ( next , key . MinMass ) ;
1107- if ( next == float . MaxValue )
1108- next = max ;
1100+ UpdateBrakeLoadCompensation ( TempMassDiffRatio ) ;
1101+ }
11091102
1110- if ( ! BrakeSystems . TryGetValue ( ( mode , next ) , out var brakeSystemNext ) )
1111- brakeSystemNext = BrakeSystem ;
1103+ void HandleIncompatibleBrakesystems ( BrakeSystem newBrakeSystem )
1104+ {
1105+ if ( newBrakeSystem is VacuumSinglePipe ^ BrakeSystem is VacuumSinglePipe )
1106+ {
1107+ if ( BrakeSystemAlt == null )
1108+ {
1109+ BrakeSystemAlt = BrakeSystem . CreateNewLike ( newBrakeSystem , this ) . InitializeDefault ( ) ;
11121110
1113- LoadFullMaxHandbrakeForceN = brakeSystemNext . InitialMaxHandbrakeForceN ;
1114- LoadFullMaxBrakeForceN = brakeSystemNext . MaxBrakeShoeForceN != 0 && BrakeShoeType != BrakeShoeTypes . Unknown ? brakeSystemNext . MaxBrakeShoeForceN : brakeSystemNext . InitialMaxBrakeForceN ;
1115- LoadFullRelayValveRatio = ( brakeSystemNext as AirSinglePipe ) ? . RelayValveRatio ?? 0 ;
1116- LoadFullInshotPSI = ( brakeSystemNext as AirSinglePipe ) ? . RelayValveInshotPSI ?? 0 ;
1111+ // Leave the car in a working state. However the train should reinitialize the car with correct values when all the switchings were finished.
1112+ ( var maxPressurePSI , var fullServPressurePSI ) = newBrakeSystem . GetDefaultPressures ( ) ;
1113+ var handbrakeOn = BrakeSystem . GetHandbrakeStatus ( ) ;
1114+ var immediateRelease = BrakeSystem . GetCylPressurePSI ( ) == 0 ;
1115+ BrakeSystemAlt . Initialize ( handbrakeOn , maxPressurePSI , fullServPressurePSI , immediateRelease ) ;
1116+ }
1117+ BrakeSystemAlt . FrontBrakeHoseConnected = BrakeSystem . FrontBrakeHoseConnected ;
1118+ BrakeSystemAlt . RearBrakeHoseConnected = BrakeSystem . RearBrakeHoseConnected ;
1119+ BrakeSystemAlt . AngleCockAOpen = BrakeSystem . AngleCockAOpen ;
1120+ BrakeSystemAlt . AngleCockAOpenAmount = BrakeSystem . AngleCockAOpenAmount ;
1121+ BrakeSystemAlt . AngleCockAOpenTime = BrakeSystem . AngleCockAOpenTime ;
1122+ BrakeSystemAlt . AngleCockBOpen = BrakeSystem . AngleCockBOpen ;
1123+ BrakeSystemAlt . AngleCockBOpenAmount = BrakeSystem . AngleCockBOpenAmount ;
1124+ BrakeSystemAlt . AngleCockBOpenTime = BrakeSystem . AngleCockBOpenTime ;
1125+ BrakeSystemAlt . BleedOffValveOpen = BrakeSystem . BleedOffValveOpen ;
1126+ BrakeSystemAlt . TwoPipes = BrakeSystem . TwoPipes ;
1127+
1128+ ( BrakeSystem , BrakeSystemAlt ) = ( BrakeSystemAlt , BrakeSystem ) ;
11171129 }
1118-
1119- UpdateBrakeLoadCompensation ( TempMassDiffRatio ) ;
11201130 }
11211131
11221132 // Compute total mass of wagon including freight animations and variable loads like containers
@@ -1422,7 +1432,6 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
14221432 }
14231433 break ;
14241434 case "wagon(ortsbrakemode(ortsloadstage" :
1425- var minMass = 0f ;
14261435 var stage = BrakeSystem . CreateNewLike ( newSystem , this ) . InitializeDefault ( ) ;
14271436 stage . BrakeMode = newSystem . BrakeMode ;
14281437 stf . VerifyStartOfBlock ( ) ;
@@ -1432,7 +1441,7 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
14321441 lowercasetoken = stf . Tree . ToLower ( ) ;
14331442 switch ( lowercasetoken )
14341443 {
1435- case "wagon(ortsbrakemode(ortsloadstage(ortsloadstageminmass" : minMass = stf . ReadFloatBlock ( STFReader . UNITS . Mass , null ) ; break ;
1444+ case "wagon(ortsbrakemode(ortsloadstage(ortsloadstageminmass" : stage . LoadStageMinMassKg = stf . ReadFloatBlock ( STFReader . UNITS . Mass , null ) ; break ;
14361445 default :
14371446 if ( lowercasetoken . EndsWith ( "(" ) )
14381447 {
@@ -1446,10 +1455,10 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
14461455 break ;
14471456 }
14481457 }
1449- if ( ! BrakeSystems . ContainsKey ( ( newSystem . BrakeMode , minMass ) ) )
1450- BrakeSystems . Add ( ( newSystem . BrakeMode , minMass ) , stage ) ;
1458+ if ( ! BrakeSystems . ContainsKey ( ( newSystem . BrakeMode , stage . LoadStageMinMassKg ) ) )
1459+ BrakeSystems . Add ( ( newSystem . BrakeMode , stage . LoadStageMinMassKg ) , stage ) ;
14511460 else
1452- BrakeSystems [ ( newSystem . BrakeMode , minMass ) ] . InitializeFromCopy ( stage , true ) ;
1461+ BrakeSystems [ ( newSystem . BrakeMode , stage . LoadStageMinMassKg ) ] . InitializeFromCopy ( stage , true ) ;
14531462 break ;
14541463 default :
14551464 if ( lowercasetoken . EndsWith ( "(" ) )
@@ -1886,6 +1895,7 @@ public virtual void Copy(MSTSWagon copy)
18861895 BrakeSystems . Add ( key , copySystem ) ;
18871896 }
18881897 BrakeModeNames = copy . BrakeModeNames . Clone ( ) as string [ ] ;
1898+ TempMassDiffRatio = copy . TempMassDiffRatio ;
18891899
18901900 if ( copy . WeightLoadController != null ) WeightLoadController = new MSTSNotchController ( copy . WeightLoadController ) ;
18911901
@@ -2033,6 +2043,7 @@ public override void Save(BinaryWriter outf)
20332043 }
20342044
20352045 LocomotiveAxles . Save ( outf ) ;
2046+ outf . Write ( TempMassDiffRatio ) ;
20362047
20372048 base . Save ( outf ) ;
20382049 }
@@ -2091,6 +2102,7 @@ public override void Restore(BinaryReader inf)
20912102
20922103 MoveParamsToAxle ( ) ;
20932104 LocomotiveAxles . Restore ( inf ) ;
2105+ TempMassDiffRatio = inf . ReadSingle ( ) ;
20942106
20952107 base . Restore ( inf ) ;
20962108 }
0 commit comments