DQ3 ぐんたいよび実装1

今回からはぐんたいよびの実装を行うことにします。オリジナル(DQ6)はレベルx2.2のランダム4回攻撃でレベルx50Gを消費するというものです。所持金が足りないとなにもしないで帰ってしまいます。また、ボスには通用しないようですが、耐性が存在するのかは不明です。(ダークドレアムには効かなかった)。ここでのポイントは

  1. ダメージ値の計算をどうするか(バランス的な意味で)
  2. 終わった後の後処理(ゴールドを引く/帰ってしまったとメッセージ表示)
  3. 「ランダムで4回攻撃」をどう実装するか

です。というわけで順番に作業していきます。 ぐんたいよびは戦闘行動の$0114に定義しました。とりあえずは「敵全体を対象」にしておきます。呪文説明文を設定し、さらに以下の戦闘メッセージを3つ追加します。

  1. [BC][B7]は たたかいの のろしを あげた![B1]
  2. どこからともなく なぞのぐんたいが[AD]あつまってきた![B1][BC]
  3. [BC]しかし おかねが たりない![AD]ぐんたいは かえっていった![B1]

ここで[B1]を入れないとメッセージが一瞬で消えてしまいます。おそらく[B1]はメッセージ表示を何フレームか表示しつづけるためのコントロール文字と思われます。DQ6では1番目のメッセージが表示された後、2番目が続けて表示されます。王者の剣を使ったときと同じ(「とどろく らいめいが…」というメッセージが追加で表示される)ですね。これは特定の戦闘行動に対しては追加メッセージを表示するようになっているためです。

  • SR: $027F10 特殊行動Msg表示
027F10 LDX #$0058 X=#$0058
027F13 LDA $23EE A=$23EE
027F16 CMP $C2372C,X A==$02372C+X?
027F1A BEQ #$05 if(z==on) goto $027F21
027F1C DEX X–
027F1D DEX X–
027F1E BPL #$F6 if(n==off) goto $027F16
027F20 RTS return
027F21 JSR $7F25 SR: $($027F25+X)
027F24 RTS return
  • SR: $02D46D ぐんたいよび追加メッセージ表示
02D46D JSL $C1A867 SR: $01A867 引数:1#$0178
02D473 RTS return

以前メガザルのところで戦闘後追加処理を拡張しましたが、同様に拡張します。戦闘行動IDの配列を$02372C($027F25から)に移動し、呼び出されるSRの配列を$027F25($027F4Eから)に移動し、SR内で参照しているアドレスを変更します。さらに戦闘行動IDの最後に$114、SR配列の最後にぐんたいよびの追加メッセージ表示のアドレス下位2バイト($D46D)をセットします。これでぐんたいよびを実行したときに追加のメッセージが表示されるようになります。次にダメージを計算する処理を実装します。

  • SR: $02D4D5 ぐんたいよび
02D4D5 JSL $C90AF7 SR: $090AF7
02D4D9 STA $00 DP($00)=A
02D4DB LDA $2428 A=$2428
02D4DE PHA Push A
02D4DF LDA $23E4 A=$23E4
02D4E2 STA $2428 $2428=A
02D4E5 JSL $C2C240 SR: $02C240 引数:1#$0A
02D4EA XBA Exchange A(HighByte) and A(LowByte)
02D4EB SEP #$20 m=on(A/M:8b)
02D4ED LDA $00 A=DP($00)
02D4EF REP #$20 m=off(A/M:16b)
02D4F1 JSL $C01098 SR: $001098
02D4F5 STA $00 DP($00)=A
02D4F7 PHX Push X
02D4F8 LDX #$0000 X=#$0000
02D4FB LDA #$0064 A=#$0064
02D4FE JSL $C0121C SR: $00121C
02D502 LDA $00 A=DP($00)
02D504 STA $23FA $23FA=A
02D507 PLX Pull X
02D508 PEA #$2011 Push #$2011
02D50B PEA #$0020 Push #$0020
02D50E PEA #$7E00 Push #$7E00
02D511 JSL $C9029E SR: $09029E
02D515 BEQ #$08 if(z==on) goto $02D51F
02D517 LDA $23FA A=$23FA
02D51A NOP
02D51B LSR A>>1
02D51C STA $23FA $23FA=A
02D51F PLA Pull A
02D520 STA $2428 $2428=A
02D523 LDX $2428 X=$2428
02D526 JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02D52E CMP #$0005 A>=#$0005?
02D531 BCS #$16 if(c==on) goto $02D549
02D533 JSL $C2CA5B SR: $02CA5B 引数:1#$2049
02D539 TAY Y=A
02D53A JSL $C2CC92 SR: $02CC92 引数:1#$0024 引数:2#$0001
02D542 CMP #$0001 A==#$0001?
02D545 BNE #$03 if(z==off) goto $02D54A
02D547 STZ $23FA $23FA=#$00
02D54A JSL $C29200 SR: $029200
02D54E RTL return

オリジナルのまま(レベルx2.2)のダメージだとDQ3では高すぎるので、レベルx0.50~0.80にしました。数値設定構造体($022EE0-)では最小値50、最大値80で設定し、この範囲のランダム値を取得した後レベルと掛け合わせ100で割っています。$02D508からはイベント戦闘時にダメージを1/4にしています。$02D526からは対象がメタル系のときの処理です。メタル系のときは無効にしています。この処理を入れないとはぐれメタルにも大ダメージを与えて倒せてしまいます。判定条件を「メタル系であるか」にしているのでメタルスライム、はぐれメタルのほかにメタルキメラにも通じません。この状態で実行すると敵全部に順番にダメージを与えるところまでできていることがわかります。