Phystam-S Studio

Simutransのことなど

Simutrans-ExtendedにおけるAFHPatchの開発

本稿は、Simutrans Advent calender の3日目の記事になります。詳細についてはこちらを参照してください。
adventar.org

背景

従来のSimutransでは、飛行機はその種類によらず常に一定の高度を飛行していました。その高度はお世辞にも高いとは言えず、少し高さがある建物や高架路線に対して頻繁に衝突するなど、景観を重視するプレイヤーにとって低空飛行は大きな課題となっていました。本研究は、すでに飛行機の挙動に関して最小滑走路長が設定されるなどの変更が加えられているSimutrans-Extendedを対象として、飛行高度および離着陸のアルゴリズムを変更することで、飛行機がより現実的な振る舞いをするよう改良することを目的として行ったものです。
f:id:Phystam:20171201222533p:plain
図1: 建物に衝突する飛行機。tile heightを単位として高さ3の位置を飛行するため、このような重大事故は非常に頻繁に発生していました。

開発

問題点

本研究では、飛行高度の変更に伴って、山越え時の飛行高度変更の挙動や、着陸態勢に入り滑走路を予約する地点や予約範囲に対して変更を行いました。
単純に飛行高度を上げるだけなら非常に簡単に実装することができますが、着陸態勢に入る位置は低空飛行時と同様に滑走路端から3マス手前であることは変わりません。つまり、高い高度から着陸態勢に入ると滑走路の中腹や、短い滑走路の場合は滑走路を超えた地点で着陸することになってしまいます。また、滑走路の長さの計算がうまく計算されず、実際には着陸には問題ない滑走路長であったとしても、"runway too short"、つまり滑走路が短すぎると警告が出て着陸できない場合がありました。これらの問題が見られた、開発当初の動画を御覧ください。
www.youtube.com
動画1: 滑走路長が極端に長いのは、runway too shortの問題を避けるためです。

改良

着陸態勢に入る位置を制御するためのパラメータとして"landing_distance"をタイル単位で、飛行高度をその飛行機の最高速度に依存させるため"altitude_level"をtile height単位で、それぞれ導入しました。これらの変数は、次のように計算されています。
 \mathrm{AltitudeLevel}=
\begin{cases}
5&(v<165\,\mathrm{km/h})\\
v/33&(165\,\mathrm{km/h} \leq v <990\,\mathrm{km/h})\\
30&(v\geq 990\,\mathrm{km/h})
\end{cases}
 \mathrm{LandingDistance}=\mathrm{AltitudeLevel}-1
この変数を着陸態勢に入る位置とすることによって、着陸時の挙動を現実的なものにできるようになりました。
www.youtube.com
また、飛行機の着陸時の速度は、その飛行機の最高速度の1/3と決められていましたが、低速な飛行機では40km/h程度となり、現実的な値ではありませんでした。例えば、120km/hから40km/hに減速し着陸、その後滑走路では60km/hが最高速度になるため60km/hまで加速する、といった不可解な速度調整が行われていました。そこで、こっそり着陸時の速度を最低でも60km/hとすることによってこのねじれを解消しました。

終結

その後、公式forumで、着陸後滑走路の終端まで予約し、終端で180°折り返すという動作の改善をするよう要望がありました。本研究ではこの要望に応え、滑走路の終端までではなく最短滑走路長分のみを予約し、予約範囲の終端まで行ったら近くの駐機場に向かうように変更しました。これにより滑走路のデッドタイムの短縮に成功しました。

まとめ

本研究の結果、AFHPatchは正式にSimutrans-Extendedのmasterブランチに統合され、Extendedの機能の一部となりました。開発者として、このことは非常に喜ばしいものであったことと同時に、私のような未熟な開発者でもExtendedの土壌では本家統合が比較的容易であるということが改めて感じられました。
最後にみなさんもSimutrans-Extendedをプレイし、より高い位置を飛行するようになった飛行機を、ご自身の目で確認してみてください。
f:id:Phystam:20171203003244p:plain
図2: まだ飛行機が飛ばない江戸の世。

謝辞

パッチゼミを開催しパッチ開発の指南をしてくださったひめしさん、そしてExtendedへの機能統合を快諾してくださったJamesさん、この場を借りてお礼申し上げます。