ようやく戦闘処理の中で最重要である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までループする」ということになります。
コメント