DQ3戦闘部分解説20

  • SR: $02913E PC側耐性計算
02913E LDA $23E8 A=$7E23E8
029141 STA $2428 $7E2428=A
029144 JSL $02BE8A SR: $02BE8A 引数:1#$22 行動対象の敵味方判定(c=onなら敵)
029149 BCS #$2D if(c==on) goto $029178
02914B TAY Y=A
02914C LDA $23EE A=$7E23EE 戦闘行動をセット
02914F STA $242A $7E242A=A
029152 LDA $00 A=$000000 ダメージ値をAレジスタにセット
029154 JSL $02BBD5 SR: $02BBD5 PC側ダメージ系耐性計算
029158 STA $00 $000000=A
02915A LDA $23F2 A=$7E23F2
02915D BNE #$19 if(z==off) goto $029178
02915F LDX $08 X=$000008
029161 LDA $020079,X A=$020079+X
029165 AND #$0008 A&=#$0008 戦闘行動がなげきのたてで転嫁できる行動か
029168 BEQ #$0E if(z==on) goto $029178
02916A LDA #$0069 A=#$0069 なげきのたてのアイテムID
02916D STA $242C $7E242C=A
029170 JSL $02B87A SR: $02B87A アイテム装備チェック
029174 BVC #$02 if(v==off) goto $029178
029176 LSR $00 $000000>>1 なげきのたてのダメージ値 他のPCに転嫁するため1/2する
029178 RTS return

なげきのたて装備時にはダメージを半減させ、追加処理でPC側の誰かに同じだけ肩代わりさせます。

  • SR: $02BBD5 PC側ダメージ系耐性計算
02BBD5 PHP Push P Flag
02BBD6 PHB Push DB
02BBD7 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
02BBD9 PEA $7E7E Push $7E7E
02BBDC PLB Pull DB
02BBDD PLB Pull DB
02BBDE PHX Push X
02BBDF PHY Push Y
02BBE0 STA $2474 $7E2474=A
02BBE3 LDA #$0000 A=#$0000 ダメージ系耐性フラグ
02BBE6 STA $2476 $7E2476=A
02BBE9 JSR $BBF4 SR: $02BBF4 PC側耐性計算メイン
02BBEC LDA $2474 A=$7E2474
02BBEF PLY Pull Y
02BBF0 PLX Pull X
02BBF1 PLB Pull DB
02BBF2 PLP Pull P Flag
02BBF3 RTL return

耐性値によるダメージ減算処理については以前解説したのでここでは省略します。タグ「耐性変更」で見てください。

  • SR: $029179 フバーハ時のダメージ軽減計算
029179 LDX $08 X=$000008
02917B LDA $020079,X A=$020079+X
02917F AND #$0001 A&=#$0001 戦闘行動がフバーハに影響されるか
029182 BEQ #$16 if(z==on) goto $02919A
029184 LDX $0A X=$00000A
029186 LDA $2051,X A=$7E2051+X
029189 AND #$0020 A&=#$0020 行動対象がフバーハ中
02918C BEQ #$0C if(z==on) goto $02919A
02918E ASL $00 $000000<<1
029190 LDX #$0000 X=#$0000
029193 LDA #$0003 A=#$0003
029196 JSL $00121C SR: $00121C $00,X(2B)=$00,X(2B)/A(1B) 剰余=A ダメージ値を2/3にする
02919A RTS return
  • SR: $02919B 防御時のダメージ軽減計算
02919B LDX $0A X=DP($0A)
02919D LDA $2050,X A=$2050+X
0291A0 AND #$0080 A&=#$0080 行動対象が防御中
0291A3 BEQ #$02 if(z==on) goto $0291A7
0291A5 LSR $00 DP($00)>>1 ダメージ値を1/2
0291A7 RTS return
  • SR: $0291A8 耐性によるダメージ調整
