2012/12/24
■ [変愚蛮怒/スポイラー]「狂気を引き起こす」処理(変愚蛮怒 Ver2.1.1)
変愚蛮怒には所謂「宇宙的恐怖」に陥って、様々なペナルティを被る処理がいくつか存在する。が、その実装が些か煩雑になっている嫌いもあるのでその実態を調査するために各処理を追ってみた。
該当する処理はsanity_blast()関数及び、have_nightmare()処理上に実装されており、以下の条件で呼び出される。
ELDRITCH_HORROR持ちのクリーチャーを探知した時。 | sanity_blast() | 1回 |
暗黒領域4冊目の「ネクロノミコン」の呪文詠唱に失敗した時(d100 < スペル番号)さらに1/2の確率 | sanity_blast() | 1回 |
悪夢モード時に宿屋へ泊まった時 | have_nightmare() | 最低1回、1/3の確率で繰り返す。 |
悪夢モード時にトラップの奇妙な白い霧で眠った(麻痺した)時 | have_nightmare() | 1回 |
悪夢モード時に眠りの薬で眠った(麻痺した)時 | have_nightmare() | 1回 |
悪夢モード時にGF_OLD_SLEEPの作用で眠った(麻痺した)時 | have_nightmare() | 1回 |
sanity_blastには呼び出し元がELDRITCH_HORROR持ちのモンスターを見たものか、ネクロノミコンか見たものかで別途処理を分けるためのフラグ分岐がある。色々嫌な予感がするが、両関数を追ってみる。
sanity_blast()
- ELDRITCH_HORROR持ちモンスターに依る場合、モンスターのレベルによって抵抗難度の算出とキャンセル判定が行われる。
- 抵抗難度は基本、モンスターレベル/2。
- 非ユニークで集団生成(FRIENDS)されるモンスターなら1/2。
- ユニークなら2倍。
- ペットならsanity_blast()処理そのものがキャンセルされる。
- d100>抵抗難度ならキャンセル。
- d100-1>(@さんの魔法防御)-(抵抗難度)でキャンセル。
- 以上でキャンセルできなければ、メッセージが通常時と幻覚時異なる形で表示される。
- @さんの種族がインプ、バルログか悪魔領域の「悪魔変化」「魔王変化」で変身中ならキャンセルされる。
- @さんの種族が骸骨、ゾンビ、幽霊、吸血鬼か暗黒領域の「吸血鬼変化」で変身中なら25+レベル%の確率でキャンセル。
- sanity_blast()確定。
- ネクロノミコンが原因ならば無条件にsanity_blast()確定。
- (Mind Blast作用)d100-1>(@さんの魔法防御)-(抵抗難度)で、混乱耐性がないなら混乱4+d4ターン追加。カオス耐性がないなら、1/3の確率で250+d150ターン幻覚追加。
- d100-1>(@さんの魔法防御)-(抵抗難度)で、INTとWISが減る。
- (Brain Smash作用)d100-1>(@さんの魔法防御)-(抵抗難度)で、混乱耐性がないなら混乱4+d4ターン追加。麻痺知らずがないなら麻痺4+d4ターン追加。(d100-1>魔法防御)を満たす限りINTを減らす。(d100-1>魔法防御)を満たす限りWISを減らす。カオス耐性がないなら、1/3の確率で250+d150ターン幻覚追加。
- (Amnesia作用)d100-1>(@さんの魔法防御)-(抵抗難度)で記憶消去。
- d100-1<=(@さんの魔法防御)-(抵抗難度)でここで処理がキャンセルする。
- 該当する耐性があるか、既にペナルティ耐性が全てついてズタボロなら以下の処理はキャンセルされるがそうでない場合続く。
- d21を振り、その目に応じて以下の処理に分岐。
- 1なら1/5の確率で「完璧な馬鹿」になり変異「脳が萎縮」を得る、「生体コンピュータ」の変異も即座に失われる。
- 2~11で恐怖耐性を持たないなら、パラノイアになる。恐れ知らずの変異も即座に失われる。(耐性があれば通らないのに有り得るのか?)
- 12~21でカオス耐性を持たないなら「幻覚をひき起こす精神錯乱」の変異を得る。
- それ以外(有り得ないのだが)なら「激烈な感情の発作」の変異を得る。
- これらの処理はいずれかのペナルティを得るまで繰り返される。
have_nightmare()
- 引数にランダムにELDRITCH_HORROR持ちのモンスターを一つ選んだIDを引渡し、そのモンスターを見たものとして抵抗難度を決める。
- 抵抗難度は基本、モンスターレベル/2。
- 非ユニークで集団生成(FRIENDS)されるモンスターなら1/2。
- ユニークなら2倍。
- 1d100-1>=(@さんの魔法防御)*(抵抗難度)/100を満たせば、夢の中で追い回されるだけで処理キャンセル。
- 既に幻覚を見ている状態なら1/3の確率で幻覚が1d(モンスターレベル)ターン追加されるだけで、必ずキャンセル。
- @さんの種族がインプ、バルログか悪魔領域の「悪魔変化」「魔王変化」で変身中なら20+レベル%の確率でキャンセル。
- @さんの種族が骸骨、ゾンビ、幽霊、吸血鬼か暗黒領域の「吸血鬼変化」で変身中なら10+レベル%の確率でキャンセル。
- (Mind Blast作用)d100-1<=(@さんの魔法防御)*(抵抗難度)/100で、混乱耐性がないなら混乱4+d4ターン追加。カオス耐性がないなら、1/3の確率で250+d150ターン幻覚追加。
- d100-1<=(@さんの魔法防御)*(抵抗難度)/100で、INTとWISが減る。
- (Brain Smash作用)d100-1<=(@さんの魔法防御)*(抵抗難度)/100で、混乱耐性がないなら混乱4+d4ターン追加。麻痺知らずがないなら麻痺4+d4ターン追加。(d100-1>魔法防御)を満たす限りINTを減らす。(d100-1>魔法防御)を満たす限りWISを減らす。カオス耐性がないなら、1/3の確率で250+d150ターン幻覚追加。
- (Amnesia作用)d100-1<=(@さんの魔法防御)*(抵抗難度)/100で記憶消去。
- 該当する耐性があるか、既にペナルティ耐性が全てついてズタボロなら以下の処理はキャンセルされるがそうでない場合続く。
- d4を振り、その目に応じて以下の処理に分岐。
- 1なら1/5の確率で「完璧な馬鹿」になり変異「脳が萎縮」を得る、「生体コンピュータ」の変異も即座に失われる。
- 2で恐怖耐性を持たないなら、パラノイアになる。恐れ知らずの変異も即座に失われる。(耐性があれば通らないのに有り得るのか?)
- 3でカオス耐性を持たないなら「幻覚をひき起こす精神錯乱」の変異を得る。
- 4なら「激烈な感情の発作」の変異を得る。
- これらの処理はいずれかのペナルティを得るまで繰り返される。
…途中でまともに読むのを放棄しかかったので、微妙に違っているかも知れないのだが、はっきり言えることがある。
どうして「大体あってるけど微妙に違う処理」を別個に実装する必要があるんですか?(憤怒)
patchyなコードにも程があんよ~頼むよ~。
■ [D'angband/開発]D'angband開発日誌 part36
いい加減SourceForgeのチケットの方を整理して連動させたい。
進展内容
- リファクタリング
- 冗長なコメントの削除(2012/12/19~)
- (継続中)
- ifdef JP による煩雑なローカライズの統合(2012/12/19~)
- grep数3995→3931まで減らす。
- ファイル名定義リストの定義と改良(2012/12/24~)
- enumと配列で定義していたものを#defineに整理し直す。
- データ構造の改良(2012/12/22~)
- (継続中)
- 関数構造の改良(2012/12/22~)
- (継続中)
- 魔法効果処理の統合(2012/12/23~)
- 種族レイシャルの処理をtrait系に統合。
- まだエゴの発動などが残っていたはず。
- 変数名の変更(2012/12/22~)
- (継続中)
- 冗長なコメントの削除(2012/12/19~)