(SFC) DQ1, DQ2 TASの補足 [サブフレームリセット]


 スーファミエミュレータはいくつも存在していますが、サブフレームリセットが実行可能なエミュはまだあまりありません(そういう意味ではエミュ依存です)。
 今回はTASVideosでも推奨されているLsnesを使用しました。
 Lsnes rr2-β23のSRAMは初期値がFFで埋まっているので、以下はそれを前提に説明します。実機はどうなの?とコメントも頂くのですが、気になるようならご自身で実機を使って確かめてください。Lsnesは現行エミュの中では最も実機に近い挙動をするといわれていますので、私はそれを信じます。
 なお、SFCドラクエ1,2は同一カセットに収録されており基本的なシステムも共用しているので、以下で説明する内容は1,2共通です。

SRAM(セーブデータ)の概要

どの項目も左からDQ1:冒険の書1,2,3・DQ2:冒険の書1,2,3の順となっています。
$0002~$0007
 冒険の書の有無です。あり=01、なし=00となっています。
 ちなみに「呪いの音楽」が流れた時や冒険の書を「消す」時は、実はここが0100に変更されるのみで、以下で説明するチェックサムやセーブの中身そのものは全く変更のないまま残っており、いわゆるエラー処理は一切ありません。
 いわゆるエラー処理が一切されない点が本攻略の鍵の一つとなりますが、これはゲームによって異なっており、例えばFC版ドラクエ4では全てを4Bで埋め尽くす処理が入るようです。
$0008~$000D(進行),$000E~0013(名前)
 チェックサムです。進行データと名前データにそれぞれチェックサムが用意されており、各冒険の書ごとにその2つが合致しないと呪いの音楽が流れます。

 なお、チェックサムの計算方法は対象範囲の単純な総和です。
$0014~$01B1

 名前データです。$0014~$0058,$0059~$009D,…とセーブ毎に69bytesずつ格納されています。
 濁点・半濁点を分けているもの(DQ1初期能力決定用?)と、濁点等を含めて1文字で管理しているもの(表示用)とがあり、名前の終わりには必ず終了を示すFFが挿入されます。
 セーブのコピー途中でサブフレームリセットを使用したデータでは名前データが全てFFで埋まる場合があり、その場合は名前が一切表示されない名無し状態となりますが、ゲーム進行に支障はありません(少なくとも本TAS動画中では)。
$01B2~$13B1
 進行データです。$01B2~$04B1,$04B2~$07B1,…とセーブ毎に768bytesずつ割り当てがあります。

SRAMへの書き込み順序

 状況によって少し順番が異なります。
冒険の書の新規作成・王様等でのセーブ
 冒険の書の有無→進行→名前→チェックサム の順に書き込まれます。
「うつす」でのセーブコピー
 冒険の書の有無→チェックサム→進行→名前 の順に書き込まれます。

サブフレームリセットでのセーブデータ操作

