/* Purpose: Monster attacks */
/*
- * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
+ * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
*
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
+ * This software may be copied and distributed for educational, research,
+ * and not for profit purposes provided that this copyright and statement
+ * are included in all such copies. Other copyrights may also apply.
*/
#include "angband.h"
-extern cptr silly_attacks[MAX_SILLY_ATTACK];
/*
* Critical blow. All hits that do 95% of total possible damage,
if ((dam < 20) && (randint0(100) >= dam)) return (0);
/* Perfect damage */
- if (dam == total && dam >= 40) max++;
+ if ((dam >= total) && (dam >= 40)) max++;
/* Super-charge */
if (dam >= 20)
object_type *o_ptr;
- object_kind *k_ptr;
-
char o_name[MAX_NLEN];
char m_name[80];
bool blinked;
bool touched = FALSE, fear = FALSE, alive = TRUE;
bool explode = FALSE;
- bool resist_drain = FALSE;
bool do_silly_attack = (one_in_(2) && p_ptr->image);
- int syouryaku = 0;
+ int get_damage = 0;
+#ifdef JP
+ int abbreviate = 0;
+#endif
/* Not allowed to attack */
if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
/* ...nor if friendly */
if (!is_hostile(m_ptr)) return FALSE;
- /* Total armor */
- ac = p_ptr->ac + p_ptr->to_a;
-
/* Extract the effective monster level */
rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
monster_desc(m_name, m_ptr, 0);
/* Get the "died from" information (i.e. "a kobold") */
- monster_desc(ddesc, m_ptr, 0x88);
+ monster_desc(ddesc, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
if (p_ptr->special_defense & KATA_IAI)
{
if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
{
- kawarimi(TRUE);
- return TRUE;
+ if (kawarimi(TRUE)) return TRUE;
}
/* Assume no blink */
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool visible = FALSE;
bool obvious = FALSE;
int power = 0;
}
/* Stop if player is dead or gone */
- if (!alive || death) break;
+ if (!p_ptr->playing || p_ptr->is_dead) break;
if (distance(py, px, m_ptr->fy, m_ptr->fx) > 1) break;
/* Handle "leaving" */
if (method == RBM_SHOOT) continue;
- /* Extract visibility (before blink) */
- if (m_ptr->ml) visible = TRUE;
-
/* Extract the attack "power" */
- switch (effect)
- {
- case RBE_HURT: power = 60; break;
- case RBE_POISON: power = 5; break;
- case RBE_UN_BONUS: power = 20; break;
- case RBE_UN_POWER: power = 15; break;
- case RBE_EAT_GOLD: power = 5; break;
- case RBE_EAT_ITEM: power = 5; break;
- case RBE_EAT_FOOD: power = 5; break;
- case RBE_EAT_LITE: power = 5; break;
- case RBE_ACID: power = 0; break;
- case RBE_ELEC: power = 10; break;
- case RBE_FIRE: power = 10; break;
- case RBE_COLD: power = 10; break;
- case RBE_BLIND: power = 2; break;
- case RBE_CONFUSE: power = 10; break;
- case RBE_TERRIFY: power = 10; break;
- case RBE_PARALYZE: power = 2; break;
- case RBE_LOSE_STR: power = 0; break;
- case RBE_LOSE_DEX: power = 0; break;
- case RBE_LOSE_CON: power = 0; break;
- case RBE_LOSE_INT: power = 0; break;
- case RBE_LOSE_WIS: power = 0; break;
- case RBE_LOSE_CHR: power = 0; break;
- case RBE_LOSE_ALL: power = 2; break;
- case RBE_SHATTER: power = 60; break;
- case RBE_EXP_10: power = 5; break;
- case RBE_EXP_20: power = 5; break;
- case RBE_EXP_40: power = 5; break;
- case RBE_EXP_80: power = 5; break;
- case RBE_DISEASE: power = 5; break;
- case RBE_TIME: power = 5; break;
- case RBE_EXP_VAMP: power = 5; break;
- case RBE_DR_MANA: power = 5; break;
- case RBE_SUPERHURT: power = 60; break;
- }
+ power = mbe_info[effect].power;
+ /* Total armor */
+ ac = p_ptr->ac + p_ptr->to_a;
/* Monster hits player */
- if (!effect || check_hit(power, rlev, m_ptr->stunned))
+ if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
{
/* Always disturbing */
disturb(1, 0);
((randint0(100) + p_ptr->lev) > 50))
{
/* Remember the Evil-ness */
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= RF3_EVIL;
- }
+ if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
/* Message */
#ifdef JP
- if (syouryaku)
+ if (abbreviate)
msg_format("·âÂष¤¿¡£");
else
msg_format("%^s¤Ï·âÂव¤ì¤¿¡£", m_name);
- syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
+ abbreviate = 1;/*£²²óÌܰʹߤϾÊά */
#else
msg_format("%^s is repelled.", m_name);
#endif
case RBM_CHARGE:
{
#ifdef JP
- syouryaku = -1;
+ abbreviate = -1;
act = "¤ÏÀÁµá½ñ¤ò¤è¤³¤·¤¿¡£";
#else
act = "charges you.";
case RBM_CRAWL:
{
#ifdef JP
- syouryaku = -1;
+ abbreviate = -1;
act = "¤¬ÂΤξå¤òÇ礤²ó¤Ã¤¿¡£";
#else
act = "crawls on you.";
case RBM_EXPLODE:
{
- syouryaku = -1;
#ifdef JP
+ abbreviate = -1;
act = "¤ÏÇúȯ¤·¤¿¡£";
#else
act = "explodes.";
case RBM_XXX4:
{
- syouryaku = -1;
#ifdef JP
+ abbreviate = -1;
act = "¤¬ XXX4 ¤òȯ¼Í¤·¤¿¡£";
#else
act = "projects XXX4's at you.";
case RBM_INSULT:
{
- syouryaku = -1;
+#ifdef JP
+ abbreviate = -1;
+#endif
act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
sound(SOUND_MOAN);
break;
case RBM_MOAN:
{
- syouryaku = -1;
+#ifdef JP
+ abbreviate = -1;
+#endif
act = desc_moan[randint0(4)];
sound(SOUND_MOAN);
break;
case RBM_SHOW:
{
- syouryaku = -1;
+#ifdef JP
+ abbreviate = -1;
+#endif
if (m_ptr->r_idx == MON_JAIAN)
{
#ifdef JP
{
if (do_silly_attack)
{
- syouryaku = -1;
+#ifdef JP
+ abbreviate = -1;
+#endif
act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
}
#ifdef JP
- if(syouryaku==0)
+ if (abbreviate == 0)
msg_format("%^s¤Ë%s", m_name, act);
- else if(syouryaku==1)
+ else if (abbreviate == 1)
msg_format("%s", act);
- else /*if(syouryaku==-1)*/
+ else /* if (abbreviate == -1) */
msg_format("%^s%s", m_name, act);
- syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
+ abbreviate = 1;/*£²²óÌܰʹߤϾÊά */
#else
- msg_format("%^s %s", m_name, act);
+ msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
#endif
}
case RBE_SUPERHURT:
{
- int ac = p_ptr->ac+p_ptr->to_a;
- if ((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) {
- int tmp_damage = damage-(damage*((ac < 150) ? ac : 150)/250);
+ if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
+ {
+ int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
#ifdef JP
msg_print("Ä˺¨¤Î°ì·â¡ª");
#else
tmp_damage = MAX(damage, tmp_damage*2);
/* Take damage */
- take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
break;
}
}
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
break;
}
if (explode) break;
/* Take "poison" effect */
- if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
+ if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
{
if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
{
}
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Learn about the player */
update_smart_learn(m_idx, DRS_POIS);
if (explode) break;
/* Allow complete resist */
- if (!p_ptr->resist_disen)
+ if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
{
/* Apply disenchantment */
- if (apply_disenchant(0)) obvious = TRUE;
+ if (apply_disenchant(0))
+ {
+ /* Hack -- Update AC */
+ update_stuff();
+ obvious = TRUE;
+ }
}
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Learn about the player */
update_smart_learn(m_idx, DRS_DISEN);
case RBE_UN_POWER:
{
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Find an item */
for (k = 0; k < 10; k++)
case RBE_EAT_GOLD:
{
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Confused monsters cannot steal successfully. -LM-*/
- if (m_ptr->confused) break;
+ if (MON_CONFUSED(m_ptr)) break;
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Obvious */
obvious = TRUE;
/* Saving throw (unless paralyzed) based on dex and level */
if (!p_ptr->paralyzed &&
(randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
- p_ptr->lev)))
+ p_ptr->lev)))
{
/* Saving throw message */
#ifdef JP
case RBE_EAT_ITEM:
{
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Confused monsters cannot steal successfully. -LM-*/
- if (m_ptr->confused) break;
+ if (MON_CONFUSED(m_ptr)) break;
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Saving throw (unless paralyzed) based on dex and level */
if (!p_ptr->paralyzed &&
(randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
- p_ptr->lev)))
+ p_ptr->lev)))
{
/* Saving throw message */
#ifdef JP
if (!o_ptr->k_idx) continue;
/* Skip artifacts */
- if (artifact_p(o_ptr) || o_ptr->art_name) continue;
+ if (object_is_artifact(o_ptr)) continue;
/* Get a description */
- object_desc(o_name, o_ptr, FALSE, 3);
+ object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
/* Message */
#ifdef JP
msg_format("%s(%c)¤ò%sÅð¤Þ¤ì¤¿¡ª",
- o_name, index_to_label(i),
- ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
+ o_name, index_to_label(i),
+ ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
#else
msg_format("%sour %s (%c) was stolen!",
- ((o_ptr->number > 1) ? "One of y" : "Y"),
- o_name, index_to_label(i));
+ ((o_ptr->number > 1) ? "One of y" : "Y"),
+ o_name, index_to_label(i));
#endif
chg_virtue(V_SACRIFICE, 1);
/* Make an object */
o_idx = o_pop();
-
+
/* Success */
if (o_idx)
{
object_type *j_ptr;
-
+
/* Get new object */
j_ptr = &o_list[o_idx];
-
+
/* Copy object */
object_copy(j_ptr, o_ptr);
-
+
/* Modify number */
j_ptr->number = 1;
-
+
/* Hack -- If a rod or wand, allocate total
* maximum timeouts or charges between those
* stolen and those missed. -LM-
*/
if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
{
- k_ptr = &k_info[o_ptr->k_idx];
j_ptr->pval = o_ptr->pval / o_ptr->number;
o_ptr->pval -= j_ptr->pval;
}
-
+
/* Forget mark */
- j_ptr->marked = FALSE;
-
+ j_ptr->marked = OM_TOUCHED;
+
/* Memorize monster */
j_ptr->held_m_idx = m_idx;
-
+
/* Build stack */
j_ptr->next_o_idx = m_ptr->hold_o_idx;
-
+
/* Build stack */
m_ptr->hold_o_idx = o_idx;
}
case RBE_EAT_FOOD:
{
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Steal some food */
for (k = 0; k < 10; k++)
if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
/* Get a description */
- object_desc(o_name, o_ptr, FALSE, 0);
+ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
/* Message */
#ifdef JP
msg_format("%s(%c)¤ò%s¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª",
- o_name, index_to_label(i),
- ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
+ o_name, index_to_label(i),
+ ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
#else
msg_format("%sour %s (%c) was eaten!",
- ((o_ptr->number > 1) ? "One of y" : "Y"),
- o_name, index_to_label(i));
+ ((o_ptr->number > 1) ? "One of y" : "Y"),
+ o_name, index_to_label(i));
#endif
o_ptr = &inventory[INVEN_LITE];
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Drain fuel */
- if ((o_ptr->xtra4 > 0) && (!artifact_p(o_ptr)))
+ if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
{
/* Reduce fuel */
- o_ptr->pval -= (250 + randint1(250));
- if (o_ptr->pval < 1) o_ptr->pval = 1;
+ o_ptr->xtra4 -= (s16b)(250 + randint1(250));
+ if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
/* Notice */
if (!p_ptr->blind)
/* Special damage */
- acid_dam(damage, ddesc, -1);
+ get_damage += acid_dam(damage, ddesc, -1);
+
+ /* Hack -- Update AC */
+ update_stuff();
/* Learn about the player */
update_smart_learn(m_idx, DRS_ACID);
/* Special damage */
- elec_dam(damage, ddesc, -1);
+ get_damage += elec_dam(damage, ddesc, -1);
/* Learn about the player */
update_smart_learn(m_idx, DRS_ELEC);
/* Special damage */
- fire_dam(damage, ddesc, -1);
+ get_damage += fire_dam(damage, ddesc, -1);
/* Learn about the player */
update_smart_learn(m_idx, DRS_FIRE);
/* Special damage */
- cold_dam(damage, ddesc, -1);
+ get_damage += cold_dam(damage, ddesc, -1);
/* Learn about the player */
update_smart_learn(m_idx, DRS_COLD);
case RBE_BLIND:
{
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead) break;
/* Increase "blind" */
- if (!p_ptr->resist_blind)
+ if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
{
if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
{
#ifdef JP
- if(m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª");
+ if (m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª");
#else
/* nanka */
#endif
{
if (explode) break;
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead) break;
/* Increase "confused" */
- if (!p_ptr->resist_conf)
+ if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
{
if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
{
case RBE_TERRIFY:
{
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead) break;
/* Increase "afraid" */
- if (p_ptr->resist_fear)
+ if (CHECK_MULTISHADOW())
+ {
+ /* Do nothing */
+ }
+ else if (p_ptr->resist_fear)
{
#ifdef JP
msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
case RBE_PARALYZE:
{
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead) break;
/* Increase "paralyzed" */
- if (p_ptr->free_act)
+ if (CHECK_MULTISHADOW())
+ {
+ /* Do nothing */
+ }
+ else if (p_ptr->free_act)
{
#ifdef JP
msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
case RBE_LOSE_STR:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_STR)) obvious = TRUE;
case RBE_LOSE_INT:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_INT)) obvious = TRUE;
case RBE_LOSE_WIS:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_WIS)) obvious = TRUE;
case RBE_LOSE_DEX:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_DEX)) obvious = TRUE;
case RBE_LOSE_CON:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_CON)) obvious = TRUE;
case RBE_LOSE_CHR:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_CHR)) obvious = TRUE;
case RBE_LOSE_ALL:
{
/* Damage (physical) */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stats) */
if (do_dec_stat(A_STR)) obvious = TRUE;
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Radius 8 earthquake centered at the monster */
if (damage > 23 || explode)
{
- earthquake(m_ptr->fy, m_ptr->fx, 8);
+ earthquake_aux(m_ptr->fy, m_ptr->fx, 8, m_idx);
}
break;
case RBE_EXP_10:
{
+ s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
+
/* Obvious */
obvious = TRUE;
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
-
- if (death) break;
-
- if (p_ptr->prace == RACE_ANDROID)
- {
- }
- else if (p_ptr->hold_life && (randint0(100) < 95))
- {
-#ifdef JP
- msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
-#else
- msg_print("You keep hold of your life force!");
-#endif
-
- }
- else
- {
- s32b d = damroll(10, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
- if (p_ptr->hold_life)
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life slipping away!");
-#endif
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- lose_exp(d/10);
- }
- else
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life draining away!");
-#endif
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
- lose_exp(d);
- }
- }
+ (void)drain_exp(d, d / 10, 95);
break;
}
case RBE_EXP_20:
{
+ s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
+
/* Obvious */
obvious = TRUE;
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
- if (p_ptr->prace == RACE_ANDROID)
- {
- }
- else if (p_ptr->hold_life && (randint0(100) < 90))
- {
-#ifdef JP
- msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
-#else
- msg_print("You keep hold of your life force!");
-#endif
-
- }
- else
- {
- s32b d = damroll(20, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
- if (p_ptr->hold_life)
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life slipping away!");
-#endif
-
- lose_exp(d/10);
- }
- else
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life draining away!");
-#endif
-
- lose_exp(d);
- }
- }
+ (void)drain_exp(d, d / 10, 90);
break;
}
case RBE_EXP_40:
{
+ s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
+
/* Obvious */
obvious = TRUE;
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
-
- if (death) break;
-
- if (p_ptr->prace == RACE_ANDROID)
- {
- }
- else if (p_ptr->hold_life && (randint0(100) < 75))
- {
-#ifdef JP
- msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
-#else
- msg_print("You keep hold of your life force!");
-#endif
-
- }
- else
- {
- s32b d = damroll(40, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
- if (p_ptr->hold_life)
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life slipping away!");
-#endif
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- lose_exp(d/10);
- }
- else
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life draining away!");
-#endif
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
- lose_exp(d);
- }
- }
+ (void)drain_exp(d, d / 10, 75);
break;
}
case RBE_EXP_80:
{
+ s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
+
/* Obvious */
obvious = TRUE;
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
-
- if (death) break;
-
- if (p_ptr->prace == RACE_ANDROID)
- {
- }
- else if (p_ptr->hold_life && (randint0(100) < 50))
- {
-#ifdef JP
- msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
-#else
- msg_print("You keep hold of your life force!");
-#endif
-
- }
- else
- {
- s32b d = damroll(80, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
- if (p_ptr->hold_life)
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life slipping away!");
-#endif
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- lose_exp(d/10);
- }
- else
- {
-#ifdef JP
- msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life draining away!");
-#endif
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
- lose_exp(d);
- }
- }
+ (void)drain_exp(d, d / 10, 50);
break;
}
case RBE_DISEASE:
{
/* Take some damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Take "poison" effect */
- if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
+ if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
{
if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
{
{
/* 1% chance for perm. damage */
bool perm = one_in_(10);
- if (dec_stat(A_CON, randint1(10), perm)) obvious = TRUE;
+ if (dec_stat(A_CON, randint1(10), perm))
+ {
+#ifdef JP
+ msg_print("ɤ¬¤¢¤Ê¤¿¤ò¿ª¤ó¤Ç¤¤¤ëµ¤¤¬¤¹¤ë¡£");
+#else
+ msg_print("You feel strange sickness.");
+#endif
+
+ obvious = TRUE;
+ }
}
break;
case RBE_TIME:
{
if (explode) break;
- if (!p_ptr->resist_time)
+ if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
{
switch (randint1(10))
{
case 10:
{
#ifdef JP
- msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
+ msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
#else
msg_print("You're not as powerful as you used to be...");
#endif
}
}
}
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
break;
}
case RBE_EXP_VAMP:
{
+ s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
+ bool resist_drain;
+
/* Obvious */
obvious = TRUE;
/* Take damage */
- take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (death) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
- if (p_ptr->prace == RACE_ANDROID)
- {
- }
- else if (p_ptr->hold_life && (randint0(100) < 50))
- {
-#ifdef JP
-msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
-#else
- msg_print("You keep hold of your life force!");
-#endif
+ resist_drain = !drain_exp(d, d / 10, 50);
- resist_drain = TRUE;
+ /* Heal the attacker? */
+ if (p_ptr->mimic_form)
+ {
+ if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
+ resist_drain = TRUE;
}
else
{
- s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
- if (p_ptr->hold_life)
+ switch (p_ptr->prace)
{
-#ifdef JP
-msg_print("À¸Ì¿ÎϤ¬¾¯¤·ÂΤ«¤éÈ´¤±Íî¤Á¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life slipping away!");
-#endif
-
- lose_exp(d / 10);
- }
- else
- {
-#ifdef JP
-msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
- msg_print("You feel your life draining away!");
-#endif
-
- lose_exp(d);
+ case RACE_ZOMBIE:
+ case RACE_VAMPIRE:
+ case RACE_SPECTRE:
+ case RACE_SKELETON:
+ case RACE_DEMON:
+ case RACE_GOLEM:
+ case RACE_ANDROID:
+ resist_drain = TRUE;
+ break;
}
}
- /* Heal the attacker? */
- if ((!(p_ptr->prace == RACE_ZOMBIE ||
- p_ptr->prace == RACE_VAMPIRE ||
- p_ptr->prace == RACE_SPECTRE ||
- p_ptr->prace == RACE_SKELETON ||
- p_ptr->prace == RACE_DEMON ||
- p_ptr->prace == RACE_GOLEM ||
- p_ptr->prace == RACE_ANDROID) ||
- !(mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)) &&
- (damage > 5) && !(resist_drain))
+ if ((damage > 5) && !resist_drain)
{
bool did_heal = FALSE;
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
/* Special message */
- if ((m_ptr->ml) && (did_heal))
+ if (m_ptr->ml && did_heal)
{
#ifdef JP
msg_format("%s¤ÏÂÎÎϤò²óÉü¤·¤¿¤è¤¦¤À¡£", m_name);
}
case RBE_DR_MANA:
{
- bool did_heal = FALSE;
-
/* Obvious */
obvious = TRUE;
- do_cut = 0;
+ if (CHECK_MULTISHADOW())
+ {
+#ifdef JP
+ msg_print("¹¶·â¤Ï¸¸±Æ¤ËÌ¿Ã椷¡¢¤¢¤Ê¤¿¤Ë¤ÏÆϤ«¤Ê¤«¤Ã¤¿¡£");
+#else
+ msg_print("The attack hits Shadow, you are unharmed!");
+#endif
+ }
+ else
+ {
+ do_cut = 0;
+
+ /* Take damage */
+ p_ptr->csp -= damage;
+ if (p_ptr->csp < 0)
+ {
+ p_ptr->csp = 0;
+ p_ptr->csp_frac = 0;
+ }
+
+ p_ptr->redraw |= (PR_MANA);
+ }
+
+ /* Learn about the player */
+ update_smart_learn(m_idx, DRS_MANA);
+ break;
+ }
+ case RBE_INERTIA:
+ {
/* Take damage */
- p_ptr->csp -= damage;
- if (p_ptr->csp < 0)
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+
+ if (p_ptr->is_dead) break;
+
+ /* Decrease speed */
+ if (CHECK_MULTISHADOW())
+ {
+ /* Do nothing */
+ }
+ else
{
- p_ptr->csp = 0;
- p_ptr->csp_frac = 0;
+ if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
+ {
+ obvious = TRUE;
+ }
}
- if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
+ break;
+ }
+ case RBE_STUN:
+ {
+ /* Take damage */
+ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+
+ if (p_ptr->is_dead) break;
- p_ptr->redraw |= (PR_MANA);
+ /* Decrease speed */
+ if (p_ptr->resist_sound || CHECK_MULTISHADOW())
+ {
+ /* Do nothing */
+ }
+ else
+ {
+ if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
+ {
+ obvious = TRUE;
+ }
+ }
break;
}
if (touched)
{
- if (p_ptr->sh_fire && alive && !death)
+ if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
{
- if (!(r_ptr->flags3 & RF3_IM_FIRE))
+ if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
{
int dam = damroll(2, 6);
}
else
{
- if (m_ptr->ml)
- r_ptr->r_flags3 |= RF3_IM_FIRE;
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
}
}
- if (p_ptr->sh_elec && alive && !death)
+ if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
{
- if (!(r_ptr->flags3 & RF3_IM_ELEC))
+ if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
{
int dam = damroll(2, 6);
}
else
{
- if (m_ptr->ml)
- r_ptr->r_flags3 |= RF3_IM_ELEC;
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
}
}
- if (p_ptr->sh_cold && alive && !death)
+ if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
{
- if (!(r_ptr->flags3 & RF3_IM_COLD))
+ if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
{
int dam = damroll(2, 6);
}
else
{
- if (m_ptr->ml)
- r_ptr->r_flags3 |= RF3_IM_COLD;
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
}
}
/* by henkma */
- if (p_ptr->dustrobe && alive && !death)
+ if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
{
- if (!(r_ptr->flags4 & RF4_BR_SHAR))
+ if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
{
int dam = damroll(2, 6);
if (mon_take_hit(m_idx, dam, &fear,
" had torn to pieces."))
#endif
-
{
blinked = FALSE;
alive = FALSE;
}
}
- if( cave[py][px].feat == FEAT_MIRROR ){
- teleport_player(10);
+ else
+ {
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
+ }
+
+ if (is_mirror_grid(&cave[py][px]))
+ {
+ teleport_player(10, 0L);
}
}
+ if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
+ {
+ if (r_ptr->flags3 & RF3_EVIL)
+ {
+ if (!(r_ptr->flagsr & RFR_RES_ALL))
+ {
+ int dam = damroll(2, 6);
+
+ /* Modify the damage */
+ dam = mon_damage_mod(m_ptr, dam, FALSE);
- if (p_ptr->tim_sh_touki && alive && !death)
+#ifdef JP
+ msg_format("%^s¤ÏÀ»¤Ê¤ë¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
+ if (mon_take_hit(m_idx, dam, &fear,
+ "¤ÏÅݤ줿¡£"))
+#else
+ msg_format("%^s is injured by holy power!", m_name);
+
+ if (mon_take_hit(m_idx, dam, &fear,
+ " is destroyed."))
+#endif
+ {
+ blinked = FALSE;
+ alive = FALSE;
+ }
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flags3 |= RF3_EVIL;
+ }
+ else
+ {
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= RFR_RES_ALL;
+ }
+ }
+ }
+
+ if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
{
- int dam = damroll(2, 6);
+ if (!(r_ptr->flagsr & RFR_RES_ALL))
+ {
+ int dam = damroll(2, 6);
- /* Modify the damage */
- dam = mon_damage_mod(m_ptr, dam, FALSE);
+ /* Modify the damage */
+ dam = mon_damage_mod(m_ptr, dam, FALSE);
#ifdef JP
- msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
- if (mon_take_hit(m_idx, dam, &fear,
- "¤ÏÅݤ줿¡£"))
+ msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
+ if (mon_take_hit(m_idx, dam, &fear,
+ "¤ÏÅݤ줿¡£"))
#else
- msg_format("%^s is suddenly very hot!", m_name);
+ msg_format("%^s is injured by the Force", m_name);
- if (mon_take_hit(m_idx, dam, &fear,
- " turns into a pile of ash."))
+ if (mon_take_hit(m_idx, dam, &fear,
+ " is destroyed."))
#endif
+ {
+ blinked = FALSE;
+ alive = FALSE;
+ }
+ }
+ else
+ {
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= RFR_RES_ALL;
+ }
+ }
+
+ if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
+ {
+ int dam = 1;
+ object_type *o_ptr = &inventory[INVEN_RARM];
+
+ if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
+ {
+ if (o_ptr->k_idx)
+ {
+ int basedam = ((o_ptr->dd + p_ptr->to_dd[0]) * (o_ptr->ds + p_ptr->to_ds[0] + 1));
+ dam = basedam / 2 + o_ptr->to_d + p_ptr->to_d[0];
+ }
+
+ /* Cursed armor makes damages doubled */
+ o_ptr = &inventory[INVEN_BODY];
+ if ((o_ptr->k_idx) && object_is_cursed(o_ptr)) dam *= 2;
+
+ /* Modify the damage */
+ dam = mon_damage_mod(m_ptr, dam, FALSE);
+
+#ifdef JP
+ msg_format("±Æ¤Î¥ª¡¼¥é¤¬%^s¤ËÈ¿·â¤·¤¿¡ª", m_name);
+ if (mon_take_hit(m_idx, dam, &fear, "¤ÏÅݤ줿¡£"))
+#else
+ msg_format("Enveloped shadows attack %^s.", m_name);
+
+ if (mon_take_hit(m_idx, dam, &fear, " is destroyed."))
+#endif
+ {
+ blinked = FALSE;
+ alive = FALSE;
+ }
+ else /* monster does not dead */
+ {
+ int j;
+ int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
+ int typ[4][2] = {
+ { INVEN_HEAD, GF_OLD_CONF },
+ { INVEN_LARM, GF_OLD_SLEEP },
+ { INVEN_HANDS, GF_TURN_ALL },
+ { INVEN_FEET, GF_OLD_SLOW }
+ };
+
+ /* Some cursed armours gives an extra effect */
+ for (j = 0; j < 4; j++)
+ {
+ o_ptr = &inventory[typ[j][0]];
+ if ((o_ptr->k_idx) && object_is_cursed(o_ptr) && object_is_armour(o_ptr))
+ project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
+ }
+ }
+ }
+ else
{
- blinked = FALSE;
- alive = FALSE;
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
}
}
- touched = FALSE;
}
}
/* Message */
#ifdef JP
- if (syouryaku)
+ if (abbreviate)
msg_format("%s¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤¤Ç" : "");
else
msg_format("%s%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤¤Ç" : "", m_name);
- syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
+ abbreviate = 1;/*£²²óÌܰʹߤϾÊά */
#else
msg_format("%^s misses you.", m_name);
#endif
/* Analyze "visible" monsters only */
- if (visible && !do_silly_attack)
+ if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
{
/* Count "obvious" attacks (and ones that cause damage) */
if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
#endif
}
}
+
if (p_ptr->special_defense & NINJA_KAWARIMI)
{
- kawarimi(FALSE);
- return TRUE;
+ if (kawarimi(FALSE)) return TRUE;
}
}
+ /* Hex - revenge damage stored */
+ revenge_store(get_damage);
- if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !death && m_ptr->ml && (p_ptr->csp > 7))
+ if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
+ && get_damage > 0 && !p_ptr->is_dead)
+ {
+#ifdef JP
+ msg_format("¹¶·â¤¬%s¼«¿È¤ò½ý¤Ä¤±¤¿¡ª", m_name);
+#else
+ char m_name_self[80];
+
+ /* hisself */
+ monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
+
+ msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
+#endif
+ project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
+ if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
+ }
+
+ if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
{
char m_name[80];
monster_desc(m_name, m_ptr, 0);
#endif
py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
fear = FALSE;
+
+ /* Redraw mana */
+ p_ptr->redraw |= (PR_MANA);
}
/* Blink away */
- if (blinked)
+ if (blinked && alive && !p_ptr->is_dead)
{
+ if (teleport_barrier(m_idx))
+ {
#ifdef JP
- msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
+ msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²...¤è¤¦¤È¤·¤¿¤¬¥Ð¥ê¥¢¤ËËɤ¬¤ì¤¿¡£");
#else
- msg_print("The thief flees laughing!");
+ msg_print("The thief flees laughing...? But magic barrier obstructs it.");
#endif
-
- teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE);
+ }
+ else
+ {
+#ifdef JP
+ msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
+#else
+ msg_print("The thief flees laughing!");
+#endif
+ teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
+ }
}
/* Always notice cause of death */
- if (death && (r_ptr->r_deaths < MAX_SHORT))
+ if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
{
r_ptr->r_deaths++;
}
- if (m_ptr->ml && fear)
+ if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
{
sound(SOUND_FLEE);
#ifdef JP