OSDN Git Service

溜まり場に出ていた次のバグらしき挙動を修正。
[hengband/hengband.git] / src / effects.c
index 773beee..cfff2e4 100644 (file)
@@ -177,7 +177,7 @@ void reset_tim_flags(void)
        p_ptr->tim_stealth = 0;     /* Timed -- Stealth */
        p_ptr->tim_esp = 0;
        p_ptr->wraith_form = 0;     /* Timed -- Wraith Form */
-       p_ptr->tim_ffall = 0;
+       p_ptr->tim_levitation = 0;
        p_ptr->tim_sh_touki = 0;
        p_ptr->tim_sh_fire = 0;
        p_ptr->tim_sh_holy = 0;
@@ -219,9 +219,9 @@ void reset_tim_flags(void)
 
        if (p_ptr->riding)
        {
-               m_list[p_ptr->riding].fast = 0;
-               m_list[p_ptr->riding].slow = 0;
-               m_list[p_ptr->riding].invulner = 0;
+               (void)set_monster_fast(p_ptr->riding, 0);
+               (void)set_monster_slow(p_ptr->riding, 0);
+               (void)set_monster_invulner(p_ptr->riding, 0, FALSE);
        }
 
        if (p_ptr->pclass == CLASS_BARD)
@@ -232,6 +232,88 @@ void reset_tim_flags(void)
 }
 
 
+void dispel_player(void)
+{
+       (void)set_fast(0, TRUE);
+       (void)set_lightspeed(0, TRUE);
+       (void)set_slow(0, TRUE);
+       (void)set_shield(0, TRUE);
+       (void)set_blessed(0, TRUE);
+       (void)set_tsuyoshi(0, TRUE);
+       (void)set_hero(0, TRUE);
+       (void)set_shero(0, TRUE);
+       (void)set_protevil(0, TRUE);
+       (void)set_invuln(0, TRUE);
+       (void)set_wraith_form(0, TRUE);
+       (void)set_kabenuke(0, TRUE);
+       (void)set_tim_res_nether(0, TRUE);
+       (void)set_tim_res_time(0, TRUE);
+       /* by henkma */
+       (void)set_tim_reflect(0,TRUE);
+       (void)set_multishadow(0,TRUE);
+       (void)set_dustrobe(0,TRUE);
+
+       (void)set_tim_invis(0, TRUE);
+       (void)set_tim_infra(0, TRUE);
+       (void)set_tim_esp(0, TRUE);
+       (void)set_tim_regen(0, TRUE);
+       (void)set_tim_stealth(0, TRUE);
+       (void)set_tim_levitation(0, TRUE);
+       (void)set_tim_sh_touki(0, TRUE);
+       (void)set_tim_sh_fire(0, TRUE);
+       (void)set_tim_sh_holy(0, TRUE);
+       (void)set_tim_eyeeye(0, TRUE);
+       (void)set_magicdef(0, TRUE);
+       (void)set_resist_magic(0, TRUE);
+       (void)set_oppose_acid(0, TRUE);
+       (void)set_oppose_elec(0, TRUE);
+       (void)set_oppose_fire(0, TRUE);
+       (void)set_oppose_cold(0, TRUE);
+       (void)set_oppose_pois(0, TRUE);
+       (void)set_ultimate_res(0, TRUE);
+       (void)set_mimic(0, 0, TRUE);
+       (void)set_ele_attack(0, 0);
+       (void)set_ele_immune(0, 0);
+
+       /* Cancel glowing hands */
+       if (p_ptr->special_attack & ATTACK_CONFUSE)
+       {
+               p_ptr->special_attack &= ~(ATTACK_CONFUSE);
+#ifdef JP
+               msg_print("¼ê¤Îµ±¤­¤¬¤Ê¤¯¤Ê¤Ã¤¿¡£");
+#else
+               msg_print("Your hands stop glowing.");
+#endif
+       }
+
+       if (music_singing_any())
+       {
+               p_ptr->magic_num1[1] = p_ptr->magic_num1[0];
+               p_ptr->magic_num1[0] = 0;
+#ifdef JP
+               msg_print("²Î¤¬ÅÓÀڤ줿¡£");
+#else
+               msg_print("Your singing is interrupted.");
+#endif
+               p_ptr->action = ACTION_NONE;
+
+               /* Recalculate bonuses */
+               p_ptr->update |= (PU_BONUS | PU_HP);
+
+               /* Redraw map */
+               p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
+
+               /* Update monsters */
+               p_ptr->update |= (PU_MONSTERS);
+
+               /* Window stuff */
+               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+
+               p_ptr->energy_need += ENERGY_NEED();
+       }
+}
+
+
 /*
  * Set "p_ptr->tim_mimic", and "p_ptr->mimic_form",
  * notice observable changes
@@ -776,6 +858,9 @@ msg_print("
        /* Redraw map */
        p_ptr->redraw |= (PR_MAP);
 
