DQ3 盗賊の登録機能分離2

今回から実装に入ります。

  • SR: $03DAEB 登録所メイン
03DAEB PHP Push P Flag
03DAEC REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
03DAEE PHA Push A
03DAEF PHX Push X
03DAF0 PHY Push Y
03DAF1 PHB Push DB
03DAF2 PEA #$7E7E Push #$7E7E
03DAF5 PLB Pull DB
03DAF6 PLB Pull DB
03DAF7 JSL $CAFDE2 SR: $0AFDE2 登録所台詞1(登録しますか)
  • SR: $0AFDE2 登録所台詞1(登録しますか)(新SR)
0AFDE2 JSL $CAFDD6 SR: $0AFDD6 盗賊登録中か(該当c=on)
0AFDE6 BCS #$27 if(c==on) goto $0AFE0F
0AFDE8 JSL $C1A92E SR: $01A92E 引数:1#$0B31 メッセージ表示
0AFDEE JSL $C909AE SR: $0909AE 引数:1#$7E353A 引数:2#$0014 RAM上情報取得
0AFDF7 BCS #$0F if(c==on) goto $0AFE08
0AFDF9 JSL $C1A92E SR: $01A92E 引数:1#$0B32
0AFDFF JSL $C908F0 SR: $0908F0 引数:1#$7E353A 引数:2#$0014 RAM上情報変更(ON)
0AFE08 JSL $C1A92E SR: $01A92E 引数:1#$0B33
0AFE0E RTL return
0AFE0F JSL $C1A92E SR: $01A92E 引数:1#$108C 盗賊登録所用のセリフ
0AFE15 RTL return
  • SR: $0AFDD6 盗賊登録中か(該当c=on)(新SR)(省略)

基本的にフラグを見て表示するメッセージを1対1対応で切り替えて行くだけなので省略します。1番目のポイントは職業選択部分の処理です。

  • SR: $03DAEB 登録所メイン
03DBB2 JSL $CAFE66 SR: $0AFE66 登録所職業決定処理
03DBB6 NOP
03DBB7 BCS #$EB if(c==on) goto $03DBA4 c=onならキャンセル
03DBB9 STA $4063 $4063=A
  • SR: $0AFE66 登録所職業決定処理(新SR)
0AFE66 JSL $CAFDD6 SR: $0AFDD6 盗賊登録中か(該当c=on)
0AFE6A BCS #$06 if(c==on) goto $0AFE72
0AFE6C JSL $C32251 SR: $032251 引数:1#$A1 ウィンドウ表示
0AFE71 RTL return
0AFE72 LDA #$0006 A=#$0006 盗賊登録中なら職業IDは6(盗賊)で固定
0AFE75 CLC c=off キャンセルはなし
0AFE76 RTL return

ここはもともとは職業選択用のウィンドウ(ID:#$A1)を表示し、c=onなら登録処理をキャンセルする処理に飛ばす、ということをしていました。従ってアリアハンの登録所なら職業選択用のウィンドウ(盗賊は除く)を表示し、盗賊登録所ならウィンドウは表示せず盗賊(職業IDは6)を返す、とすればOKです。また、職業選択用のウィンドウの表示内容も変更する必要があります。

  • SR: $03F540 ウィンドウ描画SR_00A1
03F540 JSL $C3FF72 SR: $03FF72 新規PC追加用職業リスト準備
  • SR: $03FF72 新規PC追加用職業リスト準備(新SR)
03FF72 LDA #$0006 A=#$0006
03FF75 STA $40F7 $40F7=A
03FF78 LDA #$0000 A=#$0000
03FF7B LDX #$0000 X=#$0000
03FF7E STA $40F9,X $40F9+X=A
03FF81 INC A++
03FF82 INX X++
03FF83 INX X++
03FF84 CMP #$0006 A>=#$0006?
03FF87 BCC #$F5 if(c==off) goto $03FF7E
03FF89 RTL return

あんまり良くないんですが、必要なIDが0から5までなのでハードコードでセットするSRを書いてしまいました。本当ならアリアハン登録所で選択できる職業IDの配列を作ってそのIDをリストするとかしないといけないところです。とりあえず前半はここまで。残りは盗賊を登録した時にその場で外す仲間を選択できるようにする処理です。