内容
最大・最低値チェック
このソフトは最大値を指定、比較、修正という処理が固まって並んではいません。
他のソフトとやっていることはあまり変わらないのですが、16ビット検索をして最大値を見つけても
その付近に修正のチェックが入っていないのでわかりづらいという印象を受けました。
ではどの様な流れになっているのか。まずは最大値の指定部を16ビット検索で特定します。
ラベルへの参照がある為、この辺りはすぐに見付かります。
t0レジスタへ最大値を格納し、$001cc830へのジャンプ先でp$0010へストア。
最大値の指定はこれで終了しています。
変動時のチェックが付近でされていない為にここが最大値の指定部分ではないのかと思うかもしれませんが、
ジャンプ先の下の処理を見てみるとp$0010とp$0014のロードした値の加算(以下y)が比較されています。
$001cc830ではp$0014に0がストアされている為実質p$0010との比較としても恐らく問題はないと思います。
この処理を見るとyが0以下であるとt0=1となり、p$0004が1以下であると1がp$0004へストアされています。
その他p$000Cのロード値との比較もされています。
$001cc830ではp$000Cにa3の値がストアされている為、最大値が記述されていた付近を見るとa3は0。
比較処理と0がストアされている点を見るとp$000Cは最低値が格納されているとみて間違いありません。
ここまで見るとp$0004がパラメータの現在値であり、$001cc92cのa1が変動値であるとわかります。
この付近は$001cc830のすぐ下の$001cc860が戦闘後のパラメータのチェック処理、その下の$001cc910が通常時の
変動とパラメータの最低・最大値の修正処理となっています。
最初はこれまでの流れで見つけたわけではなく、所持金減少処理を探して$001cc980へだどり着いたのですが
どうやってたどり着いたかはとり頭なので覚えていません
しかし$001cc980の付近の処理を流し読みしてp$0004が所持金の現在値であると見当をつけ、
$001cc92cで適当な値にし、ゲームをしてみるとパラメータ関係ほぼ全てに効果が出ていたので、
変動値が0以下である場合は0にした上で、x倍にしてみました。体力等が減らない効果は一応狙って作っています。
その後に上の流れで最大値を格納していると気付いたので$001cc830の参照箇所を検索していくと
以下の様になっていました。ここで処理している他のパラメータは「特定パラメータのみ数値変更」のリストを参照
p$0000=a1=パラメータのナンバー
p$0004=a2=発言力は$00c8それ以外は0。パラメータの初期化?
p$000C=a3=最低値
p$0010=t0=最大値
またゲーム中に最低値の記述部分へ最大値を入れる様にパッドコードで命令の書き換えを行っても
うまくいかなかった点から最大・最低値のストアはセーブデータのロード時点までで行っており、
その後はストアされた値のみ読み込む様です。
ごちゃごちゃと書きましたが、まとめると
セーブデータをロードするまで(?)に最低・最大値をステータスのワークアドレス付近に記録し、変動時はそれと比較する
p$0000=パラメータのナンバー
p$0004=パラメータの現在値
p$000C=パラメータの最低値
p$0010=パラメータの最大値
となっていて
例えば運動力のワークアドレスが$00400004であると仮定した場合
$00400000=$0002
$00400004=運動力
$0040000C=$0000
$00400010=$00ff
最大値をチェックする場合は$00400010を。最低値は$0040000Cを読み込み比較。という特殊なものとなっています