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

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

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

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

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

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

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

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

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

  • SR: $02FB36 種族特攻+呪文加算ダメージ補正処理(新SR)
02FB36JSR $85B5SR: $0285B5
02FB39JSR $FB3DSR: $02FB3D
02FB3CRTSreturn
  • SR: $02FB3D 賢さに応じてダメージ加算(新SR)
02FB3DPHAPush A念のためスタックに退避
02FB3EPHXPush X念のためスタックに退避
02FB3FPHYPush Y念のためスタックに退避
02FB40JSR $FB4CSR: $02FB4C補正対象の戦闘行動か(該当c=on)
02FB43BCC #$03if(c==off) goto $02FB48
02FB45JSR $FB7ESR: $02FB7E呪文ダメージ加算処理
02FB48PLYPull Y
02FB49PLXPull X
02FB4APLAPull A
02FB4BRTSreturn

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

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

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

  • SR: $02FB60 戦闘行動が呪文ダメージ加算対象か(該当c=on)
02FB60LDX $255FX=$255F戦闘行動IDをセット
02FB63JSL $C2F0FCSR: $02F0FC 引数:1#$C65D 引数:2#$0001対象の行動が「呪文」か
02FB6BBEQ #$0Fif(z==on) goto $02FB7C
02FB6DJSL $C2F0FCSR: $02F0FC 引数:1#$C662 引数:2#$001F対象の行動の属性を取得
02FB75CMP #$0006A>=#$0006?属性の判定
02FB78BCS #$02if(c==on) goto $02FB7C
02FB7ASECc=on
02FB7BRTSreturn
02FB7CCLCc=off
02FB7DRTSreturn

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

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

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

  • SR: $02FB7E 呪文ダメージ加算処理(新SR)
02FB7ELDA $04A=DP($04)何で使われているか不明なのでスタックに避難
02FB80PHAPush A
02FB81LDA $06A=DP($06)何で使われているか不明なのでスタックに避難
02FB83PHAPush A
02FB84STZ $04DP($04)=#$000で初期化
02FB86STZ $06DP($06)=#$000で初期化
02FB88LDX $2555X=$2555
02FB8BJSL $C2EFA7SR: $02EFA7 引数:1#$204F 引数:2#$01FF
02FB93CMP #$0100A==or>=#$0100?
02FB96AND #$00FFA&=#$00FFキャラクターIDを取得
02FB99TAYY=A
02FB9AJSL $C44ACBSR: $044ACB 引数:1#$07 引数:2#$FD 引数:3#$04賢さ取得してDP(04)にセット
02FBA1LDA #$0032A=#$003250で割る
02FBA4LDX #$0004X=#$0004
02FBA7JSL $C00DE2SR: $000DE2$00,X(2B)=$00,X(2B)/A(1B) 剰余=A
02FBABLDA #$0005A=#$00055を掛ける
02FBAEJSL $C00C88SR: $000C88DP($00+X)(2B)=A(1B)*DP($00+X)(1B)
02FBB2LDA $04A=DP($04)
02FBB4CLCc=off
02FBB5ADC $00A+=(DP($00)+c)素のダメージ値に加算
02FBB7STA $00DP($00)=A
02FBB9PLAPull A
02FBBASTA $06DP($06)=Aスタックに避難させたものを戻す
02FBBCPLAPull A
02FBBDSTA $04DP($04)=Aスタックに避難させたものを戻す
02FBBFRTSreturn

若干アレなコードになっていますが、計算用のバッファとして使いたい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決め打ちで判別してもいいと思います。これなら他に影響を与えることはありません。

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。