* セーブデータ改造ツールの作成について ** 概要 セーブデータを改造する為のツール(以下改造ツール)の作成方法の解説 例としてNintendo DSのDQ5(以下DQ5)を例に改造ツールの作成の仕方を紹介します。 ** 言葉の意味 *** 数字の意味 数字は頭に0xが付加されていれば16進数、そうでなければ10進数とします。 (例) 10進数 → 15 16進数 → 0x0F と記載します。 *** アドレスの意味 セーブデータのファイルによってはフッターが付加されているものもありますが、 以下解説ではフッターを除去した状態のセーブデータであるものとします。 ** 始めに セーブデータを改造するという事は、 テキストエディタ等でテキストファイルを編集するのと同様で、 ファイルの中身を変更し保存する事を意味します。 では、何が異なるのかといいますと、 テキストエディタで編集する場合はデータを文字列として扱っている事になります。 改造ツールの場合はデータをバイナリとして扱う必要があります。 データの扱い方が異なるだけで、基本元のデータはどちらもバイナリです。 よって、データの扱いに注意する事を除けばテキストを変更するのと同様だとお考え 頂ければよいと思います。 ** 必要な知識 改造ツール作成の為には以下の知識が必要となります。2進法、16進法 プログラム チェックサム ** 便利なツール *** バイナリエディタ Stirlingがお勧めです。 私はこちらを愛用させて頂いています。 構造体編集がお勧め機能です。 *** 開発環境IDE Visual Studio 2005がお勧めです。 Visual Studio 2008でも良いのですが、 98系統の環境で動作しないようです。 私のスケルトンも2005で作成しています。 ** 作成手順 大まかな流れを以下に記載します。 差分比較 最低2つのセーブデータが必要になります。 更に変更箇所が少なければ少ないほど解析が容易になります。 よって、 教会でセーブ→セーブデータを吸い出す(これを『1』とする) ゲーム再開し即教会でセーブ→セーブデータを吸い出す(これを『2』とする) し、1と2のセーブデータの差分を元に解析をします。 ※例外として arm asm(アセンブリ 以下よりarm asm)から見れば良いのでは?とも思いますが、 時間やスキル等から考えると差分比較が容易に実現出来ると考えました。 しかし、どうしても差分から共通点が見つけられない場合はarm asmで解析をする事 になるかもしれません。 チェックサムの場所特定 ゲームはセーブデータ読み込み時にセーブデータのデータの整合性をチェックして いる事が多いです。 セーブ中にセーブデータが破損してしまった場合等に備え、正しくセーブデータを書 き込めたかをチェック出来る様にこの様な機構が存在しています。 また、整合性が崩れていた場合はセーブデータを破棄する処理が組み込まれている事 が多いです。 チェックをせずそのまま進めてしまうと変なフラグが立っている状態でゲームを継続 する事になります。 思いもよらない不具合が発生する可能性を未然に防ぐ為のチェックをする為の機構 になります。 このチェック方法としてよく使用されているのが ・加算 ・減算 ・XOR ・CRC16,32 となります。 ※複合で使用されているケースもあります。 ※DQ5の場合は『加算』になります。 セーブデータ番号毎のブロックサイズ特定 複数のセーブデータを保存出来る場合は、大抵ひとつのセーブデータに対する ブロックに大きさが設定されています。 セーブデータ1は400バイトだけれどセーブデータ2は700バイト等というパターン は、ほぼ無いと思います。 開発者もセーブデータのサイズは番号毎に変えない方が作りやすいはずなので 固定ブロックサイズになっているはずです。 ※実際のサイズと異なっても問題ありません。 ※改造ツール作成者が便宜上設ける値で構いません。 ※DQ5の場合は『0x3C00』になります。 ※また、各セーブデータの開始アドレスを以下としています。 ※セーブデータ1 『0x400』 ※セーブデータ2 『0x4000』 ※セーブデータ3 『0x7C00』 ※中断セーブデータ 『0xB800』 ※上記も作者が便宜上設定している値に過ぎません。 キャラクタ毎のブロックサイズ特定 キャラクタ毎に設定値(例:HP)を持っている場合、その設定値をセーブデータ に保持している事が多いです。 ※例外としてレベルを保持し、後は自動計算の場合等もあります。 また、DQ5の様に不特定のキャラクタを仲間に加えたりはずしたりするゲームの 場合はキャラクタ毎のデータを連結して管理している場合が多いです。 (例:主人公、ビアンカ、、、、) 更に、この設定値は値をそのまま保存している事が多い為、検索等で探しやすいです。 また、レベルが上がった時の変動値から推測する事が比較的容易です。 よって、 ・キャラクタ毎の設定値のブロックを見つける ・キャラクタ毎の設定値のブロックサイズ特定 ・キャラクタの設定値のブロックを見つける ・キャラクタの設定値のブロックサイズ特定 する必要があります。 キャラクタの設定値のブロックサイズ ÷ キャラクタ毎の設定値のブロックサイズ が、ゲーム内に設定できるキャラクタの上限である事も分かると思います。 ※DQ5の場合はキャラクタ毎の設定値の開始アドレスは『0x830』になります。 ※また、一人当たりの設定値のブロックサイズは『0x44』となります。 ※どちらもセーブデータ1の場合になります。 全体の設定値の場所特定 お金や、時間や、ゲーム中のフラグ(例:結婚)はキャラクタ毎に保持していても 意味がありません。 よって、セーブデータでもキャラクタ毎とは別のブロックに保存されています。 全体の設定値は厄介で、 ・アドレスが散っている事が多い。 ・調査し辛い。 ・値が意味を持っていない場合がある。 となっているので、キャラクタ毎の設定を見つけるより難しい場合があります。 これも差分から見つける場合は、イベント前のセーブデータとイベント後のセーブデータ を比較し、変更箇所から推測する事になると思います。 (※arm asmで見れる人はそちらからのアプローチもありです。) 上記をプログラムして全自動化 ここまできたら結果をプログラミングしてツール化するだけです。 ・ファイルの読み込み、書き込み機能搭載 ・チェックサム計算機能搭載 ・キャラクタの設定値変更機能搭載 ・全体の設定値変更機能搭載 ツールとして公開すれば、一人の苦労(?)によって、皆が幸せになる事が出来るはずです。 ** 最後に ここまで読んで頂いた方で、とりあえず作ってみたいなぁと思われた方の為に以下に、 DQ5の改造ツールのサンプルソースを置いておきます。 ※DQ5のサンプル公開停止. ※スケルトンに変更を加える必要があった為。 ※別途MarioRPG2のソースを参考頂きます様お願いします。