OSDN Git Service

mon_scatter()、ヒr_idx、ソ、ィ、ニ。「ソシ、、ソ螟ホセ螟ヒ、イ、ハ、、・筵ケ・ソ。シ、ホセ、エュク菘マ、ネ、キ、ニチェ、ヌ、キ、゙、ヲ...
[hengband/hengband.git] / src / melee1.c
index f03210f..d0a11b5 100644 (file)
@@ -3,16 +3,15 @@
 /* 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,
@@ -28,15 +27,15 @@ static int monster_critical(int dice, int sides, int dam)
        if (dam < total * 19 / 20) return (0);
 
        /* Weak blows rarely work */
-       if ((dam < 20) && (rand_int(100) >= dam)) return (0);
+       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)
        {
-               while (rand_int(100) < 2) max++;
+               while (randint0(100) < 2) max++;
        }
 
        /* Critical damage */
@@ -62,7 +61,7 @@ static int check_hit(int power, int level, int stun)
        int i, k, ac;
 
        /* Percentile dice */
-       k = rand_int(100);
+       k = randint0(100);
 
        if (stun && one_in_(2)) return FALSE;
 
@@ -77,7 +76,7 @@ static int check_hit(int power, int level, int stun)
        if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
 
        /* Power and Level compete against Armor */
-       if ((i > 0) && (randint(i) > ((ac * 3) / 4))) return (TRUE);
+       if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
 
        /* Assume miss */
        return (FALSE);
@@ -156,8 +155,6 @@ bool make_attack_normal(int m_idx)
 
        object_type *o_ptr;
 
-       object_kind *k_ptr;
-
        char o_name[MAX_NLEN];
 
        char m_name[80];
@@ -167,9 +164,11 @@ bool make_attack_normal(int m_idx)
        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);
@@ -179,9 +178,6 @@ bool make_attack_normal(int m_idx)
        /* ...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);
 
@@ -190,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, 0x88);
+       monster_desc(ddesc, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
 
        if (p_ptr->special_defense & KATA_IAI)
        {
@@ -202,7 +198,7 @@ bool make_attack_normal(int m_idx)
                if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
        }
 
-       if ((p_ptr->special_defense & NINJA_KAWARIMI) && (rand_int(55) < (p_ptr->lev*3/5+20)))
+       if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
        {
                kawarimi(TRUE);
                return TRUE;
@@ -241,53 +237,22 @@ bool make_attack_normal(int m_idx)
                }
 
                /* 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 (p_ptr->leaving) break;
 
+               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))
@@ -300,21 +265,21 @@ bool make_attack_normal(int m_idx)
                        if ((p_ptr->protevil > 0) &&
                            (r_ptr->flags3 & RF3_EVIL) &&
                            (p_ptr->lev >= rlev) &&
-                           ((rand_int(100) + p_ptr->lev) > 50))
+                           ((randint0(100) + p_ptr->lev) > 50))
                        {
                                /* Remember the Evil-ness */
