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

前回デフォルトのフィールドマップを新しいパーツにするところまで作業しましたが、次に「フラグに応じたフィールドマップの差替え」を実装します。この実装自体はオリジナルのDQ3でも浅瀬の祠(最後の鍵のある祠)とかネクロゴンド近くの火山などでもすでに行われている仕掛けなので何か新しいことをしないといけないというわけではありません。プログラムの変更の前に、まず差替え用のフィールドマップの情報を追加します。

まず、フィールドマップデータ($0541D8-)を$0510A6-に移動し、元のアドレスを参照しているSRを変更します。さらに、レコード#$0Aを追加します。

0A 2 1 0 0 10 EDA49C

オリジナルではNxNの正方形のマップしか定義されていませんが、HeightとWidthが別々に定義できるので長方形でもOKなはず、と思ったらそのとおりでした。さらに、$EDA49C-にマップデータ(非圧縮)として、

0F 00 00 01 00

を追加します。

次に、フィールドマップパターン($054232-)を$542EE-に移動し、元のアドレスを参照しているSRを変更します。さらに、レコード#$0Aを追加します。

0A 004 0A3D

最後に、フィールド構成パーツデータ($3C9F22-)の$A3D、$A3E、以降2623を加算した場所に差し替え用のマップパターンのデータを計32個所設定します(詳細は省略)。

これで差し替えマップのデータは用意できました。次にフラグ見てマップを差し替える処理を追加します。今回変更するまで場所が特定できていませんでしたが、デバッガで$7E3545をReadするときにブレークするようにすると($7E3545の#$10は「ガイアのつるぎを火山に投げ入れて道を作った」なので)、簡単に見つかります。

  • SR: $0AD6CE 地上マップ展開
0AD6DD JSR $F700 SR: $0AF700 かわきのつぼで島を浮上させているか(浮上z=on)
0AD6E0 BNE #$03 if(z==off) goto $0AD6E5
0AD6E2 JMP $D6E9 ($0AD6E9) goto $0AD6E9
0AD6E5 JSL $CC6641 SR: $0C6641
0AD6E9 JSR $F707 SR: $0AF707 ロマリア東の橋が修復されている場合のマップ差し替え処理
0AD6EC RTL return
  • SR: $0AF700 かわきのつぼで島を浮上させているか(浮上z=on)(新SR)
0AF700 LDA $3546 A=$3546
0AF703 AND #$0020 A&=#$0020
0AF706 RTS return
  • SR: $0AF707 ロマリア東の橋が修復されている場合のマップ差し替え処理(新SR)
0AF707 LDA $35B0 A=$35B0
0AF70A AND #$0020 A&=#$0020
0AF70D BEQ #$04 if(z==on) goto $0AF713
0AF70F JSL $CCF1C0 SR: $0CF1C0 ロマリア東の橋が修理されている場合のマップ展開
0AF713 RTS return
  • SR: $0CF1C0 ロマリア東の橋が修理されている場合のマップ展開(新SR)
0CF1C0 LDA #$0C00 A=#$0C00
0CF1C3 STA $9686 $9686=A
0CF1C6 LDA #$0D10 A=#$0D10
0CF1C9 STA $9688 $9688=A
0CF1CC LDX #$000A X=#$000A
0CF1CF LDY #$0000 Y=#$0000
0CF1D2 JSL $C73518 SR: $073518
0CF1D6 RTL return

SR: $0AD6CEが地上のマップ展開を行っているようです。空き領域を作るためにかわきのつぼで島を浮上させているかを判断している場所をSRにして外に出しています。処理自体は他と同じです。フラグを見て条件を満たしていればマップを差し替える、というだけです。今回の変更では「ロマリア東の橋が修理完了した」フラグは7E35B0の#$20なので、そのフラグを見てX座標=#$0C00、Y座標=#$0D10にマップ番号#$0Aのマップを差し替える、という処理を行っています。座標の位置に関しては、座標計算のルールがよくわからず、火山のX座標と浅瀬のほこらのY座標がたまたまターゲットのXY座標に近かったために、最初はこれらの座標を使い、あとはそれぞれの数値を少しずついじって微調整というゴリゴリな方法で座標の設定をしました。

というわけでなんとかマップの差し替えも終わりました。

次回からはもうひとつの山場となるイベントの実装に移ります。