レベルアップ処理 その3

「その2」の問題点として、最大HPのパラメータ変動がなかった場合に
Aレジスタ値が0になってしまうことが挙げられる。
これだと、あとでEOR $#FFFFをすると0xFFFFになってしまい、
最大HPが65535も上昇してしまうことになる。
これを解決するために、苦肉の策ではあるがEORのあとにINC処理を挿入する。
結果、以下のとおりプログラムを書き換える。


04F97E 49 FF FF EOR $#FFFF
04F981 1A INC
04F982 22 AE 30 C4 JSL $0430AE
04F986 6B RTL
これをした場合は、本来ならどこかで相殺する処理を書き加えなければいけないところだが
面倒くさいのでこのままでいくことにする。
(実はキャラメイク時の種蒔き処理でも同様にバグっているのを認識していたりする)


とりあえず上手くいったっぽいので、
最大MPについても同様の処理を書き加えていく。
細かいことは省略。


0432A4 E3 01 SBC $01,S
0432A6 B0 03 BCS #$03

043E67 90 03 BCC #$03

043E70 22 87 F9 C4 JSL $04F987

04F987 49 FF FF EOR $#FFFF
04F98A 1A INC
04F98B 22 9E 32 C4 JSL $04329E
04F98F 6B RTL


これで、レベルアップ時にパラメータが減少するようにはなった。
次は実際に表示される値が2の補数状態になっている件の解決を図る。

レベルアップ処理 その2

レベルアップ時には当然最大HP/MPの算出が行われる。
勇者のキャラメイク時にも触れましたが、あらかじめ体力と賢さのパラメータを設定しておき、それを元に最大HP/MPの算出を算出するのはレベルアップ時も共通らしい。


以下のプログラムは、レベルアップ時の最大HP算出処理である。


043E1D 22 6F 30 C4 JSL $04306F 関数: $04306F
043E21 8D 69 40 STA $4069 $7E4069=A
043E24 20 4C 35 JSR $354C ($04354C) 関数: $04354C
043E27 22 6A 3F C4 JSL $043F6A 関数: $043F6A
043E2B CD 69 40 CMP $4069 A>=$7E4069?
043E2E B0 03 BCS #$03 -> $043E33 if(c==on) goto $043E33
043E30 AD 69 40 LDA $4069 A=$7E4069
043E33 38 SEC c=on
043E34 ED 69 40 SBC $4069 A-=$7E4069
043E37 22 AE 30 C4 JSL $0430AE 関数: $0430AE
関数$04306Fで現在の最大HPを取得し$7E4069に格納、
関数$04354Cで体力を取得し、関数$043F6Aで増加後の最大HPを算出、
現在の最大HPがと増加後の最大HPより減ってる場合は現在の値にリセットし、
差分を算出して関数$0430AEで実際に最大HPを加算する、という流れ。


まずは、$043E2EをBCSからBCCに変更してやり、
同時にSBCの処理でAレジスタが負数になるはずなのでどこかでビット反転させてやらないといけない。
というわけで関数$0430AEにジャンプするところをフックする。


今までの処理で$04F97Dまで使ってしまっているので$04F97Eから処理を書き加えていく。
しかしなにげに空きスペースが減ってきた。
この辺の空きスペースは$04FAFFまでしかないので気をつけないと。
とりあえずジャンプ先の関数ですることといえばAレジスタの値をビット反転させるだけである。
なので普通にEOR $#FFFFとしてやればよいか。
$#00FFにしないといけないかもしれないけど、それは結果を見て判断することに。
ひとまずできあがったプログラムは以下の通り。


043E2E 90 03 BCC #$03

043E37 22 7E F9 C4 JSL $04F97E

04F97E 49 FF FF EOR $#FFFF
04F981 22 AE 30 C4 JSL $0430AE
04F985 6B RTL


ついでに、関数$0430AEの加算処理ADCをSBCに変更しておく。


0430B4 E3 01 SBC $01,S
0430B6 B0 03 BCS #$03

メッセージ変更 その2

「その1」と同様に戦闘中のメッセージも編集する。
ひとまずの変更箇所は、「HP/MPがXXXあがった」を「さがった」に、
「ちから +YYY」等を「ちから −YYY」に変更。
これだけなら簡単であるが、問題は上記のXXX,YYYの値がまだ気持ち悪いことになっていることである。
とはいえ、この件はひとまず置いておいて、レベルアップ時に最大HP/MPが正しく減少する処理から取りかかることにする。

メッセージ変更 その1

メッセージ変更に関してはツールの力を最大限に利用させてもらうことにする。
DQ3拡張パッチのデータの中にDQ3MsgToolというフォルダが含まれてるんですが、
これを使って比較的手軽にメッセージの変更が可能となりました。
変更手順は上記ツール内のReadme.txtを参照してもらうとして、
ここでは気になった注意点を書いておこうと思う。


まず、DQ3_decode.exeで出力したMsgDataDecode.txtで「あがった」を「さがった」に変更し、
SJIStoDQ3_msg.exeにてMsgDataDQ3.binを出力するわけですが、
出力結果を1B8EA0-に貼り付けると、既存のメッセージデータを上書きしきれないわけです。
その際は、(Readme.txtにも書いてるんですけど)古いデータは全部0xFFで埋めてしまいます。
MsgDataIDX.binを上書きする際も同様です。
最初は不安でしたけど、やってみたらちゃんと書き換わりました。
めでたしめでたし。

問題発覚

軽くテストプレイしていると問題点を発見。
レベルアップ時にステータスは減るわけだが、
最大HPと最大MPが減少しない。
キャラメイク時のパラメータのままになってしまう。
これはいけないのでなんとかしないといけないが、
とりあえずメッセージ変更処理が一段落ついてからにする。

作り直し

いろいろ考えた結果、無改造版DQ3に対する改造はやめることにします。
代わりにDQ3 Extendedパッチを適用し、それをベースに改造を施すことにします。
なぜかというと、メッセージ処理の部分で挫折したから。


ちなみに今までの課程で施した改造はすべてそのまま拡張版にも適用できます。
変な改造が入らなくてすんで、心底ホッとしています。

メッセージの修正

「ステータスがあがる」「呪文を覚える」ことを伝えるメッセージを
「ステータスが下がる」「呪文を忘れる」ようなメッセージに変えていかなくてはいけない。
ひとまず軽くプレイしてみて気づいた問題は以下の通り。

キャラメイク時の種使用時とかに「(パラメータが)あがった」と表示される(実際には下がってる)
同様に、レベルアップ時にHP,MPのステータス変動も「あがった」となっている
レベルアップ時に「ちから +65530」とか表示される(2の補数表現のため)
レベルアップ時に毎回「(忘れた呪文)を覚えた」と表示される(実際には覚えていない)

とりあえずこんなところ。
これらを修正してやらなくてはいけない。
上から順番に着手していこう。