2013/01/01
■ [変愚蛮怒/スポイラー]魔法の失率計算(変愚蛮怒 Ver2.1.1)
spell_chance()関数より確認。領域魔法以外でも恐らく、超能力、青魔法、ものまね以外は共通のはず。正直言って上記の領域を別個実装している理由はよく分からない。
- 領域魔法のIDが不正な値だったら失率100%
- 剣術は失率0%
- 基本失敗率以下の式で算出
魔法の難度 - 3 * (@さんの現レベル - 魔法の習得レベル) - 3 * (能力修正 - 1)
修正の基準となる能力値は職業により異なる。修正値のテーブルは以下の通り。
能力値 | 修正値 |
3~7 | 0 |
8~14 | 1 |
15~17 | 2 |
18/00~18/49 | 3 |
18/50~18/69 | 4 |
18/70~18/79 | 5 |
18/80~18/89 | 6 |
18/90~18/99 | 7 |
18/100~18/109 | 8 |
18/110~18/119 | 9 |
18/120~18/129 | 10 |
18/130~18/139 | 11 |
18/140~18/149 | 12 |
18/150~18/159 | 13 |
18/160~18/169 | 14 |
18/170~18/179 | 15 |
18/180~18/189 | 16 |
18/190~18/199 | 17 |
18/200~18/209 | 18 |
18/210~18/219 | 19 |
18/220~ | 20 |
- 騎乗している場合、MAX(騎乗モンスターのレベル - @さんの乗馬技能 / 100 - 10, 0)%のペナルティがかかる。
- 消費MPが残りMPより多いと(消費MP-残りMP)%のペナルティがかかる。
- メイジやプリーストの第二領域である場合+5%のペナルティがかかる。
- プリーストやスペルマスターがそぐわない武器を装備していると、失率に+25%のペナルティがかかる。
- 性格「なまけもの」で+10%のペナルティ。
- 性格「きれもの」で-3%のボーナス。
- 性格「ちからじまん」か「がまんづよい」で+1%のペナルティ。
- 呪い装備による魔法難度上昇で軽い呪いなら+3%、重い呪いなら+10%のペナルティ。
- 呪いエゴによる魔法難度上昇で+20%のペナルティ。
- 消費魔力減少かつ魔法難度低下で-4%のボーナス。
- 魔法難度低下のみで-3%のボーナス。
- 消費魔力減少のみで-2%のボーナス。
- 領域と@さんの善悪アライメントの齟齬による修正。賢さ依存だと+10%、それ以外だと+4%のペナルティがかかる。
- 自然領域ならば悪に50より大きいか善に50以上大きいとペナルティ。
- 生命、破邪領域ならば悪に20より大きいとペナルティ。
- 暗黒、悪魔、呪術領域ならば善に20より大きいとペナルティ。
- 魔法を使用するための能力値に応じた最低失率修正がかかる。修正値は以下のテーブルの通り。
能力値 | 修正値 |
3~7 | 99% |
8 | 50% |
9 | 30% |
10 | 20% |
11 | 15% |
12 | 12% |
13 | 11% |
14 | 10% |
15 | 9% |
16 | 8% |
17 | 7% |
18/00~18/19 | 6% |
18/20~18/49 | 5% |
18/50~18/89 | 4% |
18/90~18/109 | 3% |
18/110~18/149 | 2% |
18/150~18/199 | 1% |
18/200~ | 0% |
- 純メイジ/プリースト職以外は最低5%の失敗率ペナルティが維持される。
- ひどく朦朧していると+25%のペナルティ、通常の朦朧だと+15%のペナルティ。
- ここまでで失率95%を超えている場合は95%に留められる。
- 使用する魔法の熟練度が、熟練者以上なら-1%のボーナス。エキスパートならさらに-1%のボーナス。
- ここで呪いエゴによる魔法難度上昇でさらに+5%のペナルティがかかる。消費魔力減少がついていると-1%の相殺がつくが、消費魔力減少のみをつけていてもボーナスはかからない。
2013/01/02
■ [変愚蛮怒/スポイラー]モンスターの魔法効果の特殊な分岐
モンスターの魔法には「特別な行動」「同族召喚」の効果がそのモンスター特有に用意されている場合がある。思い出表示の表面上では分からず、青魔法やものまねでも再現できない、これらの処理をまとめてみた。
特別な行動
- 王蟲→モルド生成
魔法の使用率と同じ確率で、自分の周辺にパワー自レベル(60)のモルド召喚を6回行う。
- 『バーノール・ルパート』→分裂
摂政『バーノール公』と『ルパート将軍』に分裂する。処理上は『バーノール・ルパート』が削除され、摂政『バーノール公』と『ルパート将軍』が生成された後に現HPの半分ずつを2体に分け与える。
- 摂政『バーノール公』/『ルパート将軍』→合体
摂政『バーノール公』と『ルパート将軍』が合体する。同じエリア上に存在していれば、距離は問わない。処理上は両ユニークが削除された後、合体行動を行なったユニークのマスに両ユニークのHPを足した『バーノール・ルパート』が再生成される。
風早彦『グワイヒア』/疾翼『メネルドール』/大鷲王『ソロンドール』シンボルBのモンスター→落下攻撃
@さんを掴んだ後に空中に投げ落としてくる。ダメージ4d6に加えて、浮遊を持っていないと追加で6d8のダメージをうけて短距離アウェイ。
ファイア・ボール
- 『ロレント』→手榴弾
手榴弾を1+1d3回生成する。
同族召喚
通常は自身と同じシンボルのモンスター召喚となるが、以下のモンスターの場合以下の効果に差し替えられる。
- 『混沌のサーペント』/『サーペント・ゾンビ』→ダンジョンの主召喚
全ダンジョンのクエスターを2+1d3回召喚する。ミドガルドの大蛇『ヨルムンガンド』の召喚のために1/6の確率で水地形も副次的に生成される。
- 風早彦『グワイヒア』/疾翼『メネルドール』/大鷲王『ソロンドール』→大鷲召喚
大鷲を4+1d3回召喚する。
- 『ブル・ゲイツ』→IE召喚
インターネット・エクスプローダーを2+1d3回召喚する。
- 皇帝『カル=ダームIII世』→超人ロックのクローン召喚
超人ロックのクローンを2+1d3回召喚する。
- 巨大白シラミの王『lousy』→巨大白シラミ召喚
巨大白シラミを2+1d3回召喚する。
上級アンデッドの召喚
- 冥王『モルゴス』/妖術師『サウロン』/『アングマールの魔王』→ナズグル戦隊召喚
非ユニークのナズグルを生成できるだけ(最大5体)召喚する。ナズグルは準ユニークであるため、殺害しただけ以後の最大生成数が減る。
2013/01/03
■ [変愚蛮怒/開発][追記予定]地形情報f_info.txtのデータ形式(変愚蛮怒 Ver2.1.1)
地形情報ファイルは lib/f_info.txt に存在する。このファイルは地形一件ごとに以下の例のようなフォーマットで定義を行っている。(#以下の行はコメントとなる)
N:38:LOCKED_DOOR_6 J:鍵のかかったドア E:locked door G:+:U M:CLOSED_DOOR W:10 K:DESTROYED:*FLOOR* K:OPEN:OPEN_DOOR K:BASH:BROKEN_DOOR K:SPIKE:JAMMED_DOOR_7 K:DISARM:CLOSED_DOOR F:POWER_6 | NOTICE | REMEMBER | OPEN | BASH | SPIKE | TUNNEL | DOOR | F:HURT_ROCK | CAN_PASS | HURT_DISI
「N:」IDとタグ
N:[ID]:[タグ]
[ID]
- 地形を一意に定義するための数値ID。故に値はユニークでなければならない。
- データの順番はこの値の昇順に並んでいないとデータ読み込みにエラーが発生する。
- 新しく地形を追加する場合、未使用な値をf_info.txt末尾に追加する事になるが、その際、lib/misc.txtを開き、下記のように定義された地形の種類総数を予め増やしておかないとエラーが発生する。ただし現状は30ほど空きがあるようなので、特に修正する必要はない。
# Maximum number of terrain features in f_info.txt M:F:255
[タグ]
IDとは別に同じ地形情報内で参照するための呼称。後述の地形同士の関係定義に利用される。
「J:」日本語名
J:[日本語名]
[日本語名]
日本語版で表示される名前。
「E:」英語名
E:[英語名]
[英語名]
英語版で表示される名前。
「G:」シンボル表示
G:[シンボル]:[色]
[シンボル]
- 地形をダンジョン中に表記する記号。
[色]
- 地形に使用される色。
D - 黒 w - 白 s - 灰 o - オレンジ r - 赤 g - 緑 b - 青 u - 茶 d - 暗い灰 W - 明るい灰 v - 紫 y - 黄色 R - 明るい赤 G - 明るい緑 B - 明るい青 U - 明るい茶
「M:」擬態地形
M:[擬態先地形タグ]
鍵やくさびのかかった扉など、不確定時に表記される地形名のタグを参照する。トラップはこれとはまた別処理の形で秘匿されている様子。詳細な処理関係は確認中。
「W:」その他の情報
W:[表示優先値]
'M'コマンドで縮小マップを表示する際、サイズ縮小で表示を潰さざるを得なくなるに、どの地形表示を優先的に残すかを指定するもの。値が大きいほど優先度が高い。
「F:」特徴
その地形の特性。"|"で区切っていくつでも追加できる。詳細は地形情報f_info.txtの地形特徴(F:)一覧(変愚蛮怒 Ver2.1.5)と地形情報f_info.txtの地形強度(POWER_*)とサブタイプ(SUBTYPE_*)の仕様(変愚蛮怒 Ver2.1.5)
「K:」地形関係
*破壊*や、ドアを開けるといった一定のアクションが地形に施された場合に、どの地形に変化するかを定義している。定義の仕方の詳細は地形情報f_info.txtの地形変化情報(K:)の仕様(変愚蛮怒 Ver2.1.5)
2013/01/04
■ [変愚蛮怒/スポイラー]プレイヤーの取得経験値(変愚蛮怒 Ver2.1.1)
同日追記
途中の掛け算割り算が間違っていた。これで本当に問題ない。補足しておくとモンスターを殺して得られる経験値の概算は
基本経験値 * 敵レベル / (@さんのレベル + 2)
ということになる。これに個体のHPと実質加速がr_info上で定められた基本値に対するその比として掛け算されている。ダイスの巡り合わせで、HPが本来の1.1倍であれば、取得経験値も1.1倍になるということである。
本文
gain_exp_from_mon()関数でモンスターから、gain_exp()関数でそれ以外から得る経験値処理を行う。以下grepにより抜粋。
gain_exp_from_mon()
- KILL_EXPフラグを持たないモンスターにダメージを与えると、ダメージを与えた分だけ基本取得値が得られる。
- HEALを持つ場合は2/3になる。
- カオスパトロンの抹殺では当然0となる。
- モンスターを殺した時にKILL_EXP持ちなら最大HP*2、そうでない場合最大HP*9/10の基本取得値が得られる。
- 基本取得値とモンスターの特性を基準にさらに以下の処理をgain_exp_from_mon()内で行う。
- モンスター種族のIDが不正なら経験値なし
- ペットやアリーナのモンスターなら経験値なし
- 基本取得経験値を敵レベル*(モンスター個体の加速の実倍率*取得基本値)とする。
- FORCE_HPの場合基本取得経験値に(敵HPダイス数*敵HPダイス最大目*2)/(プレイヤーの到達最大レベル+2)*モンスター基本加速の実倍率)を
かける割る。 - そうでない場合基本取得経験値に(敵HPダイス数*(敵HPダイス最大目+1))/(プレイヤーの到達最大レベル+2)*モンスター基本加速の実倍率)を
かける割る。 - 悪夢モードなら
2倍1/2。 - 地上で、WILD_ONLYでもユニークでもないモンスターを殺した場合1/5になる。
- FORCE_HPの場合基本取得経験値に(敵HPダイス数*敵HPダイス最大目*2)/(プレイヤーの到達最大レベル+2)*モンスター基本加速の実倍率)を
- MULTIPLY(増殖する)モンスターか、暁の戦士の場合MAX(8, 殺戮数/400)(切り捨て)回だけ経験値を1/4にする。
- ここまでの経験値にモンスターの固有経験値をかけたものが最終的な取得経験値になる。
gain_exp()
- 箱の鍵を外すと1取得
- 扉の鍵を外すと1取得
- 箱のトラップを解除するとトラップの難易度分取得
- 床のトラップを解除するとトラップの難易度分取得
- 戦士やバーサーカーが全て領域の高位魔道書を、パラディンが自分の属性に反する領域の高位魔道書を破壊すると、以下の経験値を得る。
- 高位魔道書とは秘術以外の三冊目と四冊目である。
- 取得経験値は@さんの現最大経験値の1/20。
- 三冊目以下はさらに1/4。
- 10000以上にはならない。
- 最低1はキープされる。
- 領域魔法に初めて成功すると、領域魔法の固有値*習得レベル分を取得
- 未鑑定のアイテムの使用を試みて成功すると(アイテムのレベル * 3 / 2) / (プレイヤーレベル)の経験値を取得。
- 経験の薬で、@さんの現最大最大値/2+10(上限100000)取得。
- シャッフルの『世界』の効果で現最大最大値/25+1(上限5000)取得。
- 青魔道師がラーニングに成功すると、取得レベル*消費MP分取得
- ヴィザードモードの'x'コマンドで現最大最大値+1取得。
- カオスパトロンの報酬で@さんの現最大最大値/2+10(上限100000)取得。
2013/01/05
■ [変愚蛮怒/スポイラー]盗賊と忍者の不意打ち関連処理(変愚蛮怒 Ver2.1.1)
盗賊と*きたない*忍者独特の処理をまとめてみた。
- 処理全体が行われる前提として、武器を持ち、しかもそれが「ふさわしくない武器」でないこと。
- 相手が眠っていて、@さんの視界に入っている状態なら「眠っている相手を刺す」扱いになる。
- そうでない場合、不意打ちの成功値ををレベル*6+(隠密+10)*4を基本値として以下の通り算出する
- 敵の光源の中にいて、かつ入身中「でない」なら成功値/3
- 反感中なら成功値/3
- 敵レベル > (@レベル * @レベル / 20 + 10)) なら成功値/3
- 以上の成功値を算出の上、超隠密状態(つまり忍者限定)で、相手を視界に捉えており、相手がRES_ALLを持たず、1d(成功値) - 1 > (敵レベル + 20)を満たすと「不意打ち」が成立する。
- そうでなく、敵が恐慌状態で視界に捉えられている状態だと「背中を刺す」状態になる。
「眠っている相手を刺す」効果
- 忍者だと必中になる。
- スレイ倍率直後にダメージを 3 + (@レベル / 20)倍にする。
- 忍者だと無光源かそうでないなら1/7の確率が後、
- 「刃が深々と刺さって」最終算出のダメージを5倍、吸血効果を2倍にする確率が1/13になる(通常は1/27)
- 1/11の確率が通れば半減/即死攻撃が成立する。(他判定も並行してチェックする)
「不意打ち」効果
- 必中になる。
- スレイ倍率直後にダメージを (5 + (@レベル * 2 / 25)) / 2倍にする。
- 忍者だと無光源かそうでないなら1/7の確率の後、
- 「刃が深々と刺さって」最終算出のダメージを5倍、吸血効果を2倍にする確率が1/15になる(通常は1/27)
- 1/11の確率が通れば半減/即死攻撃が成立する。(他判定も並行してチェックする)
「背中を刺す」効果
- スレイ倍率直後にダメージを 1.5倍にする。
- 忍者だと無光源かそうでないなら1/7の確率の後、
- 「刃が深々と刺さって」最終算出のダメージを5倍、吸血効果を2倍にする確率が1/15になる(通常は1/27)
やはりナイトのサポシは謙虚だが、忍者はきたないという事が証明されたな。あもりにもひきょう過ぎるでしょう?
2013/01/06
■ [変愚蛮怒/スポイラー]★カタナ『村正』の強化処理
通常、武器が所有している吸血フラグはダメージを与えることにより@さんのHPを回復するものだが、★カタナ『村正』の吸収だけはハードコーディング上で別の処理に回り、HUMANフラグのついた敵を攻撃した場合のみ、『村正』自身が血を吸って殺戮修正を高める作用になっている。
これにより、村正は通常の強化限界である(+10,+10)を超えることが簡単…なのかどうか強化される条件が判明しないと分からないと思うので検証を行ってみた。
村正の強化は以下の流れで行われる。
- 命中強化フラグをONにする。
- 現在の(命中修正値+3)回、1/4の確率でフラグをOFFにする。
- フラグがONのままなら命中+1
- ダメージ強化フラグをONにする。
- 現在の(ダメージ修正値+3)回、1/4の確率でフラグをOFFにする。
- フラグがONのままならダメージ+1
- いずれかが強化されたら「妖刀は血を吸って強くなった!」とメッセージが出る。
なんの事はない、3/4をn乗するだけで簡単な確率計算ができるものだった。生命のある敵に対する1回の命中毎の吸血処理毎の強化の可能性は以下の通りとなる。
上昇 | 確率 | 回数期待 | 回数累計 |
+10→+11 | 2.375726% | 42.09 | 42.09 |
+11→+12 | 1.781795% | 56.12 | 98.22 |
+12→+13 | 1.336346% | 74.83 | 173.05 |
+13→+14 | 1.002260% | 99.77 | 272.82 |
+14→+15 | 0.751695% | 133.03 | 405.85 |
+15→+16 | 0.563771% | 177.38 | 583.23 |
+16→+17 | 0.422828% | 236.50 | 819.73 |
+17→+18 | 0.317121% | 315.34 | 1135.07 |
+18→+19 | 0.237841% | 420.45 | 1555.52 |
+19→+20 | 0.178381% | 560.60 | 2116.12 |
+20→+21 | 0.133786% | 747.47 | 2863.58 |
+21→+22 | 0.100339% | 996.62 | 3860.20 |
+22→+23 | 0.075254% | 1328.83 | 5189.03 |
+23→+24 | 0.056441% | 1771.77 | 6960.80 |
+24→+25 | 0.042331% | 2362.36 | 9323.16 |
+25→+26 | 0.031748% | 3149.81 | 12472.97 |
+26→+27 | 0.023811% | 4199.75 | 16672.72 |
+27→+28 | 0.017858% | 5599.67 | 22272.39 |
+28→+29 | 0.013394% | 7466.22 | 29738.61 |
+29→+30 | 0.010045% | 9954.96 | 39693.57 |
意外と伸びがいいことが判明した。+20までの累計2100回命中程度なら、終盤突入するかしないかあたりの純戦士系職、あるいは反魔法の消える剣術家あたりなら、多少意識してHUMAN持ちモンスターを襲えば十分満たし得るレベルである。
「城」の徘徊、人間系の多い善良pit襲撃、同族召喚の頻繁なHUMAN持ち低級ユニークなどを駆使すれば、+30すらもそれほど非現実的なレベルでもなさそうだ。経験値吸収やテレポ阻害など問題点も多過ぎるが、敢えてロマンを求めてみるのも悪くないかもしれない。
2013/01/07
■ [変愚蛮怒/開発]地形の特性定義(変愚蛮怒 Ver2.1.1)
POWER_XXX | 地形の強度。XXXの値が壁などを掘り崩す際の難度として扱われる |
SUBTYPE_XXX | サブ値。XXXの値がハードコーディング上の分岐処理に使われる。実用例は以下の通り。(罠→罠の種類)(〈パターン〉地形→移動可能方向)(店の入口→店の種類) |
LOS | 視界の通過可能 |
PROJECT | 射線通過可能 |
MOVE | 通過可能 |
PLACE | "物"が存在している地形 |
DROP | 何かアイテムが落ちている地形 |
SECRET | 隠し地形 |
NOTICE | 走行中に隣接したら停止対象になる地形 |
REMEMBER | マス情報に最初からCAVE_MARKがつく(調査中) |
OPEN | 空いているドア |
CLOSE | 閉じているドア |
BASH | 打ち破られたドア |
SPIKE | くさびが打ち込まれたドア |
DISARM | 解除対象を持つ |
STORE | 店の入口 |
TUNNEL | 掘り抜ける対象である(ただし実際にできるとは限らない) |
MAY_HAVE_GOLD | 中に財宝を含んでいる可能性を持つ |
HAS_GOLD | 中に財宝を含んでいる |
HAS_ITEM | アイテムを含んでいる(可能性を持つ?) |
DOOR | ドア地形である |
TRAP | トラップ地形である |
STAIRS | 階段地形である |
GLYPH | ルーン地形である |
LESS | 上り階段である |
MORE | 下り階段である |
AVOID_RUN | 走って侵入することができない |
FLOOR | 床である |
WALL | 壁である |
PERMANENT | 永久地形である(破壊や掘削の対象にできない) |
XXX00 | 未使用 |
XXX01 | 未使用 |
XXX02 | 未使用 |
HIT_TRAP | トラップが潜んでいる |
BRIDGE | 未使用 |
RIVER | 未使用 |
LAKE | 未使用 |
BRIDGED | 未使用 |
COVERED | 未使用 |
GLOW | 光っている |
ENSECRET | Kフラグ向け/偽装先の地形名を指定する |
WATER | 水地形である |
LAVA | 溶岩地形である |
SHALLOW | 浅い地形である |
DEEP | 深い地形である |
FILLED | 未使用 |
HURT_ROCK | 岩石溶解の対象である |
HURT_FIRE | 未使用 |
HURT_COLD | 未使用 |
HURT_ACID | 未使用 |
ICE | 未使用 |
ACID | 未使用 |
OIL | 未使用 |
XXX04 | 未使用 |
CAN_CLIMB | 未使用 |
CAN_FLY | 飛べれば移動できる |
CAN_SWIM | 泳げれば移動できる |
CAN_PASS | 壁抜けで移動できる |
CAN_OOZE | 未使用 |
CAN_DIG | 掘削できる |
HIDE_ITEM | 未使用 |
HIDE_SNEAK | 未使用 |
HIDE_SWIM | 未使用 |
HIDE_DIG | 未使用 |
KILL_HUGE | 未使用 |
KILL_MOVE | 未使用 |
PICK_TRAP | 未使用 |
PICK_DOOR | 未使用 |
ALLOC | 未使用 |
CHEST | 未使用 |
DROP_1D2 | 未使用 |
DROP_2D2 | 未使用 |
DROP_GOOD | 未使用 |
DROP_GREAT | 未使用 |
HURT_POIS | 未使用 |
HURT_ELEC | 未使用 |
HURT_WATER | 未使用 |
HURT_BWATER | 未使用 |
USE_FEAT | 未使用 |
GET_FEAT | 未使用 |
GROUND | 未使用 |
OUTSIDE | 未使用 |
EASY_HIDE | 未使用 |
EASY_CLIMB | 未使用 |
MUST_CLIMB | 未使用 |
TREE | 木である |
NEED_TREE | 未使用 |
BLOOD | 未使用 |
DUST | 未使用 |
SLIME | 未使用 |
PLANT | 植物である |
XXX2 | 未使用 |
INSTANT | 未使用 |
EXPLODE | 未使用 |
TIMED | 未使用 |
ERUPT | 未使用 |
STRIKE | 未使用 |
SPREAD | 未使用 |
SPECIAL | 特別な地形(広域マップ用) |
HURT_DISI | 分解属性で破壊できる |
QUEST_ENTER | クエストの入口 |
QUEST_EXIT | クエストの出口 |
QUEST | クエストに関わる地形 |
SHAFT | 坑道(+2/-2Fの階段)である |
MOUNTAIN | 山岳地形 |
BLDG | 建物である |
MINOR_GLYPH | 爆発のルーンである |
PATTERN | パターン地形である |
TOWN | 町に関する地形である |
ENTRANCE | ダンジョンやクエストの入口である |
MIRROR | 鏡使いの鏡地形である |
UNPERM | Kフラグ向け/永久地形がオプションで表面的に偽装する地形タグ |
TELEPORTABLE | テレポート先候補になる |
CONVERT | 不明 |
GLASS | ガラス地形である |
2013/01/08
■ [変愚蛮怒/スポイラー]釣り処理でメカジキ様をお迎えできるのか(変愚蛮怒 Ver2.1.1)
釣りはアーティファクトの★太公望の釣竿の発動によって開始される。
- 発動すると隣接8方向のいずれで釣りをするか選択を要求される。
- WATER(水地形)フラグを持った地形でないと釣りを行うことができない。
- 隣接先にモンスターがいても釣りを行うことはできない。
- 以上の条件をくぐり抜けると@さんのACTIONの状態が「釣り」になり、この間はキャンセルが成立するまで、自動でターンが経過する。
各ターン中の処理は以下の通り。
- 1/1000の確率で、獲物が引っかかる。
- 獲物の候補に上がるのは非ユニークのAQUATICフラグ(水棲)持ちで、モンスターのシンボルが"J"/"j"/"l"/"w"のモンスターである。
- モンスターの生成レベルはそのままダンジョンの階層か、荒野の各地形毎に指定されたものになる
- 釣れる対象が確定してなおかつ1/2の確率でそのモンスターが釣れる。釣りの対象となった水地形に生成される。「あやしい影」にならない以外は全く通常の生成と同じ(つまり敵)である。
- 残り1/2の確率で餌だけ食べられて、何も生成されない。
ちなみにメカジキ様のレベルは4であるからして、その玉体を釣り上げるのに一番都合のいい場所は単純に丁度4F相当のフロアということになる。しかし、広域で水地形が生成され得る地形のレベルはそれぞれ、沼地:35、浅い海:40、深い海:60で全く意に沿わない。また鉄獄などでも多いが、少なくとも1~5Fでは河などは生成されない。
結局極々浅い階層でたまたま太公望の釣竿を拾い、なおかつたまたま浅い階層の間に川の生成を見かけない限り、釣りはメカジキ様をお迎えするに向いてる処理ではないということになる。あしからず。
2013/01/09
■ [変愚蛮怒/開発]ダンジョン情報d_info.txtのデータ形式(変愚蛮怒 Ver2.1.1)
2013/02/01追記
地形タグの指定についてストリーマーに使われる地形の説明について修正。
本文
ダンジョン情報ファイルは lib/d_info.txt に存在する。このファイルはダンジョン一件ごとに以下の例のようなフォーマットで定義を行っている。(#以下の行はコメントとなる)
# Cth and Razorback N:13:ルルイエ E:R'lyeh D:$a way to R'lyeh D:ルルイエ P:3:40 W:80:96:45:3:14:160:75:20:0x01a8:0x023f L:FLOOR:50:SHALLOW_WATER:30:DEEP_WATER:20:100 A:GRANITE:100:GRANITE:0:GRANITE:0:GRANITE:GRANITE:SHALLOW_WATER:DEEP_WATER F:MONSTER_DIV_16 | ARENA | WATER_RIVER | LAKE_WATER | F:FINAL_GUARDIAN_857 | FINAL_ARTIFACT_129 M:DEMON | ELDRITCH_HORROR
「N:」IDと日本語名
N:[ID][日本語名]
ID
実装上で扱われる数値ID。ウィザードモード時の'J'コマンドなどの指定にも使われる。
[日本語名]
日本語版で表示されるダンジョン名。
「E:」英語名
E:[英語名]
[英語名]
英語版で表示されるダンジョン名。
「D:」ダンジョンメッセージ
D:[ダンジョンメッセージ] D:$[ダンジョンメッセージ]
[ダンジョンメッセージ]
入口から潜った際に「[ダンジョンメッセージ]に潜った」と表記される。$が先頭についているのは英語版メッセージ。
広域マップ座標
P:[行(Y座標)]:[列(X座標)]
[行(Y座標)]
広域マップにダンジョンが配置される横軸。
[列(X座標)]
広域マップにダンジョンが配置される縦軸。
「W:」ダンジョンの諸情報
W:[最浅層]:[最深層]:[必要レベル(未実装)]:[モンスター優先型]: [モンスター数基本値]:[モンスター生成頻度]: [GOODアイテム生成限界率]:[GREATアイテム生成限界率]:[pit生成フラグ]:[nest生成フラグ]
[最浅層]
ダンジョンがスタートする最初の階(F)
[最深層]
ダンジョンの最深階(F)
[必要レベル(未実装)]
コメントを見る限り、恐らく@さんがそのダンジョンに潜るのに必要なレベルを指定しているらしいが、規制するための処理が実装されていない。
[モンスター優先型]
後述の「M:」フラグでモンスターの生成を条件付けるための論理設定。各値で以下の意味になる。
0 | DUNGEON_MODE_NONE | 条件を定めない |
1 | DUNGEON_MODE_AND | 全てを満たしたモンスターのみを優先生成に加える |
2 | DUNGEON_MODE_NAND | 全てを満たしたモンスターのみを優先生成から外す |
3 | DUNGEON_MODE_OR | いずれかを満たしたモンスターを優先生成に加える |
4 | DUNGEON_MODE_NOR | いずれかを満たしたモンスターを優先生成から外す |
[モンスター数基本値]
フロアが生成された直後に配置されるモンスター数の基本値、多いほど初期数が増える。
[モンスター生成頻度]
フロアが生成された後にモンスターが自然生成される頻度。多いほど増える。
[GOODアイテム生成限界率]
ダンジョンで生成されたアイテムが明示的なGOOD生成以外でGOODになる確率の限界値
[GREATアイテム生成限界率]
ダンジョンで生成されたアイテムが明示的なGREAT生成以外でGREATになる確率の限界値
[pit生成フラグ]
ダンジョンにpit部屋が生成される際に許可されるタイプのフラグを16進数表記したもの、詳細な解説は後日。
[nest生成フラグ]
ダンジョンにnest部屋が生成される際に許可されるタイプのフラグを16進数表記したもの、詳細な解説は後日。
「L:」標準床定義
L:[第一地形タグ]:[第一生成率]:[第二地形タグ]:[第二生成率]: [第三地形タグ]:[第三生成率]:[通路の直進率]
[地形タグ]/[生成率]
床になる地形のタグをf_info.txtで指定されたタグから参照し、生成される確率の重みを指定する。
[通路の直進率]
部屋同士を接続する通路が蛇行する形を取る頻度。1d(階層)>[通路の直進率]で蛇行する。
「A:」標準壁定義
A:[第一地形タグ]:[第一生成率]:[第二地形タグ]:[第二生成率]: [第三地形タグ]:[外壁地形タグ]:[内壁地形タグ]:[第一ストリーマー地形タグ]:[第二ストリーマー地形タグ]
[地形タグ]/[生成率]
床になる地形のタグをf_info.txtで指定されたタグから参照し、生成される確率の重みを指定する。
[外壁地形タグ]
部屋を生成した際の外壁として使われる地形タグ
[内壁地形タグ]
部屋を生成した際の内壁として使われる地形タグ
[第一ストリーマー地形タグ]
[第二ストリーマー地形タグ]
ストリーマーとして使われる地形タグ
「F:」ダンジョンの特性定義
ダンジョン自身が生成やフロア内ルールとして持っている特性、後日別記事にまとめる予定。
「M:」優先モンスター特性定義
優先して生成されるモンスターの条件フラグ。モンスターの特性定義に従うがこれの他に以下のフラグがある。
R_CHAR_???? | モンスターのシンボルを優先生成条件に加えられる。最大4つまで |
「S:」優先モンスター特殊能力定義
優先して生成されるモンスターの所有特殊能力フラグ。モンスターの特殊能力定義に従う。
2013/01/10
■ [変愚蛮怒/開発]ダンジョンの特性定義(変愚蛮怒 ver2.0.0)
FINAL_ARTIFACT_XXX | ダンジョンの守護者(QUESTOR)を倒した場合に必ずドロップするアーティファクトをXXXのIDで指定する |
FINAL_OBJECT_XXX | ダンジョンの守護者(QUESTOR)を倒した場合に必ずドロップするアイテムの種類をXXXのIDで指定する |
FINAL_GUARDIAN_XXX | ダンジョンの守護者(QUESTOR)をモンスターのXXXのIDで指定する |
MONSTER_DIV_XXX | 優先モンスター以外が生成される度合いをを0~64で指定する。0で優先モンスターのみ生成、64で優先が一切かからない。 |
WINNER | *勝利*した後で出現する |
MAZE | 全フロアが常に「迷宮」のような地形になる |
SMALLEST | 常にサイズのサイズが最小になる |
BEGINNER | 初心者向けダンジョン |
BIG | 常に大型サイズのフロアが生成される |
NO_DOORS | ドアを生成しない |
WATER_RIVER | 水の川を生成することがある |
LAVA_RIVER | 溶岩の川を生成することがある |
CURTAIN | カーテンのある部屋を生成することがある |
GLASS_DOOR | 常にガラスのドアを生成する |
CAVE | 洞窟的な地形を生成する |
CAVERN | 大規模な洞窟を生成することがある |
FORGET | 一度通った地形が記憶されない |
LAKE_WATER | 水の湖を生成することがある |
LAKE_LAVA | 溶岩の湖を生成することがある |
LAKE_RUBBLE | 岩を湖状に生成することがある |
LAKE_TREE | 木を湖状に生成することがある |
NO_VAULT | vaultを生成しない |
ARENA | 常にアリーナ地形(壁を一旦全て取り除いてから部屋を生成するフロア)を生成する |
DESTROY | *破壊*した痕跡の地形を生成することがある |
GLASS_ROOM | ガラスの部屋を生成することがある |
NO_CAVE | 洞窟的な地形をなるべく生成しない(人工物に近くする) |
NO_MAGIC | ダンジョン内で魔法が使えない |
NO_MELEE | ダンジョン内で攻撃ができない |
CHAMELEON | カメレオンによる擬態に関する処理を行う |
DARKNESS | 暗闇の洞窟のように感知範囲が狭くなる |
2013/01/11
■ [変愚蛮怒/スポイラー]部屋の生成型(変愚蛮怒 Ver2.1.1)
変愚蛮怒のダンジョン上で生成される部屋は15種類ある。これらは実装上build_type1()~build_type15()で各処理を行なっている。
build_type1()…Simple/基本長方形部屋
最もひねりのない、とはいっても柱などでそこそこのバリエーションを持つ部屋。
build_type2()…Overlapping/長方形二つ重ね部屋
処理上、サイズの違う部屋生成を二度行う形で成り立っている。
build_type3()…Crossed/十字部屋
これもドアや柱の構造、中央部にバリエーションがある。
build_type4()…Large/二重部屋
二重の壁を構築しつつ、内部にモンスターの集団やいくつかの構造を持つ。
build_type5()…Monster nest/モンスターネスト
中に敷き詰められたモンスターにいくつかのバリエーションを持つ。
build_type6()…Monster pit/モンスターピット
ネストとほぼ同じだが、バリエーション自体がいくつか異なる。
build_type7()…Lesser vault/小型Vault
v_info.txtで定義された一定サイズ未満の固定型地形。
build_type8()…Greater vault/大型Vault
v_info.txtで定義された一定サイズ以上の固定型地形。
build_type9()…Fractal cave/フラクタル生成部屋
複雑な曲面を生成する、部屋というよりは洞窟というべき地形。
build_type10()…Random vault/ランダムVault
格子Vaultなど、固定した形を持たない、模様状のVaultが作られる。
build_type11()…Circular rooms/円形部屋
円形の部屋。サイズは様々。
build_type12()…Crypts/聖堂
対称型で中央にアイテムやモンスターを配置する。
build_type13()…Trapped monster pit/トラップつきモンスター・ピット
中央に壁の崩れる警報装置をつけた特殊なピット。
build_type14()…Piranha/Armageddon trap room/トラップ部屋
ピラニアやハルマゲドンといった、部屋全体に大きな影響を及ぼすタイプのトラップ。見た目は必ずtype1の単純長方形部屋となる。
build_type15()…Glass/ガラス部屋
特別にガラスの壁で構成された部屋。中央に閃光系の攻撃手段を持つモンスターやアイテムが配置される。
2013/01/12
■ [変愚蛮怒/スポイラー]build_type1()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- ダンジョンにCURTAINフラグがあるとNO_CAVESがある場合1/48の確率、そうでない場合1/512の確率でカーテンのある部屋になる。
- 横サイズ:xsize = 1d11 + 1d11 + 1 を設定
- 縦サイズ:ysize = 1d4 + 1d3 + 1 を設定
- xsize, ysizeに合うスペースを探す(find_space()関数)。スペースがなければ、xsize = 3, ysize = 3でもう一度find_space()で探るが、それでも見つからなかったら生成をキャンセルする。
- 生成階 <= randint1(25)かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- これまでに固まった部屋を一旦床地形で埋め、その後外壁1マスを外壁地形で埋める。
- カーテンフラグが立っていれば、外壁からさらに1マスをカーテンで埋める。
- さもなくば1/20の確率で部屋全体の1マス毎に柱として内壁地形で埋める。
- さもなくば1/20の確率で四隅のみを柱として内壁地形で埋める。
- さらにさもなくば1/50の確率で外壁から内側1マスを1マスずつ埋める形で柱として内壁地形で埋める。
- さらにさもなくば1/50の確率で部屋を縦か横半々の確率で分割する。その際、ダンジョンにCURTAINフラグがあると、NO_CAVESがある場合1/2の確率、そうでない場合1/128の確率で部屋を分ける壁がカーテンになる。
- 以上までやっていずれかの処理に引っかからなければ、何の変哲もない長方形部屋が生成される。
2013/01/13
■ [変愚蛮怒/スポイラー]build_type2()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 予め横25マス、縦11マスの余裕があるフロアを探し、見つからなければ生成をキャンセルする。
- 生成階 <= randint1(25)かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 1つ目の部屋を部屋の中心から
- 上壁を1d4マス離す
- 下壁を1d3マス離す
- 左壁を1d11マス離す
- 右壁を1d10マス離す
- 2つ目の部屋を部屋の中心から
- 上壁を1d3マス離す
- 下壁を1d4マス離す
- 左壁を1d10マス離す
- 右壁を1d11マス離す
- こうして作成した2つの部屋を重ね合わせる形で1つの部屋にし、外壁を埋める。
■ [変愚蛮怒/スポイラー]build_type3()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 予め横25マス、縦11マスの余裕があるフロアを探し、見つからなければ生成をキャンセルする。
- 生成階 <= randint1(25)かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 十字の太さは3マスで固定する。
- 十字の縦棒の長さは3~4、横棒の長さは3~11マス。
- 十字地形を作成した後、1d4を振り、中央に以下の特別な地形を織り込む。
- 1なら中央を全て内壁地形で埋める。
- 2なら中央を全て内壁地形で埋めた後、中央にアイテムのある床を配置、4方向のいずれかにドアを配置し、周囲に2+1d3のモンスター、1+1d4のトラップを配置する。
- 3ならさらに1d3を振り以下の分岐を行う。
- 1/3の確率で中央と上下左右の部屋の間に1マス分の入り口を残して仕切りを作る。さらに1/3の確率で4つの入り口に隠し扉扱いになるものを配置。CURTAINフラグのあるダンジョンならNO_CAVESで1/16、そうでない場合1/256でカーテン、さもなくばドア、GLASS_DOORフラグ持ちのダンジョンでガラスのドア。
- 3ならさらに1d3を振り以下の分岐を行う。
- さもなくば1/3の確率で十字の柱を中央に配置。
- さもなくば1/3の確率で中央に1マス柱を配置。
- さもなくばこれ以上何もしない。
- 4ならこれ以上何もしない。
2013/01/14
■ [変愚蛮怒/スポイラー]build_type4()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 予め横25マス、縦11マスの余裕があるフロアを探し、見つからなければ生成をキャンセルする。
- 生成階 <= randint1(25)かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 確保した領域全体を一旦部屋の床にする。
- 外側1マスを外壁で埋める。
- そこから2マス内側を内壁で埋める。
- 1d5を振って以下のバリエーションを作成する。
- 1が出た場合、まず内壁の上下左右いずれかにドアを作成する。さらに中央にモンスターを9体まで配置する。
- 2が出た場合、まず内壁の上下左右いずれかにドアを作成する。中央に極小の部屋を作成しこれも4方向いずれかにドアを作成。1d3+2体のモンスターを配置する。80%の確率で中央にアイテムを配置、残り20%の確率で階段を配置する。さらに1d3+2個のトラップを中央部屋の周囲に配置する。
- 3が出た場合、まず内壁の上下左右いずれかにドアを作成する。中央に3x3マスの内壁による柱を作成する。
- 1/2の確率でさらに左右に3x3の柱を配置する。
- 1/3の確率で左右に小部屋を配置する。そのドアはCURTAINフラグのあるダンジョンの場合、NO_CAVEで1/16、そうでない場合1/256の確率でカーテンになる。そうでない場合、GLASS_DOORフラグのあるダンジョンならガラスの扉、そうでない場合普通の扉になる。それぞれの部屋にモンスターを1d2、アイテムを1/3の確率で配置する。
- 4が出た場合、まず内壁の上下左右いずれかにドアを作成する。内部の部屋にチェッカー状に柱を配置し、左右に分けた中央を起点に集団モンスター生成をそれぞれ1d3回、トラップ生成を1d3階行い、アイテムを1d3個生成する。
- 5が出た場合十字状の仕切りを作成し、部屋を4つに分け、上下左右対称形にドアを配置する。そのドアはCURTAINフラグのあるダンジョンの場合、NO_CAVEで1/16、そうでない場合1/256の確率でカーテンになる。そうでない場合、GLASS_DOORフラグのあるダンジョンならガラスの扉、そうでない場合普通の扉になる。アイテムを1d4個部屋の中央付近の隅に配置し、各部屋に1d4回の集団モンスター生成を行う。
2013/01/15
■ [変愚蛮怒/スポイラー]build_type5()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 最初にどのような部屋にするかを確定する。巣(nest)には予め以下のテーブルが定義されている。
名称 | モンスター選別関数1 | モンスター選別関数2 | 生成階 | chance |
"クローン" | vault_aux_clone | vault_prep_clone | 5 | 3 |
"ゼリー" | vault_aux_jelly | NULL | 5 | 6 |
"シンボル(善)" | vault_aux_symbol_g | vault_prep_symbol | 25 | 2 |
"シンボル(悪)" | vault_aux_symbol_e | vault_prep_symbol | 25 | 2 |
"ミミック" | vault_aux_mimic | NULL | 30 | 4 |
"狂気" | vault_aux_cthulhu | NULL | 70 | 2 |
"犬小屋" | vault_aux_kennel | NULL | 45 | 4 |
"動物園" | vault_aux_animal | NULL | 35 | 5 |
"教会" | vault_aux_chapel_g | NULL | 75 | 4 |
"アンデッド" | vault_aux_undead | NULL | 75 | 5 |
- pick_vault_type()で現在の階>生成階で、かつd_info.txtのnestビットで許可されているパターンのみを生成の対象にする。各巣が選ばれる確率は その巣のchance値/生成チャンスのある全ての巣のchance 総計である。
- 該当の巣がない場合生成をキャンセルする。
- モンスター選別関数1と2を元に現在の階+11のモンスターを一体選ぶ。100回試行して選べなければ部屋の生成キャンセル。
- そのモンスターの属性がEVILなら、生成条件にEVILフラグ持ち、GOODフラグなら生成条件にGOODフラグを持たせる。
- 予め横25マス、縦11マスの余裕があるフロアを探し、見つからなければ生成をキャンセルする。
- 確保した領域全体を一旦部屋の床にする。
- 外側1マスを外壁で埋める。
- そこから2マス内側を内壁で埋める。
- 内壁の上下左右いずれかにドアを作成する。
- 中の19x5マスを全てモンスター選別関数1と2の条件を満たしたモンスターで埋め尽くす。
モンスター選別関数の実質基準
巣内の生成対象になるモンスターは前提としてUNIQUE(ユニーク)、UNIQUE2(準ユニーク)、RES_ALL(はぐれメタル耐性)、AQUATIC(水棲)のいずれでもない。
その上で、各モンスター選別関数は以下のような条件を提示する。
- vault_prep_clone()
- 現在の階+10までのモンスター1体を標準生成対象にする。
- vault_prep_symbol()
- シンボルを一種類に固定する。
- vault_aux_clone()
- 常にvault_prep_clone()で定められた1種のモンスターだけを生成する。
- vault_aux_jelly()
- KILL_BODY(周辺のモンスターを殺す)かつNEVER_BLOW(打撃を行わない)フラグを持つモンスターは除外。
- EVIL(邪悪)なモンスターは除外。
- シンボルが'ijm'のモンスターのみを生成対象にする。
- vault_aux_symbol_g()
- KILL_BODY(周辺のモンスターを殺す)かつNEVER_BLOW(打撃を行わない)フラグを持つモンスターは除外。
- EVIL(邪悪)なモンスターは除外。
- vault_prep_symbol()で指定した一種類のシンボルだけを限定して生成する。
- vault_aux_symbol_e()
- KILL_BODY(周辺のモンスターを殺す)かつNEVER_BLOW(打撃を行わない)フラグを持つモンスターは除外。
- GOOD(善良)なモンスターは除外。
- vault_prep_symbol()で指定した一種類のシンボルだけを限定して生成する。
- vault_aux_mimic()
- シンボル"!$&(/=?[\|"のモンスターのみを生成対象にする。
- vault_aux_cthulhu()
- KILL_BODY(周辺のモンスターを殺す)かつNEVER_BLOW(打撃を行わない)フラグを持つモンスターは除外。
- ELDRITCH_HORROR(狂気を引き起こす)モンスターのみを生成対象にする。
- vault_aux_kennel()
- シンボル"CZ"のモンスターのみを生成対象にする。
- vault_aux_animal()
- ANIMAL(自然界の動物)フラグ持ちのモンスターのみを生成対象にする。
- vault_aux_chapel_g()
- EVIL(邪悪)なモンスターは除外。
- 銀のエンゼル、金のエンゼルは除外。
- シンボル"A"のモンスターか、以下のモンスターのみを生成対象にする。「見習プリースト」「見習いパラディン」「見習いプリースト(集団生成型)」「見習いパラディン(集団生成型)」「プリースト」「緑衣の修行僧」「白衣の修行僧」「黒衣の修行僧」「黄衣の修行僧」「超エリート・パラディン」「白騎士」「聖堂騎士」
- vault_aux_undead()
- UNDEAD(アンデッド)フラグ持ちのモンスターのみを生成対象にする。
2013/01/16
■ [変愚蛮怒/スポイラー]build_type6()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
build_type5()とは似て非なる処理。大きく違うのはモンスター生成の構造が模様状になることである。
##################### #0000000000000000000# #0112233455543322110# #0112233467643322110# #0112233455543322110# #0000000000000000000# #####################
7から0へと強い順に条件を満たすモンスターで埋められていく。
- 最初にどのような部屋にするかを確定する。ピット(pit)には予め以下のテーブルが定義されている。
名称 | モンスター選別関数1 | モンスター選別関数2 | level | chance |
"オーク" | vault_aux_orc | NULL | 5 | 6 |
"トロル" | vault_aux_troll | NULL | 20 | 6 |
"ジャイアント" | vault_aux_giant | NULL | 50 | 6 |
"狂気" | vault_aux_cthulhu | NULL | 80 | 2 |
"シンボル(善)" | vault_aux_symbol_g | vault_prep_symbol | 70 | 1 |
"シンボル(悪)" | vault_aux_symbol_e | vault_prep_symbol | 70 | 1 |
"教会" | vault_aux_chapel_g | NULL | 65 | 2 |
"ドラゴン" | vault_aux_dragon | vault_prep_dragon | 70 | 6 |
"デーモン" | vault_aux_demon | NULL | 80 | 6 |
"ダークエルフ" | vault_aux_dark_elf | NULL | 45 | 4 |
- pick_vault_type()で現在の階>生成階で、かつd_info.txtのpitビットで許可されているパターンのみを生成の対象にする。各巣が選ばれる確率は その巣のchance値/生成チャンスのある全ての巣のchance 総計である。
- 該当の巣がない場合生成をキャンセルする。
- モンスター選別関数1と2を元に現在の階+11のモンスターを16種類選ぶ。(重複あり)各自100回試行して選べなければ部屋の生成キャンセル。
- そのモンスターの属性がEVILなら、生成条件にEVILフラグ持ち、GOODフラグなら生成条件にGOODフラグを持たせる。
- 予め横25マス、縦11マスの余裕があるフロアを探し、見つからなければ生成をキャンセルする。
- 確保した領域全体を一旦部屋の床にする。
- 外側1マスを外壁で埋める。
- そこから2マス内側を内壁で埋める。
- 内壁の上下左右いずれかにドアを作成する。
- 中の19x5マスを上記ピット模様の0~7の形で埋め尽くす。順番は16種類のレベルの低い方からソートした奇数順。
モンスター選別関数の実質基準
巣内の生成対象になるモンスターは前提としてUNIQUE(ユニーク)、UNIQUE2(準ユニーク)、RES_ALL(はぐれメタル耐性)、AQUATIC(水棲)のいずれでもない。
前回の巣(nest)で使われているものは省略する。
- vault_aux_orc()
- UNDEAD(アンデッド)フラグ持ちモンスターは除外。
- ORC(オーク)フラグ持ちモンスターのみを選別。
- vault_aux_troll()
- UNDEAD(アンデッド)フラグ持ちモンスターは除外。
- TROLL(トロル)フラグ持ちモンスターのみを選別。
- vault_aux_giant()
- GOOD(善良)なモンスターは除外。
- UNDEAD(アンデッド)フラグ持ちモンスターは除外。
- GIANT(巨人)フラグ持ちモンスターのみを選別。
- vault_prep_dragon()
- 1d6を振り、1~5は順にBR_ACID、BR_ELEC、BR_FIRE、BR_COLD、BR_POISのブレスを持つモンスターのみを生成対象にする。6は5種全て。つまり実質、ブラック・ドラゴン、ブルー・ドラゴン、レッド・ドラゴン、ホワイト・ドラゴン、グリーン・ドラゴン、万色ドラゴンの系統に絞ることになる(ドゥーム・ドレイクなどの亜種も含む)
- vault_aux_dragon()
- UNDEAD(アンデッド)フラグ持ちモンスターは除外。
- DRAGON(ドラゴン)フラグ持ちモンスターのみを選別。
- vault_prep_dragon()で予め定められた属性ブレスを持つモンスターのみを選別。
- vault_aux_demon()
- KILL_BODY(周辺のモンスターを殺す)かつNEVER_BLOW(打撃を行わない)フラグを持たないモンスターは除外。
- DEMON(悪魔)フラグ持ちモンスターのみを選別。
- vault_aux_dark_elf()
- 以下の固定枠から選ぶ。ダークエルフ、ダークエルフ・メイジ、ダークエルフ戦士、ダークエルフ・ロード、ダークエルフ・ウォーロック、ダークエルフ・ドルイド僧、ナイトブレード、ダークエルフ・ソーサラー、闇エルフの影。
2013/01/17
■ [変愚蛮怒/スポイラー]build_type7()/build_type8()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
この両関数は、双方ともvaultの生成を行うものだが、内容としてはv_info.txt上で生成条件を7の時にするか、8の時にするかの違いがあるのみで、生成処理そのものは全く同一であった。なのでまとめて説明してしまう。
build_type7()/build_type8()内の処理
- v_info.txtから一様ランダムに一つvaultのデータを取得し、それがbuild_type7あるいはbuild_type8用のものであるまで試行をSAFE_MAX_ATTEMPTS(5000回)繰り返す。
- 繰り返しても得られなければ生成キャンセル。
- 回転や反転を行うフラグのために0~7の乱数を振る。
- 横が広すぎて、90/270度回転すると、ダンジョンの縦に入りきらないのなら、90/270度回転のフラグはキャンセルする。
- coord_trans()関数による処理。
- フラグ値を4で割った余り値分だけ、90度ずつ回転する。
- 4で割って1ならy軸対称に反転する。
- こうして確定したサイズに、当てはまる余地がフロアに残っていない場合は生成キャンセル。
- 以上で問題が無ければbuild_vault()関数で生成。
build_vault()関数による実際の生成処理
v_info.txt上で定められた以下の地形定義に従って生成する。
'%' | 花崗岩の壁(外壁) |
'#' | 花崗岩の壁(内壁) |
'$' | ガラスの壁(内壁) |
'X' | 永久壁(内壁) |
'Y' | ガラスの永久壁(内壁) |
'*' | 75%でアイテム、25%でトラップ |
'+' | 隠しドア |
'\' | カーテン |
'^' | トラップ |
'p' | パターンのスタート地点 |
'a' | パターンの道中1 |
'b' | パターンの道中2 |
'c' | パターンの道中3 |
'd' | パターンの道中4 |
'P' | パターンの終点 |
'B' | パターンの脱出点 |
'A' | パターンの報酬アイテム(階+12レベルのGOOD/GREATアイテム) |
'&' | 階+5レベルのモンスター |
'@' | 階+11レベルのモンスター |
'9' | 階+9レベルのモンスター&階+7レベルのGOODアイテム |
'8' | 階+40レベルのモンスター&階+20レベルのGOOD/GREATアイテム |
',' | 50%の確率で階+3レベルのモンスター、さもなくば50%の確率で階+7のレベルのアイデム、さもなくば何もなし |
2013/01/18
■ [変愚蛮怒/スポイラー][追記予定]build_type9()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 縦(1d15)*2+6マス、横(1d22)*2+6マスのサイズを指定し生成できる空きフロアを探す。
- 見つからない場合、縦8マス、8マスまで縮小して再度空きフロアを探す。それでも見つからない場合build_type1()に処理を回してbuild_type9()の生成はキャンセルする。
- 生成階 <= 1d25かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 以上で問題が無ければフラクタル生成を開始する。
フラクタルの具体的な生成処理については、かなりトレースが困難なので、いずれ別項を立てる。具体的にはgenerate_hmap()関数及びgenerate_fracave()関数により実装されており、この処理は、湖の生成などにも応用されている。
■ [変愚蛮怒/スポイラー]build_type10()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 縦(1d11)+11マス、横(1d22)+22マスのサイズを指定し生成できる空きフロアを探す。
- 見つからない場合生成はキャンセルする。
- 1d15を振り、それに合わせて以下のランダムvaultを生成する。ただし、ダンジョンの設定にそぐわないvaultであった場合は振りなおす。
- 1か9でbuild_bubble_vault()、ただしNO_CAVEフラグのダンジョンでは振りなおし。
- 2か10でbuild_room_vault()
- 3か11でbuild_cave_vault()、ただしNO_CAVEフラグのダンジョンでは振りなおし。
- 4か12でbuild_maze_vault()
- 5か13でbuild_mini_c_vault()
- 6か14でbuild_castle_vault()
- 7か15でbuild_target_vault()
- 8でbuild_elemental_vault()、ただしNO_CAVEフラグのダンジョンでは振りなおし。
2013/01/19
■ [変愚蛮怒/スポイラー]各部屋の生成率(変愚蛮怒 Ver2.1.1)
各部屋の生成率は、10F毎に以下のような生成比が与えられている。各階の中間の場合は確率的に近い方の基準で行う。(例えば52Fなら80%で50F、20%の確率で60Fの基準で行う)
部屋型 | 最低生成階 | 0F | 10F | 20F | 30F | 40F | 50F | 60F | 70F | 80F | 90F | 100F- |
1/NORMAL | 0 | 999 | 900 | 800 | 700 | 600 | 500 | 400 | 300 | 200 | 100 | 0 |
2/OVERLAP | 1 | 1 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
3/CROSS | 3 | 1 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
4/INNER_F | 3 | 1 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
5/NEST | 10 | 0 | 1 | 1 | 1 | 2 | 3 | 5 | 6 | 8 | 10 | 13 |
6/PIT | 10 | 0 | 1 | 1 | 2 | 3 | 4 | 6 | 8 | 10 | 13 | 16 |
7/LESSER_V | 10 | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 5 | 6 | 8 | 10 |
8/GREATER_V | 20 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | 4 |
9/FRACAVE | 10 | 0 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 999 |
10/RANDOM_V | 10 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 |
11/OVAL | 3 | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 |
12/CRYPT | 10 | 1 | 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 |
13/TRAP_PIT | 20 | 0 | 0 | 1 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 8 |
14/TRAP | 20 | 0 | 0 | 1 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 8 |
15/GLASS | 40 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 2 |
以上の生成比は以下の条件で修正がかかる。
- ダンジョンにBEGINNER、CHAMELEON、SMALLESTいずれのフラグもなく、かつ「常に通常でない部屋を生成する」フラグがONなら、GRATER_V=1、それ以外が=0になる。
- ダンジョンにNO_VAULTフラグがあると、LESSER_V=0、GREATER_V=0、RANDOM_V=0。
- ダンジョンにNO_CAVEフラグがある場合
- FRACAVEの生成枠がNORMALに与えられる。
- CRIPT、OVALの生成枠がINNER_Fに与えられる。
- ダンジョンにCAVEフラグがある場合
- NORMALの生成枠がFRACAVEに与えられる。
- ダンジョンの基本地形が最初から渓谷かアリーナ型の場合 FRACAVE=0。
- ダンジョンに最初からGLASS_ROOMフラグがあると、GLASS=0。
2013/01/20
■ [変愚蛮怒/スポイラー]build_type11()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 生成階 <= 1d15かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 半径を1d9-1で指定して、縦横共に半径*2+1マスの生成可能な空きフロアを探す。なければ生成キャンセル。
- 確保したフロアを全て走査して、distance()関数で得られる中央からの距離<=rad-1なら、床地形で埋める。
- そうでなくdistance()関数で得られる中央からの距離<=rad+1なら、外壁地形で埋める。
■ [変愚蛮怒/スポイラー]build_type12()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
- 地形生成のランダム要素として以下の値を乱数で振る。
- h1 = 1d32 - 16
- h2 = 1d16
- h3 = 1d32
- h4 = 1d32 - 16
- 生成階 <= 1d5かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 半径を1d9で指定して、縦横共に半径*2+3マスの生成可能な空きフロアを探す。なければ生成キャンセル。
- build_type10()と同じく、距離に応じて、確保した全フロアで床と外壁を指定するのだが、この場合h1~h4の歪みにより"誤った"答えを与えるdist2()関数により、独特の曲面を形成させる。そのままソースコードを引用すると以下の通り。
/* * Hacked distance formula - gives the 'wrong' answer. * Used to build crypts */ static int dist2(int x1, int y1, int x2, int y2, int h1, int h2, int h3, int h4) { int dx, dy; dx = abs(x2 - x1); dy = abs(y2 - y1); /* Basically this works by taking the normal pythagorean formula * and using an expansion to express this in a way without the * square root. This approximate formula is then perturbed to give * the distorted results. (I found this by making a mistake when I was * trying to fix the circular rooms.) */ /* h1-h4 are constants that describe the metric */ if (dx >= 2 * dy) return (dx + (dy * h1) / h2); if (dy >= 2 * dx) return (dy + (dx * h1) / h2); return (((dx + dy) * 128) / 181 + (dx * dx / (dy * h3) + dy * dy / (dx * h3)) * h4); /* 128/181 is approx. 1/sqrt(2) */ }
- dist2() <= 半径-1か、半径3以内の地形を床、そうでなければ外壁地形で埋める。
- 以上によりにいかにも聖堂らしい、対称系の独特の形状が形成される。
- 中央の縦横5マスが床地形でなければ、この時点で生成を終了する。
- 1/2の確率で中央に1マスの極小の部屋を生成。
- 中央に通常生成のアイテムを一つ置く。
- 中央を中心に2+1d2のモンスターを配置。
- 中央を中心に1+1d3のトラップを配置。
2013/01/21
■ [変愚蛮怒/スポイラー]build_type13()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
基本的な形状は以下の通り。0~7で配置されるモンスターの種類と選別法はbuild_type6()(pit生成)と同じものが使われている。
######################### # # ####################### # #####001123454321100### # ###0012234567654322100# # ####################### # # ^ # # ####################### # #0012234567654322100### # ###001123454321100##### # ####################### # # #########################
- pit生成時と同じテーブルで、pitの種別を決める。http://sikabane-works.net/monzetsu_diary/?date=20130116#p01より再掲して以下の通り。
名称 | モンスター選別関数1 | モンスター選別関数2 | level | chance |
"オーク" | vault_aux_orc | NULL | 5 | 6 |
"トロル" | vault_aux_troll | NULL | 20 | 6 |
"ジャイアント" | vault_aux_giant | NULL | 50 | 6 |
"狂気" | vault_aux_cthulhu | NULL | 80 | 2 |
"シンボル(善)" | vault_aux_symbol_g | vault_prep_symbol | 70 | 1 |
"シンボル(悪)" | vault_aux_symbol_e | vault_prep_symbol | 70 | 1 |
"教会" | vault_aux_chapel_g | NULL | 65 | 2 |
"ドラゴン" | vault_aux_dragon | vault_prep_dragon | 70 | 6 |
"デーモン" | vault_aux_demon | NULL | 80 | 6 |
"ダークエルフ" | vault_aux_dark_elf | NULL | 45 | 4 |
- ダンジョンが鉄獄以外では生成キャンセルされる。(build_type13()の関数内でハードコーディングされたもので、一昨日の記事の処理とは別に判別している)
- pick_vault_type()で現在の階>生成階で、かつd_info.txtのpitビットで許可されているパターンのみを生成の対象にする。各pitが選ばれる確率は そのpitのchance値/生成チャンスのある全てのpitのchance 総計である。
- 該当のpitがない場合生成をキャンセルする。
- モンスター選別関数1と2を元に現在の階+11のモンスターを16種類選ぶ。(重複あり)各自100回試行して選べなければ部屋の生成キャンセル。
- そのモンスターの属性がEVILなら、生成条件にEVILフラグ持ち、GOODフラグなら生成条件にGOODフラグを持たせる。
- 予め横25マス、縦13マスの余裕があるフロアを探し、見つからなければ生成をキャンセルする。
- 上図のようなS型クランクとその内部にpitを充填した地形を作成する。1/2の確率で左右反転した形状となる。
- 中央に開門トラップを配置する。
- 中の19x5マスを上記ピット模様の0~7の形で埋め尽くす。順番は16種類のレベルの低い方からソートした奇数順。
開門トラップの具体的な作用
(void)project(0, 3, y, x, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1); (void)project(0, 3, y, x - 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1); (void)project(0, 3, y, x + 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1); aggravate_monsters(0);
ダメージ0の分解属性の球を半径3でトラップの地点、トラップの右に4マス、左に4マスそれぞれに発生させることで壁が開く。ついでにモンスターの絶叫の同じ効果でモンスターは加速されることになる。
2013/01/22
■ [変愚蛮怒/スポイラー]build_type14()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
基本はbuild_type1()の柱やカーテンを全く持たない部屋を生成するのと同じである。
- 横サイズ:xsize = 1d11 + 1d11 + 1 を設定
- 縦サイズ:ysize = 1d4 + 1d3 + 1 を設定
- xsize, ysizeに合うスペースを探す(find_space()関数)。スペースがなければ、xsize = 3, ysize = 3でもう一度find_space()で探るが、それでも見つからなかったら生成をキャンセルする。
- 生成階 <= randint1(25)かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- これまでに固まった部屋を一旦床地形で埋め、その後外壁1マスを外壁地形で埋める。
- トラップを、部屋中央を起点に、-ysize/4~ysize/4, -xsize/4~xsize/4の位置一箇所に配置する。
- トラップの種類は、現在階 < 30 + 1d30ならばピラニアトラップ、そうでなければハルマゲドントラップになる。
以上の生成から結論を言うと、「柱やカーテンの全くない長方形の部屋ではなるべく隅を歩く」そうすれば、未感知のピラニア/ハルマゲドントラップにかかる可能性は微粒子レベルに存在する程度になる。狂戦士兄貴は参考にして、どうぞ。
ピラニアトラップの作用
- 威力1/半径10の水地形生成ボール。
- 1+現階層/20回のピラニア生成。ピラニア自体に集団生成の性質があるので実数はさらに数倍になる。
ハルマゲドントラップの作用
levs[10] = {0, 0, 20, 10, 5, 3, 2, 1, 1, 1};
10F毎の生成回数を上記の用に定義する。
- 生成階をpowerとして、powerが20未満になるまで以下の処理を繰り返す。
- 生成数をnum = levs[MIN(lev/10, 9)]で取得。numの回数だけ以下の処理を繰り返す。
- トラップの位置から横左右7マス、縦上下5マス内のどこか1箇所を定める。そこが射線が通らない場所である場合キャンセル。
- そのマスを中心にpower階相当の善良な天使(シンボル'A'かつGOOD)と、悪魔か邪悪な天使(DEMONフラグ持ちかシンボル'A'かつEVIL)を1対ずつ生成する。
- その天使と悪魔は初期状態でお互いを標的にしている。
- num回生成を終えたらpowerを1 + power/16減らして最初から繰り返す。
- 生成数をnum = levs[MIN(lev/10, 9)]で取得。numの回数だけ以下の処理を繰り返す。
2013/01/23
■ [変愚蛮怒/スポイラー]build_type15()の部屋生成プロセス(変愚蛮怒 Ver2.1.1)
2013/01/24 追記
コメント欄で指摘頂いた件が判明したので修正。
本文
- 横サイズ:xsize = 9~13 を設定
- 縦サイズ:ysize = 9~13 を設定
- xsize+2, ysize+2に合うスペースを探す(find_space()関数)。スペースがなければ、生成をキャンセルする。
- 生成階 <= randint1(25)かつダンジョンにDARKNESSフラグがないなら、部屋全体を最初から明るくする。
- 一旦確保した全フロアをガラスの床に変える。
- 確保したフロアの周囲1マスをガラスの壁に変える。ただし、ダンジョンの生成によっては下図の通り、通路部分や低確率の生成により従来通りの壁が生成されることもある。
- ガラス部屋に固定配置できるモンスターを定義する。以下の2パターンがある。
- 閃光攻撃持ちモンスター
- vault配置可能モンスターであること(ユニークでなく、水棲でないこと)
- 閃光のブレス(BR_LITE)かスター・バースト(BA_LITE)を持っていること。
- 壁抜け(PASS_WALL)、壁破壊(KILL_WALL)、分解のブレス(BR_DISI)を持っていないこと。
- 破片攻撃持ちモンスター
- vault配置可能モンスターであること(ユニークでなく、水棲でないこと)
- 破片のブレス(BR_SHAR)持ちであること。
- 閃光攻撃持ちモンスター
- 1d3を振って、出た目に応じて以下の地形を中央に生成する。
- 1の場合、下図のように4つの極小部屋に閃光属性攻撃モンスターを配置し、中央に薬のある部屋を置く、中央の部屋はいずれか4方向にガラスの扉を持つ。
- 2の場合、下図のように、一つのカーテンに囲まれた極小部屋に閃光属性攻撃モンスターを一つ配置する。
- 3の場合、下図のように中央の部屋に4体の破片属性攻撃モンスターと薬2つを配置する。
■ Nadir [いつも興味深く拝見しております。ガラス部屋に配置されるモンスターなのですが、閃光攻撃持ちだけではなく、薬とガラスを破..]
■ deskull [仰る通りで、今回生成している例でも明らかに破片攻撃持ちのモンスターが配置されているケースもままあるようです。何処か誤..]
■ deskull [見落とした場所が判明したので修正しました。 スクリーンショット見れば一目瞭然だったのですが、3のケースの場合のみ破..]
■ クレクレくん [いつか通路接続のアルゴリズムをばお願いします…]
■ deskull [返信チェック思いっきり遅れました。失敬。 確かに題材にはなりそうですし、折あればやってみます。]
2013/01/24
■ [変愚蛮怒/スポイラー] level_gen()関数によるフロアサイズ確定の流れ(変愚蛮怒 Ver2.1.1)
ダンジョン生成の処理の内、最も根幹にあるgenerate_cave()の内、ダンジョン(地上より深いフロア)の処理はlevel_gen()関数で定義されている。
level_gen()関数は、グローバル変数(怨)dungeon_typeをidとして、 d.info.txtで定義されたダンジョン情報をd_info配列上より参照し、フロアサイズの確定を行なった後、フロアの中身をcave_gen()関数に任せる。
- 以下の条件で「小さなフロア」を生成する。
- オプションによる「常に非常に小さいフロアを生成する」をONにしている
- 「非常に小さいフロアの生成を可能にする」をONにしている状態では1/3の確率。
- ダンジョンにBEGINNERフラグがある。
- ダンジョンにSMALLESTフラグがあり、かつBIGフラグがない時。
- 「小さなフロア状態」ではサイズを以下の通りに定める。
- SMALLESTの時は縦横1画面分に完全固定(66x22)。
- BEGINNERの時は縦横2画面分に完全固定(132x44)。
- さもなくば、縦横をそれぞれ1d2画面分に定める。
- そうでない場合、最大縦横3画面分(198x66)にする。
2013/01/25
■ [変愚蛮怒/スポイラー]cave_gen()関数によるフロアの内容生成の流れ(変愚蛮怒 Ver2.1.1)
思った以上に分化せずにクッソ長い関数処理なのでそのうちまた別項を立てて詳細を説明する。
- set_floor_and_wall()関数によりダンジョン毎に指定された、内壁、外壁などを設定。
- モンスター生成比を標準に差し戻す。
- 通路生成に使用する定数を、#define定義された範囲内で各自定める。
- level_gen()関数以前にサイズ確定したフロアを11マス毎にブロックとして区切る。これを部屋生成の基準に利用する。
- 「常にアリーナレベルを生成する」オプションをONにしているか、ダンジョンにARENAフラグがある場合、さもなくば1/24の確率で、アリーナレベルとなり、生成時点でダンジョンが空洞(床)になる。
- アリーナレベルで無い場合はダンジョンを基本の壁(extra)で埋め尽くす。
- gen_caverns_and_lakes()に処理を移し、以下の条件でフロア全体に影響を及ぼす地形フラグを立てる。
- 30Fより深く、1/36の確率で、小さい階の生成をオプションで許可し、ダンジョンにDESTROYフラグがあるなら、*破壊*地形の生成フラグをONにする。その際、1/2の確率で見栄えのために予め湖や洞穴を追加生成する。
- 1/24の確率で、アリーナ地形でなく、前述の破壊地形フラグが立っておらず、LAKE_WATER、LAKE_TREE、LAKE_RUBBLE、LAKE_LAVAのいずれかのフラグをダンジョンが持っていれば「湖地形」生成のため以下の処理を行う。
- count値を設け、各フラグが存在する毎に+3の値を追加する。
- LAKE_LAVAフラグを持っていて80Fより深いならば2/countの確率で溶岩の川を生成する。
- countを2減らす。
- まだ湖地形が確定せず、LAKE_LAVAフラグを持っていて80Fより深いならば1/countの確率で火のVaultを生成する。
- countを1減らす。
- まだ湖地形が確定せず、LAKE_WATERフラグを持っていて50Fより深いならば2/countの確率で水の川を生成する。
- countを2減らす。
- まだ湖地形が確定せず、LAKE_WATERフラグを持っていて50Fより深いならば1/countの確率で水のVaultを生成する。
- countを1減らす。
- まだ湖地形が確定せず、LAKE_RUBBLEフラグを持っていて35Fより深いならば2/countの確率で洞窟を生成する。
- countを2減らす。
- まだ湖地形が確定せず、LAKE_RUBBLEフラグを持っていて35Fより深いならば1/countの確率で地のVaultを生成する。
- countを1減らす。
- まだ湖地形が確定せず、LAKE_TREEフラグを持っていて5Fより深いならば風のVaultを生成する。
- countを1減らす。
- 実際に各地形を生成する。
- 20Fより深く、アリーナ地形でなく、ダンジョンにCAVERNフラグがあり、湖地形の生成も、破壊地形もなく、1d1000<生成階ならば、洞窟地形の生成を行う。(build_cavern()によるもので湖地形上の「洞窟」とは処理が異なる)
- クエスト実行中の階ならば、破壊地形フラグをここでキャンセルする。
- ダンジョンがMAZEフラグ持ちなら、この時点でフロア全体を迷宮の形に生成して、下り階段を2d3、上り階段を1d3作って処理を終える。
- そうでない場合、通常の部屋群生成をgenerate_rooms()で行う。
- 1Fの場合、1/2の確率で小さな森を生成する。
- 破壊地形フラグがあったら、この時点で破壊地形を作成する。
- 1/3の確率で、1d(生成階)>5ならgen_caverns_and_lakes()関数で立った、溶岩地形、水地形フラグに応じて川を生成する。(詳細は別項予定)
- generate_rooms()関数で作られた部屋間の通路を作成する。(詳細は別項予定)
- 部屋と通路の間にドアを生成する。
- 3d4の下り階段と、1d2の上り階段を生成。
- 湖地形が作られていない場合、ストリーマー(壁の中に混じる別の特殊な壁や鉱脈)を生成する。
- 上下左右の端を永久壁で囲う。
- @さんを配置。
- クエストモンスターを配置。
- ランダムモンスターを配置。
- アイテムやゴールドを配置。
- ダンジョンの主を配置。
- アリーナレベルで、4/5の確率か1d100>生成階でかつ、DARKNESSフラグがないならダンジョン全体を明るくする。
2013/01/26
■ [変愚蛮怒/スポイラー]generate_rooms()による部屋生成プロセスの流れ(変愚蛮怒 Ver2.1.1)
- area_sizeを 100 * フロアの縦サイズ * フロアの横サイズ / 66(縦最大サイズ) / 192(横最大サイズ)で定める。
- 部屋の生成回数は40 * area_size / 100 となる。
- 各部屋の生成率を定める。
- 部屋の生成回数を各部屋の生成率に基づいて割り振る。
- ROOM_T_NEST/ROOM_T_PIT/ROOM_T_LESSER_VAULT/ROOM_T_TRAP_PIT/ROOM_T_GLASSは大きな部屋とみなし、生成回数のカウントを2つ消費する。
- ROOM_T_GREATER_VAULT/ROOM_T_RANDOM_VAULTはさらに大きな部屋とみなし、生成回数のカウントを3つ消費する。
- 確定した各部屋の生成数分だけ、順に生成を試みていく。
- ROOM_T_PIT/ROOM_T_NEST/ROOM_T_TRAP_PITについては2つ以上の生成が成功したら、それ以降は生成をキャンセルする。(コメントによれば、モンスター生成数の限界を超えることで、フロアの生成が失敗することを避けるため)
- 生成できた部屋が1つもなければフロアの生成を失敗扱いにする。
2013/01/27
■ [変愚蛮怒/スポイラー]ダンジョンフロアにおけるモンスター配置の流れ(変愚蛮怒 Ver2.1.1)
cave_gen()関数によるフロアの内容生成の流れ中で行われる処理の詳細として追う。
モンスターの生成回数の確定
- ダンジョン毎に指定されるmin_m_alloc_levelの値を基準にモンスター配置回数を定める。
- min_m_alloc_levelによる生成回数の基本値は3x3画面分(縦66マス、横198マス)を基準にしたもので、それより小さいダンジョンについては縦横を比例して基本値を割る。(例えば2x2画面分なら4/9になる)
- 生成回数に1d8を加える。
- 生成回数に生成階に基づく加算を与える、加算数は生成階 / 3だが2回未満なら2、10回より多ければ10回に留められる。
- 最終的に算出された回数分alloc_monster()関数でモンスター配置を試行する。
alloc_monster()関数の流れ
- 最初にalloc_guardian()関数を走らせて、優先的にダンジョンの主を配置し、成功したらそのまま処理を終了する。当然最深層以外では無関係である。
- ダンジョンの主を配置済か配置する必要がないなら、ランダムモンスターの配置を試みる10000回に渡ってランダムに空いているマスを検索し、配置可能な場所があったらそこに確定。繰り返して確定しかなった場合は失敗として処理を終える。
- 1d5000<生成階ならば、alloc_horde()関数によるモンスターの大群を生成する処理に移行する。
- そうでなければplace_monster()関数により単体生成を試みる。
alloc_horde()関数の流れ
- ダンジョン的に相応しいモンスターの種類、と配置先に相応しいモンスターの種類をget_monster_hook(),get_monster_hook2()関数により規定する。
- 1000回にわたりランダムにモンスターの選別を試行して、それがユニークかはぐれメタル以外ならそれに確定する。試行しても確定しなかったら生成キャンセル。
- 最初のモンスターを実際に配置する。
- その語5+1d10回に渡り、パワー(生成階+5)相当の同族召喚と等価の形でplace_monster_aux()関数による配置を繰り返す。
place_monster()関数の流れ
- ダンジョン的に相応しいモンスターの種類、と配置先に相応しいモンスターの種類をget_monster_hook(),get_monster_hook2()関数により規定する。
- 選別でモンスターを一つ選び、place_monster_aux()関数で定めた位置に配置を試みる。
2013/01/28
■ [変愚蛮怒/スポイラー]place_monster_aux()関数の処理の流れ(変愚蛮怒 Ver2.1.1)
place_monster_aux()関数はゲーム実装中の随所に散りばめられている、具体的に確定したモンスター種族を確定した場所に配置する関数で、大抵のダンジョン上のスポーン処理はこれを根幹に行われる。
place_monster系の関数にはモンスターを生成する際、その状態を確定するために以下のようなフラグが指定できる。
PM_ALLOW_SLEEP | 眠っている状態で生成されることがある |
PM_ALLOW_GROUP | モンスター種族に依存した各種集団生成を許可する |
PM_FORCE_FRIENDLY | 必ず友好的な状態で生成される |
PM_FORCE_PET | 必ずペットとして生成される |
PM_NO_KAGE | 「あやしい影」として生成されない |
PM_NO_PET | ペットとして生成されることはない |
PM_ALLOW_UNIQUE | ユニークの生成を許可する |
PM_IGNORE_TERRAIN | モンスター種族上侵入できない地形上であっても生成する |
PM_HASTE | 加速状態で召喚される |
PM_KAGE | 必ず「あやしい影」として生成される |
PM_MULTIPLY | MULTIPLYフラグ持ちモンスターが増殖した向けに擬態や「あやしい影」状態を継承する |
以上を前提に処理の流れを見る。
place_monster_aux()
- PM_NO_KAGEフラグが無ければ1/333の確率でPM_KAGEフラグを立てる。
- 以上のフラグを引き継いだ上でplace_monster_one()関数に処理を移して、モンスターをまず1体配置する。
- PM_ALLOW_GROUPフラグが無ければこの時点でplace_monster_aux()終了。
- FRIENDSフラグ持ちのモンスターなら、place_monster_group()に処理を移す。
- ESCORTフラグ持ちのモンスターなら、以下の生成処理を32回試みる。
- 周囲3マスのモンスター生成可能マスをランダムに選び、そこにモンスターがいれば1回キャンセルする。
- 以下の条件のモンスターを護衛として生成対象にする。
- そのダンジョンに生成され得るモンスターであること。
- その地形に侵入可能であること。
- ユニークでないこと。
- 元のモンスターと同じモンスター種族でないこと。
- シンボルが同じであること。
- 元のモンスター未満のレベルであること。
- 善良、邪悪による対立関係にないこと。
- 以上条件を満たしたモンスターを生成階に合わせて1つ選びplace_monster_one()で1体配置する。
- 護衛となるモンスターがFRIENDS持ちか、大本のモンスターがESCORT"S"フラグ持ちならさらにplace_monster_group()による生成を行う。
place_monster_one()とplace_monster_group()の処理の流れはまた後日。
2013/01/29
■ [変愚蛮怒/スポイラー]place_monster_one()関数の処理の流れ(変愚蛮怒 Ver2.1.1)
単体でモンスターを配置する関数。
- 広域マップ上では生成キャンセル。
- フロアの範囲外では生成キャンセル。
- 0は生成されない。
- PM_IGNORE_TERRAINフラグでの生成では無い場合パターンのマスやモンスターの侵入可能な地形で無い場合キャンセル。
- 闘技場以外では、同じフロアに既に規定数以上のモンスターが生成されている場合はキャンセルされる。
- ユニーク/準ユニークの場合1体まで
- ナズグルの場合5体まで
- 『バーノール=ルパート』は、摂政『バーノール公』と『ルパート将軍』がいる場合生成キャンセルされる。
- FORCE_DEPTHフラグ持ちのモンスターは規定の階未満では生成キャンセルされる。ただし、悪夢モードの場合QUESTOR扱いのモンスターでない限り生成される可能性を持つ。
- 生成モンスターがその階のクエストの撃破対象である場合は生成キャンセル。(クエストモンスターは別処理で配置される)
- 守りのルーン上では1d550>モンスターレベル+20の判定を突破しない限り生成キャンセルされる。突破した場合守りのルーンを破壊して生成される。
- 生成するマスに既にモンスターがいた場合は生成キャンセル。
- この時点でモンスターの生成は確定。ステータスは随時モンスター種族を元に代入していくか、処理の流れは以下のようにある程度分岐する。
- モンスターの種族IDを設定
- モンスターの表面上の種族IDを決める。
- TANUKIフラグを持っている場合、ユニークでなく、クエストターゲットでなく、さらにFORCE_DEPTH持ちで生成制限にかかっていない全てのモンスターを対象に変身IDを決める。
- PM_KAGEフラグ持ちの生成ならば表面上の種族が「あやしい影」になる。
- CHAMELEONフラグ持ちのモンスターは変身先を決めた上で表面上のIDをそれに定める。
- それ以外は本来の種族IDをそのまま生成する。
- PM_PETフラグ持ちでの生成の場合、@さん/プレイヤーのIDを親として代入しておく。
- @さんのペットが召喚したモンスターは親IDを保持した上で@さんのペットとなる。
- PM_NO_PETによる生成なら、この時点で無条件にペットフラグを外す。
- PM_FORCE_PETによる生成なら、この時点で無条件にペットフラグをつける。
- モンスター種族がFRINEDLYの場合、@さんと属性が合えば、友好的なモンスターとして生成される。
- PM_ALLOW_SLEEPつきの生成で、睡眠値を持つモンスター種族で、悪夢モードでない場合はモンスターを眠らせた状態で生成。
- FORCE_MAX持ちなら、HPを最大にして生成、そうでない場合、規定のダイスを振って生成。
- 悪夢モードならそこからHP2倍、ただし、30000は超えない。
- PM_HASTEフラグによる生成なら加速を与える。
- 悪夢モードなら生成されたてのモンスターに次のターンが回ってくるスピードが上がる。
- 悪夢モードでなく、FORCE_SLEEPフラグ持ちなら、常に眠らせる。
- @さんが警告持ちなら、この時点で指輪が生成階にたいするモンスターのレベル差に合わせて光る。
- 生成されたマス目の上が爆発のルーンなら爆発判定、1d299>モンスターレベルなら爆発するが、そうでなければ解除される。
2013/01/30
■ [変愚蛮怒/スポイラー]place_monster_group()関数の処理の流れ(変愚蛮怒 Ver2.1.1)
同じ種類のモンスターを複数生成するための関数。
- 基本生成数を1d10で決める。
- 生成モンスターのレベルが生成階より大きいなら1d(モンスターレベル-生成階)だけ減少値を与える。
- 生成階が生成モンスターのレベルより大きいなら1d(生成階-モンスターレベル)だけ増加値を与える。ただし9は超えない。
- 基本生成数に減少値/増加値を加える。
- 基本生成数が1未満になっていたら1にする。
- 基本生成数が32より大きくなっていたら32にする。
- 基本生成数だけ生成地点の周囲4マスをめぐってplace_monster_one()関数によりモンスターを配置していく。
■ コピーブランド [皆様の絶好評判を偽物スーパーコピー 時計人気専門 ショップです。 ウブロコピー時計特,2017新作続々入荷! 人..]
■ 腕時計 スーパーコピー 見分け [コピー時計 カルティエスーパーコピー、ブルガリコピー時計販売「18%OFF」当店はカルティエコピー、 ブルガリコ..]