DQ3 ダンジョン中のギミックの移植

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では再現しません)、正直これ以上この辺には関わりたくないので眼をつぶることにします。周辺をざっと見ましたが、他に未使用の特殊移動系の処理はなさそうで、たまたま選択したフロアのおかげで楽をすることができた、という話でした。