自動運転が失敗した原因が判明した。ガードビーム接触など減速した際に、何フレーム目まで大丈夫だったかの情報を取得していなかった。元は取得していたが、取得していないスクリプトもあってそっちから処理を流用してしまっていた。噴射中とか諸々の条件によって変わる。優秀なレースゲームの場合、1つ1つのコーナーすべて条件が異なり、同一の攻略法が使えない。コーナーごとにスクリプトは事実上の専用品となる。高度にカスタマイズの進行したスクリプトは、流用も大変だ。接触でNGとなったフレーム数を取得するのは、自動運転で何フレーム先まで試走するかという調整が面倒だからである。コーナー手前までしか試走しなかった場合、曲がり過ぎてコーナーにぶつかってしまう。逆に試走し過ぎると、コーナー向こう側のガードビームにぶつかってしまう。よって、手前のコーナーは通過するがその奥の壁には接触しないという、絶妙の試走を行わねばならない。これを自動調整するために、接触時のフレームを取得する必要がある。アルゴリズム自体は動作実績があり、ポートタウンでも期待通りに動作するようになった。ゴールデンフォックスが最大の邪魔カーとなって立ちふさがる。デスウインド以外のグランプリではスタート時にGFが先行するのがデフォルトであり、どこでGFを抜くかは重要ポイントである。ポートタウンでは、少なくとも実機プレイで悩んだことはない。このタイミングでGFが絡むというのは、異常なのだ。普通は特に策を弄さなくても簡単に抜ける。本来抜けるタイミングで抜くことができず、極めて厄介な絡み方になっている。TASなのだから、もちろんこっちが遅いということはあり得ない。減速せずに抜くことは可能だが、接触せずに抜くことができない。この軽い接触で、減速はしないが左側に放り出され、どんなに右ハンドルを切ってもアウト側のガードビームに突っ込んでしまう。これは、厄介なことになって来た。22:18自動運転したい自動運転させると、数フレーム進行した段階で終了。これだけ見ると、ここで終了するなんてバグにしか見えない。実際は、ここからひたすら左旋回させても右ガードビームに接触してしまう。最高速未満なので、接触は即座にアウトだ。見た目と異なり、異様に当たり判定のキツい部分がここにある。先の自動運転は、旋回→直進のパターンだった。それを、直進→旋回に変更して実行。すると、もっと先まで進めたが、それで前進不能になった。手動で進行させると、特に苦労することもなくどんどん先に進むことが可能だ。単純アルゴリズムの自動運転では対処できないだけ。複雑な自動運転を試すか、それとも標準手順を元にした方式に切り替えるか。ポートタウンのこの部分は、デスウインド2で自動運転を試したとき念頭にあった。自動運転が有効だろうと想像していたのだ。現実は想定通りに進まない。過去の例に倣って折れ線走行を行ったところ、更に速くなった。着地寸前に車体とガードビームが重なりながら、それでも接触せずに降り立つのは気持ち良い。些細な差だが、これでこそTASだ。フレーム未満の罠は常に厄介で、最適化の手間を膨大に増やすばかりでなく事実上最適化を不可能にする。可能なのは、それなりの最適化でしかない。Luaスクリプトのバグは解消されていない。解消されている可能性がありそうなアップデートだったが、最大の問題はそのままだ。一度スクリプトを実行させると、エミュレーターを一度終了させて実行し直さねばならない。スクリプトの修正を繰り返す段階では、猛烈なストレス源であり作業効率を悪化させる。着地インベタに付くようなパターンを調べると、意外な結果が出た。ジャンプ時に右ハンドルを切らずに直進し、着地直前だけ右旋回するのが最速なのだ。普通に考えると、ジャンプ開始で可能な限り右寄りに進路を合わせ、ショートカットを可能な限り大きくするのが有利である。それなのに、ショートカットは小さい方が速い。これは恐ろしい話で、スクリプトがバグっている可能性が否定できない。差はかなり小さいし、ムービーを再生した限りでは不自然さはない。直進するだけとはいえ、ジャンプ台に乗る時点で若干の右寄り進路になっている。ジャンプの起点で更に右を向こうとしても、飛距離がギリギリ過ぎて着地時にインベタに付くのが困難になってしまう感じだ。ここから直進ハンドルで、ほぼインベタに付ける。このコーナーもデスウインド風味で、最初にインベタを意識すると少し先でコーナーリング困難になる形状かもしれない。19:03第2ジャンプ単純なジャンプだが、少しでもショートカットしたい。どのような軌道でショートカットするのがベストかというのは、はっきりしない。最高速に達しておらず、更にこのエキスパートと本番のマスターではソニックスタートの速度に差があるため飛距離も異なる。よって、キッチリと汎用に対応可能なスクリプトで調査せねばならない。1)ジャンプ台手前からAフレーム直進2)Bフレームの右ハンドル3)ジャンプしてCフレーム直進4)着地手前で右クイックターンをDフレーム5)直進してガードビームと接触しないことを確認という標準手順とし、変数ABCDを変化させて結果を見る。5)までOKだったら、適当なゴール座標との距離を調べる。以上のように書き出すと単純だが、実際にスクリプトとして動かそうとすれば問題山積となる。厄介なのは4)で、どのタイミングで右ターンすれば良いか、うまく絞り込まないと無用な探索を行うことになる。何度もスクリプトを動かして挙動を確認し、パタメーターを調整する。着地後にキッチリとインベタに付いて走行させるのも面倒。