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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS