2014/12/21
■ [変愚蛮怒/スポイラー]generate_hmap()関数及びgenerate_fracave()関数による洞窟生成@変愚(後編)
本記事はRoguelike Advent Calendar 2014の21日目として作成しました。
中編からの続き、generate_hmap()関数で割り振られた値を元に地形を実際に生成、のち整形する流れをまとめる。
generate_fracave()関数の流れ
genatate_fracave()関数は、以下の引数を持つ。
- y0 部屋のY座標中心
- x0 部屋のX座標中心
- xsize 部屋のX方向大きさ
- ysize 部屋のY方向大きさ
- cutoff 全編で定義したcutoff値
- light 部屋を明るくするか否かのフラグ
- room 指定範囲に部屋としてのフラグ(CAVE_ROOM)を与えるか否かのフラグ
これの他にroom.cのstaticなグローバル変数としてfill_data、グローバル変数としてダンジョンフロアの地形情報にアクセスする。
- xhsize = xsize/2, yhsize = ysize/2として定義
- fill_data.c1にcutoff値を代入、fill_data.c2=0、fill_data.c3=0とする。(c1、c2、c3いずれもここまでの処理で同値のまま変わっていないはずなので、ソースの英文コメントでいうところのParanoiaな行為かも知れない)
- fill_data.feat1, fill_data.feat2, fill_data.feat3にfloor_typeテーブルからランダムに地形IDを割り振る。
- fill_data.info1, fill_data.info2, fill_data.info3にCAVE_FLOORフラグを与える。
- fill_data.amountカウンタを0に
- cave_fill()サブルーチン関数にy0, x0を引数として与え、以下の処理に続く
- 最初の起点をy0, x0として以下の処理を繰り返す。
- 処理を行う地点から、隣接した各8方向に対し以下の処理を繰り返す
- 現在の地点が部屋生成処理の範囲内ならば、以下の処理を行う(実装はhack_isnt_wall()関数)
- 既にCAVE_ICKYフラグがついた地形は処理済としてなにもしない。
- CAVE_ICKYフラグがついていないならばONにして後の処理済判定に加える。
- 現在の地点のfeat値を見てfill_data.c1以下ならば地形IDを75%の確率で地形IDをfill_data.feat1、25%の確率でfill_data.feat2にする。
- fill_data.c1より大きくfill_data.c2以下ならば、75%の確率で地形IDをfill_data.feat2、25%の確率でfill_data.feat1にする。
- fill_data.c2より大きくfill_data.c3以下ならば地形IDをfill_data.feat3にする。
- fill_data.c3より大きいならばダンジョンの外壁地形にする。
- 以上を行い、埋められた地形が外壁地形でなく、キャンセルも行われなかった場合、次のループ探索リストに隣接地点を加える。
- 現在の地点が部屋生成処理の範囲内ならば、以下の処理を行う(実装はhack_isnt_wall()関数)
- 隣接地点ループが行われる毎にfill_data.amountに+1
- 処理を行う地点から、隣接した各8方向に対し以下の処理を繰り返す
- ここまででcave_fill()関数完了。fill_data.amountが10未満ならば処理が失敗したとみなし、部屋範囲地形を外壁で埋め直して生成処理全体をキャンセルする。
- 部屋生成範囲の長方形各辺について以下の処理を行う
- CAVE_ICKYフラグがついていてroomがTRUEならば、部屋CAVE_ROOMのフラグを付加、lightがTRUEならばCAVE_GLOWフラグを与えて地形を明るくする。
- 各地点を外壁地形で埋める。
- さらに部屋範囲の各地点に対して以下の処理を行う。
- 地点が床でCAVE_ICKYフラグがついているならば、以下の処理を行う。
- roomがTRUEならば、部屋CAVE_ROOMのフラグを付加、lightがTRUEならばCAVE_GLOWフラグを与えて地形を明るくする。
- そうでなく、地点が外壁フラグ(CAVE_OUTER)つきでCAVE_ICKYフラグがついているならば、以下の処理を行う。
- lightがTRUEならばCAVE_GLOWフラグを与えて地形を明るくする。
- roomがTRUEならば、CAVE_ROOMフラグを付加。さもなくば外壁に地形IDを変えてCAVE_ROOMフラグを除去する。
- さもなくば外壁に地形IDを変えてCAVE_ROOMフラグを除去する。
- 地点が床でCAVE_ICKYフラグがついているならば、以下の処理を行う。
- いずれの選択肢でも最終的にCAVE_ICKYフラグを除去する。
つまりどういうことか
- fill_data構造体に3種類の地形IDを代入して、+外壁地形の4種類を指定できる仕様にはなっているが最初に関数引数として入れたcutoff値をc1に入れて、後はc2, c3=0になっているため、実質地形は2種類(ランダム選択)+外壁しか設定され得ない。
- cutoff値の大きさ次第によっては前回指定したfeat値全てが床になって結局長方形部屋になる可能性もある。
- もうちょっと処理をシンプルにしようがあるのではと思った(小学生並の感想)
以上、終わり!閉廷!
■ [ヴィーヤウトゥムノ] 巨大紫イモムシ/Giant purple worm (Violet 'w')
=== Num:446 Lev:29 Rar:4 Spd:+0 Hp:65d8 Ac:65 Exp:400 それはたくさんの足を持ったイモムシだ。その巨大な胃袋は酸と毒に満ちている。 それは通常地下 29 階で出現し、普通の速さで動いている。この自然界のモンス ターを倒すことは 1 レベルのキャラクタにとって 約3866.67 ポイントの経験と なる。それは AC65 の防御力と 65d8 の体力がある。それはドアを打ち破り、水 を渡ることができる。それは酸と毒の耐性を持っている。それは進化しない。そ れは侵入者をほんの少しは見ており、 140 フィート先から侵入者に気付くことが ある。それは 1d8 のダメージで殴って攻撃し、 2d8 のダメージで噛んで酸を飛 ばし、 1d8 のダメージで刺して毒をくらわす。
鬼畜大佐『ロムンクァリィ』
ただデカいだけ。
アッキ=ニンジャ『ウルウェン』
見事に酸と毒しか芸がないクソザコナメクジ。
hello. i am from poland. i uwielbiam was!
hmm jak mozna takie cos zrobic?
Hej jestem z Polski. Dzieki za przyjecie. Moge pomoc w czyms?
I am ltonser. I need help. What can i do it?
Help. I am looking for guide
i get it now :)
hello there. What can i do for you hehe thanks
hello there. What can i do for you hehe thanks