前提として…
アニメティカでのデータ改ざん方法はおやつさんの動画がわかりやすいのでそちらを参照ください。
※とは言いつつも、改竄場所がよくわからないところもありましたので、後ほど補足します。
改竄アドレスなどは、下記URLの解析データを参考にしました。
http://emu.web-g-p.com/info/bbs/patchcode/psp/bbs.cgi?page_10=v
↑の「ゼノギアスの解析情報」下にあるzipファイル 中身はhtmlですが、開けない??のでtxtで開いてください。
データ改竄手順
- メモリーカードA・Bを用意。
- メモリーカードA ブロック1に消すようデータ、ブロック2に改竄用データを用意。
- メモリーカードAの2データをBにそのままコピー。
- メモリーカードAのブロック2をアニメティカで改竄、改竄後削除。
- ゼノギアスの別のデータをロード、メモリーカードAのブロック1にセーブ。
- メモリーカードの管理画面(PS2やPS1などの)にて、メモリーカードB、ブロック2のデータをAへコピー。
- コピー途中にメモリーカードAを抜く(コピー後0.4秒ぐらい?)
- 管理画面では破損データ扱いになるが、ロード可能。
- ロード後、別ブロックにセーブし直すことで正規データになる。
(例)フェイ Lv1の攻撃力と防御力を入れ替える
右:改竄前(攻撃:15、防御10)
左:改竄後(攻撃:10、防御15)
戦闘や、レベルアップしても特に問題なく動作しています。
※なおデータ改竄する場合、チェックサムが元データと同じになるよう調整する必要がある。
チェックサムを同じにする理由
ゼノギアスのセーブデータはチェックサムの参照内に人力では制御ほぼ不可能な可能性のある領域がある(プレイ時間をフレーム単位での管理?)。
おやつさん式で管理データまで上書き出来ても、セーブを途中まで上書きする関係上チェックサムがずれるようです。(管理データだけをバッチリ狙えれば可能かも??)
その為、改竄する箇所以外が完全一致する方法として、メモリーカード管理画面でのコピー方法をとった結果、成功した次第です。
改竄するアドレスのキャンバス座標算出方法
正直内容をよく理解していないので計算方法だけ書きます。
変更したい値が入っているアドレス
23E8(フェイ攻撃力)
セーブが入ってるブロックの先頭アドレス分を加算
23E8+2000=43E8 (例)2ブロック目=2000 3ブロック目=4000...
そのアドレスを10進数に変換
43E8 → 17384
その数値を8960引いて、288で割った 余り=X軸、商=Y軸
(17384-8960)=8424
キャンバス座標(X:72,Y:29)
エクセル式
16→10進数変換 =HEX2DEC(43E8)
商 =QUOTIENT(8424,288)
余 =MOD(8424,288)
この場をお借りして感謝を…
アニメティカを知る切っ掛けになった おやつ様
データ改竄を一緒にやってくれた リスナー様
データ解析をしていただいた 烏様 白鴉様 (神の使いかな?)
この方法を発案してくださった Palantir様 (神)
ありがとうございます!
これでまだまだゼノギアスをしゃぶりつくせますね(ニチャァ…
16進数変換
http://www.gs.niigata-u.ac.jp/~kimlab/hobby/conv-dechex.html
商と剰余を求める
https://keisan.casio.jp/exec/system/1510710795
PING値さんのGitHub
https://github.com/pingval/Speedrun/tree/master/AnimeMaker
PING値さんのWebページ
http://pingval.g1.xrea.com/
メモリーカードは1+15ブロックで構成、1Byteは8KiB=0x2000である。
0x0000~0x1FFFF:管理ブロック
0x2000~0x3FFFF:ブロック1
0x4000~0x5FFFF:ブロック2
Xenogearsのセーブデータ構造の解説ページは、ブロック1に保存されていることが前提のアドレスが記載されている。
チェックサム:
ブロック1ベースで、0x2000~0x20FFまではチェックサム計算範囲外である。セーブデータ用の経過時間はここに保存されている。
0x2100~0x3FFEまでがチェックサムの計算範囲である。チェックサム自体は0x3FFFに存在する。
このとき、0x2100と0x0201に経過フレーム数が存在する。そのため、通常の上書きではここを制御することは人力では不可能なのでXenogearsのセーブ機能を使うとほぼほぼ失敗する。
なぜメモリカードコピーにたどり着いたのか?
アニメティカの理屈ならば、セルフセーブの最中にメモリーカードを抜いた場合ほぼほぼ読み出せるデータが生成されるはずである。しかし、5回やってもうまくいかない。その場合、逆にうまくいかない確率が低いため仮定に誤りがあることが分かる。
0x2100~0x222FFくらいまで何が保存されているかはよくわかっておらず、ここになんらかの変動要素があると想定できる。仮に人力では調整不可能とした場合、「そもそも調整しない」ことが重要になる。
該当領域において、全く同じデータがあればそれで調整可能であうが、そんなデータ人力で作ることができない。そうなるとコピペが必要である。コピペ元データは作れるか?→メモリカードコピーならば作ることが可能、もしアニメティカRTAがPSのセーブデータ管理のコピーでも実施可能であるのであればこれが貫通できる。
Xenogearsのセーブデータ保存ロジックと、メモリーカードコピーのロジックが同じであることが重要であるが、メモリーカードアクセスはPS開発のSDKにあるAPIを叩いていることは想像にたやすく、それは普通に考えるとXenogearsもPSのOSも同じものを使っているはずである。なので成功する確率は想像上もありうる。
どうでもいいメモ:
おそらくメモカはNANDフラッシュメモリであると思われるが、その電気特性上(?)データ削除の範囲とデータ保存の範囲は異なり、データ削除時のほうが広範囲になる。従って、メモリーカードのロジックで削除→保存というロジックがどこかにあると理論が破綻したりすることがある。
チェックサムは対象範囲の合計値であることから、データ入れ替えをした場合変化しない。
従って、攻撃力と防御力を入れ替えることができる。
アイテム生成をする場合、アクアソル(01h)を指定個数持ち、アイテム種別と数を入れ替えると1個だけ個数があらわす足テムを生成することができる。でばっぐあいてむはアクアソル33個(22h)で生成可能である。
また、数値を256増やすとチェックサム回避が可能である。
フェイの攻撃力デフォルトは15(10h)で、防御力が10(0Ah)である。従って、攻撃力を143(90h)、防御力を138(8Ah)にするなどしてチェックサム計算を回避して能力アップが可能である。ただ、でばっぐあいてむが凶悪なためドライブでいじれない素早さ(最大16)等をいじることができるようになったことになる。
他には、増減の総和を0にすることでチェックサム回避が可能である。
リコの素早さ0x271Eが07hのため、これを01hにして、チュチュの素早さ0x2866(07h)を16(0Fh)にするとシタンを超える速度のチュチュと、リコよりも遅いリコが誕生する。
ギアの素早さにこれがどのように反映されるかは不明である。
もっと楽に改造するには
経過フレーム数0000h時に、初期データのチェックサムが何になるかを計算しておき、アニメティカでオフセットとしてそのデータを作れるようにしておく。あとは改造したいだけ改造し、最後に総和が256*nになるように経過フレーム数をいじればチェックサム回避ができる。有効範囲が0000h~FFFFhのため非常に制御しやすい。ギア入れ替え等やりたい場合はこのオフセットデータを用意しておけば、どういうデータが欲しいのかがわかればあとはExcelでどういじったらいいのかを計算することができる。
参考:
UG様:うぐらぼ
http://liveug.web.fc2.com/xenogears/knowledge.htm#001
Xenogearsではまだフラグ管理BITがわかっていない。従って、DQ7のようにいきなりEDへ飛ぶことができない。ここが分かればアニメティカRTAでEDワープが可能であるかもしれない。
ただ、セーブ位置とイベントフラグを調整しないとデウス前ワープ等はできないため、DQ7よりも操作するデータ総量は多くなりそうである。他の改竄RTAがどのように実施されているのかの調査を進めれば、なにか効率的なアイデアが出るかもしれない。
ありがとうございます!