DQ6戦闘部分解説13

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

DQ6戦闘画面7

  • SR:$023BCE 戦闘コマンド処理1人分_SRアドレス_道具処理
023BCEJSL $C5F4A5SR: $05F4A5使用できる道具があるか(該当c=off)
023BD2BCS #$4Aif(c==on) goto $023C1E
023BD4STZ $3AC4$3AC4=#$00
023BD7STY $386E$386E=Y
023BDALDA #$0076A=#$0076ウィンドウID
023BDDJSL $C37236SR: $037236
023BE1BCS #$3Bif(c==on) goto $023C1E
023BE3LDX $258BX=$258B
023BE6JSL $C2F034SR: $02F034 引数:1#$2054 引数:2#$00F0使用するアイテムの並びセット
023BEELDA #$0001A=#$0001
023BF1JSL $C2F034SR: $02F034 引数:1#$2061 引数:2#$0080道具使用フラグをON
023BF9LDA $3876A=$3876
023BFCJSL $C2F034SR: $02F034 引数:1#$2060 引数:2#$00FF使用するアイテムID
023C04JSR $3C1FSR: $023C1F戦闘中アイテム→戦闘行動変換
023C07STA $258D$258D=A
023C0AJSR $3AA5SR: $023AA5行動対象情報セット
023C0DBCC #$06if(c==off) goto $023C15
023C0FJSL $C3B0B9SR: $03B0B9ウィンドウ消去(フェードなし)
023C13BRA #$CCgoto $023BE1指定ページ以上の深さのバッファクリア
023C15LDA $38B0A=$38B0
023C18DECA–
023C19JSL $C3B4F9SR: $03B4F9
023C1DCLCc=off
023C1ERTSreturn
  • SR:$05F4A5 使用できる道具があるか(該当c=off)
05F4A5PHPPush P Flag
05F4A6REP #$30m=off(A/M:16b) x=off(X/Y:16b)
05F4A8PHAPush A
05F4A9PHXPush X
05F4AAPHYPush Y
05F4ABPHBPush DB
05F4ACPEA #$7E7EPush #$7E7E
05F4AFPLBPull DB
05F4B0PLBPull DB
05F4B1LDX $386EX=$386E
05F4B4JSL $C45157SR: $045157 引数:1#$01 引数:2#$FE 引数:3#$FFキャラクター所持道具数取得?
05F4BBCMP #$0000A==#$0000?
05F4BEBNE #$2Aif(z==off) goto $05F4EA
05F4C0TXYY=X
05F4C1JSL $C2BB34SR: $02BB34戦闘中キャラクターIDから通常キャラクターIDへ変換
05F4C5STX $2555$2555=X
05F4C8LDA #$0061A=#$0061
05F4CBJSL $C37236SR: $037236ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05F4CFJSL $C02A16SR: $002A16 引数:1#$01B4戦闘メッセージ「○○は どうぐを もっていない。」
05F4D5JSL $C31BD0SR: $031BD0キー入力を待つ(R,Y入力無視)
05F4D9LDA $38B0A=$38B0
05F4DCDECA–
05F4DDJSL $C3B4F9SR: $03B4F9指定ページ以上の深さのバッファクリア
05F4E1PLBPull DB
05F4E2REP #$30m=off(A/M:16b) x=off(X/Y:16b)
05F4E4PLYPull Y
05F4E5PLXPull X
05F4E6PLAPull A
05F4E7PLPPull P Flag
05F4E8SECc=on
05F4E9RTLreturn
05F4EAPLBPull DB
05F4EBREP #$30m=off(A/M:16b) x=off(X/Y:16b)
05F4EDPLYPull Y
05F4EEPLXPull X
05F4EFPLAPull A
05F4F0PLPPull P Flag
05F4F1CLCc=off
05F4F2RTLreturn

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

  • SR:$023C1F 戦闘中アイテム→戦闘行動変換
023C1FLDX #$0033X=#$0033
023C22SEP #$20m=on(A/M:8b)
023C24CMP $C23C3D,XA==$023C3D+X?
023C28BEQ #$09if(z==on) goto $023C33
023C2ADEXX–
023C2BBPL #$F7if(n==off) goto $023C24
023C2DREP #$20m=off(A/M:16b)
023C2FLDA #$0129A=#$0129
023C32RTSreturn
023C33REP #$20m=off(A/M:16b)
023C35TXAA=X
023C36ASLA< <1
023C37TAXX=A
023C38LDA $C23C71,XA=$023C71+X
023C3CRTSreturn

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

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

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

コメント

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