DQ3 呪文・特技エフェクトの移植可能性の調査5

ここ2日ほど進展がなかった凍りつく息、凍える吹雪ですが、ようやく移植できました。やはりDQ6とDQ3では完全互換とは行かず、若干データをいじらないといけないようです。

  • SR: $04FD45 凍りつく息エフェクト処理(新SR)(DQ3)
04FD45 JSR $B7A7 SR: $04B7A7
04FD48 JSR $844F SR: $04844F
04FD4B LDA #$03BF A=#$03BF パレットアクセスID
04FD4E STA $4F74 $4F74=A
04FD51 LDX #$0000 X=#$0000
04FD54 TXY Y=X
04FD55 LDA #$001A A=#$001A 凍りつく息エフェクトID(追加)
04FD58 JSR $B65B SR: $04B65B 呪文使用時エフェクト描画用データセット
04FD5B PHX Push X
04FD5C JSL $C1E32E SR: $01E32E 引数:1#$00D8 再生BGM設定?
04FD62 JSL $C02ABA SR: $002ABA 引数:1#$C4B212
04FD69 LDA $4880,X A=$4880+X
04FD6C JSL $C04604 SR: $004604 引数:1#$F66045 引数:2#$01 パレットアニメーション開始?
04FD74 JSR $AFAC SR: $04AFAC エフェクト実行?
04FD77 JSL $C04835 SR: $004835 引数:1#$F66045 パレットアニメーション終了?
04FD7E BCC #$F4 if(c==off) goto $04FD74
04FD80 LDX #$0000 X=#$0000
04FD83 LDY #$0200 Y=#$0200
04FD86 JSL $C02ABA SR: $002ABA 引数:1#$C4FD9B
04FD8D JSR $AFA7 SR: $04AFA7 エフェクト実行?
04FD90 JSR $8548 SR: $048548
04FD93 PLX Pull X
04FD94 JSR $B6DA SR: $04B6DA
04FD97 JSR $B7A7 SR: $04B7A7
04FD9A RTS return
  • SR: $04FD9B 凍りつく息用エフェクト?(新SR)(DQ3)
04FD9B JSL $C03ADD SR: $003ADD
04FD9F BRA #$12 goto $04FDB3
04FDA1 TAX X=A
04FDA2 LDA $FBC9 A=$FBC9
04FDA5 CMP #$0041 A==#$0041?
04FDA8 BNE #$01 if(z==off) goto $04FDAB
04FDAA RTL return
04FDAB JSL $C0359E SR: $00359E
04FDAF JSL $C036ED SR: $0036ED
04FDB3 STZ $4F78 $4F78=#$00
04FDB6 PHA Push A
04FDB7 PEA #$0000 Push #$0000
04FDBA JSR $B392 SR: $04B392
04FDBD JSL $C02B9C SR: $002B9C
04FDC1 BCS #$20 if(c==on) goto $04FDE3
04FDC3 TYA A=Y
04FDC4 CLC c=off
04FDC5 ADC $01,S A+=(Stack($01)+c)
04FDC7 TAX X=A
04FDC8 CMP #$0100 A>=#$0100?
04FDCB BCC #$0E if(c==off) goto $04FDDB
04FDCD LDA $03,S A=Stack($03)
04FDCF JSR $B392 SR: $04B392
04FDD2 BCS #$0F if(c==on) goto $04FDE3
04FDD4 TXA A=X
04FDD5 SEC c=on
04FDD6 SBC #$0100 A-=(#$0100 +c)
04FDD9 BRA #$EC goto $04FDC7
04FDDB STA $01,S Stack($01)=A
04FDDD JSL $C02B9C SR: $002B9C
04FDE1 BRA #$E0 goto $04FDC3
04FDE3 PLA Pull A
04FDE4 PLA Pull A
04FDE5 RTL return