核となるデータの作成1(正常データ
(本動画ではどちらも冒険の書2に作成)
 進行データにサブフレームリセットを加えていない、いわゆる普通にゲームを開始した状態のセーブが最低1つは必要と考えています。
 理由としては、進行データの途中でリセットをすると名前データおよびチェックサムが書き込まれません。つまり、名前は全てFFで埋まり、チェックサム保存値もFFとなるのですが、名前がFFで埋まった状態のチェックサムはFFではないため、必ず呪いの音楽が流れてセーブがないものとみなされてしまいます。
核となるデータの作成2(進行データの後半をFFで埋めた不正データ
(本動画ではどちらも冒険の書3に作成)
 最終的に正常な値FFとを交互に上塗りしていくために、冒険の書として選択できる「一部をFFで埋めた不正データ」が核として必要になります。
 セーブのコピー途中でサブフレームリセットをすることで、進行データの後半をSRAM初期値であるFFのままに出来ます(もちろんチェックサムが合うタイミングでリセットする)。
 このデータを冒険の書として認識させるためには正常データをコピーします。進行データの途中でサブフレームリセットをしても、「うつす」でのセーブコピーはチェックサムが先に書き込まれるため、名前チェックサムにも不都合が生じずに核データの作成ができます。
 ただし名前データ自体は書き込まれないため、名前が全てFFで埋まっている際のチェックサムにあらかじめしておく必要があります。
 その際の名前チェックサムはBBで、対応する名前はDQ1では「か」DQ2では「ふ」です。他にも該当する名前はあると思いますが調べていません。
進行データの捏造
 正常データ不正データを交互に上書きしていくことでデータの捏造を行います。SRAMの上から下に向かって書き込み処理がされるので、最終形にするには最下部から徐々に残してゆく形をイメージしてください。
 なお、セーブコピー中のサブフレームリセットを行う度に、「タイトル画面でDQ1か2を選んで、該当タイトルのロゴが一瞬出て、(ほぼ全ての場合でチェックサムが合わないので)呪いの音楽を聞いて・・・」と、かなりのタイムロスが生まれてしまいます。
 本動画のDQ2は強引にデータ作成を行ったのでリセット回数がかなりの数になっており、時間的ロスも凄まじいし何よりも呪いの音楽をたれ流しすぎなのですが、今回は通常のオープニングを見る時間(5分超)よりも速ければひとまずOKとしました。

バグアイテムID:7Fでのワープ

アイテムの仕様
 DQ1,2でのアイテムの仕様として、「装備状態」のアイテムは元々のアイテムIDに80が加算されます。例えばDQ1のかわのたてはID:0Fですが装備することでID:8Fになります。
 アイテムリストを見ていただくと分かるのですがアイテムIDは65までしか割り振られておらず、装備状態として80を加算しても他のアイテムIDとは競合せずに判別が出来るようです。
ID:7Fへの変化
 データ捏造でアイテムID:FFを持たせた場合、ID:7Fを装備した状態として認識されています。つまり装備解除をすることでアイテムはID:7F(アイテム名:「なし」)へと変化します。
 このID:7Fワープアイテムとして利用することができ、過去に投稿されたTASやRTAの動画で使用した物と偶然同じアイテムIDです。(今まではマドハンドバグを利用してアイテムを生成していました。)

 ワープアイテム7Fの細かい仕様を知りたい方は「やる夫がDQ2で最強データを目指すようです」の810-830あたりを、ワープ可能位置とワープ先を知りたい方は「SFC版DQ2 ワープポイント」(DQ1にチェックを入れると1のマップも見られます)をご覧ください。
 余談ですが調査中の頃、「そういえばアイテムFFって7Fになるし、ワープできるなあ。何かに使えるかな」的な呟きをしたところ、上記動画の両名からほぼ同時に「それあればDQ2バグでクリアできます。過去に使ってます。」的なコメントが速攻返ってきました。自分ひとりだったらクリアまでの道筋に気付かなかったかもしれません。ありがとうございました。
ID:7Fの利用
 DQ1では城の2階から1階に降りるため、DQ2では幻ローレシア城での「夢落ち状態」を回避しつつエンカして全滅するために利用しています。
 DQ1は降りるだけなのでワープアイテムがなくてもクリアできそうに思えるのですが、王様の正面に回れないため地味に詰みます。

マップチェンジバグ

条件
 通常フィールドマップ以外のエリア80以降に出現するとエンディングに移行することがあります(100%ではない)。通常ではありえない状況ですが、アイテム7Fでワープすると本来情報が書き換わるべきタイミングで書き換わらないため、このような状況が生まれる場合があります。
 今回のDQ2は、リレミト情報をマップ92ロンダルキア)・エリアFFにすることで実現しています。
実行手順
 フィールドから施設に入るとリレミト情報が書き換わります。リレミトマップをロンダルキア92へ変更するには、単純にロンダルキアマップから城等に入ればOKです。
 また、全滅するとルーラ情報をリレミト情報へと上書きする処理が入るのですが、なぜかエリアと座標のみが上書きされリレミトマップは書き換わりません
 つまり、リレミトマップをロンダルキア92にしたあとに全滅したことで、あらかじめデータ捏造で用意しておいたルーラエリア情報FFリレミトエリアFFへと上書きされ、一方リレミトマップは書き換わらず92のままとなるので、バグの条件を満たします。
 あとはリレミトをすれば…というところなのですが、本動画の全滅後に再開した真っ暗なバグマップは外に出ると偶然リレミト扱いになっていたので、特に考える必要はありませんでした。
 ちなみにバグマップを利用しない場合は、アイテム7Fのワープで出入口が1つしかないダンジョン(湖の洞窟等)にワープし、外へ出ることでリレミト扱いとなります。
 なお、ルーラ・リレミトの仕様説明は「やる夫がDQ2で最強データを目指すようです」の824,964-970あたりもご覧ください。

サブフレームリセットで関わったSRAM

 動画内で述べたこととそんなには変わりませんが、見やすいようにこちらにも書いておきます。なお一ヶ所動画での説明に誤りがありました。うろ覚えで書いててすみません。
DQ1冒険の書1)
 $023A:オープニング(最初の王様のコメント)フラグ。FFにすると王の導入コメは無くなるけど人外の言語を延々しゃべり続けるマンになります(詰み)。
 $0270:主人公の所持品1番目のアイテムID(~$0279が10番目のアイテム)。WRAM$0CBE~0CC7に対応。
 $02A3竜王撃破フラグ。毒沼が花畑となりエンカもしなくなります。
 $02A6:世界の半分フラグ。リムルダール宿屋で悪夢から復活。が、オープニングフラグがそのままだと、そのあと王様のOPコメントが割り込んできます。王様強い。
DQ2冒険の書1)
 $0B39:1以上でローレシア王がイベント用の位置へ移動。エンカしなくなります。WRAM$0C87。
 $0B3A:オープニングフラグ。0だとオープニング見てない扱い。
 $0B70:ローレの所持品1番目のアイテムID(~$0B79が10番目のアイテム)。WRAM$0CBE~0CC7。
 $0B98:パーティメンバー数。WRAM$0CE6。
 $0BA6:会話終了や全滅後にハーゴン城へ強制ワープ。
 $0BA7:動画内で「会話ウィンドウ閉じない」と書きましたが正しくは「呪いで王様の会話中に追い出される」の間違いでしたすみません。全滅後のハーゴン城から海に投げ出されてロンダルキアへ行けなくなるので、FFにしてしまうとうみでつみです。WRAM$0CF5。
 $0BB540以上でシドー撃破扱い。WRAM$0D03に対応。ちなみにWRAM$0C87=5ジャスト、$0D03=40以上で王様に話しかけることでもEDに行けるそうです
 $0C9D:$0C9B~$0C9Eが冒険再開や全滅時の再開場所(座標x,y,マップ,エリア)。結局FFを入れずに通常の値が一番使えました。WRAM$0DE9~$0DEC。
 $0CA1:$0C9F~$0CA1がルーラ情報(座標x,y,エリア)。マップ情報はありません。WRAM$0DED~$0DEF。
動画で使ったSRAMプラン
DQ1冒険の書1$01B2~$04B1)


DQ2冒険の書1$0AB2~$0DB1)


ひとまず以上で補足を終わります。