今回からはぐんたいよびの実装を行うことにします。オリジナル(DQ6)はレベルx2.2のランダム4回攻撃でレベルx50Gを消費するというものです。所持金が足りないとなにもしないで帰ってしまいます。また、ボスには通用しないようですが、耐性が存在するのかは不明です。(ダークドレアムには効かなかった)。ここでのポイントは
- ダメージ値の計算をどうするか(バランス的な意味で)
- 終わった後の後処理(ゴールドを引く/帰ってしまったとメッセージ表示)
- 「ランダムで4回攻撃」をどう実装するか
です。というわけで順番に作業していきます。 ぐんたいよびは戦闘行動の$0114に定義しました。とりあえずは「敵全体を対象」にしておきます。呪文説明文を設定し、さらに以下の戦闘メッセージを3つ追加します。
- [BC][B7]は たたかいの のろしを あげた![B1]
- どこからともなく なぞのぐんたいが[AD]あつまってきた![B1][BC]
- [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からは対象がメタル系のときの処理です。メタル系のときは無効にしています。この処理を入れないとはぐれメタルにも大ダメージを与えて倒せてしまいます。判定条件を「メタル系であるか」にしているのでメタルスライム、はぐれメタルのほかにメタルキメラにも通じません。この状態で実行すると敵全部に順番にダメージを与えるところまでできていることがわかります。