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にセットされているために、対応したアイテムの耐性しか有効にならない、ということになります。これを変えるにはどうしたらいいか、というと非常に簡単で、
- $02BBC5を#$0000に変える
- 全ての耐性アイテムの耐性種類フラグを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:拡張パッチ使用のためアドレスが移動しています
コメント