DQ3戦闘部分解説11

モンスター側のターゲッティングについて解説します。前回は以下のSRの上1つまで終わっています。

dq3 targetting

  • 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

モンスターの1回の行動決定+対象決定はこのSRで全て決定されます。複数回行動するモンスターはこのSRが複数回コールされます。通常の対象決定は一番目のSR: $02672Dで行われますが、一部補正が必要な行動はその後の2つのSRで補正しています。

  • SR: $0265F7 並び順による狙われやすさ調整
0265F7LDX $2428X=$2428行動主体IDをセット?
0265FAJSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FFグループID取得
026602CMP #$0005A>=#$0005?PC側ならスキップ
026605BCS #$17if(c==on) goto $02661E
026607LDY $242AY=$242A戦闘行動IDをセット?
02660AJSL $C2CC2CSR: $02CC2C 引数:1#$007A 引数:2#$0002並び順による狙われやすさがON?
026612BEQ #$0Aif(z==on) goto $02661E
026614JSL $C2C240SR: $02C240 引数:1#$0E知能パターン取得
026619BEQ #$03if(z==on) goto $02661Eバカならスキップ
02661BJSR $661FSR: $02661F並び順に依存するターゲット確定処理
02661ERTSreturn

  • SR: $02661F 並び順に依存するターゲット確定処理
02661FLDA #$0005A=#$0005グループIDをセット
026622JSL $C2C739SR: $02C739 引数:1#$02グループIDが5のものだけビットON
026627JSL $C2C766SR: $02C766 引数:1#$00生存者だけビットをONにする
02662CJSL $C270E1SR: $0270E1対象数カウント
026630BEQ #$25if(z==on) goto $026657対象数が0ならなにもしない?
026632DECA–
026633ASLA<<1
026634TAXX=A
026635JSR $6658SR: $($026658+X)並び順に依存する対象決定
026638LDY #$0000Y=#$0000
02663BTYXX=Y
02663CJSL $C43F87SR: $043F87 引数:1#$01 引数:2#$FD 引数:3#$FF生死判定?
026643AND #$0010A&=#$0010
026646BNE #$05if(z==off) goto $02664D
026648CPX $00X==DP($00)?
02664ABEQ #$04if(z==on) goto $026650
02664CINXX++
02664DINYY++
02664EBRA #$ECgoto $02663C
026650JSL $C2AF66SR: $02AF66対象者の戦闘中キャラクタインデックスを取得
026654STX $2430$2430=X
026657RTSreturn
  • SR:$026660 並び順に依存する対象決定_SR_0000(生存人数1人)
026660STZ $00DP($00)=#$00
026662RTSreturn
  • SR:$026663 並び順に依存する対象決定_SR_0001(生存人数2人)
026663STZ $00DP($00)=#$00
026665LDA #$0006A=#$0006
026668JSL $C0133ESR: $00133E乱数発生 00-A A(1B)
02666CCMP #$0004A>=#$0004?
02666FBCC #$02if(c==off) goto $026673
026671INC $00DP($00)++
026673RTSreturn
  • SR:$026674 並び順に依存する対象決定_SR_0002(生存人数3人)
026674STZ $00DP($00)=#$00
026676LDA #$0008A=#$0008
026679JSL $C0133ESR: $00133E乱数発生 00-A A(1B)
02667DCMP #$0004A>=#$0004?
026680BCC #$09if(c==off) goto $02668B
026682INC $00DP($00)++
026684CMP #$0007A>=#$0007?
026687BCC #$02if(c==off) goto $02668B
026689INC $00DP($00)++
02668BRTSreturn
  • SR:$02668C 並び順に依存する対象決定_SR_0003(生存人数4人)
02668CSTZ $00DP($00)=#$00
02668ELDA #$0009A=#$0009
026691JSL $C0133ESR: $00133E乱数発生 00-A A(1B)
026695CMP #$0004A>=#$0004?
026698BCC #$10if(c==off) goto $0266AA
02669AINC $00DP($00)++
02669CCMP #$0007A>=#$0007?
02669FBCC #$09if(c==off) goto $0266AA
0266A1INC $00DP($00)++
0266A3CMP #$0009A>=#$0009?
0266A6BCC #$02if(c==off) goto $0266AA
0266A8INC $00DP($00)++
0266AARTSreturn

