DQ3 盗賊の登録機能分離3

前回のエントリで大体の実装は終わったので残りの「盗賊を登録した時にその場で仲間にするか」を実装します。4人パーティの場合はその場で誰かを外さないといけないといけないわけですが、これはルイーダの酒場の「仲間離脱処理」を呼ぶことで対応します(当然台詞もそのままだと女口調なので切り替える必要あり)。

  • SR: $03DAEB 登録所メイン
03DCCE JSL $CAFF59 SR: $0AFF59 登録所台詞16(登録完了+盗賊仲間に入れるか)
03DCD2 NOP
03DCD3 NOP
  • SR: $0AFF59 登録所台詞16(登録完了+盗賊仲間に入れるか)(新SR)
0AFF59 JSL $CAFDD6 SR: $0AFDD6 盗賊登録中か(該当c=on)
0AFF5D BCS #$07 if(c==on) goto $0AFF66
0AFF5F JSL $C1A92E SR: $01A92E 引数:1#$0B3A メッセージ表示
0AFF65 RTL return
0AFF66 JSL $C1A92E SR: $01A92E 引数:1#$1097 メッセージ表示
0AFF6C JSL $C9E637 SR: $09E637 盗賊登録所登録した新規PCを仲間に入れる処理
0AFF70 RTL return
  • SR: $09E637 盗賊登録所登録した新規PCを仲間に入れる処理(新SR)
09E637 PHP Push P Flag
09E638 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
09E63A PHA Push A
09E63B PHX Push X
09E63C PHY Push Y
09E63D PHB Push DB
09E63E PEA #$7E7E Push #$7E7E
09E641 PLB Pull DB
09E642 PLB Pull DB
09E643 JSL $CDAC66 SR: $0DAC66 はい/いいえ選択処理(はいc=on)
09E647 BCS #$0E if(c==on) goto $09E657
09E649 JSL $C1A92E SR: $01A92E 引数:1#$10A8 メッセージ表示
09E64F PLB Pull DB
09E650 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
09E652 PLY Pull Y
09E653 PLX Pull X
09E654 PLA Pull A
09E655 PLP Pull P Flag
09E656 RTL return
09E657 JSR $E661 SR: $09E661 盗賊登録所仲間離脱処理(キャンセルc=on)
09E65A BCS #$ED if(c==on) goto $09E649 キャンセルなら登録したPCをその場でパーティに入れない
09E65C JSR $E68F SR: $09E68F 盗賊登録所仲間追加処理
09E65F BRA #$EE goto $09E64F
  • SR: $09E661 盗賊登録所仲間離脱処理(キャンセルc=on)(新SR)
09E661 JSL $C4297C SR: $04297C 引数:1#$01 引数:2#$FF パーティ人数取得
09E667 CMP #$0004 A==#$0004?
09E66A BEQ #$02 if(z==on) goto $09E66E
09E66C CLC c=off
09E66D RTS return
09E66E JSL $C1A92E SR: $01A92E 引数:1#$10A7
09E674 JSL $CDAC66 SR: $0DAC66 はい/いいえ選択処理(はいc=on)
09E678 BCS #$02 if(c==on) goto $09E67C
09E67A SEC c=on
09E67B RTS return
09E67C PHY Push Y
09E67D JSL $C3FFB4 SR: $03FFB4 仲間離脱処理
09E681 PLY Pull Y
09E682 JSL $C4297C SR: $04297C 引数:1#$01 引数:2#$FF パーティ人数取得
09E688 CMP #$0004 A==#$0004?
09E68B BEQ #$ED if(z==on) goto $09E67A
09E68D BRA #$DD goto $09E66C
  • SR: $03FFB4 仲間離脱処理(新SR)
03FFB4 JSR $D7BB SR: $03D7BB 仲間離脱処理
03FFB7 RTL return

このSRはオリジナルの仲間離脱処理がバンク$03内でしかコールできないため別バンクからもコールできるようにしているだけです。仲間離脱処理についてはほどんど台詞の切り替えしかないので省略します。余談ですが、この頃からコードスタイルが変わってきていて

前処理(PHA,PHXなど)

後処理(PLA,PLXなど)

コア処理(最後にgotoで後処理に飛ぶ)

のようにコアとなる処理を後に書くようになってきました。理由はコアの処理を変更することが多くて

前処理

コア処理

後処理

のようにしてしまうと、前処理でBCCなどのIF文で後処理に飛んでいたりするとコア処理の修正により変更箇所が増えるという理由です。1バイトでも飛ぶ先をミスるとすぐバグるのでジャンプ先の扱いには注意を払う必要があるので、コア処理の変更に伴っていじる必要のある場所を減らすのはバグを減らすという意味で重要になってきます(少なくとも自分にとっては)。特にコードを書いてからしばらくたって再度見なおす必要が出てきた場合、どういう意図でジャンプさせてるのかといったことを完璧に忘れていたりするので(コメント書けないし…)、非常に困ります。xkasではラベルを使うし、コメントも書けるだろうからこの辺意識しなくていいんだろうなあと思ったり思わなかったり。

  • SR: $09E68F 盗賊登録所仲間追加処理(新SR)
09E68F TYA A=Y Yには登録したPCの開始アドレスがセットされている
09E690 LDX #$0000 X=#$0000
09E693 LDY #$0000 Y=#$0000
09E696 CMP $36E8,X A==$36E8+X? PCアドレス配列から何番目に追加されているか取得する
09E699 BEQ #$08 if(z==on) goto $09E6A3
09E69B INX X++
09E69C INX X++
09E69D INY Y++
09E69E CPX #$002C X>=#$002C?
09E6A1 BCC #$F3 if(c==off) goto $09E696
09E6A3 TYA A=Y
09E6A4 SEC c=on
09E6A5 SBC $36E2 A-=($36E2+c)
09E6A8 JSL $C42F5E SR: $042F5E 引数:1#$04 引数:2#$FF 引数:3#$FE 選択したPCの登録インデックスを得る
09E6AF STX $BE77 $BE77=X
09E6B2 JSL $C1A92E SR: $01A92E 引数:1#$0ADB メッセージ表示
09E6B8 JSL $C42A6D SR: $042A6D 引数:1#$04 引数:2#$FF 引数:3#$01 追加したキャラクターのデータ格納アドレス配列を更新する
09E6BF JSL $C3BD64 SR: $03BD64 PC再描画
09E6C3 RTS return

7E36E2,E4,E6,E8-はPCに関する重要な情報が保持されています。このあたりを理解できると仲間の一時的な離脱・ゲストの加入などが思いのままになりますが、操作処理にバグを入れてしまうと登録したPCの情報が消えてしまったりするので注意が必要です。この辺についてはまた別のエントリで説明します。