久しぶりの質問コーナーです。質問内容は
DQ3で誘惑の剣で攻撃したときに混乱の追加効果を付けたい
です。質問者の方は途中までは到達していたようですが、実装方法は色々あるということでやってみることにします。
まず、そもそもDQ3にはモンスター側が使用してくる戦闘行動ID:3「眠り攻撃」、ID:4「毒攻撃」、ID:5「マヒ攻撃」というダメージ発生後に追加効果がつくものがあります。混乱についてもこの並びで捉えるのがいいでしょう。実装の方針としては以下のとおり。例によってベースはDQ3 Extended ver1.444を使用しています。
- 追加効果を持つ直接攻撃として「混乱攻撃」を戦闘行動に追加
 - 直接攻撃コマンド選択直後に「誘惑の剣を装備している場合」のみ戦闘行動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 | 

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