前回までの処理で必要な情報が出揃ったので、今回からはその取捨選択をしていくことになります。
- 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。
コメント