DQ3 まんたん処理改造2

今回から実装に移ります。まず、ベホマラー・ベホマズンを使わないようにします。

  • SR: $091F59 呪文習得状態・ステータス異常チェック
091FF8 BRA #$06 goto $092000
092006 BRA #$06 goto $09200E

次に単体回復の部分の変更を行います。まずは大枠から。

  • SR: $0921AC まんたんHP回復処理
0921EF JSL $CF85CB SR: $0F85CB まんたん回復呪文・詠唱者決定(実行する呪文がないc=off)
0921F3 BCC #$3B if(c==off) goto $092230
0921F5 BRA #$2F goto $092226
0921F7-225 NOP
092226 PHA Push A Xにセットされているのは呪文使用者のインデックス*2なので1/2にして$7E33D6にセットする必要がある
092227 TXA A=X
092228 LSR A>>1
092229 STA $33D6 $33D6=A 非専門職の場合に効果を3/4するなどの処理で必要なため呪文を使う主体のインデックスをセットする
09222C PLA Pull A
09222D JSR $2481 SR: $092481 まんたん単体回復
092230 JSL $CF8553 SR: $0F8553 まんたん用RAM初期化・クリア
  • SR: $092481 まんたん単体回復
0924BF JSL $C9E431 SR: $09E431 職業別回復呪文回復量調整(移動中)

ベホマラー・ベホマズンは習得フラグが立たないようにしてあるので回復倍率は#$FFFFになるため、判断部分については何も変える必要はありません。処理の高速化のためにNOPで潰してもいいと思いますが、回復呪文を使えないという判断も含んでいるのでとりあえずそのままにしておきます。というわけで単体回復の部分だけを変えればいいことになります。$0921EF-233の部分はいらないので全部NOPで埋めます。余談ですが久しぶりに「移動中の回復量計算」のSRの中身を見ることになり、そのあまりのお粗末さに愕然としてしまったので再構成しています(このブログ中の過去のエントリも合わせて修正しています)。

  • SR: $0F85CB まんたん回復呪文・詠唱者決定(実行する呪文がないc=off)(新SR)
0F85CB JSL $CF83DA SR: $0F83DA 対象のHP差分に対する各回復呪文情報セット
0F85CF JSL $CF85E0 SR: $0F85E0 まんたん回復呪文・詠唱者決定準備
0F85D3 JSL $CF8642 SR: $0F8640 HP回復効率から選択
0F85D7 JSL $CF8686 SR: $0F8686 MP使用効率から選択
0F85DB JSL $CF86D9 SR: $0F86D9 最終詠唱者決定(実行する呪文がないc=off)
0F85DF RTL return
  • SR: $09F220 対象のHP差分に対する各回復呪文情報セット他(新SR)
0F83DA LDA $2BCE,Y A=$2BCE+Y
0F83DD STA $2BB8 $2BB8=A 対象のHP差分をセット
0F83E0 JSL $CF83D0 SR: $0F83D0 まんたん時回復呪文回復量・消費MP情報セット
0F83E4 RTL return
  • SR: $0F83D0 まんたん時回復呪文回復量・消費MP情報セット(新SR)
0F83D0 PHY Push Y
0F83D1 JSL $CF8563 SR: $0F8563 まんたん用RAM初期化
0F83D5 JSR $83E8 SR: $0F83E8 ホイミ・ベホイミ・ベホマ回復値・消費MP情報セット(全員)
0F83D8 PLY Pull Y
0F83D9 RTL return
  • SR: $0F8563 まんたん用RAM初期化 省略

$7E2640-87を#$00で初期化後、7E2640-47, 50-57, 60-67, 70-77, 80-87に#$FFをセット

  • SR: $0F83F9 ホイミ・ベホイミ・ベホマ回復倍率・MP倍率セット(全員)(新SR)
