DQ3 呪文・特技エフェクトの移植可能性の調査4(愚痴エントリ)

2日前に「火の息」「燃え盛る火炎」の移植が終わり、1日4つ移植すれば2日で作業が終わって後はバランス調整だけ!余裕で間に合う!とか取らぬ狸の皮算用をしていたのですが、まるで進まず、現状は「冷たい息」が約50%というところ(画面が青系の色でグラデーションする部分が実装できていません)。よくわからない部分を理解もせずにみようみまねで作業しているため、効率がいいわけないんですが。おそらく問題と思われるのは以下の部分。

  • SR: $04DAAE 冷たい息エフェクト?(DQ6)
04DAAE LDA #$8000 A=#$8000
04DAB1 PHA Push A
04DAB2 LDX #$0000 X=#$0000
04DAB5 LDY #$00E0 Y=#$00E0
04DAB8 JSL $C4F989 SR: $04F989
04DABC JSL $C02289 SR: $002289 ←多分こいつが問題
04DAC0 INC A++
04DAC1 CMP #$8050 A>=#$8050?
04DAC4 BCC #$EC if(c==off) goto $04DAB2
04DAC6 PLA Pull A
04DAC7 RTL return

具体的に何をやっているのかまでは不明ですが、おそらく、カラーパレットに#$8000~#$8050までを加算しながら描画、なのではないかと想像しています。(直後に#$8050~#$8000まで減算しながら同じことをやるSRを呼んでいるので)。

  • SR: $002289 ??(DQ6)
002289 PHP Push P Flag
00228A REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
00228C PHA Push A
00228D PHX Push X
00228E PHY Push Y
00228F PHB Push DB
002290 PHD Push D
002291 JMP $04906D goto $04906D
04906D LDA $001FB9
049071 TAX
049072 TSC
049073 STA $001FA9,X
049077 BRA #$B3
048FFC LDA #$FFFF
048FFF STA $001FB9
049003 LDA #$0000
049006 STA $001FB7
04900A SEI
04900B REP #$30
04900D LDA $001FB7
049011 TAX
049012 LDA $001F9F,X
049016 CMP #$FFFF
049019 BEQ #$11
04901B TXA
04901C STA $001FB9
049020 LDA $001FA9,X
049024 TCS
049025 PLD
049026 PLB
049027 PLY
049028 PLX
049029 PLA
04902A PLP
04902B RTL
04902C SEI
04902D REP #$30
04902F LDA $001FB7
049033 INC
049034 INC
049035 STA $001FB7
049039 CMP #$000A
04903C BCC #$CF
04903E LDA $001FB9
049042 CMP #$FFFF
049045 BEQ #$0C
049047 JSL $C02295
04904B LDA $7E579E
04904F BEQ #$AB
049051 BRA #$0D
049053 LDA $001FBF
049057 TCS
049058 PLY
049059 PLX
04905A PLA
04905B PLB
04905C PLD
04905D PLP
04905E SEC
04905F RTL
049060 LDA $001FBF
049064 TCS
049065 PLY
049066 PLX
049067 PLA
049068 PLB
049069 PLD
04906A PLP
04906B CLC
04906C RTL

JMPでとんだり、行ったり戻ったりして大変見づらいSRです。初めはSR: $002B9C(DQ3)を呼んでいたのですが、画面下半分が青くグラデーションする効果が得られないのでSR: $002289(DQ6)の中をのぞいてみたところ、SR: $002295(DQ6)に相当するSR(多分SR: $002892)をDQ3では呼んでいないのが問題なのでは、と仮説を立てました。というわけで、SR: $002289(DQ6)と同じようなSRをDQ3側で作ってみたのですが、作り方がまずいのか状況は変わらないままです(書いてる途中でぐちゃぐちゃになってきたのでもうちょっと整理したら公開します)。

(11/25追記)
冷たい息は実装は終わったので、凍りつく息・凍える吹雪とまとめて投下しようとしたのですが、凍りつく息がまだ完了する気配がないのでここに追記します。結局DQ6からSRを移植するのはあきらめ、DQ3内部で似ている処理を見つけてパクる事にしました。

  • (参考)SR: $049691 メラミ・メラゾーマ時の画面赤化処理?
