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

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

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

  • データ: $02DC2C 役に立つ遊び戦闘行動IDリスト(2B*8)
  • SR: $02E247 役に立つ遊びを決定して返す(選択されたc=on)(新SR)
02E247JSL $C2BE8ASR: $02BE8A 引数:1#$2E性別取得
02E24CBCS #$05if(c==on) goto $02E253
02E24ELDA #$007EA=#$007E男用設定
02E251BRA #$03goto $02E256
02E253LDA #$00BDA=#$00BD女用設定
02E256STA $00DP($00)=A
02E258LDX #$0000X=#$0000
02E25BJSL $C01407SR: $001407乱数発生 $0000-FFFF dp,Xの1になっているビットをランダムで0にする?
02E25FBCC #$FEif(c==off) goto $02E25F
02E261PHAPush A
02E262JSL $C2C240SR: $02C240 引数:1#$0Aレベル取得
02E267CMP #$0032A>=#$0032?Lv50以上か
02E26ABCS #$08if(c==on) goto $02E274
02E26CPLAPull A
02E26DCMP #$0002A>=#$0002?選択結果がLv50以上で実行できる遊びか
02E270BCS #$16if(c==on) goto $02E288
02E272BRA #$0Cgoto $02E280
02E274CMP #$003CA>=#$003C?Lv60以上か
02E277BCS #$06if(c==on) goto $02E27F
02E279PLAPull A
02E27ACMP #$0006A>=#$0006?選択結果がLv60以上で実行できる遊びか
02E27DBCS #$09if(c==on) goto $02E288
02E27FPLAPull A
02E280ASLA<<1
02E281TAXX=A
02E282LDA $C2DC2C,XA=$02DC2C+X
02E286SECc=on
02E287RTSreturn
02E288CLCc=off
02E289RTSreturn

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

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

コメント

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