2014/12/20
■ [ヴィーヤウトゥムノ] 丘オーク/Hill orc (Slate 'o')
=== Num:149 Lev:8 Rar:1 Spd:+0 Hp:13d9 Ac:32 Exp:25 彼は困難な環境に耐えてきた生き残りのオークだ。 彼は通常地下 8 階で出現し、普通の速さで動いている。この邪悪なるオークを倒 すことは 1 レベルのキャラクタにとって 約66.67 ポイントの経験となる。彼は 通常集団で現れる。彼は AC32 の防御力と 13d9 の体力がある。彼はドアを開 け、ドアを打ち破ることができる。彼には明るい光でダメージを与えられる。彼 は暗黒の耐性を持っている。彼は進化しない。彼は侵入者をほんの少しは見てお り、 200 フィート先から侵入者に気付くことがある。彼は一つのアイテムや財宝 を持っていることがある。彼は 1d11 のダメージで殴って攻撃する
西オークの土侯『ゴルフィンブール』
…おお、我が民、我らが同胞。
鬼畜大佐『ロムンクァリィ』
あら?あらあら、珍しくニュートラルな解説してくれてんじゃ~ん。 ま、どうせニュアンス色々違うんだろうけど。
アッキ=ニンジャ『ウルウェン』
そりゃあな、産業革命どころか絶対王政以前の 水準な西のモン共と同じ暮らしじゃ過酷なはずだわな。
■ [変愚蛮怒/スポイラー]generate_hmap()関数及びgenerate_fracave()関数による洞窟生成@変愚(中編)
本記事はRoguelike Advent Calendar 2014の20日目として作成しました。
当初前後編の予定でしたが、より具体的に処理を解説するための補足として、本中編を加え、後編は翌日に回すことにしました。ご了承下さい。
前回からの続き
前回の記事でダンジョンの対象範囲内に閾値を与えるgenerate_hmap()関数の処理の流れを並べ立てたが、正直これを直観的に理解できる道理はないと思う。
よって、今回は次のgenerate_fracave()で閾値を元に地形を指定する処理を解説する前にgenerate_hmap()関数でどのように処理が進められるかを、VC++のデバッグ&トレース機能を応用して図解することにした。
前回の長ったらしい処理の流れを最も単純化して表現すれば以下のような流れになる
- 疑似フラクタルな地形を作成するダンジョンの範囲を決定
- 疑似フラクタル処理のための初期値の設定
- 以下を部屋範囲内の閾値が全て充填されるまで繰り返す
- 横方向の閾値充填(A)
- 縦方向の閾値充填(B)
- ABで追加されたマスのさらに中央部のマスの閾値充填(C)
これが例としてどうなるかを具体的に以下の節で追う。
初期値決定
まずgenerate_hmap()関数に以下の引数と事前準備値が設けられた。
引数 grd 1 int roug 3 int cutoff 7 int diagsize 362 unsigned short x0 16 int y0 5 int xp 20 unsigned short yp 9 unsigned short fill_data xmin 12 int ymin 1 int xmax 20 int ymax 9 int c1 7 int c2 0 int c3 0 int feat1 0 int feat2 0 int feat3 0 int info1 0 int info2 0 int info3 0 int amount 0 int ローカル値 ym 7 unsigned short xm 18 unsigned short xsize 8 int ysize 8 int xsiz 8 int ysiz 8 int yhsize 4 int xhsize 4 int maxsize 8 int
その結果部屋生成の範囲となった8x8の範囲のfeat値は以下のように初期化された。
ループ処理の流れ
ここから前述のA~Cのループは3度繰り返される。
1回目
2回目
3回目
ループ終了時点でfeat値は全て0以上の値が与えられ、上記のようになる。こういう処理を「フラクタル」と名付けていいのかよくわからないが、20~30年も昔の当時のPCにおいて、限られたメモリとCPU処理能力下で自然なカーブ形状を得るという目的にはしっかり果たされていると言える。
そしてここから、generate_fracave()関数の処理に続いて、どのような形で地形を引き出すか、大体は察しがつくだろう。
ということで後半へ続く。