DQ3の戦闘部分のプログラムについて解説します。DQ3SFCEditor(旧名)を作ってからこの部分の解析に一番力を入れていたので各SRの切り分けついては終わっています。ただそれだけでは、プログラムとしてみた場合の流れなどはわからないと思うので、ここで説明することにします。
戦闘中に関するプログラムはバンク$02で全て記述されています。バンク$02には空き領域がオリジナルでも10,000バイト以上あるので戦闘中の動作について改良する場合にはここを使えば十分です。先発のDQ6は特殊な動作がもっとたくさんあったはずなのでパンパンだと思いますが。別にバンク$02に実装しないといけないというルールはないのでいざとなったら他の場所を使っても動作はします。
さて、戦闘中のプログラムは実は大きな1つのループの中で完結しています。通常戦闘だろうがイベント戦闘だろうが格闘場だろうが、そのループの中ですべてをまかなっています。、1ターン分の処理>>1キャラクター分の行動処理を繰り返して終了条件に合致したら終わり、という流れになってます。
- SR: $0259F5 戦闘メインループ
0259F5 | PHP | Push P Flag | |
---|---|---|---|
0259F6 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
0259F8 | PHA | Push A | |
0259F9 | PHX | Push X | |
0259FA | PHY | Push Y | |
0259FB | PHB | Push DB | |
0259FC | PEA #$7E7E | Push #$7E7E | |
0259FF | PLB | Pull DB | |
025A00 | PLB | Pull DB | |
025A01 | JSL $C32060 | SR: $032060 | |
025A05 | JSL $C25A56 | SR: $025A56 | 戦闘中使用RAM領域初期化 |
025A09 | JSL $C25A78 | SR: $025A78 | PC側戦闘中基本情報設定 |
025A0D | JSL $C25AC7 | SR: $025AC7 | モンスター戦闘中情報設定 |
025A11 | JSL $C25B8B | SR: $025B8B | モンスター関連戦闘開始時処理 |
025A15 | JSL $C2B32F | SR: $02B32F | 戦闘終了時フラグセット? |
025A19 | BCS #$26 | if(c==on) goto $025A41 | |
025A1B | JSL $C25CC0 | SR: $025CC0 | ターン開始時処理? |
025A1F | JSL $C25DEE | SR: $025DEE | 戦闘コマンド入力処理 |
025A23 | JSL $C2B32F | SR: $02B32F | 戦闘終了時フラグセット? |
025A27 | BCS #$18 | if(c==on) goto $025A41 | |
025A29 | JSL $C25D56 | SR: $025D56 | ターン中の素早さ決定 |
025A2D | JSL $C26464 | SR: $026464 | モンスター行動決定 |
025A31 | JSL $C263A2 | SR: $0263A2 | 行動順序補正メイン |
025A35 | JSL $C27275 | SR: $027275 | 1ターン分の実行処理 |
025A39 | BCS #$06 | if(c==on) goto $025A41 | |
025A3B | JSL $C2A48C | SR: $02A48C | ターン数オーバーによる戦闘終了条件チェック |
025A3F | BCC #$DA | if(c==off) goto $025A1B | |
025A41 | JSL $C2A4E6 | SR: $02A4E6 | 戦闘終了判定+終了処理 |
025A45 | BCS #$BE | if(c==on) goto $025A05 | |
025A47 | INC $2012 | $2012++ | 戦闘回数カウントアップ? |
025A4A | JSL $C31EE4 | SR: $031EE4 | フィールド画面復帰? |
025A4E | PLB | Pull DB | |
025A4F | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
025A51 | PLY | Pull Y | |
025A52 | PLX | Pull X | |
025A53 | PLA | Pull A | |
025A54 | PLP | Pull P Flag | |
025A55 | RTL | return |
まあこんなもんだろうな、という感じですね。細かい処理はSRに任せているので非常に見やすいSRになっています。DQはFFと違って戦闘中の時間の流れがないので比較的理解しやすいのでは、と思います。
コメント