とりあえずダメージ部分の実装が終わったので次は所持金の確認と後処理での所持金減額です。レベル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ステップ目が終わりました。
しかしこの人たち金がなくても何度も来るって律儀だなあ・・・
コメント
はじめまして、某スレから来ました。
面白そうなパッチを作ってますね~
DQ3は好きな作品なので是非プレイしてみたいです。
某スレはたまに変な人が沸きますが気にせず頑張ってください^^
コメントありがとうございます。公開できるところまでこぎつけるように努力する次第です。生暖かく見守っていてくださいwww。