DQ6 KTPEx 0.9.9 リリース

↑わかる人だけにはわかるバグフィックスの図

例によって「ダウンロード」ページにうpしてあります。今回はオリジナルから存在するバグ(+KTPEx独自のバグ)の修正です。

ふくろバグの修正

DQ6 KTPExのバグの再現方法についてにも追記しましたが、直接の原因は「袋の一番最後のページにアイテムが1個だけでそのアイテムを袋から出したあとに戻ってきた袋の中身のウィンドウで現ページのインデックスが-1されていない」ことが原因でした。

どこをいじったもんかなーとまずは実装を追っていったところ、以下のような箇所を発見しました。

  • SR:$03AE9F ウィンドウを閉じる
$03AF36 JSL $C92AB5 SR: $092AB5 引数:1#$00 引数:2#$0020 引数:3#$7E38B4 引数:4#$0000
$03AF42 CMP #$0033 A==#$0033? 袋の中身描画のウィンドウID
$03AF45 BNE #$1C if(z==off) goto $03AF63
$03AF47 LDA $3AF8 A=$3AF8
$03AF4A BEQ #$17 if(z==on) goto $03AF63
$03AF4C LDA $3AE4 A=$3AE4
$03AF4F BNE #$12 if(z==off) goto $03AF63
$03AF51 JSR $B083 SR: $03B083 ページ情報等を補正するべきか(該当c=on)
$03AF54 BCC #$0D if(c==off) goto $03AF63
$03AF56 DEC $3AF8 $3AF8– 現ページインデックスを-1
$03AF59 LDA $3AC4 A=$3AC4
$03AF5C SEC c=on
$03AF5D SBC #$000C A-=(#$000C+!c) ページ先頭の項目のインデックスを-12する
$03AF60 STA $3AC4 $3AC4=A

ちゃんとインデックスを調整するコードあるのになぜ??となりました。しかもウィンドウID #$33は袋の中身を表示するウィンドウなわけで意図的に上記問題を考慮してインデックスを調整する実装になっています。というわけで怪しいのはSR: $03B083の判断が間違っているということで、次はこの実装を見ていきます。

  • SR:$03B083 ページ情報等を補正するべきか(該当c=on)
$03B083 PHP Push P Flag
$03B084 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
$03B086 PHA Push A
$03B087 PHX Push X
$03B088 PHY Push Y
$03B089 PHB Push DB
$03B08A LDA $3AC4 A=$3AC4
$03B08D INC A++
$03B08E STA $70 DP($70)=A
$03B090 LDY #$0000 Y=#$0000
$03B093 TXY Y=X Yを#$0000で初期化したのにXの値をコピーしている!

このSRは現ページの先頭の袋中のインデックスに+1してDP($70)にセット、袋の中身の種類数を数えて(個数が1以上ならカウントアップ)YレジスタにセットしDP($70)がYを超えていたら調整の必要があると判断していますが、問題は$03B090~$03B093です。Yレジスタを0で初期化してるのに直後にXレジスタの値をコピーしています。Xは2が入っているので、0で初期化した変数に直後で2をセットしてしまっています。これだと袋の種類数のカウントが2から始まってしまいます。正しくはYレジスタの値をXレジスタにコピーするべきです(別の場所の袋の種類数を数えるSRではそうやっていた)。

また、発生条件として「ひのきのぼう、たけのやり、こんぼうのどれかが袋の中にない」というのは上記カウントを0からではなく2からやっていることが関連しています。正確な条件を調べるのは時間がかかるのでやめました。オジリナルのROMでこのバグを回避したければ「ひのきのぼう、たけのやり、こんぼうをとにかく袋に突っ込んでおく」をしておけばいいと思います。

知力の兜のバグ修正

これはオリジナルのバグに加え、アイテムIDを9ビット化した際に賢さだけ装備品によるステータスアップの対応が漏れていました。0.9.8では知力の兜を装備しても賢さは上がりません。オリジナルのバグを修正するとともに知力の兜を装備すると賢さも上がるようにしました。

雑感

改めて「バグが起きるステートセーブのありがたみ」を実感することとなりました。発生直前のステートセーブを頂いて再現することだけ確認してしばらく手がつけられなかったのですが、デバッグを開始してから4,5時間で修正完了となりました。DQ3 K.Mixで「隠しダンジョンで宝箱を開けるとフリーズする」バグのステートセーブ(SSと書いたこっちも悪いんですが)をくれとお願いしたところスクリーンショットが送られてきて絶望したのでだれか送ってくれないかなー(チラッチラッ。