DQ3 ぐんたいよび実装2

とりあえずダメージ部分の実装が終わったので次は所持金の確認と後処理での所持金減額です。レベル99での消費金額は50Gx99=4950Gです。というわけで、まず所持金の上1バイトを調べて1以上であれば65536Gは持ってるわけでOK。そうでなければ下位2バイトの値と消費金額を比較して足りない場合はどこかにフラグをセットする、ということになります。さらに、メガザルの時同様、最後に後処理を追加して必要な金額の支払いor金がないのメッセージ表示をする必要があります。

  • SR: $027D53 戦闘行動実行処理メイン
027D93 JSR $D590 SR: $02D590
027D96 BCS #$22 if(c==on) goto $027DBA
  • SR: $02D590 所持金を調べてぐんたいよびが可能かしらべる(可能c=off)(新SR)
02D590 LDA $23EE A=$23EE
02D593 CMP #$0114 A==#$0114?
02D596 BNE #$46 if(z==off) goto $02D5DE
02D598 LDA $3698 A=$3698
02D59B AND #$00FF A&=#$00FF
02D59E CMP #$0001 A>=#$0001?
02D5A1 BCS #$3B if(c==on) goto $02D5DE
02D5A3 LDA $3696 A=$3696
02D5A6 PHA Push A
02D5A7 LDA $2428 A=$2428
02D5AA PHA Push A
02D5AB LDA $23E4 A=$23E4
02D5AE STA $2428 $2428=A
02D5B1 JSL $C2C240 SR: $02C240 引数:1#$0A
02D5B6 XBA Exchange A(HighByte) and A(LowByte)
02D5B7 SEP #$20 m=on(A/M:8b)
02D5B9 LDA #$32 A=#$32
02D5BB REP #$20 m=off(A/M:16b)
02D5BD JSL $C01098 SR: $001098
02D5C1 STA $00 DP($00)=A
02D5C3 PLA Pull A
02D5C4 STA $2428 $2428=A
02D5C7 PLA Pull A
02D5C8 CMP $00 A>=DP($00)?
02D5CA BCS #$12 if(c==on) goto $02D5DE
02D5CC LDA #$0001 A=#$0001
02D5CF PEA #$23AE Push #$23AE
02D5D2 PEA #$0004 Push #$0004
02D5D5 PEA #$7E00 Push #$7E00
02D5D8 JSL $C902E9 SR: $0902E9
02D5DC SEC c=on
02D5DD RTS return
02D5DE CLC c=off
02D5DF RTS return

きせきのつるぎの実装でSR: $027D53に6バイトの余裕があるので割り込ませてしまいます。普段はあんまりやらないんですが。割り込ませた場合はSR内の全ての分岐命令、ジャンプ命令のアドレスを確認しておきましょう。さて、SR: $02D590の方ですが、まず戦闘行動IDをしらべてぐんたいよび(#$0114)でなければ即座にc=offをセットしてリターンします。次に$02D598-02D5A1では所持金(全3バイト)の上1バイトを調べて>=1であれば65536G以上もっているのでこれまたc=offをセットしてリターンします。そうでない場合は所持金が2バイト未満なので、現在の術者($7E23E4)のレベルをSR: $02C240 引数1:#$0Aで取得し、SR: $001098で50とかけあわせあらかじめ取得しておいた所持金の下2バイトと比較します。比較の結果、所持金のほうが低い場合は$7E23AEの3ビット目をONにしてc=onにしてリターンします。$7E23AEの3ビット目はメガンテ時に術者が志望するかの判断のために使用しますが、今回はぐんたいよび時に所持金が不足している場合に使用します。

  • SR: $02D5E0 ぐんたいよびの後処理(金支払いなど)(新SR)
02D5E0 PEA #$23AE Push #$23AE
02D5E3 PEA #$0004 Push #$0004
02D5E6 PEA #$7E00 Push #$7E00
02D5E9 JSL $C9029E SR: $09029E
02D5ED CMP #$0001 A==#$0001?
02D5F0 BNE #$07 if(z==off) goto $02D5F9
02D5F2 JSL $C1A867 SR: $01A867 引数:1#$017B
02D5F8 RTS return
02D5F9 LDA $23E4 A=$23E4
02D5FC STA $2428 $2428=A
02D5FF JSL $C2C240 SR: $02C240 引数:1#$0A
02D604 XBA Exchange A(HighByte) and A(LowByte)
02D605 SEP #$20 m=on(A/M:8b)
02D607 LDA #$32 A=#$32
02D609 REP #$20 m=off(A/M:16b)
02D60B JSL $C01098 SR: $001098
02D60F STZ $00 DP($00)=#$00
02D611 STZ $01 DP($01)=#$00
02D613 STA $00 DP($00)=A
02D615 JSL $C45B66 SR: $045B66 引数:1#$00
02D61A RTS return

次に後処理の実装を行います。前準備としてメガザルの実装で拡張したSR: $028A96 特殊戦闘行動追加処理で使用する配列にぐんたいよびの戦闘行動ID(#$0114)とSRアドレス下位2バイト($D5E0)を追加しておいてください。さて、先ほどSR: $02D590で所持金が足りない場合は$7E23AEの3ビット目が1になるように実装しました。なのでまずこのビットを調べます。ONの場合は先頭メッセージ「[BC]しかし おかねが たりない![AD]ぐんたいは かえっていった![B1]」を表示して終わり、そうでない場合はぐんたいよびのコストを先ほど同様計算して$00にセットし、所持金減額SR: $045B66を呼び出します。これでようやく2ステップ目が終わりました。

しかしこの人たち金がなくても何度も来るって律儀だなあ・・・

コメント

  1. JST より:

    はじめまして、某スレから来ました。
    面白そうなパッチを作ってますね~
    DQ3は好きな作品なので是非プレイしてみたいです。
    某スレはたまに変な人が沸きますが気にせず頑張ってください^^

    管理者より返信:

    コメントありがとうございます。公開できるところまでこぎつけるように努力する次第です。生暖かく見守っていてくださいwww。