裏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イメージ改造・解析 > 店の出現率