F1レース(FC) 解析

プログラム概観

このゲームは内部にフレームカウンタを持っており、メインループ内の処理は奇 数フレームと偶数フレームで異なる。毎フレーム処理される要素は:

奇数フレームのみで処理される要素は:

偶数フレームのみで処理される要素は:

フレームカウンタをスキップさせる方法はおそらく存在しない(これができれば縁 石で減速しないようにするなどのことが可能そうなのだが)。

乱数

$2E, $30 の2つの乱数(ともに16bitで、生成アルゴリズムは同じ)が使われる。乱 数生成器はシフトレジスタの一種で、周期は65534。値 0x5555, 0xAAAA は出現しな い。なお、ポーズ中は乱数が変化しなくなるので、乱数シーケンスをスキップするこ とはできないと思われる。

コースクリア時も乱数はリセットされない。

乱数シミュレータを作成した(いくつかの乱数依存の値 も出力する)。

基礎知識

416km/h を超えるとターボ発動。

200km/h以上の場合、横移動すると速度が0.250km/h減少する。

基本的に速度が増すにつれて加速が悪くなるので、横移動が必要な場合は早めに 行った方が最終的な速度は上。ただし一時的に走行距離で不利になるので、どちらを 選ぶかはケースバイケース。

コーナーで上限速度を超えている場合、イン/アウトどちらにも曲がれない。上限 速度はカーブ値によって3段階あり、ゲームレベルにも依存する。

コーナー手前でイン側の縁石に大きくはみ出すのは基本的に損(ただし、これによ り減速なしでコーナーを抜けられるならば別。また、敵車の関係でやむをえない場合 もある)。

実際のレースと異なり、コーナーのイン/アウトどちらを走っても所要時間は同じ (速度その他の条件が同じならば)。

クラッシュ中や時間が切れた後でもゴールできる。

上下同時押しでギアをローにしつつ左へハンドルを切る。上左同時押しでギアを ローにしつつ右へハンドルを切る。

走行距離8ごとにコース区間が更新される。また、1周し終えた時点で走行距離は 一旦0にリセットされる。よって、周回を終える際は多少走行距離に差があっても帳 消しになってしまうことがある。また、走行距離を調整することでコーナー内にいる 時間を少し短くしたりすることもできる。

ゴールした瞬間に敵車が画面内に残っていると、敵車が消えるまで画面が切り替 わらないため、実時間ではロスになることがある。

ギアLOWの状態でクラッシュするとほぼ瞬時に速度が0になる。

テクニック

最速スタート

スタートシグナルが表示される前の灰色画面で1Fだけ入力を受け付けるフレーム がある(「フライングフレーム」と呼称する)。ここでアクセルを押して速度を 2km/h にした上で、RPMを最大(120)にしてスタートするのが最速。なお、キュルキュル言っ ている間はアクセルを押しても押さなくても同じ。また、200km/h未満ならば横移動 しても速度が落ちないので、x座標調整はなるべくスタート直後に済ませるのが望ま しい。

偶奇フレーム

走行距離は偶数フレームにおける速度から計算されるので、コーナリング時など はなるべく偶数フレームで速度が大きくなるようにすると速い。また、偶数フレーム では縁石判定が行われないので、コーナーの入口で一瞬だけインの縁石側にはみ出す こともできる。

奇数フレームにおける速度は走行距離には関係しないが、x座標や敵車のz座標に は影響する。

急減速

コーナーを抜ける際は減速が必要になるが、基本的になるべく一気に減速する方 が速い。ブレーキだけでなく、ギア操作やスリップも活用するとかなりの急減速が可 能。また、アウト側いっぱいに膨らんでから戻す場合、縁石も減速に使えることがあ る。

304km/hの壁

速度288km/h以上304km/h未満の区間は妙に加速が良い(これはバグのような気もす る)ため、加速中に304km/hを少し超えるような場合はわざと304km/h手前まで減速し てやると結果的に速くなることがある。

敵車調整

敵車は乱数1($30)が特定の値になったときに出現する。乱数をスキップさせる方 法は存在しないようなので、敵車を出さないということはできない。なお、z座標が 0x3000未満の敵車が存在する間は乱数1は変化せず、新たな敵車は生成されない。z座 標が0x3000未満の敵車が存在しない場合、敵車の空きスロットの数だけ乱数1が回る。

敵車の車線変更は $98-$9A に依存する。LV3の場合、これらの値のbit6が立って いると左へ、さもなくば右へ移動する。この値は対応する敵車のz座標が0x8000未満 である間インクリメントされ続ける。

なるべく邪魔にならないように敵車の車線を調整する必要がある。速度調整によっ てある程度は $98-$9A を直接制御できるが、これだけではうまくいかないことが多 い。しかし、乱数1の変化量を調整する(敵車のz座標が0x3000以上になるフレーム、 または敵車が画面外に出るフレームをずらす)ことで、間接的に $98-$9A を制御でき る(乱数1の変化量が変わると次に出てくる敵車の番号が変化するため)。

その他

起動後5F目にスタートを押すとタイトル画面を飛ばしてレベル1が開始する。また、 起動後4F目にスタートを押すとポーズがかかり、10F目前後で解除するとタイトル画 面がバグる。

ソースコード読解

md6502オプションファイル、およびソースコー ドにコメントを付けるdiff差分を作成した。使用法 は以下の通り(md6502-mod およびUnix 的環境が必要):

  # 事前にPRG-ROMを切り出しておくこと
  $ md6502-mod F1Race-PRG.bin F1Race.asm @F1Race.conf
  $ patch F1Race.asm < F1Race.diff

なお、オプションファイルはFCEUXで採取した CDLログを元に作成した。

TAS制作支援スクリプト

script.zip

F1Race-info.lua で画面上に各種情報を表示:

F1Race-info.lua screenshot
POS
自機x座標。縁石に当たっている場合 "curb!" と表示する。
SPD
自機の速度。右側の値は加速値、エンジンブレーキ値、およびその和。
RPM
エンジン回転数。スタート時以外は特に意識する必要なし。
DIS
走行距離。距離8ごとに区間(WAY)が更新される。
WAY
現在走行中の区間。左側の数値はカーブ値。カーブ値によっては横移動可能な上限速度も表示。
ENM
各敵車の (x,z) 座標。
ACT
各敵車の挙動。かっこ内が "L" ならば左に、"R" なら ば右に動く(LV3の場合、値のbit6が立っていると左)。また、乱数1が現在何番目の 値であるかも表示する。

F1Race-log.lua でムービーから一連の内部データ(速度、走行距離など)をファイ ルに書き出す。以前のムービーとの厳密な比較を行いたい場合などに。

各種資料


Back