DQ3改造も残す大仕事はバランス調整(とデバッグ)くらいになってきたんですが、やはりまねまねで反撃したとき+αの呪文・特技エフェクトが何もないのが気になったので、DQ6からDQ3への移植可能性について調査することにします。まだ調査中なのでいつもに増してグダグダになる可能性が高いことを予め断っておきます。
とりあえず移植対象は
ひのいき(済み)はげしいほのお(済み)つめたいいき(済み)こおりのいき(済み)こごえるふぶき(済み)あまいいき(済み)どくのいき(済み)やけつくいき(済み)しんくうは(済み)いてつくはどう*1(済み)あんこくのはどう(済み)ジゴスパーク(済み)ビッグバン(済み)
です。モンスターのアニメーションデータと違って、呪文・特技のエフェクトはこれといってデータ化されておらず、プログラムの操作による部分がほとんどのようです。さらに、当たり前の話ですが、メモリの使用場所も違うので、SRを丸のまま移植というわけにもいきません。従って、「DQ6と3で同等の機能を果たしていると思われるSRを特定し(足りなければ移植し)、画像データを移植しつつ移植先でエフェクトを再構成する」という作業が必要なのではと推測しています。DQ6→DQ3の場合はDQ3の方が後発なのでおそらくDQ3ではDQ6のエンジンと同じもしくはリファインしたバージョンが使われているという仮説のもと作業を行います。当然この仮説が成り立たない場合はそう簡単にはいかない(最悪不可能)と思われます。手始めに勝手知ったるDQ3側から解析を始めます。
まずエフェクトをいくつかのパーツに分けて考えます。
- 背景色を変える
- スプライト(オブジェクト?)を表示する
- 炎、ジゴスパークの外周?部分など不定形?or描画が数学的計算に基づいているように見えるもの
- 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にもともとあるものはゾーマのアクションと融合しているようで単体で使いたい
コメント
DQ6で確認してみたり
レイヤー1・スプライト・HDMAあたりでやってるね
例 ジゴスパーク
真ん中の丸い球体=スプライト
周囲の稲妻=レイヤー1
光の柱や画面点滅や広がっていく輪っか=HDMA
激しい炎はHDMAとBG・凍える吹雪はBGとスプライトっぽ
やっぱゾーマのいてつく波動は完全にくっついてるんですかね?
毎度のヘルプありがとうございます。
上っ面の知識しかないのでH/W側からのアプローチでアドバイスをもらえるのは大変助かります。romhaking.net のドキュメントやPukiWikiのHDMA入門あたりも漁ると同時に、みようみまねで移植もトライしてみようかなと。
ゾーマのいてつく波動はあんまりまじめに見てないんですが、デバッグメニューの「モンスターを見る」でゾーマの「アニメーションパターン3」を見るといてつく波動のアクション付きで再生されます。また、「戦闘行動」のいてつく波動の「表示エフェクト1」のアドレスは「意味なし」(実体は空)しか設定されてないので分離不能なのでないかと推測しただけです。あ、でもよく考えたらしんりゅうもいてつく波動使いますね。もうちょっと調べてみます。