HP最大維持

改造に慣れないうちは難しい内容だと思うので
ちょっとずつ読み進めてみて下さい。

このゲームはしばらくコンボの最大値などで探していても
どうしても目的の物が見つかりません
どうやらこのゲームはプレイ中のデータが実行ファイルではなく
外部ファイル(オーバーレイ)で扱われてるようです。

そこで改めてソフト開いてみるとOVERLAYというファイルがありました


「OVERLAY1.bin」はサイズが小さいのであまり関係はなさそうですが
「OVERLAY2.bin」はある程度の容量があるので
これがメインの外部ファイルであると考えられます。

しかしPS2DISで開こうとしても正しいアドレスから展開されません
正しい展開先を特定する方法は、パワフルプロ野球10で紹介したように
ファイルの先頭から8hの位置に展開先が書かれています
(このファイルの場合は003F5C80です)



外部ファイルも展開して、改めて解析を進めますが
03E7の最大値検索でコンボ関連のプログラムは見つかるものの
体力関連は整数でも、浮動小数点でも、どうしても見つかりません
他の情報を元にして根性サーチをするしかなさそうです(汗)
コンボのアドレスはあまり役に立たなかったので
見つかり易そうなプレイ中のデータに関連する他の物を探します

そこでプレイタイムのアドレスを探してそこから根性サーチをしてみます
1秒1カウントで考えて60で一分、3600で1時間、359999で99:59:59
殆どのゲームはプレイタイムに関し、最大値を超えてるかどうかの比較を
これより1多い数値の360000(00057E40)で行うのでこれで検索します。

その結果、この場所が見つかりました。

003D53C4のアドレスから$f2レジスタにデータをロードし
$f0に格納された00057E40(最大値)と比較しているので
003D53C4がプレイタイムのアドレスの可能性が高いです

プレイタイムらしきアドレスの数値は浮動小数点で扱われているようなので
(普通は浮動小数点で扱う事は滅多に無いんですが)
359999を単精度浮動小数点に変換した数値の「48AFC7E0」を
このアドレスに書き込んで値の変化を調べます

203D53C4 48AFC7E0
〜暗号化〜
1CACD4EC CCAFA805

試した結果、プレイタイムが99:59:59になっています
(七人の侍ゲーム画面より引用)


このアドレスを基に上下方向にアドレスをズラしながら
何度もHPなどに変化が出ないかコードを確認して行きます
その結果、ハングが連発する中でなんとかHPのコードが見つかりました
値はゲージ表示ではおなじみの浮動小数点で扱われています。

HP現在値
203D5354 43FA0000
HP最大値
203D5358 43FA0000
アドレスはどのステージでも共通のようです
管理場所が連続しているので同時にGPとRTのコードも見つかりましたが
解析手順ではHPのみの紹介なのでアドレスは省きます。


しかし、ワークコードではPARプログラムの割り込みの関係で
まれに割り込みをしていない瞬間に予想以上のダメージを受けて
現在値が0になってしまい死んでしまう可能性があります
そこで、プログラム面から無敵を作る事にしましょう
HP現在値のアドレスを参照先に設定してF3で参照箇所を探します。

いくつか見つかった中で、この場所の命令注目して下さい


00435870 lwc1 $f1, $003d5358
HPの最大値を$f1レジスタにロード

00435874 lui at, $003d
atレジスタに003D0000の値を格納、ワークアドレスの基盤

00435878 lwc1 $f0, $003d5354
HPの現在値を$f0レジスタにロード

0043587C c.lt.s $f0, $f1
$f0と$f1レジスタの値を比較する
$f0の値が$f1より小さければCフラグに1をセット
そうでなければCフラグに0がセットされる
このプログラムでは、HP現在値が最大値より小さければ1がセット
逆にHP現在値が最大値より大きければ0がセットされます

00435880 bc1t $00435894
Cフラグの値が1なら00435894に処理を分岐させる
0ならば分岐せずに処理が進みます

00435884 nop
遅延スロット

00435888 lui at, $003d
atレジスタに003D0000の値を格納、ワークアドレスの基盤

0043588C li v0, $00000002
このプログラム中では無関係の命令

00435890 swc1 $f1, $003d5354
$f1の値を003d5354のアドレスへ書き込む


ざっと各命令の動作を書きましたが
重要なのは、c.lt.s命令での比較結果によってbc1tの動作が決まり
それによってswc1命令を実行するかどうかという点です
この処理を見る限りでは、HPが最大値を超えてないかどうかを監視し
もしオーバーしているようであれば現在値を書き直す動作をしているので
bc1t命令を潰してしまえばswc1命令が実行され
HP最大値が現在値に書き込まれるようになります。


早速分岐命令を潰そうと思いますが、外部ファイルは
実行ファイルの後に読み込まれるファイルなので普通に
20435880 00000000
や
A0435880 00000000
を暗号化したコードでは余分な時にデータを書き込んだり
Aコードに至っては動作すらしません
どちらも何か悪影響が出ないとも言い切れません。

そこで、条件判定コードを一緒に使用して
外部ファイルが展開されてから書き込むようにしましょう
書き換えるアドレスの周辺にあまり見ない数値を探して使えば安全です

D0435878 00005354
20435880 00000000
〜暗号化〜
0CD6DBA0 14561471
1CD6DBA8 1456E7A5
条件判定を使ってるのでマスターコードは必要です。

コードを使ってゲームを始めてみると
ダメージを受けてもHPは最大を維持し続けるようになりました
ちなみにGPもRTも同じ方法で最大維持を作ることが出来ます。