DQ3 アイテム耐性をダメージ系と確率系を同居させる

DQ3のアイテムに付与できる耐性は「ダメージ呪文+ブレス系」と「ザキ・メガンテの確率系」のどちらか一方しか設定できません。以前バイナリ神スレで「1つのアイテムに両方の耐性を持たせられないか」という話題が上がったことがあったのですが、あまり興味の無かった自分は完全スルーしていました。最近耐性計算の仕組みがいろいろとわかってきて、実はそれほど大変ではないということがわかったので説明します。

アイテムに付与されている耐性がダメージ系か確率系かは耐性アイテム($02D160-)*1の2バイト目5ビット目の1ビットで切り替えています。このビットがOFFの場合はダメージ系の耐性が有効になり、ONの場合は確率系の耐性が有効になる、というのがオリジナルの仕様です。このビットがチェックされるのは以下の部分です。

  • SR: $02BC4A 耐性を考慮したダメージ値等計算
02BC4F JSL $C90566 SR: $090566 引数:1#$00 引数:2#$0003 引数:3#$C2D160 引数:4#$0002 引数:5#$000020 構造体アクセス
02BC5E CMP $2476 A==$2476? アイテムの耐性がダメージ系か確率系か
02BC61 BNE #$14 if(z==off) goto $02BC77

Aレジスタの値が$7E2476と同じ場合は、この後いろいろありますが耐性値に基づくダメージ減算処理が行われます。次に、$7E2476とは何かを見てみます。

  • SR: $02BBD5 PC側ダメージ系耐性計算
02BBE3 LDA #$0000 A=#$0000 ダメージ系耐性種類セット
02BBE6 STA $2476 $2476=A
02BBE9 JSR $BBF4 SR: $02BBF4 PC側耐性計算メイン
  • SR: $02BBB6 PC側確率系耐性計算
02BBC4 LDA #$0001 A=#$0001 確率系耐性種類セット
02BBC7 STA $2476 $2476=A
02BBCA JSR $BBF4 SR: $02BBF4 PC側耐性計算メイン

というわけで、ダメージ系、確率系の耐性計算をする直前で耐性種類の値が$7E2476にセットされているために、対応したアイテムの耐性しか有効にならない、ということになります。これを変えるにはどうしたらいいか、というと非常に簡単で、

  1. $02BBC5を#$0000に変える
  2. 全ての耐性アイテムの耐性種類フラグをOFFにする

この2点を行えばいいことになる、と思っていたのですが、さらに追加で考慮すべきことがありました。次にダメージ計算を行っているSRの内部を見てみます。

  • SR: $028EFB ダメージ計算処理
028F39 JSR $913E SR: $02913E PC側ダメージ系耐性処理<–ダメージ減処理
028F42 JSR $91A8 SR: $0291A8 モンスター側耐性処理<–確率による命中?判定

ダメージ系の戦闘行動は直接攻撃であろうが呪文攻撃であろうが全てこのSRが実行されます。DQ3ではオリジナルはPC側は耐性によってダメージが減少する一方、モンスター側はダメージが0になるか否かを確率によって判定する、という仕様になっているため、2種類の耐性計算を行っているのです。SR:$02913Eでは先頭で敵味方判定を行い、モンスターなら処理をスキップするようになっています。一方SR:$0291A8では耐性を加味した確率による命中判定を行い、ダメージ0化処理も行いますが、PC側はダメージ系の戦闘行動時には上記SR:$02BBB6中の$7E2476と耐性アイテムの2バイト目5ビット目が一致しないため、必中扱いになります。もし、「$02BBC5を#$0000に変える」だけをすると、PC側に対して、「ダメージ減処理」+「確率による命中判定」の両方が動いてしまうため、よろしくありません。どうすればいいかと言うと、$291A8のところで、敵味方判定を行い、PC側なら処理をスキップするようにすればいいわけです。

  • SR: $0291A8 成功率・耐性によるダメージ0化処理
0291D3 JSR $EA14 SR: $02EA14 モンスター側のみ耐性を加味して成否判定
  • SR: $02EA14 モンスター側のみ耐性を加味して成否判定(新SR)
02EA14 LDA $23E8 A=$23E8
02EA17 STA $2428 $2428=A
02EA1A JSL $C2BE8A SR: $02BE8A 引数1:#$22 敵味方判定
02EA1F BCC #$04 if(c==off) goto $02EA25 offならPC側
02EA21 JSR $A3EB A3 SR: $02A3EB 確率による成否判定
02EA24 RTS return
02EA25 CLC c=on c=onにしてリターンしないとダメージが0になってしまう
02EA26 RTS return

ちゃんとテストしていませんが、この変更作業をすれば、当初の目的であった「1アイテムにダメージ系+確率系の耐性をもたせる」ことができるようになるはずです(間違ってたら指摘よろしく)。ちなみにこの修正はDQ3SFC K.Mixには今のところ入れる予定はありません。

*1:拡張パッチ使用のためアドレスが移動しています