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

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

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

0A210010EDA49C

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

0F00000100

を追加します。

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

0A0040A3D

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

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

  • SR: $0AD6CE 地上マップ展開
0AD6DDJSR $F700SR: $0AF700かわきのつぼで島を浮上させているか(浮上z=on)
0AD6E0BNE #$03if(z==off) goto $0AD6E5
0AD6E2JMP $D6E9 ($0AD6E9)goto $0AD6E9
0AD6E5JSL $CC6641SR: $0C6641
0AD6E9JSR $F707SR: $0AF707ロマリア東の橋が修復されている場合のマップ差し替え処理
0AD6ECRTLreturn
  • SR: $0AF700 かわきのつぼで島を浮上させているか(浮上z=on)(新SR)
0AF700LDA $3546A=$3546
0AF703AND #$0020A&=#$0020
0AF706RTSreturn

  • SR: $0AF707 ロマリア東の橋が修復されている場合のマップ差し替え処理(新SR)
0AF707LDA $35B0A=$35B0
0AF70AAND #$0020A&=#$0020
0AF70DBEQ #$04if(z==on) goto $0AF713
0AF70FJSL $CCF1C0SR: $0CF1C0ロマリア東の橋が修理されている場合のマップ展開
0AF713RTSreturn

  • SR: $0CF1C0 ロマリア東の橋が修理されている場合のマップ展開(新SR)
0CF1C0LDA #$0C00A=#$0C00
0CF1C3STA $9686$9686=A
0CF1C6LDA #$0D10A=#$0D10
0CF1C9STA $9688$9688=A
0CF1CCLDX #$000AX=#$000A
0CF1CFLDY #$0000Y=#$0000
0CF1D2JSL $C73518SR: $073518
0CF1D6RTLreturn

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

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

20090628104652.jpg

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

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。