トップ «前の日記(2014/12/19) 最新 次の日記(2014/12/21)» 編集

SikabaneWorksが関係するコンテンツ(主に*band系ローグライク)の開発近況・補足から全く個人的な雑記まで。

[WEB:屍の見える丘公園]| [RSS]

Angband | Badiashimshe | C# | CRAUZEL | D'angband/小説草稿 | D'angband/開発 | DarkSouls | Demon'sSouls | DungeonCrawl | ElvenUteruses | Haskell | Hengband | J9シリーズ | LEGO | LineDrawing | MISC | MTG | Mac | Math | Moria | R-18 | Roguelike | Rough | RoughSketch | Ruby | SDL | UNIX | VMware | WarHammer | Zangband | アタシラヂョウヲウ | イラスト | ガジェット | ゲーム | ゲーム紹介 | ゲーム製作技術 | ゲーム論 | スケッチ | ツクール | テクノロジー | ニコニコ動画 | ファルコム | ファンタジー | マリオ | ヴィーヤウトゥムノ | 別記事追加予定 | 変愚蛮怒 | 変愚蛮怒/スポイラー | 変愚蛮怒/元ネタ探訪 | 変愚蛮怒/攻略 | 変愚蛮怒/開発 | 宗教 | 情報 | 政治 | 文字コード | 日ペ昔話 | 東方 | 東方ワンドロ | 東方外法漢女 | 歴史 | 漫画製作 | 版権絵 | 画像処理 | 翻訳 | 自然言語 | 艦隊これくしょん | 落書き | 言語解析 | 読書 | 超人ロック | 追記予定 | 通信 | 鉄獄旅慕情 | 阿片窟 | 馬鹿馬鹿蛮怒/開発 | 魔法少女まどか☆マギカ | 魚類版深夜の真剣お絵描き60分一本勝負


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 のダメージで殴って攻撃する

3

Golfimble

西オークの土侯『ゴルフィンブール』
…おお、我が民、我らが同胞。

Romunqualy

鬼畜大佐『ロムンクァリィ』
あら?あらあら、珍しくニュートラルな解説してくれてんじゃ~ん。
ま、どうせニュアンス色々違うんだろうけど。

Urwen

アッキ=ニンジャ『ウルウェン』
そりゃあな、産業革命どころか絶対王政以前の
水準な西のモン共と同じ暮らしじゃ過酷なはずだわな。

[変愚蛮怒/スポイラー]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回目

1回目

2回目

2回目

3回目

3回目

ループ終了時点でfeat値は全て0以上の値が与えられ、上記のようになる。こういう処理を「フラクタル」と名付けていいのかよくわからないが、20~30年も昔の当時のPCにおいて、限られたメモリとCPU処理能力下で自然なカーブ形状を得るという目的にはしっかり果たされていると言える。

そしてここから、generate_fracave()関数の処理に続いて、どのような形で地形を引き出すか、大体は察しがつくだろう。

ということで後半へ続く。