間が開きすぎて全体のどれくらいまで終わっているのか自分でもすっかり忘れていたりするのですが、まだコマンド入力が終わっていません。
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として再度リリースする予定です。
コメント