DQ3戦闘部分解説10

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

  • SR: $0265DA モンスター行動決定
0265DAPHPPush P Flag
0265DBREP #$30m=off(A/M:16b) x=off(X/Y:16b)
0265DDPHAPush A
0265DEPHXPush X
0265DFPHYPush Y
0265E0PHBPush DB
0265E1PEA #$7E7EPush #$7E7E
0265E4PLBPull DB
0265E5PLBPull DB
0265E6JSR $672DSR: $02672Dモンスター行動決定+対象決定
0265E9JSR $65F7SR: $0265F7並び順に依存する戦闘行動の対象決定補正
0265ECJSR $66ABSR: $0266AB集中攻撃時のターゲット確定?
0265EFPLBPull DB
0265F0REP #$30m=off(A/M:16b) x=off(X/Y:16b)
0265F2PLYPull Y
0265F3PLXPull X
0265F4PLAPull A
0265F5PLPPull P Flag
0265F6RTLreturn
  • SR: $02672D モンスター行動決定+対象決定
02672DLDY $2428Y=$2428
026730JSL $C2CAE0SR: $02CAE0 引数:1#$2051 引数:2#$0040ドラゴラム中?
026738BEQ #$12if(z==on) goto $02674C
02673ALDA #$00AAA=#$00AA戦闘行動はドラゴラムの炎に固定
02673DSTA $242A$242A=A
026740JSR $68EDSR: $0268EDモンスター行動決定
026743BCS #$58if(c==on) goto $02679D
026745LDA #$0008A=#$0008
026748STA $2470$2470=A
02674BRTSreturn
02674CJSL $C2CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FFグループ番号取得
026754TAXX=A
026755LDA $23B0,XA=$23B0+X
026758AND #$00FFA&=#$00FF同一グループの連発不可行動情報を取得
02675BSTA $246C$246C=A
02675EJSL $C2C573SR: $02C573 引数:1#$02行動パターン取得
026763STA $246E$246E=A
026766ASLA<<1
026767ASLA<<1
026768ASLA<<1
026769STA $2472$2472=A
02676CLDA $246EA=$246E
02676FASLA<<1
026770TAXX=A
026771JSR $67ADSR: $($0267AD+X)行動パターンに応じた行動取得
026774BCS #$27if(c==on) goto $02679D
026776LDA $2470A=$2470
026779STA $00DP($00)=A
02677BJSL $C2C573SR: $02C573 引数:1#$04各行動インデックスの複数回行動可をチェック
026780BEQ #$1Aif(z==on) goto $02679C
026782JSL $C2CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FFグループ番号取得
02678ATAXX=A
02678BLDA $2470A=$2470
02678EJSL $C014F2SR: $0014F21ビットのビットマスク作成
026792SEP #$20m=on(A/M:8b)
026794ORA $23B0,XAor=$23B0+X
026797STA $23B0,X$23B0+X=A
02679AREP #$20m=off(A/M:16b)
02679CRTSreturn
02679DLDA #$0001A=#$0001行動が決められない場合は直接攻撃
0267A0STA $242A$242A=A
0267A3JSR $6A07SR: $026A07 敵の対象決定処理SR_SR_0001
0267A6LDA #$0008A=#$0008
0267A9STA $2470$2470=A
0267ACRTSreturn

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

  • SR: $0268ED モンスター行動選択
0268EDPHXPush X
0268EEPHYPush Y
0268EFLDX $242AX=$242A戦闘行動IDをXにセット
0268F2PEA #$2011Push #$2011
0268F5PEA #$0040Push #$0040
0268F8PEA #$7E00Push #$7E00
0268FBJSL $C9029ESR: $09029ERAM上情報取得
0268FFBEQ #$0Aif(z==on) goto $02690B格闘場でない
026901JSL $C2CC25SR: $02CC25 引数:1#$007C 引数:2#$0002対象選択ルーチンが有効か
026909BEQ #$45if(z==on) goto $026950
02690BJSL $C2C240SR: $02C240 引数:1#$0E知能パターン取得
026910BEQ #$13if(z==on) goto $0269250はバカ
026912DECA–取得した知能パターンをデクリメント
026913BEQ #$1Aif(z==on) goto $02692F0は人間
026915JSL $C2E71CSR: $02E71C現MPが選択呪文の消費MPより上か
026919BCC #$35if(c==off) goto $026950
02691BJSL $C2CC25SR: $02CC25 引数:1#$0064 引数:2#$00FF対象選択ルーチンインデックス(神)取得
026923BRA #$25goto $02694A
026925JSL $C2CC25SR: $02CC25 引数:1#$0062 引数:2#$00FF対象選択ルーチンインデックス(バカ)取得
02692DBRA #$1Bgoto $02694A
02692FLDY $2428Y=$2428
026932JSL $C2CAE0SR: $02CAE0 引数:1#$2052 引数:2#$0040?フラグ取得
02693ABEQ #$06if(z==on) goto $026942
02693CJSL $C2E71CSR: $02E71C現MPが選択呪文の消費MPより上か
026940BCC #$0Eif(c==off) goto $026950
026942JSL $C2CC25SR: $02CC25 引数:1#$0063 引数:2#$00FF対象選択ルーチンインデックス(人間)取得
02694AJSR $695ASR: $02695A対象決定
02694DPLYPull Y
02694EPLXPull X
02694FRTSreturn
026950PLYPull Y
026951PLXPull X
026952LDA #$0040A=#$0040
026955STA $2430$2430=A
026958SECc=on
026959RTSreturn

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

コメント

タイトルとURLをコピーしました