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

- SR:$0239C8 戦闘コマンド処理1人分_攻撃
| 0239C8 |
LDA #$0042 |
A=#$0042 |
戦闘行動「こうげき」 |
| 0239CB |
STA $258D |
$258D=A |
|
| 0239CE |
JSR $3AA5 |
SR: $023AA5 |
行動対象情報セット |
| 0239D1 |
RTS |
return |
|
| 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の最終的な行動対象の選択はコマンド入力時に行われていることがわかります(行動時に対象が死んでいたら対象を選びなおす処理をしていると思いますが)。
コメント