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 ギラ系エフェクト
049826STZ $4F7C$4F7C=#$00
049829JSR $B067SR: $04B067各キャラクター個別エフェクト順番決定?
04982CJSR $B75FSR: $04B75F
04982FJSR $8508SR: $048508
049832JSL $C1E32ESR: $01E32E 引数:1#$00DB再生BGM設定?
049838LDA #$0361A=#$0361炎の色のパレットアクセスID?
04983BSTA $4F74$4F74=A
04983ELDX #$0000X=#$0000
049841LDY #$0008Y=#$0008
049844LDA $4F7CA=$4F7C
049847BEQ #$03if(z==on) goto $04984C
049849LDY #$FFF0Y=#$FFF0
04984CLDA #$0013A=#$0013ギラ用炎のアニメーションID?
04984FJSR $B65BSR: $04B65Bパレットアクセスデータアクセス?
049852JSL $C02ABASR: $002ABA 引数:1#$C4B21F
049859PHXPush X
04985ALDA $4F7CA=$4F7C
04985DBEQ #$05if(z==on) goto $049864
04985FJSR $AED2SR: $04AED2
049862BRA #$47goto $0498AB
049864JSR $AFA7SR: $04AFA7エフェクト実行?
049867LDX #$0000X=#$0000
04986ALDA $4F12,XA=$4F12+X
04986DCMP #$FFFFA==#$FFFF?
049870BEQ #$39if(z==on) goto $0498AB
049872PHXPush X
049873TAXX=A
049874LDY #$0004Y=#$0004
049877JSL $C02ABASR: $002ABA 引数:1#$C498B9
04987EJSL $C1E32ESR: $01E32E 引数:1#$00DF再生BGM設定?
049884LDA #$0000A=#$0000
049887STA $4F6E$4F6E=A
04988ALDA #$0362A=#$0362爆発スプライト用パレットアクセス指定?
04988DSTA $4245$4245=A
049890LDA #$006EA=#$006E爆発スプライトID指定?
049893LDY #$0000Y=#$0000
049896JSL $C02ABASR: $002ABA 引数:1#$C4B13B
04989DLDA #$0002A=#$0002
0498A0LDX #$0008X=#$0008
0498A3JSR $AFB9SR: $04AFB9
0498A6PLXPull X
0498A7INXX++
0498A8INXX++
0498A9BRA #$BFgoto $04986A
0498ABJSR $AFA7SR: $04AFA7エフェクト実行?
0498AEJSR $8548SR: $048548
0498B1PLXPull X
0498B2JSR $B6DASR: $04B6DA
0498B5JSR $B783SR: $04B783
0498B8RTSreturn

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

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

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

  • SR: $04F980 凍てつく波動エフェクト処理(新SR)
04F980JSL $C1E32ESR: $01E32E 引数:1#$00EFBGM設定?
04F986JSL $C02ABASR: $002ABA 引数:1#$C489F9凍てつく波動のエフェクト設定?
04F98DJSR $AFA7SR: $04AFA7エフェクト実行?
04F990RTSreturn
  • SR: $02CF31 攻撃時エフェクト実行
02CF31JSR $E3C5SR: $02E3C5エフェクトを実行するべきか判断(スキップc=on)
02CF34BCS #$04if(c==on) goto $02CF3A

  • SR: $02E3C5 エフェクトを実行するべきか判断(スキップc=on)(新SR)
02E3C5LDA $23EEA=$23EE
02E3C8CMP #$0067A==#$0067?戦闘行動がいてつくはどうか
02E3CBBEQ #$0Cif(z==on) goto $02E3D9
02E3CDCMP #$0120A==#$0120?戦闘行動があんこくのはどうか
02E3D0BEQ #$07if(z==on) goto $02E3D9
02E3D2LDA $4F4EA=$4F4E
02E3D5BEQ #$15if(z==on) goto $02E3EC
02E3D7BRA #$15goto $02E3EE
02E3D9LDX $23E4X=$23E4
02E3DCSTX $2428$2428=X
02E3DFJSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02E3E7CMP #$0005A>=#$0005?行動主体がPC側か?
02E3EABCS #$02if(c==on) goto $02E3EE
02E3ECSECc=onスキップする
02E3EDRTSreturn
02E3EECLCc=offスキップしない
02E3EFRTSreturn

本来は$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」のアドレスは「意味なし」(実体は空)しか設定されてないので分離不能なのでないかと推測しただけです。あ、でもよく考えたらしんりゅうもいてつく波動使いますね。もうちょっと調べてみます。

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。