DQ3成長限界上昇パッチの拡張4

前回で力の実装は終わりました。後は似たような作業を全ステータスに対して行えばいいのですが、DQ3ではちからを上げる装飾品は存在しません。したがってステータス画面上で地のステータスと表示されるステータス値の乖離はないので他に比べて処理が1つ単純になっています。というわけで、素早さなどは「ステータス画面上に表示される値の作成」のSRをちょっと変える必要があります。

  • SR: $04353A ステータス画面上の体力作成
04353A JSR $354C SR: $04354C
04353D LDY #$0006 Y=#$0006
043540 JSR $36D0 SR: $0436D0
043543 JSL $C5FD0A SR: $05FD0A
043547 NOP
043548 NOP
043549 NOP
04354A NOP
04354B RTL return

やってることは基本的に同じですが、地の体力+装飾品の値をしたあと、今度はシステム最大値でクリップしています。

  • SR: $05FD0A 体力をシステム最大値でクリップする(新SR)
05FD0A PHA Push A
05FD0B JSL $C5FE1E SR: $05FE1E
05FD0F CMP $01,S A>=Stack($01)?
05FD11 BCS #$02 if(c==on) goto $05FD15
05FD13 STA $01,S Stack($01)=A
05FD15 PLA Pull A
05FD16 RTL return
  • SR: $05FE1E 体力システム最大値取得(新SR)
05FE1E PHX Push X
05FE1F LDA #$0010 A=#$0010
05FE22 TAX X=A
05FE23 JSL $C5F800 SR: $05F800 引数:1#$0002 引数:2#$07FC
05FE2B PLX Pull X
05FE2C RTL return

特にこれというところはありませんが、システム最大値はステータス最大値構造体の最後のインデックス(#$10)なので$05FE1FでXに#$0010をセットしています。今回のパッチには、全てのステータスについて

  • 職業別最大値取得(Xはキャラクターインデックス)
  • 職業別最大値取得(Xはキャラクターの先頭アドレス)
  • システム最大値取得(Xはキャラクターの先頭アドレス)
  • Aを職業別最大値でクリップする
  • Aをシステム最大値でクリップする

を実装しています(一部使用しないものもありますが)。さて、最後に残っているのが転職時のステータス変更部分です。今回の修正で職業ごとにステータスの値を変えることができるようになったため、設定次第では、職業間の最大値の差を2倍以上にすることも可能です。たとえば、転職前のステータス最大値が400で転職後のステータス最大値が180というようなケースも起き得ます。実際にどうなるかやってみました。戦士の力最大値を400にして魔法使いの力最大値を180にして、力400の戦士を魔法使いに転職させてみます。結果は・・・力が90になっています。これはオリジナルの実装が

  1. 転職後に力取得
  2. 1/2する
  3. セット

となっているため、1の時点で力が180で返されるからです。理想としては

  1. 転職前の力取得
  2. 1/2する
  3. 転職後の力最大値でクリップしてセット

としたいのですが、あいにく「転職前の職業情報」が簡単に入手できません。仕方がないので1の部分を「システム最大値でクリップした力を取得」として実装を行います。問題があれば「転職前の職業情報」をどこかに保存しておき、それを参照して処理するというようにするつもりです(いまのところその予定はないです)。

  • SR: $0469C9 転職時ステータス変更
0469E9 JSL $C5F98D SR: $05F98D
0469ED-F1 NOP

いままで実装した中に「(職業最大値でクリップしないで)システム最大値でクリップした力を返す」という実装がなかったために1/2にしてセットする部分も含めてまとめて別の場所で行うことにしました。

  • SR: $05F98D 転職時力変更
05F98D LDA $000C,X A=$000C+X
05F990 XBA Exchange A(HighByte) and A(LowByte)
05F991 SEP #$20 m=on(A/M:8b)
05F993 LDA $0011,X A=$0011+X
05F996 AND #$01 A&=#$01
05F998 REP #$20 m=off(A/M:16b)
05F99A XBA Exchange A(HighByte) and A(LowByte)
05F99B JSL $C5FCF0 SR: $05FCF0
05F99F LSR A>>1
05F9A0 JSL $C43450 SR: $043450
05F9A4 RTL return

もともとの成長限界上昇パッチでやっていた処理をパクった後、力をシステム最大値でクリップするSRを呼んで調整した後1/2してセットしています。セット時に現在の職業最大値でクリップされるのでここで調整の必要はありません。

というわけで長々と書いてきましたが、「職業別最大値を設定できるようにする」変更はこれで終わりです。今回の修正を他の修正をしたのと同じバイナリに行ってしまっているので抽出してreadmeを書くのにちょっと手間がかかります。後日ろだにうpした時点で業務連絡をします。・・・とはいえ、まだ各職業の最大値および成長バランス調整をしないといけないので、ようやく準備が整ったにすぎません。