- * @brief 悪夢モード時に睡眠/麻痺に陥った際のEldritchHorror処理
- * @param r_idx 狂気の元凶となるモンスターのID
- * @return なし
- * @todo 重複関数あり、要リファクタリング。
- */
-void have_nightmare(int r_idx)
-{
- bool happened = FALSE;
- monster_race *r_ptr = &r_info[r_idx];
- int power = r_ptr->level + 10;
- char m_name[80];
- cptr desc = r_name + r_ptr->name;
-
- /* Describe it */
-#ifndef JP
- if (!(r_ptr->flags1 & RF1_UNIQUE))
- sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
- else
-#endif
- sprintf(m_name, "%s", desc);
-
- if (!(r_ptr->flags1 & RF1_UNIQUE))
- {
- if (r_ptr->flags1 & RF1_FRIENDS) power /= 2;
- }
- else power *= 2;
-
- if (saving_throw(p_ptr->skill_sav * 100 / power))
- {
-#ifdef JP
- msg_format("夢の中で%sに追いかけられた。", m_name);
-#else
- msg_format("%^s chases you through your dreams.", m_name);
-#endif
-
- /* Safe */
- return;
- }
-
- if (p_ptr->image)
- {
- /* Something silly happens... */
-#ifdef JP
- msg_format("%s%sの顔を見てしまった!",
-#else
- msg_format("You behold the %s visage of %s!",
-#endif
-
- funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
-
- if (one_in_(3))
- {
- msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
- p_ptr->image = p_ptr->image + randint1(r_ptr->level);
- }
-
- /* Never mind; we can't see it clearly enough */
- return;
- }
-
- /* Something frightening happens... */
-#ifdef JP
- msg_format("%s%sの顔を見てしまった!",
-#else
- msg_format("You behold the %s visage of %s!",
-#endif
-
- horror_desc[randint0(MAX_SAN_HORROR)], desc);
-
- r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
-
- if (!p_ptr->mimic_form)
- {
- switch (p_ptr->prace)
- {
- /* Demons may make a saving throw */
- case RACE_IMP:
- case RACE_DEMON:
- if (saving_throw(20 + p_ptr->lev)) return;
- break;
- /* Undead may make a saving throw */
- case RACE_SKELETON:
- case RACE_ZOMBIE:
- case RACE_SPECTRE:
- case RACE_VAMPIRE:
- if (saving_throw(10 + p_ptr->lev)) return;
- break;
- }
- }
- else
- {
- /* Demons may make a saving throw */
- if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)
- {
- if (saving_throw(20 + p_ptr->lev)) return;
- }
- /* Undead may make a saving throw */
- else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD)
- {
- if (saving_throw(10 + p_ptr->lev)) return;
- }
- }
-
- /* Mind blast */
- if (!saving_throw(p_ptr->skill_sav * 100 / power))
- {
- if (!p_ptr->resist_conf)
- {
- (void)set_confused(p_ptr->confused + randint0(4) + 4);
- }
- if (!p_ptr->resist_chaos && one_in_(3))
- {
- (void)set_image(p_ptr->image + randint0(250) + 150);
- }
- return;
- }
-
- /* Lose int & wis */
- if (!saving_throw(p_ptr->skill_sav * 100 / power))
- {
- do_dec_stat(A_INT);
- do_dec_stat(A_WIS);
- return;
- }
-
- /* Brain smash */
- if (!saving_throw(p_ptr->skill_sav * 100 / power))
- {
- if (!p_ptr->resist_conf)
- {
- (void)set_confused(p_ptr->confused + randint0(4) + 4);
- }
- if (!p_ptr->free_act)
- {
- (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4);
- }
- while (!saving_throw(p_ptr->skill_sav))
- {
- (void)do_dec_stat(A_INT);
- }
- while (!saving_throw(p_ptr->skill_sav))
- {
- (void)do_dec_stat(A_WIS);
- }
- if (!p_ptr->resist_chaos)
- {
- (void)set_image(p_ptr->image + randint0(250) + 150);
- }
- return;
- }
-
-
- /* Amnesia */
- if (!saving_throw(p_ptr->skill_sav * 100 / power))
- {
- if (lose_all_info())
- {
-#ifdef JP
-msg_print("あまりの恐怖に全てのことを忘れてしまった!");
-#else
- msg_print("You forget everything in your utmost terror!");
-#endif
-
- }
- return;
- }
-
- /* Else gain permanent insanity */
- if ((p_ptr->muta3 & MUT3_MORONIC) && (p_ptr->muta2 & MUT2_BERS_RAGE) &&
- ((p_ptr->muta2 & MUT2_COWARDICE) || (p_ptr->resist_fear)) &&
- ((p_ptr->muta2 & MUT2_HALLU) || (p_ptr->resist_chaos)))
- {
- /* The poor bastard already has all possible insanities! */
- return;
- }
-
- while (!happened)
- {
- switch (randint1(4))
- {
- case 1:
- {
- if (!(p_ptr->muta3 & MUT3_MORONIC))
- {
- if ((p_ptr->stat_use[A_INT] < 4) && (p_ptr->stat_use[A_WIS] < 4))
- {
-#ifdef JP
-msg_print("あなたは完璧な馬鹿になったような気がした。しかしそれは元々だった。");
-#else
- msg_print("You turn into an utter moron!");
-#endif
- }
- else
- {
-#ifdef JP
-msg_print("あなたは完璧な馬鹿になった!");
-#else
- msg_print("You turn into an utter moron!");
-#endif
- }
-
- if (p_ptr->muta3 & MUT3_HYPER_INT)
- {
-#ifdef JP
-msg_print("あなたの脳は生体コンピュータではなくなった。");
-#else
- msg_print("Your brain is no longer a living computer.");
-#endif
-
- p_ptr->muta3 &= ~(MUT3_HYPER_INT);
- }
- p_ptr->muta3 |= MUT3_MORONIC;
- happened = TRUE;
- }
- break;
- }
- case 2:
- {
- if (!(p_ptr->muta2 & MUT2_COWARDICE) && !p_ptr->resist_fear)
- {
-#ifdef JP
-msg_print("あなたはパラノイアになった!");
-#else
- msg_print("You become paranoid!");
-#endif
-
-
- /* Duh, the following should never happen, but anyway... */
- if (p_ptr->muta3 & MUT3_FEARLESS)
- {
-#ifdef JP
-msg_print("あなたはもう恐れ知らずではなくなった。");
-#else
- msg_print("You are no longer fearless.");
-#endif
-
- p_ptr->muta3 &= ~(MUT3_FEARLESS);
- }
-
- p_ptr->muta2 |= MUT2_COWARDICE;
- happened = TRUE;
- }
- break;
- }
- case 3:
- {
- if (!(p_ptr->muta2 & MUT2_HALLU) && !p_ptr->resist_chaos)
- {
-#ifdef JP
-msg_print("幻覚をひき起こす精神錯乱に陥った!");
-#else
- msg_print("You are afflicted by a hallucinatory insanity!");
-#endif
-
- p_ptr->muta2 |= MUT2_HALLU;
- happened = TRUE;
- }
- break;
- }
- default:
- {
- if (!(p_ptr->muta2 & MUT2_BERS_RAGE))
- {
-#ifdef JP
-msg_print("激烈な感情の発作におそわれるようになった!");
-#else
- msg_print("You become subject to fits of berserk rage!");
-#endif
-
- p_ptr->muta2 |= MUT2_BERS_RAGE;
- happened = TRUE;
- }
- break;
- }
- }
- }
-
- p_ptr->update |= PU_BONUS;
- handle_stuff();
-}
-
-
-/*!