というわけで、今回はいよいよ無限回廊の解説です。お手本はネクロゴンドの洞窟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:多少ずれてる可能性あり
コメント