裏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イメージ改造・解析 > 出現する罠の決定