049691 LDA $7FD8 A=$7FD8
049694 JSL $C4C5C3 SR: $04C5C3
049698 LDA #$2000 A=#$2000
04969B PHA Push A
04969C LDX #$0000 X=#$0000
04969F LDY #$0092 Y=#$0092
0496A2 JSL $C4D001 SR: $04D001
0496A6 LDX #$0050 X=#$0050
0496A9 JSL $C4D05F SR: $04D05F
0496AD JSL $C02B9C SR: $002B9C
0496B1 CLC c=off
0496B2 ADC #$0002 A+=(#$0002+c)
0496B5 CMP #$2030 A>=#$2030?
0496B8 BCC #$E2 if(c==off) goto $04969C

上のSR: $04DAAE 冷たい息エフェクト?(DQ6)と非常に似ています。こっちは2ずつインクリメントしていますが。ちなみにこのすぐ下では逆に#$2030から#$2000まで2ずつデクリメントしている箇所があるので画面を赤化→元に戻す処理をしているっぽいです。細部は不明ですが、この部分が使えそうです。

  • SR: $04FA79 冷たい息エフェクトの一部(DQ3)(新SR)
04FA78 LDA $7FD8 A=$7FD8
04FA7B JSL $C4C5C3 SR: $04C5C3
04FA7F LDA #$8000 A=#$8000
04FA82 PHA Push A
04FA83 LDX #$0000 X=#$0000
04FA86 LDY #$0092 Y=#$0092
04FA89 JSL $C4D001 SR: $04D001
04FA8D LDX #$0050 X=#$0050
04FA90 JSL $C4D05F SR: $04D05F
04FA94 JSL $C02B9C SR: $002B9C
04FA98 INC A++
04FA99 CMP #$8050 A>=#$8050?
04FA9C BCC #$E5 if(c==off) goto $04FA83
04FA9E PLA Pull A
04FA9F RTL return

それっぽく仕上がっていますが、実は青のグラデーションの部分がオリジナルと比べるとちょっと違う気がします(模造品に注意!)。あまり時間の余裕もないのでとりあえず冷たい息のエフェクトはこれで完成とします。ついでですが、現在作業中の凍りつく息ですが、SR: $004604の引数で指定される可変長と思われるデータのデコードの仕方がさっぱりわかりません。

  • SR: $04A900 パルプンテエフェクト処理(DQ3)
04A90C JSL $C04604 SR: $004604 引数:1#$F65FCC 引数:2#$01
  • 可変長データ? $365FCC(DQ3)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
365FC0 ・・ ・・ ・・ ・・ ・・ ・・ ・・ 02 11 0B 12 0B C7 5F F6 01
365FD0 01 80 00 02 80 01 02 80 02 02 80 03 02 80 04 02
365FE0 80 05 02 80 06 02 80 07 02 80 08 02 80 09 02 80
365FF0 0A 02 80 0B 02 80 0C 02 80 0D 02 80 0E 02 80 0F
366000 02 80 10 02 80 11 02 80 12 02 80 13 02 80 14 02
366010 80 15 02 80 16 02 80 17 02 80 18 02 80 19 02 80
366020 1A 02 80 1B 02 80 1C 02 80 1D 02 FF ・・ ・・ ・・ ・・

どうも、$365FCC-Eで指定されているアドレス(3バイト、この場合は$365FC7)からは先頭1バイトがレコード数、以降2バイトずつパレットIDを指定しているように見受けられます。しかし、$365FCF以降のデータがFFがターミネータを意味するらしいという以外はさっぱりわかりません。DQ6の凍りつく息のエフェクトでも同様に可変長のデータ($3F004F)を読み込んでなにやらやっているようです。試しにパレットIDを変えてDQ3に移植してみましたが、それっぽいエフェクトは表示されるものの、一切アニメーションがされません。調査を継続しますが、アドバイスなどもウェルカムです。

コメント

  1. p より:

    そういう時は適当になんかやれば(ry
    パルプンテのデータ軽く(?)みてみた
    $365FCF-365FD0の2バイトは間隔?よく調べてない
    それ以降は「対象パレット?(兼終了コード)」「パレットID」「効果時間」かもね
    $365FD1-365FD3(80 00 02)で$02を$50位にすると$00を変えた時に良くわかるね。
    んで$80は弄ったときに実験に協力していたグールの色が一部変化してた。ただ、$FFで終了+$81でも一応(ほぼ緑系)画面効果でることからなんかしらありそうだね。

    管理者より返信:

    毎度のコメントありがとうございます。まさに適当にやってる最中ですwww。ご指摘の通り、365FCF-D0の2バイトは不明ですが、それ以降は3バイトで1セットのようで、$00 ビットマスク?(or表示するレイヤーとか?)$01 5FC7-CBのパレットを順に並べた時の通しID?$02 表示時間(フレーム数?)っぽいです。