今回から実装に移ります。まず、ベホマラー・ベホマズンを使わないようにします。
- SR: $091F59 呪文習得状態・ステータス異常チェック
| 略 |
|
|
|
| 091FF8 |
BRA #$06 |
goto $092000 |
|
| 略 |
|
|
|
| 092006 |
BRA #$06 |
goto $09200E |
|
| 略 |
|
|
|
次に単体回復の部分の変更を行います。まずは大枠から。
| 略 |
|
|
|
| 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初期化・クリア |
| 略 |
|
|
|
| 略 |
|
|
|
| 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 |
死亡・麻痺・般若の面装備中の場合はスキップ |
| 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に対して、ホイミ・ベホイミ・ベホマの回復倍率は全て#$0100未満になりますが、回復倍率だけで見るとベホマが選択されてしまいます(正しくはホイミが選択されるべき)。これを避けるために回復倍率の最小値は#$0100とし、呪文選択時には回復倍率が同じ場合は下位の呪文を優先するようにします(上記の例の場合、回復倍率が全て#$0100になるのでホイミが選択される)。ベホイミはほとんど同じ、ベホマは3/4の代わりに賢さを取得して同じ処理をします。これでまず必要な情報が出揃ったことになります。次にこの中から選択を行います。今回はここまで。
コメント