DQ6戦闘部分解説1

DQ6 Extendedの作成はまあ順調に進んでおり、ひとつの山だと思っていた移動中のメッセージを解凍した状態でROMに書き戻し+デコードプログラムの変更は1日であっさり終わってしまいました(デコードプログラムの部分はDQ3 Extendedの該当箇所を真似ただけなので大したことはやってないのですが)。セーブデータの拡張が必要なアイテムの前に戦闘行動とモンスターの拡張作業を先にやっていますが、モンスター数の変更は意外とやるべきことが多そうでまだまともに動いていません。戦闘が始まると即全滅扱いになったり、それを直したら今度は味方が混乱状態になったりと、さすがに公開前にひと通りのテストプレイは必要な感じです。

今回から新たなネタとしてDQ6の戦闘部分の解析をしていこうと思います。AIに関してはすでに解析済みなのでそこだけ飛ばします。大部分はすでに解析の終わっているDQ3の戦闘部分と同じと思われますが、「だいたい同じだから」といって飛ばさずに解説していこうと思います。

  • SR: $0233B7 戦闘メインループ
0233B7PHPPush P Flag
0233B8PHBPush DB
0233B9REP #$30m=off(A/M:16b) x=off(X/Y:16b)
0233BBPEA #$7E7EPush #$7E7E
0233BEPLBPull DB
0233BFPLBPull DB
0233C0JSL $C47A93SR: $047A93時の砂使用時に備えて戦闘開始時の状態をバックアップ
0233C4JSL $C2345ESR: $02345E戦闘中使用RAM領域初期化
0233C8JSL $C23474SR: $023474PC側戦闘中情報セット
0233CCJSL $C234A4SR: $0234A4モンスター側戦闘中情報セット
0233D0JSL $C2BF22SR: $02BF22時の砂使用時処理
0233D4PEA #$2514Push #$2514
0233D7PEA #$001EPush #$001E
0233DAPEA #$7E00Push #$7E00
0233DDJSL $C92965SR: $092965RAM上情報取得
0233E1BNE #$43if(z==off) goto $023426
0233E3JSL $C23555SR: $023555
0233E7JSL $C236A9SR: $0236A9アストロン解除処理
0233EBJSL $C23803SR: $023803戦闘コマンド入力
0233EFJSL $C2BF22SR: $02BF22時の砂使用時処理
0233F3PEA #$2514Push #$2514
0233F6PEA #$001EPush #$001E
0233F9PEA #$7E00Push #$7E00
0233FCJSL $C92965SR: $092965RAM上情報取得
023400BNE #$24if(z==off) goto $023426
023402JSL $C2375DSR: $02375D1ターン中の素早さ値決定
023406JSL $C241C4SR: $0241C4行動開始前リセット処理
02340AJSL $C23F73SR: $023F73
02340EJSL $C2541BSR: $02541B
023412PEA #$2514Push #$2514
023415PEA #$001EPush #$001E
023418PEA #$7E00Push #$7E00
02341BJSL $C92965SR: $092965RAM上情報取得
02341FBNE #$05if(z==off) goto $023426
023421JSR $342FSR: $02342F格闘場ターン数カウント処理(ターン数オーバーc=on)
023424BCC #$C1if(c==off) goto $0233E7
023426JSL $C2ACFFSR: $02ACFF戦闘終了判定
02342ABCS #$98if(c==on) goto $0233C4
02342CPLBPull DB
02342DPLPPull P Flag
02342ERTLreturn

これが戦闘処理のメインループです。例によって通常戦闘、ボス戦、スライム格闘場、デスタムーアvsダークドレアムのイベント戦闘まで全てをこの中で行います。

  • SR: $047A93 時の砂使用時に備えて戦闘開始時の状態をバックアップ
047A93PHPPush P Flag
047A94PHBPush DB
047A95SEIi=on
047A96REP #$30m=off(A/M:16b) x=off(X/Y:16b)
047A98PHAPush A
047A99PHXPush X
047A9APHYPush Y
047A9BPEA #$7E7EPush #$7E7E
047A9EPLBPull DB
047A9FPLBPull DB
047AA0LDX #$3EA0X=#$3EA0作戦IDから各キャラクターデータまでをバックアップ
047AA3LDY #$2800Y=#$2800$7E2800-2D75に退避する
047AA6LDA $0000,XA=$0000+X
047AA9STA $0000,Y$0000+Y=A
047AACINYY++
047AADINYY++
047AAEINXX++
047AAFINXX++
047AB0CPX #$4415X>=#$4415?
047AB3BCC #$F1if(c==off) goto $047AA6
047AB5PLYPull Y
047AB6PLXPull X
047AB7PLAPull A
047AB8PLBPull DB
047AB9PLPPull P Flag
047ABARTLreturn

まずは最初のSRから。DQ6では時の砂があるため、戦闘中に戦闘開始時に戻るケースがあります。いつでもその状態に戻れるように作戦、ふくろのアイテム、所持金(ぐんたいよびで減るから)、各キャラクターのステータスなどをまるごとバックアップしておく必要があります。処理自体はクイックセーブ、クイックロードのように特定の領域の値を別の場所にまるごとコピーしておくだけです。

コメント

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