-                               if (m_ptr->ml)
+                               if (m_ptr->ml && is_original_ap(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
@@ -485,7 +450,7 @@ bool make_attack_normal(int m_idx)
                                case RBM_CHARGE:
                                {
 #ifdef JP
-                                       syouryaku = -1;
+                                       abbreviate = -1;
                                        act = "¤ÏÀÁµá½ñ¤ò¤è¤³¤·¤¿¡£";
 #else
                                        act = "charges you.";
@@ -499,7 +464,7 @@ bool make_attack_normal(int m_idx)
                                case RBM_CRAWL:
                                {
 #ifdef JP
-                                       syouryaku = -1;
+                                       abbreviate = -1;
                                        act = "¤¬ÂΤξå¤òÇ礤²ó¤Ã¤¿¡£";
 #else
                                        act = "crawls on you.";
@@ -536,8 +501,8 @@ bool make_attack_normal(int m_idx)
 
                                case RBM_EXPLODE:
                                {
-                                       syouryaku = -1;
 #ifdef JP
+                                       abbreviate = -1;
                                        act = "¤ÏÇúȯ¤·¤¿¡£";
 #else
                                        act = "explodes.";
@@ -584,8 +549,8 @@ bool make_attack_normal(int m_idx)
 
                                case RBM_XXX4:
                                {
-                                       syouryaku = -1;
 #ifdef JP
+                                       abbreviate = -1;
                                        act = "¤¬ XXX4 ¤òȯ¼Í¤·¤¿¡£";
 #else
                                        act = "projects XXX4's at you.";
@@ -608,27 +573,33 @@ bool make_attack_normal(int m_idx)
 
                                case RBM_INSULT:
                                {
-                                       syouryaku = -1;
-                                       act = desc_insult[rand_int(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
+#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;
-                                       act = desc_moan[rand_int(4)];
+#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
-                                               switch(randint(15))
+                                               switch(randint1(15))
                                                {
                                                  case 1:
                                                  case 6:
@@ -700,19 +671,21 @@ bool make_attack_normal(int m_idx)
                        {
                                if (do_silly_attack)
                                {
-                                       syouryaku = -1;
-                                       act = silly_attacks[rand_int(MAX_SILLY_ATTACK)];
+#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
                        }
 
@@ -744,8 +717,7 @@ bool make_attack_normal(int m_idx)
 
                                case RBE_SUPERHURT:
                                {
-                                       int ac = p_ptr->ac+p_ptr->to_a;
-                                       if ((randint(rlev*2+300) > (ac+200)) || one_in_(13)) {
+                                       if ((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) {
                                                int tmp_damage = damage-(damage*((ac < 150) ? ac : 150)/250);
 #ifdef JP
                                                msg_print("Ä˺¨¤Î°ì·â¡ª");
@@ -756,7 +728,7 @@ bool make_attack_normal(int m_idx)
                                                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;
                                        }
                                }
@@ -769,7 +741,7 @@ bool make_attack_normal(int m_idx)
                                        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;
                                }
@@ -779,16 +751,16 @@ bool make_attack_normal(int m_idx)
                                        if (explode) 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 + randint(rlev) + 5))
+                                               if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
                                                {
                                                        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_POIS);
@@ -804,11 +776,16 @@ bool make_attack_normal(int m_idx)
                                        if (!p_ptr->resist_disen)
                                        {
                                                /* 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);
@@ -819,15 +796,15 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Find an item */
                                        for (k = 0; k < 10; k++)
                                        {
                                                /* Pick an item */
-                                               i = rand_int(INVEN_PACK);
+                                               i = randint0(INVEN_PACK);
 
                                                /* Obtain the item */
                                                o_ptr = &inventory[i];
@@ -886,20 +863,20 @@ bool make_attack_normal(int m_idx)
                                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 (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Obvious */
                                        obvious = TRUE;
 
                                        /* Saving throw (unless paralyzed) based on dex and level */
                                        if (!p_ptr->paralyzed &&
-                                           (rand_int(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
-                                                             p_ptr->lev)))
+                                           (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
+                                                             p_ptr->lev)))
                                        {
                                                /* Saving throw message */
 #ifdef JP
@@ -910,15 +887,15 @@ bool make_attack_normal(int m_idx)
 
 
                                                /* Occasional blink anyway */
-                                               if (rand_int(3)) blinked = TRUE;
+                                               if (randint0(3)) blinked = TRUE;
                                        }
 
                                        /* Eat gold */
                                        else
                                        {
-                                               gold = (p_ptr->au / 10) + randint(25);
+                                               gold = (p_ptr->au / 10) + randint1(25);
                                                if (gold < 2) gold = 2;
-                                               if (gold > 5000) gold = (p_ptr->au / 20) + randint(3000);
+                                               if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
                                                if (gold > p_ptr->au) gold = p_ptr->au;
                                                p_ptr->au -= gold;
                                                if (gold <= 0)
@@ -970,17 +947,17 @@ bool make_attack_normal(int m_idx)
                                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 (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Saving throw (unless paralyzed) based on dex and level */
                                        if (!p_ptr->paralyzed &&
-                                           (rand_int(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
-                                                             p_ptr->lev)))
+                                           (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
+                                                             p_ptr->lev)))
                                        {
                                                /* Saving throw message */
 #ifdef JP
@@ -1006,7 +983,7 @@ bool make_attack_normal(int m_idx)
                                                s16b o_idx;
 
                                                /* Pick an item */
-                                               i = rand_int(INVEN_PACK);
+                                               i = randint0(INVEN_PACK);
 
                                                /* Obtain the item */
                                                o_ptr = &inventory[i];
@@ -1018,17 +995,17 @@ bool make_attack_normal(int m_idx)
                                                if (artifact_p(o_ptr) || o_ptr->art_name) 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);
@@ -1036,41 +1013,40 @@ bool make_attack_normal(int m_idx)
 
                                                /* 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 = 0;
+
                                                        /* 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;
                                                }
@@ -1095,15 +1071,15 @@ bool make_attack_normal(int m_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) break;
 
                                        /* Steal some food */
                                        for (k = 0; k < 10; k++)
                                        {
                                                /* Pick an item from the pack */
-                                               i = rand_int(INVEN_PACK);
+                                               i = randint0(INVEN_PACK);
 
                                                /* Get the item */
                                                o_ptr = &inventory[i];
@@ -1115,17 +1091,17 @@ 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
                                                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
 
 
@@ -1149,16 +1125,16 @@ bool make_attack_normal(int m_idx)
                                        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) break;
 
                                        /* Drain fuel */
                                        if ((o_ptr->xtra4 > 0) && (!artifact_p(o_ptr)))
                                        {
                                                /* Reduce fuel */
-                                               o_ptr->pval -= (250 + randint(250));
-                                               if (o_ptr->pval < 1) o_ptr->pval = 1;
+                                               o_ptr->xtra4 -= (250 + randint1(250));
+                                               if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
 
                                                /* Notice */
                                                if (!p_ptr->blind)
@@ -1194,7 +1170,10 @@ bool make_attack_normal(int m_idx)
 
 
                                        /* 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);
@@ -1217,7 +1196,7 @@ bool make_attack_normal(int m_idx)
 
 
                                        /* 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);
@@ -1240,7 +1219,7 @@ bool make_attack_normal(int m_idx)
 
 
                                        /* 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);
@@ -1263,7 +1242,7 @@ bool make_attack_normal(int m_idx)
 
 
                                        /* 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);
@@ -1274,14 +1253,14 @@ bool make_attack_normal(int m_idx)
                                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 (set_blind(p_ptr->blind + 10 + randint(rlev)))
+                                               if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
                                                {
 #ifdef JP
                                                        if(m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª");
@@ -1302,14 +1281,14 @@ bool make_attack_normal(int m_idx)
                                {
                                        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 (set_confused(p_ptr->confused + 3 + randint(rlev)))
+                                               if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
                                                {
                                                        obvious = TRUE;
                                                }
@@ -1324,9 +1303,9 @@ bool make_attack_normal(int m_idx)
                                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)
@@ -1339,7 +1318,7 @@ bool make_attack_normal(int m_idx)
 
                                                obvious = TRUE;
                                        }
-                                       else if (rand_int(100 + r_ptr->level/2) < p_ptr->skill_sav)
+                                       else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
                                        {
 #ifdef JP
                                                msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
@@ -1351,7 +1330,7 @@ bool make_attack_normal(int m_idx)
                                        }
                                        else
                                        {
-                                               if (set_afraid(p_ptr->afraid + 3 + randint(rlev)))
+                                               if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
                                                {
                                                        obvious = TRUE;
                                                }
@@ -1366,9 +1345,9 @@ bool make_attack_normal(int m_idx)
                                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)
@@ -1381,7 +1360,7 @@ bool make_attack_normal(int m_idx)
 
                                                obvious = TRUE;
                                        }
-                                       else if (rand_int(100 + r_ptr->level/2) < p_ptr->skill_sav)
+                                       else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
                                        {
 #ifdef JP
                                                msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª");
@@ -1395,7 +1374,7 @@ bool make_attack_normal(int m_idx)
                                        {
                                                if (!p_ptr->paralyzed)
                                                {
-                                                       if (set_paralyzed(3 + randint(rlev)))
+                                                       if (set_paralyzed(3 + randint1(rlev)))
                                                        {
                                                                obvious = TRUE;
                                                        }
@@ -1411,9 +1390,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_STR)) obvious = TRUE;
@@ -1424,9 +1403,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_INT)) obvious = TRUE;
@@ -1437,9 +1416,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_WIS)) obvious = TRUE;
@@ -1450,9 +1429,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_DEX)) obvious = TRUE;
@@ -1463,9 +1442,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_CON)) obvious = TRUE;
@@ -1476,9 +1455,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_CHR)) obvious = TRUE;
@@ -1489,9 +1468,9 @@ bool make_attack_normal(int m_idx)
                                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) break;
 
                                        /* Damage (stats) */
                                        if (do_dec_stat(A_STR)) obvious = TRUE;
@@ -1513,7 +1492,7 @@ bool make_attack_normal(int m_idx)
                                        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)
@@ -1526,222 +1505,99 @@ bool make_attack_normal(int m_idx)
 
                                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;
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (p_ptr->prace == RACE_ANDROID)
-                                       {
-                                       }
-                                       else if (p_ptr->hold_life && (rand_int(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
-
-                                                       lose_exp(d/10);
-                                               }
-                                               else
-                                               {
-#ifdef JP
-                                                       msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
-                                                       msg_print("You feel your life draining away!");
-#endif
+                                       if (p_ptr->is_dead) 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);
-
-                                       if (death) break;
-
-                                       if (p_ptr->prace == RACE_ANDROID)
-                                       {
-                                       }
-                                       else if (p_ptr->hold_life && (rand_int(100) < 90))
-                                       {
-#ifdef JP
-                                               msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
-#else
-                                               msg_print("You keep hold of your life force!");
-#endif
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       }
-                                       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
+                                       if (p_ptr->is_dead) break;
 
-                                                       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 && (rand_int(100) < 75))
-                                       {
-#ifdef JP
-                                                msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
-#else
-                                               msg_print("You keep hold of your life force!");
-#endif
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       }
-                                       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
-
-                                                       lose_exp(d/10);
-                                               }
-                                               else
-                                               {
-#ifdef JP
-                                                        msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
-                                                       msg_print("You feel your life draining away!");
-#endif
+                                       if (p_ptr->is_dead) 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 && (rand_int(100) < 50))
-                                       {
-#ifdef JP
-                                                msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
-#else
-                                               msg_print("You keep hold of your life force!");
-#endif
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       }
-                                       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
+                                       if (p_ptr->is_dead) break;
 
-                                                       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, 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) 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 + randint(rlev) + 5))
+                                               if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
                                                {
                                                        obvious = TRUE;
                                                }
                                        }
 
                                        /* Damage CON (10% chance)*/
-                                       if ((randint(100) < 11) && (p_ptr->prace != RACE_ANDROID))
+                                       if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
                                        {
                                                /* 1% chance for perm. damage */
                                                bool perm = one_in_(10);
-                                               if (dec_stat(A_CON, randint(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;
@@ -1751,7 +1607,7 @@ bool make_attack_normal(int m_idx)
                                        if (explode) break;
                                        if (!p_ptr->resist_time)
                                        {
-                                               switch (randint(10))
+                                               switch (randint1(10))
                                                {
                                                        case 1: case 2: case 3: case 4: case 5:
                                                        {
@@ -1768,7 +1624,7 @@ bool make_attack_normal(int m_idx)
 
                                                        case 6: case 7: case 8: case 9:
                                                        {
-                                                               int stat = rand_int(6);
+                                                               int stat = randint0(6);
 
                                                                switch (stat)
                                                                {
@@ -1806,7 +1662,7 @@ bool make_attack_normal(int m_idx)
                                                        case 10:
                                                        {
 #ifdef JP
-                                               msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
+                                               msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
 #else
                                                                msg_print("You're not as powerful as you used to be...");
 #endif
@@ -1822,68 +1678,48 @@ bool make_attack_normal(int m_idx)
                                                        }
                                                }
                                        }
-                                       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) break;
 
-                                       if (p_ptr->prace == RACE_ANDROID)
-                                       {
-                                       }
-                                       else if (p_ptr->hold_life && (rand_int(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)
-                                               {
-#ifdef JP
-msg_print("À¸Ì¿ÎϤ¬¾¯¤·ÂΤ«¤éÈ´¤±Íî¤Á¤¿µ¤¤¬¤¹¤ë¡ª");
-#else
-                                                       msg_print("You feel your life slipping away!");
-#endif
-
-                                                       lose_exp(d / 10);
-                                               }
-                                               else
+                                               switch (p_ptr->prace)
                                                {
-#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;
 
@@ -1898,7 +1734,7 @@ msg_print("
                                                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);
@@ -1913,8 +1749,6 @@ msg_format("%s
                                }
                                case RBE_DR_MANA:
                                {
-                                       bool did_heal = FALSE;
-
                                        /* Obvious */
                                        obvious = TRUE;
 
@@ -1928,8 +1762,6 @@ msg_format("%s
                                                p_ptr->csp_frac = 0;
                                        }
 
-                                       if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
-
                                        p_ptr->redraw |= (PR_MANA);
 
                                        break;
@@ -1940,7 +1772,7 @@ msg_format("%s
                        if (do_cut && do_stun)
                        {
                                /* Cancel cut */
-                               if (rand_int(100) < 50)
+                               if (randint0(100) < 50)
                                {
                                        do_cut = 0;
                                }
@@ -1964,11 +1796,11 @@ msg_format("%s
                                switch (tmp)
                                {
                                        case 0: k = 0; break;
-                                       case 1: k = randint(5); break;
-                                       case 2: k = randint(5) + 5; break;
-                                       case 3: k = randint(20) + 20; break;
-                                       case 4: k = randint(50) + 50; break;
-                                       case 5: k = randint(100) + 100; break;
+                                       case 1: k = randint1(5); break;
+                                       case 2: k = randint1(5) + 5; break;
+                                       case 3: k = randint1(20) + 20; break;
+                                       case 4: k = randint1(50) + 50; break;
+                                       case 5: k = randint1(100) + 100; break;
                                        case 6: k = 300; break;
                                        default: k = 500; break;
                                }
@@ -1989,11 +1821,11 @@ msg_format("%s
                                switch (tmp)
                                {
                                        case 0: k = 0; break;
-                                       case 1: k = randint(5); break;
-                                       case 2: k = randint(5) + 10; break;
-                                       case 3: k = randint(10) + 20; break;
-                                       case 4: k = randint(15) + 30; break;
-                                       case 5: k = randint(20) + 40; break;
+                                       case 1: k = randint1(5); break;
+                                       case 2: k = randint1(5) + 10; break;
+                                       case 3: k = randint1(10) + 20; break;
+                                       case 4: k = randint1(15) + 30; break;
+                                       case 5: k = randint1(20) + 40; break;
                                        case 6: k = 80; break;
                                        default: k = 150; break;
                                }
@@ -2015,9 +1847,9 @@ msg_format("%s
 
                        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);
 
@@ -2042,14 +1874,14 @@ msg_format("%s
                                        }
                                        else
                                        {
-                                               if (m_ptr->ml)
-                                                       r_ptr->r_flags3 |= RF3_IM_FIRE;
+                                               if (m_ptr->ml && is_original_ap(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);
 
@@ -2074,14 +1906,14 @@ msg_format("%s
                                        }
                                        else
                                        {
-                                               if (m_ptr->ml)
-                                                       r_ptr->r_flags3 |= RF3_IM_ELEC;
+                                               if (m_ptr->ml && is_original_ap(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);
 
@@ -2106,15 +1938,15 @@ msg_format("%s
                                        }
                                        else
                                        {
-                                               if (m_ptr->ml)
-                                                       r_ptr->r_flags3 |= RF3_IM_COLD;
+                                               if (m_ptr->ml && is_original_ap(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);
 
@@ -2131,42 +1963,89 @@ msg_format("%s
                                                if (mon_take_hit(m_idx, dam, &fear,
                                                    " had torn to pieces."))
 #endif
-                                                 
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
                                                }
                                        }
-                                       if( cave[py][px].feat == FEAT_MIRROR ){
+                                       else
+                                       {
+                                               if (m_ptr->ml && is_original_ap(m_ptr))
+                                                       r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
+                                       }
+
+                                       if (is_mirror_grid(&cave[py][px])) {
                                                teleport_player(10);
                                        }
                                }
 
+                               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);
+
+#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 (p_ptr->tim_sh_touki && alive && !death)
+                                                       if (mon_take_hit(m_idx, dam, &fear,
+                                                           " is destroyed."))
+#endif
+                                                       {
+                                                               blinked = FALSE;
+                                                               alive = FALSE;
+                                                       }
+                                                       if (m_ptr->ml && is_original_ap(m_ptr))
+                                                               r_ptr->r_flags3 |= RF3_EVIL;
+                                               }
+                                               else
+                                               {
+                                                       if (m_ptr->ml && is_original_ap(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
                                        {
-                                               blinked = FALSE;
-                                               alive = FALSE;
+                                               if (m_ptr->ml && is_original_ap(m_ptr))
+                                                       r_ptr->r_flagsr |= RFR_RES_ALL;
                                        }
                                }
-                               touched = FALSE;
                        }
                }
 
@@ -2197,11 +2076,11 @@ msg_format("%s
 
                                        /* 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
@@ -2248,8 +2127,24 @@ msg_format("%^s
                }
        }
 
+       if (p_ptr->tim_eyeeye && 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);
+               set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
+       }
+
 
-       if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !death && m_ptr->ml && (p_ptr->csp > 7))
+       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);
@@ -2262,10 +2157,13 @@ 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)
+       if (blinked && alive && !p_ptr->is_dead)
        {
 #ifdef JP
                msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
@@ -2278,12 +2176,12 @@ msg_format("%^s
 
 
        /* 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