DQ3 まねまね実装2

「しらべる」の解析に時間を取られて更新が1日飛びました。いつかはネタ切れするわけで毎日更新できないのも当たり前なんですが。解析中に「こんなに手間かけて実装しても誰が喜ぶって言うわけでもないのに…」と思いましたが、言い出した手前やり遂げるつもりです(一応実装の目途は立ちました)。さて、まねまねの実装の続きです。

  • SR: $027275 1ターン分の処理
0272E1 JSR $DA00 SR: $02DA00
0272E4 STZ $260A $260A=#$00

複数攻撃をしてくる敵はこの直前でループして複数回攻撃をしてきます。従ってその直後でまねまねをしているキャラクターが攻撃を受けていれば反撃する、という処理をすればいいことになりますが、空き領域がないので、「行動順のインデックスのインクリメント」を行っている部分ともども別のSRで行うことにします。ついでですが、この部分で「やまびこのぼうしで呪文を繰り返すフラグ」をOFFにしています。

  • SR: $02DA00 まねまねによる反撃処理+行動順インデックスインクリメント
02DA00 JSR $D907 SR: $02D907
02DA03 INC $23D2 $23D2++
02DA06 LDA $23D2 A=$23D2
02DA09 CMP #$0018 A==or>=#$0018?
02DA0C RTS return

後半部分は上で述べたように「行動順のインデックスのインクリメント」を移動しただけです。その前にまねまねによる反撃処理のメインをはさみます。

  • SR: $02D907 まねまねによる反撃処理
02D907 LDA $2608 A=$2608
02D90A CMP #$0001 A==#$0001?
02D90D BEQ #$59 if(z==on) goto $02D968
02D90F LDY #$0000 Y=#$0000
02D912 LDA $2620,Y A=$2620+Y
02D915 AND #$00FF A&=#$00FF
02D918 CMP #$0018 A>=#$0018?
02D91B BCS #$4B if(c==on) goto $02D968
02D91D STA $2428 $2428=A
02D920 JSL $C2BE8A SR: $02BE8A 引数:1#$1C
02D925 BCS #$3B if(c==on) goto $02D962
02D927 LDA $23E4 A=$23E4
02D92A PHA Push A
02D92B PHY Push Y
02D92C TAX X=A
02D92D TYA A=Y
02D92E ASL A<<1
02D92F TAY Y=A
02D930 LDA $2630,Y A=$2630+Y
02D933 STA $23EE $23EE=A
02D936 TAY Y=A
02D937 JSR $DA30 SR: $02DA30
02D93A PLY Pull Y
02D93B LDA #$0001 A=#$0001
02D93E STA $2608 $2608=A
02D941 LDA $2620,Y A=$2620+Y
02D944 AND #$00FF A&=#$00FF
02D947 STA $23E4 $23E4=A
02D94A PHY Push Y
02D94B TYA A=Y
02D94C ASL A<<1
02D94D TAY Y=A
02D94E NOP
02D94F NOP
02D950 NOP
02D951 JSL $C1A867 SR: $01A867 引数:1#$017D
02D957 JSR $7D53 SR: $027D53
02D95A STZ $2608 $2608=#$00
02D95D PLY Pull Y
02D95E PLA Pull A
02D95F STA $23E4 $23E4=A
02D962 INY Y++
02D963 CPY #$0018 Y>=#$0018?
02D966 BCC #$AA if(c==off) goto $02D912
02D968 JSR $DA0D SR: $02DA0D
02D96B RTS return

このSRの処理は大きく分けて以下のようになっています。($02D907-0Fの部分は不用と思われるので無視してください)

  • まねまねを行うキャラクターインデックスのバッファ($7E2620-2F)を見てFFでなければ反撃行動主体者が死んでいないか確認する。($02D912-25)
  • 反撃可能であれば、反撃する戦闘行動IDをバッファ($7E2630-3F)から取得し、反撃対象情報を作成する。($02D927-34)
  • 「○○は やりかえした!」のメッセージ表示と共に反撃処理を行う。($02D93E-57)

反撃を行った後に、後続の反撃を行うキャラクターのために行動主体の情報を元に戻す必要があるのでスタックを多用しています。反撃の実行をするのに最初は「SR: $027939 1キャラクター分の実行処理」を呼んでいたのですが、それだと呪文の反撃の場合にはMPは使うわマホトーンで呪文を封じられていると実行できないわと問題がおおありだったので「自分で反撃処理用のSRを書かないとダメかなあ」と頭を抱えていましたが、ためしに「SR: $027D53 戦闘行動実行処理メイン」をかわりに使ったところ、すんなりうまくいきました。まあ元がDQ6をベースにしている(と思われる)ことを考えれば当たり前なのかもしれないですが。

今回の実装では反撃行動主体者が死んでいなければ反撃可能ですが、麻痺、混乱、眠りの場合にも反撃できないようにする必要があるかもしれません(未テストなので不明です)。今回は長くなったここまでにしておきます。次回は重要な「反撃対象情報の作成」を説明します。これをうまく実装しないと正しい対象に反撃できません。