forked from s520/ATCFS_For_OpenBVE
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Train.cs
206 lines (170 loc) · 8.04 KB
/
Train.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using OpenBveApi.Runtime;
using System;
namespace ATCFS {
/// <summary>このプラグインによってシミュレートされる列車を表すクラス</summary>
internal class Train {
// --- クラス ---
/// <summary>読み込みのみ可能なハンドル操作を表すクラス</summary>
internal class ReadOnlyHandles {
// --- メンバ ---
/// <summary>レバーサ位置</summary>
internal int Reverser { get; private set; }
/// <summary>力行ノッチ</summary>
internal int PowerNotch { get; private set; }
/// <summary>ブレーキノッチ</summary>
internal int BrakeNotch { get; private set; }
/// <summary>定速制御の状態</summary>
internal bool ConstSpeed { get; private set; }
// --- コンストラクタ ---
/// <summary>新しいインスタンスを作成する</summary>
/// <param name="handles">ハンドル操作</param>
internal ReadOnlyHandles(Handles handles) {
this.Reverser = handles.Reverser;
this.PowerNotch = handles.PowerNotch;
this.BrakeNotch = handles.BrakeNotch;
this.ConstSpeed = handles.ConstSpeed;
}
}
// --- プラグイン ---
/// <summary>プラグインが現在初期化中かどうか。これは、メニューから駅にジャンプするときなどに、InitializeとElapseの間で発生する。</summary>
internal bool PluginInitializing;
// --- 列車 ---
/// <summary>車両諸元</summary>
internal VehicleSpecs Specs;
/// <summary>現在の列車の状態</summary>
internal VehicleState State;
/// <summary>最後にElapseが呼び出された際のハンドル操作</summary>
internal ReadOnlyHandles Handles;
/// <summary>現在の客室ドアの状態</summary>
internal DoorStates Doors;
// --- パネルとサウンド ---
/// <summary>パネルに渡す値</summary>
internal int[] Panel;
/// <summary>この列車で使用されるサウンド</summary>
internal Sounds Sounds;
// --- 制御装置 ---
/// <summary>加速度</summary>
internal Accel Accel;
/// <summary>ATC</summary>
internal Atc Atc;
/// <summary>ATS-P</summary>
internal AtsP AtsP;
/// <summary>その他機能</summary>
internal Sub Sub;
/// <summary>この列車に搭載されているすべての保安装置のリスト。保安装置はEB、ATC、ATS-P、ATS-Sxの順でなければならない。</summary>
internal Device[] Devices;
// --- コンストラクタ ---
/// <summary>新しいインスタンスを作成する</summary>
/// <param name="panel">パネルに渡す値</param>
/// <param name="playSound">サウンドを再生するためのデリゲート</param>
internal Train(int[] panel, PlaySoundDelegate playSound) {
this.PluginInitializing = false;
this.Specs = new VehicleSpecs(0, BrakeTypes.ElectromagneticStraightAirBrake, 0, false, 0);
this.State = new VehicleState(0.0, new Speed(0.0), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
this.Handles = new ReadOnlyHandles(new Handles(0, 0, 0, false));
this.Doors = DoorStates.None;
this.Panel = panel;
this.Sounds = new Sounds(playSound);
this.Accel = new Accel();
this.Atc = new Atc(this);
this.AtsP = new AtsP(this);
this.Sub = new Sub(this);
this.Devices = new Device[] { this.Accel, this.Atc, this.AtsP, this.Sub };
}
// --- 関数 ---
/// <summary>ゲーム開始時に呼び出される関数</summary>
/// <param name="mode">初期化モード</param>
internal void Initialize(InitializationModes mode) {
this.PluginInitializing = true;
for (int i = this.Devices.Length - 1; i >= 0; i--) {
this.Devices[i].Initialize(mode);
}
}
/// <summary>1フレームごとに呼び出される関数</summary>
/// <param name="data">The data.</param>
internal void Elapse(ElapseData data) {
this.PluginInitializing = false;
if (data.ElapsedTime.Seconds > 0.0 && data.ElapsedTime.Seconds < 1.0) {
// --- パネル初期化 ---
for (int i = 0; i < this.Panel.Length; i++) {
this.Panel[i] = 0;
}
// --- 保安装置 ---
this.State = data.Vehicle;
this.Handles = new ReadOnlyHandles(data.Handles);
bool blocking = false;
foreach (Device device in this.Devices) {
device.Elapse(data, ref blocking);
}
// For Safety
if (this.Doors != DoorStates.None) {
data.Handles.PowerNotch = 0;
}
// --- パネル ---
// --- サウンド ---
this.Sounds.Elapse(data);
}
}
/// <summary>レバーサーが扱われたときに呼び出される関数</summary>
/// <param name="reverser">レバーサ位置</param>
internal void SetReverser(int reverser) {
foreach (Device device in this.Devices) {
device.SetReverser(reverser);
}
}
/// <summary>主ハンドルが扱われたときに呼び出される関数</summary>
/// <param name="powerNotch">力行ノッチ</param>
internal void SetPower(int powerNotch) {
foreach (Device device in this.Devices) {
device.SetPower(powerNotch);
}
}
/// <summary>ブレーキが扱われたときに呼び出される関数</summary>
/// <param name="brakeNotch">ブレーキノッチ</param>
internal void SetBrake(int brakeNotch) {
foreach (Device device in this.Devices) {
device.SetBrake(brakeNotch);
}
}
/// <summary>ATSキーが押されたときに呼び出される関数</summary>
/// <param name="key">ATSキー</param>
internal void KeyDown(VirtualKeys key) {
foreach (Device device in this.Devices) {
device.KeyDown(key);
}
}
/// <summary>ATSキーが離されたときに呼び出される関数</summary>
/// <param name="key">ATSキー</param>
internal void KeyUp(VirtualKeys key) {
foreach (Device device in this.Devices) {
device.KeyUp(key);
}
}
/// <summary>警笛が扱われたときに呼び出される関数</summary>
/// <param name="type">警笛のタイプ</param>
internal void HornBlow(HornTypes type) {
foreach (Device device in this.Devices) {
device.HornBlow(type);
}
}
/// <summary>Is called when the state of the doors changes.</summary>
/// <param name="oldState">The old state of the doors.</param>
/// <param name="newState">The new state of the doors.</param>
public void DoorChange(DoorStates oldState, DoorStates newState) {
}
/// <summary>現在の閉塞の信号が変化したときに呼び出される関数</summary>
/// <param name="signal">信号番号</param>
internal void SetSignal(SignalData[] signal) {
foreach (Device device in this.Devices) {
device.SetSignal(signal);
}
}
/// <summary>地上子を越えたときに呼び出される関数</summary>
/// <param name="beacon">車上子で受け取った情報</param>
internal void SetBeacon(BeaconData beacon) {
foreach (Device device in this.Devices) {
device.SetBeacon(beacon);
}
}
}
}