DQ3 まんたん処理改造2

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

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

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

  • SR: $0921AC まんたんHP回復処理
0921EFJSL $CF85CBSR: $0F85CBまんたん回復呪文・詠唱者決定(実行する呪文がないc=off)
0921F3BCC #$3Bif(c==off) goto $092230
0921F5BRA #$2Fgoto $092226
0921F7-225NOP
092226PHAPush AXにセットされているのは呪文使用者のインデックス*2なので1/2にして$7E33D6にセットする必要がある
092227TXAA=X
092228LSRA>>1
092229STA $33D6$33D6=A非専門職の場合に効果を3/4するなどの処理で必要なため呪文を使う主体のインデックスをセットする
09222CPLAPull A
09222DJSR $2481SR: $092481まんたん単体回復
092230JSL $CF8553SR: $0F8553まんたん用RAM初期化・クリア
  • SR: $092481 まんたん単体回復
0924BFJSL $C9E431SR: $09E431職業別回復呪文回復量調整(移動中)

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

  • SR: $0F85CB まんたん回復呪文・詠唱者決定(実行する呪文がないc=off)(新SR)
0F85CBJSL $CF83DASR: $0F83DA対象のHP差分に対する各回復呪文情報セット
0F85CFJSL $CF85E0SR: $0F85E0まんたん回復呪文・詠唱者決定準備
0F85D3JSL $CF8642SR: $0F8640HP回復効率から選択
0F85D7JSL $CF8686SR: $0F8686MP使用効率から選択
0F85DBJSL $CF86D9SR: $0F86D9最終詠唱者決定(実行する呪文がないc=off)
0F85DFRTLreturn

  • SR: $09F220 対象のHP差分に対する各回復呪文情報セット他(新SR)
0F83DALDA $2BCE,YA=$2BCE+Y
0F83DDSTA $2BB8$2BB8=A対象のHP差分をセット
0F83E0JSL $CF83D0SR: $0F83D0まんたん時回復呪文回復量・消費MP情報セット
0F83E4RTLreturn

  • SR: $0F83D0 まんたん時回復呪文回復量・消費MP情報セット(新SR)
0F83D0PHYPush Y
0F83D1JSL $CF8563SR: $0F8563まんたん用RAM初期化
0F83D5JSR $83E8SR: $0F83E8ホイミ・ベホイミ・ベホマ回復値・消費MP情報セット(全員)
0F83D8PLYPull Y
0F83D9RTLreturn

  • SR: $0F8563 まんたん用RAM初期化 省略

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

  • SR: $0F83F9 ホイミ・ベホイミ・ベホマ回復倍率・MP倍率セット(全員)(新SR)
0F83E8LDA #$0000A=#$0000
0F83EBTAXX=A
0F83ECTAYY=A
0F83EDJSR $83F9SR: $0F83F9ホイミ・ベホイミ・ベホマ回復値・消費MP情報セット(1人分)
0F83F0INXX++
0F83F1INYY++
0F83F2INYY++
0F83F3CPX $2BB2X>=$2BB2?7E2BB2はパーティ人数
0F83F6BCC #$F5if(c==off) goto $0F83ED
0F83F8RTSreturn

  • SR: $0F83F9 ホイミ・ベホイミ・ベホマ回復倍率・MP倍率セット(1人分)(新SR)
