@@ -58,6 +58,7 @@ public class TrainCarOperationsViewerWindow : Window
5858 internal static Texture2D ETSdisconnected32 ;
5959 internal static Texture2D FrontAngleCockOpened ;
6060 internal static Texture2D FrontAngleCockClosed ;
61+ internal static Texture2D FrontAngleCockPartial ;
6162 internal static Texture2D HandBrakeSet ;
6263 internal static Texture2D HandBrakeNotSet ;
6364 internal static Texture2D HandBrakeNotAvailable ;
@@ -71,9 +72,12 @@ public class TrainCarOperationsViewerWindow : Window
7172 internal static Texture2D PowerChanging ;
7273 internal static Texture2D RearAngleCockOpened ;
7374 internal static Texture2D RearAngleCockClosed ;
75+ internal static Texture2D RearAngleCockPartial ;
7476 internal static Texture2D ResetBrakesOff ;
7577 internal static Texture2D ResetBrakesOn ;
7678
79+ public List < bool > AngleCockAPartiallyOpened = new List < bool > ( ) ;
80+ public List < bool > AngleCockBPartiallyOpened = new List < bool > ( ) ;
7781 public string BatteryStatus ;
7882 string CircuitBreakerState ;
7983 public int LocoRowCount ;
@@ -218,6 +222,8 @@ protected internal override void Initialize()
218222 Rectangle RearAngleCockClosedRect = new Rectangle ( 32 , 224 , 32 , 32 ) ;
219223 Rectangle FrontAngleCockOpenedRect = new Rectangle ( 64 , 224 , 32 , 32 ) ;
220224 Rectangle RearAngleCockOpenedRect = new Rectangle ( 96 , 224 , 32 , 32 ) ;
225+ Rectangle FrontAngleCockPartialRect = new Rectangle ( 96 , 160 , 32 , 32 ) ;
226+ Rectangle RearAngleCockPartialRect = new Rectangle ( 96 , 288 , 32 , 32 ) ;
221227
222228 Rectangle PowerOnRect = new Rectangle ( 0 , 288 , 32 , 32 ) ;
223229 Rectangle PowerOffRect = new Rectangle ( 32 , 288 , 32 , 32 ) ;
@@ -252,6 +258,7 @@ protected internal override void Initialize()
252258
253259 FrontAngleCockClosed = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , FrontAngleCockClosedRect ) ;
254260 FrontAngleCockOpened = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , FrontAngleCockOpenedRect ) ;
261+ FrontAngleCockPartial = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , FrontAngleCockPartialRect ) ;
255262
256263 HandBrakeNotAvailable = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , HandBrakeNotAvailableRect ) ;
257264 HandBrakeNotSet = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , HandBrakeNotSetRect ) ;
@@ -269,6 +276,7 @@ protected internal override void Initialize()
269276
270277 RearAngleCockClosed = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , RearAngleCockClosedRect ) ;
271278 RearAngleCockOpened = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , RearAngleCockOpenedRect ) ;
279+ RearAngleCockPartial = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , RearAngleCockPartialRect ) ;
272280
273281 ResetBrakesOff = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , ResetBrakesOffRect ) ;
274282 ResetBrakesOn = SharedTextureManager . Get ( GraphicsDeviceRender , TrainOperationsPath , ResetBrakesOnRect ) ;
@@ -321,6 +329,11 @@ protected override ControlLayout Layout(ControlLayout layout)
321329 MSTSLocomotive locomotive = trainCar as MSTSLocomotive ;
322330 MSTSWagon wagon = trainCar as MSTSWagon ;
323331
332+ // reset AngleCockAPartiallyOpened
333+ AngleCockAPartiallyOpened = Enumerable . Repeat ( false , PlayerTrain . Cars . Count ) . ToList ( ) ;
334+ // reset AngleCockBPartiallyOpened
335+ AngleCockBPartiallyOpened = Enumerable . Repeat ( false , PlayerTrain . Cars . Count ) . ToList ( ) ;
336+
324337 bool isElectricDieselLocomotive = ( trainCar is MSTSElectricLocomotive ) || ( trainCar is MSTSDieselLocomotive ) ;
325338
326339 {
@@ -482,6 +495,30 @@ public override void PrepareFrame(ElapsedTime elapsedTime, bool updateFull)
482495 UpdateWindowSize ( ) ;
483496 TrainCarOperationsChanged = true ;
484497 }
498+
499+ for ( var position = 0 ; position < Owner . Viewer . PlayerTrain . Cars . Count ; position ++ )
500+ {
501+ if ( trainCarOperations . WarningCarPosition [ position ] )
502+ {
503+ var carAngleCockAOpenAmount = Owner . Viewer . PlayerTrain . Cars [ position ] . BrakeSystem . AngleCockAOpenAmount ;
504+ var carAngleCockBOpenAmount = Owner . Viewer . PlayerTrain . Cars [ position ] . BrakeSystem . AngleCockBOpenAmount ;
505+ if ( carAngleCockAOpenAmount >= 1 && AngleCockAPartiallyOpened [ position ] )
506+ {
507+ AngleCockAPartiallyOpened [ position ] = false ;
508+ Layout ( ) ;
509+ TrainCarOperationsChanged = true ;
510+ }
511+ if ( carAngleCockBOpenAmount >= 1 && AngleCockBPartiallyOpened [ position ] )
512+ {
513+ AngleCockBPartiallyOpened [ position ] = false ;
514+ Layout ( ) ;
515+ TrainCarOperationsChanged = true ;
516+ }
517+ AngleCockAPartiallyOpened [ position ] = carAngleCockAOpenAmount < 1 && carAngleCockAOpenAmount > 0 ;
518+ AngleCockBPartiallyOpened [ position ] = carAngleCockBOpenAmount < 1 && carAngleCockBOpenAmount > 0 ;
519+ }
520+ }
521+
485522 //required by traincarwindow to ModifyWindowSize()
486523 windowHeight = Vbox != null ? Vbox . Position . Height : 0 ;
487524 }
@@ -778,15 +815,20 @@ class buttonFrontAngleCock : Image
778815 readonly TrainCarOperationsViewerWindow TrainCarViewer ;
779816 readonly int CarPosition ;
780817 readonly bool First ;
781-
818+ readonly float carAngleCockAOpenAmount ;
782819 public buttonFrontAngleCock ( int x , int y , int size , Viewer viewer , TrainCar car , int carPosition )
783820 : base ( x , y , size , size )
784821 {
785822 Viewer = viewer ;
786823 TrainCarViewer = Viewer . TrainCarOperationsViewerWindow ;
787824 CarPosition = carPosition ;
788825 First = car == Viewer . PlayerTrain . Cars . First ( ) ;
789- Texture = First ? FrontAngleCockClosed : ( viewer . PlayerTrain . Cars [ carPosition ] as MSTSWagon ) . BrakeSystem . AngleCockAOpen ? FrontAngleCockOpened : FrontAngleCockClosed ;
826+ var carAngleCockAOpenAmount = Viewer . PlayerTrain . Cars [ CarPosition ] . BrakeSystem . AngleCockAOpenAmount ;
827+
828+ Texture = First ? FrontAngleCockClosed
829+ : carAngleCockAOpenAmount >= 1 ? FrontAngleCockOpened
830+ : carAngleCockAOpenAmount <= 0 ? FrontAngleCockClosed
831+ : FrontAngleCockPartial ;
790832 Source = new Rectangle ( 0 , 0 , size , size ) ;
791833 Click += new Action < Control , Point > ( buttonFrontAngleCock_Click ) ;
792834 }
@@ -796,7 +838,9 @@ void buttonFrontAngleCock_Click(Control arg1, Point arg2)
796838 if ( First ) return ;
797839
798840 new ToggleAngleCockACommand ( Viewer . Log , ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) , ! ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockAOpen ) ;
799- if ( ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockAOpen )
841+ var carAngleCockAOpenAmount = Viewer . PlayerTrain . Cars [ CarPosition ] . BrakeSystem . AngleCockAOpenAmount ;
842+
843+ if ( ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockAOpen && carAngleCockAOpenAmount >= 1 )
800844 {
801845 Viewer . Simulator . Confirmer . Information ( Viewer . Catalog . GetString ( "Front angle cock opened" ) ) ;
802846 Texture = FrontAngleCockOpened ;
@@ -815,16 +859,22 @@ class buttonRearAngleCock : Image
815859 readonly TrainCarOperationsViewerWindow TrainCarViewer ;
816860 readonly int CarPosition ;
817861 readonly bool Last ;
818-
819862 public buttonRearAngleCock ( int x , int y , int size , Viewer viewer , TrainCar car , int carPosition )
820863 : base ( x , y , size , size )
821864 {
822865 Viewer = viewer ;
823866 TrainCarViewer = Viewer . TrainCarOperationsViewerWindow ;
824867 CarPosition = carPosition ;
825868 Last = car == Viewer . PlayerTrain . Cars . Last ( ) ;
826- Texture = Last ? RearAngleCockClosed : ( viewer . PlayerTrain . Cars [ carPosition ] as MSTSWagon ) . BrakeSystem . AngleCockBOpen ? RearAngleCockOpened : RearAngleCockClosed ;
869+ var carAngleCockBOpenAmount = ( viewer . PlayerTrain . Cars [ carPosition ] as MSTSWagon ) . BrakeSystem . AngleCockBOpenAmount ;
870+
871+ Texture = Last ? RearAngleCockClosed
872+ : carAngleCockBOpenAmount >= 1 ? RearAngleCockOpened
873+ : carAngleCockBOpenAmount <= 0 ? RearAngleCockClosed
874+ : RearAngleCockPartial ;
875+
827876 Source = new Rectangle ( 0 , 0 , size , size ) ;
877+
828878 Click += new Action < Control , Point > ( buttonRearAngleCock_Click ) ;
829879 }
830880
@@ -833,7 +883,9 @@ void buttonRearAngleCock_Click(Control arg1, Point arg2)
833883 if ( Last ) return ;
834884
835885 new ToggleAngleCockBCommand ( Viewer . Log , ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) , ! ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockBOpen ) ;
836- if ( ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockBOpen )
886+ var carAngleCockBOpenAmount = ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockBOpenAmount ;
887+
888+ if ( ( Viewer . PlayerTrain . Cars [ CarPosition ] as MSTSWagon ) . BrakeSystem . AngleCockBOpen && carAngleCockBOpenAmount >= 1 )
837889 {
838890 Viewer . Simulator . Confirmer . Information ( Viewer . Catalog . GetString ( "Rear angle cock opened" ) ) ;
839891 Texture = RearAngleCockOpened ;
0 commit comments