前回のエントリで大体の実装は終わったので残りの「盗賊を登録した時にその場で仲間にするか」を実装します。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の情報が消えてしまったりするので注意が必要です。この辺についてはまた別のエントリで説明します。
コメント