減らない系コード(+即MAX)

このソフトはシンボルが残っているソフトであり
シンボルは同じ様な事柄は似たような名前で扱う事が多く
Aの要素を探すとBやCのヒントも得られるという
1つが2つに、2つが3つにと連鎖的な事が期待できます


最初は〜〜増加でMAXを探します
実際の手順「サモンナイト3」でも書いたような
「他のプログラムでも同じ要素を扱うときは
殆どの場合レジスタに+する数値が同じである」
という法則性(一部例外あり)があります
必ずしもそれが使える訳ではありませんが
このマキシモはシンボル残りのソフトなので
最大値チェックが存在するプログラムのシンボル名からも
少しでもヒントが得られるかも知れません。

基盤になりそうなコインの上限値で探そうと思いますが
画面上で見る限りでは99999以下の数値っぽいので
試しに1869Fの下4ケタの869Fで検索・・・ヒットしません
次は9999(270F)で検索すると何箇所かヒットしました
が、ちょっと変わった場所が検索に引っ掛かりました。

「GameVarTbl」というラベル(シンボル)が貼られています
そのまま日本語に訳すと
「ゲームのバーのテーブル」です(Tblはテーブルの略語)
ゲームのバーという事は、体力などに関係するのでしょうか?

早速、このテーブルから値を読み出している場所を探します
(テーブル管理についてはデビルメイクライ2参照)
すると、気になるシンボルが張られたプログラム内で
このテーブルを参照している場所がありました
このプログラムを良く見てみると
v1レジスタにテーブルのアドレス値を格納しています


v1にテーブルのアドレスを格納してから少し進むと
今度はv1レジスタ+0002hのアドレスから何かの値をv0へロード
その後lw命令でv1に別の数値をロードしてs0の値と加算し
slt命令でv0の値を超えていないかを調べて
もしv0の値を超えていたら分岐せずにdaddu命令で
s0レジスタにv0の値が格納されるようになっています

先程、GameVarTblでは270Fや03E8など
いかにも最大値っぽい数値が格納されていました
「v1レジスタ+0002hのアドレスから何かの値をv0へロード」は
それらの最大値を読み込んでいるものと思われます
という事は最大値チェックである可能性が高くなります
ラベル名も「GameVarAdd__6PlayerFUiii」なので(addは加算を表す)
ほぼ確実に最大値チェックであると考えても良さそうです

実際に分岐を潰して試してみます
A01655F8 10200001
〜暗号化〜
9C81D620 0436E7A6

すると、コインやカギ、グリムゲージなどが
増加と同時に最大値まで増えるようになっています
改造成功です。


「他のプログラムでも同じ要素を扱うときは
殆どの場合レジスタに+する数値が同じである」
を期待していましたが、lwで読み込んだ先が
s1+0000hなので、0000はどこでも検索に引っ掛かるので
今回はこの法則はあまり役に立ちそうにありません

しかし最大値チェックは「GameVarAdd__6PlayerFUiii」
減算プログラムもこの名前に似てると想定し
ラベル一覧でGameVarと入力して探してみると
「GameVarSub__6PlayerFUiii」という物が見つかりました
AddではなくSub、Subは減算の意味があります
これはもうビンゴですね(笑)
プログラムへ飛びます。

プログラムを調べてみると
subu s2, v0, s3
という命令で数値を減算する場所が2個所ありました
この2つの減算命令をnopで潰してみると・・・
体力もグリムゲージも、コインも減らなくなりました


今回は実際に解析するのとほぼ同時進行で書いていた物です
なので手順や予想、行動などが実際の手順と全く同じになっていて
普段どうやって探しているかが一番感じやすいと思いますが
いわば自分のペースでやった物をそのまま書いた感があるので
(もちろん講座用に調べ直した部分などもあります)
一部分かり難い部分があったらすみません・・・
(そもそも全体的に分かり難いですけど(汗))