GUC コードステーション情報
ソフト名 4-3.敵キャラ一撃死コード編
ソフト品番情報
ソフト対応機種 PS(PlayStaition)
改造対応ツール
投稿者(敬称略) D-RAM【GUC】
投稿者連絡先 mopro@jade.dti.ne.jp
登録日 1999/07/26
更新日 1999/07/26
サーチ環境
コメント 「何か動作がおかしい」とか、「こういうことができるコードが欲しい」
また、「ここはこうするべきでは」等のご意見がありましたら、お手数ですが
D-RAM【GUC】
e-mail mopro@jade.dti.ne.jp
までメールをいただけると大変ありがたいです。


4-3.技術コード作成技法(敵キャラ一撃死コード編) お次は敵キャラを一撃で倒せるようにする、 というコードについてです。 「敵キャラ一撃死」というと、攻撃したときに 敵キャラの体力をゼロにするようプログラムを変更する、 という方法がまず浮かぶと思います。 ただし、その方法は難しく、味方側まで一撃死になってしまうなどの 問題もあるので、あまり使用されていません。 よく使用されているのは、敵キャラの体力を最初からゼロにすることで 一撃で倒せるようにする方法です。 この方法では味方側には影響せず、しかも簡単に作成できます。 技術コードの中では最も易しい部類に入る、と言っても過言ではないので、 ○○減らない系、条件分岐操作系のコードが分からなくても大丈夫です。 敵キャラ一撃死のコードを作成するには、 まず敵キャラの体力のアドレスを探さなくてはなりません。 ここで厄介なのは、アドレスが可変である場合。 この場合でも、同じバトルシーンならば同一のアドレスになることが ほとんどですので、根気強く探すしかありません。 敵キャラ一撃死のコードで最も手間のかかる部分です。 例:ファイナルファンタジー8・敵キャラ一撃死 敵キャラの体力(1体目)のアドレスは、数値サーチの結果 800EEF58と判明しました。 どうやら、アドレスが変化することはないようです。 HBPの設定 Breakpoint Address:$800EEF58 Address Mask :$0FFFFFFF Event :Write Break Count :$0001 この状態でエンカウントした結果、 >$800205fc sw zero,$0000(a0) ;ゼロをアドレスa0+$0に4バイト分書き込み という部分でブレークしたようです。 これは敵キャラの体力のアドレスにゼロを書き込むことを意味しています。 しかし、メモリエディット画面で確認したところ、 敵キャラの体力はゼロではありませんでした。 つまり、目的の位置ではないということです。 800EEF58はバトルシーン以外は別のデータが入っているので、 データの初期化をしていたと考えるのが妥当でしょう。 そこで、再度HBPを設定し直します。 Break Countに0002を入れれば、2回HBPがヒットした時点で画面が切り替わる ようになります。 HBPの設定 Breakpoint Address:$800EEF58 Address Mask :$0FFFFFFF Event :Write Break Count :$0002 としたところ、 >$800a9ec0 sw v0,$0018(s1) ;v0の値をアドレスs1+$0に4バイト分書き込み 今度は別の部分でブレークしました。 ここでは敵キャラの体力のアドレスにv0の値を書き込んでいるので、 v0の代わりにzeroの値を書き込ませてしまいましょう。 zeroレジスタの値は何をしようが常にゼロなので、 プログラム位置が間違っていなければ敵キャラの体力はゼロになります。 敵キャラ一撃死では、HBPのヒットした命令を変更すればよいので、 プログラムを追いかける手間が全く要らないという利点があります。 また、今回変更する命令はswですが、shやsbになっている場合があります。 swは4バイトの値をメモリ内に書き込み、 shは2バイトの値、sbは1バイトの値、それだけの違いです。 swの対になるlwというのもありますが、意味は「メモリ内から4バイト読み込む」です。 例によってlhu,lhは2バイト、lbu,lbは1バイトです。 後ろにあるuの有無は、符号を考慮するか否かです。 さて、 sw v0,$0018(s1)を、 sw zero,$0018(s1)に変更するのですが、 命令を2進数に分解すると、 sw xx,$zzzz(yy) =10101yyy yyyxxxxx zzzzzzzz zzzzzzzz となります。 上の10101の部分は、sh命令、sb命令では別の値が入りますが、 ここで変更するのはxxの部分なので問題ありません。 xxxxxにzeroレジスタを表す0が入るので、 上位2バイトの下5ビットを0にする、 16進数でいうと0020単位で切り捨てることになります。 PAR用のコードでは、 800A9EC2 AE20 となりますが、ここのアドレスは場面によってプログラムが変化してしまうので Dコードを併用します。 Dコードの条件はアドレスの末尾が0,4,8,Cでかつデータ部分が8000未満、 今回は800A9EC0の0018が使えますが、もし駄目だった場合に いきなり10000hくらい離れた位置をDコードに使用するのは危険です。 隣のデータ、例えば800A9EBC、800A9EB8・・・という順に調べていくのが吉です。 ということで、ファイナルファンタジー8の敵キャラ一撃死は D00A9EC0 0018 800A9EC2 AE20 となりました。 これだけで登場する全ての敵キャラ(ボス含む)を一撃で倒すことが できてしまいます。あまり度が過ぎると外道扱いされてしまいますが・・・ 他のRPG、場合によってはアクション系でもできる場合があるので、 是非お試しください。 ------------------------------- まとめ 敵キャラ一撃死コードの作成法 HBPがヒットした命令を sw(またはsh,sb) xx,zzzz(yy)から、 sw(またはsh,sb) zero,zzzz(yy)に変更 =命令の上位2バイトを0020単位で切り捨てる 効果がなかった場合は、HBPの設定で、 Break Countの値を1増やして再度試みる。 敵キャラ一撃死コードでは、 敵キャラの体力にゼロを書き込むのを応用して、 攻撃力、防御力等をゼロにして弱体化したり、 獲得所持金をなくして厳しい現実世界を味わう(?)ことができます。



無断転載・無断商用利用・無断直接リンク禁止
ホームページサイト登録はこちらゲーム個別検索登録はこちら