裏CHUNSOFT > ROMイメージ改造・解析 > 出現する罠の決定

出現する罠の決定

基礎知識

そのフロアに出現する罠リストは、7EC196h〜7EC1A0hにあります。 うち7EC19Ahは必ず落とし穴(00h)で、残りがフロア毎に変わる罠となります。 罠のコード表は没罠設置2を参照して下さい。

罠には出やすい罠と出にくい罠があって、出やすい罠はトラばさみ、バネ、落石スイッチ、地雷、大型地雷、ワナの罠の6種類で、この中から4種類が選ばれます(7EC196h〜7EC199hに書かれます)。 出にくい罠は毒矢の罠、睡眠ガス、転び石、サビ罠、警報スイッチ、召喚スイッチ、装備はずし、空腹スイッチ、デロデロの湯、回転盤、幻覚ガス、低速スイッチ、丸太の罠の13種類で、この中から6種類が選ばれます(7EC19Bh〜7EC19Fhに書かれます)。

こうして、そのフロアに出現する11種類の罠が決定されます。 但し、ダンジョンによっては例外処理があるものもあります。 それは以下の、出現する罠を決定するルーチンの逆アセンブルリストで解説していきます。

出現する罠を決定するルーチン

03D309  A0 0A           LDY #$0A        ; "Y" = 0A
03D30B  A9 FF           LDA #$FF        ; "A" = FF
03D30D  99 96 C1        STA $C196+"Y"   ; $C196+"Y" = "A"
03D310  88              DEY             ; "Y" --
03D311  10 FA           BPL #$FA        ; (上の結果) >= 00 のとき03D309へ

まず、前のフロアの罠リストを一旦FFhで埋めます。

03D313  64 06           STZ $06         ; $06 = 00
03D315  22 E6 27 C6     JSL $0627E6     ; $00 = 01(こばみ谷),02(食神のほこら),03(掛軸裏の洞窟),04(フェイの最終問題)
03D319  A5 00           LDA $00         ; "A" = $00
03D31B  C9 03           CMP #$03        ; 
03D31D  D0 02           BNE #$02        ; "A" != 03 のとき03D321へ
03D31F  E6 06           INC $06         ; $06 ++
03D321  A9 00           LDA #$00        ; "A" = 00(落とし穴)
03D323  8D 9A C1        STA $C19A       ; $C19A = "A"
03D326  A5 06           LDA $06         ; "A" = $06
03D328  F0 0E           BEQ #$0E        ; "A" = 00 のとき03D338へ
03D32A  64 04           STZ $04         ; $04 = 00
03D32C  22 5F F6 C3     JSL $03F65F     ; $00 = (乱数)
03D330  A5 00           LDA $00         ; "A" = $00
03D332  89 07           BIT #$07        ; 
03D334  F0 02           BEQ #$02        ; "A" and 07 = 00 のとき03D338へ
03D336  E6 04           INC $04         ; $04 ++

$06は掛軸裏の洞窟のときに01h、それ以外のときに00hをとることが分かります。 7EC19Ahは必ず00h(落とし穴)になります。 その後、$06が01h(掛軸裏の洞窟)のとき限定で、(乱数) and 07hが00h以外のときに$04=01h、00hのときに$04=00hにする処理があります。 一体これは何に使われるのでしょう。

03D338  A0 03           LDY #$03        ; "Y" = 03
03D33A  5A              PHY             ; "Y"をスタックにプッシュ
03D33B  22 5F F6 C3     JSL $03F65F     ; $00 = (乱数)
03D33F  A5 00           LDA $00         ; "A" = $00
03D341  29 07           AND #$07        ; "A" = "A" and 07
03D343  C9 06           CMP #$06        ; 
03D345  B0 F4           BCS #$F4        ; "A" >= 06 のとき乱数生成からやり直し("A" = 00〜05 にする)
03D347  AA              TAX             ; "X" = "A"
03D348  BF 98 D3 C3     LDA $03D398+"X" ; "A" = $03D398+"X" ("X"番目の出やすい罠)
03D34C  A6 06           LDX $06         ; "X" = $06
03D34E  F0 08           BEQ #$08        ; "X" = 00 (掛軸裏の洞窟ではない)のとき03D358へ
03D350  A6 04           LDX $04         ; "X" = $04
03D352  F0 04           BEQ #$04        ; $04 = 00 のとき03D358へ
03D354  C9 10           CMP #$10        ; 
03D356  F0 E3           BEQ #$E3        ; "A" = 10(ワナの罠) のとき乱数生成からやり直し
03D358  A0 04           LDY #$04        ; "Y" = 04
03D35A  D9 96 C1        CMP $C196+"Y"   ; 
03D35D  F0 DC           BEQ #$DC        ; "A" = $C196+"Y" (既に設定された罠と被った)のとき乱数生成からやり直し
03D35F  88              DEY             ; "Y" --
03D360  10 F8           BPL #$F8        ; (上の結果) >= 00 のとき03D35Aへ
03D362  7A              PLY             ; "Y"にスタックからプル
03D363  99 96 C1        STA $C196+"Y"   ; $C196+"Y" = "A" (罠を設定する)
03D366  88              DEY             ; "Y" --
03D367  10 D1           BPL #$D1        ; (上の結果) >= 00 のとき03D33Aへ

