フォーカス&体力関係
今回は内容が解析上級者向けになってます
初心者の方には分かり難い説明になるかと思いますが
あまり上手く書けないのでご了承ください(汗)

まずは、お決まりの最大値検索です
体力やフォーカスの最大値であろう「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%に回復して死ななくなりました
思惑通り、プレイヤーだけ無敵の完成です