FC『ダブルムーン伝説』預かり所バグの実用化 その2

前回は、預かり所バグによってPTキャラIDを書き換えられることを示しました。では、PTキャラIDを書き換えられると何が嬉しいのでしょうか。

このゲームはDQ3のようにギルドで仲間の入れ替えができるため、セーブ時はキャラIDに対応したアドレスにキャラデータが保存されるようになっています。このため、キャラIDに対応するセーブデータアドレスのテーブルが存在します(セーブスロットは2つあるのでテーブルも2つある)。

このとき、キャラIDが正常な値(0x0C 以下)であれば問題なくセーブ/ロードが行われますが、異常な値(0x0D 以上)だった場合、このアドレステーブルの範囲外を参照することになり、結果としてセーブデータではない領域をセーブデータとみなしてセーブ/ロード処理が行われることになります。

キャラIDとセーブデータアドレスの対応を具体的に見てみます(異常なキャラIDも含む。キャラID最上位bitは無視されるので 0x7F まで):

後ろの方は明らかにおかしいアドレスが並んでいるのがわかります。ここで特に面白いのが $05A9 というアドレスで、以下の事実に注意すると:

  • イベントフラグは $05D2-$05E5
  • セーブデータに保存されるキャラデータのサイズは 0x46 Byte

$05A9 に対して「セーブ」を行うことができれば、イベントフラグ書き換えが可能ということになります。このアドレスに対応するキャラIDは、セーブデータ1では 0x7E, セーブデータ2では 0x70 です。

ならば、キャラデータを適切に設定した上でキャラIDをこれらの値に書き換えてセーブすればイベントフラグが書き換わってクリア可能…となりそうですが、残念ながら一筋縄ではいきません。$05A9 に対して「セーブ」を行う際のキャラデータとイベントフラグの対応関係を見てみます:

キャラデータ イベントフラグ
アイテム12〜14個目 $05D2-$05D4
未解析(2Byte) $05D5-$05D6
魔法1〜14個目 $05D7-$05E4
魔法欄(利用不可) $05E5-$05EE

ここで曲者なのが「魔法欄(利用不可)」の部分です。このゲームは魔法最大修得数が14個なのですが、なぜかその後ろにも修得魔法データ領域があり、セーブデータにも記録されます。この領域は普通は常に 0xFF になっていますが、チートで書き換えてやると戦闘中に14個より多くの魔法が使えることを確認できます。
ということは、普通のキャラデータを使ってイベントフラグを上書きする場合、$05E5 は必ず 0xFF になることになります。ところが $05E5 のbit3はサモイレンコ撃破フラグであり、このbitが立っているとラストダンジョンでサモイレンコが出現せずクリア不能となってしまいます。つまり、普通のキャラデータを使っている限り、前述のキャラIDを使ってイベントフラグを書き換えても決してクリア可能な状態にはならないのです。

では手詰まりかというとそうではなく、普通のキャラデータでダメなら「普通でない」キャラデータを使えばよいのです。先に示したセーブデータアドレステーブルは当然セーブ時だけでなくロード時にも使われるので、キャラIDを異常な値にしてからセーブ→ロードすれば、セーブデータではないアドレスから「普通でない」キャラデータがロードされることが期待できます。具体的には次回