X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells2.c;h=23597225fda3e411afe8a85f7bd02f767f2aaf0c;hb=b87eb07f1d5fe0bc3923868e2609b966a9c68a44;hp=b77a8b4741287901f3a43c46ef8841c1875ca94c;hpb=1cced0737cd5d20247c12d69abcef119a9bec5c6;p=hengband%2Fhengband.git diff --git a/src/spells2.c b/src/spells2.c index b77a8b474..23597225f 100644 --- a/src/spells2.c +++ b/src/spells2.c @@ -109,9 +109,9 @@ sprintf(Dummy, " info[i++] = ""; #ifdef JP - sprintf(Dummy, "¸½ºß¤Î°À­ : %s(%ld)", your_alignment(), p_ptr->align); + sprintf(Dummy, "¸½ºß¤Î°À­ : %s(%ld)", your_alignment(), (long int)p_ptr->align); #else - sprintf(Dummy, "Your alighnment : %s(%ld)", your_alignment(), p_ptr->align); + sprintf(Dummy, "Your alighnment : %s(%ld)", your_alignment(), (long int)p_ptr->align); #endif strcpy(buf[1], Dummy); info[i++] = buf[1]; @@ -528,7 +528,7 @@ sprintf(Dummy, " info[i++] = Dummy; break; - case RACE_KUTA: + case RACE_KUTAR: if (plev > 19) #ifdef JP info[i++] = "¤¢¤Ê¤¿¤Ï d20+30 ¥¿¡¼¥ó¤Î´Ö²£¤Ë¿­¤Ó¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(15 MP)"; @@ -588,8 +588,9 @@ info[i++] = " #endif } break; - case CLASS_MAGE: case CLASS_HIGH_MAGE: + if (p_ptr->realm1 == REALM_HEX) break; + case CLASS_MAGE: case CLASS_SORCERER: if (plev > 24) { @@ -749,7 +750,7 @@ info[i++] = " break; case CLASS_BEASTMASTER: #ifdef JP -info[i++] = "¤¢¤Ê¤¿¤Ï1ɤ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥ì¥Ù¥ë/4 MP)"; +info[i++] = "¤¢¤Ê¤¿¤Ï1ÂΤÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥ì¥Ù¥ë/4 MP)"; #else info[i++] = "You can dominate a monster (cost level/4)."; #endif @@ -773,9 +774,9 @@ info[i++] = " if (plev > 47) { #ifdef JP -info[i++] = "¤¢¤Ê¤¿¤Ï1¥¿¡¼¥ó¤Ë2²óËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(77 MP)"; +info[i++] = "¤¢¤Ê¤¿¤Ï1¥¿¡¼¥ó¤Ë2²óËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(20 MP)"; #else - info[i++] = "You can cast two spells in one time (cost 77)."; + info[i++] = "You can cast two spells in one time (cost 20)."; #endif } break; @@ -3566,7 +3567,7 @@ bool detect_traps(int range, bool known) if (known) p_ptr->dtrap = TRUE; - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT)) detect = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 0) detect = FALSE; /* Describe */ if (detect) @@ -3590,7 +3591,7 @@ bool detect_doors(int range) { bool detect = detect_feat_flag(range, FF_DOOR, TRUE); - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT)) detect = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 0) detect = FALSE; /* Describe */ if (detect) @@ -3614,7 +3615,7 @@ bool detect_stairs(int range) { bool detect = detect_feat_flag(range, FF_STAIRS, TRUE); - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT)) detect = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 0) detect = FALSE; /* Describe */ if (detect) @@ -3638,7 +3639,7 @@ bool detect_treasure(int range) { bool detect = detect_feat_flag(range, FF_HAS_GOLD, TRUE); - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+6)) detect = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 6) detect = FALSE; /* Describe */ if (detect) @@ -3699,7 +3700,7 @@ bool detect_objects_gold(int range) } } - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+6)) detect = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 6) detect = FALSE; /* Describe */ if (detect) @@ -3766,7 +3767,7 @@ bool detect_objects_normal(int range) } } - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+6)) detect = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 6) detect = FALSE; /* Describe */ if (detect) @@ -3845,11 +3846,12 @@ bool detect_objects_magic(int range) (tv == TV_DEATH_BOOK) || (tv == TV_TRUMP_BOOK) || (tv == TV_ARCANE_BOOK) || - (tv == TV_ENCHANT_BOOK) || + (tv == TV_CRAFT_BOOK) || (tv == TV_DAEMON_BOOK) || (tv == TV_CRUSADE_BOOK) || (tv == TV_MUSIC_BOOK) || (tv == TV_HISSATSU_BOOK) || + (tv == TV_HEX_BOOK) || ((o_ptr->to_a > 0) || (o_ptr->to_h + o_ptr->to_d > 0))) { /* Memorize the item */ @@ -3923,7 +3925,7 @@ bool detect_monsters_normal(int range) } } - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+3)) flag = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 3) flag = FALSE; /* Describe */ if (flag) @@ -3992,7 +3994,7 @@ bool detect_monsters_invis(int range) } } - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+3)) flag = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 3) flag = FALSE; /* Describe */ if (flag) @@ -4271,7 +4273,7 @@ bool detect_monsters_string(int range, cptr Match) } } - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+3)) flag = FALSE; + if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 3) flag = FALSE; /* Describe */ if (flag) @@ -4605,11 +4607,9 @@ void aggravate_monsters(int who) if (m_ptr->cdis < MAX_SIGHT * 2) { /* Wake up */ - if (m_ptr->csleep) + if (MON_CSLEEP(m_ptr)) { - /* Wake up */ - m_ptr->csleep = 0; - if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); + (void)set_monster_csleep(i, 0); sleep = TRUE; } if (!is_pet(m_ptr)) m_ptr->mflag2 |= MFLAG2_NOPET; @@ -4620,7 +4620,7 @@ void aggravate_monsters(int who) { if (!is_pet(m_ptr)) { - m_ptr->fast = MIN(200, m_ptr->fast + 100); + (void)set_monster_fast(i, MON_FAST(m_ptr) + 100); speed = TRUE; } } @@ -4628,8 +4628,8 @@ void aggravate_monsters(int who) /* Messages */ #ifdef JP -if (speed) msg_print("ÉÕ¶á¤Ç²¿¤«¤¬ÆÍÇ¡¶½Ê³¤·¤¿¤è¤¦¤Ê´¶¤¸¤ò¼õ¤±¤¿¡ª"); -else if (sleep) msg_print("²¿¤«¤¬ÆÍÇ¡¶½Ê³¤·¤¿¤è¤¦¤ÊÁû¡¹¤·¤¤²»¤¬±ó¤¯¤Ëʹ¤³¤¨¤¿¡ª"); + if (speed) msg_print("ÉÕ¶á¤Ç²¿¤«¤¬ÆÍÇ¡¶½Ê³¤·¤¿¤è¤¦¤Ê´¶¤¸¤ò¼õ¤±¤¿¡ª"); + else if (sleep) msg_print("²¿¤«¤¬ÆÍÇ¡¶½Ê³¤·¤¿¤è¤¦¤ÊÁû¡¹¤·¤¤²»¤¬±ó¤¯¤Ëʹ¤³¤¨¤¿¡ª"); #else if (speed) msg_print("You feel a sudden stirring nearby!"); else if (sleep) msg_print("You hear a sudden stirring in the distance!"); @@ -4638,159 +4638,180 @@ else if (sleep) msg_print(" } - /* - * Delete all non-unique/non-quest monsters of a given "type" from the level + * Delete a non-unique/non-quest monster */ -bool symbol_genocide(int power, int player_cast) +bool genocide_aux(int m_idx, int power, bool player_cast, int dam_side, cptr spell_name) { - int i; - char typ; - bool result = FALSE; - int msec = delay_factor * delay_factor * delay_factor; + int msec = delay_factor * delay_factor * delay_factor; + monster_type *m_ptr = &m_list[m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + bool resist = FALSE; - /* Prevent genocide in quest levels */ - if (p_ptr->inside_quest && !random_quest_number(dun_level)) - { - return (FALSE); - } + if (is_pet(m_ptr) && !player_cast) return FALSE; - /* Mega-Hack -- Get a monster symbol */ -#ifdef JP -while(!get_com("¤É¤Î¼ïÎà(ʸ»ú)¤Î¥â¥ó¥¹¥¿¡¼¤òËõ»¦¤·¤Þ¤¹¤«: ", &typ, FALSE)); -#else - while(!get_com("Choose a monster race (by symbol) to genocide: ", &typ, FALSE)); -#endif + /* Hack -- Skip Unique Monsters or Quest Monsters */ + if (r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) resist = TRUE; + else if (r_ptr->flags7 & RF7_UNIQUE2) resist = TRUE; - /* Delete the monsters of that "type" */ - for (i = 1; i < m_max; i++) - { - monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - bool angry = FALSE; - char m_name[80]; + else if (m_idx == p_ptr->riding) resist = TRUE; - /* Paranoia -- Skip dead monsters */ - if (!m_ptr->r_idx) continue; + else if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle) resist = TRUE; - /* Skip "wrong" monsters */ - if (r_ptr->d_char != typ) continue; - - if (is_pet(m_ptr) && !player_cast) continue; - - /* Hack -- Skip Unique Monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE; - - /* Hack -- Skip Quest Monsters */ - else if (r_ptr->flags1 & RF1_QUESTOR) angry = TRUE; + else if (player_cast && (r_ptr->level > randint0(power))) resist = TRUE; - else if (r_ptr->flags7 & RF7_UNIQUE2) angry = TRUE; + else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) resist = TRUE; - else if (i == p_ptr->riding) angry = TRUE; + /* Delete the monster */ + else + { + if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) + { + char m_name[80]; - else if (player_cast && (r_ptr->level > randint0(power))) angry = TRUE; + monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name); + } - else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) angry = TRUE; + delete_monster_idx(m_idx); + } - /* Delete the monster */ - else delete_monster_idx(i); + if (resist && player_cast) + { + bool see_m = is_seen(m_ptr); + char m_name[80]; - if (angry && player_cast) + monster_desc(m_name, m_ptr, 0); + if (see_m) { - bool see_m = is_seen(m_ptr); - - monster_desc(m_name, m_ptr, 0); - if (see_m && !p_ptr->blind) - { #ifdef JP -msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); + msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); #else - msg_format("%^s is unaffected.", m_name); + msg_format("%^s is unaffected.", m_name); #endif - } - if (m_ptr->csleep) + } + if (MON_CSLEEP(m_ptr)) + { + (void)set_monster_csleep(m_idx, 0); + if (m_ptr->ml) { - m_ptr->csleep = 0; - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); - if (see_m && !p_ptr->blind) - { #ifdef JP -msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); + msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); #else - msg_format("%^s wakes up.", m_name); + msg_format("%^s wakes up.", m_name); #endif - } } - if (is_friendly(m_ptr) && !is_pet(m_ptr)) + } + if (is_friendly(m_ptr) && !is_pet(m_ptr)) + { + if (see_m) { - if (see_m && !p_ptr->blind) - { #ifdef JP - msg_format("%s¤ÏÅܤä¿¡ª", m_name); + msg_format("%s¤ÏÅܤä¿¡ª", m_name); #else - msg_format("%^s gets angry!", m_name); + msg_format("%^s gets angry!", m_name); #endif - } - set_hostile(m_ptr); } - if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO; + set_hostile(m_ptr); } + if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO; + } - if (player_cast) - { - /* Take damage */ + if (player_cast) + { + /* Take damage */ #ifdef JP -take_hit(DAMAGE_GENO, randint1(4), "Ëõ»¦¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1); + take_hit(DAMAGE_GENO, randint1(dam_side), format("%^s¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", spell_name), -1); #else - take_hit(DAMAGE_GENO, randint1(4), "the strain of casting Genocide", -1); + take_hit(DAMAGE_GENO, randint1(dam_side), format("the strain of casting %^s", spell_name), -1); #endif + } - } + /* Visual feedback */ + move_cursor_relative(py, px); - /* Visual feedback */ - move_cursor_relative(py, px); + /* Redraw */ + p_ptr->redraw |= (PR_HP); - /* Redraw */ - p_ptr->redraw |= (PR_HP); + /* Window stuff */ + p_ptr->window |= (PW_PLAYER); - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); + /* Handle */ + handle_stuff(); - /* Handle */ - handle_stuff(); + /* Fresh */ + Term_fresh(); + + /* Delay */ + Term_xtra(TERM_XTRA_DELAY, msec); - /* Fresh */ - Term_fresh(); + return !resist; +} - /* Delay */ - Term_xtra(TERM_XTRA_DELAY, msec); + +/* + * Delete all non-unique/non-quest monsters of a given "type" from the level + */ +bool symbol_genocide(int power, bool player_cast) +{ + int i; + char typ; + bool result = FALSE; + + /* Prevent genocide in quest levels */ + if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle) + { + return (FALSE); + } + + /* Mega-Hack -- Get a monster symbol */ +#ifdef JP + while (!get_com("¤É¤Î¼ïÎà(ʸ»ú)¤Î¥â¥ó¥¹¥¿¡¼¤òËõ»¦¤·¤Þ¤¹¤«: ", &typ, FALSE)) ; +#else + while (!get_com("Choose a monster race (by symbol) to genocide: ", &typ, FALSE)) ; +#endif + + /* Delete the monsters of that "type" */ + for (i = 1; i < m_max; i++) + { + monster_type *m_ptr = &m_list[i]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + /* Paranoia -- Skip dead monsters */ + if (!m_ptr->r_idx) continue; + + /* Skip "wrong" monsters */ + if (r_ptr->d_char != typ) continue; /* Take note */ - result = TRUE; +#ifdef JP + result |= genocide_aux(i, power, player_cast, 4, "Ëõ»¦"); +#else + result |= genocide_aux(i, power, player_cast, 4, "Genocide"); +#endif } + if (result) { chg_virtue(V_VITALITY, -2); chg_virtue(V_CHANCE, -1); } - return (result); + return result; } /* * Delete all nearby (non-unique) monsters */ -bool mass_genocide(int power, int player_cast) +bool mass_genocide(int power, bool player_cast) { - int i; - bool result = FALSE; - int msec = delay_factor * delay_factor * delay_factor; - + int i; + bool result = FALSE; /* Prevent mass genocide in quest levels */ - if (p_ptr->inside_quest && !random_quest_number(dun_level)) + if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle) { return (FALSE); } @@ -4798,10 +4819,7 @@ bool mass_genocide(int power, int player_cast) /* Delete the (nearby) monsters */ for (i = 1; i < m_max; i++) { - monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - bool angry = FALSE; - char m_name[80]; + monster_type *m_ptr = &m_list[i]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4809,96 +4827,12 @@ bool mass_genocide(int power, int player_cast) /* Skip distant monsters */ if (m_ptr->cdis > MAX_SIGHT) continue; - if (is_pet(m_ptr) && !player_cast) continue; - - /* Hack -- Skip unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE; - - /* Hack -- Skip Quest Monsters */ - else if (r_ptr->flags1 & RF1_QUESTOR) angry = TRUE; - - else if (r_ptr->flags7 & RF7_UNIQUE2) angry = TRUE; - - else if (i == p_ptr->riding) angry = TRUE; - - else if (player_cast && (r_ptr->level > randint0(power))) angry = TRUE; - - else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) angry = TRUE; - - /* Delete the monster */ - else delete_monster_idx(i); - - if (angry && player_cast) - { - bool see_m = is_seen(m_ptr); - - monster_desc(m_name, m_ptr, 0); - if (see_m && !p_ptr->blind) - { -#ifdef JP -msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); -#else - msg_format("%^s is unaffected.", m_name); -#endif - } - if (m_ptr->csleep) - { - m_ptr->csleep = 0; - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); - if (see_m && !p_ptr->blind) - { -#ifdef JP -msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); -#else - msg_format("%^s wakes up.", m_name); -#endif - } - } - if (is_friendly(m_ptr) && !is_pet(m_ptr)) - { - if (see_m && !p_ptr->blind) - { -#ifdef JP - msg_format("%s¤ÏÅܤä¿¡ª", m_name); -#else - msg_format("%^s gets angry!", m_name); -#endif - } - set_hostile(m_ptr); - } - if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO; - } - - if (player_cast) - { - /* Hack -- visual feedback */ + /* Note effect */ #ifdef JP -take_hit(DAMAGE_GENO, randint1(3), "¼þÊÕËõ»¦¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1); + result |= genocide_aux(i, power, player_cast, 3, "¼þÊÕËõ»¦"); #else - take_hit(DAMAGE_GENO, randint1(3), "the strain of casting Mass Genocide", -1); + result |= genocide_aux(i, power, player_cast, 3, "Mass Genocide"); #endif - - } - - move_cursor_relative(py, px); - - /* Redraw */ - p_ptr->redraw |= (PR_HP); - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - - /* Handle */ - handle_stuff(); - - /* Fresh */ - Term_fresh(); - - /* Delay */ - Term_xtra(TERM_XTRA_DELAY, msec); - - /* Note effect */ - result = TRUE; } if (result) @@ -4907,7 +4841,7 @@ take_hit(DAMAGE_GENO, randint1(3), " chg_virtue(V_CHANCE, -1); } - return (result); + return result; } @@ -4915,15 +4849,13 @@ take_hit(DAMAGE_GENO, randint1(3), " /* * Delete all nearby (non-unique) undead */ -bool mass_genocide_undead(int power, int player_cast) +bool mass_genocide_undead(int power, bool player_cast) { - int i; - bool result = FALSE; - int msec = delay_factor * delay_factor * delay_factor; - + int i; + bool result = FALSE; /* Prevent mass genocide in quest levels */ - if (p_ptr->inside_quest && !random_quest_number(dun_level)) + if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle) { return (FALSE); } @@ -4931,10 +4863,8 @@ bool mass_genocide_undead(int power, int player_cast) /* Delete the (nearby) monsters */ for (i = 1; i < m_max; i++) { - monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - bool angry = FALSE; - char m_name[80]; + monster_type *m_ptr = &m_list[i]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4944,96 +4874,12 @@ bool mass_genocide_undead(int power, int player_cast) /* Skip distant monsters */ if (m_ptr->cdis > MAX_SIGHT) continue; - if (is_pet(m_ptr) && !player_cast) continue; - - /* Hack -- Skip unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE; - - /* Hack -- Skip Quest Monsters */ - else if (r_ptr->flags1 & RF1_QUESTOR) angry = TRUE; - - else if (r_ptr->flags7 & RF7_UNIQUE2) angry = TRUE; - - else if (i == p_ptr->riding) angry = TRUE; - - else if (player_cast && (r_ptr->level > randint0(power))) angry = TRUE; - - else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) angry = TRUE; - - /* Delete the monster */ - else delete_monster_idx(i); - - if (angry && player_cast) - { - bool see_m = is_seen(m_ptr); - - monster_desc(m_name, m_ptr, 0); - if (see_m && !p_ptr->blind) - { -#ifdef JP -msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); -#else - msg_format("%^s is unaffected.", m_name); -#endif - } - if (m_ptr->csleep) - { - m_ptr->csleep = 0; - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); - if (see_m && !p_ptr->blind) - { -#ifdef JP -msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); -#else - msg_format("%^s wakes up.", m_name); -#endif - } - } - if (is_friendly(m_ptr) && !is_pet(m_ptr)) - { - if (see_m && !p_ptr->blind) - { -#ifdef JP - msg_format("%s¤ÏÅܤä¿¡ª", m_name); -#else - msg_format("%^s gets angry!", m_name); -#endif - } - set_hostile(m_ptr); - } - if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO; - } - - if (player_cast) - { - /* Hack -- visual feedback */ + /* Note effect */ #ifdef JP -take_hit(DAMAGE_GENO, randint1(3), "¥¢¥ó¥Ç¥Ã¥É¾ÃÌǤμöʸ¤ò¾§¤¨¤¿ÈèÏ«", -1); + result |= genocide_aux(i, power, player_cast, 3, "¥¢¥ó¥Ç¥Ã¥É¾ÃÌÇ"); #else - take_hit(DAMAGE_GENO, randint1(3), "the strain of casting Mass Genocide", -1); + result |= genocide_aux(i, power, player_cast, 3, "Annihilate Undead"); #endif - - } - - move_cursor_relative(py, px); - - /* Redraw */ - p_ptr->redraw |= (PR_HP); - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - - /* Handle */ - handle_stuff(); - - /* Fresh */ - Term_fresh(); - - /* Delay */ - Term_xtra(TERM_XTRA_DELAY, msec); - - /* Note effect */ - result = TRUE; } if (result) @@ -5042,7 +4888,7 @@ take_hit(DAMAGE_GENO, randint1(3), " chg_virtue(V_CHANCE, -1); } - return (result); + return result; } @@ -5092,7 +4938,7 @@ bool probing(void) msg_print(NULL); - if (m_ptr->ap_r_idx != m_ptr->r_idx) + if (!is_original_ap(m_ptr)) { if (m_ptr->mflag2 & MFLAG2_KAGE) m_ptr->mflag2 &= ~(MFLAG2_KAGE); @@ -5104,8 +4950,8 @@ bool probing(void) monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN); speed = m_ptr->mspeed - 110; - if(m_ptr->fast) speed += 10; - if(m_ptr->slow) speed -= 10; + if (MON_FAST(m_ptr)) speed += 10; + if (MON_SLOW(m_ptr)) speed -= 10; /* Get the monster's alignment */ #ifdef JP @@ -5142,17 +4988,17 @@ sprintf(buf, "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:", m_name, align, m_ } #ifdef JP - if (m_ptr->csleep) strcat(buf,"¿ç̲ "); - if (m_ptr->stunned) strcat(buf,"Û¯Û° "); - if (m_ptr->monfear) strcat(buf,"¶²ÉÝ "); - if (m_ptr->confused) strcat(buf,"º®Íð "); - if (m_ptr->invulner) strcat(buf,"̵Ũ "); + if (MON_CSLEEP(m_ptr)) strcat(buf,"¿ç̲ "); + if (MON_STUNNED(m_ptr)) strcat(buf,"Û¯Û° "); + if (MON_MONFEAR(m_ptr)) strcat(buf,"¶²ÉÝ "); + if (MON_CONFUSED(m_ptr)) strcat(buf,"º®Íð "); + if (MON_INVULNER(m_ptr)) strcat(buf,"̵Ũ "); #else - if (m_ptr->csleep) strcat(buf,"sleeping "); - if (m_ptr->stunned) strcat(buf,"stunned "); - if (m_ptr->monfear) strcat(buf,"scared "); - if (m_ptr->confused) strcat(buf,"confused "); - if (m_ptr->invulner) strcat(buf,"invulnerable "); + if (MON_CSLEEP(m_ptr)) strcat(buf,"sleeping "); + if (MON_STUNNED(m_ptr)) strcat(buf,"stunned "); + if (MON_MONFEAR(m_ptr)) strcat(buf,"scared "); + if (MON_CONFUSED(m_ptr)) strcat(buf,"confused "); + if (MON_INVULNER(m_ptr)) strcat(buf,"invulnerable "); #endif buf[strlen(buf)-1] = '\0'; prt(buf,0,0); @@ -5237,6 +5083,9 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) return (FALSE); } + /* Lose monster light */ + if (!in_generate) clear_mon_lite(); + /* Big area of affect */ for (y = (y1 - r); y <= (y1 + r); y++) { @@ -5295,7 +5144,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) m_ptr->hp = m_ptr->maxhp; /* Try to teleport away quest monsters */ - if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TRUE, FALSE)) continue; + if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TELEPORT_DEC_VALOUR)) continue; } else { @@ -5304,7 +5153,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) char m_name[80]; monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); - do_cmd_write_nikki(NIKKI_NAMED_PET, 6, m_name); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name); } /* Delete the monster (if any) */ @@ -5370,17 +5219,17 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) if (t < 20) { /* Create granite wall */ - cave_set_feat(y, x, FEAT_WALL); + cave_set_feat(y, x, feat_granite); } else if (t < 70) { /* Create quartz vein */ - cave_set_feat(y, x, FEAT_QUARTZ); + cave_set_feat(y, x, feat_quartz_vein); } else if (t < 100) { /* Create magma vein */ - cave_set_feat(y, x, FEAT_MAGMA); + cave_set_feat(y, x, feat_magma_vein); } else { @@ -5398,12 +5247,12 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) else if (t < 70) { /* Create quartz vein */ - c_ptr->feat = FEAT_QUARTZ; + c_ptr->feat = feat_quartz_vein; } else if (t < 100) { /* Create magma vein */ - c_ptr->feat = FEAT_MAGMA; + c_ptr->feat = feat_magma_vein; } else { @@ -5418,9 +5267,47 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) } } - if (!in_generate) { + /* Process "re-glowing" */ + for (y = (y1 - r); y <= (y1 + r); y++) + { + for (x = (x1 - r); x <= (x1 + r); x++) + { + /* Skip illegal grids */ + if (!in_bounds(y, x)) continue; + + /* Extract the distance */ + k = distance(y1, x1, y, x); + + /* Stay in the circle of death */ + if (k > r) continue; + + /* Access the grid */ + c_ptr = &cave[y][x]; + + if (is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW; + else if (!(d_info[dungeon_type].flags1 & DF1_DARKNESS)) + { + int i, yy, xx; + cave_type *cc_ptr; + + for (i = 0; i < 9; i++) + { + yy = y + ddy_ddd[i]; + xx = x + ddx_ddd[i]; + if (!in_bounds2(yy, xx)) continue; + cc_ptr = &cave[yy][xx]; + if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) + { + c_ptr->info |= CAVE_GLOW; + break; + } + } + } + } + } + /* Hack -- Affect player */ if (flag) { @@ -5445,16 +5332,18 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE); /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); - - /* Update the monsters */ - p_ptr->update |= (PU_MONSTERS); + p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS); /* Redraw map */ p_ptr->redraw |= (PR_MAP); /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + + if (p_ptr->special_defense & NINJA_S_STEALTH) + { + if (cave[py][px].info & CAVE_GLOW) set_superstealth(FALSE); + } } /* Success */ @@ -5480,7 +5369,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) * for a single turn, unless that monster can pass_walls or kill_walls. * This has allowed massive simplification of the "monster" code. */ -bool earthquake(int cy, int cx, int r) +bool earthquake_aux(int cy, int cx, int r, int m_idx) { int i, t, y, x, yy, xx, dy, dx; int damage = 0; @@ -5580,31 +5469,28 @@ bool earthquake(int cy, int cx, int r) case 1: { #ifdef JP -msg_print("¥À¥ó¥¸¥ç¥ó¤ÎÊɤ¬Êø¤ì¤¿¡ª"); + msg_print("¥À¥ó¥¸¥ç¥ó¤ÎÊɤ¬Êø¤ì¤¿¡ª"); #else msg_print("The cave ceiling collapses!"); #endif - break; } case 2: { #ifdef JP -msg_print("¥À¥ó¥¸¥ç¥ó¤Î¾²¤¬ÉÔ¼«Á³¤Ë¤Í¤¸¶Ê¤¬¤Ã¤¿¡ª"); + msg_print("¥À¥ó¥¸¥ç¥ó¤Î¾²¤¬ÉÔ¼«Á³¤Ë¤Í¤¸¶Ê¤¬¤Ã¤¿¡ª"); #else msg_print("The cave floor twists in an unnatural way!"); #endif - break; } default: { #ifdef JP -msg_print("¥À¥ó¥¸¥ç¥ó¤¬Íɤ줿¡ªÊø¤ì¤¿´ä¤¬Æ¬¤Ë¹ß¤Ã¤Æ¤­¤¿¡ª"); + msg_print("¥À¥ó¥¸¥ç¥ó¤¬Íɤ줿¡ªÊø¤ì¤¿´ä¤¬Æ¬¤Ë¹ß¤Ã¤Æ¤­¤¿¡ª"); #else msg_print("The cave quakes! You are pummeled with debris!"); #endif - break; } } @@ -5614,11 +5500,10 @@ msg_print(" { /* Message and damage */ #ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª"); + msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª"); #else msg_print("You are severely crushed!"); #endif - damage = 200; } @@ -5631,22 +5516,20 @@ msg_print(" case 1: { #ifdef JP -msg_print("¹ß¤êÃí¤°´ä¤ò¤¦¤Þ¤¯Èò¤±¤¿¡ª"); + msg_print("¹ß¤êÃí¤°´ä¤ò¤¦¤Þ¤¯Èò¤±¤¿¡ª"); #else msg_print("You nimbly dodge the blast!"); #endif - damage = 0; break; } case 2: { #ifdef JP -msg_print("´äÀФ¬¤¢¤Ê¤¿¤Ëľ·â¤·¤¿!"); + msg_print("´äÀФ¬¤¢¤Ê¤¿¤Ëľ·â¤·¤¿!"); #else msg_print("You are bashed by rubble!"); #endif - damage = damroll(10, 4); (void)set_stun(p_ptr->stun + randint1(50)); break; @@ -5654,11 +5537,10 @@ msg_print(" case 3: { #ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¾²¤ÈÊɤȤδ֤˶´¤Þ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª"); + msg_print("¤¢¤Ê¤¿¤Ï¾²¤ÈÊɤȤδ֤˶´¤Þ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª"); #else msg_print("You are crushed between the floor and ceiling!"); #endif - damage = damroll(10, 4); (void)set_stun(p_ptr->stun + randint1(50)); break; @@ -5673,12 +5555,35 @@ msg_print(" map[16+py-cy][16+px-cx] = FALSE; /* Take some damage */ + if (damage) + { + char *killer; + + if (m_idx) + { + char m_name[80]; + monster_type *m_ptr = &m_list[m_idx]; + + /* Get the monster's real name */ + monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); + #ifdef JP -if (damage) take_hit(DAMAGE_ATTACK, damage, "ÃÏ¿Ì", -1); + killer = format("%s¤Îµ¯¤³¤·¤¿ÃÏ¿Ì", m_name); #else - if (damage) take_hit(DAMAGE_ATTACK, damage, "an earthquake", -1); + killer = format("an earthquake caused by %s", m_name); #endif + } + else + { +#ifdef JP + killer = "ÃÏ¿Ì"; +#else + killer = "an earthquake"; +#endif + } + take_hit(DAMAGE_ATTACK, damage, killer, -1); + } } /* Examine the quaked region */ @@ -5764,17 +5669,16 @@ if (damage) take_hit(DAMAGE_ATTACK, damage, " /* Scream in pain */ #ifdef JP -msg_format("%^s¤Ï¶ìÄˤǵ㤭¤ï¤á¤¤¤¿¡ª", m_name); + if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s¤Ï¶ìÄˤǵ㤭¤ï¤á¤¤¤¿¡ª", m_name); #else - msg_format("%^s wails out in pain!", m_name); + if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s wails out in pain!", m_name); #endif - /* Take damage from the quake */ damage = (sn ? damroll(4, 8) : (m_ptr->hp + 1)); /* Monster is certainly awake */ - m_ptr->csleep = 0; + (void)set_monster_csleep(c_ptr->m_idx, 0); /* Apply damage directly */ m_ptr->hp -= damage; @@ -5784,9 +5688,9 @@ msg_format("%^s { /* Message */ #ifdef JP -msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name); + if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name); #else - msg_format("%^s is embedded in the rock!", m_name); + if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s is embedded in the rock!", m_name); #endif if (c_ptr->m_idx) @@ -5796,7 +5700,7 @@ msg_format("%^s char m2_name[80]; monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE); - do_cmd_write_nikki(NIKKI_NAMED_PET, 7, m2_name); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_EARTHQUAKE, m2_name); } } @@ -5812,12 +5716,12 @@ msg_format("%^s { int m_idx = cave[yy][xx].m_idx; - /* Update the new location */ - cave[sy][sx].m_idx = m_idx; - /* Update the old location */ cave[yy][xx].m_idx = 0; + /* Update the new location */ + cave[sy][sx].m_idx = m_idx; + /* Move the monster */ m_ptr->fy = sy; m_ptr->fx = sx; @@ -5836,6 +5740,8 @@ msg_format("%^s } } + /* Lose monster light */ + clear_mon_lite(); /* Examine the quaked region */ for (dy = -r; dy <= r; dy++) @@ -5868,21 +5774,21 @@ msg_format("%^s if (t < 20) { /* Create granite wall */ - cave_set_feat(yy, xx, FEAT_WALL); + cave_set_feat(yy, xx, feat_granite); } /* Quartz */ else if (t < 70) { /* Create quartz vein */ - cave_set_feat(yy, xx, FEAT_QUARTZ); + cave_set_feat(yy, xx, feat_quartz_vein); } /* Magma */ else if (t < 100) { /* Create magma vein */ - cave_set_feat(yy, xx, FEAT_MAGMA); + cave_set_feat(yy, xx, feat_magma_vein); } /* Floor */ @@ -5896,14 +5802,52 @@ msg_format("%^s } + /* Process "re-glowing" */ + for (dy = -r; dy <= r; dy++) + { + for (dx = -r; dx <= r; dx++) + { + /* Extract the location */ + yy = cy + dy; + xx = cx + dx; + + /* Skip illegal grids */ + if (!in_bounds(yy, xx)) continue; + + /* Skip distant grids */ + if (distance(cy, cx, yy, xx) > r) continue; + + /* Access the grid */ + c_ptr = &cave[yy][xx]; + + if (is_mirror_grid(c_ptr)) c_ptr->info |= CAVE_GLOW; + else if (!(d_info[dungeon_type].flags1 & DF1_DARKNESS)) + { + int ii, yyy, xxx; + cave_type *cc_ptr; + + for (ii = 0; ii < 9; ii++) + { + yyy = yy + ddy_ddd[ii]; + xxx = xx + ddx_ddd[ii]; + if (!in_bounds2(yyy, xxx)) continue; + cc_ptr = &cave[yyy][xxx]; + if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) + { + c_ptr->info |= CAVE_GLOW; + break; + } + } + } + } + } + + /* Mega-Hack -- Forget the view and lite */ p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE); /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); - - /* Update the monsters */ - p_ptr->update |= (PU_DISTANCE); + p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS); /* Update the health bar */ p_ptr->redraw |= (PR_HEALTH | PR_UHEALTH); @@ -5914,10 +5858,20 @@ msg_format("%^s /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + if (p_ptr->special_defense & NINJA_S_STEALTH) + { + if (cave[py][px].info & CAVE_GLOW) set_superstealth(FALSE); + } + /* Success */ return (TRUE); } +bool earthquake(int cy, int cx, int r) +{ + return earthquake_aux(cy, cx, r, 0); +} + void discharge_minion(void) { @@ -5968,6 +5922,15 @@ void discharge_minion(void) project(i, 2+(r_ptr->level/20), m_ptr->fy, m_ptr->fx, dam, GF_PLASMA, PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1); + + if (record_named_pet && m_ptr->nickname) + { + char m_name[80]; + + monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_BLAST, m_name); + } + delete_monster_idx(i); } } @@ -6028,15 +5991,13 @@ static void cave_temp_room_lite(void) if (r_ptr->flags2 & (RF2_SMART)) chance = 100; /* Sometimes monsters wake up */ - if (m_ptr->csleep && (randint0(100) < chance)) + if (MON_CSLEEP(m_ptr) && (randint0(100) < chance)) { /* Wake up! */ - m_ptr->csleep = 0; - - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); + (void)set_monster_csleep(c_ptr->m_idx, 0); /* Notice the "waking up" */ - if (is_seen(m_ptr)) + if (m_ptr->ml) { char m_name[80]; @@ -6045,15 +6006,11 @@ static void cave_temp_room_lite(void) /* Dump a message */ #ifdef JP -msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); + msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); #else msg_format("%^s wakes up.", m_name); #endif } - - /* Redraw the health bar */ - if (m_ptr->ml && (p_ptr->health_who == c_ptr->m_idx)) - p_ptr->redraw |= (PR_HEALTH); } } @@ -6103,24 +6060,27 @@ static void cave_temp_room_unlite(void) /* Darken the grid */ if (do_dark) { - for (j = 0; j < 9; j++) + if (dun_level || !is_daytime()) { - int by = y + ddy_ddd[j]; - int bx = x + ddx_ddd[j]; - - if (in_bounds2(by, bx)) + for (j = 0; j < 9; j++) { - cave_type *cc_ptr = &cave[by][bx]; + int by = y + ddy_ddd[j]; + int bx = x + ddx_ddd[j]; - if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) + if (in_bounds2(by, bx)) { - do_dark = FALSE; - break; + cave_type *cc_ptr = &cave[by][bx]; + + if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) + { + do_dark = FALSE; + break; + } } } - } - if (!do_dark) continue; + if (!do_dark) continue; + } c_ptr->info &= ~(CAVE_GLOW); @@ -6567,7 +6527,7 @@ bool fire_blast(int typ, int dir, int dd, int ds, int num, int dev) } /* Use an actual "target" */ - else if (dir == 5) + else /* if (dir == 5) */ { tx = target_col; ty = target_row; @@ -6663,8 +6623,7 @@ msg_print(" m_ptr = &m_list[c_ptr->m_idx]; r_ptr = &r_info[m_ptr->r_idx]; - /* Redraw the health bar */ - if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH); + (void)set_monster_csleep(c_ptr->m_idx, 0); if (r_ptr->flagsr & RFR_RES_TELE) { @@ -6676,9 +6635,6 @@ msg_print(" if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - m_ptr->csleep = 0; - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); - /* Failure */ return FALSE; } @@ -6686,7 +6642,7 @@ msg_print(" sound(SOUND_TELEPORT); /* Swap the player and monster */ - (void)move_player_effect(ty, tx, MPE_HANDLE_STUFF | MPE_DONT_PICKUP); + (void)move_player_effect(ty, tx, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); /* Success */ return TRUE; @@ -6933,17 +6889,11 @@ bool wall_stone(void) bool dummy = (project(0, 1, py, px, 0, GF_STONE_WALL, flg, -1)); /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); - - /* Update the monsters */ - p_ptr->update |= (PU_MONSTERS); + p_ptr->update |= (PU_FLOW); /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - return dummy; } @@ -7072,7 +7022,7 @@ msg_print(" msg_print("Space warps about you!"); #endif - teleport_player(damroll(10, 10), TRUE); + teleport_player(damroll(10, 10), TELEPORT_PASSIVE); if (randint0(13)) (*count) += activate_hi_summon(py, px, FALSE); if (!one_in_(6)) break; } @@ -7451,14 +7401,15 @@ bool charm_living(int dir, int plev) } -void kawarimi(bool success) +bool kawarimi(bool success) { object_type forge; object_type *q_ptr = &forge; int y, x; - if (p_ptr->confused || p_ptr->blind || p_ptr->paralyzed || p_ptr->image) return; - if (randint0(200) < p_ptr->stun) return; + if (p_ptr->is_dead) return FALSE; + if (p_ptr->confused || p_ptr->blind || p_ptr->paralyzed || p_ptr->image) return FALSE; + if (randint0(200) < p_ptr->stun) return FALSE; if (!success && one_in_(3)) { @@ -7469,13 +7420,13 @@ void kawarimi(bool success) #endif p_ptr->special_defense &= ~(NINJA_KAWARIMI); p_ptr->redraw |= (PR_STATUS); - return; + return FALSE; } y = py; x = px; - teleport_player(10 + randint1(90), FALSE); + teleport_player(10 + randint1(90), 0L); object_wipe(q_ptr); @@ -7496,6 +7447,9 @@ void kawarimi(bool success) p_ptr->special_defense &= ~(NINJA_KAWARIMI); p_ptr->redraw |= (PR_STATUS); + + /* Teleported */ + return TRUE; } @@ -7511,6 +7465,7 @@ bool rush_attack(bool *mdeath) u16b path_g[32]; int path_n, i; bool tmp_mdeath = FALSE; + bool moved = FALSE; if (mdeath) *mdeath = FALSE; @@ -7581,7 +7536,7 @@ bool rush_attack(bool *mdeath) } /* Move player before updating the monster */ - if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE, FALSE); + if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); /* Update the monster */ update_mon(cave[ny][nx].m_idx, TRUE); @@ -7612,12 +7567,14 @@ bool rush_attack(bool *mdeath) #endif } + if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); + moved = TRUE; tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN); break; } - if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE, FALSE); + if (!moved && !player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); if (mdeath) *mdeath = tmp_mdeath; return TRUE;