DQ3 遊び人の遊びを変更する3

例の無限回廊の分岐数ですが、事実上制限がないことがわかり(実装次第ですが)、停滞していた作業が捗りそうです。ただ、ルートの動的分岐(ランダムで正解ルートが変わる)のは反対ルート(戻り)をどうするのかという問題があるので見送ることにしました。

さて、残りは役に立つ遊びの選択処理のみです。処理自体はパルプンテの結果選択処理がほぼそのまま使用できます。性別によって選択させる遊びを変えるようにするのも、特に難しいということもなく性別によってONにするビットを変えておき、ビットをOFFにするSRに渡すだけです。このためにパルプンテ同様遊びの配列を定義します。選択後、選ばれた遊びが現在のレベルで実行可能か判断し、実行不能な場合はc=offで抜け、通常の遊び選択処理が行われるようにします。これにより、低レベルのほうが特定の遊びが100%選択される事を防ぐことを意図しています。

  • データ: $02DC2C 役に立つ遊び戦闘行動IDリスト(2B*8)
  • SR: $02E247 役に立つ遊びを決定して返す(選択されたc=on)(新SR)
02E247 JSL $C2BE8A SR: $02BE8A 引数:1#$2E 性別取得
02E24C BCS #$05 if(c==on) goto $02E253
02E24E LDA #$007E A=#$007E 男用設定
02E251 BRA #$03 goto $02E256
02E253 LDA #$00BD A=#$00BD 女用設定
02E256 STA $00 DP($00)=A
02E258 LDX #$0000 X=#$0000
02E25B JSL $C01407 SR: $001407 乱数発生 $0000-FFFF dp,Xの1になっているビットをランダムで0にする?
02E25F BCC #$FE if(c==off) goto $02E25F
02E261 PHA Push A
02E262 JSL $C2C240 SR: $02C240 引数:1#$0A レベル取得
02E267 CMP #$0032 A>=#$0032? Lv50以上か
02E26A BCS #$08 if(c==on) goto $02E274
02E26C PLA Pull A
02E26D CMP #$0002 A>=#$0002? 選択結果がLv50以上で実行できる遊びか
02E270 BCS #$16 if(c==on) goto $02E288
02E272 BRA #$0C goto $02E280
02E274 CMP #$003C A>=#$003C? Lv60以上か
02E277 BCS #$06 if(c==on) goto $02E27F
02E279 PLA Pull A
02E27A CMP #$0006 A>=#$0006? 選択結果がLv60以上で実行できる遊びか
02E27D BCS #$09 if(c==on) goto $02E288
02E27F PLA Pull A
02E280 ASL A<<1
02E281 TAX X=A
02E282 LDA $C2DC2C,X A=$02DC2C+X
02E286 SEC c=on
02E287 RTS return
02E288 CLC c=off
02E289 RTS return

SR: $001407が何をするかと言うと、指定箇所の2バイトのデータのビットがONの部分に対してに対して、ランダムでビットをOFFにします。ONになっているビットが1つしかない場合にはc=onを同時に返してくるので、ビットを1つだけ残したい場合はc=onになるまで繰り返しコールする必要があります。さらに、c=onでリターンしてきた場合には、Aレジスタには残ったビットが下から数えて何番目か(0から開始、#$0080の場合は7、#$0008の場合は3)をセットします*1。なのでこの値を配列のインデックスとして使用できます。よくできてますね。この処理はすごろくの?マークで選択される結果の部分にも使用されています。すごろくの変更をするときにも使用するので覚えておいてください。

*1:c=offの場合には何がセットされるのか調べてません