↑わかる人だけにはわかるバグフィックスの図
例によって「ダウンロード」ページにう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と書いたこっちも悪いんですが)をくれとお願いしたところスクリーンショットが送られてきて絶望したのでだれか送ってくれないかなー(チラッチラッ。
コメント