今回は私が日頃「SimuTrans OTRPで関東+αを再現」プロジェクトにてお世話になっているSimuTrans OTRPにて、バグと思われる挙動を発見しましたので同じ症状に悩んでいる方や開発関係者の方のデバッグの一助になれば、そして自分の備忘録として、記事にまとめることにしました。
事の発端は前回の記事にて紹介した開発中のことでした。
前回の記事にも概要を載せましたが、今回色々試すうちにとりあえず開発には支障がない状態に出来ましたので、誰かの役に立つ情報かもしれないと思い、ここに詳細と私が行った対処法を記録しておきます。
バグの概要
今回私が発見したバグと思われる挙動の概要についてですが、SimuTransの中でもOTRPにのみ実装されている発車時刻を指定する機能にて発生しました。
OTRPでは1ヶ月に何台発車させるかという形で発車時刻を指定するのですが、最低限の本数である1ヶ月に1台という指定をした場合でも、最大の待ち時間は1ヶ月となります。
ゲーム内では1ヶ月を1440等分した単位で時間を扱いますが、言い換えると発車時刻を指定して、乗り物が発車まで待機する最大時間は1440以上になることはあり得ないわけです。
しかし、私の開発中のマップでは、3万だとか6万だとか、本来の挙動ではありえない時間待機するという状態が発生しました。
これが65536とか32768とかなら、オーバーフローして異常な数値になってしまっているのかと考えましたが、この異常な待ち時間は一定していなかったのです。
中には本来は360ごとに発車するように設定している列車が何故か720ごとになってしまっていたりと、設定通りではないが一見すると正常に見えるという状態もありました。
これは実際にそのバグが発生している際のスクリーンショットですが、35304という異常な時間待機するようになっています。
また、発生する条件についても特に法則などは無いようであり、列車、バスなどの乗り物の種別や設定した発車時刻が特定の値であるとか、本数が特定の値であるといったこともなく、本数も発車時刻(オフセット設定)もまちまちであり、かつ全ての発車時刻を指定した停留所や駅で異常な待ち時間が発生するわけではなく、起こる場所もあれば起こらない場所もありました。
マップ内の位置も関係ないようでマップ内の各所でランダムに発生しているようです。
この現象は意図した通りの本数が運行されないことを意味し、輸送力が不足して旅客を大量に滞留させることになったり、折り返し地点のキャパシティを超える車両が滞留したために道路が渋滞してしまったり、列車であれば後続列車を詰まらせてしまい路線全体の運行がストップするという状況も発生し、開発を続行することが困難になりました。
その他の情報としては現在開発中のもの以外のセーブデータでは一切発生してなかったことから、特定の条件を満たすセーブデータでのみ発生するということが推測でき、ここ最近は路線バスのスケジュールを続々と追加しており、運行系統数が1000をゆうに超えていた上、バスの運行が増えるに比例してバス停の数も増えていたので、系統数、車両数、停留所(駅)数などが一定の値を超えた時にこの現象が起きるのではないかと推測しています。
私が試した対処法
一応は解決したのですが、解決につながった方法は最後にご紹介するとして、まずは試した方法を列挙していこうと思います。
1.異常な待ち時間になっている車両を手動で次の停留所へ移動する
見出しの通りですが、異常な待ち時間になっている車両をスケジュールを開いて次の停留所へ進めてしまうというものです。
このバグが同じ路線でも特定の車両のみに対して発生しているならば手動で当該の車両を次の停留所へ進めてしまえば後続の車両は通常のサイクルで発車するようになるのではないかということを期待してのことでした。
が、結果は後続の車両も手動で送り出した車両と同じだけの長時間待機をするというだけで、解決には至りませんでした・・・
2.異常な待ち時間になっている箇所のスケジュールを変更する
今度は異常な待ち時間になっている箇所の発車時刻そのものを変更してしまおうというわけです。
例えば元々が毎月4台発車(360ごと)に設定していた場合、オフセット設定がない場合、0、360、720、1080のいずれかに発車することになりますが、オフセット設定をして(元々していた場合はその値を変更)みるというものです。
例えば元々がオフセット0だったならば、これをオフセット1にした場合、発車時刻が1遅れることになりますが、ゲーム内での1はほぼ誤差といっても良い程度の差しかなので実用上は問題ないはずです。
この方法では、発車時刻そのものが変更になれば発車順序や待機時間などを管理する変数が初期化されてバグが直るのではないかと期待していました。
結果はと言うと、スケジュール上の発車時刻を変更後、Bボタンをして現れる「線路専有解除ツール」を異常な待ち時間になっている車両に対して使用すると、本来の発車時刻に発車するようになりました。
これにて解決かと思われましたが、この方法は異常が発生している系統ごとに対応しないといけないので既に1000以上の系統を走らせている私のマップではバグへの対応だけでかなりの労力を割かれてしまうということや、この方法を試している最中に新たに異常な待ち時間となる車両が発生してしまいいたちごっこであったこと、決定打となったのは一度この方法で通常運行に戻したはずの系統が再び異常な待ち時間になるという事象も発生し、この方法はその場しのぎであり根本的な解決にはならないと悟りました。
3.「1年進めるボタン」を使う
SimuTransに実装されている機能として、「1年進める」というボタンがあります。
開発初期でまだ使える車両が限られている場合などに、早く使える年まで進めたいといった場合に役に立つ機能だと思いますが、実は私はあまり使ったことがありません。
しかし、異常な待ち時間といっても1年単位で時間を進めることが出来るこの機能ならばもしかして、スケジュール関係の管理変数が初期化されて直るのでは?と期待していました。
結果はと言うと、ゲーム内時間が1年進んだだけで、待ち時間はそのままでしたw
私もこのボタンの仕様をよく知らなかったのですが、1年分のゲームの進行を一括でやってしまうボタンではなくて、単にゲーム内の年数の数値だけを1つ増やすという実装になっているみたいでしたw
最終的な解決方法
解決策を求めてこの記事にいらした方はお待たせしました。
いよいよ解決に至った方法を書きたいと思います。
それは至極単純な方法でして、異常な待ち時間とはいえ、永遠に発車しないわけではないのだからそれまで待ってしまえばいいのですw
仮に3万だとするとゲーム内では1440が1ヶ月であることから換算すると20ヶ月、つまりは1年と8ヶ月も待つことになり、早送りをしながらでも実時間でもかなり待つことになりますし、その間も旅客は発生し続けるので駅に滞留し続ける旅客を無視することは、SimuTransのプレイヤーとしては精神衛生上よろしくないですが、ダメ元で異常な待ち時間が終わるまで早送りをしてひたすら待つことにしたのでした。
溜まり続ける旅客も、実時間での退屈も無視して待ち続け、ついに異常な待ち時間が終わり当該車両が発車していき、後続車両が待機場所に入ってくると・・・おお!所定の発車時刻までの待機になっている!
その後しばらくマップ中を見渡して異常な待ち時間になっている車両が残っていないか確認しましたが、全て通常運行に復帰しており、1箇所に車両が偏ったせいでデッドロックが起きている箇所はありましたが、待ち時間自体は正常に戻っていたのです。
デッドロックと滞留した乗客の処理を終えると、そこにはこのバグが発生する以前の平和な開発風景が広がっていたのでした!
というわけで、SimuTrans OTRPで発車時刻を指定している駅や停留所で異常な長時間待機するような状態になったら、特に何もしないでそのまま待機時間が終わるまでひたすら待つのが現状唯一の解決法のようです。
一応は解決を見たので、またプロジェクトを再開したいと思っていますが、今後また同種のバグが発生しない保証もありませんし、プログラムの仕様に起因するバグならば修正版が出ると嬉しいですね。
無料でこんな楽しいゲームを遊ばせてもらっている立場なのでおこがましいお願いかもしれませんが・・・