今回から実装に移ります。ダメージが発生する前に切り返し判定を行い、発生する場合には行動対象へのダメージ処理をスキップします。
| 省略 |
|
|
|
| 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)(省略)
レベルに応じて閾値をセットするだけなので省略
コメント