DQ3 専門職以外の呪文の効果を3/4にする2(戦闘中回復呪文編)

前回に引き続き、今回は戦闘中の回復呪文の回復値の調整をすることにします。戦闘中の回復処理は全てSR: $029610で行っています。このSRの前半ではターゲットが光ゾーマ(#$0088)であればダメージを与える処理を行っています。今回は空き領域の都合もあり、この部分も一緒に削り光ゾーマに回復行動でダメージを与えられないようにもしてしまいます。今回も回復行動の素値を取得した直後に調整用のSRをはさんで回復量を調整します。

  • SR: $029610 回復系処理(戦闘中)
029610 LDA $23F2 A=$23F2
029613 BEQ #$27 if(z==on) goto $02963C
029615 LDX $23E8 X=$23E8
029618 JSL $C2CAD9 SR: $02CAD9 引数:1#$2050 引数:2#$0001
029620 BNE #$1A if(z==off) goto $02963C
029622 NOP
02963C LDA $23E8 A=$23E8
02963F STA $2428 $2428=A
029642 JSL $C2BE8A SR: $02BE8A 引数:1#$00
029647 STA $02 DP($02)=A
029649 JSL $C90AF7 SR: $090AF7
02964D STA $00 DP($00)=A
02964F JSR $D2BE SR: $02D2BE 職業別回復呪文回復量調整

略の部分は全て$EA(NOP)で埋めています。さて、今回ちょっと違うのが、$029642で取得した現在HPを$02にセットしています。これは後で回復時に加算するもとのHPとして使うようです。従ってこの部分には手を触れてはいけません。回復量は攻撃呪文同様$00にセットされるのでその直後に新規に定義した調整用のSRをコールして$00の値を変えることにします。

  • SR: $02D2BE 職業別回復呪文回復量調整(新SR)
02D2BE PHA Push A
02D2BF PHX Push X
02D2C0 PHP Push P Flag
02D2C1 LDA $2428 A=$2428
02D2C4 PHA Push A
02D2C5 LDX $23E4 X=$23E4
02D2C8 STX $2428 $2428=X
02D2CB JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02D2D3 CMP #$0005 A>=#$0005? 行動主体がPC側か
02D2D6 BCC #$40 if(c==off) goto $02D318
02D2D8 JSL $C2BE8A SR: $02BE8A 引数:1#$24 職業IDを取得する
02D2DD CMP #$0008 A==#$0008? 勇者か
02D2E0 BEQ #$36 if(z==on) goto $02D318
02D2E2 CMP #$0007 A==#$0007? 賢者か
02D2E5 BEQ #$31 if(z==on) goto $02D318
02D2E7 CMP #$0003 A==#$0003? 僧侶か
02D2EA BEQ #$2C if(z==on) goto $02D318
02D2EC LDA $23EE A=$23EE
02D2EF CMP #$001F A==#$001F? 戦闘行動がホイミ(味方)か
02D2F2 BEQ #$1C if(z==on) goto $02D310
02D2F4 CMP #$0022 A==#$0022? 戦闘行動がべホイミ(味方)か
02D2F7 BEQ #$17 if(z==on) goto $02D310
02D2F9 CMP #$0028 A==#$0028? 戦闘行動がベホマラー(味方)か
02D2FC BEQ #$12 if(z==on) goto $02D310
02D2FE CMP #$0025 A==#$0025? 戦闘行動がベホマ(味方)か
02D301 BEQ #$03 if(z==on) goto $02D306
02D303 JMP $D318 ($02D318) goto $02D318
02D306 JSL $C2C240 SR: $02C240 引数:1#$18 行動主体の賢さを取得
02D30B STA $00 DP($00)=A 本業以外はベホマの回復量は術者の賢さの値になる
02D30D JMP $D318 ($02D318) goto $02D318
02D310 LDA $00 A=DP($00)
02D312 LSR A>>1
02D313 ADC $00 A+=(DP($00)+c)
02D315 LSR A>>1
02D316 STA $00 DP($00)=A 回復量を3/4にする
02D318 PLA Pull A
02D319 STA $2428 $2428=A
02D31C PLP Pull P Flag
02D31D PLX Pull X
02D31E PLA Pull A
02D31F RTS return

前回にまして長いです。さて、やることは基本的に変わりません。行動主体($7E23E4)が敵か味方かSR: $02CAD9で調べて、敵であれば(A<5)、調整はしないので処理を飛ばします。次に職業IDをSR: $02BE8Aで取得して勇者か(#$08)賢者か(#$07)僧侶(#$03)であれば調整はしないので処理を飛ばします。次に戦闘行動を調べてホイミ(#$001F9)かべホイミ(#$0022)かベホマラー(#$0028)であれば効果を3/4にする処理をおこないます。さらにベホマ(#$0025)であれば、行動主体の賢さを取得してその値を$00にセットします。しかし、この記事をみればわかるとおり、賢さを取得するSRがありません。というわけで追加することにします。

  • SR: $02C240の拡張

$02C240は、引数(1バイト)をオフセットにしてSRアドレスの配列から指定個所のアドレスのSRを呼ぶ、というものです。具体的には$FC(JML (addr,x))を使っています。今回のケースでは$02C2A0から24バイト(2バイトx12)を敵用の情報を取得するSRアドレス群として、$02C2B8から24バイト(2バイトx12)を味方用の情報を取得するSRアドレス群として使用しています。本当はよくないのですが、事実上敵の賢さを取得する意味がないので味方側のアドレス群のみ拡張することにします。まず、空きがないのでアドレス群の場所を$02D320に移動します。そして、その最後に対象の賢さを取得する新SRのアドレスを追加します。追加後には以下のようになります。

アドレス
02D320 C2D7
02D322 C2F0
02D324 C301
02D326 C312
02D328 C323
02D32A C334
02D32C C345
02D32E C352
02D330 C37E
02D332 C3AE
02D334 C3BB
02D336 C4EC
02D338 D33A

そして$02D33Aに賢さを取得するSRを実装します。

  • $02D33A PC(Player Character)の賢さを取得する
02D33A JSL $C437C1 SR: $0437C1 引数:1#$06 引数:2#$FD 引数:3#$FF
02D341 RTS return

これでベホマ時の回復量が術者の賢さと等しくなるはずです。この一連の変更で専門職以外のベホマラーの効果がとたんに低くなります。これにあわせて賢者の石の回復量も抑えれば本職のベホマラーの価値がぐっと高まると思われます。ためしに勇者+戦士+盗賊+ぶとうかのほぼLv99のパーティでしんりゅうに挑んでみたところ、勇者のベホマズン以外はほとんど役立たずでした。通しでプレイしてないのでまだわかりませんが、ある程度職業間のバランスがとれているような感触を得ました。