DQ3戦闘部分解説13

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

  • SR: $027275 1ターン分の実行処理
027275CLCc=off
027276PHPPush P Flag
027277PHBPush DB
027278REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02727APEA #$7E7EPush #$7E7E
02727DPLBPull DB
02727EPLBPull DB
02727FJSL $C2B954SR: $02B954パーティHPMPのみウィンドウ(画面上部)表示
027283LDA #$0000A=#$0000
027286PEA #$23AEPush #$23AE
027289PEA #$0020Push #$0020
02728CPEA #$7E00Push #$7E00
02728FJSL $C902E9SR: $0902E9RAM上情報変更
027293STZ $23D2$23D2=#$00現在行動主体になる主体者の順番
027296JSR $73A1SR: $0273A1行動順に従って行動主体者インデックスをセットする
027299BCS #$46if(c==on) goto $0272E1
02729BSTZ $23D4$23D4=#$00
02729EJSR $7329SR: $027329格闘場中断処理?
0272A1BCS #$65if(c==on) goto $027308
0272A3LDA #$0000A=#$0000
0272A6PEA #$23AEPush #$23AE
0272A9PEA #$000FPush #$000F
0272ACPEA #$7E00Push #$7E00
0272AFJSL $C902E9SR: $0902E9RAM上情報変更
0272B3JSR $73B3SR: $0273B3行動主体者が行動可能かチェック?
0272B6BVS #$1Eif(v==on) goto $0272D6
0272B8PHPPush P Flag
0272B9JSR $7312SR: $027312タップダンス効果ターン減らし
0272BCPLPPull P Flag
0272BDBCS #$17if(c==on) goto $0272D6
0272BFJSR $7563SR: $027563
0272C2JSR $758CSR: $02758C対象決定メイン
0272C5LDA $23EEA=$23EE
0272C8CMP #$00A4A==#$00A4?戦闘行動が空なら実行しない
0272CBBEQ #$09if(z==on) goto $0272D6
0272CDJSR $7939SR: $0279391キャラクター分の戦闘行動実行処理
0272D0JSL $C2B32FSR: $02B32F戦闘終了時フラグセット?
0272D4BCS #$32if(c==on) goto $027308
0272D6INC $23D4$23D4++現在の行動済み回数をインクリメント
0272D9LDA $23D4A=$23D4
0272DCCMP #$0003A>=#$0003?3回まで繰り返して次のキャラクターへ
0272DFBCC #$C2if(c==off) goto $0272A3
0272E1INC $23D2$23D2++
0272E4LDA $23D2A=$23D2
0272E7CMP #$0018A>=#$0018?
0272EABCC #$AAif(c==off) goto $027296
0272ECPEA #$23AEPush #$23AE
0272EFPEA #$0020Push #$0020
0272F2PEA #$7E00Push #$7E00
0272F5JSL $C9029ESR: $09029ERAM上情報取得
0272F9BNE #$14if(z==off) goto $02730F
0272FBDEC $23D2$23D2–
0272FEJSL $C2A41FSR: $02A41Fターン終了時処理(全体)
027302JSL $C2B32FSR: $02B32F戦闘終了時フラグセット?
027306BCC #$D9if(c==off) goto $0272E1
027308LDA $02,SA=Stack($02)
02730AORA #$0001Aor=#$0001
02730DSTA $02,SStack($02)=A
02730FPLBPull DB
027310PLPPull P Flag
027311RTLreturn

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

コメント

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