DQ6 ダークドレアムの行動パターン解析

DQ3 K.Mixにダークドレアムを移植するにあたって、「DQ6の行動パターンのまま移植してDQ3のパーティと戦わせたい」という方針を立てたので、DQ6(SFC)ではどのような実装になっているのかをプログラムサイドからのアプローチで見ていきます。あまたある攻略サイトで言及されているように、ダークドレアムの行動パターンというのは下記の3パターンのループで構成されている、というのは周知の事実です。

パターンA(1or2→3or4→5or6) 1.ギガデイン 2.かがやくいき 3.かまいたち 4.空高く舞い突き刺す 5.ID切り替え 6.グランドクロス
パターンB(1→6までローテ) 1.いてつくはどう 2.メラゾーマ 3.しゃくねつ 4.おたけび2 5.目にも止まらぬ早技 6.ID切り替え
パターンC(均等に選択) 1.メタルぎり 2.あやしいめ 3.はやぶさぎり 4.バイキルト 5.ID切り替え 6.ドラゴンぎり

※パターンAは1or2回行動、パターンB,Cは2回行動

DQ6では1モンスターに定義できる戦闘行動は6種類しかなく、1モンスターの定義だけであれだけの多彩な攻撃を実現することは不可能です。モンスターの定義を見ると、ダークドレアムとして$F6, $F7, $F8が割り当てられており(それぞれ上記パターンA~Cに対応)、更にその行動パターンの中に「モンスターID切り替え」というものが存在します。

  • SR: $02A877 ダークドレアムモンスターID変更1
02A877 LDA #$00F8 A=#$00F8 $F8に変更
02A87A JSR $A824 SR: $02A824 モンスターID切り替え処理
02A87D RTL return
  • SR: $02A824 モンスターID切り替え処理
02A824 PHA Push A
02A825 LDX $2559 X=$2559
02A828 JSL $C2EFA7 SR: $02EFA7 引数:1#$204E 引数:2#$0007 グループID取得?
02A830 CMP #$0006 A>=#$0006? PC側ならスキップ?
02A833 BCS #$2A if(c==on) goto $02A85F
02A835 ASL A<<1
02A836 TAY Y=A
02A837 PLA Pull A
02A838 JSL $C2F034 SR: $02F034 引数:1#$204F 引数:2#$01FF モンスターID変更
02A840 JSL $C2F034 SR: $02F034 引数:1#$2051 引数:2#$01FF モンスターID変更
02A848 STA $2567,Y $2567+Y=A
02A84B LDA #$0000 A=#$0000
02A84E JSL $C2F034 SR: $02F034 引数:1#$205E 引数:2#$00E0 不明
02A856 STX $258B $258B=X
02A859 JSL $C241EB SR: $0241EB 各種ステータスリセット?
02A85D SEC c=on
02A85E RTS return
02A85F PLA Pull A
02A860 CLC c=off
02A861 RTS return

ということで、モンスターID切り替えが戦闘行動として定義されている以上、表面上は何も行動しないように見える切り替え処理自体も行動枠を1つ消費してしまい行動回数が減るはずが、実際にはそんなことはなく、パターンBの行動をした後、パターンCの行動を2回行ったりと合計3回行動をすることもあります。という訳でもう少し調べてみると、「実行後追加処理を行うSRリスト」の中に切り替え処理が含まれていました。ここで行動情報をいじっているようです。

  • SR: $027C5C
027C5C PEA #$2516 Push #$2516
027C5F PEA #$0008 Push #$0008
027C62 PEA #$7E00 Push #$7E00
027C65 JSL $C92965 SR: $092965 やまびこ中かチェック
027C69 BNE #$09 if(z==off) goto $027C74
027C6B DEC $2543 $2543– 行動主体インデックスをデクリメントする
027C6E LDA #$0002 A=#$0002
027C71 STA $2545 $2545=A 行動インデックスに2をセット
027C74 RTS return

$2543は「現在の行動主体インデックス」$2545は行動主体がいくつ目の行動をしているかを表すインデックスです(3回行動まであるので取りうる値は0~2)。つまり、「1つ前の行動主体が行動し終わった直後にカーソルを移動している」ようです。このあと行動主体インデックスが1インクリメントされ行動インデックスが0にリセットされ、再度ダークドレアムが0から行動を開始します。これにより、2つ目にモンスターID切り替えが来ると、トータルで3回以上行動するということになります。これを踏まえると理屈上では

  1. パターンB 5を実行
  2. (パターンB 6を実行→パターンCに切り替え)表面上には現れない
  3. パターンC 5以外を実行
  4. (パターンC 5を実行→パターンAに切り替え)表面上には現れない
  5. パターンA 1or2を実行
  6. パターンA 3or4を実行

となり、1ターンに最大4回行動する可能性がありますが、実際のところはパターンBからCに変わったターンでは、なぜかパターンCからAに変わる戦闘行動は選択されません。この部分をもう少し詳しく調べると、モンスターIDを切り替えた時に、「連発行動不可フラグ」(7E2521-からグループごとに1バイトづつ、ターンごとにリセット)がクリアされていないことが原因でした。パターンBの5番目「目にも止まらぬ早業」(連発不可フラグがON)を実行した後、5番目の戦闘行動が同ターンで連発不可になりますが、パターンCに切り替わった後もこの情報が生きるため、パターンCの5番目である「パターンAに切り替え」が選ばれない、ということのようです。これは意図的なのか、フラグのリセットし忘れなのか不明ですが、DQ6ではダークドレアムは3回行動までしかしないようです。DQ3 K.MixではID切り替えを光ゾーマ、灰ゾーマで実装していますが、こちらはターン終了時に必ず切り替わる、としているので、ダークドレアムの挙動をDQ3に再現するには不適当です。とはいえ、上記の動作はDQ3にも存在する枠組みで対処可能であるため、移植は比較的簡単です。ただ、SR: $0241EBでID切り替え後のステータスを大幅にリセットしているように見えますが、DQ6の戦闘部分の解析をまるでやっていないため何をやっているかよくわかりませんが、だいたいはこのくらい理解しておけば皆さんご存知の通りDQ3でDQ6のダークドレアムの行動を再現することはできそうです。ただ、テストプレイ中にダークドレアムが4回行動した、という報告があり、手元でも1回起きた気がするのでまだなにか問題は残っているかもしれません。