前回で力の実装は終わりました。後は似たような作業を全ステータスに対して行えばいいのですが、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の時点で力が180で返されるからです。理想としては
- 転職前の力取得
- 1/2する
- 転職後の力最大値でクリップしてセット
としたいのですが、あいにく「転職前の職業情報」が簡単に入手できません。仕方がないので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した時点で業務連絡をします。・・・とはいえ、まだ各職業の最大値および成長バランス調整をしないといけないので、ようやく準備が整ったにすぎません。
コメント