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

DQ3改造も残す大仕事はバランス調整(とデバッグ)くらいになってきたんですが、やはりまねまねで反撃したとき+αの呪文・特技エフェクトが何もないのが気になったので、DQ6からDQ3への移植可能性について調査することにします。まだ調査中なのでいつもに増してグダグダになる可能性が高いことを予め断っておきます。

とりあえず移植対象は

  • ひのいき(済み)
  • はげしいほのお(済み)
  • つめたいいき(済み)
  • こおりのいき(済み)
  • こごえるふぶき(済み)
  • あまいいき(済み)
  • どくのいき(済み)
  • やけつくいき(済み)
  • しんくうは(済み)
  • いてつくはどう*1(済み)
  • あんこくのはどう(済み)
  • ジゴスパーク(済み)
  • ビッグバン(済み)

です。モンスターのアニメーションデータと違って、呪文・特技のエフェクトはこれといってデータ化されておらず、プログラムの操作による部分がほとんどのようです。さらに、当たり前の話ですが、メモリの使用場所も違うので、SRを丸のまま移植というわけにもいきません。従って、「DQ6と3で同等の機能を果たしていると思われるSRを特定し(足りなければ移植し)、画像データを移植しつつ移植先でエフェクトを再構成する」という作業が必要なのではと推測しています。DQ6→DQ3の場合はDQ3の方が後発なのでおそらくDQ3ではDQ6のエンジンと同じもしくはリファインしたバージョンが使われているという仮説のもと作業を行います。当然この仮説が成り立たない場合はそう簡単にはいかない(最悪不可能)と思われます。手始めに勝手知ったるDQ3側から解析を始めます。

まずエフェクトをいくつかのパーツに分けて考えます。

  1. 背景色を変える
  2. スプライト(オブジェクト?)を表示する
  3. 炎、ジゴスパークの外周?部分など不定形?or描画が数学的計算に基づいているように見えるもの
  4. SEを鳴らす

2と3を分けているのは、2に関してはそれらしいスプライトor画像指定らしき部分が見当たるのですが、3に関してはまるで見当たらないためです。探し方が悪いのかもしれませんが。

まずは比較的シンプル(と思われる)ギラ系エフェクトを見てみます。

  • SR: $049826 ギラ系エフェクト
049826 STZ $4F7C $4F7C=#$00
049829 JSR $B067 SR: $04B067 各キャラクター個別エフェクト順番決定?
04982C JSR $B75F SR: $04B75F
04982F JSR $8508 SR: $048508
049832 JSL $C1E32E SR: $01E32E 引数:1#$00DB 再生BGM設定?
049838 LDA #$0361 A=#$0361 炎の色のパレットアクセスID?
04983B STA $4F74 $4F74=A
04983E LDX #$0000 X=#$0000
049841 LDY #$0008 Y=#$0008
049844 LDA $4F7C A=$4F7C
049847 BEQ #$03 if(z==on) goto $04984C
049849 LDY #$FFF0 Y=#$FFF0
04984C LDA #$0013 A=#$0013 ギラ用炎のアニメーションID?
04984F JSR $B65B SR: $04B65B パレットアクセスデータアクセス?
049852 JSL $C02ABA SR: $002ABA 引数:1#$C4B21F
049859 PHX Push X
04985A LDA $4F7C A=$4F7C
04985D BEQ #$05 if(z==on) goto $049864
04985F JSR $AED2 SR: $04AED2
049862 BRA #$47 goto $0498AB
049864 JSR $AFA7 SR: $04AFA7 エフェクト実行?
049867 LDX #$0000 X=#$0000
04986A LDA $4F12,X A=$4F12+X
04986D CMP #$FFFF A==#$FFFF?
049870 BEQ #$39 if(z==on) goto $0498AB
049872 PHX Push X
049873 TAX X=A
049874 LDY #$0004 Y=#$0004
049877 JSL $C02ABA SR: $002ABA 引数:1#$C498B9
04987E JSL $C1E32E SR: $01E32E 引数:1#$00DF 再生BGM設定?
049884 LDA #$0000 A=#$0000
049887 STA $4F6E $4F6E=A
04988A LDA #$0362 A=#$0362 爆発スプライト用パレットアクセス指定?
04988D STA $4245 $4245=A
049890 LDA #$006E A=#$006E 爆発スプライトID指定?
049893 LDY #$0000 Y=#$0000
049896 JSL $C02ABA SR: $002ABA 引数:1#$C4B13B
04989D LDA #$0002 A=#$0002
0498A0 LDX #$0008 X=#$0008
0498A3 JSR $AFB9 SR: $04AFB9
0498A6 PLX Pull X
0498A7 INX X++
0498A8 INX X++
0498A9 BRA #$BF goto $04986A
0498AB JSR $AFA7 SR: $04AFA7 エフェクト実行?
0498AE JSR $8548 SR: $048548
0498B1 PLX Pull X
0498B2 JSR $B6DA SR: $04B6DA
0498B5 JSR $B783 SR: $04B783
0498B8 RTS return

