例によって「ダウンロード」ページにうpしてあります。スレその他で指摘された問題を修正しています。格闘場のマホカンタの問題以外に移動中のザオラル時のフリーズバグを修正しています(報告ありがとうございます)。手元で確認できたのは「冒険再開後に1回も戦闘せずにザオラルを死人に対して使用する」という条件ですが、他の条件もあるかもしれません。また、今回も見た目だけの問題ですが前から気になっていたバラモス城追加イベント用の戦闘背景(のカラーパレット)を専用のものにしました。
(一応ネタバレになるので同フロアに出現する別のモンスターにしました)
さて、格闘場でモンスターのマホカンタでフリーズするという問題についてまじめに調べたところ、この問題はオリジナルから存在していたようですが実際に顕在化するのが「怪しい影3体の組み合わせでかつ左端のモンスターの実体がマホカンタを使う敵である」という条件であるため、見逃されていたようです。実際にはフリーズではなく、1フレームごと(多分?)にカウンタが0になるまで処理をウェイトするSRのカウンタが#$FFFFとなってしまうため、1フレームが60FPSの1フレームと仮定しても0になるまで65535/60=約1100秒となるため、実機であれば20分近くウェイトし続けることになります(実際ターボモードで確認したところ数分後にマホカンタのエフェクトが発生してその後何の問題もなく戦闘が継続されましたwww)。
オリジナルでは以下のような実装になっています。
- SR: $0492DE マホカンタエフェクト処理
0492DE | JSR $AFB1 | SR: $04AFB1 | Xレジスタフレーム分ウェイト処理? |
---|---|---|---|
略 |
- SR: $04AFB1 Xレジスタフレーム分ウェイト処理?
04AFB1 | JSL $C48320 | SR: $048320 | |
---|---|---|---|
04AFB5 | DEX | X– | |
04AFB6 | BNE #$F9 | if(z==off) goto $04AFB1 | Xが0になるまで繰り返し |
04AFB8 | RTS | return |
Xレジスタの値が不定のままウェイト処理がいきなり始まります。モンスター側のマホカンタ実行時にはXには実行したモンスターの戦闘中キャラクターIDが入ります。戦闘中はプレイヤーキャラクターから先にIDがセットされるため通常戦闘ではモンスターのIDが0になることはありませんが、格闘場では左端のモンスターにID:0が割り当てられます。この場合$04AFB5でXが#$FFFFになってしまい(アンダーフロー?)、以後Xが0になるまで他の処理が延々中断されることになります。また、マホカンタのかかったモンスターに呪文をかけるとこのSRが呼ばれますが、Xレジスタにはマホカンタの戦闘行動IDである#$43がセットされるため、これまた67フレーム(=1秒ちょい?)ウェイトがかかります。モンスターのマホカンタ反射エフェクトが妙に間延びしているのは恐らくこのせいです。
- SR: $028605 マホカンタ処理前半
略 | |||
---|---|---|---|
02861B | LDX #$0043 | X=#$0043 | マホカンタの戦闘行動ID |
略 | |||
028638 | JSL $C48D49 | SR: $048D49 | この中でSR: $0492DEが呼ばれる |
略 |
これを踏まえてどう修正するべきかという話になりますが、元々の意図としてXレジスタ分ウェイトするのではなかったのではないかと想像します。マホカンタのエフェクトが発生するまで見た目上ランダムにしたいというならモンスターIDが0の場合の考慮がされてしかるべきだし、反射エフェクトのときも発生が遅すぎます。というわけで、$0492DEで呼ぶSRをすぐそばにあるSR: $04AFACに変更します。
- SR: $04AFAC 1フレーム分ウェイト処理?
04AFAC | JSL $C48320 | SR: $048320 | |
---|---|---|---|
04AFB0 | RTS | return |
このSRはXレジスタの値に関係なく1ループしかウェイトしません。というわけでこのSRに差し替えます。
- SR: $0492DE マホカンタエフェクト処理
0492DE | JSR $AFAC | SR: $04AFAC | 1フレーム分ウェイト処理? |
---|---|---|---|
略 |
結局のところ変更するのは1バイトだけなのですが、これにより格闘場でのフリーズ問題とマホカンタのかかったモンスターに呪文をかけた時のエフェクト発生が遅い問題が修正されます。
コメント