DQ6戦闘部分解説6

ようやく戦闘コマンドを入力するところまで来ました。

  • SR:$023803 戦闘コマンド入力
023803PHPPush P Flag
023804PHBPush DB
023805REP #$30m=off(A/M:16b) x=off(X/Y:16b)
023807PEA #$7E7EPush #$7E7E
02380APLBPull DB
02380BPLBPull DB
02380CPEA #$2513Push #$2513
02380FPEA #$0003Push #$0003
023812PEA #$7E00Push #$7E00
023815JSL $C92965SR: $092965
023819CMP #$0002A>=#$0002?強襲状態ならコマンド入力をスキップ
02381CBCS #$57if(c==on) goto $023875
02381EPEA #$2011Push #$2011
023821PEA #$0010Push #$0010
023824PEA #$7E00Push #$7E00
023827JSL $C92965SR: $092965
02382BBNE #$4Bif(z==off) goto $023878格闘場ならコマンド入力をスキップ
02382DJSL $C2E939SR: $02E939 引数:1#$00
023832LDA #$0006A=#$0006PCのみ対象
023835JSL $C2E966SR: $02E966 引数:1#$02ターゲット情報セット(味方で生存)
02383AJSL $C2E966SR: $02E966 引数:1#$04ターゲット情報セット(味方でグループIDが6?)
02383FJSL $C2E9C6SR: $02E9C6 引数:1#$18ターゲット情報セット(起きている)
023844JSL $C2E9C6SR: $02E9C6 引数:1#$50ターゲット情報セット(休み中でない)
023849LDA $00A=DP($00)
02384BORA $02Aor=DP($02)
02384DBEQ #$29if(z==on) goto $023878コマンド入力をする必要のあるキャラクターがいるか
02384FJSL $C2CAC6SR: $02CAC6
023853JSR $3890SR: $023890行動情報リセット(PCのみ全部)
023856LDA #$0001A=#$0001
023859JSL $C3B4F9SR: $03B4F9
02385DLDA #$00D4A=#$00D4戦闘方針ウィンドウID
023860JSL $C37236SR: $037236ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
023864BCS #$E9if(c==on) goto $02384F
023866ASLA< <1
023867TAXX=A
023868JSR $38B3SR: $($0238B3+X)
02386BBCS #$E2if(c==on) goto $02384F
02386DJSL $C2CAC6SR: $02CAC6
023871JSL $C2CA59SR: $02CA59
023875PLBPull DB
023876PLPPull P Flag
023877RTLreturn
023878JSR $3890SR: $023890行動情報リセット(PCのみ全部)
02387BJSL $C42B1CSR: $042B1C 引数:1#$01 引数:2#$FDパーティ人数取得
023881DEYY–
023882BMI #$F1if(n==on) goto $023875
023884JSL $C2BB34SR: $02BB34
023888STX $258B$258B=X
02388BJSR $3965SR: $023965
02388EBRA #$F1goto $023881

このSRの中で戦闘コマンド入力処理を全て行っています。強襲時・格闘場の場合はコマンド入力をスキップ、PC側にコマンド入力ができるキャラクターがいなければスキップ等の判断を行っています。SR: $02E939、$02E966、$02E9C6は、DP($00)からDP($02)までの24ビットをフラグに見立てて戦闘中のキャラクターインデックスのそれぞれが条件に該当していればON、していなければOFFにするというもののようです。SR: $02E939のみ#$FFFFFFで初期化します。残りはすでにONになっているフラグに対してのみON/OFFの判断を行います。DP($00)とDP($02)をORするのは全て0になっているかを簡単に判別するためです。これをうまく使えばランダムターゲットの戦闘行動時にターゲットにするモンスターを安全に決定することができます。まず「敵のみ」のフラグをONにしてその中で「生存している」「戦闘に参加している」をONにすればその時点で存在しているインデックスのみフラグが立っている状態が出来上がります。これをビットの立っている中からランダム選択をするSR: $000F81に渡せばAレジスタに選択されたインデックスの値が入るのでそいつをターゲットにすればいい、ということになります。DQ3 K.Mixでぐんたいよびを実装した最初期の時点ではこの部分の解析をすっ飛ばしていたので自力でバグバグなランダムターゲットのコードを書く羽目になりましたが、この仕組がわかっていれば労力を使わず安全性の高いコードが書けたわけです。次回はまず戦闘方針ウィンドウ処理(たたかう、さくせん、にげる、いれかえ)の部分を見てから1人分の戦闘コマンドの処理を見ていくことにします。

コメント

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