前回デフォルトのフィールドマップを新しいパーツにするところまで作業しましたが、次に「フラグに応じたフィールドマップの差替え」を実装します。この実装自体はオリジナルの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座標に近かったために、最初はこれらの座標を使い、あとはそれぞれの数値を少しずついじって微調整というゴリゴリな方法で座標の設定をしました。
というわけでなんとかマップの差し替えも終わりました。
次回からはもうひとつの山場となるイベントの実装に移ります。
コメント