先日ちらっとふれたDQ3SFCEditorの追加機能でモンスター画像のスプライトの2枚目以降を表示する機能の実装を始めましたが、いままでそこそこ動いていると思い込んでいたスプライトのデコード部分のコードが全然不完全だったことがわかったのには笑いました。やはりdqviewerは偉大です。ただ、dqviewerの表示も完全ではないというのは当たりだったようで、アニメーションは単にパラパラ漫画の連続ということで確定してよさそうです。また、SNES4BPPのデータ量を減らすために、変化の少ない部分は使いまわして動きの多い部分をその上に乗せるというような手法を使っていると思われますが、この部分のデコードがまだ完全にトレースできていません。
「キャラクターイベント中移動フラグ」をONにすることによって通行情報を無視することができるようです。
今回はPC*1の座標および通行構成情報(?)を無理矢理書き換えることにします。手法はキャラクターを1or2座標ずらした状態でメモリのダンプを取り、stirlingで比較する、という非常に原始的なものです。バイナリの比較が容易にできるstirling様様というべきでしょう。
変更するのは
- PCの実座標($7EC5E5-,$7EC625-)?
- PCの相対座標($7EC725-,$7EC765-)?
- 兵士の通行ルート上のPCの通行情報?
です。実座標と相対座標(実座標からマップのtop,leftを引いたもの)は連動しているらしく、同時に変更する必要があるようです。マップ上のキャラクターやその座標情報は7Exxx5-に存在していることが多いようで、それぞれ何を表しているのかは調べるのが大変です。通行情報は7F1000-以降のようですが、マップによって存在する場所が大きく違うようです。
- SR: $0CF300 NPC1_MoveSR_56E イベント時のPC1人目のNPC
0CF300 | COP | goto $00FFE4 | |
---|---|---|---|
0CF301 | JSL $CCD392 | SR: $0CD392 | キャラクターイベント中移動フラグON? |
略 | |||
0CF336 | LDX #$09A8 | X=#$09A8 | |
0CF339 | STX $C5E5 | $C5E5=X | 実座標(X座標)を強制変更 |
0CF33C | LDA #$0928 | A=#$0928 | |
0CF33F | STA $C625 | $C625=A | 実座標(Y座標)を強制変更 |
0CF342 | LDX #$0024 | X=#$0024 | |
0CF345 | STX $C725 | $C725=X | 相対座標(X座標)を強制変更 |
0CF348 | LDA #$0011 | A=#$0011 | |
0CF34B | STA $C765 | $C765=A | 相対座標(Y座標)を強制変更 |
0CF34E | STZ $CFA5 | $CFA5=#$00 | |
0CF351 | JSL $CDADE6 | SR: $0DADE6 | |
0CF355 | JSL $CDAF41 | SR: $0DAF41 | |
0CF359 | JSL $C75930 | SR: $075930 | |
0CF35D | JSL $CDAE1E | SR: $0DAE1E | |
0CF361 | RTL | return |
- SR $0CF390 NPC1_MoveSR_56E イベント時のPC2人目のNPC
略 | |||
---|---|---|---|
0CF3B3 | LDX #$09A8 | X=#$09A8 | |
0CF3B6 | STX $C5E7 | $C5E7=X | 実座標(X座標)を強制変更 |
0CF3B9 | LDA #$0938 | A=#$0938 | |
0CF3BC | STA $C627 | $C627=A | 実座標(Y座標)を強制変更 |
0CF3BF | LDX #$0024 | X=#$0024 | |
0CF3C2 | STX $C727 | $C727=X | 相対座標(X座標)を強制変更 |
0CF3C5 | LDA #$0013 | A=#$0013 | |
0CF3C8 | STA #$C767 | $C767=A | 相対座標(Y座標)を強制変更 |
略 |
- SR: $0CF400 NPC1_MoveSR_056F(新SR) イベント時のPC3人目のNPC(省略)
- SR: $0CF480 NPC1_MoveSR_0570(新SR) イベント時のPC4人目のNPC(省略)
何パターンかテストしてみましたが、今のところこれでイベントが止まることなく進むようです。次回はようやくノアニールの変更を行います。
*1:プレイヤーキャラクター
コメント