DQ3 まねまね実装2

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

  • SR: $027275 1ターン分の処理
0272E1JSR $DA00SR: $02DA00
0272E4STZ $260A$260A=#$00

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

  • SR: $02DA00 まねまねによる反撃処理+行動順インデックスインクリメント
02DA00JSR $D907SR: $02D907
02DA03INC $23D2$23D2++
02DA06LDA $23D2A=$23D2
02DA09CMP #$0018A==or>=#$0018?
02DA0CRTSreturn

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

  • SR: $02D907 まねまねによる反撃処理
02D907LDA $2608A=$2608
02D90ACMP #$0001A==#$0001?
02D90DBEQ #$59if(z==on) goto $02D968
02D90FLDY #$0000Y=#$0000
02D912LDA $2620,YA=$2620+Y
02D915AND #$00FFA&=#$00FF
02D918CMP #$0018A>=#$0018?
02D91BBCS #$4Bif(c==on) goto $02D968
02D91DSTA $2428$2428=A
02D920JSL $C2BE8ASR: $02BE8A 引数:1#$1C
02D925BCS #$3Bif(c==on) goto $02D962
02D927LDA $23E4A=$23E4
02D92APHAPush A
02D92BPHYPush Y
02D92CTAXX=A
02D92DTYAA=Y
02D92EASLA<<1
02D92FTAYY=A
02D930LDA $2630,YA=$2630+Y
02D933STA $23EE$23EE=A
02D936TAYY=A
02D937JSR $DA30SR: $02DA30
02D93APLYPull Y
02D93BLDA #$0001A=#$0001
02D93ESTA $2608$2608=A
02D941LDA $2620,YA=$2620+Y
02D944AND #$00FFA&=#$00FF
02D947STA $23E4$23E4=A
02D94APHYPush Y
02D94BTYAA=Y
02D94CASLA<<1
02D94DTAYY=A
02D94ENOP
02D94FNOP
02D950NOP
02D951JSL $C1A867SR: $01A867 引数:1#$017D
02D957JSR $7D53SR: $027D53
02D95ASTZ $2608$2608=#$00
02D95DPLYPull Y
02D95EPLAPull A
02D95FSTA $23E4$23E4=A
02D962INYY++
02D963CPY #$0018Y>=#$0018?
02D966BCC #$AAif(c==off) goto $02D912
02D968JSR $DA0DSR: $02DA0D
02D96BRTSreturn

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

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

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

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

コメント

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