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

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

  • SR: $04FD45 凍りつく息エフェクト処理(新SR)(DQ3)
04FD45JSR $B7A7SR: $04B7A7
04FD48JSR $844FSR: $04844F
04FD4BLDA #$03BFA=#$03BFパレットアクセスID
04FD4ESTA $4F74$4F74=A
04FD51LDX #$0000X=#$0000
04FD54TXYY=X
04FD55LDA #$001AA=#$001A凍りつく息エフェクトID(追加)
04FD58JSR $B65BSR: $04B65B呪文使用時エフェクト描画用データセット
04FD5BPHXPush X
04FD5CJSL $C1E32ESR: $01E32E 引数:1#$00D8再生BGM設定?
04FD62JSL $C02ABASR: $002ABA 引数:1#$C4B212
04FD69LDA $4880,XA=$4880+X
04FD6CJSL $C04604SR: $004604 引数:1#$F66045 引数:2#$01パレットアニメーション開始?
04FD74JSR $AFACSR: $04AFACエフェクト実行?
04FD77JSL $C04835SR: $004835 引数:1#$F66045パレットアニメーション終了?
04FD7EBCC #$F4if(c==off) goto $04FD74
04FD80LDX #$0000X=#$0000
04FD83LDY #$0200Y=#$0200
04FD86JSL $C02ABASR: $002ABA 引数:1#$C4FD9B
04FD8DJSR $AFA7SR: $04AFA7エフェクト実行?
04FD90JSR $8548SR: $048548
04FD93PLXPull X
04FD94JSR $B6DASR: $04B6DA
04FD97JSR $B7A7SR: $04B7A7
04FD9ARTSreturn
  • SR: $04FD9B 凍りつく息用エフェクト?(新SR)(DQ3)
04FD9BJSL $C03ADDSR: $003ADD
04FD9FBRA #$12goto $04FDB3
04FDA1TAXX=A
04FDA2LDA $FBC9A=$FBC9
04FDA5CMP #$0041A==#$0041?
04FDA8BNE #$01if(z==off) goto $04FDAB
04FDAARTLreturn
04FDABJSL $C0359ESR: $00359E
04FDAFJSL $C036EDSR: $0036ED
04FDB3STZ $4F78$4F78=#$00
04FDB6PHAPush A
04FDB7PEA #$0000Push #$0000
04FDBAJSR $B392SR: $04B392
04FDBDJSL $C02B9CSR: $002B9C
04FDC1BCS #$20if(c==on) goto $04FDE3
04FDC3TYAA=Y
04FDC4CLCc=off
04FDC5ADC $01,SA+=(Stack($01)+c)
04FDC7TAXX=A
04FDC8CMP #$0100A>=#$0100?
04FDCBBCC #$0Eif(c==off) goto $04FDDB
04FDCDLDA $03,SA=Stack($03)
04FDCFJSR $B392SR: $04B392
04FDD2BCS #$0Fif(c==on) goto $04FDE3
04FDD4TXAA=X
04FDD5SECc=on
04FDD6SBC #$0100A-=(#$0100 +c)
04FDD9BRA #$ECgoto $04FDC7
04FDDBSTA $01,SStack($01)=A
04FDDDJSL $C02B9CSR: $002B9C
04FDE1BRA #$E0goto $04FDC3
04FDE3PLAPull A
04FDE4PLAPull A
04FDE5RTLreturn

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になってますね。すずめ愛好会のドキュメントと付き合わせると少しずつ見えてくる気がします。

タイトルとURLをコピーしました