FF2 の皇帝呼び出しを調べた

原理説明 (簡素)

  • 2人目がブリンクの本を武器として熟練度を上げたときに CPU address $62BA に data 0x0f (10 進数で 15) が代入される.
  • CPU address $62BA は聖堂で復活するときに起きるイベント番号で 0x0f は皇帝が出てきて最終戦となる.

イベント番号が代入される理由

  • CPU address $6200-$62ff は大半はプレイヤーキャラのパラメータ置き場.
  • その中で 0x40 byte ごとにキャラ #0, #1, #2, #3 (以降p) となる.
  • 武器としての熟練度は $6200-$620f + p * 0x40 にある.
  • 更新アドレスの計算は $6200 + p * 0x40 + index * 2. index の正常な値は 0 から 7 だが、魔法の本の武器としての index は不正な値で不連続で最小値 0 で最大値 0x64.
  • ブリンクのほんの index は 0x3d でキャラ #1 (2人目) だと $62ba が算出される.
  • CPU address $62ba にはもともと data 0x15 が入っているが熟練度レベルとしての最大値は数値で 0x0f (画面表示の数字は 16) なので 0x0f が代入される
  • CPU address $62bb も熟練度経験値として計算する. この変数は宿屋で宿泊したときに起きるイベント番号. 番号の振り方は CPU address $62ba と同じ. cheap 氏の 2021/2/23 での記述が参考になる.

変数領域の発掘

  • キャラのパラメータは 0x40 byte ごとと書いたが厳密には offset 0x34-0x3f の末尾の方は関係のないパラメータで CPU address $62ba がその例.
  • 自分が見つけたところでは CPU address $62f4 が 4 人目がいるかというフラグだった. ほかは用途が不明.

不正な武器での熟練度更新 address

下記2条件で総当りで調べた.

0 0xac 0x6234 | 2 0xba 0x6314
1 0xac 0x6274 | 3 0xb6 0x6332
0 0xb1 0x627a | 3 0xb1 0x633a
2 0xac 0x62b4 | 2 0x9b 0x6348
1 0xb1 0x62ba | 2 0xaa 0x6348
3 0xac 0x62f4 | 2 0xb4 0x6348
2 0xb1 0x62fa | 2 0xb9 0x6348
1 0x9b 0x6308 | 3 0xaf 0x634c
1 0xaa 0x6308 | 3 0xba 0x6354
1 0xb4 0x6308 | 3 0x9b 0x6388
1 0xb9 0x6308 | 3 0xaa 0x6388
2 0xaf 0x630c | 3 0xb4 0x6388
3 0x98 0x6310 | 3 0xb9 0x6388
3 0xa0 0x6310
3 0xa5 0x6310

アドレスの定義

  • CPU address $6044 ($6344) data bit2 = 1 とするとネリーが救出されたことになるが上記の方法では更新できない.
  • CPU address $6300-$631f は大雑把には位置、お金あたりが入っている.
  • CPU address $6020-$6047 ($6310-$6347) 辺りは大雑把にはゲーム進行のフラグになっている.
  • CPU address $6080-$60ff ($6380-$63ff) 辺りは大雑把には宝箱を開けたかのフラグになっている.

考察

  • 熟練度レベル最大値が 15 であることと皇帝が出てくる数値が 15 であることは偶然の一致で奇跡.
  • ほかの数値は進行上初期化している値があるような前提なので無理やり選んでも止まってしまうのに、皇帝が出てくる場面は必要条件がない. これも奇跡.
  • ブリンクの本を装備したときに更新するアドレスがイベント番号であることも偶然の一致.
  • バグの挙動に詳しい cheap さんの進め方は説得力がある. 長期間丹念に調べていることは驚異で彼の功績のおかげで発展できている.