例の無限回廊の分岐数ですが、事実上制限がないことがわかり(実装次第ですが)、停滞していた作業が捗りそうです。ただ、ルートの動的分岐(ランダムで正解ルートが変わる)のは反対ルート(戻り)をどうするのかという問題があるので見送ることにしました。
さて、残りは役に立つ遊びの選択処理のみです。処理自体はパルプンテの結果選択処理がほぼそのまま使用できます。性別によって選択させる遊びを変えるようにするのも、特に難しいということもなく性別によって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の場合には何がセットされるのか調べてません
コメント