Darkside(リンクエラー修正しました)

<< 前のページ

2016年9月28日(水) 21:14

S-JET 最適化

 初代 F-ZERO のスーパージェットは、複雑な仕様になっている。2年半以上経っているので、改めて説明しておこう。
 S-JET を噴射すると、一気に速度が上昇する。通常の最高速は内部メモリーの値にして 2304(16進数で0x900)だが、S-JET により+256されて 2560 になる。その後は1フレームごとに4ずつ減少し、2304 に戻ったらまた 2560 に増える。1周期は64フレームで、持続時間は255フレーム。4周期目で256フレーム目に 2304 に戻ったら、もう加速しない。

 内部メモリーに格納されている値と、画面の時速表示は比例しない。画面表示される速度は、ゲーム上の演出である。

 このような仕様であるため、速度が落ちてきた時にブレーキを掛けると速くなるのだ。
 次のサイクルに早く入ることができて、低い速度で走るフレームの割合が減少し、平均速度が上がる。
 適切なタイミングでブレーキを掛けるのは人力では至難であり、ここでTASならではのアドバンテージが発揮できる。ただし、TASであっても製作は極めて面倒だ。
 ブレーキを掛けた場合の減速は、速度2432(0x980)以上では15。それより遅いと14である。自然減速の4を睨んで、組み合わせを考えねばならない。組み合わせが悪いと、減速終了時に速度が2304を割り込んでしまい、速度ロスが生じる。

 更に、ダート上では速度が回復しない。周期の最後がダート上にならないよう調整せねばならない。

 まだある。
 ミュートシティーと異なり、デスウインドではガードビーム際で S-JET を使う。そうすると、意図的にガードビームと接触させることでブレーキ以上の減速が可能となる。ブレーキと併用することで、減速が16増える。すなわち、1フレームで31ないし30の減速。これで平均速度を更に上げられるが、実現するためのキー操作は遥かに複雑になる。

 トドメに、S-JET の後半は右コーナーリング。ここは、S-JET で速度が上がっているので曲がり切れない。ガードビームに突っ込んだまま走ると旋回性能が向上し、綺麗に曲がれる。しかし、常時ブレーキが掛かっているようなものだ。その部分では、平均速度を上げるための最適なキー操作がまた変わる。

 こんな感じでデスウインドの S-JET 最適化は、複雑に複雑を重ねたとんでもない作業である。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2016年9月27日(火) 21:29

直進するだけの簡単な仕事

 ダッシュプレートに乗ってしまえば、後はホームストレートを突っ走るだけ。走行ラインが少々異なっても、1周目23秒79は確定だ。マスタークラスならソニックスタートが速くなるから、これより短縮される。

 純粋に理屈で考えれば、ダッシュプレートに乗った位置からホームストレート終端の右端へと、ゆっくり斜め走行するのが最短である。しかし、F-ZERO
は非力な16ビット機で動作しており、走行角度の分解能が低い。微妙な走行角度の差が表現できない。
 だから人力では、ダッシュプレートとホームストレート終端の右端を直線で結んだ走行を行うのは無理だ。

 TASならば、自動運転スクリプトを使用して直線に近い走行が可能。
 現実には、そうやって直進しても、折れ線走行しても、タイムに有意差が出ない可能性が高い。しかし、動画を見る側からすると違う。人力では非現実的な頻繁なハンドル操作により小さな角度の斜め走行を行うというのは、人外を感じさせる効果がある。

 だが実際にスクリプトを動かすと、直線上を走ってくれない。角度が小さ過ぎて、ハンドル操作を変えても計算結果が同一になり、期待した判定結果にならないようだ。
 試走フレーム数を増やしたりあれこれ試すが駄目で、結局は目標座標を逃げ水にして解決。試走終了位置より少しだけ先の位置に目標座標を定め、走るたびに目標座標を少しずつ先に進める。目標座標は、ダッシュプレートとホームストレート終端の右端を結ぶ直線上のみに設定する。

 試走終了位置と目標座標が接近していれば、ハンドル操作による微小な位置の差が判定結果に現れ易くなる。こうして期待通りに、左右の小刻みなハンドル操作で小さな角度で直進する走行が実現。

 S-JET 噴射は、ダートの直前で行う。
 S-JET は極めて複雑であり、当然に別スクリプトで処理する。そこで、ダート直前でスクリプトを打ち切る。だが、どうやっても右ガードビームに突っ込むことになってしまう。
 調べると、試走時に S-JET を噴射させるタイミングが1フレーム早い。これを正確にダート直前まで待たねば、次のスクリプトが機能しない。

 ダートに突入したという判定は、減速の発生により可能である。しかし、ガードビームに突っ込んだ場合にも、減速が発生する。両者を区別するのが意外に厄介で、S-JET 噴射を手抜きして座標判定にしていたのだ。
 頑張って本来の判定で機能するようにスクリプトを修正する。面倒くさい。こういう細部がどれだけ面倒くさいかは、やってみなければ分からない。
 2点間を直進するだけの簡単な仕事に見えた今回のスクリプトは、大作業だった。

 ちなみになぜ S-JET 噴射が1フレーム違うだけで破滅するかと言えば、S-JET 噴射中は横風に流されないからである。実際には絶対に右ガードビームに突っ込むしかない初期状態なのに、S-JET を現実より1フレーム早く噴射してしまうと、1フレーム手前から横風が効かなくなって右ガードビームに突っ込まずに済む。
 それで大丈夫だと判定され、使い物にならない解が出て来る。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2016年9月26日(月) 20:57

後半半円の後半

 後半部分は、アクセルオフを含んだハンドル検索を行う。

 コーナー形状的に、中間部分でのインベタは困難だし速いわけでもない。

 クリッピングポイントから一直線にダッシュプレートを目指す。

 ここも、目標座標をどう設定するかが難問。
 ダッシュプレート座標の、真っ直ぐ先を設定する。

 ダッシュプレートの中央部分を目指すようにスクリプトを動作させ、直進安定する頃合で打ち切る。
 その後は別のスクリプトに引き継ぎ、2段階旋回だ。

 何フレームか右ハンドル、その後は何フレームか重心移動併用。これで、ダッシュプレートの右端に乗るパターンを探す。走行距離を短くするためだ。
 ついでに、アクセル瞬断を含めてやる。

 結果として判明したのは、アクセル瞬断のタイミングは最速に無関係だし、アクセル踏みっ放しでも変わらないということ。また、ダッシュプレートの端ギリギリを少々外しても速さは同じ。そこまで神経質に最適化しても意味がない。変わらない。
 極端に操作パターンが変わればタイムに影響するが、スクリプトで調査する意味がある範囲は狭い。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

<< 前のページ

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4