}
-
/*
- * 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;
-
- /* Prevent genocide in quest levels */
- if (p_ptr->inside_quest && !random_quest_number(dun_level))
- {
- 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
+ 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;
+ if (is_pet(m_ptr) && !player_cast) return FALSE;
- /* 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];
-
- /* Paranoia -- Skip dead monsters */
- if (!m_ptr->r_idx) continue;
-
- /* Skip "wrong" monsters */
- if (r_ptr->d_char != typ) continue;
+ /* Hack -- Skip Unique Monsters or Quest Monsters */
+ if (r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) resist = TRUE;
- if (is_pet(m_ptr) && !player_cast) continue;
+ else if (r_ptr->flags7 & RF7_UNIQUE2) resist = TRUE;
- /* Hack -- Skip Unique Monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE;
+ else if (m_idx == p_ptr->riding) resist = 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 delete_monster_idx(m_idx);
- 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 (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)
+ {
+ m_ptr->csleep = 0;
+ if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+ if (m_ptr->ml)
+ {
+ /* Redraw (later) if needed */
+ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+ if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
}
- if (m_ptr->csleep)
+ if (see_m)
{
- m_ptr->csleep = 0;
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- if (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
- }
- 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();
+
+ /* Fresh */
+ Term_fresh();
+
+ /* Delay */
+ Term_xtra(TERM_XTRA_DELAY, msec);
+
+ return !resist;
+}
+
+
+/*
+ * 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))
+ {
+ return (FALSE);
+ }
- /* Handle */
- handle_stuff();
+ /* 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];
- /* Fresh */
- Term_fresh();
+ /* Paranoia -- Skip dead monsters */
+ if (!m_ptr->r_idx) continue;
- /* Delay */
- Term_xtra(TERM_XTRA_DELAY, msec);
+ /* 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))
/* 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;
/* 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 (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
- }
- 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)
chg_virtue(V_CHANCE, -1);
}
- return (result);
+ return result;
}
/*
* 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))
/* 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;
/* 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 (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
- }
- 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)
chg_virtue(V_CHANCE, -1);
}
- return (result);
+ return result;
}