0F83E8 LDA #$0000 A=#$0000
0F83EB TAX X=A
0F83EC TAY Y=A
0F83ED JSR $83F9 SR: $0F83F9 ホイミ・ベホイミ・ベホマ回復値・消費MP情報セット(1人分)
0F83F0 INX X++
0F83F1 INY Y++
0F83F2 INY Y++
0F83F3 CPX $2BB2 X>=$2BB2? 7E2BB2はパーティ人数
0F83F6 BCC #$F5 if(c==off) goto $0F83ED
0F83F8 RTS return
  • SR: $0F83F9 ホイミ・ベホイミ・ベホマ回復倍率・MP倍率セット(1人分)(新SR)
0F83F9 PHX Push X
0F83FA PHY Push Y
0F83FB LDA $2BE8,Y A=$2BE8+Y
0F83FE AND #$6400 A&=#$6400 死亡・麻痺・般若の面装備中の場合はスキップ*1
0F8401 BEQ #$03 if(z==on) goto $0F8406
0F8403 PLY Pull Y
0F8404 PLX Pull X
0F8405 RTS return
0F8406 LDA $2BE8,Y A=$2BE8+Y
0F8409 AND #$0004 A&=#$0004 ホイミ習得状態チェック
0F840C BEQ #$13 if(z==on) goto $0F8421
0F840E PHY Push Y
0F840F LDY #$001F Y=#$001F ホイミの戦闘行動ID
0F8412 JSR $8476 SR: $0F8476 消費MPの現MPに対する倍率を取得する(MPオーバーc=off)
0F8415 PLY Pull Y
0F8416 BCC #$09 if(c==off) goto $0F8421
0F8418 STA $2648,Y $2648+Y=A
0F841B JSR $84D7 SR: $0F84D7 ホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)
0F841E STA $2640,Y $2640+Y=A
0F8421 LDA $2BE8,Y A=$2BE8+Y
0F8424 AND #$0008 A&=#$0008 ベホイミ習得状態チェック
0F8427 BEQ #$13 if(z==on) goto $0F843C
0F8429 PHY Push Y
0F842A LDY #$0022 Y=#$0022 ベホイミの戦闘行動ID
0F842D JSR $8476 SR: $0F8476 消費MPの現MPに対する倍率を取得する(MPオーバーc=off)
0F8430 PLY Pull Y
0F8431 BCC #$09 if(c==off) goto $0F843C
0F8433 STA $2658,Y $2658+Y=A
0F8436 JSR $851C SR: $0F851C ベホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)
0F8439 STA $2650,Y $2650+Y=A
0F843C LDA $2BE8,Y A=$2BE8+Y
0F843F AND #$0010 A&=#$0010 ベホマ習得状態チェック
0F8442 BEQ #$13 if(z==on) goto $0F8457
0F8444 PHY Push Y
0F8445 LDY #$0025 Y=#$0025 ベホマの戦闘行動ID
0F8448 JSR $8476 SR: $0F8476 消費MPの現MPに対する倍率を取得する(MPオーバーc=off)
0F844B PLY Pull Y
0F844C BCC #$09 if(c==off) goto $0F8457
0F844E STA $2668,Y $2668+Y=A
0F8451 JSR $8523 SR: $0F8523 ベホマ回復量最小値をベースとした回復倍率取得(非専門職を考慮)
0F8454 STA $2660,Y $2660+Y=A
0F8457 BRA #$AA goto $0F8403

この処理を始める時点で麻痺の回復処理は行なっているので、ここでまだ麻痺しているということはこのまんたん処理中に麻痺が回復することはありません。従って、死亡・麻痺・般若の面装備中フラグがONのキャラクターは処理をスキップします。呪文未習得・MPオーバーについては処理中で判断しています。

  • SR: $0F8476 消費MPの現MPに対する倍率を取得する(MPオーバーc=off)(新SR)
0F8476 JSL $C2B44A SR: $02B44A 消費MP計算(MPオーバーc=off)
0F847A BCS #$01 if(c==on) goto $0F847D
0F847C RTS return
0F847D PHA Push A
0F847E JSL $C43305 SR: $043305 引数:1#$01 引数:2#$FE 引数:3#$FF 現在MP取得
0F8485 STA $70 DP($70)=A
0F8487 PLA Pull A
0F8488 PHX Push X
0F8489 LDX #$0070 X=#$0070
0F848C JSL $C01295 SR: $001295 $00,x(3B)=$00,X(3B)/A(2B?) 剰余=A,$30
0F8490 LDA $70 A=DP($70)
0F8492 PLX Pull X
0F8493 SEC c=on
0F8494 RTS return

