DQ3 盗賊の登録機能分離3

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

  • SR: $03DAEB 登録所メイン
03DCCEJSL $CAFF59SR: $0AFF59登録所台詞16(登録完了+盗賊仲間に入れるか)
03DCD2NOP
03DCD3NOP

  • SR: $0AFF59 登録所台詞16(登録完了+盗賊仲間に入れるか)(新SR)
0AFF59JSL $CAFDD6SR: $0AFDD6盗賊登録中か(該当c=on)
0AFF5DBCS #$07if(c==on) goto $0AFF66
0AFF5FJSL $C1A92ESR: $01A92E 引数:1#$0B3Aメッセージ表示
0AFF65RTLreturn
0AFF66JSL $C1A92ESR: $01A92E 引数:1#$1097メッセージ表示
0AFF6CJSL $C9E637SR: $09E637盗賊登録所登録した新規PCを仲間に入れる処理
0AFF70RTLreturn

  • SR: $09E637 盗賊登録所登録した新規PCを仲間に入れる処理(新SR)
09E637PHPPush P Flag
09E638REP #$30m=off(A/M:16b) x=off(X/Y:16b)
09E63APHAPush A
09E63BPHXPush X
09E63CPHYPush Y
09E63DPHBPush DB
09E63EPEA #$7E7EPush #$7E7E
09E641PLBPull DB
09E642PLBPull DB
09E643JSL $CDAC66SR: $0DAC66はい/いいえ選択処理(はいc=on)
09E647BCS #$0Eif(c==on) goto $09E657
09E649JSL $C1A92ESR: $01A92E 引数:1#$10A8メッセージ表示
09E64FPLBPull DB
09E650REP #$30m=off(A/M:16b) x=off(X/Y:16b)
09E652PLYPull Y
09E653PLXPull X
09E654PLAPull A
09E655PLPPull P Flag
09E656RTLreturn
09E657JSR $E661SR: $09E661盗賊登録所仲間離脱処理(キャンセルc=on)
09E65ABCS #$EDif(c==on) goto $09E649キャンセルなら登録したPCをその場でパーティに入れない
09E65CJSR $E68FSR: $09E68F盗賊登録所仲間追加処理
09E65FBRA #$EEgoto $09E64F

  • SR: $09E661 盗賊登録所仲間離脱処理(キャンセルc=on)(新SR)
09E661JSL $C4297CSR: $04297C 引数:1#$01 引数:2#$FFパーティ人数取得
09E667CMP #$0004A==#$0004?
09E66ABEQ #$02if(z==on) goto $09E66E
09E66CCLCc=off
09E66DRTSreturn
09E66EJSL $C1A92ESR: $01A92E 引数:1#$10A7
09E674JSL $CDAC66SR: $0DAC66はい/いいえ選択処理(はいc=on)
09E678BCS #$02if(c==on) goto $09E67C
09E67ASECc=on
09E67BRTSreturn
09E67CPHYPush Y
09E67DJSL $C3FFB4SR: $03FFB4仲間離脱処理
09E681PLYPull Y
09E682JSL $C4297CSR: $04297C 引数:1#$01 引数:2#$FFパーティ人数取得
09E688CMP #$0004A==#$0004?
09E68BBEQ #$EDif(z==on) goto $09E67A
09E68DBRA #$DDgoto $09E66C

  • SR: $03FFB4 仲間離脱処理(新SR)
03FFB4JSR $D7BBSR: $03D7BB仲間離脱処理
03FFB7RTLreturn

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

前処理(PHA,PHXなど)

後処理(PLA,PLXなど)

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

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

前処理

コア処理

後処理

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

  • SR: $09E68F 盗賊登録所仲間追加処理(新SR)
09E68FTYAA=YYには登録したPCの開始アドレスがセットされている
09E690LDX #$0000X=#$0000
09E693LDY #$0000Y=#$0000
09E696CMP $36E8,XA==$36E8+X?PCアドレス配列から何番目に追加されているか取得する
09E699BEQ #$08if(z==on) goto $09E6A3
09E69BINXX++
09E69CINXX++
09E69DINYY++
09E69ECPX #$002CX>=#$002C?
09E6A1BCC #$F3if(c==off) goto $09E696
09E6A3TYAA=Y
09E6A4SECc=on
09E6A5SBC $36E2A-=($36E2+c)
09E6A8JSL $C42F5ESR: $042F5E 引数:1#$04 引数:2#$FF 引数:3#$FE選択したPCの登録インデックスを得る
09E6AFSTX $BE77$BE77=X
09E6B2JSL $C1A92ESR: $01A92E 引数:1#$0ADBメッセージ表示
09E6B8JSL $C42A6DSR: $042A6D 引数:1#$04 引数:2#$FF 引数:3#$01追加したキャラクターのデータ格納アドレス配列を更新する
09E6BFJSL $C3BD64SR: $03BD64PC再描画
09E6C3RTSreturn

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

コメント

タイトルとURLをコピーしました