DQ3 まねまね実装1

まねまねの実装を行います。実質これが戦闘部分に関しての変更としては今のところ最後となります。まだいくつか新しい案が浮かんできたのですが、それはまた後でということにします。さて、戦闘関連の変更をしていて今のところこれが一番厄介でした。例によってDQ6で動作を確認してみます。

  1. 反撃をするのは攻撃が終わってから(2回攻撃の1回目では反撃しない)。
  2. 複数回攻撃を受けても反撃するのは最後の戦闘行動でのみ。
  3. 味方からの行動は反撃?対象にはならない。
  4. まねまねによる反撃はまねされないのでまねまね合戦が延々と続くことはない。
  5. (未確認だが)マホトーン中でも呪文の反撃は可能。MPも消費しない。

実装を簡単にするために、とりあえず敵が使うことは想定しないことにします。事前準備としてまねまねの戦闘行動の定義を#$0115にしておきます。※まねまね実装は一気に実装してしまわないとあっさりフリーズします。実装をパクる場合は一連の記事が完結してからにしてください(全3回を予定)。

  • SR: $02D580 直接攻撃反射ダメージ計算等
02D58CJSR $D970SR: $02D970
  • SR: $02D980 まねまね中のキャラクタがいるかチェックし反撃するか決定
02D970LDA $23EEA=$23EE
02D973CMP #$0115A==#$0115?
02D976BNE #$03if(z==off) goto $02D97B
02D978JMP $D9FB ($02D9FB)goto $02D9FB
02D97BLDX $23E4X=$23E4
02D97ESTX $2428$2428=X
02D981JSL $C2CB2BSR: $02CB2B 引数:1#$2050 引数:2#$0001
02D989BNE #$70if(z==off) goto $02D9FB
02D98BJSL $C2CB2BSR: $02CB2B 引数:1#$2049 引数:2#$00FF
02D993BEQ #$66if(z==on) goto $02D9FB
02D995JSL $C2BE8ASR: $02BE8A 引数:1#$1C
02D99ABCS #$5Fif(c==on) goto $02D9FB
02D99CLDX $23E8X=$23E8
02D99FSTX $2428$2428=X
02D9A2JSL $C2CB2BSR: $02CB2B 引数:1#$2050 引数:2#$0001
02D9AABEQ #$4Fif(z==on) goto $02D9FB
02D9ACJSL $C2BE8ASR: $02BE8A 引数:1#$16
02D9B1BCS #$48if(c==on) goto $02D9FB
02D9B3JSL $C2CB2BSR: $02CB2B 引数:1#$2047 引数:2#$00FF
02D9BBBNE #$3Eif(z==off) goto $02D9FB
02D9BDJSL $C2CB2BSR: $02CB2B 引数:1#$2034 引数:2#$01FF
02D9C5CMP #$0115A==#$0115?
02D9C8BNE #$31if(z==off) goto $02D9FB
02D9CAPHYPush Y
02D9CBLDY #$0000Y=#$0000
02D9CETXAA=X
02D9CFSEP #$20m=on(A/M:8b)
02D9D1CMP $2620,YA==$2620+Y?
02D9D4BEQ #$19if(z==on) goto $02D9EF
02D9D6REP #$20m=off(A/M:16b)
02D9D8LDA $2620,YA=$2620+Y
02D9DBAND #$00FFA&=#$00FF
02D9DECMP #$0018A>=#$0018?
02D9E1BCS #$06if(c==on) goto $02D9E9
02D9E3INYY++
02D9E4CPY #$0018Y>=#$0018?
02D9E7BCC #$E5if(c==off) goto $02D9CE
02D9E9TXAA=X
02D9EASEP #$20m=on(A/M:8b)
02D9ECSTA $2620,Y$2620+Y=A
02D9EFREP #$20m=off(A/M:16b)
02D9F1TYAA=Y
02D9F2ASLA<<1
02D9F3TAYY=A
02D9F4LDA $23EEA=$23EE
02D9F7STA $2630,Y$2630+Y=A
02D9FAPLYPull Y
02D9FBRTSreturn

ぐんたいよびの実装同様「まねまねによる反撃を行うキャラのID」および「反撃の際に使用される戦闘行動ID」を1セットとして保存しておく領域を新たに定義する必要があります。それぞれ、$7E2610-1F、$7E2620-2Fに保存することにします。また、これらの領域は初期化時にFFで埋めておくことを前提とします。今回はまず攻撃を受けたときにその行動IDを保存するところまで実装します。実装の内容は以下のとおりです。

  • 戦闘行動がまねまね(#$0115)、逃げる(#$006A)の場合は処理をスキップする。$02D980は行動対象でないキャラクターもループでまわされるため、スキップしないとフリーズしたりする。($02D980-8B)
  • 現在の戦闘行動の行動主体($7E23E4)を調べて主体が味方である、もしくは死亡している(念のため)ば反撃しないのでスキップする。($02D98D-A2)
  • 行動対象($7E23E8)が味方かつその戦闘行動がまねまね(#$0115)であれば反撃用バッファにセットする。セットする際に行動対象のインデックスがすでにバッファ内に存在していれば現在の戦闘行動で上書きする。($02D9AA-EE)

こう書いてしまうと割とさらっと実装できたみたいに見えますが、実際は試行錯誤の上たどりついたもので、途中で何度かやめようかと思うくらいでした。

コメント

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