SR: $02C739, SR: $02C766はターゲット関連でよく出てくるSRです。戦闘に参加しているキャラクター24体をビットフラグにして扱うためのSRです。SR: $02C739で、対象のビットを確定し(今回の例ではグループIDが5のものだけビットを立てる)、SR: $02C766で既に立っているビットのうち生存しているキャラクターのビットだけ残します。この手の処理は戦闘終了時にも行われ、敵方について生存ビットを調べ、味方について生存ビットを調べ、どちらかが生存者が0になったら終わり、ということで戦闘終了判定を行なっています。ここでは、SR: $0270E1で得られた生存数に応じて異なるターゲット選択SR群($026658-)がコールされます。このSRではアリアハン城内2Fの兵士の言葉通り、先頭にいればいるほどターゲットになる確率が高くなるようになっています。確率は以下のようになっています。

1人目2人目3人目4人目
1人生存100%
2人生存57%43%
3人生存44%33%22%
4人生存40%30%20%10%

SR: $02661Fの後半はSR: $($026658+X)によって得られた「何番目のキャラクターを狙うか」に従って実際に狙うべきキャラクターを探しています。生存人数3人で2番目を狙うという決定をした場合でも2番目のキャラクターを対象とすればいいわけではなく、死人がいたらそのキャラクターを飛ばして2番目を狙う、というようにしなくてはいけません。さらにパルプンテの効果によってキャラクターの戦闘中の並び順が変わっていることもあるため、その時点での並び順から戦闘中のキャラクターIDを逆引きする必要があります。

  • SR: $0266AB 集中攻撃時のターゲット確定
0266ABLDY $242AY=$242A戦闘行動IDをセット
0266AEJSL $C2CC2CSR: $02CC2C 引数:1#$0079 引数:2#$0080集中攻撃に影響されるか
0266B6BEQ #$11if(z==on) goto $0266C9
0266B8JSL $C2C240SR: $02C240 引数:1#$14集中攻撃をするモンスターか
0266BDBEQ #$0Aif(z==on) goto $0266C9
0266BFJSL $C2C240SR: $02C240 引数:1#$0E知能パターン取得
0266C4BEQ #$03if(z==on) goto $0266C9
0266C6JSR $66CASR: $0266CA集中攻撃時のターゲット確定
0266C9RTSreturn

  • SR: $0266CA 集中攻撃時のターゲット確定
0266CALDY $2428Y=$2428
0266CDJSL $C2CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FFグループIDを取得
0266D5CMP #$0005A>=#$0005?PC側ならスキップ
0266D8BCS #$31if(c==on) goto $02670B
0266DATAXX=A
0266DBLDA $2462,XA=$2462+Xグループごとの集中攻撃ターゲットを取得
0266DEAND #$00FFA&=#$00FF
0266E1STA $2430$2430=A
0266E4CMP #$00FFA==#$00FF?集中攻撃ターゲットが未設定
0266E7BEQ #$05if(z==on) goto $0266EE
0266E9JSR $670CSR: $02670C集中攻撃ターゲットが生きているか?
0266ECBCC #$1Dif(c==off) goto $02670B
0266EEJSR $7040SR: $027040モンスター行動対象候補列挙
0266F1JSL $C2C766SR: $02C766 引数:1#$00生者のみ残す
0266F6PHXPush X
0266F7LDX #$0000X=#$0000
0266FAJSL $C01407SR: $001407dp,Xの1になっているビットをランダムで0にする?
0266FEPLXPull X
0266FFBCC #$0Aif(c==off) goto $02670B
026701STA $2430$2430=A攻撃対象に設定
026704SEP #$20m=on(A/M:8b)
026706STA $2462,X$2462+X=A集中攻撃ターゲットとして記憶
026709REP #$20m=off(A/M:16b)
02670BRTSreturn

ここをまじめに解析すると「集中攻撃」とは「グループごとに選択したターゲットを戦闘終了後まで相手が死ぬ(or離脱)まで攻撃し続ける」というものであることがわかります。$7E2462-5にグループ(0~3)ごとに選択されたターゲットの情報が保持されており、集中攻撃をするモンスター(集中攻撃フラグON、知能がバカ以外)が集中攻撃のフラグがONになっている戦闘行動(基本的に打撃攻撃)についてこの情報が使用されます。集中攻撃をしてくるモンスターはあまり多くなく、おばけありくい、キャットフライ、ミイラ男、マドハンド、デーモンソードだけです。マドハンドなどは1グループで大量に出現した場合などは後から呼ばれた仲間も集中攻撃をするので対象になったキャラクターにはスカラを掛けるなど対策をした方がいいかもしれません。普通にやるなら王者の剣や稲妻の剣で一掃なんでしょうが。

コメント

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