DQ3戦闘部分解説13

ようやく戦闘処理の中で最重要である1ターン分の実行処理までやってきました。このSRを呼ぶ直前で、各キャラクター(敵味方両方)の戦闘行動およびターゲット、さらにターン中の行動順が確定していることになり、このSR中で1ターン分の行動の処理が全て行われることになります。

  • SR: $027275 1ターン分の実行処理
027275 CLC c=off
027276 PHP Push P Flag
027277 PHB Push DB
027278 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02727A PEA #$7E7E Push #$7E7E
02727D PLB Pull DB
02727E PLB Pull DB
02727F JSL $C2B954 SR: $02B954 パーティHPMPのみウィンドウ(画面上部)表示
027283 LDA #$0000 A=#$0000
027286 PEA #$23AE Push #$23AE
027289 PEA #$0020 Push #$0020
02728C PEA #$7E00 Push #$7E00
02728F JSL $C902E9 SR: $0902E9 RAM上情報変更
027293 STZ $23D2 $23D2=#$00 現在行動主体になる主体者の順番
027296 JSR $73A1 SR: $0273A1 行動順に従って行動主体者インデックスをセットする
027299 BCS #$46 if(c==on) goto $0272E1
02729B STZ $23D4 $23D4=#$00
02729E JSR $7329 SR: $027329 格闘場中断処理?
0272A1 BCS #$65 if(c==on) goto $027308
0272A3 LDA #$0000 A=#$0000
0272A6 PEA #$23AE Push #$23AE
0272A9 PEA #$000F Push #$000F
0272AC PEA #$7E00 Push #$7E00
0272AF JSL $C902E9 SR: $0902E9 RAM上情報変更
0272B3 JSR $73B3 SR: $0273B3 行動主体者が行動可能かチェック?
0272B6 BVS #$1E if(v==on) goto $0272D6
0272B8 PHP Push P Flag
0272B9 JSR $7312 SR: $027312 タップダンス効果ターン減らし
0272BC PLP Pull P Flag
0272BD BCS #$17 if(c==on) goto $0272D6
0272BF JSR $7563 SR: $027563
0272C2 JSR $758C SR: $02758C 対象決定メイン
0272C5 LDA $23EE A=$23EE
0272C8 CMP #$00A4 A==#$00A4? 戦闘行動が空なら実行しない
0272CB BEQ #$09 if(z==on) goto $0272D6
0272CD JSR $7939 SR: $027939 1キャラクター分の戦闘行動実行処理
0272D0 JSL $C2B32F SR: $02B32F 戦闘終了時フラグセット?
0272D4 BCS #$32 if(c==on) goto $027308
0272D6 INC $23D4 $23D4++ 現在の行動済み回数をインクリメント
0272D9 LDA $23D4 A=$23D4
0272DC CMP #$0003 A>=#$0003? 3回まで繰り返して次のキャラクターへ
0272DF BCC #$C2 if(c==off) goto $0272A3
0272E1 INC $23D2 $23D2++
0272E4 LDA $23D2 A=$23D2
0272E7 CMP #$0018 A>=#$0018?
0272EA BCC #$AA if(c==off) goto $027296
0272EC PEA #$23AE Push #$23AE
0272EF PEA #$0020 Push #$0020
0272F2 PEA #$7E00 Push #$7E00
0272F5 JSL $C9029E SR: $09029E RAM上情報取得
0272F9 BNE #$14 if(z==off) goto $02730F
0272FB DEC $23D2 $23D2–
0272FE JSL $C2A41F SR: $02A41F ターン終了時処理(全体)
027302 JSL $C2B32F SR: $02B32F 戦闘終了時フラグセット?
027306 BCC #$D9 if(c==off) goto $0272E1
027308 LDA $02,S A=Stack($02)
02730A ORA #$0001 Aor=#$0001
02730D STA $02,S Stack($02)=A
02730F PLB Pull DB
027310 PLP Pull P Flag
027311 RTL return

$027296から$0272EBが1キャラクター分の実行処理にあたります。ここをforループで戦闘参加可能人数最大値($#18)分まわしていく、という処理になります。また、途中で戦闘終了条件を満たした場合もループを抜けるようになっています。さらに、$0272A3から$0272E0までが、戦闘行動1つの実行部分です。複数攻撃をするキャラクター以外は2回目以降の戦闘行動は空(#$A4)がセットされているので、3回ループしても2回目以降はなにもしません。つまり、「表面上1回しか行動しないキャラクターも戦闘行動3までループする」ということになります。