DQ3戦闘部分解説1

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と違って戦闘中の時間の流れがないので比較的理解しやすいのでは、と思います。