DQ3 盗賊に切り返し(カウンター)を実装する2

今回から実装に移ります。ダメージが発生する前に切り返し判定を行い、発生する場合には行動対象へのダメージ処理をスキップします。

  • SR: $028E70 ダメージ確定メイン
省略
028E8D JSL $CFAF00 SR: $0FAF00 ダメージ確定後の処理メイン(含盗賊の切り返し)
省略
  • SR: $0FAF00 ダメージ確定後の処理メイン(含盗賊の切り返し)(新SR)
0FAF00 JSL $CFADDF SR: $0FADDF 盗賊切り返し発生判定
0FAF04 LDA $2602 A=$2602
0FAF07 AND #$0004 A&=#$0004 切り返しが発生していたらスキップ
0FAF0A BEQ #$05 if(z==on) goto $0FAF11
0FAF0C LDA $23FA A=$23FA ダメージが0ならスキップ
0FAF0F BEQ #$04 if(z==on) goto $0FAF15
0FAF11 JSL $C29200 SR: $029200 ダメージ確定後の処理メイン
0FAF15 RTL return
  • SR: $0FADDF 盗賊切り返し発生判定(新SR)
0FADDF LDA #$0004 A=#$0004
0FADE2 TRB $2602 A ^ $2602
0FADE5 STZ $2603 $2603=#$00
0FADE8 LDA $23FA A=$23FA 受けるダメージが0なら発生しない
0FADEB BNE #$01 if(z==off) goto $0FADEE
0FADED RTL return
0FADEE LDA $2602 A=$2602
0FADF1 AND #$0010 A&=#$0010
0FADF4 BNE #$72 if(z==off) goto $0FAE68
0FADF6 LDA $23AD A=$23AD
0FADF9 AND #$0020 A&=#$0020 会心痛恨判定なら発生しない
0FADFC BEQ #$01 if(z==on) goto $0FADFF
0FADFE RTL return
0FADFF LDX $23EE X=$23EE
0FAE02 JSL $C2CC47 SR: $02CC47 引数:1#$006B 引数:2#$0080 切り返しが発生する戦闘行動か
0FAE0A BNE #$01 if(z==off) goto $0FAE0D
0FAE0C RTL return
0FAE0D LDA $CFADDD A=$0FADDD
0FAE11 CMP #$0100 A>=#$0100?
0FAE14 BCC #$01 if(c==off) goto $0FAE17
0FAE16 RTL return
0FAE17 LDX $23E4 X=$23E4
0FAE1A STX $2428 $2428=X
0FAE1D JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
0FAE25 CMP #$0005 A>=#$0005? 行動対象がPC側か
0FAE28 BCC #$01 if(c==off) goto $0FAE2B
0FAE2A RTL return
0FAE2B LDX $23E8 X=$23E8
0FAE2E STX $2428 $2428=X
0FAE31 JSL $C2BE8A SR: $02BE8A 引数:1#$30
0FAE36 CMP #$0006 A==#$0006? 職業が盗賊か
0FAE39 BEQ #$01 if(z==on) goto $0FAE3C
0FAE3B RTL return
0FAE3C JSL $C2CAD9 SR: $02CAD9 引数:1#$2047 引数:2#$000F 睡眠中か
0FAE44 BEQ #$01 if(z==on) goto $0FAE47
0FAE46 RTL return
0FAE47 JSL $C2BE8A SR: $02BE8A 引数:1#$1C 生死判定
0FAE4C BCC #$01 if(c==off) goto $0FAE4F
0FAE4E RTL return
0FAE4F JSL $C2BE8A SR: $02BE8A 引数:1#$16 麻痺判定
0FAE54 BCC #$01 if(c==off) goto $0FAE57
0FAE56 RTL return
0FAE57 JSL $C2C240 SR: $02C240 引数:1#$1A レベル取得
0FAE5C CMP #$0014 A>=#$0014? レベル20未満なら発生しない
0FAE5F BCS #$01 if(c==on) goto $0FAE62
0FAE61 RTL return
0FAE62 JSR $AE82 SR: $0FAE82 盗賊の切り返し発生判定(発生c=on)
0FAE65 BCS #$01 if(c==on) goto $0FAE68
0FAE67 RTL return
0FAE68 JSR $AF82 SR: $0FAF82 切り返しダメージ計算
0FAE6B LDA #$0004 A=#$0004
0FAE6E TSB $2602 A or $2602 切り返し発生フラグON
0FAE71 RTL return
  • SR: $0FAE82 盗賊の切り返し発生判定(発生c=on)(新SR)
0FAE82 JSR $AF50 SR: $0FAF50 切り返し判定用閾値セット
0FAE85 NOP
0FAE86 LDA $23E8 A=$23E8
0FAE89 STA $2428 $2428=A
0FAE8C LDA #$009E A=#$009E 盗賊の短刀のアイテムID
0FAE8F STA $242C $242C=A
0FAE92 JSL $C2B87A SR: $02B87A アイテム装備チェック
0FAE96 BVC #$05 if(v==off) goto $0FAE9D
0FAE98 LDA #$0200 A=#$0200
0FAE9B BRA #$03 goto $0FAEA0
0FAE9D LDA #$0100 A=#$0100
0FAEA0 LDX #$0000 X=#$0000
0FAEA3 JSL $C011E1 SR: $0011E1 $00,X(4B)=$00,X(2B)*A(2B)(符号込み)
0FAEA7 LDA $01 A=DP($01)
0FAEA9 PHA Push A
0FAEAA JSL $C012D1 SR: $0012D1 乱数発生 $00-FF
0FAEAE CMP $01,S A>=Stack($01)?
0FAEB0 BCC #$03 if(c==off) goto $0FAEB5
0FAEB2 PLA Pull A
0FAEB3 CLC c=off
0FAEB4 RTS return
0FAEB5 PLA Pull A
0FAEB6 SEC c=on
0FAEB7 RTS return

$0FAE98のあたりは盗賊の短刀装備時に切り返しの発生率を2倍にするというものですが、今見なおしたら単純に2倍にするだけならASLでいいじゃんと思ったのですが、1.5倍にするとかいろいろ試行錯誤していたためにこのような実装にしていたのを思い出しました。

  • SR: $0FAE82 切り返し判定用閾値セット(新SR)(省略)

レベルに応じて閾値をセットするだけなので省略