DQ3 まんたん処理改造3

前回までの処理で必要な情報が出揃ったので、今回からはその取捨選択をしていくことになります。

  • SR: $0F85E0 まんたん回復呪文・詠唱者決定準備(新SR)
0F85E0 PHX Push X
0F85E1 PHY Push Y
0F85E2 LDX #$0000 X=#$0000
0F85E5 LDA #$FFFF A=#$FFFF 回復効率最大値をセット
0F85E8 PHA Push A
0F85E9 LDA $2640,X A=$2640+X
0F85EC CMP $01,S A==Stack($01)?
0F85EE BEQ #$11 if(z==on) goto $0F8601
0F85F0 BCS #$0F if(c==on) goto $0F8601
0F85F2 STA $2670,X $2670+X=A
0F85F5 LDA $2648,X A=$2648+X
0F85F8 STA $2678,X $2678+X=A
0F85FB LDA #$001F A=#$001F ホイミの戦闘行動ID
0F85FE STA $2680,X $2680+X=A
0F8601 LDA $2650,X A=$2650+X
0F8604 CMP $01,S A==Stack($01)?
0F8606 BEQ #$13 if(z==on) goto $0F861B
0F8608 BCS #$11 if(c==on) goto $0F861B
0F860A STA $01,S Stack($01)=A
0F860C STA $2670,X $2670+X=A
0F860F LDA $2658,X A=$2658+X
0F8612 STA $2678,X $2678+X=A
0F8615 LDA #$0022 A=#$0022 ベホイミの戦闘行動ID
0F8618 STA $2680,X $2680+X=A
0F861B LDA $2660,X A=$2660+X
0F861E CMP $01,S A==Stack($01)?
0F8620 BEQ #$13 if(z==on) goto $0F8635
0F8622 BCS #$11 if(c==on) goto $0F8635
0F8624 STA $01,S Stack($01)=A
0F8626 STA $2670,X $2670+X=A
0F8629 LDA $2668,X A=$2668+X
0F862C STA $2678,X $2678+X=A
0F862F LDA #$0025 A=#$0025 ベホマの戦闘行動ID
0F8632 STA $2680,X $2680+X=A
0F8635 PLA Pull A
0F8636 INX X++
0F8637 INX X++
0F8638 CPX #$0008 X>=#$0008? 4人分繰り返す
0F863B BCC #$A8 if(c==off) goto $0F85E5
0F863D PLY Pull Y
0F863E PLX Pull X
0F863F RTL return

このSRで各人の回復効率の一番高い戦闘行動を決定します。ほとんど同じ処理ばかりしているのでもうちょっとひねったらスマートな実装になるのかもしれないですが、考えるのも面倒なのでストレートにベタな実装にします。なお、回復効率が同じ場合は下位の呪文を優先します(消費MPが少ないので。同一キャラクター中の比較なのでMP減の効果はどの呪文に対しても同じなので下位優先で問題ありません)。

  • SR: $0F8642 HP回復効率から選択(新SR)
0F8642 PHX Push X
0F8643 PHY Push Y
0F8644 LDX #$0000 X=#$0000
0F8647 LDA #$FFFF A=#$FFFF
0F864A PHA Push A
0F864B LDA $2670,X A=$2670+X
0F864E CMP $01,S A>=Stack($01)?
0F8650 BCS #$02 if(c==on) goto $0F8654
0F8652 STA $01,S Stack($01)=A 一番小さい回復倍率の値を探す
0F8654 INX X++
0F8655 INX X++
0F8656 CPX #$0008 X>=#$0008?
0F8659 BCC #$F0 if(c==off) goto $0F864B
0F865B LDX #$0000 X=#$0000
0F865E LDA $2670,X A=$2670+X
0F8661 CMP $01,S A>=Stack($01)?
0F8663 BCC #$0B if(c==off) goto $0F8670
0F8665 BEQ #$09 if(z==on) goto $0F8670
0F8667 LDA #$FFFF A=#$FFFF 最小回復倍率より大きい値は#$FFFFで潰す
0F866A STA $2670,X $2670+X=A
0F866D STZ $2678,X $2678+X=#$00 MP倍率も0で潰す
0F8670 INX X++
0F8671 INX X++
0F8672 CPX #$0008 X>=#$0008?
0F8675 BCC #$E7 if(c==off) goto $0F865E
0F8677 PLA Pull A
0F8678 PLY Pull Y
0F8679 PLX Pull X
0F867A RTL return

