2013/07/07
■ [ヴィーヤウトゥムノ] 浅い水たまり/Shallow puddle (L.Blue '~')
=== Num:885 Lev:11 Rar:6 Spd:+5 Hp:9d6 Ac:17 Exp:70 穏やかな水たまりだ。 それは通常地下 11 階で出現し、やや素早く動いている、しかし侵入者を追跡し ない。このモンスターを倒すことは 50 レベルのキャラクタにとって 約14.81 ポ イントの経験となる。それは AC17 の防御力と 9d6 の体力がある。それは冷血動 物である。それはテレパシーでは感知できない。それは酸と稲妻と毒の耐性を持 っている。それは進化しない。それは恐怖を感じないし、混乱しないし、眠らさ れない。それは侵入者をかなり警戒しており、 100 フィート先から侵入者に気付 くことがある。それは 2d3 のダメージで触って酸を飛ばし、 2d3 のダメージで 触って酸を飛ばす。
鬼畜大佐『ロムンクァリィ』
穏やかなって書いてるにしちゃ大分荒ぶってない?
兵器の悪魔『ウディンダイ』
そうなんだけど、酸を飛ばしてくるなんても書いてあるからね。 正直存在自体意味不明なモンスターだけど、ゴーレムやミミック的な 錬金術的からくりがただの水に宿ったようなモノなんだろう。
■ [変愚蛮怒/スポイラー]ダンジョン地下街がガタガタに崩れることがあるケースについて(変愚蛮怒 ver2.1.3 rev3475以前)
#hengband 地下街の魔法の店(6)の細切れっぷりが酷い。1マスて。 pic.twitter.com/rVuPsYTr1k
— こむ (@village516) July 6, 2013
折角なので解析をしてみようと思う。
ダンジョン生成の全体構図について
地下街の生成手順についてはまず[変愚蛮怒/スポイラー]build_type16()の部屋生成プロセス(変愚蛮怒 Ver2.1.2 rev3327)を参照。
[変愚蛮怒/スポイラー]cave_gen()関数によるフロアの内容生成の流れ(変愚蛮怒 Ver2.1.1)のgenerate_rooms()以降を再掲すると
- 通常の部屋群生成をgenerate_rooms()で行う。
- 1Fの場合、1/2の確率で小さな森を生成する。
- 破壊地形フラグがあったら、この時点で破壊地形を作成する。
- 1/3の確率で、1d(生成階)>5ならgen_caverns_and_lakes()関数で立った、溶岩地形、水地形フラグに応じて川を生成する。(詳細は別項予定)
- generate_rooms()関数で作られた部屋間の通路を作成する。(詳細は別項予定)
- 部屋と通路の間にドアを生成する。
- 3d4の下り階段と、1d2の上り階段を生成。
- 湖地形が作られていない場合、ストリーマー(壁の中に混じる別の特殊な壁や鉱脈)を生成する。
- 上下左右の端を永久壁で囲う。
- @さんを配置。
- クエストモンスターを配置。
- ランダムモンスターを配置。
- アイテムやゴールドを配置。
- ダンジョンの主を配置。
- アリーナレベルで、4/5の確率か1d100>生成階でかつ、DARKNESSフラグがないならダンジョン全体を明るくする。
この内、直接generate_rooms()で関わった地形に影響を及ぼしえるものは
- 1Fの場合、1/2の確率で小さな森を生成する。
- 破壊地形フラグがあったら、この時点で破壊地形を作成する。
- 1/3の確率で、1d(生成階)>5ならgen_caverns_and_lakes()関数で立った、溶岩地形、水地形フラグに応じて川を生成する。(詳細は別項予定)
- generate_rooms()関数で作られた部屋間の通路を作成する。(詳細は別項予定)
- 湖地形が作られていない場合、ストリーマー(壁の中に混じる別の特殊な壁や鉱脈)を生成する。
以上のケースである。
地下街の持つ地形フラグについて
build_type16()関数で生成される各マスのCAVE特性は以下の通りである。
- 地下街の永久壁
当然のことながら永久地形である。また、
#define place_extra_grid(C) \ { \ (C)->feat = fill_type[randint0(100)]; \ (C)->info &= ~(CAVE_MASK); \ (C)->info |= CAVE_EXTRA; \ if ((C)->m_idx) delete_monster_idx((C)->m_idx); \ }
で埋まるので、CAVE_MASKフラグを失い、CAVE_INNERフラグを得る。
- 地下街の床
generate_room_floor()関数でlight=FALSEで以下の処理の通り。
c_ptr = &cave[y][x]; place_floor_grid(c_ptr); c_ptr->info |= (CAVE_ROOM); if (light) c_ptr->info |= (CAVE_GLOW);
よってCAVE_ROOMフラグのみを持つ
- 店舗の入り口
cave_set_feat()関数で指定されるが、特にCAVEフラグの追加はない。また、全店舗の入り口とも永久地形である。
generate_rooms()関数以後の地形処理の影響
「1Fの場合、1/2の確率で小さな森を生成する。」
- room_info_normal[ROOM_T_MAX]の確率テーブルによれば1Fでも極めて低い確率で地下街が生成される可能性がある。
- place_trees()による同処置の地形改変はアイテムが既に置いてあったり、CAVE_ICKYフラグがついていたり、永久地形の場合はキャンセルされる。よって、店舗の壁や店舗の入り口が潰れないが、その周辺が木や岩によって埋まる可能性はある。
「破壊地形フラグがあったら、この時点で破壊地形を作成する。」
- 地形の*破壊*処理はプレイヤーの破壊処理と原則同じなので、永久壁、店舗の入り口は破壊されないが、床はガタガタになる可能性を持つ。つまり最初から*破壊*にうずもれた地下街は有り得る。
「1/3の確率で、1d(生成階)>5ならgen_caverns_and_lakes()関数で立った、溶岩地形、水地形フラグに応じて川を生成する」
- 永久地形に対するキャンセルがあり、よって、地下街の店舗自体は無事で川や溶岩の上に浮かぶ可能性あり。
「generate_rooms()関数で作られた部屋間の通路を作成する。」
- 店舗の永久地形を破壊している主犯結論としてこれだった。
- set_tunnel()関数中にはCAVE_INNER地形の書き換えをキャンセルする条件処理がついているが、店舗の壁はCAVE_EXTRAつきで生成されるためこれで部屋を貫通する通路生成時に永久壁を破壊してしまっていた。
「湖地形が作られていない場合、ストリーマー(壁の中に混じる別の特殊な壁や鉱脈)を生成する。」
- 永久地形に対するキャンセルあり、また床地形には影響を及ぼさない。
rev3476以後の修正
地下街の永久壁はplace_inner_perm_bold()関数で埋められるようになった。
#define place_inner_perm_bold(Y, X) \ { \ set_cave_feat(Y,X,feat_permanent); \ cave[Y][X].info &= ~(CAVE_MASK); \ add_cave_info(Y,X,CAVE_INNER); \ delete_monster(Y, X); \ }
このためINNERフラグのついた永久壁は通路生成時にキャンセルされ破壊されることがなくなっている。