です。基本的にはDQ6はDQ3と同じ構成なので、ダメージ確定処理の補正処理中に処理を挟んでやればいいということになります。DQ6の戦闘部分の解析は全部終わっていないので理解度はあまり高くありませんが、まあなんとかなるはず。というわけで以下の方針で実装します。
- 属性ID+呪文フラグを見て加算対象の戦闘行動を判別する
- キャラクターIDを見て加算対象となる戦闘行動主体を判別する
- 戦闘中に賢さを取得して加算分を算出する
それぞれいろいろやり方はありますが、シンプルかつ無難な方法を取ります。気に入らない場合は各自適当にアレンジしてください。なお、加算値については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ではそうやっていたのを忘れていました)。ただ、メモリ上のどこが使えるのかわからない(調べていないので)ので、とりあえずこれでよしとします。
コメント
ご丁寧にありがとうございます。助かりました。
いつかドラクエ6K.Mixがリリースされることをこっそり願っています
最近ネタもないので手の出しやすそうなDQ6の改造の方針についてつらつら考えたりもしていますが、まだ全く手を付けていません(実際に手を付けるかもまるで不明)。DQ6のほうはさすがにK.Mixという名前にはしないと思いますが。どうせやるんだったら半端の状態で出しているインターフェース改良パッチのデバッグをやってからですかね。ホイミ系の威力も賢さ依存にしたい場合は、属性IDを追加する必要がありますが、具体的にはどのようにいじる必要があるのでしょうか。ID6未満というわけにはいかないのでif分追加ですかね。
ホイミ系はそもそも属性が31で他の戦闘行動と区別がつかないので、属性IDで判別するなら新規に属性IDを割り当てた上でif文を追加する必要があります。オリジナルでは軍隊呼びの22までしか使ってないらしいので23でも割り当てればいいのではないでしょうか(他に影響があるかどうかは不明)。もしくは戦闘行動ID決め打ちで判別してもいいと思います。これなら他に影響を与えることはありません。
こんばんわ。毎度エントリーを参考にさせていただいています。
上記のエントリーを参考にROMをいじりましたが
下記の処理が有効になっていないように思います。
私の環境だけかもしれませんが、念のためご確認いただけると幸いです。
スルーされている処理
02FBA1~02FBAE
02FBB2でDP(04)の値をとってきますが、ここで賢さがそのまま代入されてしまい、ダメージ基礎値に賢さをそのまま加算しているようでした。
デバッガでDP(04)の値を見てください。手元にこのときのROMが残ってないのでわかりませんが、実装を見る限り問題ないように見えます。もしかしたら$000C88ではなく$000D0Cをコールするべきなのかもしれません。
返信ありがとうございます。デバッガで確認したところ、34が入っており、対象キャラクターの賢さ52と一致しているのを確認しました。コール先の変更案を試してみてNGの場合は≫で値を1/4にして加算するよう方法で回避する案を試してみようと思います。