DQ6 モンスター側エフェクトを実装する1(補助呪文系)

DQ3 K.MixにDQ6から移植したモンスターのうち、呪文エフェクトが必要なのは、グラコス(ヒャダルコ)、魔王の使い(呪文を使う方:ルカナン、スカラ、バギクロス)、ブースカ(メラゾーマ、イオナズン)、メタルキング(ベギラマ)*1、ダークドレアム(ギガデイン、メラゾーマ、バイキルト)ですが、今まではエフェクトが無いせいで違和感があったので(特にダークドレアム)、その違和感をなくしたいというのが目的です。エフェクトにも2種類あり、補助呪文等詠唱時にモンスター自体が明滅するエフェクト、攻撃呪文詠唱時に表示されるエフェクト(赤・青・黄の3色で小・中・大の全9バリエーション)の2つがあります。どちらもどういう理由かDQ3では実装されていません。DQ6では戦闘行動にこれらの情報を設定するフィールド(明滅するときの色など)があったりするのですが、今回移植するにあたっては対象がごく限定的であるため、モンスターID+戦闘行動決め打ちでプログラム中にハードコードして対応することにしました(DQ3のモンスターには実装しない)。

まずは比較的簡単な補助呪文エフェクトですが、DQ6では順番として

  1. モンスターがアニメーションする
  2. 呪文SEが発生する
  3. 明滅エフェクトが発生する

となっています。DQ3には明滅エフェクトを発生させるSRが存在しないようなので、行動SEを発生させた直後に明滅エフェクトを紛れ込ませることにします。

  • SR: $027939 1キャラクター分の戦闘行動実行処理
02794B JSR $EB84 SR: $02EB84 行動開始時SE再生+DQ6インポートモンスター補助呪文エフェクト処理
  • SR: $02EB84 行動開始時SE再生+DQ6インポートモンスター補助呪文エフェクト処理(新SR)
02EB84 JSR $7983 SR: $027983 戦闘行動開始時の効果音を鳴らす
02EB87 JSL $CF4BF4 SR: $0F4BF4 DQ6インポートモンスター補助呪文エフェクト処理
02EB8B RTS return
  • SR: $0F4BF4 DQ6インポートモンスター補助呪文エフェクト処理(新SR)
0F4BF4 JSL $CF4B2A SR: $0F4B2A ダークドレアムバイキルト時エフェクト処理
0F4BF8 JSL $CF4BB6 SR: $0F4BB6 魔王の使いスカラルカナン時エフェクト処理
0F4BFC RTL return
  • SR: $0F4BB6 魔王の使いスカラルカナン時エフェクト処理(新SR)
0F4BB6 LDX $23E8 X=$23E8
0F4BB9 STX $2428 $2428=X
0F4BBC JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF グループID取得
0F4BC4 CMP #$0005 A>=#$0005?
0F4BC7 BCC #$01 if(c==off) goto $0F4BCA
0F4BC9 RTL return
0F4BCA JSL $C2CAD9 SR: $02CAD9 引数:1#$2049 引数:2#$FFFF
0F4BD2 CMP #$00AD A==#$00AD? モンスターIDが魔王の使いか?
0F4BD5 BNE #$12 if(z==off) goto $0F4BE9
0F4BD7 LDA $23EE A=$23EE
0F4BDA CMP #$0038 A==#$0038? 戦闘行動がスカラ(敵術者)か?
0F4BDD BNE #$0B if(z==off) goto $0F4BEA
0F4BDF LDA #$3DEF A=#$3DEF 15ビットでRGBを指定
0F4BE2 LDX #$0000 X=#$0000
0F4BE5 JSL $C41BE2 SR: $041BE2 モンスター側補助系呪文エフェクト処理
0F4BE9 RTL return
0F4BEA CMP #$0036 A==#$0036? 戦闘行動がルカナンか?
0F4BED BNE #$FA if(z==off) goto $0F4BE9
0F4BEF LDA #$1C66 A=#$1C66 15ビットでRGBを指定
0F4BF2 BRA #$EE goto $0F4BE2
  • SR: $041BE2 モンスター側補助系呪文エフェクト処理(新SR)
041BE2 PEA #$0003 Push #$0003 明滅回数指定?
041BE5 LDY #$0006 Y=#$0006
041BE8 JSL $C02ABA SR: $002ABA 引数:1#$CF4B5E
041BEF JSR $AFA7 SR: $04AFA7 エフェクト実行?
041BF2 JSR $AFAC SR: $04AFAC エフェクト実行?
041BF5 DEY Y–
041BF6 BNE #$FA if(z==off) goto $041BF2
041BF8 PLY Pull Y
041BF9 DEY Y–
041BFA BEQ #$03 if(z==on) goto $041BFF
041BFC PHY Push Y
041BFD BRA #$E6 goto $041BE5
041BFF RTL return
  • SR: $0F4B5E モンスターを明滅させる処理(新SR)
0F4B5E STA $4ED2 $4ED2=A
0F4B61 STY $4ED6 $4ED6=Y
0F4B64 LDA $4EFA,X A=$4EFA+X
0F4B67 TAX X=A
0F4B68 PHX Push X
0F4B69 LDA #$000A A=#$000A
0F4B6C STA $4247 $4247=A
0F4B6F JSL $C79F9A SR: $079F9A
0F4B73 LDA $45D2,X A=$45D2+X
0F4B76 LDX $4ED2 X=$4ED2
0F4B79 JSL $C03644 SR: $003644
0F4B7D PHX Push X
0F4B7E LDX $4ED6 X=$4ED6
0F4B81 JSL $C4FAC8 SR: $04FAC8 エフェクト処理?
0F4B85 PLX Pull X
0F4B86 PLX Pull X
0F4B87 LDA #$0008 A=#$0008
0F4B8A STA $4247 $4247=A
0F4B8D JSL $C79F9A SR: $079F9A
0F4B91 RTL return

これといって特別なことはしていません。行動主体のモンスターIDと戦闘行動を調べ、明滅色を15ビットのRGB(それぞれ5ビットずつ)で指定するだけです。明滅処理自体は例によってDQ3とDQ6の関連するアドレスなどを付きあわせてそれっぽいものにするだけです。このあたりは正直良くわからないので例によって見よう見まねで試行錯誤するしかないです。

*1:2012-06-07しれっと追加 ver1.2.1には漏れています