DQ6 モンスター側エフェクトを実装する2(攻撃呪文系)

今回は攻撃呪文系のエフェクトですが、まず結論から言って完全な移植はできていません。なんとかそれっぽく見せているというだけです。DQ3では、モンスターアニメーション中に別のBG1,2のアニメーション(エフェクト)が挿入されるのはバラモス、ゾーマのブレス攻撃と凍てつく波動のエフェクトのみです(ゾーマのマヒャドはアニメーション後なので除外)。DQ6のモンスター用スプライトのアニメーション定義部分を見ると、「フレーム数」に255が設定されているレコードが存在します。恐らく255のレコードで任意のフレーム数だけアニメーションをストップさせ、その間に別のアニメーションを実行してから残りのアニメーションを実行する、という手順になっているのでは、と想像しますが、DQ3の上記2モンスターのアニメーション定義についてはフレーム数が255というレコードは存在せず、固定フレーム数(バラモスのブレスは16フレーム、ゾーマのブレスは21フレーム、凍てつく波動は33フレーム)だけ動きを止めているようです。ざっと見たところ、DQ3にフレーム数255の場合の処理がなさそう、という結論に至ったので(DQ6の処理の解析にまるでヤル気がわかなかったのとDQ3で同じ処理をしている箇所を探すのが面倒になった)、少々アレンジしてねじ込むことにしました。ポイントとしては以下の3点です。

  1. 攻撃呪文エフェクト用のアニメーションパターンの定義
  2. エフェクトの実装
  3. 呪文SEの制御

1.攻撃呪文エフェクト用のアニメーションパターンの定義

まず、オリジナルのDQ6で同じアニメーションで途中で攻撃呪文を挟む戦闘行動と挟まない戦闘行動が存在するかを調べます。具体的な例としては、魔王の使い(DQ6)のマヒャドとルカナンは使用しているアニメーション自体は同じで、マヒャドの時は呪文エフェクト中は魔王の使い自体のアニメーションは止めています。DQ6ではフレーム数255のレコードを使って任意のフレームだけモンスターのアニメーションを止めていますが、この方法は使えません。従って、この場合はもう1つ攻撃呪文用のアニメーション定義を追加する必要があります(ここから先はこちらの都合の話ですが、DQ6からモンスターをインポートした時にこんなことになるとは思ってもいなかったため、スプライトデータを隙間なく並べてしまったために新しいアニメーション定義を追加することができません。スプライトインデックスの定義から推察するに、アニメーションの定義とスプライトの定義は連続している必要はなさそうだったため、試しにアニメーション定義だけを別の場所にしてみたところ、期待通りの動作をしました)。デバッグメニュー「モンスターを見る」でアニメーションが増えていることを確認してから次のステップに移ります。ちなみに攻撃呪文のエフェクトは小・中が16フレーム、大が22フレームです。

2.エフェクトの実装

次にメインとなるエフェクトの実装ですが、エフェクトの実体自体はバラモスのブレス攻撃のエフェクトをパクります。まずは枠から。

  • SR: $048774 モンスターアニメーション
0487C5JSL $C5E96ASR: $05E96ADQ6インポートモンスター呪文エフェクト特殊処理
0487C9NOP
0487CANOP

  • SR: $05E96A DQ6インポートモンスター呪文エフェクト特殊処理(新SR)
05E96AJSL $C41749SR: $041749メタルキング特殊アニメーション処理
05E96EBCS #$16if(c==on) goto $05E986
05E970JSL $C4176CSR: $04176C魔王の使い特殊アニメーション処理
05E974BCS #$10if(c==on) goto $05E986
05E976JSL $C4178FSR: $04178Fブースカ特殊アニメーション処理
05E97ABCS #$0Aif(c==on) goto $05E986
05E97CJSL $C417C6SR: $0417C6グラコス特殊アニメーション処理
05E980BCS #$04if(c==on) goto $05E986
05E982JSL $C417E9SR: $0417E9ダークドレアム特殊アニメーション処理
05E986RTLreturn

基本的にどのモンスターでもやることは「スプライトIDと戦闘行動を調べて該当以外はスキップ」なので、今回も魔王の使いを例にとって説明します。

  • SR: $04176C 魔王の使い特殊アニメーション処理(新SR)
