「しらべる」の解析に時間を取られて更新が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をベースにしている(と思われる)ことを考えれば当たり前なのかもしれないですが。
今回の実装では反撃行動主体者が死んでいなければ反撃可能ですが、麻痺、混乱、眠りの場合にも反撃できないようにする必要があるかもしれません(未テストなので不明です)。今回は長くなったここまでにしておきます。次回は重要な「反撃対象情報の作成」を説明します。これをうまく実装しないと正しい対象に反撃できません。
コメント