DQ3戦闘部分解説10

今回はモンスター戦闘行動決定部分を詳しく見ていきます。

  • SR: $0265DA モンスター行動決定
0265DA PHP Push P Flag
0265DB REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
0265DD PHA Push A
0265DE PHX Push X
0265DF PHY Push Y
0265E0 PHB Push DB
0265E1 PEA #$7E7E Push #$7E7E
0265E4 PLB Pull DB
0265E5 PLB Pull DB
0265E6 JSR $672D SR: $02672D モンスター行動決定+対象決定
0265E9 JSR $65F7 SR: $0265F7 並び順に依存する戦闘行動の対象決定補正
0265EC JSR $66AB SR: $0266AB 集中攻撃時のターゲット確定?
0265EF PLB Pull DB
0265F0 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
0265F2 PLY Pull Y
0265F3 PLX Pull X
0265F4 PLA Pull A
0265F5 PLP Pull P Flag
0265F6 RTL return
  • SR: $02672D モンスター行動決定+対象決定
02672D LDY $2428 Y=$2428
026730 JSL $C2CAE0 SR: $02CAE0 引数:1#$2051 引数:2#$0040 ドラゴラム中?
026738 BEQ #$12 if(z==on) goto $02674C
02673A LDA #$00AA A=#$00AA 戦闘行動はドラゴラムの炎に固定
02673D STA $242A $242A=A
026740 JSR $68ED SR: $0268ED モンスター行動決定
026743 BCS #$58 if(c==on) goto $02679D
026745 LDA #$0008 A=#$0008
026748 STA $2470 $2470=A
02674B RTS return
02674C JSL $C2CAE0 SR: $02CAE0 引数:1#$203C 引数:2#$00FF グループ番号取得
026754 TAX X=A
026755 LDA $23B0,X A=$23B0+X
026758 AND #$00FF A&=#$00FF 同一グループの連発不可行動情報を取得
02675B STA $246C $246C=A
02675E JSL $C2C573 SR: $02C573 引数:1#$02 行動パターン取得
026763 STA $246E $246E=A
026766 ASL A<<1
026767 ASL A<<1
026768 ASL A<<1
026769 STA $2472 $2472=A
02676C LDA $246E A=$246E
02676F ASL A<<1
026770 TAX X=A
026771 JSR $67AD SR: $($0267AD+X) 行動パターンに応じた行動取得
026774 BCS #$27 if(c==on) goto $02679D
026776 LDA $2470 A=$2470
026779 STA $00 DP($00)=A
02677B JSL $C2C573 SR: $02C573 引数:1#$04 各行動インデックスの複数回行動可をチェック
026780 BEQ #$1A if(z==on) goto $02679C
026782 JSL $C2CAE0 SR: $02CAE0 引数:1#$203C 引数:2#$00FF グループ番号取得
02678A TAX X=A
02678B LDA $2470 A=$2470
02678E JSL $C014F2 SR: $0014F2 1ビットのビットマスク作成
026792 SEP #$20 m=on(A/M:8b)
026794 ORA $23B0,X Aor=$23B0+X
026797 STA $23B0,X $23B0+X=A
02679A REP #$20 m=off(A/M:16b)
02679C RTS return
02679D LDA #$0001 A=#$0001 行動が決められない場合は直接攻撃
0267A0 STA $242A $242A=A
0267A3 JSR $6A07 SR: $026A07 敵の対象決定処理SR_SR_0001
0267A6 LDA #$0008 A=#$0008
0267A9 STA $2470 $2470=A
0267AC RTS return

このSRでは各行動パターン(均等・坂・崖・ローテ)に加え、各グループの連発不可情報($7E23B0-B3)を加味、更に知能パターンによる取捨選択を再帰で行って行動を決定します。決定した行動が連発不可の対象であれば$7E23B0に情報を追記します。

  • SR: $0268ED モンスター行動選択
0268ED PHX Push X
0268EE PHY Push Y
0268EF LDX $242A X=$242A 戦闘行動IDをXにセット
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 0はバカ
026912 DEC A– 取得した知能パターンをデクリメント
026913 BEQ #$1A if(z==on) goto $02692F 0は人間
026915 JSL $C2E71C SR: $02E71C 現MPが選択呪文の消費MPより上か
026919 BCC #$35 if(c==off) goto $026950
02691B JSL $C2CC25 SR: $02CC25 引数:1#$0064 引数:2#$00FF 対象選択ルーチンインデックス(神)取得
026923 BRA #$25 goto $02694A
026925 JSL $C2CC25 SR: $02CC25 引数:1#$0062 引数:2#$00FF 対象選択ルーチンインデックス(バカ)取得
02692D BRA #$1B goto $02694A
02692F LDY $2428 Y=$2428
026932 JSL $C2CAE0 SR: $02CAE0 引数:1#$2052 引数:2#$0040 ?フラグ取得
02693A BEQ #$06 if(z==on) goto $026942
02693C JSL $C2E71C SR: $02E71C 現MPが選択呪文の消費MPより上か
026940 BCC #$0E if(c==off) goto $026950
026942 JSL $C2CC25 SR: $02CC25 引数:1#$0063 引数:2#$00FF 対象選択ルーチンインデックス(人間)取得
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

正直この部分については変更の必要性をあまり感じていなかったせいもあって、深く調べていなかったため、今初めて真面目に見ていますがなんとなくわかりますが、細かくは不明です。ターン開始前にどうするかを決める部分なので、最終的なターゲット決定は行動直前に決めるようです。