裏CHUNSOFT > ROMイメージ改造・解析 > 店の出現率

店の出現率

知られていそうで知られていない店の出現率を調べてみました。

039382  08              PHP             ; 
039383  E2 30           SEP #$30        ; 
039385  22 E6 27 C6     JSL $0627E6     ; $00 = 01(こばみ谷),02(食神のほこら),03(掛軸裏の洞窟),04(フェイの最終問題)
039389  A5 00           LDA $00         ; "A" = $00
03938B  C9 01           CMP #$01        ; 
03938D  D0 0E           BNE #$0E        ; "A" != 01(こばみ谷) のとき03939Dへ
03938F  22 71 27 C6     JSL $062771     ; $00 = (フロア)
039393  A5 00           LDA $00         ; "A" = $00
039395  C9 08           CMP #$08        ; 
039397  90 49           BCC #$49        ; "A" < 08(8F) のとき0395E2へ
039399  C9 0F           CMP #$0F        ; 
03939B  B0 45           BCS #$45        ; "A" >= 0F(15F) のとき0395E2へ

0395E2にジャンプすると、そのフロアに店は存在しないことになります。 見ての通り、こばみ谷では8〜14Fにしか店は存在しないということです。

03939D  AF 79 C1 7E     LDA $7EC179     ; "A" = (地形のタイプ)
0393A1  C9 03           CMP #$03        ; 
0393A3  D0 0A           BNE #$0A        ; "A" = 03(普通) のとき0395AFへ
0393A5  22 5F F6 C3     JSL $03F65F     ; $00 = (乱数)
0393A9  A5 00           LDA $00         ; "A" = $00
0393AB  89 03           BIT #$03        ; 
0393AD  D0 33           BNE #$33        ; 乱数の下位2ビットが00でないとき0395E2へ

普通の地形の場合、1/4の確率で店を出現させようとします。 特殊地形の場合、無条件で店を出現させようとします。

それでは2分割の場合はどうなるんだ、と私も思いましたが、必ずモンスターハウスがある地形の場合、そもそもこのルーチンは呼び出されません。 飛び地や2分裂の場合は、次の命令を見れば納得するかと思います。

0393AF  AF 8E BE 7E     LDA $7EBE8E     ; "A" = (部屋の数)
0393B3  AA              TAX             ; "X" = "A"
0393B4  CA              DEX             ; "X" --
0393B5  30 2B           BMI #$2B        ; "X" < 00 のとき0395E2へ
0393B7  BF 34 C1 7E     LDA $7EC134+"X" ; "A" = $7EC134+"X" ("X"番目の部屋の入口の数)
0393BB  C9 01           CMP #$01        ; 
0393BD  D0 F5           BNE #$F5        ; "A" != 01 のとき0395B4へ
0393BF  20 E4 93        JSR $93E4       ; 0393E4へ

入口が1つしかない部屋を探します。もしそれが1つもなければ店はありません。 ということで、入口が1つしかない部屋が存在しない飛び地や2分裂の場合はここでおしまいです。 外周や一本道でも、運悪く入口が1つしかない部屋がなければ店はありません(格子は入口が1つしかない部屋が必ずあるので、必ず店があります)。

0393E4  DA              PHX             ; 
0393E5  86 00           STX $00         ; $00 = "X"
0393E7  64 01           STZ $01         ; $01 = 00
0393E9  22 49 65 C3     JSL $036549     ; ($00,$01) = ($00番目の部屋の$01番目の入口の座標)
0393ED  A5 01           LDA $01         ; "A" = $01 (Y座標)
0393EF  48              PHA             ; 
0393F0  A5 00           LDA $00         ; "A" = $00 (X座標)
0393F2  48              PHA             ; 
0393F3  A0 00           LDY #$00        ; "Y" = 00
0393F5  A2 03           LDX #$03        ; "X" = 03
0393F7  A3 01           LDA $01,s       ; "A" = $01,s (X座標)
0393F9  18              CLC             ; 
0393FA  7F ED 92 C3     ADC $0392ED+"X" ; "A" += $0392ED+"X" (00 00 FF 01)
0393FE  85 00           STA $00         ; $00 = "A"
039400  A3 02           LDA $02,s       ; "A" = $02,s (Y座標)
039402  18              CLC             ; 
039403  7F F5 92 C3     ADC $0392F5+"X" ; "A" += $0392F5+"X" (FF 01 00 00)
039407  85 01           STA $01         ; $01 = "A"
039409  DA              PHX             ; 
03940A  22 A5 6C C3     JSL $036CA5     ; $00 = (($00,$01)の地形コード)
03940E  FA              PLX             ; 
03940F  A5 00           LDA $00         ; "A" = $00
039411  89 80           BIT #$80        ; 
039413  F0 07           BEQ #$07        ; "A" = 00〜7F のとき03961Cへ
039415  89 40           BIT #$40        ; 
039417  D0 03           BNE #$03        ; "A" = C0〜FF のとき03961Cへ
039419  C8              INY             ; "Y" ++
03941A  80 03           BRA #$03        ; 03961Fへ
03941C  CA              DEX             ; "X" --
03941D  10 D8           BPL #$D8        ; "X" >= 00 のとき0393F7へ
03941F  84 00           STY $00         ; $00 = "Y"
039421  68              PLA             ; 
039422  68              PLA             ; 
039423  FA              PLX             ; 
039424  60              RTS             ; 

ここでは、部屋の入口の周囲4マスが水脈かどうかを調べています。 地形コード80h〜BFhの中にあるのは、水脈のB0hしかありません。 水脈がなければ$00に00hを返し、水脈があれば$00に01hを返します。 部屋の入口に水脈があると、それと店主の間をすり抜けて店から出られてしまうので、そのような部屋には店を出なくします。

最近のシレンではこのチェックはされていないようですが、どうしてでしょうか。

0393C2  A5 00           LDA $00         ; "A" = $00
0393C4  D0 1C           BNE #$1C        ; "A" != 00 のとき0395E2へ
0393C6  8A              TXA             ; "A" = "X"
0393C7  8F 74 C1 7E     STA $7EC174     ; $7EC174 = "A" (店の部屋番号)
0393CB  BF 66 C1 7E     LDA $7EC166+"X" ; "A" = $7EC166+"X" ("X"番目の部屋情報)
0393CF  09 20           ORA #$20        ; 店であることを示す
0393D1  9F 66 C1 7E     STA $7EC166+"X" ; $7EC166+"X" = "A"
0393D5  22 5F F6 C3     JSL $03F65F     ; $00 = (乱数)
0393D9  A5 00           LDA $00         ; "A" = $00
0393DB  29 03           AND #$03        ; "A" %= 04
0393DD  0A              ASL             ; "A" *= 02
0393DE  AA              TAX             ; "X" = "A"
0393DF  7C 25 94        JMP ($9425+"X") ; 結果だけ言いますが、"X" = 00,02,04 のとき通常の店、"X" = 06 のとき専門店になります。

店にしようとした部屋の入口に水脈があった場合、別の部屋を調べるということはせずに、そのフロアには店なしとなってしまいます。

以上をまとめると、通常の地形の場合は1/4の確率で、入口が1つしかない部屋があり(複数ある場合は最も部屋番号の大きいものを調べる)、尚かつその入口が水脈に接していない場合に店がある、ということになります。 これは、実際の出現率を求めるのは無理ですね。

2009年3月1日更新

裏CHUNSOFT > ROMイメージ改造・解析 > 店の出現率