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回以上行動するということになります。これを踏まえると理屈上では
- パターンB 5を実行
- (パターンB 6を実行→パターンCに切り替え)表面上には現れない
- パターンC 5以外を実行
- (パターンC 5を実行→パターンAに切り替え)表面上には現れない
- パターンA 1or2を実行
- パターン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回起きた気がするのでまだなにか問題は残っているかもしれません。
コメント