フォーカス&体力関係 今回は内容が解析上級者向けになってます 初心者の方には分かり難い説明になるかと思いますが あまり上手く書けないのでご了承ください(汗) まずは、お決まりの最大値検索です 体力やフォーカスの最大値であろう「100」 しかし、表示はゲージなので整数ではなく 浮動小数点で管理されていると思われるので 100.000000を探す事にしましょう 100.000000を16進数に直すと42C80000 この上位4ケタの42C8で検索して候補を探します 探してみると、かなり大量に候補が出てきます プログラム部分だけでも200個所以上はあります(汗) すぐ断念したくなるような候補数ですが 根気良くこの中から怪しい場所を絞り込みます。 その中で非常に怪しい場所が 001d416cでヒットした周辺です (画像の大きさの問題で体力部分のみ)lwc1 $f0, $0354(s3) lwc1 $f0, $0364(s3) の2つの命令で読み込んだ値と 100.000000とを比較し、その結果によっては sb v0, $000f(s2) sb v0, $0010(s2) の命令で0064(100)に修正されるようです 42C8と0064両方とも最大値らしき数値で 浮動小数点値を整数に直してストアしたりと 何かと動きの怪しい関数です。 試しに分岐命令を潰してみて ゲーム中何か変化があるか確かめて見ました ダメージを受けてみる・・・変化無し フォーカスを使ってみる・・・変化無し 時間を経たせて回復させてみる・・・変化無し マップを切り替えてみる・・・体力&フォーカス回復 ビンゴ!! どうやらマップ切り替え時にここで値をチェックをして 修正するかどうか判断しているようです 調べてみた所 lwc1 $f0, $0354(s3) は体力の現在値を読み込む命令 lwc1 $f0, $0364(s3) はフォーカスの現在値を読み込む命令と分かりました しかし、探したは良いのですが 常に減らないようにしないと使い勝手が悪いです そこで、この解析結果を基にして 数値を減算している命令を探す事にしました フォーカスの値を最大値と比較していた関数では lwc1 $f0, $0364(s3)で値を読み込んでいました この読み込みアドレスの数値、0364を数値検索で調べます 理由は、経験上こういう時は読込先を指定する時に 他の関数でも同じ方法で数値を読み込む事が多いからです 探すものは、lwc1 $??, $0364(??) ??の部分は一致すると限らないので不明です 値をロード後に減算している場所を探します 検索した中で、怪しい場所が見つかりました 00294864 lwc1 $f1, $0364(a2)です
このすぐ下で数値を減算し 同じアドレスに値をストアしています 早速減算命令をnopにしたらフォーカスが減らなくなりました 体力の方も同じ様に探すと、見つかったは見つかったのですが・・・ どうやら敵の体力も同じ命令で管理されていて 敵も無敵になってしまいます 敵も味方も同じ命令で扱われる事は多いので 解析中に考えていた方法を使ってみることにします 先程のマップ切り替えで触れたとおり lwc1 $f0, $0354(s3) は体力の現在値を読み込む命令なので フォーカスのアドレスとは10hのズレがあります 敵はフォーカスを使う事は無いので フォーカスの部分に体力を回復するプログラムを割り込ませれば 自分だけ体力減らないが可能になると思われます。 色々と数値の変化を調べてみた所 フォーカスが回復するには一定時間が必要で 初期設定の時間と経過した時間を照らし合わせて 初期値を超えたら、回復させるプログラムを通過し回復する という仕組みになっている事が分かりました
この画像のマークしている命令が(灰色部分) 回復プログラムを通過するかしないかを決める分岐命令です 回復させるさせないに関係なく 00294978のアドレスから下は通過するようなので ここに体力MAXのプログラムを割り込ませます また上手い具合にnop命令が存在します 是非埋めて下さいと言わんばかりの作りです(笑) 体力の最大値がa2レジスタ+0358h 現在値がa2レジスタ+0354hの場所に存在するので こんな感じで割り込んで見ました
動作確認をしてみた所、タイミングの関係で 一瞬ダメージを受けると98%と表示されたりしますが すぐに100%に回復して死ななくなりました 思惑通り、プレイヤーだけ無敵の完成です