OSDN Git Service

Inserted indefinite article in English message about thief's blinking being blocked...
[hengband/hengband.git] / src / combat / melee1.c
index 53e72ea..55e92f7 100644 (file)
 #include "world.h"
 #include "spells-floor.h"
 
+#define BLOW_EFFECT_TYPE_NONE  0
+#define BLOW_EFFECT_TYPE_FEAR  1
+#define BLOW_EFFECT_TYPE_SLEEP 2
+#define BLOW_EFFECT_TYPE_HEAL  3
 
  /*!
   * @brief モンスターの打撃効力テーブル /
@@ -225,7 +229,6 @@ const concptr silly_attacks[MAX_SILLY_ATTACK] =
 #endif
 
 
-
 /*!
  * @brief マーシャルアーツ打撃テーブル
  */
@@ -500,36 +503,39 @@ const byte blows_table[12][12] =
  * @return 命中と判定された場合TRUEを返す
  * @note Always miss 5%, always hit 5%, otherwise random.
  */
-bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
+bool test_hit_norm(player_type *attacker_ptr, HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
 {
        if (!visible) chance = (chance + 1) / 2;
-       return hit_chance(chance, ac) >= randint1(100);
+       return hit_chance(attacker_ptr, chance, ac) >= randint1(100);
 }
 
 /*!
  * @brief モンスターへの命中率の計算
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @param to_h 命中値
  * @param ac 敵AC
  * @return 命中確率
  */
-PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
+PERCENTAGE hit_chance(player_type *attacker_ptr, HIT_RELIABILITY reli, ARMOUR_CLASS ac)
 {
        PERCENTAGE chance = 5, chance_left = 90;
        if(reli <= 0) return 5;
-       if(p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
+       if(attacker_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
        chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
        if (chance < 5) chance = 5;
        return chance;
 }
 
+
 /*!
  * @brief プレイヤー攻撃の種族スレイング倍率計算
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @param mult 算出前の基本倍率(/10倍)
  * @param flgs スレイフラグ配列
  * @param m_ptr 目標モンスターの構造体参照ポインタ
  * @return スレイング加味後の倍率(/10倍)
  */
-static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
+static MULTIPLY mult_slaying(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
 {
        static const struct slay_table_t {
                int slay_flag;
@@ -561,36 +567,37 @@ static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster
                {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
 #undef OFFSET
        };
-       int i;
-       monster_race* r_ptr = &r_info[m_ptr->r_idx];
 
-       for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
+       monster_race* r_ptr = &r_info[m_ptr->r_idx];
+       for (int i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
        {
                const struct slay_table_t* p = &slay_table[i];
 
-               if ((have_flag(flgs, p->slay_flag)) &&
-                       (atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
-               {
-                       if (is_original_ap_and_seen(m_ptr))
-                       {
-                               atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
-                       }
+               if (!have_flag(flgs, p->slay_flag) ||
+                       !(atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
+                       continue;
 
-                       mult = MAX(mult, p->slay_mult);
+               if (is_original_ap_and_seen(player_ptr, m_ptr))
+               {
+                       atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
                }
+
+               mult = MAX(mult, p->slay_mult);
        }
 
        return mult;
 }
 
+
 /*!
  * @brief プレイヤー攻撃の属性スレイング倍率計算
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @param mult 算出前の基本倍率(/10倍)
  * @param flgs スレイフラグ配列
  * @param m_ptr 目標モンスターの構造体参照ポインタ
  * @return スレイング加味後の倍率(/10倍)
  */
-static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
+static MULTIPLY mult_brand(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
 {
        static const struct brand_table_t {
                int brand_flag;
@@ -603,44 +610,44 @@ static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_t
                {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
                {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U           },
        };
-       int i;
-       monster_race* r_ptr = &r_info[m_ptr->r_idx];
 
-       for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
+       monster_race* r_ptr = &r_info[m_ptr->r_idx];
+       for (int i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
        {
                const struct brand_table_t* p = &brand_table[i];
 
-               if (have_flag(flgs, p->brand_flag))
+               if (!have_flag(flgs, p->brand_flag)) continue;
+
+               /* Notice immunity */
+               if (r_ptr->flagsr & p->resist_mask)
                {
-                       /* Notice immunity */
-                       if (r_ptr->flagsr & p->resist_mask)
+                       if (is_original_ap_and_seen(player_ptr, m_ptr))
                        {
-                               if (is_original_ap_and_seen(m_ptr))
-                               {
-                                       r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
-                               }
+                               r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
                        }
 
-                       /* Otherwise, take the damage */
-                       else if (r_ptr->flags3 & p->hurt_flag)
-                       {
-                               if (is_original_ap_and_seen(m_ptr))
-                               {
-                                       r_ptr->r_flags3 |= p->hurt_flag;
-                               }
+                       continue;
+               }
 
-                               mult = MAX(mult, 50);
-                       }
-                       else
+               /* Otherwise, take the damage */
+               if (r_ptr->flags3 & p->hurt_flag)
+               {
+                       if (is_original_ap_and_seen(player_ptr, m_ptr))
                        {
-                               mult = MAX(mult, 25);
+                               r_ptr->r_flags3 |= p->hurt_flag;
                        }
+
+                       mult = MAX(mult, 50);
+                       continue;
                }
+
+               mult = MAX(mult, 25);
        }
 
        return mult;
 }
 
+
 /*!
  * @brief 剣術のスレイ倍率計算を行う /
  * Calcurate magnification of hissatsu technics
@@ -660,7 +667,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                /* Notice immunity */
                if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
                {
-                       if (is_original_ap_and_seen(m_ptr))
+                       if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                        {
                                r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
                        }
@@ -672,7 +679,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                        if (r_ptr->flags3 & RF3_HURT_FIRE)
                        {
                                if (mult < 70) mult = 70;
-                               if (is_original_ap_and_seen(m_ptr))
+                               if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                                {
                                        r_ptr->r_flags3 |= RF3_HURT_FIRE;
                                }
@@ -684,7 +691,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                        if (r_ptr->flags3 & RF3_HURT_FIRE)
                        {
                                if (mult < 50) mult = 50;
-                               if (is_original_ap_and_seen(m_ptr))
+                               if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                                {
                                        r_ptr->r_flags3 |= RF3_HURT_FIRE;
                                }
@@ -699,7 +706,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                /* Notice immunity */
                if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
                {
-                       if (is_original_ap_and_seen(m_ptr))
+                       if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                        {
                                r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
                        }
@@ -731,7 +738,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
        {
                if (r_ptr->flags3 & RF3_HURT_ROCK)
                {
-                       if (is_original_ap_and_seen(m_ptr))
+                       if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                        {
                                r_ptr->r_flags3 |= RF3_HURT_ROCK;
                        }
@@ -746,7 +753,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                /* Notice immunity */
                if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
                {
-                       if (is_original_ap_and_seen(m_ptr))
+                       if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                        {
                                r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
                        }
@@ -757,7 +764,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                        if (r_ptr->flags3 & RF3_HURT_COLD)
                        {
                                if (mult < 70) mult = 70;
-                               if (is_original_ap_and_seen(m_ptr))
+                               if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                                {
                                        r_ptr->r_flags3 |= RF3_HURT_COLD;
                                }
@@ -769,7 +776,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                        if (r_ptr->flags3 & RF3_HURT_COLD)
                        {
                                if (mult < 50) mult = 50;
-                               if (is_original_ap_and_seen(m_ptr))
+                               if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                                {
                                        r_ptr->r_flags3 |= RF3_HURT_COLD;
                                }
@@ -784,7 +791,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
                /* Notice immunity */
                if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
                {
-                       if (is_original_ap_and_seen(m_ptr))
+                       if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                        {
                                r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
                        }
@@ -813,7 +820,7 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
        {
                if (r_ptr->flags3 & RF3_UNDEAD)
                {
-                       if (is_original_ap_and_seen(m_ptr))
+                       if (is_original_ap_and_seen(attacker_ptr, m_ptr))
                        {
                                r_ptr->r_flags3 |= RF3_UNDEAD;
                        }
@@ -825,10 +832,10 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
        }
 
        if (mult > 150) mult = 150;
-
        return mult;
 }
 
+
 /*!
  * @brief ダメージにスレイ要素を加える総合処理ルーチン /
  * Extract the "total damage" from a given object hitting a given monster.
@@ -847,8 +854,6 @@ static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAG
  */
 HIT_POINT tot_dam_aux(player_type *attacker_ptr, object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
 {
-       MULTIPLY mult = 10;
-
        BIT_FLAGS flgs[TR_FLAG_SIZE];
        object_flags(o_ptr, flgs);
        torch_flags(o_ptr, flgs); /* torches has secret flags */
@@ -862,8 +867,9 @@ HIT_POINT tot_dam_aux(player_type *attacker_ptr, object_type *o_ptr, HIT_POINT t
                if (attacker_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
        }
 
-       if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
+       if (hex_spelling(attacker_ptr, HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
 
+       MULTIPLY mult = 10;
        switch (o_ptr->tval)
        {
        case TV_SHOT:
@@ -875,9 +881,9 @@ HIT_POINT tot_dam_aux(player_type *attacker_ptr, object_type *o_ptr, HIT_POINT t
        case TV_DIGGING:
        case TV_LITE:
        {
-               mult = mult_slaying(mult, flgs, m_ptr);
+               mult = mult_slaying(attacker_ptr, mult, flgs, m_ptr);
 
-               mult = mult_brand(mult, flgs, m_ptr);
+               mult = mult_brand(attacker_ptr, mult, flgs, m_ptr);
 
                if (attacker_ptr->pclass == CLASS_SAMURAI)
                {
@@ -896,8 +902,8 @@ HIT_POINT tot_dam_aux(player_type *attacker_ptr, object_type *o_ptr, HIT_POINT t
                break;
        }
        }
-       if (mult > 150) mult = 150;
 
+       if (mult > 150) mult = 150;
        return (tdam * mult / 10);
 }
 
@@ -913,46 +919,50 @@ HIT_POINT tot_dam_aux(player_type *attacker_ptr, object_type *o_ptr, HIT_POINT t
 */
 HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
 {
-       int i, k;
-
        /* Extract "blow" power */
-       i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
+       int i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
 
        /* Chance */
-       if ((randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
+       bool is_special_option = randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i;
+       is_special_option |= mode == HISSATSU_MAJIN;
+       is_special_option |= mode == HISSATSU_3DAN;
+       if (!is_special_option) return dam;
+       
+       int k = weight + randint1(650);
+       if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
+
+       if (k < 400)
        {
-               k = weight + randint1(650);
-               if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
+               msg_print(_("手ごたえがあった!", "It was a good hit!"));
 
-               if (k < 400)
-               {
-                       msg_print(_("手ごたえがあった!", "It was a good hit!"));
+               dam = 2 * dam + 5;
+               return dam;
+       }
 
-                       dam = 2 * dam + 5;
-               }
-               else if (k < 700)
-               {
-                       msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
-                       dam = 2 * dam + 10;
-               }
-               else if (k < 900)
-               {
-                       msg_print(_("会心の一撃だ!", "It was a superb hit!"));
-                       dam = 3 * dam + 15;
-               }
-               else if (k < 1300)
-               {
-                       msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
-                       dam = 3 * dam + 20;
-               }
-               else
-               {
-                       msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
-                       dam = ((7 * dam) / 2) + 25;
-               }
+       if (k < 700)
+       {
+               msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
+               dam = 2 * dam + 10;
+               return dam;
+       }
+       
+       if (k < 900)
+       {
+               msg_print(_("会心の一撃だ!", "It was a superb hit!"));
+               dam = 3 * dam + 15;
+               return dam;
+       }
+       
+       if (k < 1300)
+       {
+               msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
+               dam = 3 * dam + 20;
+               return dam;
        }
 
-       return (dam);
+       msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
+       dam = ((7 * dam) / 2) + 25;
+       return dam;
 }
 
 /*!
@@ -967,16 +977,15 @@ HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_
  */
 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
 {
-       int max = 0;
-       int total = dice * sides;
-
        /* Must do at least 95% of perfect */
-       if (dam < total * 19 / 20) return (0);
+       int total = dice * sides;
+       if (dam < total * 19 / 20) return 0;
 
        /* Weak blows rarely work */
-       if ((dam < 20) && (randint0(100) >= dam)) return (0);
+       if ((dam < 20) && (randint0(100) >= dam)) return 0;
 
        /* Perfect damage */
+       int max = 0;
        if ((dam >= total) && (dam >= 40)) max++;
 
        /* Super-charge */
@@ -994,6 +1003,7 @@ static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
        return (1 + max);
 }
 
+
 /*!
  * @brief モンスター打撃の命中を判定する /
  * Determine if a monster attack against the player succeeds.
@@ -1005,20 +1015,18 @@ static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
  * Always miss 5% of the time, Always hit 5% of the time.
  * Otherwise, match monster power against player armor.
  */
-static int check_hit(int power, DEPTH level, int stun)
+static int check_hit(player_type *target_ptr, int power, DEPTH level, int stun)
 {
-       int i, k, ac;
-
-       k = randint0(100);
+       int k = randint0(100);
        if (stun && one_in_(2)) return FALSE;
        if (k < 10) return (k < 5);
-       i = (power + (level * 3));
+       int i = (power + (level * 3));
 
-       ac = p_ptr->ac + p_ptr->to_a;
-       if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
+       int ac = target_ptr->ac + target_ptr->to_a;
+       if (target_ptr->special_attack & ATTACK_SUIKEN) ac += (target_ptr->lev * 2);
 
-       if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
-       return (FALSE);
+       if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
+       return FALSE;
 }
 
 /*!
@@ -1031,15 +1039,13 @@ static int check_hit(int power, DEPTH level, int stun)
  */
 static int check_hit2(int power, DEPTH level, ARMOUR_CLASS ac, int stun)
 {
-       int i, k;
-
-       k = randint0(100);
+       int k = randint0(100);
        if (stun && one_in_(2)) return FALSE;
        if (k < 10) return (k < 5);
-       i = (power + (level * 3));
+       int i = (power + (level * 3));
 
-       if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
-       return (FALSE);
+       if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
+       return FALSE;
 }
 
 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
@@ -1088,6 +1094,7 @@ static concptr desc_moan[] =
 
 };
 
+
 /*!
 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
@@ -1099,29 +1106,28 @@ static concptr desc_moan[] =
 * @param message オーラダメージを受けた際のメッセージ
 * @return なし
 */
-static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
-       HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
+static void touch_zap_player_aux(monster_type *m_ptr, player_type *touched_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
+       HIT_POINT(*dam_func)(player_type *creature_type, HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
 {
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
+       if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune) return;
+       
+       GAME_TEXT mon_name[MAX_NLEN];
+       int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
 
-       if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
-       {
-               GAME_TEXT mon_name[MAX_NLEN];
-               int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
+       monster_desc(touched_ptr, mon_name, m_ptr, MD_WRONGDOER_NAME);
+       msg_print(message);
+       dam_func(touched_ptr, aura_damage, mon_name, -1, TRUE);
 
-               monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
-               msg_print(message);
-               dam_func(aura_damage, mon_name, -1, TRUE);
-
-               if (is_original_ap_and_seen(m_ptr))
-               {
-                       atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
-               }
-
-               handle_stuff();
+       if (is_original_ap_and_seen(touched_ptr, m_ptr))
+       {
+               atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
        }
+
+       handle_stuff(touched_ptr);
 }
 
+
 /*!
 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
@@ -1130,35 +1136,32 @@ static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_off
 */
 static void touch_zap_player(monster_type *m_ptr, player_type *touched_ptr)
 {
-       touch_zap_player_aux(m_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
+       touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
                fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
-       touch_zap_player_aux(m_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
+       touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
                cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
-       touch_zap_player_aux(m_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
+       touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
                elec_dam, _("電撃をくらった!", "You get zapped!"));
 }
 
+
 /*!
 * @brief プレイヤーの変異要素による打撃処理
+* @param attacker_ptr プレーヤーへの参照ポインタ
 * @param m_idx 攻撃目標となったモンスターの参照ID
 * @param attack 変異要素による攻撃要素の種類
 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
 * @return なし
 */
-static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
+static void natural_attack(player_type *attacker_ptr, MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
 {
-       HIT_POINT k;
-       int bonus, chance;
        WEIGHT n_weight = 0;
-       monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
+       monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[m_idx];
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
-       GAME_TEXT m_name[MAX_NLEN];
 
        int dice_num, dice_side;
-
        concptr atk_desc;
-
        switch (attack)
        {
        case MUT2_SCOR_TAIL:
@@ -1202,69 +1205,69 @@ static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdea
 
        }
 
-       monster_desc(m_name, m_ptr, 0);
+       GAME_TEXT m_name[MAX_NLEN];
+       monster_desc(attacker_ptr, m_name, m_ptr, 0);
 
        /* Calculate the "attack quality" */
-       bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
-       chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
+       int bonus = attacker_ptr->to_h_m + (attacker_ptr->lev * 6 / 5);
+       int chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
 
-       /* Test for hit */
-       if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
+       bool is_hit = !(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2);
+       is_hit &= test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
+       if (!is_hit)
        {
-               sound(SOUND_HIT);
-               msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
+               sound(SOUND_MISS);
+               msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
+               return;
+       }
 
-               k = damroll(dice_num, dice_side);
-               k = critical_norm(p_ptr, n_weight, bonus, k, (s16b)bonus, 0);
+       sound(SOUND_HIT);
+       msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
 
-               /* Apply the player damage bonuses */
-               k += p_ptr->to_d_m;
+       HIT_POINT k = damroll(dice_num, dice_side);
+       k = critical_norm(attacker_ptr, n_weight, bonus, k, (s16b)bonus, 0);
 
-               /* No negative damage */
-               if (k < 0) k = 0;
+       /* Apply the player damage bonuses */
+       k += attacker_ptr->to_d_m;
 
-               /* Modify the damage */
-               k = mon_damage_mod(m_ptr, k, FALSE);
+       /* No negative damage */
+       if (k < 0) k = 0;
 
-               /* Complex message */
-               msg_format_wizard(CHEAT_MONSTER,
-                       _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
-                       k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
+       /* Modify the damage */
+       k = mon_damage_mod(attacker_ptr, m_ptr, k, FALSE);
 
-               /* Anger the monster */
-               if (k > 0) anger_monster(m_ptr);
+       /* Complex message */
+       msg_format_wizard(CHEAT_MONSTER,
+               _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
+               k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
 
-               /* Damage, check for fear and mdeath */
-               switch (attack)
-               {
-               case MUT2_SCOR_TAIL:
-                       project(p_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
-                       *mdeath = (m_ptr->r_idx == 0);
-                       break;
-               case MUT2_HORNS:
-                       *mdeath = mon_take_hit(m_idx, k, fear, NULL);
-                       break;
-               case MUT2_BEAK:
-                       *mdeath = mon_take_hit(m_idx, k, fear, NULL);
-                       break;
-               case MUT2_TRUNK:
-                       *mdeath = mon_take_hit(m_idx, k, fear, NULL);
-                       break;
-               case MUT2_TENTACLES:
-                       *mdeath = mon_take_hit(m_idx, k, fear, NULL);
-                       break;
-               default:
-                       *mdeath = mon_take_hit(m_idx, k, fear, NULL);
-               }
+       /* Anger the monster */
+       if (k > 0) anger_monster(attacker_ptr, m_ptr);
 
-               touch_zap_player(m_ptr, p_ptr);
-       }
-       /* Player misses */
-       else
+       /* Damage, check for fear and mdeath */
+       switch (attack)
        {
-               sound(SOUND_MISS);
-               msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
+       case MUT2_SCOR_TAIL:
+               project(attacker_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
+               *mdeath = (m_ptr->r_idx == 0);
+               break;
+       case MUT2_HORNS:
+               *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
+               break;
+       case MUT2_BEAK:
+               *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
+               break;
+       case MUT2_TRUNK:
+               *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
+               break;
+       case MUT2_TENTACLES:
+               *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
+               break;
+       default:
+               *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
        }
+
+       touch_zap_player(m_ptr, attacker_ptr);
 }
 
 /*!
@@ -1339,6 +1342,7 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
                                stab_fleeing = TRUE;
                        }
                }
+
                break;
 
        case CLASS_MONK:
@@ -1387,9 +1391,9 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
        }
 
        /* Disturb the monster */
-       (void)set_monster_csleep(g_ptr->m_idx, 0);
+       (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
 
-       monster_desc(m_name, m_ptr, 0);
+       monster_desc(attacker_ptr, m_name, m_ptr, 0);
 
        /* Calculate the "attack quality" */
        bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
@@ -1412,12 +1416,12 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
        else num_blow = attacker_ptr->num_blow[hand];
 
        /* Hack -- DOKUBARI always hit once */
-       if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
+       if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) num_blow = 1;
 
        /* Attack once for each legal blow */
        while ((num++ < num_blow) && !attacker_ptr->is_dead)
        {
-               if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
+               if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
                {
                        int n = 1;
 
@@ -1433,7 +1437,7 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
                        success_hit = one_in_(n);
                }
                else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
-               else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
+               else success_hit = test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
 
                if (mode == HISSATSU_MAJIN)
                {
@@ -1441,717 +1445,716 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
                                success_hit = FALSE;
                }
 
-               /* Test for hit */
-               if (success_hit)
+               if (!success_hit)
                {
-                       int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
-
-                       sound(SOUND_HIT);
-
-                       if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
-                       else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
-                       else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
-                       else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
-
-                       /* Hack -- bare hands do one damage */
-                       k = 1;
-
-                       object_flags(o_ptr, flgs);
+                       backstab = FALSE; /* Clumsy! */
+                       fuiuchi = FALSE; /* Clumsy! */
 
-                       /* Select a chaotic effect (50% chance) */
-                       if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
+                       if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
                        {
-                               if (one_in_(10))
-                                       chg_virtue(attacker_ptr, V_CHANCE, 1);
-
-                               if (randint1(5) < 3)
-                               {
-                                       /* Vampiric (20%) */
-                                       chaos_effect = 1;
-                               }
-                               else if (one_in_(250))
-                               {
-                                       /* Quake (0.12%) */
-                                       chaos_effect = 2;
-                               }
-                               else if (!one_in_(10))
-                               {
-                                       /* Confusion (26.892%) */
-                                       chaos_effect = 3;
-                               }
-                               else if (one_in_(2))
-                               {
-                                       /* Teleport away (1.494%) */
-                                       chaos_effect = 4;
-                               }
-                               else
-                               {
-                                       /* Polymorph (1.494%) */
-                                       chaos_effect = 5;
-                               }
-                       }
+                               BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
 
-                       /* Vampiric drain */
-                       if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
-                       {
-                               /* Only drain "living" monsters */
-                               if (monster_living(m_ptr->r_idx))
-                                       can_drain = TRUE;
-                               else
-                                       can_drain = FALSE;
-                       }
+                               sound(SOUND_HIT);
 
-                       if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
-                               vorpal_cut = TRUE;
-                       else vorpal_cut = FALSE;
+                               msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
+                               msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
+                               object_flags(o_ptr, flgs_aux);
 
-                       if (monk_attack)
-                       {
-                               int special_effect = 0, stun_effect = 0, times = 0, max_times;
-                               int min_level = 1;
-                               const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
-                               int resist_stun = 0;
-                               WEIGHT weight = 8;
-
-                               if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
-                               if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
-                               if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
-                               if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
-                               if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
-                                       resist_stun += 66;
-
-                               if (attacker_ptr->special_defense & KAMAE_BYAKKO)
-                                       max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
-                               else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
-                                       max_times = 1;
-                               else if (attacker_ptr->special_defense & KAMAE_GENBU)
-                                       max_times = 1;
-                               else
-                                       max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
-                               /* Attempt 'times' */
-                               for (times = 0; times < max_times; times++)
+                               k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
                                {
-                                       do
-                                       {
-                                               ma_ptr = &ma_blows[randint0(MAX_MA)];
-                                               if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
-                                               else min_level = ma_ptr->min_level;
-                                       } while ((min_level > attacker_ptr->lev) ||
-                                               (randint1(attacker_ptr->lev) < ma_ptr->chance));
-
-                                       /* keep the highest level attack available we found */
-                                       if ((ma_ptr->min_level > old_ptr->min_level) &&
-                                               !attacker_ptr->stun && !attacker_ptr->confused)
+                                       int mult;
+                                       switch (attacker_ptr->mimic_form)
                                        {
-                                               old_ptr = ma_ptr;
-
-                                               if (current_world_ptr->wizard && cheat_xtra)
+                                       case MIMIC_NONE:
+                                               switch (attacker_ptr->prace)
                                                {
-                                                       msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
+                                               case RACE_YEEK:
+                                               case RACE_KLACKON:
+                                               case RACE_HUMAN:
+                                               case RACE_AMBERITE:
+                                               case RACE_DUNADAN:
+                                               case RACE_BARBARIAN:
+                                               case RACE_BEASTMAN:
+                                                       mult = 25; break;
+                                               case RACE_HALF_ORC:
+                                               case RACE_HALF_TROLL:
+                                               case RACE_HALF_OGRE:
+                                               case RACE_HALF_GIANT:
+                                               case RACE_HALF_TITAN:
+                                               case RACE_CYCLOPS:
+                                               case RACE_IMP:
+                                               case RACE_SKELETON:
+                                               case RACE_ZOMBIE:
+                                               case RACE_VAMPIRE:
+                                               case RACE_SPECTRE:
+                                               case RACE_DEMON:
+                                               case RACE_DRACONIAN:
+                                                       mult = 30; break;
+                                               default:
+                                                       mult = 10; break;
                                                }
+                                               break;
+                                       case MIMIC_DEMON:
+                                       case MIMIC_DEMON_LORD:
+                                       case MIMIC_VAMPIRE:
+                                               mult = 30; break;
+                                       default:
+                                               mult = 10; break;
                                        }
-                                       else
-                                       {
-                                               ma_ptr = old_ptr;
-                                       }
-                               }
 
-                               if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
-                               else min_level = ma_ptr->min_level;
-                               k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
-                               if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
+                                       if (attacker_ptr->align < 0 && mult < 20)
+                                               mult = 20;
+                                       if (!(attacker_ptr->resist_acid || is_oppose_acid(attacker_ptr) || attacker_ptr->immune_acid) && (mult < 25))
+                                               mult = 25;
+                                       if (!(attacker_ptr->resist_elec || is_oppose_elec(attacker_ptr) || attacker_ptr->immune_elec) && (mult < 25))
+                                               mult = 25;
+                                       if (!(attacker_ptr->resist_fire || is_oppose_fire(attacker_ptr) || attacker_ptr->immune_fire) && (mult < 25))
+                                               mult = 25;
+                                       if (!(attacker_ptr->resist_cold || is_oppose_cold(attacker_ptr) || attacker_ptr->immune_cold) && (mult < 25))
+                                               mult = 25;
+                                       if (!(attacker_ptr->resist_pois || is_oppose_pois(attacker_ptr)) && (mult < 25))
+                                               mult = 25;
 
-                               if (ma_ptr->effect == MA_KNEE)
-                               {
-                                       if (r_ptr->flags1 & RF1_MALE)
+                                       if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (attacker_ptr->msp / 30)))
                                        {
-                                               msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
-                                               sound(SOUND_PAIN);
-                                               special_effect = MA_KNEE;
+                                               attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
+                                               attacker_ptr->redraw |= (PR_MANA);
+                                               mult = mult * 3 / 2 + 20;
                                        }
-                                       else
-                                               msg_format(ma_ptr->desc, m_name);
+                                       k *= (HIT_POINT)mult;
+                                       k /= 10;
                                }
 
-                               else if (ma_ptr->effect == MA_SLOW)
-                               {
-                                       if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
-                                               my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
-                                       {
-                                               msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
-                                               special_effect = MA_SLOW;
-                                       }
-                                       else msg_format(ma_ptr->desc, m_name);
-                               }
-                               else
+                               k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
+                               if (one_in_(6))
                                {
-                                       if (ma_ptr->effect)
+                                       int mult = 2;
+                                       msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
+                                       /* Try to increase the damage */
+                                       while (one_in_(4))
                                        {
-                                               stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
+                                               mult++;
                                        }
 
-                                       msg_format(ma_ptr->desc, m_name);
+                                       k *= (HIT_POINT)mult;
                                }
+                               k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
+                               if (k < 0) k = 0;
 
-                               if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
-                               if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
-                               {
-                                       weight += (P_PTR_KI / 30);
-                                       if (weight > 20) weight = 20;
-                               }
+                               take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
+                               handle_stuff(attacker_ptr);
+                       }
+                       else
+                       {
+                               sound(SOUND_MISS);
+                               msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
+                       }
+
+                       continue;
+               }
+
+               int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
+
+               sound(SOUND_HIT);
 
-                               k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
+               if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
+               else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
+               else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
+               else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
+
+               /* Hack -- bare hands do one damage */
+               k = 1;
+
+               object_flags(o_ptr, flgs);
+
+               /* Select a chaotic effect (50% chance) */
+               if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
+               {
+                       if (one_in_(10))
+                               chg_virtue(attacker_ptr, V_CHANCE, 1);
+
+                       if (randint1(5) < 3)
+                       {
+                               /* Vampiric (20%) */
+                               chaos_effect = 1;
+                       }
+                       else if (one_in_(250))
+                       {
+                               /* Quake (0.12%) */
+                               chaos_effect = 2;
+                       }
+                       else if (!one_in_(10))
+                       {
+                               /* Confusion (26.892%) */
+                               chaos_effect = 3;
+                       }
+                       else if (one_in_(2))
+                       {
+                               /* Teleport away (1.494%) */
+                               chaos_effect = 4;
+                       }
+                       else
+                       {
+                               /* Polymorph (1.494%) */
+                               chaos_effect = 5;
+                       }
+               }
 
-                               if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
+               /* Vampiric drain */
+               if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(attacker_ptr, HEX_VAMP_BLADE))
+               {
+                       /* Only drain "living" monsters */
+                       if (monster_living(m_ptr->r_idx))
+                               can_drain = TRUE;
+                       else
+                               can_drain = FALSE;
+               }
+
+               if ((have_flag(flgs, TR_VORPAL) || hex_spelling(attacker_ptr, HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
+                       vorpal_cut = TRUE;
+               else vorpal_cut = FALSE;
+
+               if (monk_attack)
+               {
+                       int special_effect = 0, stun_effect = 0, times = 0, max_times;
+                       int min_level = 1;
+                       const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
+                       int resist_stun = 0;
+                       WEIGHT weight = 8;
+
+                       if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
+                       if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
+                       if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
+                       if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
+                       if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
+                               resist_stun += 66;
+
+                       if (attacker_ptr->special_defense & KAMAE_BYAKKO)
+                               max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
+                       else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
+                               max_times = 1;
+                       else if (attacker_ptr->special_defense & KAMAE_GENBU)
+                               max_times = 1;
+                       else
+                               max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
+                       /* Attempt 'times' */
+                       for (times = 0; times < max_times; times++)
+                       {
+                               do
                                {
-                                       msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
-                                       stun_effect = 7 + randint1(13);
-                                       resist_stun /= 3;
-                               }
+                                       ma_ptr = &ma_blows[randint0(MAX_MA)];
+                                       if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
+                                       else min_level = ma_ptr->min_level;
+                               } while ((min_level > attacker_ptr->lev) ||
+                                       (randint1(attacker_ptr->lev) < ma_ptr->chance));
 
-                               else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
+                               /* keep the highest level attack available we found */
+                               if ((ma_ptr->min_level > old_ptr->min_level) &&
+                                       !attacker_ptr->stun && !attacker_ptr->confused)
                                {
-                                       if (!(r_ptr->flags1 & RF1_UNIQUE) &&
-                                               (randint1(attacker_ptr->lev) > r_ptr->level) &&
-                                               m_ptr->mspeed > 60)
+                                       old_ptr = ma_ptr;
+
+                                       if (current_world_ptr->wizard && cheat_xtra)
                                        {
-                                               msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
-                                               m_ptr->mspeed -= 10;
+                                               msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
                                        }
                                }
-
-                               if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
+                               else
                                {
-                                       if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
-                                       {
-                                               if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
-                                               {
-                                                       msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
-                                               }
-                                               else
-                                               {
-                                                       msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
-                                               }
-                                       }
+                                       ma_ptr = old_ptr;
                                }
                        }
 
-                       /* Handle normal weapon */
-                       else if (o_ptr->k_idx)
-                       {
-                               k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
-                               k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
+                       if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
+                       else min_level = ma_ptr->min_level;
+                       k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
+                       if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
 
-                               if (backstab)
-                               {
-                                       k *= (3 + (attacker_ptr->lev / 20));
-                               }
-                               else if (fuiuchi)
+                       if (ma_ptr->effect == MA_KNEE)
+                       {
+                               if (r_ptr->flags1 & RF1_MALE)
                                {
-                                       k = k*(5 + (attacker_ptr->lev * 2 / 25)) / 2;
+                                       msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
+                                       sound(SOUND_PAIN);
+                                       special_effect = MA_KNEE;
                                }
-                               else if (stab_fleeing)
+                               else
+                                       msg_format(ma_ptr->desc, m_name);
+                       }
+
+                       else if (ma_ptr->effect == MA_SLOW)
+                       {
+                               if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
+                                       my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
                                {
-                                       k = (3 * k) / 2;
+                                       msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
+                                       special_effect = MA_SLOW;
                                }
-
-                               if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
-                                       (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
+                               else msg_format(ma_ptr->desc, m_name);
+                       }
+                       else
+                       {
+                               if (ma_ptr->effect)
                                {
-                                       do_quake = TRUE;
+                                       stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
                                }
 
-                               if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
-                                       k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
-
-                               drain_result = k;
+                               msg_format(ma_ptr->desc, m_name);
+                       }
 
-                               if (vorpal_cut)
-                               {
-                                       int mult = 2;
+                       if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
+                       if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
+                       {
+                               weight += (P_PTR_KI / 30);
+                               if (weight > 20) weight = 20;
+                       }
 
-                                       if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
-                                       {
-                                               char chainsword_noise[1024];
-                                               if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
-                                               {
-                                                       msg_print(chainsword_noise);
-                                               }
-                                       }
+                       k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
 
-                                       if (o_ptr->name1 == ART_VORPAL_BLADE)
-                                       {
-                                               msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
-                                       }
-                                       else
-                                       {
-                                               msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
-                                       }
-
-                                       /* Try to increase the damage */
-                                       while (one_in_(vorpal_chance))
-                                       {
-                                               mult++;
-                                       }
+                       if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
+                       {
+                               msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
+                               stun_effect = 7 + randint1(13);
+                               resist_stun /= 3;
+                       }
 
-                                       k *= (HIT_POINT)mult;
+                       else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
+                       {
+                               if (!(r_ptr->flags1 & RF1_UNIQUE) &&
+                                       (randint1(attacker_ptr->lev) > r_ptr->level) &&
+                                       m_ptr->mspeed > 60)
+                               {
+                                       msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
+                                       m_ptr->mspeed -= 10;
+                               }
+                       }
 
-                                       /* Ouch! */
-                                       if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
+                       if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
+                       {
+                               if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
+                               {
+                                       if (set_monster_stunned(attacker_ptr, g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
                                        {
-                                               msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
+                                               msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
                                        }
                                        else
                                        {
-                                               switch (mult)
-                                               {
-                                               case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
-                                               case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
-                                               case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
-                                               case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
-                                               case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
-                                               case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
-                                               default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
-                                               }
+                                               msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
                                        }
-                                       drain_result = drain_result * 3 / 2;
                                }
-
-                               k += o_ptr->to_d;
-                               drain_result += o_ptr->to_d;
                        }
+               }
 
-                       /* Apply the player damage bonuses */
-                       k += attacker_ptr->to_d[hand];
-                       drain_result += attacker_ptr->to_d[hand];
-
-                       if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
-                       if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
-                       if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
-
-                       /* No negative damage */
-                       if (k < 0) k = 0;
+               /* Handle normal weapon */
+               else if (o_ptr->k_idx)
+               {
+                       k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
+                       k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
 
-                       if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
+                       if (backstab)
                        {
-                               k = 0;
+                               k *= (3 + (attacker_ptr->lev / 20));
                        }
-
-                       if (zantetsu_mukou)
+                       else if (fuiuchi)
                        {
-                               msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
-                               k = 0;
+                               k = k * (5 + (attacker_ptr->lev * 2 / 25)) / 2;
                        }
-
-                       if (e_j_mukou)
+                       else if (stab_fleeing)
                        {
-                               msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
-                               k /= 2;
+                               k = (3 * k) / 2;
                        }
 
-                       if (mode == HISSATSU_MINEUCHI)
+                       if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
+                               (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
                        {
-                               int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
+                               do_quake = TRUE;
+                       }
+
+                       if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(mode == HISSATSU_KYUSHO))
+                               k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
+
+                       drain_result = k;
 
-                               k = 0;
-                               anger_monster(m_ptr);
+                       if (vorpal_cut)
+                       {
+                               int mult = 2;
 
-                               if (!(r_ptr->flags3 & (RF3_NO_STUN)))
+                               if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
                                {
-                                       /* Get stunned */
-                                       if (MON_STUNNED(m_ptr))
+                                       char chainsword_noise[1024];
+                                       if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
                                        {
-                                               msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
-                                               tmp /= 2;
+                                               msg_print(chainsword_noise);
                                        }
-                                       else
+                               }
+
+                               if (o_ptr->name1 == ART_VORPAL_BLADE)
+                               {
+                                       msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
+                               }
+                               else
+                               {
+                                       msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
+                               }
+
+                               /* Try to increase the damage */
+                               while (one_in_(vorpal_chance))
+                               {
+                                       mult++;
+                               }
+
+                               k *= (HIT_POINT)mult;
+
+                               /* Ouch! */
+                               if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
+                               {
+                                       msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
+                               }
+                               else
+                               {
+                                       switch (mult)
                                        {
-                                               msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
+                                       case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
+                                       case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
+                                       case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
+                                       case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
+                                       case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
+                                       case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
+                                       default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
                                        }
+                               }
+                               drain_result = drain_result * 3 / 2;
+                       }
+
+                       k += o_ptr->to_d;
+                       drain_result += o_ptr->to_d;
+               }
+
+               /* Apply the player damage bonuses */
+               k += attacker_ptr->to_d[hand];
+               drain_result += attacker_ptr->to_d[hand];
+
+               if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
+               if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
+               if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
+
+               /* No negative damage */
+               if (k < 0) k = 0;
+
+               if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
+               {
+                       k = 0;
+               }
+
+               if (zantetsu_mukou)
+               {
+                       msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
+                       k = 0;
+               }
+
+               if (e_j_mukou)
+               {
+                       msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
+                       k /= 2;
+               }
 
-                                       /* Apply stun */
-                                       (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
+               if (mode == HISSATSU_MINEUCHI)
+               {
+                       int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
+
+                       k = 0;
+                       anger_monster(attacker_ptr, m_ptr);
+
+                       if (!(r_ptr->flags3 & (RF3_NO_STUN)))
+                       {
+                               /* Get stunned */
+                               if (MON_STUNNED(m_ptr))
+                               {
+                                       msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
+                                       tmp /= 2;
                                }
                                else
                                {
-                                       msg_format(_("%s ã\81«ã\81¯å\8a¹æ\9e\9cã\81\8cã\81ªã\81\8bã\81£ã\81\9fã\80\82", "%s is not effected."), m_name);
+                                       msg_format(_("%s ã\81¯ã\82\82ã\81\86ã\82\8dã\81\86ã\81¨ã\81\97ã\81\9fã\80\82", "%s is dazed."), m_name);
                                }
+
+                               /* Apply stun */
+                               (void)set_monster_stunned(attacker_ptr, g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
+                       }
+                       else
+                       {
+                               msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
                        }
+               }
 
-                       /* Modify the damage */
-                       k = mon_damage_mod(m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((attacker_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
-                       if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
+               /* Modify the damage */
+               k = mon_damage_mod(attacker_ptr, m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((attacker_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
+               if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
+               {
+                       if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
                        {
-                               if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
-                               {
-                                       k = m_ptr->hp + 1;
-                                       msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
-                               }
-                               else k = 1;
+                               k = m_ptr->hp + 1;
+                               msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
+                       }
+                       else k = 1;
+               }
+               else if ((attacker_ptr->pclass == CLASS_NINJA) && has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand] && ((attacker_ptr->cur_lite <= 0) || one_in_(7)))
+               {
+                       int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
+                       if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
+                       {
+                               k *= 5;
+                               drain_result *= 2;
+                               msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
                        }
-                       else if ((attacker_ptr->pclass == CLASS_NINJA) && has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand] && ((attacker_ptr->cur_lite <= 0) || one_in_(7)))
+                       else if (((m_ptr->hp < maxhp / 2) && one_in_((attacker_ptr->num_blow[0] + attacker_ptr->num_blow[1] + 1) * 10)) || ((one_in_(666) || ((backstab || fuiuchi) && one_in_(11))) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)))
                        {
-                               int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
-                               if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
+                               if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
                                {
-                                       k *= 5;
+                                       k = MAX(k * 5, m_ptr->hp / 2);
                                        drain_result *= 2;
-                                       msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
+                                       msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
                                }
-                               else if (((m_ptr->hp < maxhp / 2) && one_in_((attacker_ptr->num_blow[0] + attacker_ptr->num_blow[1] + 1) * 10)) || ((one_in_(666) || ((backstab || fuiuchi) && one_in_(11))) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)))
+                               else
                                {
-                                       if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
-                                       {
-                                               k = MAX(k * 5, m_ptr->hp / 2);
-                                               drain_result *= 2;
-                                               msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
-                                       }
-                                       else
-                                       {
-                                               k = m_ptr->hp + 1;
-                                               msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
-                                       }
+                                       k = m_ptr->hp + 1;
+                                       msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
                                }
                        }
+               }
 
-                       msg_format_wizard(CHEAT_MONSTER,
-                               _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
-                               m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
+               msg_format_wizard(CHEAT_MONSTER,
+                       _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
+                       m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
 
-                       if (k <= 0) can_drain = FALSE;
+               if (k <= 0) can_drain = FALSE;
 
-                       if (drain_result > m_ptr->hp)
-                               drain_result = m_ptr->hp;
+               if (drain_result > m_ptr->hp)
+                       drain_result = m_ptr->hp;
 
-                       /* Damage, check for fear and death */
-                       if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
+               /* Damage, check for fear and death */
+               if (mon_take_hit(attacker_ptr, g_ptr->m_idx, k, fear, NULL))
+               {
+                       *mdeath = TRUE;
+                       if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
                        {
-                               *mdeath = TRUE;
-                               if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
+                               if (attacker_ptr->migite && attacker_ptr->hidarite)
                                {
-                                       if (attacker_ptr->migite && attacker_ptr->hidarite)
-                                       {
-                                               if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
-                                               else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
-                                       }
-                                       else
-                                       {
-                                               attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
-                                       }
+                                       if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
+                                       else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
+                               }
+                               else
+                               {
+                                       attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
                                }
-                               if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
-                                       msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
-                               break;
                        }
+                       if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
+                               msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
+                       break;
+               }
 
-                       /* Anger the monster */
-                       if (k > 0) anger_monster(m_ptr);
+               /* Anger the monster */
+               if (k > 0) anger_monster(attacker_ptr, m_ptr);
 
-                       touch_zap_player(m_ptr, attacker_ptr);
+               touch_zap_player(m_ptr, attacker_ptr);
 
-                       /* Are we draining it?  A little note: If the monster is
-                       dead, the drain does not work... */
+               /* Are we draining it?  A little note: If the monster is
+               dead, the drain does not work... */
 
-                       if (can_drain && (drain_result > 0))
+               if (can_drain && (drain_result > 0))
+               {
+                       if (o_ptr->name1 == ART_MURAMASA)
                        {
-                               if (o_ptr->name1 == ART_MURAMASA)
+                               if (is_human)
                                {
-                                       if (is_human)
-                                       {
-                                               HIT_PROB to_h = o_ptr->to_h;
-                                               HIT_POINT to_d = o_ptr->to_d;
-                                               int i, flag;
+                                       HIT_PROB to_h = o_ptr->to_h;
+                                       HIT_POINT to_d = o_ptr->to_d;
+                                       int i, flag;
 
-                                               flag = 1;
-                                               for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
-                                               if (flag) to_h++;
+                                       flag = 1;
+                                       for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
+                                       if (flag) to_h++;
 
-                                               flag = 1;
-                                               for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
-                                               if (flag) to_d++;
+                                       flag = 1;
+                                       for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
+                                       if (flag) to_d++;
 
-                                               if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
-                                               {
-                                                       msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
-                                                       o_ptr->to_h = to_h;
-                                                       o_ptr->to_d = to_d;
-                                               }
+                                       if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
+                                       {
+                                               msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
+                                               o_ptr->to_h = to_h;
+                                               o_ptr->to_d = to_d;
                                        }
                                }
-                               else
+                       }
+                       else
+                       {
+                               if (drain_result > 5) /* Did we really hurt it? */
                                {
-                                       if (drain_result > 5) /* Did we really hurt it? */
-                                       {
-                                               drain_heal = damroll(2, drain_result / 6);
+                                       drain_heal = damroll(2, drain_result / 6);
 
-                                               if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
+                                       if (hex_spelling(attacker_ptr, HEX_VAMP_BLADE)) drain_heal *= 2;
 
-                                               if (cheat_xtra)
+                                       if (cheat_xtra)
+                                       {
+                                               msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
+                                       }
+
+                                       if (drain_left)
+                                       {
+                                               if (drain_heal < drain_left)
                                                {
-                                                       msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
+                                                       drain_left -= drain_heal;
                                                }
-
-                                               if (drain_left)
+                                               else
                                                {
-                                                       if (drain_heal < drain_left)
-                                                       {
-                                                               drain_left -= drain_heal;
-                                                       }
-                                                       else
-                                                       {
-                                                               drain_heal = drain_left;
-                                                               drain_left = 0;
-                                                       }
+                                                       drain_heal = drain_left;
+                                                       drain_left = 0;
+                                               }
 
-                                                       if (drain_msg)
-                                                       {
-                                                               msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
-                                                               drain_msg = FALSE;
-                                                       }
+                                               if (drain_msg)
+                                               {
+                                                       msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
+                                                       drain_msg = FALSE;
+                                               }
 
-                                                       drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
+                                               drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
 
-                                                       hp_player(attacker_ptr, drain_heal);
-                                                       /* We get to keep some of it! */
-                                               }
+                                               hp_player(attacker_ptr, drain_heal);
+                                               /* We get to keep some of it! */
                                        }
                                }
-                               m_ptr->maxhp -= (k + 7) / 8;
-                               if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
-                               if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
-                               weak = TRUE;
                        }
-                       can_drain = FALSE;
-                       drain_result = 0;
 
-                       /* Confusion attack */
-                       if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
-                       {
-                               /* Cancel glowing hands */
-                               if (attacker_ptr->special_attack & ATTACK_CONFUSE)
-                               {
-                                       attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
-                                       msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
-                                       attacker_ptr->redraw |= (PR_STATUS);
+                       m_ptr->maxhp -= (k + 7) / 8;
+                       if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+                       if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
+                       weak = TRUE;
+               }
 
-                               }
+               can_drain = FALSE;
+               drain_result = 0;
 
-                               /* Confuse the monster */
-                               if (r_ptr->flags3 & RF3_NO_CONF)
-                               {
-                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
-                                       msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
+               /* Confusion attack */
+               if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(attacker_ptr, HEX_CONFUSION))
+               {
+                       /* Cancel glowing hands */
+                       if (attacker_ptr->special_attack & ATTACK_CONFUSE)
+                       {
+                               attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
+                               msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
+                               attacker_ptr->redraw |= (PR_STATUS);
 
-                               }
-                               else if (randint0(100) < r_ptr->level)
-                               {
-                                       msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
-                               }
-                               else
-                               {
-                                       msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
-                                       (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
-                               }
                        }
 
-                       else if (chaos_effect == 4)
+                       /* Confuse the monster */
+                       if (r_ptr->flags3 & RF3_NO_CONF)
                        {
-                               bool resists_tele = FALSE;
-
-                               if (r_ptr->flagsr & RFR_RES_TELE)
-                               {
-                                       if (r_ptr->flags1 & RF1_UNIQUE)
-                                       {
-                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
-                                               msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
-                                               resists_tele = TRUE;
-                                       }
-                                       else if (r_ptr->level > randint1(100))
-                                       {
-                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
-                                               msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
-                                               resists_tele = TRUE;
-                                       }
-                               }
+                               if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
+                               msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
 
-                               if (!resists_tele)
-                               {
-                                       msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
-                                       teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
-                                       num = num_blow + 1; /* Can't hit it anymore! */
-                                       *mdeath = TRUE;
-                               }
                        }
-
-                       else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
+                       else if (randint0(100) < r_ptr->level)
                        {
-                               if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
-                                       !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
-                               {
-                                       if (polymorph_monster(attacker_ptr, y, x))
-                                       {
-                                               msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
-                                               *fear = FALSE;
-                                               weak = FALSE;
-                                       }
-                                       else
-                                       {
-                                               msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
-                                       }
-
-                                       /* Hack -- Get new monster */
-                                       m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
-
-                                       /* Oops, we need a different name... */
-                                       monster_desc(m_name, m_ptr, 0);
-
-                                       /* Hack -- Get new race */
-                                       r_ptr = &r_info[m_ptr->r_idx];
-                               }
+                               msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
                        }
-                       else if (o_ptr->name1 == ART_G_HAMMER)
+                       else
                        {
-                               monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
-
-                               if (target_ptr->hold_o_idx)
-                               {
-                                       object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
-                                       GAME_TEXT o_name[MAX_NLEN];
-
-                                       object_desc(o_name, q_ptr, OD_NAME_ONLY);
-                                       q_ptr->held_m_idx = 0;
-                                       q_ptr->marked = OM_TOUCHED;
-                                       target_ptr->hold_o_idx = q_ptr->next_o_idx;
-                                       q_ptr->next_o_idx = 0;
-                                       msg_format(_("%sを奪った。", "You snatched %s."), o_name);
-                                       inven_carry(q_ptr);
-                               }
+                               msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
+                               (void)set_monster_confused(attacker_ptr, g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
                        }
                }
 
-               /* Player misses */
-               else
+               else if (chaos_effect == 4)
                {
-                       backstab = FALSE; /* Clumsy! */
-                       fuiuchi = FALSE; /* Clumsy! */
+                       bool resists_tele = FALSE;
 
-                       if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
+                       if (r_ptr->flagsr & RFR_RES_TELE)
                        {
-                               BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
-
-                               sound(SOUND_HIT);
-
-                               msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
-                               msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
-                               object_flags(o_ptr, flgs_aux);
-
-                               k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
+                               if (r_ptr->flags1 & RF1_UNIQUE)
                                {
-                                       int mult;
-                                       switch (attacker_ptr->mimic_form)
-                                       {
-                                       case MIMIC_NONE:
-                                               switch (attacker_ptr->prace)
-                                               {
-                                               case RACE_YEEK:
-                                               case RACE_KLACKON:
-                                               case RACE_HUMAN:
-                                               case RACE_AMBERITE:
-                                               case RACE_DUNADAN:
-                                               case RACE_BARBARIAN:
-                                               case RACE_BEASTMAN:
-                                                       mult = 25; break;
-                                               case RACE_HALF_ORC:
-                                               case RACE_HALF_TROLL:
-                                               case RACE_HALF_OGRE:
-                                               case RACE_HALF_GIANT:
-                                               case RACE_HALF_TITAN:
-                                               case RACE_CYCLOPS:
-                                               case RACE_IMP:
-                                               case RACE_SKELETON:
-                                               case RACE_ZOMBIE:
-                                               case RACE_VAMPIRE:
-                                               case RACE_SPECTRE:
-                                               case RACE_DEMON:
-                                               case RACE_DRACONIAN:
-                                                       mult = 30; break;
-                                               default:
-                                                       mult = 10; break;
-                                               }
-                                               break;
-                                       case MIMIC_DEMON:
-                                       case MIMIC_DEMON_LORD:
-                                       case MIMIC_VAMPIRE:
-                                               mult = 30; break;
-                                       default:
-                                               mult = 10; break;
-                                       }
+                                       if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
+                                       msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
+                                       resists_tele = TRUE;
+                               }
+                               else if (r_ptr->level > randint1(100))
+                               {
+                                       if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
+                                       msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
+                                       resists_tele = TRUE;
+                               }
+                       }
 
-                                       if (attacker_ptr->align < 0 && mult < 20)
-                                               mult = 20;
-                                       if (!(attacker_ptr->resist_acid || IS_OPPOSE_ACID() || attacker_ptr->immune_acid) && (mult < 25))
-                                               mult = 25;
-                                       if (!(attacker_ptr->resist_elec || IS_OPPOSE_ELEC() || attacker_ptr->immune_elec) && (mult < 25))
-                                               mult = 25;
-                                       if (!(attacker_ptr->resist_fire || IS_OPPOSE_FIRE() || attacker_ptr->immune_fire) && (mult < 25))
-                                               mult = 25;
-                                       if (!(attacker_ptr->resist_cold || IS_OPPOSE_COLD() || attacker_ptr->immune_cold) && (mult < 25))
-                                               mult = 25;
-                                       if (!(attacker_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
-                                               mult = 25;
+                       if (!resists_tele)
+                       {
+                               msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
+                               teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
+                               num = num_blow + 1; /* Can't hit it anymore! */
+                               *mdeath = TRUE;
+                       }
+               }
 
-                                       if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp >(attacker_ptr->msp / 30)))
-                                       {
-                                               attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
-                                               attacker_ptr->redraw |= (PR_MANA);
-                                               mult = mult * 3 / 2 + 20;
-                                       }
-                                       k *= (HIT_POINT)mult;
-                                       k /= 10;
+               else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
+               {
+                       if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
+                               !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
+                       {
+                               if (polymorph_monster(attacker_ptr, y, x))
+                               {
+                                       msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
+                                       *fear = FALSE;
+                                       weak = FALSE;
                                }
-
-                               k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
-                               if (one_in_(6))
+                               else
                                {
-                                       int mult = 2;
-                                       msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
-                                       /* Try to increase the damage */
-                                       while (one_in_(4))
-                                       {
-                                               mult++;
-                                       }
-
-                                       k *= (HIT_POINT)mult;
+                                       msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
                                }
-                               k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
-                               if (k < 0) k = 0;
 
-                               take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
-                               handle_stuff();
+                               /* Hack -- Get new monster */
+                               m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
+
+                               /* Oops, we need a different name... */
+                               monster_desc(attacker_ptr, m_name, m_ptr, 0);
+
+                               /* Hack -- Get new race */
+                               r_ptr = &r_info[m_ptr->r_idx];
                        }
-                       else
+               }
+               else if (o_ptr->name1 == ART_G_HAMMER)
+               {
+                       monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
+
+                       if (target_ptr->hold_o_idx)
                        {
-                               sound(SOUND_MISS);
-                               msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
+                               object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
+                               GAME_TEXT o_name[MAX_NLEN];
+
+                               object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY);
+                               q_ptr->held_m_idx = 0;
+                               q_ptr->marked = OM_TOUCHED;
+                               target_ptr->hold_o_idx = q_ptr->next_o_idx;
+                               q_ptr->next_o_idx = 0;
+                               msg_format(_("%sを奪った。", "You snatched %s."), o_name);
+                               inven_carry(attacker_ptr, q_ptr);
                        }
                }
+
                backstab = FALSE;
                fuiuchi = FALSE;
        }
 
-
        if (weak && !(*mdeath))
        {
                msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
        }
-       if (drain_left != MAX_VAMPIRIC_DRAIN)
+
+       if ((drain_left != MAX_VAMPIRIC_DRAIN) && one_in_(4))
        {
-               if (one_in_(4))
-               {
-                       chg_virtue(attacker_ptr, V_UNLIFE, 1);
-               }
+               chg_virtue(attacker_ptr, V_UNLIFE, 1);
        }
-       /* Mega-Hack -- apply earthquake brand */
+
+       /* Mega-Hac
+       k -- apply earthquake brand */
        if (do_quake)
        {
                earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
@@ -2159,6 +2162,7 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
        }
 }
 
+
 /*!
 * @brief プレイヤーの打撃処理メインルーチン
 * @param y 攻撃目標のY座標
@@ -2170,10 +2174,6 @@ static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, boo
 */
 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
 {
-       bool            fear = FALSE;
-       bool            mdeath = FALSE;
-       bool            stormbringer = FALSE;
-
        grid_type       *g_ptr = &attacker_ptr->current_floor_ptr->grid_array[y][x];
        monster_type    *m_ptr = &attacker_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
        monster_race    *r_ptr = &r_info[m_ptr->r_idx];
@@ -2191,14 +2191,14 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
                return FALSE;
        }
 
-       monster_desc(m_name, m_ptr, 0);
+       monster_desc(attacker_ptr, m_name, m_ptr, 0);
 
        if (m_ptr->ml)
        {
                /* Auto-Recall if possible and visible */
-               if (!attacker_ptr->image) monster_race_track(m_ptr->ap_r_idx);
+               if (!attacker_ptr->image) monster_race_track(attacker_ptr, m_ptr->ap_r_idx);
 
-               health_track(g_ptr->m_idx);
+               health_track(attacker_ptr, g_ptr->m_idx);
        }
 
        if ((r_ptr->flags1 & RF1_FEMALE) &&
@@ -2218,6 +2218,7 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
        }
 
        /* Stop if friendly */
+       bool stormbringer = FALSE;
        if (!is_hostile(m_ptr) &&
                !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
                        attacker_ptr->shero || !m_ptr->ml))
@@ -2249,7 +2250,6 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
                }
        }
 
-
        /* Handle player fear */
        if (attacker_ptr->afraid)
        {
@@ -2259,7 +2259,7 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
                        msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
 
                /* Disturb the monster */
-               (void)set_monster_csleep(g_ptr->m_idx, 0);
+               (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
 
                return FALSE;
        }
@@ -2316,6 +2316,8 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
        }
 
        attacker_ptr->riding_t_m_idx = g_ptr->m_idx;
+       bool fear = FALSE;
+       bool mdeath = FALSE;
        if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
        if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
 
@@ -2323,15 +2325,15 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
        if (!mdeath)
        {
                if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
-                       natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
+                       natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
                if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
-                       natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
+                       natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
                if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
-                       natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
+                       natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
                if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
-                       natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
+                       natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
                if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
-                       natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
+                       natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
        }
 
        /* Hack -- delay fear messages */
@@ -2350,6 +2352,7 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
        return mdeath;
 }
 
+
 /*!
  * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
  * @param m_idx 打撃を行うモンスターのID
@@ -2357,12 +2360,10 @@ bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_
  */
 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
 {
-       monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
+       floor_type *floor_ptr = target_ptr->current_floor_ptr;
+       monster_type *m_ptr = &floor_ptr->m_list[m_idx];
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
 
-       int ap_cnt;
-
-       INVENTORY_IDX i;
        int k, tmp;
        ARMOUR_CLASS ac;
        DEPTH rlev;
@@ -2382,9 +2383,9 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
        int abbreviate = 0;     // 2回目以降の省略表現フラグ
 
        /* Not allowed to attack */
-       if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
+       if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return FALSE;
 
-       if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
+       if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
 
        /* ...nor if friendly */
        if (!is_hostile(m_ptr)) return FALSE;
@@ -2393,26 +2394,26 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
        rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
 
        /* Get the monster name (or "it") */
-       monster_desc(m_name, m_ptr, 0);
+       monster_desc(target_ptr, m_name, m_ptr, 0);
 
-       monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
+       monster_desc(target_ptr, ddesc, m_ptr, MD_WRONGDOER_NAME);
 
        if (target_ptr->special_defense & KATA_IAI)
        {
-               msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
+               msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s moved."), m_name);
                if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
        }
 
        if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
        {
-               if (kawarimi(TRUE)) return TRUE;
+               if (kawarimi(target_ptr, TRUE)) return TRUE;
        }
 
        /* Assume no blink */
        blinked = FALSE;
 
        /* Scan through all four blows */
-       for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
+       for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++)
        {
                bool obvious = FALSE;
 
@@ -2454,7 +2455,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                ac = target_ptr->ac + target_ptr->to_a;
 
                /* Monster hits player */
-               if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
+               if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
                {
                        /* Always disturbing */
                        disturb(target_ptr, TRUE, TRUE);
@@ -2467,7 +2468,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                            ((randint0(100) + target_ptr->lev) > 50))
                        {
                                /* Remember the Evil-ness */
-                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
+                               if (is_original_ap_and_seen(target_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
 
 #ifdef JP
                                if (abbreviate) msg_format("撃退した。");
@@ -2477,12 +2478,9 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                msg_format("%^s is repelled.", m_name);
 #endif
 
-
-                               /* Hack -- Next attack */
                                continue;
                        }
 
-
                        /* Assume no cut or stun */
                        do_cut = do_stun = 0;
 
@@ -2816,7 +2814,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        if (explode) break;
 
                                        /* Take "poison" effect */
-                                       if (!(target_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW(target_ptr))
+                                       if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !CHECK_MULTISHADOW(target_ptr))
                                        {
                                                if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
                                                {
@@ -2827,7 +2825,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_POIS);
+                                       update_smart_learn(target_ptr, m_idx, DRS_POIS);
 
                                        break;
                                }
@@ -2851,7 +2849,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_DISEN);
+                                       update_smart_learn(target_ptr, m_idx, DRS_DISEN);
 
                                        break;
                                }
@@ -2866,7 +2864,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        for (k = 0; k < 10; k++)
                                        {
                                                /* Pick an item */
-                                               i = (INVENTORY_IDX)randint0(INVEN_PACK);
+                                               INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
 
                                                /* Obtain the item */
                                                o_ptr = &target_ptr->inventory_list[i];
@@ -2997,7 +2995,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                OBJECT_IDX o_idx;
 
                                                /* Pick an item */
-                                               i = (INVENTORY_IDX)randint0(INVEN_PACK);
+                                               INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
 
                                                /* Obtain the item */
                                                o_ptr = &target_ptr->inventory_list[i];
@@ -3006,7 +3004,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                /* Skip artifacts */
                                                if (object_is_artifact(o_ptr)) continue;
 
-                                               object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
+                                               object_desc(target_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
 
 #ifdef JP
                                                msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
@@ -3014,13 +3012,13 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
 #endif
                                                chg_virtue(target_ptr, V_SACRIFICE, 1);
-                                               o_idx = o_pop();
+                                               o_idx = o_pop(floor_ptr);
 
                                                /* Success */
                                                if (o_idx)
                                                {
                                                        object_type *j_ptr;
-                                                       j_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
+                                                       j_ptr = &floor_ptr->o_list[o_idx];
                                                        object_copy(j_ptr, o_ptr);
 
                                                        /* Modify number */
@@ -3050,8 +3048,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                }
 
                                                /* Steal the items */
-                                               inven_item_increase(i, -1);
-                                               inven_item_optimize(i);
+                                               inven_item_increase(target_ptr, i, -1);
+                                               inven_item_optimize(target_ptr, i);
 
                                                obvious = TRUE;
 
@@ -3074,7 +3072,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        for (k = 0; k < 10; k++)
                                        {
                                                /* Pick an item from the pack */
-                                               i = (INVENTORY_IDX)randint0(INVEN_PACK);
+                                               INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
 
                                                o_ptr = &target_ptr->inventory_list[i];
                                                if (!o_ptr->k_idx) continue;
@@ -3082,7 +3080,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                /* Skip non-food objects */
                                                if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
 
-                                               object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+                                               object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
 
 #ifdef JP
                                                msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
@@ -3091,8 +3089,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
 #endif
 
                                                /* Steal the items */
-                                               inven_item_increase(i, -1);
-                                               inven_item_optimize(i);
+                                               inven_item_increase(target_ptr, i, -1);
+                                               inven_item_optimize(target_ptr, i);
 
                                                obvious = TRUE;
 
@@ -3134,9 +3132,9 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        if (explode) break;
                                        obvious = TRUE;
                                        msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
-                                       get_damage += acid_dam(damage, ddesc, -1, FALSE);
+                                       get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
                                        update_creature(target_ptr);
-                                       update_smart_learn(m_idx, DRS_ACID);
+                                       update_smart_learn(target_ptr, m_idx, DRS_ACID);
                                        break;
                                }
 
@@ -3145,8 +3143,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        if (explode) break;
                                        obvious = TRUE;
                                        msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
-                                       get_damage += elec_dam(damage, ddesc, -1, FALSE);
-                                       update_smart_learn(m_idx, DRS_ELEC);
+                                       get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
+                                       update_smart_learn(target_ptr, m_idx, DRS_ELEC);
                                        break;
                                }
 
@@ -3155,8 +3153,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        if (explode) break;
                                        obvious = TRUE;
                                        msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
-                                       get_damage += fire_dam(damage, ddesc, -1, FALSE);
-                                       update_smart_learn(m_idx, DRS_FIRE);
+                                       get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
+                                       update_smart_learn(target_ptr, m_idx, DRS_FIRE);
                                        break;
                                }
 
@@ -3165,8 +3163,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        if (explode) break;
                                        obvious = TRUE;
                                        msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
-                                       get_damage += cold_dam(damage, ddesc, -1, FALSE);
-                                       update_smart_learn(m_idx, DRS_COLD);
+                                       get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
+                                       update_smart_learn(target_ptr, m_idx, DRS_COLD);
                                        break;
                                }
 
@@ -3190,7 +3188,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_BLIND);
+                                       update_smart_learn(target_ptr, m_idx, DRS_BLIND);
 
                                        break;
                                }
@@ -3212,7 +3210,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_CONF);
+                                       update_smart_learn(target_ptr, m_idx, DRS_CONF);
 
                                        break;
                                }
@@ -3247,7 +3245,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_FEAR);
+                                       update_smart_learn(target_ptr, m_idx, DRS_FEAR);
 
                                        break;
                                }
@@ -3285,7 +3283,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_FREE);
+                                       update_smart_learn(target_ptr, m_idx, DRS_FREE);
 
                                        break;
                                }
@@ -3448,7 +3446,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
 
                                        /* Take "poison" effect */
-                                       if (!(target_ptr->resist_pois || IS_OPPOSE_POIS()))
+                                       if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
                                        {
                                                if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
                                                {
@@ -3598,7 +3596,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
 
                                        if (CHECK_MULTISHADOW(target_ptr))
                                        {
-                                               msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
+                                               msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
                                        }
                                        else
                                        {
@@ -3615,7 +3613,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
 
                                        /* Learn about the player */
-                                       update_smart_learn(m_idx, DRS_MANA);
+                                       update_smart_learn(target_ptr, m_idx, DRS_MANA);
 
                                        break;
                                }
@@ -3733,7 +3731,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                        {
                                sound(SOUND_EXPLODE);
 
-                               if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
+                               if (mon_take_hit(target_ptr, m_idx, m_ptr->hp + 1, &fear, NULL))
                                {
                                        blinked = FALSE;
                                        alive = FALSE;
@@ -3749,11 +3747,11 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                HIT_POINT dam = damroll(2, 6);
 
                                                /* Modify the damage */
-                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
                                                msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
 
-                                               if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
+                                               if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
@@ -3761,7 +3759,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
                                        else
                                        {
-                                               if (is_original_ap_and_seen(m_ptr))
+                                               if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                        r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
                                        }
                                }
@@ -3773,10 +3771,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                HIT_POINT dam = damroll(2, 6);
 
                                                /* Modify the damage */
-                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
                                                msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
-                                               if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
+                                               if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
@@ -3784,7 +3782,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
                                        else
                                        {
-                                               if (is_original_ap_and_seen(m_ptr))
+                                               if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                        r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
                                        }
                                }
@@ -3796,10 +3794,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                HIT_POINT dam = damroll(2, 6);
 
                                                /* Modify the damage */
-                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
                                                msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
-                                               if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
+                                               if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
@@ -3807,7 +3805,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
                                        else
                                        {
-                                               if (is_original_ap_and_seen(m_ptr))
+                                               if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                        r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
                                        }
                                }
@@ -3820,10 +3818,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                HIT_POINT dam = damroll(2, 6);
 
                                                /* Modify the damage */
-                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
                                                msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
-                                               if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
+                                               if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
@@ -3831,11 +3829,11 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
                                        else
                                        {
-                                               if (is_original_ap_and_seen(m_ptr))
+                                               if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                        r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
                                        }
 
-                                       if (is_mirror_grid(&p_ptr->current_floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
+                                       if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
                                        {
                                                teleport_player(target_ptr, 10, 0L);
                                        }
@@ -3850,20 +3848,20 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                        HIT_POINT dam = damroll(2, 6);
 
                                                        /* Modify the damage */
-                                                       dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                                       dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
                                                        msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
-                                                       if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
+                                                       if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
                                                        {
                                                                blinked = FALSE;
                                                                alive = FALSE;
                                                        }
-                                                       if (is_original_ap_and_seen(m_ptr))
+                                                       if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                                r_ptr->r_flags3 |= RF3_EVIL;
                                                }
                                                else
                                                {
-                                                       if (is_original_ap_and_seen(m_ptr))
+                                                       if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                                r_ptr->r_flagsr |= RFR_RES_ALL;
                                                }
                                        }
@@ -3876,10 +3874,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                HIT_POINT dam = damroll(2, 6);
 
                                                /* Modify the damage */
-                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
                                                msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
-                                               if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
+                                               if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
@@ -3887,12 +3885,12 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
                                        else
                                        {
-                                               if (is_original_ap_and_seen(m_ptr))
+                                               if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                        r_ptr->r_flagsr |= RFR_RES_ALL;
                                        }
                                }
 
-                               if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
+                               if (hex_spelling(target_ptr, HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
                                {
                                        HIT_POINT dam = 1;
                                        object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
@@ -3910,10 +3908,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                                if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
 
                                                /* Modify the damage */
-                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
+                                               dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
 
-                                               msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
-                                               if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
+                                               msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
+                                               if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
                                                {
                                                        blinked = FALSE;
                                                        alive = FALSE;
@@ -3940,7 +3938,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                                        }
                                        else
                                        {
-                                               if (is_original_ap_and_seen(m_ptr))
+                                               if (is_original_ap_and_seen(target_ptr, m_ptr))
                                                        r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
                                        }
                                }
@@ -4015,9 +4013,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                        }
                }
 
-
                /* Analyze "visible" monsters only */
-               if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
+               if (is_original_ap_and_seen(target_ptr, m_ptr) && !do_silly_attack)
                {
                        /* Count "obvious" attacks (and ones that cause damage) */
                        if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
@@ -4033,7 +4030,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                if (target_ptr->riding && damage)
                {
                        char m_steed_name[MAX_NLEN];
-                       monster_desc(m_steed_name, &p_ptr->current_floor_ptr->m_list[target_ptr->riding], 0);
+                       monster_desc(target_ptr, m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
                        if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
                        {
                                msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
@@ -4042,14 +4039,14 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
 
                if (target_ptr->special_defense & NINJA_KAWARIMI)
                {
-                       if (kawarimi(FALSE)) return TRUE;
+                       if (kawarimi(target_ptr, FALSE)) return TRUE;
                }
        }
 
        /* Hex - revenge damage stored */
-       revenge_store(get_damage);
+       revenge_store(target_ptr, get_damage);
 
-       if ((target_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
+       if ((target_ptr->tim_eyeeye || hex_spelling(target_ptr, HEX_EYE_FOR_EYE))
                && get_damage > 0 && !target_ptr->is_dead)
        {
 #ifdef JP
@@ -4058,7 +4055,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                GAME_TEXT m_name_self[80];
 
                /* hisself */
-               monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
+               monster_desc(target_ptr, 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
@@ -4069,10 +4066,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
        if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
        {
                char m_target_name[MAX_NLEN];
-               monster_desc(m_target_name, m_ptr, 0);
+               monster_desc(target_ptr, m_target_name, m_ptr, 0);
 
                target_ptr->csp -= 7;
-               msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
+               msg_format(_("%^sに反撃した!", "Your counterattacked to %s!"), m_target_name);
                py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
                fear = FALSE;
                target_ptr->redraw |= (PR_MANA);
@@ -4083,7 +4080,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
        {
                if (teleport_barrier(target_ptr, m_idx))
                {
-                       msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
+                       msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
                }
                else
                {
@@ -4092,9 +4089,8 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                }
        }
 
-
        /* Always notice cause of death */
-       if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !target_ptr->current_floor_ptr->inside_arena)
+       if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
        {
                r_ptr->r_deaths++;
        }
@@ -4110,16 +4106,10 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
                set_action(target_ptr, ACTION_NONE);
        }
 
-       /* Assume we attacked */
-       return (TRUE);
+       return TRUE;
 }
 
 
-#define BLOW_EFFECT_TYPE_NONE  0
-#define BLOW_EFFECT_TYPE_FEAR  1
-#define BLOW_EFFECT_TYPE_SLEEP 2
-#define BLOW_EFFECT_TYPE_HEAL  3
-
 /*!
  * @brief モンスターから敵モンスターへの打撃攻撃処理
  * @param m_idx 攻撃側モンスターの参照ID
@@ -4128,11 +4118,11 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
  */
 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
 {
-       monster_type    *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
-       monster_type    *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
+       monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
+       monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
 
-       monster_race    *r_ptr = &r_info[m_ptr->r_idx];
-       monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
+       monster_race *r_ptr = &r_info[m_ptr->r_idx];
+       monster_race *tr_ptr = &r_info[t_ptr->r_idx];
 
        ARMOUR_CLASS ap_cnt;
        ARMOUR_CLASS ac;
@@ -4160,7 +4150,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
        /* Not allowed to attack */
        if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
 
-       if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
+       if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
 
        /* Total armor */
        ac = tr_ptr->ac;
@@ -4168,8 +4158,8 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
        /* Extract the effective monster level */
        rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
 
-       monster_desc(m_name, m_ptr, 0);
-       monster_desc(t_name, t_ptr, 0);
+       monster_desc(subject_ptr, m_name, m_ptr, 0);
+       monster_desc(subject_ptr, t_name, t_ptr, 0);
 
        /* Assume no blink */
        blinked = FALSE;
@@ -4214,7 +4204,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                /* Monster hits */
                if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
                {
-                       (void)set_monster_csleep(t_idx, 0);
+                       (void)set_monster_csleep(subject_ptr, t_idx, 0);
 
                        if (t_ptr->ml)
                        {
@@ -4591,7 +4581,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                                                        {
                                                                msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
                                                        }
-                                                       if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
+                                                       if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
                                                        project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
                                                                damroll(1 + ((tr_ptr->level) / 26),
                                                                        1 + ((tr_ptr->level) / 17)),
@@ -4599,7 +4589,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                                                }
                                                else
                                                {
-                                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
+                                                       if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
                                                }
                                        }
 
@@ -4612,7 +4602,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                                                        {
                                                                msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
                                                        }
-                                                       if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
+                                                       if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
                                                        project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
                                                                damroll(1 + ((tr_ptr->level) / 26),
                                                                        1 + ((tr_ptr->level) / 17)),
@@ -4620,7 +4610,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                                                }
                                                else
                                                {
-                                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
+                                                       if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
                                                }
                                        }
 
@@ -4633,7 +4623,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                                                        {
                                                                msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
                                                        }
-                                                       if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
+                                                       if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
                                                        project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
                                                                damroll(1 + ((tr_ptr->level) / 26),
                                                                        1 + ((tr_ptr->level) / 17)),
@@ -4641,7 +4631,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                                                }
                                                else
                                                {
-                                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
+                                                       if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
                                                }
                                        }
                                }
@@ -4667,7 +4657,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                        case RBM_ENGULF:
                        case RBM_CHARGE:
                        {
-                               (void)set_monster_csleep(t_idx, 0);
+                               (void)set_monster_csleep(subject_ptr, t_idx, 0);
 
                                /* Visible monsters */
                                if (see_m)
@@ -4686,7 +4676,7 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
 
 
                /* Analyze "visible" monsters only */
-               if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
+               if (is_original_ap_and_seen(subject_ptr, m_ptr) && !do_silly_attack)
                {
                        /* Count "obvious" attacks (and ones that cause damage) */
                        if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
@@ -4705,38 +4695,36 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
                sound(SOUND_EXPLODE);
 
                /* Cancel Invulnerability */
-               (void)set_monster_invulner(m_idx, 0, FALSE);
-               mon_take_hit_mon(m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
+               (void)set_monster_invulner(subject_ptr, m_idx, 0, FALSE);
+               mon_take_hit_mon(subject_ptr, m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
                blinked = FALSE;
        }
 
-       /* Blink away */
-       if (blinked && m_ptr->r_idx)
+       if (!blinked || m_ptr->r_idx == 0) return TRUE;
+
+       if (teleport_barrier(subject_ptr, m_idx))
        {
-               if (teleport_barrier(subject_ptr, m_idx))
+               if (see_m)
                {
-                       if (see_m)
-                       {
-                               msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
-                       }
-                       else if (known)
-                       {
-                               subject_ptr->current_floor_ptr->monster_noise = TRUE;
-                       }
+                       msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
                }
-               else
+               else if (known)
                {
-                       if (see_m)
-                       {
-                               msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
-                       }
-                       else if (known)
-                       {
-                               subject_ptr->current_floor_ptr->monster_noise = TRUE;
-                       }
-
-                       teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
+                       subject_ptr->current_floor_ptr->monster_noise = TRUE;
+               }
+       }
+       else
+       {
+               if (see_m)
+               {
+                       msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
                }
+               else if (known)
+               {
+                       subject_ptr->current_floor_ptr->monster_noise = TRUE;
+               }
+
+               teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
        }
 
        return TRUE;
@@ -4755,9 +4743,10 @@ bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX
  * @param who 打撃を行ったモンスターの参照ID
  * @return なし
  */
-void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
+void mon_take_hit_mon(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
 {
-       monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
+       floor_type *floor_ptr = player_ptr->current_floor_ptr;
+       monster_type *m_ptr = &floor_ptr->m_list[m_idx];
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
        GAME_TEXT m_name[160];
        bool seen = is_seen(m_ptr);
@@ -4765,18 +4754,18 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
        /* Can the player be aware of this attack? */
        bool known = (m_ptr->cdis <= MAX_SIGHT);
 
-       monster_desc(m_name, m_ptr, 0);
+       monster_desc(player_ptr, m_name, m_ptr, 0);
 
        /* Redraw (later) if needed */
        if (m_ptr->ml)
        {
-               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
-               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+               if (player_ptr->health_who == m_idx) player_ptr->redraw |= (PR_HEALTH);
+               if (player_ptr->riding == m_idx) player_ptr->redraw |= (PR_UHEALTH);
        }
 
-       (void)set_monster_csleep(m_idx, 0);
+       (void)set_monster_csleep(player_ptr, m_idx, 0);
 
-       if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(p_ptr, TRUE, TRUE);
+       if (player_ptr->riding && (m_idx == player_ptr->riding)) disturb(player_ptr, TRUE, TRUE);
 
        if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
        {
@@ -4812,7 +4801,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
        {
                if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
                        (r_ptr->flags7 & RF7_NAZGUL)) &&
-                       !p_ptr->phase_out)
+                       !player_ptr->phase_out)
                {
                        m_ptr->hp = 1;
                }
@@ -4832,11 +4821,11 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
 
                        if (known)
                        {
-                               monster_desc(m_name, m_ptr, MD_TRUE_NAME);
+                               monster_desc(player_ptr, m_name, m_ptr, MD_TRUE_NAME);
                                /* Unseen death by normal attack */
                                if (!seen)
                                {
-                                       p_ptr->current_floor_ptr->monster_noise = TRUE;
+                                       floor_ptr->monster_noise = TRUE;
                                }
                                /* Death by special attack */
                                else if (note)
@@ -4855,9 +4844,9 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
                                }
                        }
 
-                       monster_gain_exp(who, m_ptr->r_idx);
-                       monster_death(m_idx, FALSE);
-                       delete_monster_idx(m_idx);
+                       monster_gain_exp(player_ptr, who, m_ptr->r_idx);
+                       monster_death(player_ptr, m_idx, FALSE);
+                       delete_monster_idx(player_ptr, m_idx);
 
                        /* Not afraid */
                        (*fear) = FALSE;
@@ -4875,7 +4864,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
        if (MON_MONFEAR(m_ptr) && (dam > 0))
        {
                /* Cure fear */
-               if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
+               if (set_monster_monfear(player_ptr, m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
                {
                        /* No more fear */
                        (*fear) = FALSE;
@@ -4899,7 +4888,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
                        (*fear) = TRUE;
 
                        /* Hack -- Add some timed fear */
-                       (void)set_monster_monfear(m_idx, (randint1(10) +
+                       (void)set_monster_monfear(player_ptr, m_idx, (randint1(10) +
                                (((dam >= m_ptr->hp) && (percentage > 7)) ?
                                        20 : ((11 - percentage) * 5))));
                }
@@ -4909,23 +4898,20 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear,
 
        if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
        {
-               if (is_pet(&p_ptr->current_floor_ptr->m_list[who]) && !player_bold(p_ptr, m_ptr->target_y, m_ptr->target_x))
+               if (is_pet(&floor_ptr->m_list[who]) && !player_bold(player_ptr, m_ptr->target_y, m_ptr->target_x))
                {
-                       set_target(m_ptr, p_ptr->current_floor_ptr->m_list[who].fy, p_ptr->current_floor_ptr->m_list[who].fx);
+                       set_target(m_ptr, floor_ptr->m_list[who].fy, floor_ptr->m_list[who].fx);
                }
        }
 
-       if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
+       if (player_ptr->riding && (player_ptr->riding == m_idx) && (dam > 0))
        {
-               monster_desc(m_name, m_ptr, 0);
+               monster_desc(player_ptr, m_name, m_ptr, 0);
 
                if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
-               if (rakuba(p_ptr, (dam > 200) ? 200 : dam, FALSE))
+               if (rakuba(player_ptr, (dam > 200) ? 200 : dam, FALSE))
                {
-                       msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);
+                       msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);
                }
        }
-
-       /* Not dead yet */
-       return;
 }