ここ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に配列になっています。色アニメーションデータは若干変わったつくりになっていて、
- 色アニメーションデータ(可変長)
- 使用するパレットデータレコード数(1Byte)
- 使用するパレットID(2Byte×1.のレコード数)*1
- 1の開始アドレス(3Byte)
- 色アニメーション指定1レコードで使用する色の数(1Byte)
- 色アニメーション指定(3Byte×n)
- 0バイト目 色の処理方法?(色加算or減算?)
- 1バイト目 表示時間(フレーム数) #$FFでターミネータを意味する
- 2バイト目 2のパレットを順番に並べたときのインデックス
のようで、SR: $004835には3.のアドレスを指定します。他の色アニメーションデータと使用するパレットを共有することも可能です。前回のエントリに追記した時点でこのデータは丸ごと移植は行っていたのですが、「0バイト目 表示レイヤー?orマスク用フラグ?」を変えないといけなかったようです。DQ6では全てのレコードについて#$11が設定されていますが、#$01にしたところ、それっぽい結果を得ることができました。何でうまくいったのかについては今は時間の余裕がないので触れません(って後々になってもやらないかも)。凍える吹雪は冷たい息+凍りつく息の合成なので説明は省きます(実装時間は30分程度でした)。これで呪文エフェクトに使用されている
- BG1,2の連続アニメーション
- スプライトの表示
- 色アニメーション
は大体勝手がわかってきたので残りの作業のうち、「甘い息」「毒の息」「焼け付く息」は既に明らかになった手法で手間をかけずに移植できそうです(もし未知の手法が使われているようならエントリを投下します)。
というわけで完成画像(今回からデバッグ用モンスターを使うことにしました)。しかしふと思ったのですが、これだけ手間をかけて移植してもプレイする側からしたら「DQ3と6は同じエンジンなんだから簡単なんでしょ」としか思われないかも。
凍りつく息
凍える吹雪
*1:パレットアクセスIDではない
コメント
$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つのエフェクトを速攻で実装する所存です。
そういや書き忘れ
「#$11が設定されていますが、#$01にしたところ」
前の米で推測つくと思いますがDQ3とDQ6で使用パレットが違うせいですね
あと気になることで「色アニメーションデータ」の4と5
このどちらかでパルプンテでは$00or$01且つ凍りつくで$0For$10なってたりしませんかね?
パルプンテは$2132への1色だけど、凍りつくは色番号$11~$1Fを書き換えてるはずなのでどこかで色書換のループ回数指定があるはず
追伸
前にスプライトのグラ欠けの時に「256個以上~」と言ってましたが4Byte1セットで$200分あるので$80の128個ですね失敬
確かにパルプンテは$01 $01で、凍りつく息は$0F $01になってますね。すずめ愛好会のドキュメントと付き合わせると少しずつ見えてくる気がします。