0291A8 LDA $23EE A=$23EE
0291AB CMP #$001A A==#$001A? 戦闘行動がメガンテなら調整しない
0291AE BEQ #$2A if(z==on) goto $0291DA
0291B0 CMP #$0003 A==#$0003? 戦闘行動が眠り攻撃なら調整しない
0291B3 BEQ #$25 if(z==on) goto $0291DAなら調整しない
0291B5 CMP #$0004 A==#$0004? 戦闘行動が毒攻撃か
0291B8 BEQ #$20 if(z==on) goto $0291DAなら調整しない
0291BA CMP #$0005 A==#$0005? 戦闘行動が麻痺攻撃かなら調整しない
0291BD BEQ #$1B if(z==on) goto $0291DA
0291BF CMP #$00AA A==#$00AA? 戦闘行動がドラゴラムの炎なら固定の耐性計算をする
0291C2 BEQ #$17 if(z==on) goto $0291DB
0291C4 CMP #$0085 A==#$0085? 戦闘行動が聖水なら固定の耐性計算をする
0291C7 BEQ #$12 if(z==on) goto $0291DB
0291C9 CMP #$00CE A==#$00CE? 戦闘行動が王様ごっこなら調整しない
0291CC BEQ #$0C if(z==on) goto $0291DA
0291CE CMP #$00CF A==#$00CF? 戦闘行動が女王様ごっこなら調整しない
0291D1 BEQ #$07 if(z==on) goto $0291DA
0291D3 JSR $A3EB SR: $02A3EB 耐性を考慮して成否判定+PC側確率系耐性計算?
0291D6 BCS #$02 if(c==on) goto $0291DA
0291D8 STZ $00 DP($00)=#$00
0291DA RTS return
0291DB JSR $A3CE SR: $02A3CE 確率に依存しない耐性計算?
0291DE RTS return
  • SR: $0291DF 毒針装備時の一撃必殺失敗(1ダメージ)
0291DF LDA $23F2 A=$23F2
0291E2 BNE #$1B if(z==off) goto $0291FF
0291E4 LDX $08 X=DP($08)
0291E6 LDA $02007A,X A=$02007A+X
0291EA AND #$0020 A&=#$0020 毒針装備時に1ダメージが発生する戦闘行動か
0291ED BEQ #$10 if(z==on) goto $0291FF
0291EF LDA $245C A=$245C ?
0291F2 AND #$00FF A&=#$00FF
0291F5 CMP #$0009 A==#$0009?
0291F8 BNE #$05 if(z==off) goto $0291FF
0291FA LDA #$0001 A=#$0001 ダメージ1を設定
0291FD STA $00 DP($00)=A
0291FF RTS return

このSRを抜けると最終的なダメージが確定するので、確定したダメージ値を使って後処理を行います。

  • SR: $029200 ダメージ確定後の処理メイン
029200 PHP Push P Flag
029201 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
029203 PHA Push A
029204 PHX Push X
029205 PHY Push Y
029206 PHB Push DB
029207 PEA $7E7E Push $7E7E
02920A PLB Pull DB
02920B PLB Pull DB
02920C LDA $23E8 A=$23E8
02920F STA $2428 $2428=A
029212 STZ $BE83 $7EBE83=#$00 ダメージ用バッファ上2バイト初期化
029215 LDA $23FA A=$7E23FA
029218 STA $BE81 $7EBE81=A ダメージ用バッファにダメージ値をセット
02921B BNE #$0C if(z==off) goto $029229
02921D JSR $92CE SR: $0292CE ダメージ0時メッセージ表示
029220 PLB Pull DB
029221 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
029223 PLY Pull Y
029224 PLX Pull X
029225 PLA Pull A
029226 PLP Pull P Flag
029227 CLC c=off
029228 RTL return
029229 JSR $9312 SR: $029312 ダメージ発生時エフェクト処理?
02922C LDA $23FA A=$23FA
02922F STA $00 DP($00)=A
029231 JSL $02BE8A SR: $02BE8A 引数:1#$06 HP減算処理
029236 PHP Push P Flag
029237 JSR $925C SR: $02925C ダメージメッセージ表示
02923A JSR $927B SR: $02927B
02923D JSL $02B977 SR: $02B977 パーティウィンドウ再描画?
029241 JSL $031394 SR: $031394
029245 PLP Pull P Flag
029246 BCC #$0B if(c==off) goto $029253
029248 JSL $02CFCE SR: $02CFCE 消滅処理?
02924C JSR $92AC SR: $0292AC HP0時メッセージ表示
02924F JSL $02B054 SR: $02B054 行動対象者を戦闘から離脱させる処理メイン
029253 PLB Pull DB
029254 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
029256 PLY Pull Y
029257 PLX Pull X
029258 PLA Pull A
029259 PLP Pull P Flag
02925A SEC c=on
02925B RTL return

ダメージが発生する戦闘行動はこのSRを呼ぶ必要があります(逆に言うとダメージ確定してこのSRを呼ぶだけでOK)。