04176CCMP #$00DDA==#$00DD?スプライトIDを調べる
04176FBEQ #$02if(z==on) goto $041773
041771CLCc=off
041772RTLreturn
041773PHXPush X
041774PHYPush Y
041775LDA $7E23EEA=$7E23EE
041779CMP #$0015A==#$0015?戦闘行動がバギクロスか
04177CBNE #$0Dif(z==off) goto $04178B
04177EJSR $B75FSR: $04B75F描画レイヤー指定?
041781LDA #$001BA=#$001Bエフェクトが発生するまでのフレーム数を指定
041784JSL $C02ABASR: $002ABA 引数:1#$C418BDエフェクト処理
04178BPLYPull Y
04178CPLXPull X
04178DSECc=on
04178ERTLreturn
  • SR: $0418BD モンスター側呪文エフェクト(大)黄(新SR)
0418BDLDY #$02CDY=#$02CDパレットアクセスID指定
0418C0BRA #$B2goto $041874後は共通なのでモンスター側呪文エフェクト(大)赤にジャンプ
  • SR: $041871 モンスター側呪文エフェクト(大)赤(新SR)
041871LDY #$02CBY=#$02CBパレットアクセスID指定
041874STY $4F74$4F74=Y
041877PHAPush Aエフェクト発生までのフレーム数を保存しておく
041878NOP
041879NOP
04187ALDA #$0016A=#$0016レイヤー指定?
04187DSTA $7FC8$7FC8=A
041880LDY #$0002Y=#$0002
041883JSR $B4E6SR: $04B4E6モンスターエフェクト描画時XY座標取得?
041886TXAA=X
041887SECc=on
041888SBC #$0010A-=(#$0010 +c)エフェクト発生X座標セット
04188BTAXX=A
04188CTYAA=Y
04188DSECc=on
04188ESBC #$0011A-=(#$0011 +c)エフェクト発生Y座標セット
041891TAYY=A
041892LDA #$0025A=#$0025
041895JSR $B65BSR: $04B65B呪文使用時エフェクト描画用データセット?
041898PLYPull Y$041877でPushしたエフェクト発生までのフレーム数を取得
041899JSL $C02B9CSR: $002B9C
04189DDEYY–
04189EBNE #$F9if(z==off) goto $041899
0418A0JSR $1E71SR: $041E71特殊モンスター用呪文SE再生処理
0418A3PHXPush X
0418A4JSR $83C2SR: $0483C2エフェクト中ウィンドウ背景色指定?
0418A7PLXPull X
0418A8PHXPush X
0418A9JSL $C4B212SR: $04B212呪文エフェクト用BG12描画
0418ADPLXPull X
0418AENOP
0418AFNOP
0418B0NOP
0418B1JSR $B6DASR: $04B6DA
0418B4JSR $B783SR: $04B783
0418B7RTLreturn

はじめにバラモスのブレスエフェクト処理(SR: $0488C2-)をパクったため、後ほど不要だとわかった処理をNOPで潰しているので所々NOPが挟まっていますが特に意味はありません。バラモスのブレスエフェクト処理と違うのは、ブレスエフェクト中のウィンドウの背景色の指定をしない点です。バラモスのブレスエフェクト処理中は、メッセージウィンドウ等の背景が完全に透明になりエフェクト終了後に元に戻りますが、これをそのまま流用するとウィンドウがちらついて非常に気になるため、周辺にあったSRで背景色を変更しないSRを探して置き換えています。SR: $041E71は単なるSE再生以外にちょっとした仕掛けが必要なので3で後述します。

3.呪文SEの制御

オリジナルのDQ6のアニメーションを見ると、攻撃呪文のエフェクトが発生した時点で呪文詠唱のSEが発生しています。通常はアニメーションが終わってからエフェクトが発生する仕組みになっているので、何らかの仕掛けがあるだろうということで、調べてみるとDQ3では使用されてはいないものの、仕組み自体はDQ6同様実装されていました。

  • SR: $027983 戦闘行動開始時の効果音を鳴らす
027996LDA $4250A=$4250効果音が既に再生されているか
027999BNE #$39if(z==off) goto $0279D40以外なら再生されているので何もしない

というわけでアニメーション中の呪文SE再生時に$7E4250を1インクリメントします。

  • SR: $041E71 特殊モンスター用呪文SE再生処理(新SR)
041E71LDA #$0066A=#$0066
041E74JSL $C1E314SR: $01E314
041E78INC $4250$4250++戦闘行動開始時のSE再生をしないようにする
041E7BRTSreturn

これで1モンスターについての作業は終わりです。今回の実装でDQ6から移植したモンスターのアニメーションが随分オリジナルに近くなりました(正確に言うとモンスター側の行動時のSEを再生していないので違和感が残りますが)。最初から実装しろよという話なんですが、正直戦闘行動の設定をやってまともに動くところまでやると「これでいっか」という気になってしまい、リリースしてから後から気になってくるという困ったループに陥っています。先にプレイしてしまった人には申し訳ないですが。

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。