DQ3 まんたん処理改造3

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

  • SR: $0F85E0 まんたん回復呪文・詠唱者決定準備(新SR)
0F85E0PHXPush X
0F85E1PHYPush Y
0F85E2LDX #$0000X=#$0000
0F85E5LDA #$FFFFA=#$FFFF回復効率最大値をセット
0F85E8PHAPush A
0F85E9LDA $2640,XA=$2640+X
0F85ECCMP $01,SA==Stack($01)?
0F85EEBEQ #$11if(z==on) goto $0F8601
0F85F0BCS #$0Fif(c==on) goto $0F8601
0F85F2STA $2670,X$2670+X=A
0F85F5LDA $2648,XA=$2648+X
0F85F8STA $2678,X$2678+X=A
0F85FBLDA #$001FA=#$001Fホイミの戦闘行動ID
0F85FESTA $2680,X$2680+X=A
0F8601LDA $2650,XA=$2650+X
0F8604CMP $01,SA==Stack($01)?
0F8606BEQ #$13if(z==on) goto $0F861B
0F8608BCS #$11if(c==on) goto $0F861B
0F860ASTA $01,SStack($01)=A
0F860CSTA $2670,X$2670+X=A
0F860FLDA $2658,XA=$2658+X
0F8612STA $2678,X$2678+X=A
0F8615LDA #$0022A=#$0022ベホイミの戦闘行動ID
0F8618STA $2680,X$2680+X=A
0F861BLDA $2660,XA=$2660+X
0F861ECMP $01,SA==Stack($01)?
0F8620BEQ #$13if(z==on) goto $0F8635
0F8622BCS #$11if(c==on) goto $0F8635
0F8624STA $01,SStack($01)=A
0F8626STA $2670,X$2670+X=A
0F8629LDA $2668,XA=$2668+X
0F862CSTA $2678,X$2678+X=A
0F862FLDA #$0025A=#$0025ベホマの戦闘行動ID
0F8632STA $2680,X$2680+X=A
0F8635PLAPull A
0F8636INXX++
0F8637INXX++
0F8638CPX #$0008X>=#$0008?4人分繰り返す
0F863BBCC #$A8if(c==off) goto $0F85E5
0F863DPLYPull Y
0F863EPLXPull X
0F863FRTLreturn

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

  • SR: $0F8642 HP回復効率から選択(新SR)
0F8642PHXPush X
0F8643PHYPush Y
0F8644LDX #$0000X=#$0000
0F8647LDA #$FFFFA=#$FFFF
0F864APHAPush A
0F864BLDA $2670,XA=$2670+X
0F864ECMP $01,SA>=Stack($01)?
0F8650BCS #$02if(c==on) goto $0F8654
0F8652STA $01,SStack($01)=A一番小さい回復倍率の値を探す
0F8654INXX++
0F8655INXX++
0F8656CPX #$0008X>=#$0008?
0F8659BCC #$F0if(c==off) goto $0F864B
0F865BLDX #$0000X=#$0000
0F865ELDA $2670,XA=$2670+X
0F8661CMP $01,SA>=Stack($01)?
0F8663BCC #$0Bif(c==off) goto $0F8670
0F8665BEQ #$09if(z==on) goto $0F8670
0F8667LDA #$FFFFA=#$FFFF最小回復倍率より大きい値は#$FFFFで潰す
0F866ASTA $2670,X$2670+X=A
0F866DSTZ $2678,X$2678+X=#$00MP倍率も0で潰す
0F8670INXX++
0F8671INXX++
0F8672CPX #$0008X>=#$0008?
0F8675BCC #$E7if(c==off) goto $0F865E
0F8677PLAPull A
0F8678PLYPull Y
0F8679PLXPull X
0F867ARTLreturn

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

  • SR: $0F8686 MP倍率から選択(新SR)
0F8686PHXPush X
0F8687PHYPush Y
0F8688LDX #$0000X=#$0000
0F868BLDA #$0000A=#$0000
0F868EPHAPush A
0F868FLDA $2678,XA=$2678+X
0F8692CMP $01,SA>=Stack($01)?
0F8694BCC #$02if(c==off) goto $0F8698
0F8696STA $01,SStack($01)=A一番大きいMP倍率の値を探す
0F8698INXX++
0F8699INXX++
0F869ACPX #$0008X>=#$0008?
0F869DBCC #$F0if(c==off) goto $0F868F
0F869FLDX #$0000X=#$0000
0F86A2LDA $2678,XA=$2678+X
0F86A5CMP $01,SA>=Stack($01)?
0F86A7BCS #$05if(c==on) goto $0F86AE
0F86A9BEQ #$03if(z==on) goto $0F86AE
0F86ABSTZ $2678,X$2678+X=#$00最大MP倍率より小さい値は0で潰す
0F86AEINXX++
0F86AFINXX++
0F86B0CPX #$0008X>=#$0008?
0F86B3BCC #$EDif(c==off) goto $0F86A2
0F86B5PLAPull A
0F86B6PLYPull Y
0F86B7PLXPull X
0F86B8RTLreturn

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

  • SR: $0F86D9 最終詠唱者・詠唱呪文決定(実行する呪文がないc=off)
0F86D9PHYPush Y
0F86DALDX $2BB4X=$2BB4
0F86DDDEXX–
0F86DEDEXX–
0F86DFBMI #$07if(n==on) goto $0F86E8
0F86E1LDA $2678,XA=$2678+X
0F86E4BNE #$05if(z==off) goto $0F86EB
0F86E6BRA #$F5goto $0F86DD
0F86E8PLYPull Y
0F86E9CLCc=off
0F86EARTLreturn
0F86EBLDA $2680,XA=$2680+X
0F86EEPLYPull Y
0F86EFSECc=on
0F86F0RTLreturn

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

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

コメント

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