*特殊マップの生成 [#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()