OSDN Git Service

Add new monster's melee effects INERTIA and STUN.
[hengband/hengband.git] / src / melee1.c
index a529bad..e1d4fc7 100644 (file)
@@ -186,7 +186,7 @@ bool make_attack_normal(int m_idx)
        monster_desc(m_name, m_ptr, 0);
 
        /* Get the "died from" information (i.e. "a kobold") */
-       monster_desc(ddesc, m_ptr, 0x288);
+       monster_desc(ddesc, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
 
        if (p_ptr->special_defense & KATA_IAI)
        {
@@ -200,8 +200,7 @@ bool make_attack_normal(int m_idx)
 
        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 */
@@ -210,7 +209,6 @@ bool make_attack_normal(int m_idx)
        /* Scan through all four blows */
        for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
        {
-               bool visible = FALSE;
                bool obvious = FALSE;
 
                int power = 0;
@@ -245,9 +243,6 @@ bool make_attack_normal(int m_idx)
 
                if (method == RBM_SHOOT) continue;
 
-               /* Extract visibility (before blink) */
-               if (m_ptr->ml) visible = TRUE;
-
                /* Extract the attack "power" */
                power = mbe_info[effect].power;
 
@@ -255,7 +250,7 @@ bool make_attack_normal(int m_idx)
                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);
@@ -268,10 +263,7 @@ bool make_attack_normal(int m_idx)
                            ((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
@@ -717,8 +709,9 @@ bool make_attack_normal(int m_idx)
 
                                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
@@ -751,7 +744,7 @@ bool make_attack_normal(int m_idx)
                                        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))
                                                {
@@ -773,7 +766,7 @@ bool make_attack_normal(int m_idx)
                                        if (explode) break;
 
                                        /* Allow complete resist */
-                                       if (!p_ptr->resist_disen)
+                                       if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
                                        {
                                                /* Apply disenchantment */
                                                if (apply_disenchant(0))
@@ -798,7 +791,7 @@ bool make_attack_normal(int 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;
 
                                        /* Find an item */
                                        for (k = 0; k < 10; k++)
@@ -866,9 +859,9 @@ bool make_attack_normal(int m_idx)
                                        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;
@@ -950,9 +943,9 @@ bool make_attack_normal(int m_idx)
                                        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 &&
@@ -992,10 +985,10 @@ bool make_attack_normal(int m_idx)
                                                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
@@ -1039,7 +1032,7 @@ bool make_attack_normal(int m_idx)
                                                        }
 
                                                        /* Forget mark */
-                                                       j_ptr->marked = 0;
+                                                       j_ptr->marked = OM_TOUCHED;
 
                                                        /* Memorize monster */
                                                        j_ptr->held_m_idx = m_idx;
@@ -1073,7 +1066,7 @@ bool make_attack_normal(int 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++)
@@ -1091,7 +1084,7 @@ bool make_attack_normal(int m_idx)
                                                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
@@ -1127,13 +1120,13 @@ bool make_attack_normal(int 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;
 
                                        /* 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->xtra4 -= (250 + randint1(250));
+                                               o_ptr->xtra4 -= (s16b)(250 + randint1(250));
                                                if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
 
                                                /* Notice */
@@ -1258,12 +1251,12 @@ bool make_attack_normal(int m_idx)
                                        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
@@ -1286,7 +1279,7 @@ bool make_attack_normal(int m_idx)
                                        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)))
                                                {
@@ -1308,7 +1301,11 @@ bool make_attack_normal(int m_idx)
                                        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("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
@@ -1350,7 +1347,11 @@ bool make_attack_normal(int m_idx)
                                        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("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
@@ -1392,7 +1393,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1405,7 +1406,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1418,7 +1419,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1431,7 +1432,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1444,7 +1445,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1457,7 +1458,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1470,7 +1471,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1497,7 +1498,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1513,7 +1514,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1529,7 +1530,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1545,7 +1546,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1561,7 +1562,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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;
@@ -1572,7 +1573,7 @@ bool make_attack_normal(int 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;
 
                                        /* Take "poison" effect */
                                        if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
@@ -1605,7 +1606,7 @@ bool make_attack_normal(int m_idx)
                                case RBE_TIME:
                                {
                                        if (explode) break;
-                                       if (!p_ptr->resist_time)
+                                       if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
                                        {
                                                switch (randint1(10))
                                                {
@@ -1693,7 +1694,7 @@ bool make_attack_normal(int m_idx)
                                        /* 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);
 
@@ -1752,17 +1753,75 @@ msg_format("%s
                                        /* 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())
                                        {
-                                               p_ptr->csp = 0;
-                                               p_ptr->csp_frac = 0;
+                                               /* Do nothing */
                                        }
+                                       else
+                                       {
+                                               if (set_slow((p_ptr->slow + 3 + randint1(rlev / 4)), FALSE))
+                                               {
+                                                       obvious = TRUE;
+                                               }
+                                       }
+
+                                       break;
+                               }
+                               case RBE_STUN:
+                               {
+                                       /* Take damage */
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       p_ptr->redraw |= (PR_MANA);
+                                       if (p_ptr->is_dead) break;
+
+                                       /* 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;
                                }
@@ -1849,7 +1908,7 @@ msg_format("%s
                        {
                                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);
 
@@ -1874,14 +1933,14 @@ msg_format("%s
                                        }
                                        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 && !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);
 
@@ -1906,14 +1965,14 @@ msg_format("%s
                                        }
                                        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 && !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);
 
@@ -1938,15 +1997,15 @@ msg_format("%s
                                        }
                                        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 && !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);
 
@@ -1963,14 +2022,20 @@ msg_format("%s
                                                if (mon_take_hit(m_idx, dam, &fear,
                                                    " had torn to pieces."))
 #endif
-                                                 
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
                                                }
                                        }
-                                       if (is_mirror_grid(&cave[py][px])) {
-                                               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);
                                        }
                                }
 
@@ -1978,17 +2043,53 @@ msg_format("%s
                                {
                                        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);
+
+#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)
+                               {
+                                       if (!(r_ptr->flagsr & RFR_RES_ALL))
+                                       {
                                                int dam = damroll(2, 6);
 
                                                /* Modify the damage */
                                                dam = mon_damage_mod(m_ptr, dam, FALSE);
 
 #ifdef JP
-                                               msg_format("%^s¤ÏÀ»¤Ê¤ë¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
+                                               msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
                                                if (mon_take_hit(m_idx, dam, &fear,
                                                    "¤ÏÅݤ줿¡£"))
 #else
-                                               msg_format("%^s is injured by holy power!", m_name);
+                                               msg_format("%^s is injured by the Force", m_name);
 
                                                if (mon_take_hit(m_idx, dam, &fear,
                                                    " is destroyed."))
@@ -1998,32 +2099,70 @@ msg_format("%s
                                                        blinked = FALSE;
                                                        alive = FALSE;
                                                }
-                                               if (m_ptr->ml)
-                                                       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)
+                               if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
                                {
-                                       int dam = damroll(2, 6);
+                                       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];
+                                               }
 
-                                       /* Modify the damage */
-                                       dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               /* 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,
-                                           "¤ÏÅݤ줿¡£"))
+                                               msg_format("±Æ¤Î¥ª¡¼¥é¤¬%^s¤ËÈ¿·â¤·¤¿¡ª", m_name);
+                                               if (mon_take_hit(m_idx, dam, &fear, "¤ÏÅݤ줿¡£"))
 #else
-                                       msg_format("%^s is injured by the Force", m_name);
+                                               msg_format("Enveloped shadows attack %^s.", m_name);
 
-                                       if (mon_take_hit(m_idx, dam, &fear,
-                                           " is destroyed."))
+                                               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);
                                        }
                                }
                        }
@@ -2074,7 +2213,7 @@ msg_format("%s
 
 
                /* 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))
@@ -2100,30 +2239,33 @@ msg_format("%^s
 #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);
 #else
                char m_name_self[80];
-               
+
                /* hisself */
-               monster_desc(m_name_self, m_ptr, 0x23);
+               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);
-               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];
@@ -2137,18 +2279,31 @@ msg_format("%^s
 #endif
                py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
                fear = FALSE;
+
+               /* Redraw mana */
+               p_ptr->redraw |= (PR_MANA);
        }
 
        /* 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);
+               }
+               else
+               {
+#ifdef JP
+                       msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
+#else
+                       msg_print("The thief flees laughing!");
+#endif
+                       teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
+               }
        }