多重ポインタとはポインタのポインタってやつです。ゴッドオブウォーのページに書いてあるよなものです。サーチ方法がけっこうやっかいなのでよくわkらない場合は飛ばしても結構。
サーチ方法としては、
1.FREECHEATの検索鶴で試す。
2.MPS+ダンプファイルを複数用意する。
3.ブレークを使ってプログラム+ポインタをサーチ。
この3つぐらいしかないかも。1 2だと同じ記事になってしまうので3の方法
例:勇なま
とりあえず左上の養分なんかを数値サーチでだしてみます。この場合0xB588CC。
PSPLINKで"bpset 0x8800000+0xB588CC r"と入力します。
そのあとHITしたアドレス-**h(この場合0x8835E78)したところ"disasm 0x8835E00 80"と打ってプログラムを表示させます。
このときのレジスタ値も調べるため"exprint"と打って表示させておく。
でプログラムを見ると0x8835E78のJRの下 lw $v1,12($a0)でHITしてます。
レジスタ情報をみるとa0=0x93588C0になっているのでこれをサーチしてみると0x10D67ECにあることがわかります。この周辺にあるのは下の段のポインタだとアドレスを弄ってみるとわかる。
さっきと同じように0x10D67ECにrオプションでブレイクをかけると今度は0x8836488でHITしました。HITしたところはlw(4byte読み込み)なのでちょうどポインタの値をロードしているところです。このあとのv0が0x8800000+0xB588C0になるはず。jalで飛んだ先も前の結果でブレークしたところと近い+似たような処理(あとで記述*)+a0が同じなんで省きますがEXEブレークで0x8835E58のraの値をしらべても同じ結果になります。
この手前のほうにまた0x8836464にlwがあります、0x8836480で読んだ値v1にa2(=0xEC)を加算してるのでこのかわる前のa0がわかれば一歩手前のポインタがわかるということです。0x883647CでEXEブレークするとa0が0x8800000+0x1CC3E4とわかるわけです。ここは変動しないので最終的に養分(表面)は[0x1CC3E4]+[0xEC(a2はマップで変動)]+(v1の値=何列目*0x1C)+0xC
*raの戻りレジスタがちがうけど,比較するとほとんど同じなのでs0=0x8800000+0x1CC3E4と予想がつく。一応確認するとやっぱり同じ,JR━―━―━(゚∀゚)━―━―━―のほうからたっどても一応でるということで(ry。
オフセット0x8採掘フラグ
ra=0x88374ECなのでjalのアドレス0x88374E4,オフセット0xC養分
ーコード化-
0x6aaaaaaa 0xvvvvvvvv
0x000t000n 0x0000zzzz
0xS000iiii 0x00000000
[0x1CC3E4]+[0xEC(a2はマップで変動)]+(v1の値=何列目*0x1C)+0xCなのがわかったので、aaaaaaa=1CC3E4,vvvvvvvv=00000063,t=2,n=2,S=2,iiii=EC(裏面だと11C),zzzz=000C(魔分は0010)、1マスだけ99にすることができます。
シリアルはACTIONREPLAY/TEMPAR/FREECHEAT/PMETANしかできないので、他で使いたい場合はMIPSでねじ込む以外ありません。0x8835e60あたりにあるJR━―━―━(゚∀゚)━―━―━―をつかえばおk
見た段全部とかげ(ステージ前もONすると全段変化)
0x08835e60 0x0a200600 j 0x8801800 #空きメモリに飛ばす
0x08801800 0x00834023 subu t0,a0,v1 #常に左端のあどれすなるよう戻す
0x08801804 0x34090063 ori t1,zero,$0063 #書き込む値
0x08801808 0x340a003c ori t2,zero,$003c #横の列数
0x0880180c 0xad09000c sw t1,$000c(t0) #養分の場所にすとあ
0x08801814 0x254affff addiu t2,t2,$ffff #回数-1
0x08801818 0x2108001c addi t0,t0,$001c #次の養分のオフセット
0x0880181c 0x1540fffb bne t2,zero,$0880180c #t2回繰り返す
0x08801824 0x03e00008 jr ra #raに戻る