DQ3 K.Mixの隠しダンジョンの分岐先のフロアををどうするかにあたり、一番の問題はネタ切れだったわけですが、DQ3の既存のダンジョンで使えそうなものは既にゼニス城への道中で使ってしまったため、やむを得ず他のシリーズから出張してもらうことにしました。選定の基準としては「DQ3にあるマップパーツで表現できそう」「オリジナルでストーリーに強く絡むもの(ラスダンとか)はNG」「ある程度ギミックのあるもの」ということで以下のラインナップになりました。
DQ1 | 岩山の洞窟B1F,B2F | 既にあるのでそのまま流用 |
DQ2 | 海底洞窟のB3F(一部),B4F | 要新規作成 |
DQ3 | 岬の洞窟B2F,ナジミの塔B1F | 既にあるのでそのまま流用 |
DQ4 | 王家の墓B1F,B2F,B3F | 要新規作成、矢印床のギミックが必要 |
DQ5 | 隠しダンジョンB1F,B2F | 要新規作成 |
DQ6 | 魔術師の塔2F,3F,グレイス城儀式の間 | DQ6からそっくりそのまま移植、階段を斜め移動するギミックが必要 |
DQ7は移植したいダンジョンが2Dで表現が困難だったりしたので6で打ち止めとしました。8以降は言わずもがな。トータル10フロア以上の長いダンジョンになりましたが、2,3フロアでパターンが切り替わるので自分感覚ではそれほど長いとは感じませんでした(間に村もあるし)。DQ2の海底洞窟はもう1フロア上からやってもよかったのですが、正解以外のフロアを作るのがしんどいのでパスしました。DQ4は本当はガーデンブルク南の洞窟B1F,B2Fにしたかったのですが、フロア中の多層構造を表現できるパーツがないので断念しました。DQ5は実はプレイ回数が一番少ないのでいまいち印象に残っているダンジョンが少なく、当初は1フロア下の無限回廊まで再現させようと思ったものの、1フロア目が意外と大きく分割するはめになりまだ先は長い(この時点でDQ6のフロア、見覚えのある村及び追加ボスは全く実装していない)こともあり妥協しました。選定が終わったところで一番の問題は「固有のギミックをDQ3に移植できるのか」ということでした。矢印床のギミックや階段の斜め移動自体はエンジンがほぼ同じのDQ6で実装されているので、「不可能ではないだろう」と当たりはつけていましたが、エフェクトの移植と同じく双方でいろいろなSRを見て対応付けできるメモリやSRを特定し1対1対応で作業していくことにしました。DQ6のマップ上のギミック処理はDQ3とは異なり配列で管理されているのでそもそも処理の場所を見つけるのが結構骨でした。まずはDQ6の処理を見てみます。
- SR: $01D3A6 矢印パネル移動処理(DQ6)
01D3A6 | JSL $C5A5B2 | SR: $05A5B2 | |
---|---|---|---|
01D3AA | LDA #$0000 | A=#$0000 | |
01D3AD | LDX $6C99 | X=$6C99 | |
01D3B0 | LDY $6C9B | Y=$6C9B | |
01D3B3 | JSL $C5A63D | SR: $05A63D | |
01D3B7 | LDA $7A57,Y | A=$7A57+Y | |
01D3BA | AND #$0006 | A&=#$0006 | |
01D3BD | STA $7A57,Y | $7A57+Y=A | |
01D3C0 | LDA $18 | A=DP($18) | |
01D3C2 | SEC | c=on | |
01D3C3 | SBC $7FE58E,X | A-=($7FE58E+X+c) | |
01D3C7 | AND #$0001 | A&=#$0001 | |
01D3CA | STA $18 | DP($18)=A | |
01D3CC | LDA $1A | A=DP($1A) | |
01D3CE | SEC | c=on | |
01D3CF | SBC $7FE5AE,X | A-=($7FE5AE+X+c) | |
01D3D3 | AND #$0001 | A&=#$0001 | |
01D3D6 | STA $1A | DP($1A)=A | |
01D3D8 | LDA $6CCB | A=$6CCB | |
01D3DB | STA $1C | DP($1C)=A | |
01D3DD | ASL | A<<1 | |
01D3DE | TAX | X=A | |
01D3DF | JSR $D3F3 | SR: $($01D3F3+X) | |
01D3E2 | PHA | Push A | |
01D3E3 | LDY $6E6B | Y=$6E6B | |
01D3E6 | LDA $8257,Y | A=$8257+Y | |
01D3E9 | TAY | Y=A | |
01D3EA | PLA | Pull A | |
01D3EB | STA $7C17,Y | $7C17+Y=A | |
01D3EE | JSL $C5A03B | SR: $05A03B | |
01D3F2 | RTL | return |
- SR: $01D40E 斜め移動(裏)?(DQ6)
01D40E | PHA | Push A | |
---|---|---|---|
01D40F | LDY $6E6B | Y=$6E6B | |
01D412 | LDA $8257,Y | A=$8257+Y | |
01D415 | TAY | Y=A | |
01D416 | PLA | Pull A | |
01D417 | LDA $7C17,Y | A=$7C17+Y | |
01D41A | ASL | A<<1 | |
01D41B | TAX | X=A | |
01D41C | JSR $D462 | SR: $($01D462+X) | |
01D41F | RTL | return |
- SR: $01D472 斜め移動(表)?(DQ6) 省略
例によって何をやっているか意味がよくわかりませんが、これを見よう見まねでDQ3に処理を移植していきます。ひと通り移植が終わったところで動かしてみます…があえなくフリーズ。大体はセットしているメモリが間違っているので1つ1つ直していきます。何をやってるか全くわからないので気持ち悪いことこの上ないです。と、ここで、ある程度「ここの処理は確実に合ってる」という部分を抜き出してDQ3のROM中をバイナリ検索してみます。結果同じ処理をしている場所が見つかりました。まさかと思いましたが、要はすでにROM中に存在していたということでした。
- SR: $073935 矢印パネル移動処理(DQ3)
073935 | JSL $C7556C | SR: $07556C | |
---|---|---|---|
073939 | LDA #$0000 | A=#$0000 | |
07393C | LDX $C129 | X=$C129 | |
07393F | LDY $C12B | Y=$C12B | |
073942 | JSL $C7365B | SR: $07365B | |
073946 | LDA $CFA5,Y | A=$CFA5+Y | |
073949 | AND #$0006 | A&=#$0006 | |
07394C | STA $CFA5,Y | $CFA5+Y=A | |
07394F | LDA $18 | A=DP($18) | |
073951 | SEC | c=on | |
073952 | SBC $7FE432,X | A-=($7FE432+X+c) | |
073956 | AND #$0001 | A&=#$0001 | |
073959 | STA $18 | DP($18)=A | |
07395B | LDA $1A | A=DP($1A) | |
07395D | SEC | c=on | |
07395E | SBC $7FE452,X | A-=($7FE452+X+c) | |
073962 | AND #$0001 | A&=#$0001 | |
073965 | STA $1A | DP($1A)=A | |
073967 | LDA $C15F | A=$C15F | |
07396A | STA $1C | DP($1C)=A | |
07396C | ASL | A<<1 | |
07396D | TAX | X=A | |
07396E | JSR $3982 | SR: $($073982+X) | |
073971 | PHA | Push A | |
073972 | LDY $7F2A | Y=$7F2A | |
073975 | LDA $D765,Y | A=$D765+Y | |
073978 | TAY | Y=A | |
073979 | PLA | Pull A | |
07397A | STA $D165,Y | $D165+Y=A | |
07397D | JSL $C75017 | SR: $075017 | |
073981 | RTL | return |
- SR: $07399D 斜め移動(裏)?(DQ3)
07399D | PHA | Push A | |
---|---|---|---|
07399E | LDY $7F2A | Y=$7F2A | |
0739A1 | LDA $D765,Y | A=$D765+Y | |
0739A4 | TAY | Y=A | |
0739A5 | PLA | Pull A | |
0739A6 | LDA $D165,Y | A=$D165+Y | |
0739A9 | ASL | A<<1 | |
0739AA | TAX | X=A | |
0739AB | JSR $39F1 | SR: $($0739F1+X) | |
0739AE | RTL | return |
- SR: $073A01 斜め移動(表)?(DQ3) 省略
というわけでありがたくオリジナルの処理を使わせてもらいます(こっちのほうが正しいに決まっているので)。
- SR: $0F3837 隠しダンジョン追加フロア(DQ4_1)移動・宝箱・ドア・NPC情報設定(新SR)
省略 | |||
---|---|---|---|
0F3861 | JSL $C738E2 | SR: $0738E2 引数:1#$01 引数:2#$00 引数:3#$CDB2D4 | サブマップイベント等設定? |
省略 |
- SR: $0F42D0 隠しダンジョン追加フロア(DQ6_3)移動・宝箱・ドア・NPC情報設定(新SR)
省略 | |||
---|---|---|---|
0F42F6 | JSL $CDB2ED | SR: $0DB2ED | 斜め移動設定(裏)用イベント設定 |
0F42FA | JSL $CDB2F7 | SR: $0DB2F7 | 斜め移動設定(表)用イベント設定 |
省略 |
SR: $0DB2D4, $0DB2ED, $0DB2F7は中で上記の特殊移動系のSRをコールしています。実際にテストしてみると案の定ばっちり動きました。斜め移動に関しては、下ボタンで階段を降りるとキャラクターが歩かずに滑って降りるという問題がありますが(なぜかDQ6では再現しません)、正直これ以上この辺には関わりたくないので眼をつぶることにします。周辺をざっと見ましたが、他に未使用の特殊移動系の処理はなさそうで、たまたま選択したフロアのおかげで楽をすることができた、という話でした。
コメント