DQ3 モンスターの行動パターンに「強攻撃」「グループ攻撃」を追加する

最近のDQではおなじみ(っていっても8以降はプレイしたことないんですが)、「強攻撃」(ダメージ1.25倍?)と「グループ攻撃」(ダメージ1/2で全員対象、低減あり)を戦闘行動に追加します。これらの行動で通常の直接攻撃を差し替えるとかなりモンスター行動のバリエーションが豊かになるのではないかと。本家では改変度合い強すぎてバランスが大きく変わってしまうために絶対導入されないと思いますが。「強攻撃」はどこの攻略サイトを見ても「ダメージが1.25倍」と説明されていて、「行動主体者の攻撃力1.25倍」とは書いてありません。つまり、結果として最終的に算出されるダメージが1.25倍になるということのようです。まあDQ6の実装を見ればいいのですが、時間もないので「ダメージ基礎値を1.25倍する」ことにします。「ダメージ基礎値」というのは攻撃力-守備力/2のことです。例外としてダメージ基礎値がマイナス(FFXX)の場合には1.25倍しません。

  • SR: $02DBC9 直接攻撃(強)後半(新SR)
02DBC9 JSR $DBD0 SR: $02DBD0 直接攻撃(強)基本ダメージ計算
02DBCC JSR $8E70 SR: $028E70 ダメージ確定メイン
02DBCF RTL return
  • SR: $02DBD0 直接攻撃(強)基本ダメージ計算(新SR)
02DBD0 LDX $23E4 X=$23E4
02DBD3 LDY $23E8 Y=$23E8
02DBD6 JSL $C2CA62 SR: $02CA62 引数:1#$2041 守備力取得
02DBDC LSR A>>1
02DBDD PHA Push A
02DBDE JSL $C2CA5B SR: $02CA5B 引数:1#$203F 攻撃力取得
02DBE4 STA $02 DP($02)=A
02DBE6 PHA Push A
02DBE7 LSR A>>1
02DBE8 LSR A>>1
02DBE9 LSR A>>1
02DBEA STA $04 DP($04)=A
02DBEC PLA Pull A
02DBED SEC c=on
02DBEE SBC $01,S A-=(Stack($01)+c) ダメージ基礎値作成
02DBF0 BMI #$08 if(n==on) goto $02DBFA n=onになっていれば1.25倍化処理を飛ばす
02DBF2 PHA Push A
02DBF3 LSR A>>1
02DBF4 LSR A>>1
02DBF5 STA $00 DP($00)=A
02DBF7 PLA Pull A
02DBF8 ADC $00 A+=(DP($00)+c) ダメージ基礎値1.25倍
02DBFA STA $00 DP($00)=A
02DBFC PLA Pull A
02DBFD JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02DC05 CMP #$0005 A>=#$0005?
02DC08 BCS #$04 if(c==on) goto $02DC0E
02DC0A JSR $8E0E SR: $028E0E
02DC0D RTS return
02DC0E JSR $8DEB SR: $028DEB
02DC11 JSR $8E4A SR: $028E4A
02DC14 RTS return
  • SR: $02E18B 直接攻撃(グループ)後半(新SR)
02E18B JSR $E192 SR: $02E192 直接攻撃(グループ)基本ダメージ計算
02E18E JSR $8E70 SR: $028E70 ダメージ確定メイン
02E191 RTL return
  • SR: $02E192 直接攻撃(グループ)基本ダメージ計算(新SR)
02E192 LDX $23E4 X=$23E4
02E195 LDY $23E8 Y=$23E8
02E198 JSL $C2CA62 SR: $02CA62 引数:1#$2041
02E19E LSR A>>1
02E19F PHA Push A
02E1A0 JSL $C2CA5B SR: $02CA5B 引数:1#$203F
02E1A6 STA $02 DP($02)=A
02E1A8 PHA Push A
02E1A9 LSR A>>1
02E1AA LSR A>>1
02E1AB LSR A>>1
02E1AC STA $04 DP($04)=A
02E1AE PLA Pull A
02E1AF SEC c=on
02E1B0 SBC $01,S A-=(Stack($01)+c)
02E1B2 BMI #$01 if(n==on) goto $02E1B5
02E1B4 LSR A>>1 ダメージ基礎値0.5倍
02E1B5 STA $00 DP($00)=A
02E1B7 PLA Pull A
02E1B8 JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02E1C0 CMP #$0005 A>=#$0005?
02E1C3 BCS #$04 if(c==on) goto $02E1C9
02E1C5 JSR $8E0E SR: $028E0E
02E1C8 RTS return
02E1C9 JSR $8DEB SR: $028DEB
02E1CC JSR $8E4A SR: $028E4A
02E1CF RTS return
  • SR: $028F4B 複数攻撃武器ダメージ計算
028F4B JSR $E3F0 SR: $02E3F0
028F4E-55 NOP
028F56 BCC #$1D if(c==off) goto $028F75
  • SR: $02E3F0 戦闘行動が複数対象武器による低減対象か(該当c=on)
02E3F0 LDA $23EE A=$23EE
02E3F3 CMP #$00AC A==#$00AC? グループ攻撃か
02E3F6 BEQ #$16 if(z==on) goto $02E40E
02E3F8 CMP #$00AD A==#$00AD? 全体攻撃か
02E3FB BEQ #$11 if(z==on) goto $02E40E
02E3FD CMP #$0121 A==#$0121? げはげは笑いか
02E400 BEQ #$0C if(z==on) goto $02E40E
02E402 CMP #$012F A==#$012F? なぎはらいか
02E405 BEQ #$07 if(z==on) goto $02E40E
02E407 CMP #$0133 A==#$0133?
02E40A BEQ #$02 if(z==on) goto $02E40E
02E40C CLC c=off
02E40D RTS return
02E40E SEC c=on
02E40F RTS return

やっていることはほとんどSR: $028DA9 直接攻撃後半と同じです。ダメージ基礎値を作成したときにネガティブフラグを見ないで1.25倍、0.5倍してしまうと(おそらく倍化処理中にネガティブフラグがoffになるためか)ダメージが5桁に到達しておかしなことになってしまいます。ネガティブフラグがonになるということは攻撃対象者の守備力が攻撃主体者の攻撃力を大幅に上回っていることになるので、倍化をスキップしても問題はないと思われます。今回はグラコス専用の「げはげは笑いながらなぎはらい」と通常の「なぎはらい」をモンスター側の打撃系グループ攻撃としました。ただ、「げはげは笑い」はグラコス先生に敬意を払ってダメージ計算は通常攻撃のものを使用しています(つまり通常の「なぎはらい」よりも強い)。

というわけで、通常攻撃のパターンが2パターン増えました。実際には「強攻撃」には表示メッセージ(「○○は××をいきなり わしづかみにした!」)のバリエーションを増やしているので、効果は同じでもう何種類かの戦闘行動を定義しています。これを通常攻撃しかパターンがないモンスターに割り当てました。