減らない系コード(+即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で潰してみると・・・ 体力もグリムゲージも、コインも減らなくなりました 今回は実際に解析するのとほぼ同時進行で書いていた物です なので手順や予想、行動などが実際の手順と全く同じになっていて 普段どうやって探しているかが一番感じやすいと思いますが いわば自分のペースでやった物をそのまま書いた感があるので (もちろん講座用に調べ直した部分などもあります) 一部分かり難い部分があったらすみません・・・ (そもそも全体的に分かり難いですけど(汗))