+       /* Update the health bar */
+       p_ptr->redraw |= (PR_HEALTH | PR_UHEALTH);
+
        /* Update monsters */
        p_ptr->update |= (PU_MONSTERS);
 
@@ -2092,9 +2177,9 @@ bool set_superstealth(bool set)
 
 
 /*
- * Set "p_ptr->tim_ffall", notice observable changes
+ * Set "p_ptr->tim_levitation", notice observable changes
  */
-bool set_tim_ffall(int v, bool do_dec)
+bool set_tim_levitation(int v, bool do_dec)
 {
        bool notice = FALSE;
 
@@ -2106,11 +2191,11 @@ bool set_tim_ffall(int v, bool do_dec)
        /* Open */
        if (v)
        {
-               if (p_ptr->tim_ffall && !do_dec)
+               if (p_ptr->tim_levitation && !do_dec)
                {
-                       if (p_ptr->tim_ffall > v) return FALSE;
+                       if (p_ptr->tim_levitation > v) return FALSE;
                }
-               else if (!p_ptr->tim_ffall)
+               else if (!p_ptr->tim_levitation)
                {
 #ifdef JP
 msg_print("ÂΤ¬Ãè¤ËÉ⤭»Ï¤á¤¿¡£");
@@ -2125,7 +2210,7 @@ msg_print("
        /* Shut */
        else
        {
-               if (p_ptr->tim_ffall)
+               if (p_ptr->tim_levitation)
                {
 #ifdef JP
 msg_print("¤â¤¦Ãè¤ËÉ⤫¤Ù¤Ê¤¯¤Ê¤Ã¤¿¡£");
@@ -2138,7 +2223,7 @@ msg_print("
        }
 
        /* Use the value */
-       p_ptr->tim_ffall = v;
+       p_ptr->tim_levitation = v;
 
        /* Redraw status bar */
        p_ptr->redraw |= (PR_STATUS);
@@ -5040,8 +5125,7 @@ int take_hit(int damage_type, int damage, cptr hit_from, int monspell)
                        }
                }
 
-               /* Multishadow effects is determined by turn */
-               if (p_ptr->multishadow && (turn & 1))
+               if (CHECK_MULTISHADOW())
                {
                        if (damage_type == DAMAGE_FORCE)
                        {
@@ -5111,7 +5195,6 @@ int take_hit(int damage_type, int damage, cptr hit_from, int monspell)
        /* Dead player */
        if (p_ptr->chp < 0)
        {
-               char buf[10];
                bool android = (p_ptr->prace == RACE_ANDROID ? TRUE : FALSE);
 
 #ifdef JP       /* »à¤ó¤À»þ¤Ë¶¯À©½ªÎ»¤·¤Æ»à¤ò²óÈò¤Ç¤­¤Ê¤¯¤·¤Æ¤ß¤¿ by Habu */
@@ -5144,6 +5227,8 @@ int take_hit(int damage_type, int damage, cptr hit_from, int monspell)
                else
                {
                        int q_idx = quest_number(dun_level);
+                       bool seppuku = streq(hit_from, "Seppuku");
+                       bool winning_seppuku = p_ptr->total_winner && seppuku;
 
 #ifdef WORLD_SCORE
                        /* Make screen dump */
@@ -5151,46 +5236,73 @@ int take_hit(int damage_type, int damage, cptr hit_from, int monspell)
 #endif
 
                        /* Note cause of death */
+                       if (seppuku)
+                       {
+                               strcpy(p_ptr->died_from, hit_from);
 #ifdef JP
-                       sprintf(p_ptr->died_from, "%s%s%s", !p_ptr->paralyzed ? "" : p_ptr->free_act ? "ĦÁü¾õÂÖ¤Ç":"Ëãáã¾õÂÖ¤Ç", p_ptr->image ? "¸¸³Ð¤ËÏĤó¤À" : "", hit_from);
+                               if (!winning_seppuku) strcpy(p_ptr->died_from, "ÀÚÊ¢");
+#endif
+                       }
+                       else
+                       {
+                               char dummy[1024];
+#ifdef JP
+                               sprintf(dummy, "%s%s%s", !p_ptr->paralyzed ? "" : p_ptr->free_act ? "ĦÁü¾õÂÖ¤Ç" : "Ëãáã¾õÂÖ¤Ç", p_ptr->image ? "¸¸³Ð¤ËÏĤó¤À" : "", hit_from);
 #else
-                       sprintf(p_ptr->died_from, "%s%s", hit_from, !p_ptr->paralyzed ? "" : " while helpless");
+                               sprintf(dummy, "%s%s", hit_from, !p_ptr->paralyzed ? "" : " while helpless");
 #endif
+                               my_strcpy(p_ptr->died_from, dummy, sizeof p_ptr->died_from);
+                       }
 
                        /* No longer a winner */
                        p_ptr->total_winner = FALSE;
 
-                       if (p_ptr->inside_arena)
+                       if (winning_seppuku)
+                       {
+#ifdef JP
+                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¾¡Íø¤Î¸åÀÚÊ¢¤·¤¿¡£");
+#else
+                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "did Seppuku after the winning.");
+#endif
+                       }
+                       else
+                       {
+                               char buf[10];
+
+                               if (p_ptr->inside_arena)
 #ifdef JP
-                               strcpy(buf,"¥¢¥ê¡¼¥Ê");
+                                       strcpy(buf,"¥¢¥ê¡¼¥Ê");
 #else
-                               strcpy(buf,"in the Arena");
+                                       strcpy(buf,"in the Arena");
 #endif
-                       else if (!dun_level)
+                               else if (!dun_level)
 #ifdef JP
-                               strcpy(buf,"ÃϾå");
+                                       strcpy(buf,"ÃϾå");
 #else
-                               strcpy(buf,"on the surface");
+                                       strcpy(buf,"on the surface");
 #endif
-                       else if (q_idx && (is_fixed_quest_idx(q_idx) &&
-                                !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
+                               else if (q_idx && (is_fixed_quest_idx(q_idx) &&
+                                        !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
 #ifdef JP
-                               strcpy(buf,"¥¯¥¨¥¹¥È");
+                                       strcpy(buf,"¥¯¥¨¥¹¥È");
 #else
-                               strcpy(buf,"in a quest");
+                                       strcpy(buf,"in a quest");
 #endif
-                       else
+                               else
 #ifdef JP
-                               sprintf(buf,"%d³¬", dun_level);
+                                       sprintf(buf,"%d³¬", dun_level);
 #else
-                               sprintf(buf,"level %d", dun_level);
+                                       sprintf(buf,"level %d", dun_level);
 #endif
+
 #ifdef JP
-                       sprintf(tmp,"%s¤Ç%s¤Ë»¦¤µ¤ì¤¿¡£",buf, p_ptr->died_from);
+                               sprintf(tmp, "%s¤Ç%s¤Ë»¦¤µ¤ì¤¿¡£", buf, p_ptr->died_from);
 #else
-                       sprintf(tmp,"killed by %s %s.", p_ptr->died_from, buf);
+                               sprintf(tmp, "killed by %s %s.", p_ptr->died_from, buf);
 #endif
-                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
+                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
+                       }
+
 #ifdef JP
                        do_cmd_write_nikki(NIKKI_GAMESTART, 1, "-------- ¥²¡¼¥à¥ª¡¼¥Ð¡¼ --------");
 #else
@@ -5201,11 +5313,10 @@ int take_hit(int damage_type, int damage, cptr hit_from, int monspell)
                        flush();
 
 #ifdef JP
-if (get_check_strict("²èÌ̤òÊݸ¤·¤Þ¤¹¤«¡©", CHECK_NO_HISTORY))
+                       if (get_check_strict("²èÌ̤òÊݸ¤·¤Þ¤¹¤«¡©", CHECK_NO_HISTORY))
 #else
                        if (get_check_strict("Dump the screen? ", CHECK_NO_HISTORY))
 #endif
-
                        {
                                do_cmd_save_screen();
                        }
@@ -5220,7 +5331,7 @@ if (get_check_strict("
                        if (!last_words)
                        {
 #ifdef JP
-msg_format("¤¢¤Ê¤¿¤Ï%s¤Þ¤·¤¿¡£", android ? "²õ¤ì" : "»à¤Ë");
+                               msg_format("¤¢¤Ê¤¿¤Ï%s¤Þ¤·¤¿¡£", android ? "²õ¤ì" : "»à¤Ë");
 #else
                                msg_print(android ? "You are broken." : "You die.");
 #endif
@@ -5229,10 +5340,10 @@ msg_format("
                        }
                        else
                        {
-                               if (streq(p_ptr->died_from, "Seppuku"))
+                               if (winning_seppuku)
                                {
 #ifdef JP
-                                 get_rnd_line("seppuku_j.txt", 0, death_message);
+                                       get_rnd_line("seppuku_j.txt", 0, death_message);
 #else
                                        get_rnd_line("seppuku.txt", 0, death_message);
 #endif
@@ -5240,16 +5351,26 @@ msg_format("
                                else
                                {
 #ifdef JP
-get_rnd_line("death_j.txt", 0, death_message);
+                                       get_rnd_line("death_j.txt", 0, death_message);
 #else
                                        get_rnd_line("death.txt", 0, death_message);
 #endif
                                }
+
+                               do
+                               {
 #ifdef JP
-                               while (!get_string(streq(p_ptr->died_from, "Seppuku") ? "¼­À¤¤Î¶ç: " : "ÃÇËöËâ¤Î¶«¤Ó: ", death_message, 1024)) ;
+                                       while (!get_string(winning_seppuku ? "¼­À¤¤Î¶ç: " : "ÃÇËöËâ¤Î¶«¤Ó: ", death_message, 1024)) ;
 #else
-                               while (!get_string("Last word: ", death_message, 1024)) ;
+                                       while (!get_string("Last word: ", death_message, 1024)) ;
 #endif
+                               }
+#ifdef JP
+                               while (winning_seppuku && !get_check_strict("¤è¤í¤·¤¤¤Ç¤¹¤«¡©", CHECK_NO_HISTORY));
+#else
+                               while (winning_seppuku && !get_check_strict("Are you sure? ", CHECK_NO_HISTORY));
+#endif
+
                                if (death_message[0] == '\0')
                                {
 #ifdef JP
@@ -5260,63 +5381,61 @@ get_rnd_line("death_j.txt", 0, death_message);
                                }
                                else p_ptr->last_message = string_make(death_message);
 
-                               if (streq(p_ptr->died_from, "Seppuku"))
-                               {
 #ifdef JP
-                                 int i, len;
-                                 int w = Term->wid;
-                                 int h = Term->hgt;
-                                 int msg_pos_x[9] = {  5,  7,  9, 12,  14,  17,  19,  21, 23};
-                                 int msg_pos_y[9] = {  3,  4,  5,  4,   5,   4,   5,   6,  4};
-                                 cptr str;
-                                 char* str2;
-
-                                 Term_clear();
-
-                                 /* ºù»¶¤ë */
-                                 for (i = 0; i < 40; i++) 
-                                   Term_putstr(randint0(w / 2) * 2, randint0(h), 2, TERM_VIOLET, "¦Ô");
-
-                                 str = death_message;
-                                 if (strncmp(str, "¡Ö", 2) == 0) str += 2;
-
-                                 str2 = my_strstr(str, "¡×");
-                                 if (str2 != NULL) *str2 = '\0';
-
-                                 i = 0;
-                                 while (i < 9)
-                                 {
-                                   str2 = my_strstr(str, " ");
-                                   if (str2 == NULL) len = strlen(str);
-                                   else len = str2 - str;
-
-                                   if (len != 0)
-                                   {
-                                     Term_putstr_v(w * 3 / 4 - 2 - msg_pos_x[i] * 2, msg_pos_y[i], len,
-                                                 TERM_WHITE, str);
-                                     if (str2 == NULL) break;
-                                     i++;
-                                   }
-                                   str = str2 + 1;
-                                   if (*str == 0) break;
-                                 }
-
-                                 /* Hide cursor */
-                                 Term_putstr(w-1, h-1, 1, TERM_WHITE, " ");
-
-                                 flush();
+                               if (winning_seppuku)
+                               {
+                                       int i, len;
+                                       int w = Term->wid;
+                                       int h = Term->hgt;
+                                       int msg_pos_x[9] = {  5,  7,  9, 12,  14,  17,  19,  21, 23};
+                                       int msg_pos_y[9] = {  3,  4,  5,  4,   5,   4,   5,   6,  4};
+                                       cptr str;
+                                       char* str2;
+
+                                       Term_clear();
+
+                                       /* ºù»¶¤ë */
+                                       for (i = 0; i < 40; i++)
+                                               Term_putstr(randint0(w / 2) * 2, randint0(h), 2, TERM_VIOLET, "¦Ô");
+
+                                       str = death_message;
+                                       if (strncmp(str, "¡Ö", 2) == 0) str += 2;
+
+                                       str2 = my_strstr(str, "¡×");
+                                       if (str2 != NULL) *str2 = '\0';
+
+                                       i = 0;
+                                       while (i < 9)
+                                       {
+                                               str2 = my_strstr(str, " ");
+                                               if (str2 == NULL) len = strlen(str);
+                                               else len = str2 - str;
+
+                                               if (len != 0)
+                                               {
+                                                       Term_putstr_v(w * 3 / 4 - 2 - msg_pos_x[i] * 2, msg_pos_y[i], len,
+                                                       TERM_WHITE, str);
+                                                       if (str2 == NULL) break;
+                                                       i++;
+                                               }
+                                               str = str2 + 1;
+                                               if (*str == 0) break;
+                                       }
+
+                                       /* Hide cursor */
+                                       Term_putstr(w-1, h-1, 1, TERM_WHITE, " ");
+
+                                       flush();
 #ifdef WORLD_SCORE
-                                 /* Make screen dump */
-                                 screen_dump = make_screen_dump();
+                                       /* Make screen dump */
+                                       screen_dump = make_screen_dump();
 #endif
 
-                                 /* Wait a key press */
-                                 (void)inkey();
-#else
-                                       msg_print(death_message);
-#endif
+                                       /* Wait a key press */
+                                       (void)inkey();
                                }
                                else
+#endif
                                        msg_print(death_message);
                        }
                }
@@ -5343,7 +5462,7 @@ get_rnd_line("death_j.txt", 0, death_message);
 #endif
 
 #ifdef JP
-                       sprintf(tmp,"%s¤Ë¤è¤Ã¤Æ¥Ô¥ó¥Á¤Ë´Ù¤¤¤Ã¤¿¡£",hit_from);
+                       sprintf(tmp,"%s¤Ë¤è¤Ã¤Æ¥Ô¥ó¥Á¤Ë´Ù¤Ã¤¿¡£",hit_from);
 #else
                        sprintf(tmp,"A critical situation because of %s.",hit_from);
 #endif