DQ6 呪文ダメージに賢さによる加算をする

久しぶりの質問回答コーナーです。お題は

DQ6で呪文ダメージに賢さによる加算をする

です。基本的にはDQ6はDQ3と同じ構成なので、ダメージ確定処理の補正処理中に処理を挟んでやればいいということになります。DQ6の戦闘部分の解析は全部終わっていないので理解度はあまり高くありませんが、まあなんとかなるはず。というわけで以下の方針で実装します。

  1. 属性ID+呪文フラグを見て加算対象の戦闘行動を判別する
  2. キャラクターIDを見て加算対象となる戦闘行動主体を判別する
  3. 戦闘中に賢さを取得して加算分を算出する

それぞれいろいろやり方はありますが、シンプルかつ無難な方法を取ります。気に入らない場合は各自適当にアレンジしてください。なお、加算値についてはDQ3 K.Mixでやった「賢さ50毎に一定値を加算」を面倒くさいのでそのまま流用します。加算される数値は全ての呪文で5で固定とします。このあたりも各自調整してください。

というわけで実装に移ります。

  • SR: $02852F ダメージ補正処理
028558 JSR $FB36 SR: $02FB36 種族特攻+呪文加算ダメージ補正処理

ダメージ補正処理の中の上の方で早めに補正をします(後ろにいくと防御などによる減算処理が入るので)。

  • SR: $02FB36 種族特攻+呪文加算ダメージ補正処理(新SR)
02FB36 JSR $85B5 SR: $0285B5
02FB39 JSR $FB3D SR: $02FB3D
02FB3C RTS return
  • SR: $02FB3D 賢さに応じてダメージ加算(新SR)
02FB3D PHA Push A 念のためスタックに退避
02FB3E PHX Push X 念のためスタックに退避
02FB3F PHY Push Y 念のためスタックに退避
02FB40 JSR $FB4C SR: $02FB4C 補正対象の戦闘行動か(該当c=on)
02FB43 BCC #$03 if(c==off) goto $02FB48
02FB45 JSR $FB7E SR: $02FB7E 呪文ダメージ加算処理
02FB48 PLY Pull Y
02FB49 PLX Pull X
02FB4A PLA Pull A
02FB4B RTS return

このあたりまでは枠を作っているだけです。

  • SR: $02FB4C 補正対象の戦闘行動か(該当c=on)(新SR)
02FB4C LDX $2555 X=$2555 行動主体の戦闘インデックスをセット
02FB4F JSL $C2EFA7 SR: $02EFA7 引数:1#$204F 引数:2#$01FF 戦闘中キャラクター情報取得 インデックス:X
02FB57 CMP #$0100 A>=#$0100? プレイヤーキャラクターは#$101以上
02FB5A BCC #$03 if(c==off) goto $02FB5F
02FB5C JSR $FB60 SR: $02FB60 戦闘行動が呪文ダメージ加算対象か(該当c=on)
02FB5F RTS return

行動主体を特定する方法はいくつかありますが、戦闘中はPC((プレイヤーキャラクター))には#$101以上のキャラクターIDが振られるようです(おそらく召喚したモンスターは#$100以下)。このやりかたはオリジナルの実装でも山彦の帽子の反響判定をする際にも使われているのでこれを踏襲します。

  • SR: $02FB60 戦闘行動が呪文ダメージ加算対象か(該当c=on)
02FB60 LDX $255F X=$255F 戦闘行動IDをセット
02FB63 JSL $C2F0FC SR: $02F0FC 引数:1#$C65D 引数:2#$0001 対象の行動が「呪文」か
02FB6B BEQ #$0F if(z==on) goto $02FB7C
02FB6D JSL $C2F0FC SR: $02F0FC 引数:1#$C662 引数:2#$001F 対象の行動の属性を取得
02FB75 CMP #$0006 A>=#$0006? 属性の判定
02FB78 BCS #$02 if(c==on) goto $02FB7C
02FB7A SEC c=on
02FB7B RTS return
02FB7C CLC c=off
02FB7D RTS return

「ダメージ系の呪文」という条件を判断するために戦闘行動の「呪文」フラグと「属性」の値を調べます。「呪文」フラグのところはこれまた山彦の帽子の反響判定のところのコードをそのままパクりました。さらに属性IDを取得し、6未満かを調べます。DQ6では属性は

ID 属性
0 メラ系
1 ギラ系
2 イオ系
3 ヒャド系
4 バギ系
5 デイン系
6 マヌーサ系

となっているので6未満なら該当するということで良さそうです。ちなみに各属性には炎の爪(メラ系)や火炎斬り(ギラ系)なども含まれますが、これらは先にチェックした呪文フラグがOFFになっているので加算の対象にはなりません。というわけでここまでで判定が終わったので後は加算値を計算すればいいということになります。

  • SR: $02FB7E 呪文ダメージ加算処理(新SR)
