DQ3 ストーリー変更(ロマリア~ノアニール10)

先日ちらっとふれた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:プレイヤーキャラクター