DQ3 格闘場の掛け金を遊び人がいる場合に4倍にする

ASL(A<<1)2回で4倍になるのが手軽だったのでとりあえず4倍にしてしまいました。思いっきり手抜きです。それと遊び人が先頭にいなくても条件に当てはまるようにしました。

  • SR: $03EE64 格闘場共通
03EE73 JSR $F717 SR: $03F717
03EE76 BCS #$07 if(c==on) goto $03EE7F
03EE78 NOP

格闘場の処理は全てSR: $03EE64で行われます。これまたうまいこと空きがないので「通常の掛け金計算処理+Lv10以上の遊び人がいる場合に掛け金を4倍にしてメッセージ表示」をセットにして実装することにします。通常の場合は掛け金の計算だけして所定の変数($7E3376)にセットしてリターンし、通常のメッセージ表示(#$09BB)を行います。遊び人がいる場合は掛け金計算+メッセージ表示を行ってリターンし、c=onを返すことで通常のメッセージ表示処理をスキップし、賭けるモンスターのリストを表示する処理まで飛ばします。

  • SR: $03F717 Lv10以上の遊び人がパーティにいる場合は掛け金を4倍にしてメッセージ表示(該当c=on)(新SR)
03F717 PHA Push A
03F718 PHX Push X
03F719 JSL $C4297C SR: $04297C 引数:1#$01 引数:2#$FE
03F71F DEX X–
03F720 JSL $C46951 SR: $046951 引数:1#$01 引数:2#$FE 引数:3#$FF
03F727 CMP #$0005 A==#$0005?
03F72A BNE #$0C if(z==off) goto $03F738
03F72C JSL $C42FEB SR: $042FEB 引数:1#$01 引数:2#$FE 引数:3#$FF
03F733 CMP #$000A A>=#$000A?
03F736 BCS #$0D if(c==on) goto $03F745
03F738 DEX X–
03F739 BPL #$E5 if(n==off) goto $03F720
03F73B PLX Pull X
03F73C PLA Pull A
03F73D JSR $EF29 SR: $03EF29
03F740 STA $3376 $3376=A
03F743 CLC c=off
03F744 RTS return
03F745 PLX Pull X
03F746 PLA Pull A
03F747 ASL A<<1
03F748 PHA Push A
03F749 ASL A<<1
03F74A ASL A<<1
03F74B ADC $01,S A+=(Stack($01)+c)
03F74D ASL A<<1
03F74E ASL A<<1
03F74F STZ $BE82 $BE82=#$00
03F752 STA $BE81 $BE81=A
03F755 PLX Pull X
03F756 JSL $C1A92E SR: $01A92E 引数:1#$0FD5
03F75C STA $3376 $3376=A
03F75F SEC c=on
03F760 RTS return

処理自体はそれほど複雑ではありません。SR: $04297C…でパーティ人数をXレジスタにセットし0になるまでループします。SR: $046951…で職業IDをAレジスタにセットし、職業IDが遊び人(#$05)であれば、SR: $042FEB…でレベルを取得しLvが10以上かチェックします。条件に該当しなければ通常どおりSR: $03EF29でLv×10の掛け金計算を行い結果を$7E3376にセットしてc=offでリターンします。条件に該当する場合は、Lv×10をしたあと($03F747-4B)、さらに4倍し(03F74D-4E)し、新しく追加したメッセージ(#$0FD5)を表示してc=onにしてリターンします。これで変更は終わりです。

こういうRAMの役割がはっきり判明している部分の修正は比較的楽なんですけどね…。変更の範囲が低レベル(画像の操作とか)になるともうなにがなにやらさっぱりです。