DQ3戦闘部分解説1

DQ3の戦闘部分のプログラムについて解説します。DQ3SFCEditor(旧名)を作ってからこの部分の解析に一番力を入れていたので各SRの切り分けついては終わっています。ただそれだけでは、プログラムとしてみた場合の流れなどはわからないと思うので、ここで説明することにします。

戦闘中に関するプログラムはバンク$02で全て記述されています。バンク$02には空き領域がオリジナルでも10,000バイト以上あるので戦闘中の動作について改良する場合にはここを使えば十分です。先発のDQ6は特殊な動作がもっとたくさんあったはずなのでパンパンだと思いますが。別にバンク$02に実装しないといけないというルールはないのでいざとなったら他の場所を使っても動作はします。

さて、戦闘中のプログラムは実は大きな1つのループの中で完結しています。通常戦闘だろうがイベント戦闘だろうが格闘場だろうが、そのループの中ですべてをまかなっています。、1ターン分の処理>>1キャラクター分の行動処理を繰り返して終了条件に合致したら終わり、という流れになってます。

  • SR: $0259F5 戦闘メインループ
0259F5PHPPush P Flag
0259F6REP #$30m=off(A/M:16b) x=off(X/Y:16b)
0259F8PHAPush A
0259F9PHXPush X
0259FAPHYPush Y
0259FBPHBPush DB
0259FCPEA #$7E7EPush #$7E7E
0259FFPLBPull DB
025A00PLBPull DB
025A01JSL $C32060SR: $032060
025A05JSL $C25A56SR: $025A56戦闘中使用RAM領域初期化
025A09JSL $C25A78SR: $025A78PC側戦闘中基本情報設定
025A0DJSL $C25AC7SR: $025AC7モンスター戦闘中情報設定
025A11JSL $C25B8BSR: $025B8Bモンスター関連戦闘開始時処理
025A15JSL $C2B32FSR: $02B32F戦闘終了時フラグセット?
025A19BCS #$26if(c==on) goto $025A41
025A1BJSL $C25CC0SR: $025CC0ターン開始時処理?
025A1FJSL $C25DEESR: $025DEE戦闘コマンド入力処理
025A23JSL $C2B32FSR: $02B32F戦闘終了時フラグセット?
025A27BCS #$18if(c==on) goto $025A41
025A29JSL $C25D56SR: $025D56ターン中の素早さ決定
025A2DJSL $C26464SR: $026464モンスター行動決定
025A31JSL $C263A2SR: $0263A2行動順序補正メイン
025A35JSL $C27275SR: $0272751ターン分の実行処理
025A39BCS #$06if(c==on) goto $025A41
025A3BJSL $C2A48CSR: $02A48Cターン数オーバーによる戦闘終了条件チェック
025A3FBCC #$DAif(c==off) goto $025A1B
025A41JSL $C2A4E6SR: $02A4E6戦闘終了判定+終了処理
025A45BCS #$BEif(c==on) goto $025A05
025A47INC $2012$2012++戦闘回数カウントアップ?
025A4AJSL $C31EE4SR: $031EE4フィールド画面復帰?
025A4EPLBPull DB
025A4FREP #$30m=off(A/M:16b) x=off(X/Y:16b)
025A51PLYPull Y
025A52PLXPull X
025A53PLAPull A
025A54PLPPull P Flag
025A55RTLreturn

まあこんなもんだろうな、という感じですね。細かい処理はSRに任せているので非常に見やすいSRになっています。DQはFFと違って戦闘中の時間の流れがないので比較的理解しやすいのでは、と思います。

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。