回復倍率の計算の場合は1バイトずらしていましたが、消費MPの場合、MPの最大値999に対して消費MP1の最小値は1がありえるので、同様に1バイトずらすと#$03E700 / #$0001 = #$03E700 となり2バイトだと足りません。そもそもMP倍率は「その呪文を現在MPだと何回唱えられるか」がわかればいいので1バイトずらしても余り意味がありません。当たり前ですがMP倍率は値が大きいほどよい(多く回数を唱えられる)ことになります。消費MPはレベル40以上の賢者だったり消費MPが減る装備をしている場合も考慮しているのでその場合はMP倍率の値は大きくなり、優先的に使われる可能性が高くなります。

  • SR: $0F84D7 ホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)(新SR)
0F84D7 PHX Push X
0F84D8 LDX #$001F X=#$001F
0F84DB JSL $C9FEFB SR: $09FEFB 回復最小量取得(全バンク用)
0F84DF PLX Pull X
0F84E0 PHA Push A
0F84E1 JSL $C46951 SR: $046951 引数:1#$01 引数:2#$FE 引数:3#$FF 職業ID取得
0F84E8 CMP #$0003 A>=#$0003?
0F84EB BCC #$09 if(c==off) goto $0F84F6 戦士・武闘家・魔法使い
0F84ED BEQ #$05 if(z==on) goto $0F84F4 僧侶
0F84EF CMP #$0007 A>=#$0007?
0F84F2 BCC #$02 if(c==off) goto $0F84F6 商人・遊び人・盗賊
0F84F4 BRA #$09 goto $0F84FF
0F84F6 LDA $01,S A=Stack($01)
0F84F8 ROR A>>1
0F84F9 CLC c=off
0F84FA ADC $01,S A+=(Stack($01)+c)
0F84FC ROR A>>1 回復量を3/4する
0F84FD STA $01,S Stack($01)=A
0F84FF LDA $2BB8 A=$2BB8 HP差分
0F8502 STZ $70 DP($70)=#$00
0F8504 STA $71 DP($71)=A
0F8506 PLA Pull A
0F8507 PHX Push X
0F8508 LDX #$0070 X=#$0070
0F850B JSL $C01295 SR: $001295 $00,x(3B)=$00,X(3B)/A(2B?) 剰余=A,$30
0F850F LDA $70 A=DP($70)
0F8511 PLX Pull X
0F8512 CMP #$0100 A>=#$0100?
0F8515 BCC #$01 if(c==off) goto $0F8518 1回で回復するなら倍率を#$0100に設定
0F8517 RTS return
0F8518 LDA #$0100 A=#$0100
0F851B RTS return
  • SR: $0F851C ベホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)省略
  • SR: $0F8523 ベホマ回復量最小値をベースとした回復倍率取得(非専門職を考慮)省略

ホイミの回復最小量を取得し、さらに職業を調べて非専門職の場合はその効果を3/4します。オリジナル同様HP差分を1バイト左にシフトして回復倍率を取得します。この数値は小さければ小さいほど効率がいいわけですが#$0100未満の場合は#$0100に補正しておきます。補正しないと、例えばHP差分10に対して、ホイミ・ベホイミ・ベホマの回復倍率*2は全て#$0100未満になりますが、回復倍率だけで見るとベホマが選択されてしまいます(正しくはホイミが選択されるべき)。これを避けるために回復倍率の最小値は#$0100とし、呪文選択時には回復倍率が同じ場合は下位の呪文を優先するようにします(上記の例の場合、回復倍率が全て#$0100になるのでホイミが選択される)。ベホイミはほとんど同じ、ベホマは3/4の代わりに賢さを取得して同じ処理をします。これでまず必要な情報が出揃ったことになります。次にこの中から選択を行います。今回はここまで。

*1:この実装をした時に#$8000の意味を取り違えていたので本当は行動不能フラグの#$8000でマスクするべきだが、意味的には同じ

*2:専門職の場合