DQ3 モンスターの攻撃呪文の耐性をダメージ減少率に変更する

もはやSFCDQ3の改造の定番とも言える「モンスターのダメージ系の呪文の耐性を成功確率からダメージ減少率に変える」を実装します。マップ編集の作業が辛すぎて、ついふらふらと気分転換がてら別の変更に手を出してしまいました(後日作業環境の整備の結果、マップ編集作業はかなり楽になりました)。また、オリジナルでは割合の数値は100%・75%?・30%・0%だったのを、150%(弱点)・100%(耐性なし)・50%(半減)・0%(無効)とし、弱点呪文の場合はダメージが増えるようにも設定できるようにします。150%というのはやりすぎなので125%くらいに調整するかもしれません。かなりのモンスターに弱点が設定されているFFとは違い、DQではあからさまに弱点がありそうなモンスターというのは炎や氷からできているモンスターくらいなのでいまいちそぐわないかもしれません。

  • SR: $0291A8 耐性によるダメージ0化処理
0291D3 JSR $DAF9 SR: $02DAF9 耐性を考慮した呪文等結果処理
  • SR: $02DAF9 耐性を考慮した呪文等結果処理(新SR)
02DAF9 JSR $DB02 SR: $02DB02 ダメージ系呪文を耐性を考慮してダメージ値調整(調整c=on)
02DAFC BCS #$03 if(c==on) goto $02DB01
02DAFE JSR $A3EB SR: $02A3EB
02DB01 RTS return
  • SR: $02DB02 ダメージ系呪文を耐性を考慮してダメージ値調整(調整c=on)(新SR)
02DB02 JSR $DB3E SR: $02DB3E 戦闘行動がダメージ値調整対象になるか
02DB05 BCC #$35 if(c==off) goto $02DB3C
02DB07 LDA $23E8 A=$23E8
02DB0A STA $2428 $2428=A
02DB0D LDA $23EE A=$23EE
02DB10 STA $242A $242A=A
02DB13 JSL $C2C240 SR: $02C240 引数:1#$16
02DB18 CMP #$0100 A==#$0100? 耐性値0
02DB1B BNE #$0A if(z==off) goto $02DB27
02DB1D LDA $00 A=DP($00)
02DB1F LSR A>>1
02DB20 NOP (125%に抑えたい場合はここを4Aに変更する)
02DB21 ADC $00 A+=(DP($00)+c)
02DB23 STA $00 DP($00)=A ダメージ150%化
02DB25 BRA #$13 goto $02DB3A
02DB27 CMP #$004C A==#$004C?
02DB2A BNE #$04 if(z==off) goto $02DB30
02DB2C LSR $00 DP($00)>>1 ダメージ50%化
02DB2E BRA #$0A goto $02DB3A
02DB30 CMP #$0000 A==#$0000?
02DB33 BNE #$05 if(z==off) goto $02DB3A
02DB35 LDA #$0000 A=#$0000
02DB38 STA $00 DP($00)=A ダメージ無効化
02DB3A SEC c=on
02DB3B RTS return
02DB3C CLC c=off
02DB3D RTS return

(2009-10-06追記)
以下のSR: $02DB3Bは不完全なためhttps://retrogamehackers.net/dq3-battlesystem-mod-012/で修正しています。以下の実装は使用を推奨しません。

  • SR: $02DB3B 戦闘行動がダメージ値調整対象になるか(対象c=on)(新SR)
02DB3E PHX Push X
02DB3F LDX $23E8 X=$7E23E8
02DB42 STX $2428 $7E2428=X
02DB45 JSL $C2CAD9 SR: $02CAD9 引数1:#$203C 引数2:#$00FF ターゲットのグループ番号を取得
02DB4D CMP #$0005 A>=#$0005? 味方側か?
02DB50 BCS #$30 if(c==on) goto $02DB82
02DB52 LDA $23EE A=$7E23EE 戦闘行動IDチェック
02DB55 CMP #$0006 A>=#$0006? メラ未満か?
02DB58 BCC #$28 if(c==off) goto $02DB82
02DB5A CMP #$0018 A>=#$0018? ザキ未満か?
02DB5D BCC #$20 if(c==off) goto $02DB7F
02DB5F CMP #$0057 A>=#$0057? ひのいき未満か?
02DB62 BCC #$1E if(c==off) goto $02DB82
02DB64 CMP #$005D A>=#$005D? どくのいき未満か?
02DB67 BCC #$16 if(c==off) goto $02DB7F
02DB69 CMP #$006C A>=#$006C? まどうしのつえ未満か?
02DB6C BCC #$14 if(c==off) goto $02DB82
02DB6E CMP #$0073 A>=#$0073? くさなぎのけん未満か?
02DB71 BCC #$0C if(c==off) goto $02DB7F
02DB73 CMP #$010D A>=#$010D? しゃくねつ未満か?
02DB76 BCC #$0A if(c==off) goto $02DB82
02DB78 CMP #$010E A>=#$010E? にらみつけ未満か?
02DB7B BCC #$02 if(c==off) goto $02DB7F
02DB7D BRA #$03 goto $02DB82
02DB7F SEC c=on
02DB80 BRA #$01 goto $02DB83
02DB82 CLC c=off
02DB83 PLX Pull X
02DB84 RTS return

この変更に伴い、全モンスターの耐性を見直します。オリジナルでは0%と100%の間には30%、70%と2つ段階があったのに対し、今回の変更では0%と100%の間には50%だけになるので、オリジナルと全く同じ設定をする、というわけにはいきません。炎系呪文の耐性が30%で残りが70%のような場合には耐性を付けたい場合は全部50%を設定するしかないわけでこうした場合の濃淡が付けられないという欠点があります。どっか1ビット余計に使えればいいんですが。テストをして50%耐性のあるモンスターに使ってダメージが半減していればとりあえずOKです。