@@ -6,6 +6,8 @@ namespace TrainManager.Trains
6
6
{
7
7
public partial class TrainBase
8
8
{
9
+
10
+
9
11
/// <summary>Updates the brake system for the entire train</summary>
10
12
/// <param name="TimeElapsed">The frame time elapsed</param>
11
13
/// <param name="DecelerationDueToBrake">An array containing the deceleration figures generated by the brake system of each car in the train</param>
@@ -20,41 +22,94 @@ public void UpdateBrakeSystem(double TimeElapsed, out double[] DecelerationDueTo
20
22
UpdateBrakeSystem ( i , TimeElapsed , out DecelerationDueToBrake [ i ] , out DecelerationDueToMotor [ i ] ) ;
21
23
}
22
24
23
- // brake pipe pressure distribution dummy (just averages)
24
- double TotalPressure = 0.0 ;
25
- for ( int i = 0 ; i < Cars . Length ; i ++ )
25
+ if ( Specs . AveragesPressureDistribution )
26
26
{
27
- if ( i > 0 )
27
+ // brake pipe pressure distribution dummy (just averages)
28
+ double TotalPressure = 0.0 ;
29
+ for ( int i = 0 ; i < Cars . Length ; i ++ )
28
30
{
29
- if ( Cars [ i - 1 ] . Derailed | Cars [ i ] . Derailed )
31
+ if ( i > 0 )
30
32
{
31
- Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= Cars [ i ] . CarBrake . brakePipe . LeakRate * TimeElapsed ;
32
- if ( Cars [ i ] . CarBrake . brakePipe . CurrentPressure < 0.0 ) Cars [ i ] . CarBrake . brakePipe . CurrentPressure = 0.0 ;
33
+ if ( Cars [ i - 1 ] . Derailed | Cars [ i ] . Derailed )
34
+ {
35
+ Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= Cars [ i ] . CarBrake . brakePipe . LeakRate * TimeElapsed ;
36
+ if ( Cars [ i ] . CarBrake . brakePipe . CurrentPressure < 0.0 ) Cars [ i ] . CarBrake . brakePipe . CurrentPressure = 0.0 ;
37
+ }
33
38
}
34
- }
35
39
36
- if ( i < Cars . Length - 1 )
37
- {
38
- if ( Cars [ i ] . Derailed | Cars [ i + 1 ] . Derailed )
40
+ if ( i < Cars . Length - 1 )
39
41
{
40
- Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= Cars [ i ] . CarBrake . brakePipe . LeakRate * TimeElapsed ;
41
- if ( Cars [ i ] . CarBrake . brakePipe . CurrentPressure < 0.0 ) Cars [ i ] . CarBrake . brakePipe . CurrentPressure = 0.0 ;
42
+ if ( Cars [ i ] . Derailed | Cars [ i + 1 ] . Derailed )
43
+ {
44
+ Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= Cars [ i ] . CarBrake . brakePipe . LeakRate * TimeElapsed ;
45
+ if ( Cars [ i ] . CarBrake . brakePipe . CurrentPressure < 0.0 ) Cars [ i ] . CarBrake . brakePipe . CurrentPressure = 0.0 ;
46
+ }
42
47
}
48
+
49
+ TotalPressure += Cars [ i ] . CarBrake . brakePipe . CurrentPressure ;
43
50
}
44
51
45
- TotalPressure += Cars [ i ] . CarBrake . brakePipe . CurrentPressure ;
52
+ double averagePressure = TotalPressure / Cars . Length ;
53
+ for ( int i = 0 ; i < Cars . Length ; i ++ )
54
+ {
55
+ Cars [ i ] . CarBrake . brakePipe . CurrentPressure = averagePressure ;
56
+ }
46
57
}
47
-
48
- double AveragePressure = TotalPressure / Cars . Length ;
49
- for ( int i = 0 ; i < Cars . Length ; i ++ )
58
+ else
50
59
{
51
- Cars [ i ] . CarBrake . brakePipe . CurrentPressure = AveragePressure ;
60
+
61
+ /*
62
+ * Notes:
63
+ * This algorithm will have a 1 frame (~10ms at 100fps) delay
64
+ * in pressure changes rippling down the pipe
65
+ *
66
+ * For the minute (subject to change), assuming that the charge rate is
67
+ * the total from *both* ends of the pipe, so divide by 2
68
+ *
69
+ */
70
+
71
+ int lastMainBrake = 0 ;
72
+ for ( int i = 0 ; i < Cars . Length ; i ++ )
73
+ {
74
+ Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= Cars [ i ] . CarBrake . brakePipe . LeakRate * TimeElapsed ;
75
+ if ( Cars [ i ] . CarBrake . brakePipe . CurrentPressure < 0.0 ) Cars [ i ] . CarBrake . brakePipe . CurrentPressure = 0.0 ;
76
+ if ( Cars [ i ] . CarBrake . brakeType == BrakeType . Main )
77
+ {
78
+ // If at the end of the train or a compressor we don't need to flow into it
79
+ bool nextCarIsMainBrake = i == Cars . Length || Cars [ i + 1 ] . CarBrake . brakeType == BrakeType . Main ;
80
+
81
+ if ( i > 0 )
82
+ {
83
+ // Back flow
84
+ for ( int j = i ; j > lastMainBrake ; j -- )
85
+ {
86
+ double pressureChange = Math . Min ( Cars [ j ] . CarBrake . brakePipe . NormalPressure - Cars [ j ] . CarBrake . brakePipe . CurrentPressure , Cars [ j ] . CarBrake . brakePipe . ChargeRate / 2 ) * TimeElapsed ;
87
+ double pressureDiff = Math . Min ( pressureChange , Cars [ j ] . CarBrake . brakePipe . CurrentPressure ) * TimeElapsed ;
88
+ Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= pressureDiff ;
89
+ Cars [ j ] . CarBrake . brakePipe . CurrentPressure += pressureDiff ;
90
+ }
91
+ }
92
+ // Forwards flow
93
+ for ( int j = i ; j < Cars . Length ; j ++ )
94
+ {
95
+ double pressureChange = Math . Min ( Cars [ j ] . CarBrake . brakePipe . NormalPressure - Cars [ j ] . CarBrake . brakePipe . CurrentPressure , Cars [ j ] . CarBrake . brakePipe . ChargeRate / 2 ) * TimeElapsed ;
96
+ double pressureDiff = Math . Min ( pressureChange , Cars [ j ] . CarBrake . brakePipe . CurrentPressure ) * TimeElapsed ;
97
+ Cars [ i ] . CarBrake . brakePipe . CurrentPressure -= pressureDiff ;
98
+ Cars [ j ] . CarBrake . brakePipe . CurrentPressure += pressureDiff ;
99
+ if ( nextCarIsMainBrake )
100
+ {
101
+ break ;
102
+ }
103
+ }
104
+ lastMainBrake = i ;
105
+ }
106
+ }
52
107
}
53
108
}
54
109
55
110
/// <summary>Updates the brake system for a car within this train</summary>
56
111
/// <remarks>This must remain a property of the train, for easy access to various base properties</remarks>
57
- /// <param name="CarIndex">The induvidual car</param>
112
+ /// <param name="CarIndex">The individual car</param>
58
113
/// <param name="TimeElapsed">The frame time elapsed</param>
59
114
/// <param name="DecelerationDueToBrake">The total brake deceleration this car provides</param>
60
115
/// <param name="DecelerationDueToMotor">The total motor deceleration this car provides</param>
0 commit comments