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;
if (method == RBM_SHOOT) continue;
- /* Extract visibility (before blink) */
- if (m_ptr->ml) visible = TRUE;
-
/* Extract the attack "power" */
power = mbe_info[effect].power;
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);
case RBE_SUPERHURT:
{
- 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
if (explode) break;
/* Take "poison" effect */
- if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
+ if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
{
if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
{
if (explode) break;
/* Allow complete resist */
- if (!p_ptr->resist_disen)
+ if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
{
/* Apply disenchantment */
if (apply_disenchant(0))
/* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Find an item */
for (k = 0; k < 10; k++)
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 (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Obvious */
obvious = TRUE;
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 (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Saving throw (unless paralyzed) based on dex and level */
if (!p_ptr->paralyzed &&
}
/* Forget mark */
- j_ptr->marked = 0;
+ j_ptr->marked = OM_TOUCHED;
/* Memorize monster */
j_ptr->held_m_idx = m_idx;
/* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Steal some food */
for (k = 0; k < 10; k++)
/* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Drain fuel */
if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
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 (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)))
{
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("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
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("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_STR)) obvious = TRUE;
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_INT)) obvious = TRUE;
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_WIS)) obvious = TRUE;
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_DEX)) obvious = TRUE;
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_CON)) obvious = TRUE;
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stat) */
if (do_dec_stat(A_CHR)) obvious = TRUE;
/* Damage (physical) */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Damage (stats) */
if (do_dec_stat(A_STR)) obvious = TRUE;
/* 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;
/* Take damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
(void)drain_exp(d, d / 10, 95);
break;
/* Take damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
(void)drain_exp(d, d / 10, 90);
break;
/* Take damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
(void)drain_exp(d, d / 10, 75);
break;
/* Take damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
(void)drain_exp(d, d / 10, 50);
break;
/* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Take "poison" effect */
if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
case RBE_TIME:
{
if (explode) break;
- if (!p_ptr->resist_time)
+ if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
{
switch (randint1(10))
{
/* Take damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
- if (p_ptr->is_dead) break;
+ if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
resist_drain = !drain_exp(d, d / 10, 50);
/* Obvious */
obvious = TRUE;
- do_cut = 0;
-
- /* Take damage */
- p_ptr->csp -= damage;
- if (p_ptr->csp < 0)
+ if (CHECK_MULTISHADOW())
+ {
+#ifdef JP
+ msg_print("¹¶·â¤Ï¸¸±Æ¤ËÌ¿Ã椷¡¢¤¢¤Ê¤¿¤Ë¤ÏÆϤ«¤Ê¤«¤Ã¤¿¡£");
+#else
+ msg_print("The attack hits Shadow, you are unharmed!");
+#endif
+ }
+ else
{
- p_ptr->csp = 0;
- p_ptr->csp_frac = 0;
+ 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);
}
- p_ptr->redraw |= (PR_MANA);
+ /* Learn about the player */
+ update_smart_learn(m_idx, DRS_MANA);
break;
}
if (is_mirror_grid(&cave[py][px]))
{
- teleport_player(10, FALSE);
+ teleport_player(10, 0L);
}
}
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
+ {
+ if (is_original_ap_and_seen(m_ptr))
+ r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
+ }
+ }
}
}
/* 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;
}
}
- if (p_ptr->tim_eyeeye && get_damage > 0 && !p_ptr->is_dead)
+ /* Hex - revenge damage stored */
+ revenge_store(get_damage);
+
+ 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);
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);
- set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
+ 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];
/* Blink away */
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, FALSE);
+ }
+ else
+ {
+#ifdef JP
+ msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
+#else
+ msg_print("The thief flees laughing!");
+#endif
+ teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
+ }
}