2012/11/15
■ [変愚蛮怒/スポイラー]蛆虫爺がパワードラゴン・スケイルメイルを落とす確率(変愚蛮怒 ver2.0.0)
街の徘徊老人を殺したらパワードラゴン・スケイルメイルが手に入ったという逸話を以前どこかに聞いたことがある。これが実際有り得るのかソースをたどってみた。
monster_death()関数
まず蛆虫爺はSATSUGAI時に90%の確率でGOOD/GREATドロップの生成を行う。残り10%は当然デデドン!(絶望)である。(累計確率 90.00%)
ONLY_ITEMなので、落としたのが結局金という心配はない。GOOD|GREATフラグを付加した状態で、make_object()関数へ飛ぶ。
make_object()関数
GOODドロップ時、生成レベルが+10される。
アーティファクトの生成処理でなければ、通常の生成処理に回る。地上では特定ドロップでない限りアーティファクトの生成がありえないので問題ない。
GOODフラグつきで、特定の生成条件がない場合「上質な品物」(kind_is_good())がアイテムの生成条件の中に加えられる。この上質な品物とは、とりあえず、折れた棒とかロクでもないアイテムを除外するものであり、パワー・ドラゴンスケイルメイルも当然含まれる。
get_obj_num_prep()関数へ飛んで、アイテムの生成可能リストを作成する。
get_obj_num_prep()関数
この時点で、kind_is_good()を基準にアイテムの生成可否を判別するもので、生成レベルはまだ入らない。
これが終わったら、一旦make_object()に戻って、すぐget_obj_num()に処理が移る。
get_obj_num()関数
さて、問題はここである。引数で得られた生成階レベルは10。このままではこれより大きい階層のアイテムは生成対象にならないので、Lv110のパワードラゴン・スケイルメイルが生成されるには、深層生成ブースト処理がかからなければならない。この処理に該当する部分がこれである。
if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1; /* Boost level */ if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER)) { /* Occasional "boost" */ if (one_in_(GREAT_OBJ)) { /* What a bizarre calculation */ level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH)); } }
ブーストはレベルが0より大きく、なおかつ現在のダンジョンに「初心者向け」のフラグが存在しないことが必須条件である。本来ならば、この処理は「地上や初心者向けのダンジョンでは深層生成がかからない」ことを意図していたと思われるのだが、
- GOOD生成により、生成レベルは最初から10になっている。
- 地上(ID:0)には「初心者向け」を含めて全てのダンジョンフラグがない。
ので実はここで深層生成が通ってしまう。
GREAT_OBJ = 10となっているので、1/10の確率でブースト成立(累計確率 9.000%)
ブーストによりlevelが 1 + (10 * 128 / (1d128))になるので、これが110以上になる確率は、11/128である。(累計確率 0.7734%)
levelが上がり過ぎると、パワードラゴン・スケイルメイル以上の生成階アイテムも対象に加わり、生成確率が落ちることになるが、幸いにも パワードラゴン・スケイルメイルの110Fは力の指輪(一つの指輪生成専用ベースアイテム)と並んで最も深いので心配はいらない。
この後、アイテム生成のための非一様乱数の中でパワードラゴン・スケイルメイルを引く確率が何分の1かをレアリティなどを元に計算することが可能だが面倒なので、生成レベルさえ一定ならば確率は常に一定であることを確認の上、
実際に殺して
ガンダルフ的うさんくささなど微塵もない、真の*ウィザード*的視点で処理を拾い、
確率を確認。1/14336。よって(累計確率 5.358×10^-5% (0.00005358%))
やはり蛆虫爺がホビット的姑息さでどこぞからパワードラゴン・スケイルメイルを略取し、自らのマゾム館(意味深)に隠している可能性は、微粒子レベルで存在しているのである。たまげたなぁ。
完全な実演をしろだって?TAS、どうにかしろ(無責任)