keimei main -> キハポスト@VRM -> VRM4スクリプト -> ATC編

VRM4スクリプト(8)〜ATC編

この文章を書いた時点でのVRM4のバージョンは「4.0.0.6」です。これ以前のバージョンでは間違いなく動作しません。また、今後のバージョンアップによって仕様が変更される可能性もあります。

この文章は私が試行錯誤してレイアウトを作った過程を時系列で解説しています。分かり難いかも知れませんが、例によって、プログラム挑戦記って読み物感覚でどうぞ。

●何をやりたいか●

閉塞区間については改めて説明することもないと思いますが、1つの線路に複数の列車が走る場合、線路を区間で区切り、1つの区間に複数の列車を入れない、という制御です。自動閉塞の場合は信号機を用いて、その区間に列車がいる場合、赤を現示するなどする訳ですね。しかし、VRM4第0号では地上信号機がありません。スクリプトで自動閉塞を作ってもそれを表示する方法が‥‥‥いや、ありました。実際の鉄道でも「地上」信号機を用いずに閉塞運転を行っている鉄道がありますね。新幹線などに採用されているATCです。地上信号機の代わりに運転台の計器に許容速度を示すランプが点灯します。VRM4の場合、この速度指示は「ログウィンドウ」に表示することができますね。という訳で、地上信号の代わりに、ログウィンドウに信号を現示させて列車を運転しようという目論見です。なお、実際のATCがどういう仕組みになっているのか分かりませんので、それをシミュレートしたものではありません。地上信号機を単にメッセージ表示に置き換えたものと考えてください。

とにかく、レイアウトを作ってみます。単純なループにして、ここを同方向に2本の列車が走ります。「自分」と書いてあるのが、あなたが運転する列車で、「相手」は自動で勝手に走り回っている列車です。この「相手」の列車にぶつからないように、うまく運転しなくてはいけません。そう、ATCやATSの様に自動で運転してくれるのではなく、信号機に従ってうまく運転してくださいよ、というゲームなのです。

レイアウトを閉塞区間に区切ります。ここでは第6閉塞から第1閉塞まで6区間に区切りました。「グロバール変数編」でやったように、上図の青数字にセンサを置いて、列車の現在位置を検出します。現在位置が「3」だったら、列車はセンサ3とセンサ2の間に居るわけです。さて、閉塞運転ですから、相手と自分の距離が重要です。例えば、相手が「1」に居て、自分が「3」だとすると、自分(3)引く相手(1)で距離は「2」になります。相手が「5」で、自分が「2」だと、2引く5で−3になりますが、この場合は、6を足して、距離は3になります。また、このレイアウトはループになっていますので、相手のとの距離が5だったとすると、相手は自分のすぐ後ろに居ることになり、慌てて加速して逃げないといけないことになります。もちろん、相手と自分の位置が同じ数字だったら、それは同じ閉塞区間に入ってしまったということで、ゲームオーバー(!)です。この辺は、メモ用紙に上のような絵をちょこちょこと書けば理解できますね。表にまとめると以下の通りです。

相手との距離 メッセージ
0 同じ閉塞区間、ゲームオーバー!
1 「赤」現示、停止せよ
2 「黄」現示、減速・徐行せよ
3 「青」現示、現在の速度を維持
4 「青」現示、最高速度で運転せよ
5 「青」現示、直ちに最高速度を出せ

6区間しかありませんので、結構アバウトな指示かもですね。このメッセージに従ってうまく運転すれば、ゲームクリアって訳です。いや、クリア条件はなくて、延々と続くゲームなんですけど。

●相手列車の自動運転●

ATC制御を行う前に、「相手」列車を自動運転することを考えます。「相手」列車は勝手にループを回っている訳ですが、一定速度で走っているのでは面白くありません。そこで、適当に加減速を繰り返して、ゲームプレーヤを困らせることにします。これは、「車輌制御回天編」で使った編成スクリプトを使えば簡単ですね。閉塞位置検出用とは別のセンサを線路上に適当に設置して、このセンサに列車が検知されたら、その列車に対して「T_KasokuFull」とか「T_Jokou」とか callすればよろしい。なお、今回は照明をオンオフする必要はありませんので、「回天編」で作った編成スクリプトよりは簡単なものを用意しました。

さらに、この列車、駅で停止するようにしました。約15秒間停車した後、自動で発車していきます。これくらいの制御は簡単に出来ることなのですが、その解説は「リアルタイム制御編」にて。

注:センサが列車の速度制御するのは「相手」列車に対してだけで、プレーヤーの運転する「自分」列車は無視する必要があります。これに対しては、至極原始的な方法で解決していますが、ここでは企業秘密にしておきましょう。配布したレイアウトを見れば分かるんですけどね。

●あとは簡単●

ここまでできれば後は簡単でした。「グローバル変数編」でやったように、センサとレイアウトのスクリプトを書きます。今回は2列車あって、それぞれの位置を区別する必要がありますので、プレーヤの列車の位置=my_pos、相手列車の位置=your_posと変数を2つ用意しました。そして、この2つの差が互いの列車の距離という訳です。

★遊び方★

ビューアーを起動すると選択されている列車があなたの運転する列車です。左下のログウィンドウは開いておいてください。そこに「ATC Control 130km/h」とか指示が表示されますので、それに従って運転してください。調子こいて130km/hで運転していると他の列車に追突してしまいますし、のんびり止まっていると後ろからドヤされてしまいます。同じ閉塞区間に入るとゲームオーバーですが、クリア条件はありません。飽きるまで運転してください。

レイアウトデータダウンロード「ATC Game」:ATC_Game.LZH、332kB