Home > スポンサー広告 > FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 前編

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント: -

Home > スポンサー広告 > FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 前編

Home > PSP memo > FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 前編

FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 前編

FF零式のショップ全開コードを作って欲しい、
もしくは作り方を教えて欲しいという拍手コメントが
あったので書いてみる。
うちで聞くより、もっと解析力の高い人に聞いた方が
いいんじゃないかと思いますが…


PSP環境だとPMEtanという超強力なツールがあり
PMEtanのテーブルサーチを使えば比較的簡単に作れる。

このテーブルサーチが無い環境の場合は、購入した時に
アイテムスロットに書き出すところから延々と遡るか
品揃えを変化させたセーブデータを作って
アイテムが変化した場所をサーチするか
メモリダンプしてバイナリエディタで比較するなど
多少面倒な手順を踏む必要がある。
PMEtanは偉大だわ。


FC2拍手はFC2ブログアカウントを保持していないと
拍手出来ない上、FC2拍手コメントはFC2ブログ管理者以外は
見ることが不可能な意味不明仕様。なんでだ。



■用意する物

MIPSアセンブラの知識
PMEtan v1.47
ps2dis
psplink改


■手順0

ショップで表示されるアイテム種類は、ショップを開いたときに
テーブルからアイテム番号を拾って表示する種類を決定する。
この仕組みはどのゲームでも細部の違いこそあれ、おおよそ同じ。


▼ショップアイテム種類決定関数
1.イベント開放フラグ(イベント進行状況が書かれている)を読む。
2.フラグから表示させるアイテム番号を生成し、テンポラリに書く。
3.ショップを開くと、テンポラリに書かれたアイテム番号を読む。
4.店番号IDを読む。(この店では表示させるかどうか)
5.その他フラグを読む。(これが無いゲームもある)
6.アイテムカテゴリID(武器かどうかなど)を読む。
7.最終的に表示するアイテム種類を決定。


零式の場合は1-7まで全部あるが、実装はゲームによって若干異なる。
3のタイミングでアイテム番号を生成するゲームも多い。
他のゲームだとお店が全部共通だったり(4が不要)
アイテム番号が全部連番でカテゴリの区別がなかったり(6が不要)する。


1のフラグを全開にしただけでは、通常プレイで表示出来る限界と同じ。
1はフラグ処理でよくあるパターンなので説明は割愛。

lw	a1,$0000(a0)	a1=フラグ読み込み
srav a2,a1,t0 a2=a1フラグ右シフトt0回
and a3,a2,t1 a3=a2 and t1
bnel a3,zero,jrの行 a3<>0だったらv0=1、jr raの行へ
ori v0,zero,1
jr ra
nop


2以降を見ていく。





■手順1

アイテムIDは、ショップでアイテムを購入し
同じスロットで変化させればすぐに分かるので
前もって調べておく。

アイテムIDを調べる手順としては以下の通りに行う。
アイテム個数がサーチしやすいのでまずこれを特定し、
アイテム個数アドレスのそばをエディタで目視するのが簡単。

1.アイテムAを1個買う
2.固定値サーチ1
3.アイテムAを1個買う
4.固定値サーチ2
…繰り返して、アイテム個数を格納するアドレスを特定。

アイテム個数のそばにアイテム番号を配置している場合が
普通なのでメモリエディタでアイテム個数のアドレスを開いて
近くのアドレスを確認して数値を見ながら推測したら
実際に数値を変化させて正しいかどうかを確かめる。

その後は必要な分だけアイテム番号リストを作っておく。
PMEtanのテーブルサーチにはヒット件数を下げる意味で
4つあったほうがいい。
また、00や01やFFなど、頻出する値は避けた方が良い。
今回必要なのはこれだけ。(イスカのお店の場合)

0xD002	シルバーバングル
0xD014 銀の指輪
0xD026 くろがねの小手
0xD035 続・炎魔法中級






■手順2

PMEtan起動。

Optionタブに入りRealAddress ONに設定。
解析する際はリアルアドレスしか使えないので
計算を省くためにもリアルアドレスにしておく。

何かのアドレスが分かったとして、
例えば、0x01345678+0x08800000=0x09B45678 というような
バーチャルアドレス→リアルアドレス変換の計算を
毎回行いたいのであればOFFでも構わない。


AddressRangeを設定。
一般的なワークアドレスとしておおよその範囲を設定する。
MIN:0x08C00000 MAX:0x09F00000


テーブルサーチを使用する。
『Table Only1st』を選択して○を押す。





■手順3-1

PMEtanのテーブルサーチに値をセットしていく。

v0には1番目の値を入れる。(シルバーバングル)
v1には2番目の値を入れる。(銀の指輪)
v2には3番目の値を入れる。(くろがねの小手)
v3には4番目の値を入れる。(続・炎魔法中級)


Modeは0x2。
アイテム番号が等間隔で並ぶのが普通。


Numは0x3
v1-v3まで3つ使う。


TWは0x0080(初期値)
ショップの場合、次のアイテムは最初のアイテムのアドレスの
すぐ隣に配置されるのが普通なので、大きい数字を入れる必要が無い。


検索モードは次の順に試す。
小さい数字の方が検索に時間がかかるのと
アライメントに沿わない形で配置すると
取り出すときも面倒でlwrはめったに使われない。
4ByteModeSkip+WildCard→2ByteModeSkip→1ByteMode





■手順3-2

検索結果が4つ表示された。
↓を押してResult側にカーソルを移動させたら
アドレスを選択、□+→でMemEditに追加する。





■手順4-1

どのアドレスが正しいかMemEditで確認する。
ハイライト表示させるためにValue Markerの値を変更する。








■手順4-2

Value Markerの値を次のようにセットし、bit数も変更する。

0x00000002	2
0x00000014 2
0x00000026 2
0x00000035 2


0x02,0x14,0x26,0x35の値が赤い文字で表示されて分かりやすくなった。
手順3-2に戻り、どのアドレスが当たりか見比べる。
0x09D6FD18か0x09D6FFC4のどちらかがおそらく当たり。

根拠は2つ。
1.間隔が離れていない
2.0xD0yyのD0の部分が含まれている。





■手順5

どのアドレスが当たりかどうかを確かめる。
実際に値を代入して、ショップのアイテムの変化を見る。
0x09D6FD18を02→FEにしてみる。





■手順6

ショップに入り直して、アイテムを確認してみる。
シルバーバングル(0xD002)→アギトの証(0xD0FE)になったので当たり。
当たりのアドレスは0x09D6FD18(イスカのお店の場合)ということが分かった。


ショップアイテム参照テーブルのアドレスが分かったということで、
進行状況としてはショップ全開コードの入り口までやっと辿り着けただけ。
この後はこのアドレスにブレークポイントを仕掛けて解析する。


後編に続く。





関連記事
スポンサーサイト

コメント: -

Home > PSP memo > FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 前編

Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。