続いて出やすい罠の中から出現する罠を選択します。 00h〜05hの乱数を発生させて、出やすい罠6種類の中から1つを選択しています。 そして、$06!=00h(掛軸裏の洞窟)のとき限定で、$04=00hでないときにワナの罠が選択されると乱数生成からやり直しになっています。 つまり、掛軸裏の洞窟では7/8の確率でワナの罠を決して出なくするようになっています。 残りの1/8になってもワナの罠が必ず選択されるとは限りませんから、道理で掛軸裏の洞窟ではワナの罠だけ出現率がかなり低い訳ですね。

後は、既に設定された罠と被らないようにしながら罠を設定していきます。 なぜか$C196+04(=7EC19A=必ず落とし穴)とも比べていますが、出やすい罠の中に落とし穴はないのでこれに意味はないです。

03D369  A0 05           LDY #$05        ; "Y" = 05
03D36B  5A              PHY             ; "Y"をスタックにプッシュ
03D36C  22 5F F6 C3     JSL $03F65F     ; $00 = (乱数)
03D370  A5 00           LDA $00         ; "A" = $00
03D372  29 0F           AND #$0F        ; "A" = "A" and 0F
03D374  C9 0D           CMP #$0D        ; 
03D376  B0 F4           BCS #$F4        ; "A" >= 0D のとき乱数生成からやり直し("A" = 00〜0C にする)
03D378  AA              TAX             ; "X" = "A"
03D379  BF 9E D3 C3     LDA $03D39E+"X" ; "A" = $03D39E+"X" ("X"番目の出にくい罠)
03D37D  A6 06           LDX $06         ; "X" = $06
03D37F  F0 04           BEQ #$04        ; "X" = 00 (掛軸裏の洞窟ではない)のとき03D385へ
03D381  C9 0E           CMP #$0E        ; 
03D383  F0 E7           BEQ #$E7        ; "A" = 0E(空腹スイッチ) のとき乱数生成からやり直し
03D385  A0 05           LDY #$05        ; "Y" = 05
03D387  D9 9B C1        CMP $C19B+"Y"   ; 
03D38A  F0 E0           BEQ #$E0        ; "A" = $C19B+"Y" (既に設定された罠と被った)のとき乱数生成からやり直し
03D38C  88              DEY             ; "Y" --
03D38D  10 F8           BPL #$F8        ; (上の結果) >= 00 のとき03D387へ
03D38F  7A              PLY             ; "Y"にスタックからプル
03D390  99 9B C1        STA $C19B+"Y"   ; $C19B+"Y" = "A" (罠を設定する)
03D393  88              DEY             ; "Y" --
03D394  10 D5           BPL #$D5        ; (上の結果) >= 00 のとき03D36Bへ
03D396  28              PLP             ; 
03D397  6B              RTL             ; 元のルーチンへ

最後に出にくい罠の中から出現する罠を選択します。 やっていることは出やすい罠からの選択のときと大体同じですが、掛軸裏の洞窟の場合、空腹スイッチを出なくする処理があることが分かります。

罠の出現率

それでは、こうして決められた11種類の罠の出現率は全て等しいのかというと、一部例外があります。 フロアに配置される罠を選択するルーチンで、落とし穴が選択されると85/256の確率でもう1度選択し直す処理がありました。 「落とし穴は全てのフロアに出現するが、その出現率は低い」ということですね。

また、シャッフルダンジョンでは落とし穴を出なくしたり、二面地蔵の谷では丸太の罠を出なくする処理もありました。 細かいですね。

2009年2月25日更新

裏CHUNSOFT > ROMイメージ改造・解析 > 出現する罠の決定