DQ6戦闘部分解説10

今回は各コマンド入力の詳細部分です。まずは一番単純な「こうげき」です。

  • SR:$0239C8 戦闘コマンド処理1人分_攻撃
0239C8 LDA #$0042 A=#$0042 戦闘行動「こうげき」
0239CB STA $258D $258D=A
0239CE JSR $3AA5 SR: $023AA5 行動対象情報セット
0239D1 RTS return
  • SR:$023AA5 行動対象情報セット
023AA5 LDX $258B X=$258B
023AA8 LDA $258D A=$258D
023AAB JSL $C2F034 SR: $02F034 引数:1#$2034 引数:2#$01FF 戦闘中キャラクター情報変更 インデックス:X
023AB3 TAX X=A
023AB4 JSL $C2F0DF SR: $02F0DF 引数:1#$C663 引数:2#$0003 戦闘行動アクセス インデックス:X 対象種別を取得
023ABC ASL A< <1
023ABD ASL A< <1
023ABE PHA Push A
023ABF JSL $C23D46 SR: $023D46 対象範囲を取得
023AC3 CLC c=off
023AC4 ADC $01,S A+=(Stack($01)+c)
023AC6 ASL A< <1
023AC7 TAX X=A
023AC8 PLA Pull A
023AC9 JSR $3B04 SR: $($023B04+X)
023ACC BCS #$18 if(c==on) goto $023AE6
023ACE STA $2591 $2591=A
023AD1 JSR $3AE7 SR: $023AE7
023AD4 LDX $258B X=$258B
023AD7 LDA $2591 A=$2591
023ADA STA $2591 $2591=A
023ADD JSL $C2F034 SR: $02F034 引数:1#$2035 引数:2#$00FE
023AE5 CLC c=off
023AE6 RTS return

ここはちょっとわかりにくいですが、対象種別(自分、味方、敵、敵・味方)に対象範囲(敵単体、敵グループ、敵全体、味方全体?)の4*4パターンのうち、どの対象決定SRを呼び出すかを決定しているようです。対象決定SRアドレスの配列は$023B04から16個連続して並んでいるので、どのSRを呼び出すかを$023ABC-C5で計算しているということになります。1例として、「対象:敵、範囲:単体」のSRは以下のようになっています。

  • SR:$023B52 行動対象情報設定SR_0008
023B52 JSR $3B8C SR: $023B8C 対象が1つだけなら選択不要
023B55 BCC #$09 if(c==off) goto $023B60
023B57 LDA #$0075 A=#$0075
023B5A JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
023B5E BCS #$15 if(c==on) goto $023B75
023B60 LDA $3874 A=$3874
023B63 JSL $C2E939 SR: $02E939 引数:1#$02 ターゲット情報セット
023B68 JSL $C2E966 SR: $02E966 引数:1#$00 ターゲット情報セット?
023B6D LDX #$0000 X=#$0000
023B70 JSL $C00F81 SR: $000F81 乱数発生(0-DP(00+x))
023B74 CLC c=off
023B75 RTS return

まず、対象が1つしかないなら選択は不要なのでウィンドウ表示をスキップしています。次に、ユーザーが選んだグループの生存キャラクターのマスク情報を作成し、そこからランダムで対象選択を行っています。DQ6の最終的な行動対象の選択はコマンド入力時に行われていることがわかります(行動時に対象が死んでいたら対象を選びなおす処理をしていると思いますが)。