DQ6戦闘部分解説13

間が開きすぎて全体のどれくらいまで終わっているのか自分でもすっかり忘れていたりするのですが、まだコマンド入力が終わっていません。AIの解析は先にすでに終えているので、コマンド入力の部分が終わったらようやく戦闘が開始するところまでいけるので先が見えてきます。話は変わりますが、DQろだにうpされてる氷の洞窟パッチ凄すぎワロタ。実装までは見ていませんが、一番鬼門だと思っていた奥に扉が見えているマップ(おそらくBG3を追加しているんじゃないでしょうか)、神殿の入口のマップもきっちり再現されていてちゃんとした知識を持った方(+絵心がある方)が作成されたのだなと推測されます。あそこまでできてりゃグランドラゴーンイベントの配置とかすぐおわんじゃねーのというくらい。ゲームにおいてグラフィックは避けて通ることができない部分なので絵心がある人は尊敬してやみません。自分がDQ3 K.MixでDQ4の王家の墓フロアの矢印の移動ギミックを0から実装しないですんだように、滑る床についてはもしかしたらDQ3オリジナルでそういう実装が使ってないものの存在しているかもしれません。DQ6の錆びたラミアスの剣のある洞窟のギミックが似たような感じなのでその実装と似ているところを探したらヒットするかも。かも。かも(全部かも)。

  • SR:$023BCE 戦闘コマンド処理1人分_SRアドレス_道具処理
023BCE JSL $C5F4A5 SR: $05F4A5 使用できる道具があるか(該当c=off)
023BD2 BCS #$4A if(c==on) goto $023C1E
023BD4 STZ $3AC4 $3AC4=#$00
023BD7 STY $386E $386E=Y
023BDA LDA #$0076 A=#$0076 ウィンドウID
023BDD JSL $C37236 SR: $037236
023BE1 BCS #$3B if(c==on) goto $023C1E
023BE3 LDX $258B X=$258B
023BE6 JSL $C2F034 SR: $02F034 引数:1#$2054 引数:2#$00F0 使用するアイテムの並びセット
023BEE LDA #$0001 A=#$0001
023BF1 JSL $C2F034 SR: $02F034 引数:1#$2061 引数:2#$0080 道具使用フラグをON
023BF9 LDA $3876 A=$3876
023BFC JSL $C2F034 SR: $02F034 引数:1#$2060 引数:2#$00FF 使用するアイテムID
023C04 JSR $3C1F SR: $023C1F 戦闘中アイテム→戦闘行動変換
023C07 STA $258D $258D=A
023C0A JSR $3AA5 SR: $023AA5 行動対象情報セット
023C0D BCC #$06 if(c==off) goto $023C15
023C0F JSL $C3B0B9 SR: $03B0B9 ウィンドウ消去(フェードなし)
023C13 BRA #$CC goto $023BE1 指定ページ以上の深さのバッファクリア
023C15 LDA $38B0 A=$38B0
023C18 DEC A–
023C19 JSL $C3B4F9 SR: $03B4F9
023C1D CLC c=off
023C1E RTS return
  • SR:$05F4A5 使用できる道具があるか(該当c=off)
05F4A5 PHP Push P Flag
05F4A6 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F4A8 PHA Push A
05F4A9 PHX Push X
05F4AA PHY Push Y
05F4AB PHB Push DB
05F4AC PEA #$7E7E Push #$7E7E
05F4AF PLB Pull DB
05F4B0 PLB Pull DB
05F4B1 LDX $386E X=$386E
05F4B4 JSL $C45157 SR: $045157 引数:1#$01 引数:2#$FE 引数:3#$FF キャラクター所持道具数取得?
05F4BB CMP #$0000 A==#$0000?
05F4BE BNE #$2A if(z==off) goto $05F4EA
05F4C0 TXY Y=X
05F4C1 JSL $C2BB34 SR: $02BB34 戦闘中キャラクターIDから通常キャラクターIDへ変換
05F4C5 STX $2555 $2555=X
05F4C8 LDA #$0061 A=#$0061
05F4CB JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05F4CF JSL $C02A16 SR: $002A16 引数:1#$01B4 戦闘メッセージ「○○は どうぐを もっていない。」
05F4D5 JSL $C31BD0 SR: $031BD0 キー入力を待つ(R,Y入力無視)
05F4D9 LDA $38B0 A=$38B0
05F4DC DEC A–
05F4DD JSL $C3B4F9 SR: $03B4F9 指定ページ以上の深さのバッファクリア
05F4E1 PLB Pull DB
05F4E2 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F4E4 PLY Pull Y
05F4E5 PLX Pull X
05F4E6 PLA Pull A
05F4E7 PLP Pull P Flag
05F4E8 SEC c=on
05F4E9 RTL return
05F4EA PLB Pull DB
05F4EB REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F4ED PLY Pull Y
05F4EE PLX Pull X
05F4EF PLA Pull A
05F4F0 PLP Pull P Flag
05F4F1 CLC c=off
05F4F2 RTL return

このSRは単に対象のPCの所持道具数を調べて0個ならメッセージを出してc=onにセットしてリターンするだけです。

  • SR:$023C1F 戦闘中アイテム→戦闘行動変換
023C1F LDX #$0033 X=#$0033
023C22 SEP #$20 m=on(A/M:8b)
023C24 CMP $C23C3D,X A==$023C3D+X?
023C28 BEQ #$09 if(z==on) goto $023C33
023C2A DEX X–
023C2B BPL #$F7 if(n==off) goto $023C24
023C2D REP #$20 m=off(A/M:16b)
023C2F LDA #$0129 A=#$0129
023C32 RTS return
023C33 REP #$20 m=off(A/M:16b)
023C35 TXA A=X
023C36 ASL A< <1
023C37 TAX X=A
023C38 LDA $C23C71,X A=$023C71+X
023C3C RTS return

このSRはアイテムIDから使用時の戦闘行動を決めている部分です。真面目に解析をやってよかったなと思うのは、ここでまた2点DQ6 Extendedの問題を発見してしまいました。

  • $7E2060にアイテムIDを1バイトでセットしている
  • SR:$023C1F 戦闘中アイテム→戦闘行動変換の中でアイテムIDが1バイトである前提でプログラムが書かれている

1番目の問題は幸いにも前回の修正で事実上空きになった領域が$7E2061の下位ビットにあるのでその下位1ビットをアイテムIDとして使用することで回避できます。この情報がどこで使用されているかはまだわかりません。2番目の問題は単に領域の問題なのでアイテムIDを2バイトにして別の場所に移動させる+プログラムをちょっと変えるだけで対応できそうです。早めに修正し、DQ6 Extended 0.9.1rc2として再度リリースする予定です。