0F83F9PHXPush X
0F83FAPHYPush Y
0F83FBLDA $2BE8,YA=$2BE8+Y
0F83FEAND #$6400A&=#$6400死亡・麻痺・般若の面装備中の場合はスキップ*1
0F8401BEQ #$03if(z==on) goto $0F8406
0F8403PLYPull Y
0F8404PLXPull X
0F8405RTSreturn
0F8406LDA $2BE8,YA=$2BE8+Y
0F8409AND #$0004A&=#$0004ホイミ習得状態チェック
0F840CBEQ #$13if(z==on) goto $0F8421
0F840EPHYPush Y
0F840FLDY #$001FY=#$001Fホイミの戦闘行動ID
0F8412JSR $8476SR: $0F8476消費MPの現MPに対する倍率を取得する(MPオーバーc=off)
0F8415PLYPull Y
0F8416BCC #$09if(c==off) goto $0F8421
0F8418STA $2648,Y$2648+Y=A
0F841BJSR $84D7SR: $0F84D7ホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)
0F841ESTA $2640,Y$2640+Y=A
0F8421LDA $2BE8,YA=$2BE8+Y
0F8424AND #$0008A&=#$0008ベホイミ習得状態チェック
0F8427BEQ #$13if(z==on) goto $0F843C
0F8429PHYPush Y
0F842ALDY #$0022Y=#$0022ベホイミの戦闘行動ID
0F842DJSR $8476SR: $0F8476消費MPの現MPに対する倍率を取得する(MPオーバーc=off)
0F8430PLYPull Y
0F8431BCC #$09if(c==off) goto $0F843C
0F8433STA $2658,Y$2658+Y=A
0F8436JSR $851CSR: $0F851Cベホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)
0F8439STA $2650,Y$2650+Y=A
0F843CLDA $2BE8,YA=$2BE8+Y
0F843FAND #$0010A&=#$0010ベホマ習得状態チェック
0F8442BEQ #$13if(z==on) goto $0F8457
0F8444PHYPush Y
0F8445LDY #$0025Y=#$0025ベホマの戦闘行動ID
0F8448JSR $8476SR: $0F8476消費MPの現MPに対する倍率を取得する(MPオーバーc=off)
0F844BPLYPull Y
0F844CBCC #$09if(c==off) goto $0F8457
0F844ESTA $2668,Y$2668+Y=A
0F8451JSR $8523SR: $0F8523ベホマ回復量最小値をベースとした回復倍率取得(非専門職を考慮)
0F8454STA $2660,Y$2660+Y=A
0F8457BRA #$AAgoto $0F8403

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

  • SR: $0F8476 消費MPの現MPに対する倍率を取得する(MPオーバーc=off)(新SR)
0F8476JSL $C2B44ASR: $02B44A消費MP計算(MPオーバーc=off)
0F847ABCS #$01if(c==on) goto $0F847D
0F847CRTSreturn
0F847DPHAPush A
0F847EJSL $C43305SR: $043305 引数:1#$01 引数:2#$FE 引数:3#$FF現在MP取得
0F8485STA $70DP($70)=A
0F8487PLAPull A
0F8488PHXPush X
0F8489LDX #$0070X=#$0070
0F848CJSL $C01295SR: $001295$00,x(3B)=$00,X(3B)/A(2B?) 剰余=A,$30
0F8490LDA $70A=DP($70)
0F8492PLXPull X
0F8493SECc=on
0F8494RTSreturn

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

  • SR: $0F84D7 ホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)(新SR)
0F84D7PHXPush X
0F84D8LDX #$001FX=#$001F
0F84DBJSL $C9FEFBSR: $09FEFB回復最小量取得(全バンク用)
0F84DFPLXPull X
0F84E0PHAPush A
0F84E1JSL $C46951SR: $046951 引数:1#$01 引数:2#$FE 引数:3#$FF職業ID取得
0F84E8CMP #$0003A>=#$0003?
0F84EBBCC #$09if(c==off) goto $0F84F6戦士・武闘家・魔法使い
0F84EDBEQ #$05if(z==on) goto $0F84F4僧侶
0F84EFCMP #$0007A>=#$0007?
0F84F2BCC #$02if(c==off) goto $0F84F6商人・遊び人・盗賊
0F84F4BRA #$09goto $0F84FF
0F84F6LDA $01,SA=Stack($01)
0F84F8RORA>>1
0F84F9CLCc=off
0F84FAADC $01,SA+=(Stack($01)+c)
0F84FCRORA>>1回復量を3/4する
0F84FDSTA $01,SStack($01)=A
0F84FFLDA $2BB8A=$2BB8HP差分
0F8502STZ $70DP($70)=#$00
0F8504STA $71DP($71)=A
0F8506PLAPull A
0F8507PHXPush X
0F8508LDX #$0070X=#$0070
0F850BJSL $C01295SR: $001295$00,x(3B)=$00,X(3B)/A(2B?) 剰余=A,$30
0F850FLDA $70A=DP($70)
0F8511PLXPull X
0F8512CMP #$0100A>=#$0100?
0F8515BCC #$01if(c==off) goto $0F85181回で回復するなら倍率を#$0100に設定
0F8517RTSreturn
0F8518LDA #$0100A=#$0100
0F851BRTSreturn
  • SR: $0F851C ベホイミ回復量最小値をベースとした回復倍率取得(非専門職を考慮)省略
  • SR: $0F8523 ベホマ回復量最小値をベースとした回復倍率取得(非専門職を考慮)省略

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

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

*2:専門職の場合

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。