2013/02/13
■ [変愚蛮怒/スポイラー]try_door()/place_random_door()関数による通路のドア生成処理の流れ(変愚蛮怒 Ver2.1.1 rev3274)
generate.cの関数
static void try_door(int y, int x)
この関数の処理は、cave_gen()関数による部屋間の生成処理(変愚蛮怒 Ver2.1.1 rev3274)に記述してある通路生成中に三叉路や十字路ができた場合に、その周囲1マスにドアの生成を試みるものである。
下図の赤枠に囲まれた部分にあたる。
また、try_door()関数がさらに実際にドア生成や、上図の赤枠に囲まれていないドアは、place_random_door()を直接呼び出す形で実装されている。
void place_random_door(int y, int x, bool room)
roomはtry_door()で呼び出された場合のみFALSE、それ以外ではTRUEとなる。
try_door()の流れ
- 座標がフロア範囲内ならキャンセル
- 座標のマスが壁ならばキャンセル
- 座標のマスがCAVE_ROOMフラグを持っていたらキャンセル
- ダンジョンにNO_DOORSフラグがなく、壁の位置関係が不自然なドアでなければ、ダンジョン毎に計算された確率でplace_random_door()を呼び出す。
place_random_door()の流れ
- ダンジョンがNO_DOORSを持っていたら指定座標を床にして終了。
- ダンジョンがCURTAINフラグを持っていた場合、NO_CAVEを持っていると1/16、持っていないなら1/256の確率でドアはカーテンになる。
- そうでなければダンジョンにGLASS_DOORがあるとガラスのドア、そうでない場合通常のドアになる。
- ドアの状態は以下の確率の通り
- 300/1000の確率で開いている。
- 100/1000の確率で壊れて開いている。
- 200/1000の確率で隠しドアにしようと試みる。
- ただし、カーテンであった場合は単に閉じたカーテンになる。
- ダンジョンを構成する基本的な壁地形による偽装を試みるが、ドアが遮蔽を持たない地形であるか、偽装する壁が飛んで移動できる地形(竜窟の崖など)であった場合、偽装をキャンセルして、半々の確率で壁にするか床にする。
- 400/1000の確率で閉じたドアになる。
- 閉じたドアはplace_closed_door()によりさらに実装されている。この関数はカーテンでなければ、
- 300/400の確率で鍵がかからず閉じている。
- 99/400の確率で鍵がかかっている。
- 1/400の確率で完全に閉じている(くさびのかかったドアと同じ)
- 閉じたドアはplace_closed_door()によりさらに実装されている。この関数はカーテンでなければ、
- 以上のドア配置先にモンスターがいた場合削除する。