- バックアップ一覧
- ソース を表示
- 特殊マップの生成 は削除されています。
- 1 (2009-09-16 (水) 16:19:24)
- 追加された行はこの色です。
- 削除された行はこの色です。
*特殊マップの生成 [#m8e585cd]
**特殊レベルの種類 [#y07a816c]
:MAZE|MAZE "name", <filling> で開始する。マップ全体を直接記述する。マップの一部だけを記述したい場合、残りの部分は mkmap() によるランダム地形か、迷路か、filling による塗りつぶしのうちから選択する。
:LEVEL|LEVEL "name" で開始する。room/subroom を座標で複数定義して通路でつないだ形のマップを記述する。通常の四角い部屋しか作れないが、通常レベルに似たある程度ランダム性のあるレベルが生成できる。
----
makemaz()
+- load_special() 特殊レベルのタイプに従って load_rooms() か load_maze() を呼び出す
| +- load_rooms() LEVELタイプの特殊レベルをロード
| | +- load_common_data()
| +- load_maze() MAZEタイプの特殊レベルをロード
| +- load_common_data()
| | +- mkmap()
| +- wallification()
+- fixup_special()
***MAZEタイプのレベル [#aa794cf1]
:makemaz()|指定した名前の特殊レベルをロードする~
指定がなければ迷路を生成
:fixup_special()|load_special() でやっていない色々なことをここでやる
-範囲指定した階段・分岐・レベルテレポート時の到着範囲などを設定
-DESファイルでカバーできないようなことを色々やる
--メデューサレベルでは1個目の部屋(メデューサの部屋以外に部屋を作らない前提なので、メデューサの部屋)に彫像を置く。ランダムにどこかその辺にも置く
--イェンダーの部屋を MORGUE で探して隠し扉を設置
--ローディオス砦では MORGUE の部屋を金貨と罠で埋め、OROOM に変更
--Priest のクエストは墓場がなくても level.flags.graveyard = 1 にして Wraith誘導対策
--城レベルも上に同じ
--ゲヘナ最下層では TEMPLE の部屋を探して隠し扉を設置
--オーケスレベルでは店から店主を排除
-MESSAGE で指定したメッセージを出力し、メッセージの入っていたメモリを開放
-範囲指定の情報が入っていたメモリを解放
----
:wallification()|levl[][].typ の壁の種類をきれいにつながるように修正する~
※壁に囲まれた壁はSTONEに変えられるため、Baalzebubレベルのハエの足は消えてしまいます…
:wallify_map()|ROOMに隣接するSTONEを壁に変える~
DESファイルでWALLIFYを指定したときに使われるのは lev_main.c内の同名の(ほぼ同じ機能の)関数で、特殊レベルのロード時に動的に処理されるわけではないので注意
:flood_fill_rm()|引数を起点にして壁・扉で囲まれた範囲を塗りつぶし、四角くない部屋を作る~
塗りつぶした領域全体を囲む四角形はグローバル変数の min_rx, min_ry, max_rx, max_ry に格納される。通常 flood_fill_rm() の直後にこれらを引数に add_room() を呼ぶ~
四角い部屋用の topologize() に相当する処理もやってくれる~
DESファイルで irregular region を指定した場合、region の左上の座標を引数にしてこの関数が呼ばれる
※壁にSHAREDを設定しているが、SHAREDでは部屋の判定 in_rooms() において注目点の斜め4方向しか見ないため、判定を誤る場合がある。SHARED_PLUSを設定したほうがよい。
----
:init_lev.init_present|LEV_INIT がなければ -1~
LEV_INIT を書くと 1 になる。~
1 の場合、load_maze() または load_rooms() を呼び出す前に mkmap() を使ってマップを初期化する~
-1 の場合、load_maze() の冒頭でマップの初期化を行う。初期化には MAZE:"mazename",filling で指定した filling が使われる~
filling == -1 (random) のとき、迷路(の素となる壁と石)で初期化。実際に迷路を作るのは DESファイル中の MAZEWALK~
filling が有効なマップキャラのとき、全体を filling で塗りつぶす
----
load_rooms()
+- build_room()
| +- create_room(), create_subroom()
| +- build_room() (再帰)
| +- create_door()
| +- topologize()
| +- fill_room()
+- create_corridor()
+- sort_rooms()
+- fix_stair_rooms()
+- makecorridors()