FF3 でバグを使って最速クリアする方法その2

メモリアドレスの絞り込みが出来た。

イベントフラグ

$74d0 -> $0050 に書き込まれた値で例外的なイベントが発生する。値は下記のようである。

  • 0x00: なにもおきない
  • 0x01-0x7f: お店
  • 0x80: opening
  • 0x81-0xff:「さいしょは なにもない むのせかいだった...」

この変数は重要ではない。

スクリプトポインタ

スクリプトかマクロかは実装した人による気がするが、とりあえずスクリプトと呼ぶ。変数は $74ec -> $006c (1byte), $74f2 -> $0072 (2byte) の3byte.

  • $006c script execute flag (0:停止, 0以外:実行)
  • $0072 script execute pointer (little endian 16bit)

動画のようにバグらせると ($006c) = 0x07, ($0072) = 0xe49c が代入されるらしいので、$0050 の処理が終わったら、 $e49c から順番にイベントデータとして取り込む。
$e49c は ROM の固定バンクなので data は常に下記に並ぶ。

$e49c               $e4a0               $e4a4
--------------------------------------------------
0x03 0xf0 0x09 0xa5-0xa5 0xf0 0x05 0xdd-0x06 0x71

この中で重要なのが address:$e4a3 の data:0xdd でこれもたぶん不正値だと思うが、これを読ませるだけでエンディングが始まる。やはり、セーブが出来ない屋内でのみ有効。$8000-$bfff の可変バンクが関係しているかもしれない。

もっと早めると、キャラの名前の先頭の文字を「ト」(0xdd)にして ($0072) = 0x6106 (名前のアドレス), ($006c) = 1にするだけでエンディングに行く。移動画面で zero page を破壊するよりかは、戦闘経由で $74ec 付近を破壊した方が早いかもしれない。

スクリプト自体は $a000-$bfff の値を設定して画面が切り替わらないイベントをいろいろやっている。ここも可変バンクだし、スクリプトにもポインタが入っている可能性は高いので、町とかダンジョンのバンクを正しくやらないと動かないと思われる。

やるべきこと

  • 屋内で戦闘を開始する
  • $74ec に 0 以外を書き込む
  • $74f2 と $74f3 に 0xdd を含むアドレスを書き込む
  • 戦闘を終わらせる (普通に倒すだけでよいし、各種強制終了を使っても可)
  • メモリ破壊の傾向をつかむ (一番大変)

メモリ破壊は一番よくわからないのにどういうわけかエンディングまで持っていくことができることを見つけたのは奇跡だと思った。