DQ3 誘惑の剣に混乱の追加効果を付ける

久しぶりの質問コーナーです。質問内容は

DQ3で誘惑の剣で攻撃したときに混乱の追加効果を付けたい

です。質問者の方は途中までは到達していたようですが、実装方法は色々あるということでやってみることにします。

まず、そもそもDQ3にはモンスター側が使用してくる戦闘行動ID:3「眠り攻撃」、ID:4「毒攻撃」、ID:5「マヒ攻撃」というダメージ発生後に追加効果がつくものがあります。混乱についてもこの並びで捉えるのがいいでしょう。実装の方針としては以下のとおり。例によってベースはDQ3 Extended ver1.444を使用しています。

  1. 追加効果を持つ直接攻撃として「混乱攻撃」を戦闘行動に追加
  2. 直接攻撃コマンド選択直後に「誘惑の剣を装備している場合」のみ戦闘行動IDを「混乱攻撃に差し替える」

まずは混乱攻撃の戦闘行動の定義・実装を行います。戦闘行動ID:$112に$003の眠り攻撃の内容をコピーします。変えるべき点は2点、「属性ID」を24にするのとエフェクト開始アドレスを$8D72にするだけです。次に以下の固定長データの場所をサイズを増やすために移動し、レコード数を増やします。今回は混乱攻撃の成功率としてモンスターのメダパニ耐性の設定値を使用し、成功率は100%、87.5%、75%、0%とします。

移動前 移動後 増やすレコード数 追加したレコードに設定する値
追加効果つきの直接攻撃戦闘行動ID $028903 $02D260 +1 $0112
追加効果直接攻撃処理SR $028909 $02D268 +1 $D270
モンスター耐性情報取得 $02C403 $02D300 +1 $D2AF
PC耐性情報取得 $02BCB7 $02D332 +1 $BCE7
モンスター耐性閾値 $02C3DB 移動なし +4(任意) $100,$E0,$C0,$00(任意)

固定長データの拡張に伴い、参照しているSRを変更します。

  • SR: $0288CF 眠り毒麻痺追加攻撃処理
0288EC LDX #$0006 X=#$0006 4から変更
0288EF LDA $23EE A=$23EE
0288F2 CMP $C2D260,X A==$02D260+X? 開始アドレスを変更
0288FE JSR $D268 SR: $($02D268+X) SR配列のアドレスを変更
  • SR: $02BC7D 耐性を考慮したダメージ値等計算(PC側)
02BC88 CMP #$0019 A>=#$0019? 属性IDを追加したら合わせて変更しないとフリーズする
02BC8F JSR $D332 SR: $($02D332+X) 開始アドレスを変更
  • SR: $02C3BF モンスター固定情報取得SR_SR_000B
02C3CA CMP #$0019 A>=#$0019? 属性IDを追加したら合わせて変更しないとフリーズする
02C3D1 JSR $D300 SR: $($02D300+X) 開始アドレスを変更

次は混乱の追加効果の判定処理を実装します。

  • SR: $02D270 混乱追加処理(新SR)
02D270 JSL $C2A406 SR: $02A406 耐性を考慮して成否判定(成功c=on)
02D274 BCC #$1C if(c==off) goto $02D292
02D276 JSL $C2BE8A SR: $02BE8A 引数:1#$28 混乱状態取得(混乱中c=on)
02D27B BCS #$0F if(c==on) goto $02D28C
02D27D JSL $C2B673 SR: $02B673 混乱化+混乱直後の処理(戦闘行動変更?)
02D281 JSL $C2B977 SR: $02B977 パーティウィンドウ再描画?
02D285 JSL $C1A867 SR: $01A867 引数:1#$0044 戦闘メッセージ表示「混乱した」
02D28B RTS return
02D28C JSL $C1A867 SR: $01A867 引数:1#$0045 戦闘メッセージ表示「ますます混乱した」
02D292 RTS return

混乱発生時にエフェクトを入れたらよりそれっぽくなると思いますが省略します。メダパニの場合はすでに混乱中のキャラクターにメダパニをかけた場合には必ず「ますます混乱した」と表示されますが、今回は追加効果が発生した場合に相手がすでに混乱中の場合にのみ表示するようにしました。

  • SR: $02D2AF 混乱追加効果耐性情報取得
02D2AF JSL $C2CC92 SR: $02CC92 引数:1#$0021 引数:2#$000C メダパニ耐性情報取得
02D2B7 CLC c=off
02D2B8 ADC #$0014 A+=(#$0014+c)
02D2BB RTS return

これで「混乱の追加効果を持つ直接攻撃」が実装できました。次に戦闘コマンド入力で直接攻撃かつ装備が誘惑の剣なら戦闘行動IDを差し替えるようにします。

  • SR: $02D2BC 戦闘コマンド入力処理_直接攻撃(新SR)
02D2BC JSR $5EC3 SR: $025EC3 戦闘コマンド入力処理_直接攻撃
02D2BF BCS #$03 if(c==on) goto $02D2C4
02D2C1 JSR $D2C6 SR: $02D2C6 誘惑の剣装備時の直接攻撃戦闘行動ID差し替え
02D2C4 CLC c=off
02D2C5 RTS return
  • SR: $02D2C6 誘惑の剣装備時の直接攻撃戦闘行動ID差し替え(新SR)
02D2C6 LDX $2428 X=$2428
02D2C9 LDA #$0000 A=#$0000 種別=武器をセット
02D2CC JSL $C2B8AA SR: $02B8AA 装備アイテムID取得
02D2D0 LDA $242C A=$242C
02D2D3 CMP #$0017 A==#$0017? 誘惑の剣を装備しているか
02D2D6 BNE #$15 if(z==off) goto $02D2ED
02D2D8 JSL $C2CAD9 SR: $02CAD9 引数:1#$2034 引数:2#$01FF 戦闘行動ID取得
02D2E0 JSR $D2EE SR: $02D2EE ID差し替え処理
02D2E3 BCC #$08 if(c==off) goto $02D2ED
02D2E5 JSL $C2CB70 SR: $02CB70 引数:1#$2034 引数:2#$01FF 戦闘行動IDせっと
02D2ED RTS return
  • SR: $02D2EE ID差し替え処理(新SR)
02D2EE CMP #$0001 A==#$0001?
02D2F1 BNE #$05 if(z==off) goto $02D2F8
02D2F3 LDA #$0112 A=#$0112
02D2F6 SEC c=on
02D2F7 RTS return
02D2F8 CLC c=off
02D2F9 RTS return

コメント

  1. Dt より:

    まどろみのけんを作ってみようと戦闘行動とその中身(ほぼ眠り攻撃のコピペで属性IDを10、効果発生時にエフェクト)
    を作ってみたのですが、追加効果が発生はすることはあるものの、攻撃そのものがミス連発する現象が起きてしまいます。
    ラリホー系耐性の高いモンスターほど攻撃がミスになっているようなのと、属性IDを0にすると攻撃のミス自体はなくなったので攻撃部分にまで耐性判定がされている?ような感じはするのですが。
    試しにオリジナルの眠り攻撃の属性IDと中身をまどろみのけん用に変えて差し替えて使ってみたところ
    望み通りの挙動になったのですが、原因が分かりません。

  2. Dt より:

    すみません、自己解決しました。
    「291A8 耐性を考慮してダメージ調整」に新しく作ったまどろみのけん用の戦闘行動IDを追加していなかったのが原因でした。