バンク$00のSRはどうやら実際の描画に関係するかなりハードウェアよりのSRらしく、$001???とか、$002???とか普段お見かけしないメモリに何かをセットするコードがちらほら見られます。また、この中でコールしているバンク$04のSRも内部ではやはりバンク$00のSRを呼び出していたりとまだわからないことだらけです。ただ、DQ6の「ひのいき」のSRを見ているとメモリマップは異なるものの、似たような組成のSRを呼び出しているようなので「頑張れば移植可能」なのでは、というのが現状の見通しです。

(23:00追記)
いてつくはどうはモンスターアニメーションデータと融合しているのではなく、モンスターアニメーション実行(SR: $48774)で、スプライトIDおよび行動IDをみて追加で処理をしているようでした。

(11/17追記)
やっぱりエフェクト中での判断はまずいと思うので、修正します。

  • SR: $04F980 凍てつく波動エフェクト処理(新SR)
04F980 JSL $C1E32E SR: $01E32E 引数:1#$00EF BGM設定?
04F986 JSL $C02ABA SR: $002ABA 引数:1#$C489F9 凍てつく波動のエフェクト設定?
04F98D JSR $AFA7 SR: $04AFA7 エフェクト実行?
04F990 RTS return
  • SR: $02CF31 攻撃時エフェクト実行
02CF31 JSR $E3C5 SR: $02E3C5 エフェクトを実行するべきか判断(スキップc=on)
02CF34 BCS #$04 if(c==on) goto $02CF3A
  • SR: $02E3C5 エフェクトを実行するべきか判断(スキップc=on)(新SR)
02E3C5 LDA $23EE A=$23EE
02E3C8 CMP #$0067 A==#$0067? 戦闘行動がいてつくはどうか
02E3CB BEQ #$0C if(z==on) goto $02E3D9
02E3CD CMP #$0120 A==#$0120? 戦闘行動があんこくのはどうか
02E3D0 BEQ #$07 if(z==on) goto $02E3D9
02E3D2 LDA $4F4E A=$4F4E
02E3D5 BEQ #$15 if(z==on) goto $02E3EC
02E3D7 BRA #$15 goto $02E3EE
02E3D9 LDX $23E4 X=$23E4
02E3DC STX $2428 $2428=X
02E3DF JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02E3E7 CMP #$0005 A>=#$0005? 行動主体がPC側か?
02E3EA BCS #$02 if(c==on) goto $02E3EE
02E3EC SEC c=on スキップする
02E3ED RTS return
02E3EE CLC c=off スキップしない
02E3EF RTS return

本来は$04のバンクで$02バンクのSRを使って判断するべきではないのですが、モンスターのアニメーション自体に凍てつく波動のエフェクト処理が含まれてしまうため、行動主体を無視するとモンスターが凍てつく波動を実行したときにエフェクトが2回表示されてしまうという問題を回避するため、行動主体を判断するようにしました。デバッグモードはともかく、通常の戦闘中では$7E23E4などはエフェクト中には有効であると思われるのでまあよしとします。

*1:DQ3にもともとあるものはゾーマのアクションと融合しているようで単体で使いたい

コメント

  1. p より:

    DQ6で確認してみたり

    レイヤー1・スプライト・HDMAあたりでやってるね
    例 ジゴスパーク
    真ん中の丸い球体=スプライト
    周囲の稲妻=レイヤー1
    光の柱や画面点滅や広がっていく輪っか=HDMA

    激しい炎はHDMAとBG・凍える吹雪はBGとスプライトっぽ

    やっぱゾーマのいてつく波動は完全にくっついてるんですかね?

    管理者より返信:

    毎度のヘルプありがとうございます。

    上っ面の知識しかないのでH/W側からのアプローチでアドバイスをもらえるのは大変助かります。romhaking.net のドキュメントやPukiWikiのHDMA入門あたりも漁ると同時に、みようみまねで移植もトライしてみようかなと。

    ゾーマのいてつく波動はあんまりまじめに見てないんですが、デバッグメニューの「モンスターを見る」でゾーマの「アニメーションパターン3」を見るといてつく波動のアクション付きで再生されます。また、「戦闘行動」のいてつく波動の「表示エフェクト1」のアドレスは「意味なし」(実体は空)しか設定されてないので分離不能なのでないかと推測しただけです。あ、でもよく考えたらしんりゅうもいてつく波動使いますね。もうちょっと調べてみます。