DQ3 盾の耐性を定数ダメージカットに変更+耐性についてのお勉強他

今回の変更は個人的趣味というか別にやってもやらなくてもどうでもいいのですが、まあ勉強も兼ねてということでお付き合いください。

PC側の耐性によるダメージ減処理はSR:$02BBD5、そしてその内部でコールしているSR:$02BBF4で行っています。他の改造パッチでも実現されていますが、実は武器にも耐性を設定することが可能です。最初このSRを見たとき、「効果が重複する場合には効果が現れないのでは?」と思っていたのですが、大間違いでした。耐性によるダメージ減処理を開始する直前に元となるダメージ値が$7E2474-5にセットされ、武器→鎧→盾→兜→装飾品の順で装備品の耐性値を見て、耐性が存在する場合はこの$7E2474-5の値に対して減算処理を繰り返すため、効果が重複する場合はちゃんと重複して発生することになります。

さて、後のDQ作品では定番になっている「盾の耐性を定数ダメージカットにする」を導入することにします。耐性計算の順番をちょっと変えて武器→鎧→兜→装飾品→盾とし、さらに耐性情報に設定できる値を「ダメージカットされる定数」とします。

  • SR: $02BBF4 PC側耐性計算メイン
02BBF4LDA #$0000A=#$0000武器の種別ID
02BBF7JSL $C44A03SR: $044A03 引数:1#$06 引数:2#$FD 引数:3#$FF 引数:4#$FF装備品アイテムID取得
02BBFFSTA $242C$242C=A
02BC02JSR $BC4ASR: $02BC4A耐性を考慮したダメージ値計算
02BC05LDA #$0001A=#$0001鎧の種別ID
02BC08JSL $C44A03SR: $044A03 引数:1#$06 引数:2#$FD 引数:3#$FF 引数:4#$FF装備品アイテムID取得
02BC10STA $242C$242C=A
02BC13JSR $BC4ASR: $02BC4A耐性を考慮したダメージ値計算
02BC16LDA #$0003A=#$0003兜の種別ID
02BC19JSL $C44A03SR: $044A03 引数:1#$06 引数:2#$FD 引数:3#$FF 引数:4#$FF装備品アイテムID取得
02BC21STA $242C$242C=A
02BC24JSR $BC4ASR: $02BC4A耐性を考慮したダメージ値計算
02BC27LDA #$0004A=#$0004装飾品の種別ID
02BC2AJSL $C44A03SR: $044A03 引数:1#$06 引数:2#$FD 引数:3#$FF 引数:4#$FF装備品アイテムID取得
02BC32STA $242C$242C=A
02BC35JSR $BC4ASR: $02BC4A耐性を考慮したダメージ値計算
02BC38LDA #$0002A=#$0002盾の種別ID
02BC3BJSL $C44A03SR: $044A03 引数:1#$06 引数:2#$FD 引数:3#$FF 引数:4#$FF装備品アイテムID取得
02BC43STA $242C$242C=A
02BC46JSR $E528SR: $02E528盾耐性値計算
02BC49RTSreturn

  • SR: $02E528 盾耐性値計算(新SR)
02E528PHPPush P Flag
02E529PHXPush X
02E52APHYPush Y
02E52BLDY #$003FY=#$003F
02E52EJSL $C90566SR: $090566 引数:1#$00 引数:2#$0003 引数:3#$C2D160 引数:4#$0002 引数:5#$000020構造体アクセス
02E53DCMP $2476A==$2476?
02E540BNE #$14if(z==off) goto $02E556
02E542JSL $C90566SR: $090566 引数:1#$00 引数:2#$0003 引数:3#$C2D160 引数:4#$0000 引数:5#$0000FF構造体アクセス
02E551CMP $242CA==$242C?
02E554BEQ #$07if(z==on) goto $02E55D
02E556DEYY–
02E557BPL #$D5if(n==off) goto $02E52E
02E559PLYPull Y
02E55APLXPull X
02E55BPLPPull P Flag
02E55CRTSreturn
02E55DLDX $242AX=$242A
02E560JSL $C2CC25SR: $02CC25 引数:1#$0076 引数:2#$00F8戦闘行動構造体アクセスSR
02E568CMP #$001FA>=#$001F?
02E56BBCS #$FEif(c==on) goto $02E56B
02E56DASLA<<1
02E56ETAXX=A
02E56FJSR $393CSR: $($02393C+X)
02E572BEQ #$21if(z==on) goto $02E595
02E574JSL $C90566SR: $090566 引数:1#$00 引数:2#$0003 引数:3#$C2D160 引数:4#$0001 引数:5#$0000FF構造体アクセス
02E583STA $6ADP($6A)=A
02E585LDA $2474A=$2474
02E588SECc=on
02E589SBC $6AA-=(DP($6A)+c)
02E58BBMI #$05if(n==on) goto $02E592耐性計算した結果がマイナスになったらダメージを0化する必要がある
02E58DSTA $2474$2474=A
02E590BRA #$03goto $02E595
02E592STZ $2474$2474=#$00
02E595PLYPull Y
02E596PLXPull X
02E597PLPPull P Flag
02E598RTSreturn

途中まではオリジナルの耐性計算をするSR:$02BC4Aと同じです。違うのは装備品の耐性値を取得した後、掛け算をするのではなく、引くという点だけです。ところで、実害はない潜在バグだと思うのですが、

02BC05LDA #$0001A=#$0001鎧の種別ID
02BC08JSL $C44A03SR: $044A03 引数:1#$06 引数:2#$FD 引数:3#$FF 引数:4#$FF装備品アイテムID取得

で、装備品のアイテムIDをAレジスタに取得するのですが、もし未装備の場合は直前で指定したAレジスタの値(この場合は#$0001)がそのまま返ってきて、その値がアイテムIDとしてセットされてしまいます。未装備の場合はc=onになるので、c=onなら直後の耐性計算をスキップする、とするのが正しい処理です。実際はアイテムID0~5の初期に登場する武器には耐性が存在しないので実害はないのですが、もしこれらに耐性を設定しようとする場合には上記のように未装備ならスキップ、という処理をはさむ必要があります。

コメント

タイトルとURLをコピーしました