DQ3 通行情報の継足し・屋根・無限回廊3

というわけで、今回はいよいよ無限回廊の解説です。お手本はネクロゴンドの洞窟2Fです。まずは下のマップを見てください。

(元画像はサイズが大きいので注意)

赤丸で囲った部分が全く同じであることを確認してください。次にこのフロアの進入時初期化処理を見ていきます。

  • SR: $0A64DA ネクロゴンドの洞窟2F進入時初期化処理
0A6504 JSL $C7785F SR: $07785F 引数:1#$CAF282 イベント設定
  • SR: $0AAC48 ネクロゴンドの洞窟2F移動・宝箱・ドア・NPC情報設定
0AAC84 JSL $C738E2 SR: $0738E2 引数:1#$00 引数:2#$00 引数:3#$CDB381
  • SR: $0AF282 ネクロゴンドの洞窟2F通行情報動的変更
0AF282 LDA #$009A A=#$009A
0AF285 STA $9C11 $9C11=A
0AF288 LDA #$0068 A=#$0068
0AF28B STA $9C13 $9C13=A
0AF28E LDA #$009A A=#$009A
0AF291 STA $9C15 $9C15=A
0AF294 LDA #$006D A=#$006D
0AF297 STA $9C17 $9C17=A 範囲座標指定
0AF29A LDX #$0001 X=#$0001 通行構成情報ID指定
0AF29D LDY #$0000 Y=#$0000
0AF2A0 JSL $C736D0 SR: $0736D0 上記座標の通行構成情報に#$2800を設定
0AF2A4 JSL $C78FB9 SR: $078FB9
0AF2A8 COP goto $00FFE4
0AF2A9 JSL $C78FDF SR: $078FDF
0AF2AD JSL $CCD298 SR: $0CD298
0AF2B1 RTL return

このSRでは指定座標(#$9A, #$68~#$6D)の通行構成情報を#$2800(透過+α?)に変更しているようです。ちなみに、この座標は上のマップの青線のあたりの座標に相当します*1

  • SR: $0DB381 ネクロゴンドの洞窟2F座標移動処理
0DB381 JSL $C73B6E SR: $073B6E
0DB385 RTL return
  • SR: $073B6E ネクロゴンドの洞窟2F座標移動処理
073B6E CPY $DAA5 Y==$DAA5?
073B71 BNE #$0C if(z==off) goto $073B7F
073B73 LDA #$FD60 A=#$FD60
073B76 LDX #$FEE0 X=#$FEE0 ジャンプする座標差分をWX,WYベースで指定
073B79 JSR $3BE3 SR: $073BE3 座標移動処理
073B7C JSR $3BAE SR: $073BAE
073B7F RTL return

このSRでは、$0AF282で指定した範囲の座標にPCの先頭が来た瞬間にWX座標を#$FD60、WY座標を#$FEE0(signed intなので両方ともマイナス)ずらす処理を行っています。結果として、PC座標は緑線の部分に移動することになります。これで大体仕組みがわかりました。まずマップにのりしろに相当する部分(上のマップで言えば右の赤丸)を用意し、その部分にきたら無限回廊開始部分(上のマップで言えば左の赤丸)に座標だけ飛ばす、ということをすればいいわけです。注意しないといけないのは、のりしろに相当するマップは見た目は全く同じでないといけません。また、屋根を使用する場合も屋根番号は同じでないといけません(したがってある程度離れている必要があります)。次に1マップ上にいくつまでこのギミックを配置出来るか、という話になりますが、1マップ上に2つ配置されている地球のへそB1Fを見てみたところ、通行構成情報の設定の部分を#$2800と#$2400にしてそれぞれ別のSRで処理する、という実装になっていました。2つなら通行構成情報のフラグ属性で使い分けることは可能ですが7つ、8つとなると無理です。というわけで、ロンダルキアの洞窟の最終フロアのようなマップを実装するには、「現在位置を調べてジャンプする差分座標を切り替える」ことで対応できます。これなら実質上限は無限になるので、後はマップサイズとの相談になります。

*1:多少ずれてる可能性あり