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も同じ方法で最大維持を作ることが出来ます。