DQ3 戦士の「防御」効果変更1

今までの変更はパクり他からの移植でしたが、今回の変更は完全オリジナルです。実装はともかく、「実戦で役に立つか」という意味では未知数です。

他の職業に比べて職業特性がない戦士。「守備力の高い防具を装備できる」というのが当初の触れ込みでしたが、SFC版では女尊男卑のあおりを食らって防具に女性専用で職業を選ばない高性能のものが増えたためにますますその地位が低下しました。今回は戦士の「防御」に特性を与え、「戦士が防御しているとそれより後ろの仲間への全体攻撃によるダメージが低減する」となるようにします。防御することによりパーティの盾となることを意図しています。とりあえず低減率は複数対象攻撃の低減率を使用することにします。これによりパーティの先頭に戦士を置いて防御させた場合、一番後ろの仲間は1/2のダメージになることになります。また、話がややこしくなるので、戦士2人が防御しても効果は2重になりません。あまり効果を高くすると「戦士は先頭で常に防御」ということにもなりかねないので、バランスには注意しないといけません。

  • SR: $028EFB ダメージ計算処理
028F3C JSR $D800 SR: $02D800
  • SR: $02D800 戦士防御・フバーハ時のダメージ軽減処理(新SR)
02D800 JSR $D807 SR: $02D807
02D803 JSR $9179 SR: $029179
02D806 RTS return

思いのほか修正個所は1ヵ所で済みます。ダメージ系の攻撃のダメージ値の計算は最終的にSR: $028EFBを通ります。従ってこのなかに処理を割り込ませればいいことになります。ただし、攻撃の対象が「一人」である場合は処理をスキップする必要があります。

  • SR: $02D807 戦士防御時のダメージ軽減処理(新SR)
02D807 LDY $23EE Y=$23EE
02D80A JSL $C2CC2C SR: $02CC2C 引数:1#$0075 引数:2#$0003
02D812 CMP #$0002 A>=#$0002?
02D815 BCC #$7E if(c==off) goto $02D895
02D817 LDA $2428 A=$2428
02D81A STA $2600 $2600=A
02D81D LDY #$0000 Y=#$0000
02D820 LDA $243E,Y A=$243E+Y
02D823 AND #$00FF A&=#$00FF
02D826 CMP $2600 A==$2600?
02D829 BEQ #$03 if(z==on) goto $02D82E
02D82B INY Y++
02D82C BRA #$F2 goto $02D820
02D82E STY $2604 $2604=Y
02D831 LDY #$0000 Y=#$0000
02D834 LDA $243E,Y A=$243E+Y
02D837 AND #$00FF A&=#$00FF
02D83A CMP #$0018 A>=#$0018?
02D83D BCS #$14 if(c==on) goto $02D853
02D83F TAX X=A
02D840 STX $2428 $2428=X
02D843 JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02D84B CMP #$0005 A>=#$0005?
02D84E BCS #$03 if(c==on) goto $02D853
02D850 INY Y++
02D851 BRA #$E1 goto $02D834
02D853 STY $2602 $2602=Y
02D856 LDA $243E,Y A=$243E+Y
02D859 AND #$00FF A&=#$00FF
02D85C CMP #$0018 A>=#$0018?
02D85F BCS #$2E if(c==on) goto $02D88F
02D861 TAX X=A
02D862 STX $2428 $2428=X
02D865 JSL $C2BE8A SR: $02BE8A 引数:1#$24
02D86A CMP #$0000 A==#$0000?
02D86D BNE #$1A if(z==off) goto $02D889
02D86F LDA $243E,Y A=$243E+Y
02D872 AND #$00FF A&=#$00FF
02D875 STA $2428 $2428=A
02D878 JSL $C2BE8A SR: $02BE8A 引数:1#$1C
02D87D BCS #$0A if(c==on) goto $02D889
02D87F JSL $C2CB2B SR: $02CB2B 引数:1#$2050 引数:2#$0080
02D887 BNE #$0D if(z==off) goto $02D896
02D889 INY Y++
02D88A CPY #$0018 Y>=#$0018?
02D88D BCC #$C7 if(c==off) goto $02D856
02D88F LDA $2600 A=$2600
02D892 STA $2428 $2428=A
02D895 RTS return
02D896 CPY $2604 Y>=$2604?
02D899 BCS #$F4 if(c==on) goto $02D88F
02D89B STY $2606 $2606=Y
02D89E LDA $2604 A=$2604
02D8A1 INC A++
02D8A2 SBC $2606 A-=($2606+c)
02D8A5 ASL A<<1
02D8A6 TAX X=A
02D8A7 LDA $C23CB2,X A=$023CB2+X
02D8AB LDX #$0000 X=#$0000
02D8AE JSL $C01146 SR: $001146
02D8B2 LDA $01 A=DP($01)
02D8B4 STA $00 DP($00)=A
02D8B6 BRA #$D7 goto $02D88F

長々と書いていますが、部分で見ていけばそれほど複雑な事をしているわけではありません。

  • 現在の戦闘行動($7E23EE)の対象が一人の場合は何もしないですぐリターンする。($02D807-15)
  • 現在の行動対象者インデックス($7E2428)を$7E2600にバックアップしておき、並び順を$7E243E-55の中から探し、その番号を$7E2604に保存する。($02D81A-30)
  • 次に並び順の中での味方の先頭インデックスを探し、$7E2602に保存します。($02D831-55)
  • 味方の先頭インデックスより後ろに「防御をしている生きている戦士」がいるかを調べ、存在している場合は低減処理に飛ばす。($02D856-8E)
  • 「防御をしている生きている戦士」と自分の並び順を比較し、自分が後ろであれば何人後かを調べ、その数に応じて複数攻撃武器のダメージ低減率に応じてダメージを軽減させる。($02D89B-B7)

ここで1点ミスに気が付きました。処理の頭で「自分のグループ番号を調べて5以上でなかったらすぐにリターン」という処理が抜けています。これがなくても並び順的にモンスターがパーティの先頭にいる「防御をしている戦士」より後ろになることはないので実害はないですが。後ろに別のSRを詰めてしまったのでもうこの処理を追加する余裕がないのでとりあえず放置します。

思いのほかあっさり実装が終わりました。実装が終わったので次回はいよいよテストです。