この処理で各キャラクターの回復倍率を比較し、その中での最小値を見つけます。最小値を持たないキャラクターの回復倍率の領域には#$FFFF、MP効率の領域には#$0000をセットして潰します。

  • SR: $0F8686 MP倍率から選択(新SR)
0F8686 PHX Push X
0F8687 PHY Push Y
0F8688 LDX #$0000 X=#$0000
0F868B LDA #$0000 A=#$0000
0F868E PHA Push A
0F868F LDA $2678,X A=$2678+X
0F8692 CMP $01,S A>=Stack($01)?
0F8694 BCC #$02 if(c==off) goto $0F8698
0F8696 STA $01,S Stack($01)=A 一番大きいMP倍率の値を探す
0F8698 INX X++
0F8699 INX X++
0F869A CPX #$0008 X>=#$0008?
0F869D BCC #$F0 if(c==off) goto $0F868F
0F869F LDX #$0000 X=#$0000
0F86A2 LDA $2678,X A=$2678+X
0F86A5 CMP $01,S A>=Stack($01)?
0F86A7 BCS #$05 if(c==on) goto $0F86AE
0F86A9 BEQ #$03 if(z==on) goto $0F86AE
0F86AB STZ $2678,X $2678+X=#$00 最大MP倍率より小さい値は0で潰す
0F86AE INX X++
0F86AF INX X++
0F86B0 CPX #$0008 X>=#$0008?
0F86B3 BCC #$ED if(c==off) goto $0F86A2
0F86B5 PLA Pull A
0F86B6 PLY Pull Y
0F86B7 PLX Pull X
0F86B8 RTL return

最後に残ったキャラクターに対してMP倍率の最大値を見つけてそれ以外のMP倍率を0で潰します。これで$7E2678-Fには回復倍率が最も小さく、MP倍率が最も大きいキャラクター以外は0がセットされる状態になります。

  • SR: $0F86D9 最終詠唱者・詠唱呪文決定(実行する呪文がないc=off)
0F86D9 PHY Push Y
0F86DA LDX $2BB4 X=$2BB4
0F86DD DEX X–
0F86DE DEX X–
0F86DF BMI #$07 if(n==on) goto $0F86E8
0F86E1 LDA $2678,X A=$2678+X
0F86E4 BNE #$05 if(z==off) goto $0F86EB
0F86E6 BRA #$F5 goto $0F86DD
0F86E8 PLY Pull Y
0F86E9 CLC c=off
0F86EA RTL return
0F86EB LDA $2680,X A=$2680+X
0F86EE PLY Pull Y
0F86EF SEC c=on
0F86F0 RTL return

最後に誰のどの呪文を使うかを決めます。$7E2678-Fが全部0なら誰も呪文が使えないということになります。オリジナルの実装にならって、パーティの後ろから見ていって0でないキャラクターが出てきたらそのキャラクターを実行者とします。MP効率も見ているので、現在MPがほぼ一緒でない限りこのSRに入るまでに誰か一人に絞られていそうですが。このSRを出ると、実行する呪文の戦闘行動IDがAにセットされ、実行者のインデックス*2がXにセットされた状態になり、あとは実際の回復処理を実行して1人の1回分の回復処理が終わります。

これでまんたん処理の改良は終わりです。ベホマラーを使用しないことにしたことにより処理を大幅に簡略化できました。オリジナルの単体回復の回復倍率を計算する処理を解析しているあたりで、自分がやるべきことがだいたい見えてきてしまい、解析が面倒になって変更作業を先に始めてしまったので、実はその部分の解析は後からやっています。結果としてパーティ最後尾のキャラクターに負担が集中する状況も避けられるという効果もあるのでオリジナルよりは使いやすいかもしれません。それでも自分は使わないと思いますがwww。