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

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

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

  • SR: $028EFB ダメージ計算処理
028F3CJSR $D800SR: $02D800
  • SR: $02D800 戦士防御・フバーハ時のダメージ軽減処理(新SR)
02D800JSR $D807SR: $02D807
02D803JSR $9179SR: $029179
02D806RTSreturn

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

  • SR: $02D807 戦士防御時のダメージ軽減処理(新SR)
02D807LDY $23EEY=$23EE
02D80AJSL $C2CC2CSR: $02CC2C 引数:1#$0075 引数:2#$0003
02D812CMP #$0002A>=#$0002?
02D815BCC #$7Eif(c==off) goto $02D895
02D817LDA $2428A=$2428
02D81ASTA $2600$2600=A
02D81DLDY #$0000Y=#$0000
02D820LDA $243E,YA=$243E+Y
02D823AND #$00FFA&=#$00FF
02D826CMP $2600A==$2600?
02D829BEQ #$03if(z==on) goto $02D82E
02D82BINYY++
02D82CBRA #$F2goto $02D820
02D82ESTY $2604$2604=Y
02D831LDY #$0000Y=#$0000
02D834LDA $243E,YA=$243E+Y
02D837AND #$00FFA&=#$00FF
02D83ACMP #$0018A>=#$0018?
02D83DBCS #$14if(c==on) goto $02D853
02D83FTAXX=A
02D840STX $2428$2428=X
02D843JSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02D84BCMP #$0005A>=#$0005?
02D84EBCS #$03if(c==on) goto $02D853
02D850INYY++
02D851BRA #$E1goto $02D834
02D853STY $2602$2602=Y
02D856LDA $243E,YA=$243E+Y
02D859AND #$00FFA&=#$00FF
02D85CCMP #$0018A>=#$0018?
02D85FBCS #$2Eif(c==on) goto $02D88F
02D861TAXX=A
02D862STX $2428$2428=X
02D865JSL $C2BE8ASR: $02BE8A 引数:1#$24
02D86ACMP #$0000A==#$0000?
02D86DBNE #$1Aif(z==off) goto $02D889
02D86FLDA $243E,YA=$243E+Y
02D872AND #$00FFA&=#$00FF
02D875STA $2428$2428=A
02D878JSL $C2BE8ASR: $02BE8A 引数:1#$1C
02D87DBCS #$0Aif(c==on) goto $02D889
02D87FJSL $C2CB2BSR: $02CB2B 引数:1#$2050 引数:2#$0080
02D887BNE #$0Dif(z==off) goto $02D896
02D889INYY++
02D88ACPY #$0018Y>=#$0018?
02D88DBCC #$C7if(c==off) goto $02D856
02D88FLDA $2600A=$2600
02D892STA $2428$2428=A
02D895RTSreturn
02D896CPY $2604Y>=$2604?
02D899BCS #$F4if(c==on) goto $02D88F
02D89BSTY $2606$2606=Y
02D89ELDA $2604A=$2604
02D8A1INCA++
02D8A2SBC $2606A-=($2606+c)
02D8A5ASLA<<1
02D8A6TAXX=A
02D8A7LDA $C23CB2,XA=$023CB2+X
02D8ABLDX #$0000X=#$0000
02D8AEJSL $C01146SR: $001146
02D8B2LDA $01A=DP($01)
02D8B4STA $00DP($00)=A
02D8B6BRA #$D7goto $02D88F

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

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

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

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

コメント

タイトルとURLをコピーしました