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に移植してみましたが、それっぽいエフェクトは表示されるものの、一切アニメーションがされません。調査を継続しますが、アドバイスなどもウェルカムです。
コメント
そういう時は適当になんかやれば(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 表示時間(フレーム数?)っぽいです。