![](https://static.wixstatic.com/media/ea798a_0da9900d64a54afb86fb4f8d28386a7a~mv2.jpg/v1/fill/w_1920,h_1080,al_c,q_90,enc_avif,quality_auto/ea798a_0da9900d64a54afb86fb4f8d28386a7a~mv2.jpg)
ミサイルステーションコントローラー(ランチャー)
![Space Engineers 2019-05-01 21-51-48.mp4_](https://static.wixstatic.com/media/ea798a_1338fb46c524453ba61c200aa9bbc550~mv2.jpg/v1/fill/w_359,h_195,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/Space%20Engineers%202019-05-01%2021-51-48_mp4_.jpg)
1| IMyRadioAntenna ant;
2| List<IMyLaserAntenna> antennas = new List<IMyLaserAntenna>();
3| bool[] LaunchableStation = new bool[10];
4| string status = "Ready";
5| int LaunchNo = 0;
6| int LaunchCount = 0;
7| int count = 0;
8|
9| public Program()
10| {
11| ant = GridTerminalSystem.GetBlockWithName("Missile Station Antenna") as IMyRadioAntenna;
12| for (int i=0;i<10;i++){
13| var ant = GridTerminalSystem.GetBlockWithName("SLA "+ (i+1).ToString()) as IMyLaserAntenna;
14| antennas.Add(ant);
15| }
16| CheckMissileExistance();
17| Runtime.UpdateFrequency = UpdateFrequency.Update10;
18| }
19|
20| public void Main(string argument, UpdateType updateSource)
21| {
22| var com = argument.Split(',');
23| ShowMsg();
24|
25| switch (com[0]){
26| case "Launch":
27| if (status == "Ready"){
28| LaunchNo = int.Parse(com[1]);
29| LaunchCount = 0;
30| status = "Launching";
31| }
32| break;
33| case "Ready for Launch":
34| LaunchableStation[int.Parse(com[1])] = bool.Parse(com[2]);
35| break;
36| case "Check Launchable":
37| CheckMissileExistance();
38| ShowMsg();
39| break;
40| }
41|
42| switch (status){
43| case "Launching":
44| for (int i=0;i<10;i++){
45| if (LaunchableStation[i] == true){
46| antennas[i].TransmitMessage("Launch");
47| LaunchCount++;
48| if (LaunchCount == LaunchNo)
49| status = "Ready";
50| else{
51| status = "Wating for Launch";
52| count = 0;
53| }
54| break;
55| }
56| }
57| break;
58| case "Wating for Launch":
59| count++;
60| if (count > 9){
61| status = "Launching";
62| count = 0;
63| }
64| break;
65| }
66| }
67|
68| private void ShowMsg()
69| {
70| var lcdB = GridTerminalSystem.GetBlockWithName("LCD Panel B") as IMyTextPanel;
71| var lcdT = GridTerminalSystem.GetBlockWithName("LCD Panel T") as IMyTextPanel;
72| string info = "";
73|
74| for (int j=0;j<10;j++){
75| info += "Station " + j.ToString() + ": ";
76| info += LaunchableStation[j] ? "Launchable\n" : "Disable\n";
77| }
78| lcdB.WriteText(info);
79|
80| info = status + "\n";
81| info += "Launched: " + LaunchCount.ToString() + " / " + LaunchNo.ToString() + "\n";
82| info += "Counter: " + count+ "\n";
83| lcdT.WriteText(info);
84| }
85|
86| private void CheckMissileExistance()
87| {
88| for (int i=0;i<10;i++)
89| antennas[i].TransmitMessage("Launchable");
90| }
10 基の各ミサイルステーションは、それぞれ独立していてステーションコントローラーとはレーザーアンテナで通信しています。
12| for (int i=0;i<10;i++){
13| var ant = GridTerminalSystem.GetBlockWithName("SLA "+ (i+1).ToString()) as IMyLaserAntenna;
14| antennas.Add(ant);
15| }
Main メソッドの前半ではコマンドライン引数の処理を行っています。LaunchNo はトラッカーから発射リクエストのあったミサイルの台数、LaunchableStation[] はそのステーションがミサイル発射可能かどうかを表す bool 型の配列です。
後半はステーションコントローラーの状態を表す status に対応する処理をしています。status が "Waiting for Launch" の処理は、複数のミサイルを発射する場合に少しずつ発射タイミングをずらすための処理です。
42| switch (status){
43| case "Launching":
44| for (int i=0;i<10;i++){
45| if (LaunchableStation[i] == true){
46| antennas[i].TransmitMessage("Launch");
47| LaunchCount++;
48| if (LaunchCount == LaunchNo)
49| status = "Ready";
50| else{
51| status = "Waiting for Launch";
52| count = 0;
53| }
54| break;
55| }
56| }
57| break;
58| case "Waiting for Launch":
59| count++;
60| if (count > 9){
61| status = "Launching";
62| count = 0;
63| }
64| break;
65| }
66| }
CheckMissileExistance() メソッドは、各ミサイルステーションの状態を更新するために、レーザーアンテナを通して、各ステーションに状態を問い合わせます。ステーションはミサイルが発射可能であるかを "Ready for Launch" コマンドとして返してきます。帰ってきた "Ready for Launch" コマンドは Main メソッドで処理されて LaunchableStation[] 配列を更新します。
86| private void CheckMissileExistance()
87| {
88| for (int i=0;i<10;i++)
89| antennas[i].TransmitMessage("Launchable");
90| }