SR: $04FD9B 凍りつく息用エフェクト?については全く同じSRがDQ3になかったので似たようなSR: $04B314を多少変えました。ちなみに、具体的に何をやっているかについては全く不明です(いいのかね…)。さて、凍りつく息のエフェクトは画面を覆う吹雪状のエフェクトのなのですが、実際はBG1,2の1枚絵しか使っておらず、その配色を細かく変えることでアニメーションしているように見せているようです。色のアニメーションデータはSR: $004835の引数3バイトで指定しています。他にも光の玉使用時のエフェクトや、ダーマ(昼)の霧のエフェクトなどもこのデータを使っているようです。実際に使われているのかどうかは不明ですが、色アニメーションデータの起点アドレス?は$080000に配列になっています。色アニメーションデータは若干変わったつくりになっていて、

  • 色アニメーションデータ(可変長)
  1. 使用するパレットデータレコード数(1Byte)
  2. 使用するパレットID(2Byte×1.のレコード数)*1
  3. 1の開始アドレス(3Byte)
  4. 色アニメーション指定1レコードで使用する色の数(1Byte)
  5. 色アニメーション指定(3Byte×n)
    • 0バイト目 色の処理方法?(色加算or減算?)
    • 1バイト目 表示時間(フレーム数) #$FFでターミネータを意味する
    • 2バイト目 2のパレットを順番に並べたときのインデックス

のようで、SR: $004835には3.のアドレスを指定します。他の色アニメーションデータと使用するパレットを共有することも可能です。前回のエントリに追記した時点でこのデータは丸ごと移植は行っていたのですが、「0バイト目 表示レイヤー?orマスク用フラグ?」を変えないといけなかったようです。DQ6では全てのレコードについて#$11が設定されていますが、#$01にしたところ、それっぽい結果を得ることができました。何でうまくいったのかについては今は時間の余裕がないので触れません(って後々になってもやらないかも)。凍える吹雪は冷たい息+凍りつく息の合成なので説明は省きます(実装時間は30分程度でした)。これで呪文エフェクトに使用されている

  • BG1,2の連続アニメーション
  • スプライトの表示
  • 色アニメーション

は大体勝手がわかってきたので残りの作業のうち、「甘い息」「毒の息」「焼け付く息」は既に明らかになった手法で手間をかけずに移植できそうです(もし未知の手法が使われているようならエントリを投下します)。

というわけで完成画像(今回からデバッグ用モンスターを使うことにしました)。しかしふと思ったのですが、これだけ手間をかけて移植してもプレイする側からしたら「DQ3と6は同じエンジンなんだから簡単なんでしょ」としか思われないかも。

凍りつく息

凍える吹雪

*1:パレットアクセスIDではない

コメント

  1. p より:

    $7E7FD2 1Byte:PPU $2131のカラー演算式、影響スクリーン
    $7E7FD4 2Byte:PPU $2132に使う色設定
    $7E7FFE 200Byte:CG_RAMに転送するパレットデータ
    $7E81FE ?Byte:↑のデータを書き換えるための一時的な場所

    「$00 示レイヤー?orマスク用フラグ?)」を少し真面目に調べてみた
    やっぱりこの数値が$80か$81かそれ以外かで動作変わっているみたい
    $80:$7FD2のBit7クリア(加算)
    $81:$7FD2のBit7セット(減算)
    どちらもその後は同じ処理で$7FFE,x($81FE,ID)の値を$7FD4に上書きしてる

    それ以外の数値:$7FFE,y($81FE,ID)の値を$7FFE,xに上書きしてる(数値=書き換える色番号)
    これを$43とかすると背景の色が変更もされたね

    ※この文章はDQ3をメインに解析しているわけではない人の妄想の可能性があります

    管理者より返信:

    役に立つ妄想サンクスですwww。

    $00は処理の意味を定義してるとかなんですかね(それならDQ3とDQ6で意味が違うっていう可能性はありますね)。とりあえず今はこのよくわからないRAMをいじる地獄から抜け出したいので残り6つのエフェクトを速攻で実装する所存です。

  2. p より:

    そういや書き忘れ
    「#$11が設定されていますが、#$01にしたところ」
    前の米で推測つくと思いますがDQ3とDQ6で使用パレットが違うせいですね
    あと気になることで「色アニメーションデータ」の4と5
    このどちらかでパルプンテでは$00or$01且つ凍りつくで$0For$10なってたりしませんかね?
    パルプンテは$2132への1色だけど、凍りつくは色番号$11~$1Fを書き換えてるはずなのでどこかで色書換のループ回数指定があるはず

    追伸
    前にスプライトのグラ欠けの時に「256個以上~」と言ってましたが4Byte1セットで$200分あるので$80の128個ですね失敬

    管理者より返信:

    確かにパルプンテは$01 $01で、凍りつく息は$0F $01になってますね。すずめ愛好会のドキュメントと付き合わせると少しずつ見えてくる気がします。