02FB7E LDA $04 A=DP($04) 何で使われているか不明なのでスタックに避難
02FB80 PHA Push A
02FB81 LDA $06 A=DP($06) 何で使われているか不明なのでスタックに避難
02FB83 PHA Push A
02FB84 STZ $04 DP($04)=#$00 0で初期化
02FB86 STZ $06 DP($06)=#$00 0で初期化
02FB88 LDX $2555 X=$2555
02FB8B JSL $C2EFA7 SR: $02EFA7 引数:1#$204F 引数:2#$01FF
02FB93 CMP #$0100 A==or>=#$0100?
02FB96 AND #$00FF A&=#$00FF キャラクターIDを取得
02FB99 TAY Y=A
02FB9A JSL $C44ACB SR: $044ACB 引数:1#$07 引数:2#$FD 引数:3#$04 賢さ取得してDP(04)にセット
02FBA1 LDA #$0032 A=#$0032 50で割る
02FBA4 LDX #$0004 X=#$0004
02FBA7 JSL $C00DE2 SR: $000DE2 $00,X(2B)=$00,X(2B)/A(1B) 剰余=A
02FBAB LDA #$0005 A=#$0005 5を掛ける
02FBAE JSL $C00C88 SR: $000C88 DP($00+X)(2B)=A(1B)*DP($00+X)(1B)
02FBB2 LDA $04 A=DP($04)
02FBB4 CLC c=off
02FBB5 ADC $00 A+=(DP($00)+c) 素のダメージ値に加算
02FBB7 STA $00 DP($00)=A
02FBB9 PLA Pull A
02FBBA STA $06 DP($06)=A スタックに避難させたものを戻す
02FBBC PLA Pull A
02FBBD STA $04 DP($04)=A スタックに避難させたものを戻す
02FBBF RTS return

若干アレなコードになっていますが、計算用のバッファとして使いたいDP($04)、DP($06)に何がセットされていてどこで使うかわからないのでSRの先頭で一応退避させて最後で戻しています(使っていないという確信があれば不要です)。使う領域も2バイトあれば十分だと思うのでDP($04)だけでもいいかもしれませんが、念のためDP($06)も確保しておきます。後は賢さを取得して50で割り、固定値の5を掛けて加算用のダメージを作成し、素のダメージ値DP($00)に加算して終わりです。一応加算部分にブレークポイントを張ってPCしかブレークにひっからなかったので大枠はこれでいいはずです。

……と散々書いてから思い出したのですが、これだと加算分の値が一定にもかかわらず1体毎に加算判断+加算値計算を行っているのでまじめに言えばオーバーヘッドが起きていることになります。理想を言えば戦闘行動開始直後に加算判断+加算値計算を行い、どっかのメモリにその値を保持しておき、上記の部分ではその値をDP($00)に足すだけ、としたほうがいいと思います(DQ3 K.Mixではそうやっていたのを忘れていました)。ただ、メモリ上のどこが使えるのかわからない(調べていないので)ので、とりあえずこれでよしとします。

コメント

  1. ビッグカツ より:

    ご丁寧にありがとうございます。助かりました。
    いつかドラクエ6K.Mixがリリースされることをこっそり願っています

    管理者より返信:

    最近ネタもないので手の出しやすそうなDQ6の改造の方針についてつらつら考えたりもしていますが、まだ全く手を付けていません(実際に手を付けるかもまるで不明)。DQ6のほうはさすがにK.Mixという名前にはしないと思いますが。どうせやるんだったら半端の状態で出しているインターフェース改良パッチのデバッグをやってからですかね。

  2. 匿名 より:

    ホイミ系の威力も賢さ依存にしたい場合は、属性IDを追加する必要がありますが、具体的にはどのようにいじる必要があるのでしょうか。ID6未満というわけにはいかないのでif分追加ですかね。

    管理者より返信:

    ホイミ系はそもそも属性が31で他の戦闘行動と区別がつかないので、属性IDで判別するなら新規に属性IDを割り当てた上でif文を追加する必要があります。オリジナルでは軍隊呼びの22までしか使ってないらしいので23でも割り当てればいいのではないでしょうか(他に影響があるかどうかは不明)。もしくは戦闘行動ID決め打ちで判別してもいいと思います。これなら他に影響を与えることはありません。

  3. 匿名 より:

    こんばんわ。毎度エントリーを参考にさせていただいています。

    上記のエントリーを参考にROMをいじりましたが
    下記の処理が有効になっていないように思います。
    私の環境だけかもしれませんが、念のためご確認いただけると幸いです。

    スルーされている処理
    02FBA1~02FBAE

    02FBB2でDP(04)の値をとってきますが、ここで賢さがそのまま代入されてしまい、ダメージ基礎値に賢さをそのまま加算しているようでした。

    管理者より返信:

    デバッガでDP(04)の値を見てください。手元にこのときのROMが残ってないのでわかりませんが、実装を見る限り問題ないように見えます。もしかしたら$000C88ではなく$000D0Cをコールするべきなのかもしれません。

  4. 匿名 より:

    返信ありがとうございます。デバッガで確認したところ、34が入っており、対象キャラクターの賢さ52と一致しているのを確認しました。コール先の変更案を試してみてNGの場合は≫で値を1/4にして加算するよう方法で回避する案を試してみようと思います。