DQ3戦闘部分解説10-4

今回はルーレットで選択された戦闘行動を実行するかの判断をどうやっているか見ていきます。

  • SR:$0267B5 行動パターンに応じた行動決定_SR_0000
$0267C4 STA $242A $242A=A
$0267C7 JSR $68ED SR: $0268ED
$0267CA BCS #$01 if(c==on) goto $0267CD
$0267CC RTS return
  • SR:$0268ED モンスター行動選択
$0268ED PHX Push X
$0268EE PHY Push Y
$0268EF LDX $242A X=$242A
$0268F2 PEA #$2011 Push #$2011
$0268F5 PEA #$0040 Push #$0040
$0268F8 PEA #$7E00 Push #$7E00 格闘場の戦闘か?
$0268FB JSL $C9029E SR: $09029E RAM情報取得
$0268FF BEQ #$0A if(z==on) goto $02690B
$026901 JSL $C2CC25 SR: $02CC25 引数:1#$007C 引数:2#$0002 格闘場で選択対象になるフラグチェック
$026909 BEQ #$45 if(z==on) goto $026950
$02690B JSL $C2C240 SR: $02C240 引数:1#$0E 知能パターン取得
$026910 BEQ #$13 if(z==on) goto $026925 バカの場合
$026912 DEC A–
$026913 BEQ #$1A if(z==on) goto $02692F 人間の場合
$026915 JSL $C2B466 SR: $02B466 現MPが選択呪文の消費MPより上か
$026919 BCC #$35 if(c==off) goto $026950
$02691B JSL $C2CC25 SR: $02CC25 引数:1#$0064 引数:2#$00FF 知能パターン「神」の判定SR番号取得
$026923 BRA #$25 goto $02694A
$026925 JSL $C2CC25 SR: $02CC25 引数:1#$0062 引数:2#$00FF 知能パターン「バカ」の判定SR番号取得
$02692D BRA #$1B goto $02694A
$02692F LDY $2428 Y=$2428
$026932 JSL $C2CAE0 SR: $02CAE0 引数:1#$2052 引数:2#$0040 MP切れ等で行動できない?
$02693A BEQ #$06 if(z==on) goto $026942
$02693C JSL $C2B466 SR: $02B466 現MPが選択呪文の消費MPより上か
$026940 BCC #$0E if(c==off) goto $026950
$026942 JSL $C2CC25 SR: $02CC25 引数:1#$0063 引数:2#$00FF 知能パターン「人間」の判定SR番号取得
$02694A JSR $695A SR: $02695A 個別戦闘行動実行判定
$02694D PLY Pull Y
$02694E PLX Pull X
$02694F RTS return
$026950 PLY Pull Y
$026951 PLX Pull X
$026952 LDA #$0040 A=#$0040
$026955 STA $2430 $2430=A
$026958 SEC c=on
$026959 RTS return

このSRはまだ枠組みの部分です。格闘場で使われない戦闘行動(仲間を呼ぶ、逃げるなど)は$026901での判定で実行されないことがわかります。長らく戦闘行動の28バイト目2ビット目は「対象選択ルーチンで有効」という謎の説明をしていましたが、正しくは「格闘場で選択対象になる」だったことがわかります。そこから先は知能パターンに応じた判定SRのIDを取得しているだけです。

  • SR:$02695A 個別戦闘行動実行判定
$02695A CMP #$0047 A>=#$0047?
$02695D BCS #$FE if(c==on) goto $02695D
$02695F ASL A< <1
$026960 TAX X=A
$026961 LDY $2428 Y=$2428
$026964 JSR $6971 SR: $($026971+X)
$026967 BCC #$07 if(c==off) goto $026970
$026969 LDA #$0040 A=#$0040
$02696C STA $2430 $2430=A
$02696F SEC c=on
$026970 RTS return

ここから個別の判定SRがようやく呼ばれることになります。個別のSRの実装は「判定の結果実行するならc=off、しないならc=onを返す」という実装がされています。例としてばくだんいわのメガンテの実行判定を見てみます。

  • SR:$026B7A メガンテ判定(人間)
$026B7A JSL $C2C240 SR: $02C240 引数:1#$00 最大HP取得
$026B7F LSR A>>1
$026B80 LSR A>>1
$026B81 PHA Push A
$026B82 JSL $C2BE8A SR: $02BE8A 引数:1#$00 現在HP取得
$026B87 CMP $01,S A==or>=Stack($01)? 現在HPが1/4を切っていたらメガンテ実行する
$026B89 PLA Pull A
$026B8A BCS #$03 if(c==on) goto $026B8F
$026B8C JSR $6A4B SR: $026A4B
$026B8F RTS return

爆弾岩の最大HPは500なので126以上のときは選択されない、ということになります。ちなみにメガンテ判定(神)はオリジナルでは設定されているモンスターは存在しません。DQ3 K.Mixではマントゴーア(知能:神)にメガンテを割り当て、さらにHPが半分を切ると選択されるように変えました。