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

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

  • SR: $04DAAE 冷たい息エフェクト?(DQ6)
04DAAELDA #$8000A=#$8000
04DAB1PHAPush A
04DAB2LDX #$0000X=#$0000
04DAB5LDY #$00E0Y=#$00E0
04DAB8JSL $C4F989SR: $04F989
04DABCJSL $C02289SR: $002289←多分こいつが問題
04DAC0INCA++
04DAC1CMP #$8050A>=#$8050?
04DAC4BCC #$ECif(c==off) goto $04DAB2
04DAC6PLAPull A
04DAC7RTLreturn

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

  • SR: $002289 ??(DQ6)
002289PHPPush P Flag
00228AREP #$30m=off(A/M:16b) x=off(X/Y:16b)
00228CPHAPush A
00228DPHXPush X
00228EPHYPush Y
00228FPHBPush DB
002290PHDPush D
002291JMP $04906Dgoto $04906D
04906DLDA $001FB9
049071TAX
049072TSC
049073STA $001FA9,X
049077BRA #$B3
048FFCLDA #$FFFF
048FFFSTA $001FB9
049003LDA #$0000
049006STA $001FB7
04900ASEI
04900BREP #$30
04900DLDA $001FB7
049011TAX
049012LDA $001F9F,X
049016CMP #$FFFF
049019BEQ #$11
04901BTXA
04901CSTA $001FB9
049020LDA $001FA9,X
049024TCS
049025PLD
049026PLB
049027PLY
049028PLX
049029PLA
04902APLP
04902BRTL
04902CSEI
04902DREP #$30
04902FLDA $001FB7
049033INC
049034INC
049035STA $001FB7
049039CMP #$000A
04903CBCC #$CF
04903ELDA $001FB9
049042CMP #$FFFF
049045BEQ #$0C
049047JSL $C02295
04904BLDA $7E579E
04904FBEQ #$AB
049051BRA #$0D
049053LDA $001FBF
049057TCS
049058PLY
049059PLX
04905APLA
04905BPLB
04905CPLD
04905DPLP
04905ESEC
04905FRTL
049060LDA $001FBF
049064TCS
049065PLY
049066PLX
049067PLA
049068PLB
049069PLD
04906APLP
04906BCLC
04906CRTL

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 メラミ・メラゾーマ時の画面赤化処理?
049691LDA $7FD8A=$7FD8
049694JSL $C4C5C3SR: $04C5C3
049698LDA #$2000A=#$2000
04969BPHAPush A
04969CLDX #$0000X=#$0000
04969FLDY #$0092Y=#$0092
0496A2JSL $C4D001SR: $04D001
0496A6LDX #$0050X=#$0050
0496A9JSL $C4D05FSR: $04D05F
0496ADJSL $C02B9CSR: $002B9C
0496B1CLCc=off
0496B2ADC #$0002A+=(#$0002+c)
0496B5CMP #$2030A>=#$2030?
0496B8BCC #$E2if(c==off) goto $04969C

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

  • SR: $04FA79 冷たい息エフェクトの一部(DQ3)(新SR)
04FA78LDA $7FD8A=$7FD8
04FA7BJSL $C4C5C3SR: $04C5C3
04FA7FLDA #$8000A=#$8000
04FA82PHAPush A
04FA83LDX #$0000X=#$0000
04FA86LDY #$0092Y=#$0092
04FA89JSL $C4D001SR: $04D001
04FA8DLDX #$0050X=#$0050
04FA90JSL $C4D05FSR: $04D05F
04FA94JSL $C02B9CSR: $002B9C
04FA98INCA++
04FA99CMP #$8050A>=#$8050?
04FA9CBCC #$E5if(c==off) goto $04FA83
04FA9EPLAPull A
04FA9FRTLreturn

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

  • SR: $04A900 パルプンテエフェクト処理(DQ3)
04A90CJSL $C04604SR: $004604 引数:1#$F65FCC 引数:2#$01
  • 可変長データ? $365FCC(DQ3)
000102030405060708090A0B0C0D0E0F
365FC0・・・・・・・・・・・・・・02110B120BC75FF601
365FD001800002800102800202800302800402
365FE080050280060280070280080280090280
365FF00A02800B02800C02800D02800E02800F
36600002801002801102801202801302801402
36601080150280160280170280180280190280
3660201A02801B02801C02801D02FF・・・・・・・・

どうも、$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 表示時間(フレーム数?)っぽいです。

タイトルとURLをコピーしました