OSDN Git Service

[Refactor] #37353 ペット処理を cmd4.c から cmd-pet.c/h へ分離。
[hengband/hengband.git] / src / melee2.c
index d32bf98..e48c48a 100644 (file)
@@ -1,34 +1,34 @@
-/* File: melee2.c */
-
-/*
- * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
- *
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.  Other copyrights may also apply.
+/*!
+ * @file melee2.c
+ * @brief モンスターの特殊技能と移動処理/ Monster spells and movement
+ * @date 2014/01/17
+ * @author
+ * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
+ * This software may be copied and distributed for educational, research,\n
+ * and not for profit purposes provided that this copyright and statement\n
+ * are included in all such copies.  Other copyrights may also apply.\n
+ * 2014 Deskull rearranged comment for Doxygen.\n
+ * @details
+ * This file has several additions to it by Keldon Jones (keldon@umr.edu)
+ * to improve the general quality of the AI (version 0.1.1).
  */
 
-/* Purpose: Monster spells and movement */
-
-/*
-* This file has several additions to it by Keldon Jones (keldon@umr.edu)
-* to improve the general quality of the AI (version 0.1.1).
-*/
-
 #include "angband.h"
+#include "cmd-pet.h"
 
-#define SPEAK_CHANCE 8
-#define GRINDNOISE 20
-#define CYBERNOISE 20
 
-/*
+/*!
+ * @brief モンスターが敵に接近するための方向を決める /
  * Calculate the direction to the next enemy
+ * @param m_idx モンスターの参照ID
+ * @param mm 移動するべき方角IDを返す参照ポインタ
+ * @return 方向が確定した場合TRUE、接近する敵がそもそもいない場合FALSEを返す
  */
-static bool get_enemy_dir(int m_idx, int *mm)
+static bool get_enemy_dir(MONSTER_IDX m_idx, int *mm)
 {
        int i;
        int x = 0, y = 0;
-       int t_idx;
+       IDX t_idx;
        int start;
        int plus = 1;
 
@@ -59,7 +59,7 @@ static bool get_enemy_dir(int m_idx, int *mm)
                /* Scan thru all monsters */
                for (i = start; ((i < start + m_max) && (i > start - m_max)); i+=plus)
                {
-                       int dummy = (i % m_max);
+                       IDX dummy = (i % m_max);
 
                        if (!dummy) continue;
 
@@ -182,11 +182,17 @@ static bool get_enemy_dir(int m_idx, int *mm)
 }
 
 
-/*
- * Hack, based on mon_take_hit... perhaps all monster attacks on
- * other monsters should use this?
+/*!
+ * @brief モンスターが敵モンスターに行う打撃処理 /
+ * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
+ * @param m_idx 目標となるモンスターの参照ID
+ * @param dam ダメージ量
+ * @param fear 目標となるモンスターの恐慌状態を返す参照ポインタ
+ * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
+ * @param who 打撃を行ったモンスターの参照ID
+ * @return なし
  */
-void mon_take_hit_mon(int m_idx, int dam, bool *fear, cptr note, int who)
+void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, IDX who)
 {
        monster_type    *m_ptr = &m_list[m_idx];
 
@@ -194,7 +200,7 @@ void mon_take_hit_mon(int m_idx, int dam, bool *fear, cptr note, int who)
 
        char m_name[160];
 
-       bool seen = m_ptr->ml;
+       bool seen = is_seen(m_ptr);
 
        /* Can the player be aware of this attack? */
        bool known = (m_ptr->cdis <= MAX_SIGHT);
@@ -203,26 +209,22 @@ void mon_take_hit_mon(int m_idx, int dam, bool *fear, cptr note, int who)
        monster_desc(m_name, m_ptr, 0);
 
        /* Redraw (later) if needed */
-       if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
-       if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+       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);
+       }
 
        /* Wake it up */
-       m_ptr->csleep = 0;
+       (void)set_monster_csleep(m_idx, 0);
 
-       if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+       if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 1);
 
-       if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 0);
-
-       if (m_ptr->invulner && randint0(PENETRATE_INVULNERABILITY))
+       if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
        {
                if (seen)
                {
-#ifdef JP
-msg_format("%^s¤Ï¥À¥á¡¼¥¸¤ò¼õ¤±¤Ê¤¤¡£", m_name);
-#else
-                       msg_format("%^s is unharmed.", m_name);
-#endif
-
+                       msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
                }
 
                return;
@@ -239,19 +241,14 @@ msg_format("%^s
                {
                        if (seen)
                        {
-#ifdef JP
-msg_format("%^s¤Ï¥À¥á¡¼¥¸¤ò¼õ¤±¤Ê¤¤¡£", m_name);
-#else
-                               msg_format("%^s is unharmed.", m_name);
-#endif
-
+                               msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
                        }
                        return;
                }
        }
 
        /* Hurt it */
-       m_ptr->hp -= dam;
+       m_ptr->hp -= (s16b)dam;
 
        /* It is dead now... or is it? */
        if (m_ptr->hp < 0)
@@ -285,32 +282,17 @@ msg_format("%^s
                                /* Death by special attack */
                                else if (note)
                                {
-#ifdef JP
-msg_format("%^s%s", m_name, note);
-#else
-                                       msg_format("%^s%s", m_name, note);
-#endif
-
+                                       msg_format(_("%^s%s", "%^s%s"), m_name, note);
                                }
                                /* Death by normal attack -- nonliving monster */
                                else if (!monster_living(r_ptr))
                                {
-#ifdef JP
-msg_format("%^s¤ÏÇ˲õ¤µ¤ì¤¿¡£", m_name);
-#else
-                                       msg_format("%^s is destroyed.", m_name);
-#endif
-
+                                       msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
                                }
                                /* Death by normal attack -- living monster */
                                else
                                {
-#ifdef JP
-msg_format("%^s¤Ï»¦¤µ¤ì¤¿¡£", m_name);
-#else
-                                       msg_format("%^s is killed.", m_name);
-#endif
-
+                                       msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
                                }
                        }
 
@@ -333,35 +315,21 @@ msg_format("%^s
 #ifdef ALLOW_FEAR
 
        /* Mega-Hack -- Pain cancels fear */
-       if (m_ptr->monfear && (dam > 0))
+       if (MON_MONFEAR(m_ptr) && (dam > 0))
        {
-               int tmp = randint1(dam / 4);
-
-               /* Cure a little fear */
-               if (tmp < m_ptr->monfear)
+               /* Cure fear */
+               if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
                {
-                       /* Reduce fear */
-                       m_ptr->monfear -= tmp;
-               }
-
-               /* Cure all the fear */
-               else
-               {
-                       /* Cure fear */
-                       m_ptr->monfear = 0;
-
                        /* No more fear */
                        (*fear) = FALSE;
                }
        }
 
        /* Sometimes a monster gets scared by damage */
-       if (!m_ptr->monfear && !(r_ptr->flags3 & RF3_NO_FEAR))
+       if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
        {
-               int             percentage;
-
                /* Percentage of fully healthy */
-               percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
+               int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
 
                /*
                * Run (sometimes) if at 10% or less of max hit points,
@@ -374,9 +342,9 @@ msg_format("%^s
                        (*fear) = TRUE;
 
                        /* XXX XXX XXX Hack -- Add some timed fear */
-                       m_ptr->monfear += (randint1(10) +
+                       (void)set_monster_monfear(m_idx, (randint1(10) +
                                (((dam >= m_ptr->hp) && (percentage > 7)) ?
-                               20 : ((11 - percentage) * 5)));
+                               20 : ((11 - percentage) * 5))));
                }
        }
 
@@ -392,19 +360,13 @@ msg_format("%^s
 
        if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
        {
-               char m_name[80];
-
                /* Extract monster name */
                monster_desc(m_name, m_ptr, 0);
 
                if (m_ptr->hp > m_ptr->maxhp/3) dam = (dam + 1) / 2;
                if (rakuba((dam > 200) ? 200 : dam, FALSE))
                {
-#ifdef JP
-msg_format("%^s¤Ë¿¶¤êÍî¤È¤µ¤ì¤¿¡ª", m_name);
-#else
-                               msg_format("You have thrown off from %s!", m_name);
-#endif
+                       msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);
                }
        }
 
@@ -413,20 +375,23 @@ msg_format("%^s
 }
 
 
-/*
+/*!
+ * @brief モンスターがプレイヤーから逃走するかどうかを返す /
  * Returns whether a given monster will try to run from the player.
- *
- * Monsters will attempt to avoid very powerful players.  See below.
- *
- * Because this function is called so often, little details are important
- * for efficiency.  Like not using "mod" or "div" when possible.  And
- * attempting to check the conditions in an optimal order.  Note that
- * "(x << 2) == (x * 4)" if "x" has enough bits to hold the result.
- *
- * Note that this function is responsible for about one to five percent
- * of the processor use in normal conditions...
+ * @param m_idx 逃走するモンスターの参照ID
+ * @return モンスターがプレイヤーから逃走するならばTRUEを返す。
+ * @details
+ * Monsters will attempt to avoid very powerful players.  See below.\n
+ *\n
+ * Because this function is called so often, little details are important\n
+ * for efficiency.  Like not using "mod" or "div" when possible.  And\n
+ * attempting to check the conditions in an optimal order.  Note that\n
+ * "(x << 2) == (x * 4)" if "x" has enough bits to hold the result.\n
+ *\n
+ * Note that this function is responsible for about one to five percent\n
+ * of the processor use in normal conditions...\n
  */
-static int mon_will_run(int m_idx)
+static bool mon_will_run(MONSTER_IDX m_idx)
 {
        monster_type *m_ptr = &m_list[m_idx];
 
@@ -435,8 +400,8 @@ static int mon_will_run(int m_idx)
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
 
        u16b p_lev, m_lev;
-       u16b p_chp, p_mhp;
-       u16b m_chp, m_mhp;
+       HIT_POINT p_chp, p_mhp;
+       HIT_POINT m_chp, m_mhp;
        u32b p_val, m_val;
 
 #endif
@@ -453,7 +418,7 @@ static int mon_will_run(int m_idx)
        if (m_ptr->cdis > MAX_SIGHT + 5) return (FALSE);
 
        /* All "afraid" monsters will run away */
-       if (m_ptr->monfear) return (TRUE);
+       if (MON_MONFEAR(m_ptr)) return (TRUE);
 
 #ifdef ALLOW_TERROR
 
@@ -492,12 +457,15 @@ static int mon_will_run(int m_idx)
 }
 
 
-
-
-/*
+/*!
+ * @brief モンスターがプレイヤーに向けて遠距離攻撃を行うことが可能なマスを走査する /
  * Search spell castable grid
+ * @param m_idx モンスターの参照ID
+ * @param yp 適したマスのY座標を返す参照ポインタ
+ * @param xp 適したマスのX座標を返す参照ポインタ
+ * @return 有効なマスがあった場合TRUEを返す
  */
-static bool get_moves_aux2(int m_idx, int *yp, int *xp)
+static bool get_moves_aux2(MONSTER_IDX m_idx, int *yp, int *xp)
 {
        int i, y, x, y1, x1, best = 999;
 
@@ -513,7 +481,7 @@ static bool get_moves_aux2(int m_idx, int *yp, int *xp)
        x1 = m_ptr->fx;
 
        /* Monster can already cast spell to player */
-       if (projectable(y1, x1, py, px)) return (FALSE);
+       if (projectable(y1, x1, p_ptr->y, p_ptr->x)) return (FALSE);
 
        /* Set current grid cost */
        now_cost = cave[y1][x1].cost;
@@ -556,7 +524,7 @@ static bool get_moves_aux2(int m_idx, int *yp, int *xp)
 
                if (now_cost < cost) continue;
 
-               if (!projectable(y, x, py, px)) continue;
+               if (!projectable(y, x, p_ptr->y, p_ptr->x)) continue;
 
                /* Accept louder sounds */
                if (best < cost) continue;
@@ -574,29 +542,35 @@ static bool get_moves_aux2(int m_idx, int *yp, int *xp)
 }
 
 
-/*
+/*!
+ * @brief モンスターがプレイヤーに向けて接近することが可能なマスを走査する /
  * Choose the "best" direction for "flowing"
- *
- * Note that ghosts and rock-eaters are never allowed to "flow",
- * since they should move directly towards the player.
- *
- * Prefer "non-diagonal" directions, but twiddle them a little
- * to angle slightly towards the player's actual location.
- *
- * Allow very perceptive monsters to track old "spoor" left by
- * previous locations occupied by the player.  This will tend
- * to have monsters end up either near the player or on a grid
- * recently occupied by the player (and left via "teleport").
- *
- * Note that if "smell" is turned on, all monsters get vicious.
- *
- * Also note that teleporting away from a location will cause
- * the monsters who were chasing you to converge on that location
- * as long as you are still near enough to "annoy" them without
- * being close enough to chase directly.  I have no idea what will
- * happen if you combine "smell" with low "aaf" values.
+ * @param m_idx モンスターの参照ID
+ * @param yp 移動先のマスのY座標を返す参照ポインタ
+ * @param xp 移動先のマスのX座標を返す参照ポインタ
+ * @param no_flow モンスターにFLOWフラグが経っていない状態でTRUE
+ * @return 有効なマスがあった場合TRUEを返す
+ * @details
+ * Note that ghosts and rock-eaters are never allowed to "flow",\n
+ * since they should move directly towards the player.\n
+ *\n
+ * Prefer "non-diagonal" directions, but twiddle them a little\n
+ * to angle slightly towards the player's actual location.\n
+ *\n
+ * Allow very perceptive monsters to track old "spoor" left by\n
+ * previous locations occupied by the player.  This will tend\n
+ * to have monsters end up either near the player or on a grid\n
+ * recently occupied by the player (and left via "teleport").\n
+ *\n
+ * Note that if "smell" is turned on, all monsters get vicious.\n
+ *\n
+ * Also note that teleporting away from a location will cause\n
+ * the monsters who were chasing you to converge on that location\n
+ * as long as you are still near enough to "annoy" them without\n
+ * being close enough to chase directly.  I have no idea what will\n
+ * happen if you combine "smell" with low "aaf" values.\n
  */
-static bool get_moves_aux(int m_idx, int *yp, int *xp, bool no_flow)
+static bool get_moves_aux(MONSTER_IDX m_idx, int *yp, int *xp, bool no_flow)
 {
        int i, y, x, y1, x1, best;
 
@@ -608,8 +582,8 @@ static bool get_moves_aux(int m_idx, int *yp, int *xp, bool no_flow)
 
        /* Can monster cast attack spell? */
        if (r_ptr->flags4 & (RF4_ATTACK_MASK) ||
-           r_ptr->flags5 & (RF5_ATTACK_MASK) ||
-           r_ptr->flags6 & (RF6_ATTACK_MASK))
+           r_ptr->a_ability_flags1 & (RF5_ATTACK_MASK) ||
+           r_ptr->a_ability_flags2 & (RF6_ATTACK_MASK))
        {
                /* Can move spell castable grid? */
                if (get_moves_aux2(m_idx, yp, xp)) return (TRUE);
@@ -627,7 +601,7 @@ static bool get_moves_aux(int m_idx, int *yp, int *xp, bool no_flow)
        x1 = m_ptr->fx;
 
        /* Hack -- Player can see us, run towards him */
-       if (player_has_los_bold(y1, x1) && projectable(py, px, y1, x1)) return (FALSE);
+       if (player_has_los_bold(y1, x1) && projectable(p_ptr->y, p_ptr->x, y1, x1)) return (FALSE);
 
        /* Monster grid */
        c_ptr = &cave[y1][x1];
@@ -642,7 +616,7 @@ static bool get_moves_aux(int m_idx, int *yp, int *xp, bool no_flow)
        else if (c_ptr->when)
        {
                /* Too old smell */
-               if (cave[py][px].when - c_ptr->when > 127) return (FALSE);
+               if (cave[p_ptr->y][p_ptr->x].when - c_ptr->when > 127) return (FALSE);
 
                use_scent = TRUE;
                best = 0;
@@ -691,8 +665,8 @@ static bool get_moves_aux(int m_idx, int *yp, int *xp, bool no_flow)
                }
 
                /* Hack -- Save the "twiddled" location */
-               (*yp) = py + 16 * ddy_ddd[i];
-               (*xp) = px + 16 * ddx_ddd[i];
+               (*yp) = p_ptr->y + 16 * ddy_ddd[i];
+               (*xp) = p_ptr->x + 16 * ddx_ddd[i];
        }
 
        /* No legal move (?) */
@@ -703,14 +677,19 @@ static bool get_moves_aux(int m_idx, int *yp, int *xp, bool no_flow)
 }
 
 
-/*
-* Provide a location to flee to, but give the player a wide berth.
-*
-* A monster may wish to flee to a location that is behind the player,
-* but instead of heading directly for it, the monster should "swerve"
-* around the player so that he has a smaller chance of getting hit.
-*/
-static bool get_fear_moves_aux(int m_idx, int *yp, int *xp)
+/*!
+ * @brief モンスターがプレイヤーから逃走することが可能なマスを走査する /
+ * Provide a location to flee to, but give the player a wide berth.
+ * @param m_idx モンスターの参照ID
+ * @param yp 移動先のマスのY座標を返す参照ポインタ
+ * @param xp 移動先のマスのX座標を返す参照ポインタ
+ * @return 有効なマスがあった場合TRUEを返す
+ * @details
+ * A monster may wish to flee to a location that is behind the player,\n
+ * but instead of heading directly for it, the monster should "swerve"\n
+ * around the player so that he has a smaller chance of getting hit.\n
+ */
+static bool get_fear_moves_aux(MONSTER_IDX m_idx, int *yp, int *xp)
 {
        int y, x, y1, x1, fy, fx, gy = 0, gx = 0;
        int score = -1;
@@ -907,20 +886,25 @@ static sint *dist_offsets_x[10] =
        d_off_x_5, d_off_x_6, d_off_x_7, d_off_x_8, d_off_x_9
 };
 
-/*
-* Choose a "safe" location near a monster for it to run toward.
-*
-* A location is "safe" if it can be reached quickly and the player
-* is not able to fire into it (it isn't a "clean shot").  So, this will
-* cause monsters to "duck" behind walls.  Hopefully, monsters will also
-* try to run towards corridor openings if they are in a room.
-*
-* This function may take lots of CPU time if lots of monsters are
-* fleeing.
-*
-* Return TRUE if a safe location is available.
-*/
-static bool find_safety(int m_idx, int *yp, int *xp)
+/*!
+ * @brief モンスターが逃げ込める安全な地点を返す /
+ * Choose a "safe" location near a monster for it to run toward.
+ * @param m_idx モンスターの参照ID
+ * @param yp 移動先のマスのY座標を返す参照ポインタ
+ * @param xp 移動先のマスのX座標を返す参照ポインタ
+ * @return 有効なマスがあった場合TRUEを返す
+ * @details
+ * A location is "safe" if it can be reached quickly and the player\n
+ * is not able to fire into it (it isn't a "clean shot").  So, this will\n
+ * cause monsters to "duck" behind walls.  Hopefully, monsters will also\n
+ * try to run towards corridor openings if they are in a room.\n
+ *\n
+ * This function may take lots of CPU time if lots of monsters are\n
+ * fleeing.\n
+ *\n
+ * Return TRUE if a safe location is available.\n
+ */
+static bool find_safety(MONSTER_IDX m_idx, int *yp, int *xp)
 {
        monster_type *m_ptr = &m_list[m_idx];
 
@@ -969,10 +953,10 @@ static bool find_safety(int m_idx, int *yp, int *xp)
                        }
 
                        /* Check for absence of shot (more or less) */
-                       if (!projectable(py, px, y, x))
+                       if (!projectable(p_ptr->y, p_ptr->x, y, x))
                        {
                                /* Calculate distance from player */
-                               dis = distance(y, x, py, px);
+                               dis = distance(y, x, p_ptr->y, p_ptr->x);
 
                                /* Remember if further than previous */
                                if (dis > gdis)
@@ -1001,15 +985,20 @@ static bool find_safety(int m_idx, int *yp, int *xp)
 }
 
 
-/*
+/*!
+ * @brief モンスターが隠れ潜める地点を返す /
  * Choose a good hiding place near a monster for it to run toward.
- *
- * Pack monsters will use this to "ambush" the player and lure him out
- * of corridors into open space so they can swarm him.
- *
- * Return TRUE if a good location is available.
+ * @param m_idx モンスターの参照ID
+ * @param yp 移動先のマスのY座標を返す参照ポインタ
+ * @param xp 移動先のマスのX座標を返す参照ポインタ
+ * @return 有効なマスがあった場合TRUEを返す
+ * @details
+ * Pack monsters will use this to "ambush" the player and lure him out\n
+ * of corridors into open space so they can swarm him.\n
+ *\n
+ * Return TRUE if a good location is available.\n
  */
-static bool find_hiding(int m_idx, int *yp, int *xp)
+static bool find_hiding(MONSTER_IDX m_idx, int *yp, int *xp)
 {
        monster_type *m_ptr = &m_list[m_idx];
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
@@ -1044,10 +1033,10 @@ static bool find_hiding(int m_idx, int *yp, int *xp)
                        if (!monster_can_enter(y, x, r_ptr, 0)) continue;
 
                        /* Check for hidden, available grid */
-                       if (!projectable(py, px, y, x) && clean_shot(fy, fx, y, x, FALSE))
+                       if (!projectable(p_ptr->y, p_ptr->x, y, x) && clean_shot(fy, fx, y, x, FALSE))
                        {
                                /* Calculate distance from player */
-                               dis = distance(y, x, py, px);
+                               dis = distance(y, x, p_ptr->y, p_ptr->x);
 
                                /* Remember if closer than previous */
                                if (dis < gdis && dis >= 2)
@@ -1076,17 +1065,21 @@ static bool find_hiding(int m_idx, int *yp, int *xp)
 }
 
 
-/*
+/*!
+ * @brief モンスターの移動方向を返す /
  * Choose "logical" directions for monster movement
+ * @param m_idx モンスターの参照ID
+ * @param mm 移動方向を返す方向IDの参照ポインタ
+ * @return 有効方向があった場合TRUEを返す
  */
-static bool get_moves(int m_idx, int *mm)
+static bool get_moves(MONSTER_IDX m_idx, int *mm)
 {
        monster_type *m_ptr = &m_list[m_idx];
        monster_race *r_ptr = &r_info[m_ptr->r_idx];
-       int          y, ay, x, ax;
+       int          y = 0, ay, x = 0, ax;
        int          move_val = 0;
-       int          y2 = py;
-       int          x2 = px;
+       int          y2 = p_ptr->y;
+       int          x2 = p_ptr->x;
        bool         done = FALSE;
        bool         will_run = mon_will_run(m_idx);
        cave_type    *c_ptr;
@@ -1113,7 +1106,7 @@ static bool get_moves(int m_idx, int *mm)
 
        if (!done && !will_run && is_hostile(m_ptr) &&
            (r_ptr->flags1 & RF1_FRIENDS) &&
-           ((los(m_ptr->fy, m_ptr->fx, py, px) && projectable(m_ptr->fy, m_ptr->fx, py, px)) ||
+           ((los(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x) && projectable(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x)) ||
            (cave[m_ptr->fy][m_ptr->fx].dist < MAX_SIGHT / 2)))
        {
        /*
@@ -1128,8 +1121,8 @@ static bool get_moves(int m_idx, int *mm)
                        /* Count room grids next to player */
                        for (i = 0; i < 8; i++)
                        {
-                               int xx = px + ddx_ddd[i];
-                               int yy = py + ddy_ddd[i];
+                               int xx = p_ptr->x + ddx_ddd[i];
+                               int yy = p_ptr->y + ddy_ddd[i];
 
                                if (!in_bounds2(yy, xx)) continue;
 
@@ -1142,8 +1135,8 @@ static bool get_moves(int m_idx, int *mm)
                                        room++;
                                }
                        }
-                       if (cave[py][px].info & CAVE_ROOM) room -= 2;
-                       if (!r_ptr->flags4 && !r_ptr->flags5 && !r_ptr->flags6) room -= 2;
+                       if (cave[p_ptr->y][p_ptr->x].info & CAVE_ROOM) room -= 2;
+                       if (!r_ptr->flags4 && !r_ptr->a_ability_flags1 && !r_ptr->a_ability_flags2) room -= 2;
 
                        /* Not in a room and strong player */
                        if (room < (8 * (p_ptr->chp + p_ptr->csp)) /
@@ -1163,15 +1156,15 @@ static bool get_moves(int m_idx, int *mm)
                        for (i = 0; i < 8; i++)
                        {
                                /* Pick squares near player (semi-randomly) */
-                               y2 = py + ddy_ddd[(m_idx + i) & 7];
-                               x2 = px + ddx_ddd[(m_idx + i) & 7];
+                               y2 = p_ptr->y + ddy_ddd[(m_idx + i) & 7];
+                               x2 = p_ptr->x + ddx_ddd[(m_idx + i) & 7];
 
                                /* Already there? */
                                if ((m_ptr->fy == y2) && (m_ptr->fx == x2))
                                {
                                        /* Attack the player */
-                                       y2 = py;
-                                       x2 = px;
+                                       y2 = p_ptr->y;
+                                       x2 = p_ptr->x;
 
                                        break;
                                }
@@ -1406,6 +1399,14 @@ static bool get_moves(int m_idx, int *mm)
 }
 
 
+/*!
+ * @brief モンスターから敵モンスターへの命中判定
+ * @param power 打撃属性による基本命中値
+ * @param level 攻撃側モンスターのレベル
+ * @param ac 目標モンスターのAC
+ * @param stun 攻撃側モンスターが朦朧状態ならTRUEを返す
+ * @return 命中ならばTRUEを返す
+ */
 static int check_hit2(int power, int level, int ac, int stun)
 {
        int i, k;
@@ -1429,8 +1430,19 @@ static int check_hit2(int power, int level, int ac, int stun)
 }
 
 
-/* Monster attacks monster */
-static bool monst_attack_monst(int m_idx, int t_idx)
+#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
+ * @param t_idx 目標側モンスターの参照ID
+ * @return 実際に打撃処理が行われた場合TRUEを返す
+ */
+static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx)
 {
        monster_type    *m_ptr = &m_list[m_idx];
        monster_type    *t_ptr = &m_list[t_idx];
@@ -1441,14 +1453,15 @@ static bool monst_attack_monst(int m_idx, int t_idx)
        int             ap_cnt;
        int             ac, rlev, pt;
        char            m_name[80], t_name[80];
-       char            temp[80];
-       bool            blinked, heal_effect;
+       char            temp[MAX_NLEN];
+       bool            blinked;
        bool            explode = FALSE, touched = FALSE, fear = FALSE;
        int             y_saver = t_ptr->fy;
        int             x_saver = t_ptr->fx;
+       int             effect_type;
 
-       bool see_m = m_ptr->ml;
-       bool see_t = t_ptr->ml;
+       bool see_m = is_seen(m_ptr);
+       bool see_t = is_seen(t_ptr);
        bool see_either = see_m || see_t;
 
        /* Can the player be aware of this attack? */
@@ -1483,15 +1496,15 @@ static bool monst_attack_monst(int m_idx, int t_idx)
                mon_fight = TRUE;
        }
 
-       if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 0);
+       if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 1);
 
        /* Scan through all four blows */
        for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
        {
                bool obvious = FALSE;
 
-               int power = 0;
-               int damage = 0;
+               HIT_POINT power = 0;
+               HIT_POINT damage = 0;
 
                cptr act = NULL;
 
@@ -1510,215 +1523,135 @@ static bool monst_attack_monst(int m_idx, int t_idx)
                /* Hack -- no more attacks */
                if (!method) break;
 
-               if (blinked) /* Stop! */
-               {
-                       /* break; */
-               }
-
                if (method == RBM_SHOOT) continue;
 
                /* Extract the attack "power" */
                power = mbe_info[effect].power;
 
                /* Monster hits */
-               if (!effect || check_hit2(power, rlev, ac, m_ptr->stunned))
+               if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
                {
                        /* Wake it up */
-                       t_ptr->csleep = 0;
+                       (void)set_monster_csleep(t_idx, 0);
 
-                       if (tr_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+                       if (t_ptr->ml)
+                       {
+                               /* Redraw the health bar */
+                               if (p_ptr->health_who == t_idx) p_ptr->redraw |= (PR_HEALTH);
+                               if (p_ptr->riding == t_idx) p_ptr->redraw |= (PR_UHEALTH);
+                       }
 
                        /* Describe the attack method */
                        switch (method)
                        {
                        case RBM_HIT:
                                {
-#ifdef JP
-act = "%s¤ò²¥¤Ã¤¿¡£";
-#else
-                                       act = "hits %s.";
-#endif
-
+                                       act = _("%sを殴った。", "hits %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_TOUCH:
                                {
-#ifdef JP
-act = "%s¤ò¿¨¤Ã¤¿¡£";
-#else
-                                       act = "touches %s.";
-#endif
-
+                                       act = _("%sを触った。", "touches %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_PUNCH:
                                {
-#ifdef JP
-act = "%s¤ò¥Ñ¥ó¥Á¤·¤¿¡£";
-#else
-                                       act = "punches %s.";
-#endif
-
+                                       act = _("%sをパンチした。", "punches %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_KICK:
                                {
-#ifdef JP
-act = "%s¤ò½³¤Ã¤¿¡£";
-#else
-                                       act = "kicks %s.";
-#endif
-
+                                       act = _("%sを蹴った。", "kicks %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_CLAW:
                                {
-#ifdef JP
-act = "%s¤ò¤Ò¤Ã¤«¤¤¤¿¡£";
-#else
-                                       act = "claws %s.";
-#endif
-
+                                       act = _("%sをひっかいた。", "claws %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_BITE:
                                {
-#ifdef JP
-act = "%s¤ò³ú¤ó¤À¡£";
-#else
-                                       act = "bites %s.";
-#endif
-
+                                       act = _("%sを噛んだ。", "bites %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_STING:
                                {
-#ifdef JP
-act = "%s¤ò»É¤·¤¿¡£";
-#else
-                                       act = "stings %s.";
-#endif
-
+                                       act = _("%sを刺した。", "stings %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_SLASH:
                                {
-#ifdef JP
-act = "%s¤ò»Â¤Ã¤¿¡£";
-#else
-                                       act = "slashes %s.";
-#endif
-
+                                       act = _("%sを斬った。", "slashes %s.");
                                        break;
                                }
 
                        case RBM_BUTT:
                                {
-#ifdef JP
-act = "%s¤ò³Ñ¤ÇÆͤ¤¤¿¡£";
-#else
-                                       act = "butts %s.";
-#endif
-
+                                       act = _("%sを角で突いた。", "butts %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_CRUSH:
                                {
-#ifdef JP
-act = "%s¤ËÂÎÅö¤ê¤·¤¿¡£";
-#else
-                                       act = "crushes %s.";
-#endif
-
+                                       act = _("%sに体当りした。", "crushes %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_ENGULF:
                                {
-#ifdef JP
-act = "%s¤ò°û¤ß¹þ¤ó¤À¡£";
-#else
-                                       act = "engulfs %s.";
-#endif
-
+                                       act = _("%sを飲み込んだ。", "engulfs %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_CHARGE:
                                {
-#ifdef JP
-act = "%s¤ËÀÁµá½ñ¤ò¤è¤³¤·¤¿¡£";
-#else
-                                       act = "charges %s.";
-#endif
-
+                                       act = _("%sに請求書をよこした。", "charges %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_CRAWL:
                                {
-#ifdef JP
-act = "%s¤ÎÂΤξå¤òÇ礤²ó¤Ã¤¿¡£";
-#else
-                                       act = "crawls on %s.";
-#endif
-
+                                       act = _("%sの体の上を這い回った。", "crawls on %s.");
                                        touched = TRUE;
                                        break;
                                }
 
                        case RBM_DROOL:
                                {
-#ifdef JP
-act = "%s¤Ë¤è¤À¤ì¤ò¤¿¤é¤·¤¿¡£";
-#else
-                                       act = "drools on %s.";
-#endif
-
+                                       act = _("%sによだれをたらした。", "drools on %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_SPIT:
                                {
-#ifdef JP
-act = "%s¤ËÂäòÅǤ¤¤¿¡£";
-#else
-                                       act = "spits on %s.";
-#endif
-
+                                       act = _("%sに唾を吐いた。", "spits on %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_EXPLODE:
                                {
-                                       if (see_either) disturb(1, 0);
-#ifdef JP
-act = "Çúȯ¤·¤¿¡£";
-#else
-                                       act = "explodes.";
-#endif
-
+                                       if (see_either) disturb(1, 1);
+                                       act = _("爆発した。", "explodes.");
                                        explode = TRUE;
                                        touched = FALSE;
                                        break;
@@ -1726,96 +1659,56 @@ act = "
 
                        case RBM_GAZE:
                                {
-#ifdef JP
-act = "%s¤ò¤Ë¤é¤ó¤À¡£";
-#else
-                                       act = "gazes at %s.";
-#endif
-
+                                       act = _("%sをにらんだ。", "gazes at %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_WAIL:
                                {
-#ifdef JP
-act = "%s¤Ëµã¤­¤Ä¤¤¤¿¡£";
-#else
-                                       act = "wails at %s.";
-#endif
-
+                                       act = _("%sに泣きついた。", "wails at %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_SPORE:
                                {
-#ifdef JP
-act = "%s¤Ë˦»Ò¤òÈô¤Ð¤·¤¿¡£";
-#else
-                                       act = "releases spores at %s.";
-#endif
-
+                                       act = _("%sに胞子を飛ばした。", "releases spores at %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_XXX4:
                                {
-#ifdef JP
-act = "%s¤ËXXX4¤òÈô¤Ð¤·¤¿¡£";
-#else
-                                       act = "projects XXX4's at %s.";
-#endif
-
+                                       act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_BEG:
                                {
-#ifdef JP
-act = "%s¤Ë¶â¤ò¤»¤¬¤ó¤À¡£";
-#else
-                                       act = "begs %s for money.";
-#endif
-
+                                       act = _("%sに金をせがんだ。", "begs %s for money.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_INSULT:
                                {
-#ifdef JP
-act = "%s¤òÉî¿«¤·¤¿¡£";
-#else
-                                       act = "insults %s.";
-#endif
-
+                                       act = _("%sを侮辱した。", "insults %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_MOAN:
                                {
-#ifdef JP
-act = "%s¤Ë¤à¤«¤Ã¤Æ¤¦¤á¤¤¤¿¡£";
-#else
-                                       act = "moans at %s.";
-#endif
-
+                                       act = _("%sにむかってうめいた。", "moans at %s.");
                                        touched = FALSE;
                                        break;
                                }
 
                        case RBM_SHOW:
                                {
-#ifdef JP
-act = "%s¤Ë¤à¤«¤Ã¤Æ²Î¤Ã¤¿¡£";
-#else
-                                       act = "sings to %s.";
-#endif
-
+                                       act = _("%sにむかって歌った。", "sings to %s.");
                                        touched = FALSE;
                                        break;
                                }
@@ -1827,7 +1720,7 @@ act = "%s
 #ifdef JP
                                if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
                                strfmt(temp, act, t_name);
-                               msg_format("%^s¤Ï%s", m_name, temp);
+                               msg_format("%^s%s", m_name, temp);
 #else
                                if (do_silly_attack)
                                {
@@ -1845,8 +1738,8 @@ act = "%s
                        /* Roll out the damage */
                        damage = damroll(d_dice, d_side);
 
-                       /* Assume no healing effect */
-                       heal_effect = FALSE;
+                       /* Assume no effect */
+                       effect_type = BLOW_EFFECT_TYPE_NONE;
 
                        pt = GF_MISSILE;
 
@@ -1854,147 +1747,111 @@ act = "%s
                        switch (effect)
                        {
                        case 0:
-                               {
-                                       damage = 0;
-                                       pt = 0;
-                                       break;
-                               }
+                       case RBE_DR_MANA:
+                               damage = pt = 0;
+                               break;
 
                        case RBE_SUPERHURT:
+                               if ((randint1(rlev*2+250) > (ac+200)) || one_in_(13))
                                {
-                                       if ((randint1(rlev*2+250) > (ac+200)) || one_in_(13)) {
-                                               int tmp_damage = damage-(damage*((ac < 150) ? ac : 150)/250);
-                                               damage = MAX(damage, tmp_damage*2);
-                                               break;
-                                       }
-                               }
-                       case RBE_HURT:
-                               {
-                                       damage -= (damage * ((ac < 150) ? ac : 150) / 250);
+                                       int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
+                                       damage = MAX(damage, tmp_damage * 2);
                                        break;
                                }
 
+                               /* Fall through */
+
+                       case RBE_HURT:
+                               damage -= (damage * ((ac < 150) ? ac : 150) / 250);
+                               break;
+
                        case RBE_POISON:
                        case RBE_DISEASE:
-                               {
-                                       pt = GF_POIS;
-                                       break;
-                               }
+                               pt = GF_POIS;
+                               break;
 
                        case RBE_UN_BONUS:
                        case RBE_UN_POWER:
-                               {
-                                       pt = GF_DISENCHANT;
-                                       break;
-                               }
-
-                       case RBE_EAT_FOOD:
-                       case RBE_EAT_LITE:
-                       case RBE_DR_MANA:
-                               {
-                                       pt = damage = 0;
-                                       break;
-                               }
+                               pt = GF_DISENCHANT;
+                               break;
 
                        case RBE_EAT_ITEM:
                        case RBE_EAT_GOLD:
-                               {
-                                       pt = damage = 0;
-                                       if (one_in_(2)) blinked = TRUE;
-                                       break;
-                               }
+                               if ((p_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
+                               break;
+
+                       case RBE_EAT_FOOD:
+                       case RBE_EAT_LITE:
+                       case RBE_BLIND:
+                       case RBE_LOSE_STR:
+                       case RBE_LOSE_INT:
+                       case RBE_LOSE_WIS:
+                       case RBE_LOSE_DEX:
+                       case RBE_LOSE_CON:
+                       case RBE_LOSE_CHR:
+                       case RBE_LOSE_ALL:
+                               break;
 
                        case RBE_ACID:
-                               {
-                                       pt = GF_ACID;
-                                       break;
-                               }
+                               pt = GF_ACID;
+                               break;
 
                        case RBE_ELEC:
-                               {
-                                       pt = GF_ELEC;
-                                       break;
-                               }
+                               pt = GF_ELEC;
+                               break;
 
                        case RBE_FIRE:
-                               {
-                                       pt = GF_FIRE;
-                                       break;
-                               }
+                               pt = GF_FIRE;
+                               break;
 
                        case RBE_COLD:
-                               {
-                                       pt = GF_COLD;
-                                       break;
-                               }
-
-                       case RBE_BLIND:
-                               {
-                                       break;
-                               }
+                               pt = GF_COLD;
+                               break;
 
                        case RBE_CONFUSE:
-                               {
-                                       pt = GF_CONFUSION;
-                                       break;
-                               }
+                               pt = GF_CONFUSION;
+                               break;
 
                        case RBE_TERRIFY:
-                               {
-                                       pt = GF_TURN_ALL;
-                                       break;
-                               }
+                               effect_type = BLOW_EFFECT_TYPE_FEAR;
+                               break;
 
                        case RBE_PARALYZE:
-                               {
-                                       pt = GF_OLD_SLEEP; /* sort of close... */
-                                       break;
-                               }
+                               effect_type = BLOW_EFFECT_TYPE_SLEEP;
+                               break;
 
-                       case RBE_LOSE_STR:
-                       case RBE_LOSE_INT:
-                       case RBE_LOSE_WIS:
-                       case RBE_LOSE_DEX:
-                       case RBE_LOSE_CON:
-                       case RBE_LOSE_CHR:
-                       case RBE_LOSE_ALL:
-                               {
-                                       break;
-                               }
                        case RBE_SHATTER:
-                               {
-                                       damage -= (damage * ((ac < 150) ? ac : 150) / 250);
-                                       if (damage > 23)
-                                       {
-                                               earthquake(m_ptr->fy, m_ptr->fx, 8);
-                                       }
-                                       break;
-                               }
+                               damage -= (damage * ((ac < 150) ? ac : 150) / 250);
+                               if (damage > 23) earthquake_aux(m_ptr->fy, m_ptr->fx, 8, m_idx);
+                               break;
+
                        case RBE_EXP_10:
                        case RBE_EXP_20:
                        case RBE_EXP_40:
                        case RBE_EXP_80:
-                               {
-                                       pt = GF_NETHER;
-                                       break;
-                               }
+                               pt = GF_NETHER;
+                               break;
+
                        case RBE_TIME:
-                               {
-                                       pt = GF_TIME;
-                                       break;
-                               }
-                       case RBE_EXP_VAMP:
-                               {
-                                       pt = GF_OLD_DRAIN;
-                                       heal_effect = TRUE;
-                                       break;
-                               }
+                               pt = GF_TIME;
+                               break;
+
+                       case RBE_DR_LIFE:
+                               pt = GF_HYPODYNAMIA;
+                               effect_type = BLOW_EFFECT_TYPE_HEAL;
+                               break;
+
+                       case RBE_INERTIA:
+                               pt = GF_INERTIAL;
+                               break;
+
+                       case RBE_STUN:
+                               pt = GF_SOUND;
+                               break;
 
                        default:
-                               {
-                                       pt = 0;
-                                       break;
-                               }
+                               pt = 0;
+                               break;
                        }
 
                        if (pt)
@@ -2003,11 +1860,22 @@ act = "%s
                                if (!explode)
                                {
                                        project(m_idx, 0, t_ptr->fy, t_ptr->fx,
-                                               (pt == GF_OLD_SLEEP ? r_ptr->level : damage), pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
+                                               damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
                                }
 
-                               if (heal_effect)
+                               switch (effect_type)
                                {
+                               case BLOW_EFFECT_TYPE_FEAR:
+                                       project(m_idx, 0, t_ptr->fy, t_ptr->fx,
+                                               damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
+                                       break;
+
+                               case BLOW_EFFECT_TYPE_SLEEP:
+                                       project(m_idx, 0, t_ptr->fy, t_ptr->fx,
+                                               r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
+                                       break;
+
+                               case BLOW_EFFECT_TYPE_HEAL:
                                        if ((monster_living(tr_ptr)) && (damage > 2))
                                        {
                                                bool did_heal = FALSE;
@@ -2025,14 +1893,10 @@ act = "%s
                                                /* Special message */
                                                if (see_m && did_heal)
                                                {
-#ifdef JP
-msg_format("%s¤ÏÂÎÎϤò²óÉü¤·¤¿¤è¤¦¤À¡£", m_name);
-#else
-                                                       msg_format("%^s appears healthier.", m_name);
-#endif
-
+                                                       msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
                                                }
                                        }
+                                       break;
                                }
 
                                if (touched)
@@ -2044,15 +1908,9 @@ msg_format("%s
                                                {
                                                        if (see_either)
                                                        {
-                                                               blinked = FALSE;
-#ifdef JP
-                                                               msg_format("%^s¤ÏÆÍÁ³Ç®¤¯¤Ê¤Ã¤¿¡ª", m_name);
-#else
-                                                               msg_format("%^s is suddenly very hot!", m_name);
-#endif
-
-                                                               if (see_t && is_original_ap(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
+                                                               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;
                                                        project(t_idx, 0, m_ptr->fy, m_ptr->fx,
                                                                damroll (1 + ((tr_ptr->level) / 26),
                                                                1 + ((tr_ptr->level) / 17)),
@@ -2060,7 +1918,7 @@ msg_format("%s
                                                }
                                                else
                                                {
-                                                       if (see_m && is_original_ap(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
+                                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
                                                }
                                        }
 
@@ -2071,15 +1929,9 @@ msg_format("%s
                                                {
                                                        if (see_either)
                                                        {
-                                                               blinked = FALSE;
-#ifdef JP
-                                                               msg_format("%^s¤ÏÆÍÁ³´¨¤¯¤Ê¤Ã¤¿¡ª", m_name);
-#else
-                                                               msg_format("%^s is suddenly very cold!", m_name);
-#endif
-
-                                                               if (see_t && is_original_ap(t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
+                                                               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;
                                                        project(t_idx, 0, m_ptr->fy, m_ptr->fx,
                                                                damroll (1 + ((tr_ptr->level) / 26),
                                                                1 + ((tr_ptr->level) / 17)),
@@ -2087,7 +1939,7 @@ msg_format("%s
                                                }
                                                else
                                                {
-                                                       if (see_m && is_original_ap(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
+                                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
                                                }
                                        }
 
@@ -2098,15 +1950,9 @@ msg_format("%s
                                                {
                                                        if (see_either)
                                                        {
-                                                               blinked = FALSE;
-#ifdef JP
-                                                               msg_format("%^s¤ÏÅÅ·â¤ò¿©¤é¤Ã¤¿¡ª", m_name);
-#else
-                                                               msg_format("%^s gets zapped!", m_name);
-#endif
-
-                                                               if (see_t && is_original_ap(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
+                                                               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;
                                                        project(t_idx, 0, m_ptr->fy, m_ptr->fx,
                                                                damroll (1 + ((tr_ptr->level) / 26),
                                                                1 + ((tr_ptr->level) / 17)),
@@ -2114,7 +1960,7 @@ msg_format("%s
                                                }
                                                else
                                                {
-                                                       if (see_m && is_original_ap(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
+                                                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
                                                }
                                        }
                                }
@@ -2141,20 +1987,17 @@ msg_format("%s
                        case RBM_CHARGE:
                                {
                                        /* Wake it up */
-                                       t_ptr->csleep = 0;
-
-                                       if (tr_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+                                       (void)set_monster_csleep(t_idx, 0);
 
                                        /* Visible monsters */
                                        if (see_m)
                                        {
                                                /* Message */
 #ifdef JP
-msg_format("%s¤Ï%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", t_name,m_name);
+                                               msg_format("%sは%^sの攻撃をかわした。", t_name,m_name);
 #else
                                                msg_format("%^s misses %s.", m_name, t_name);
 #endif
-
                                        }
 
                                        break;
@@ -2164,7 +2007,7 @@ msg_format("%s
 
 
                /* Analyze "visible" monsters only */
-               if (see_m && !do_silly_attack)
+               if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
                {
                        /* Count "obvious" attacks (and ones that cause damage) */
                        if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
@@ -2183,76 +2026,89 @@ msg_format("%s
                sound(SOUND_EXPLODE);
 
                /* Cancel Invulnerability */
-               if (m_ptr->invulner) m_ptr->invulner = 0;
-
-#ifdef JP
-mon_take_hit_mon(m_idx, m_ptr->hp + 1, &fear, "¤ÏÇúȯ¤·¤ÆÊ´¡¹¤Ë¤Ê¤Ã¤¿¡£", m_idx);
-#else
-               mon_take_hit_mon(m_idx, m_ptr->hp + 1, &fear, " explodes into tiny shreds.", m_idx);
-#endif
-
-
+               (void)set_monster_invulner(m_idx, 0, FALSE);
+               mon_take_hit_mon(m_idx, m_ptr->hp + 1, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
                blinked = FALSE;
        }
 
-
        /* Blink away */
-       if (blinked)
+       if (blinked && m_ptr->r_idx)
        {
-               if (see_m)
+               if (teleport_barrier(m_idx))
                {
-#ifdef JP
-msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
-#else
-                       msg_print("The thief flees laughing!");
-#endif
-
+                       if (see_m)
+                       {
+                               msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
+                       }
+                       else if (known)
+                       {
+                               mon_fight = TRUE;
+                       }
                }
-               else if (known)
+               else
                {
-                       mon_fight = TRUE;
-               }
+                       if (see_m)
+                       {
+                               msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
+                       }
+                       else if (known)
+                       {
+                               mon_fight = TRUE;
+                       }
 
-               teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE);
+                       teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
+               }
        }
 
        return TRUE;
 }
 
 
-/*
+static bool check_hp_for_feat_destruction(feature_type *f_ptr, monster_type *m_ptr)
+{
+       return !have_flag(f_ptr->flags, FF_GLASS) ||
+              (r_info[m_ptr->r_idx].flags2 & RF2_STUPID) ||
+              (m_ptr->hp >= MAX(m_ptr->maxhp / 3, 200));
+}
+
+
+/*!
+ * @brief モンスター単体の1ターン行動処理メインルーチン /
  * Process a monster
- *
- * The monster is known to be within 100 grids of the player
- *
- * In several cases, we directly update the monster lore
- *
- * Note that a monster is only allowed to "reproduce" if there
- * are a limited number of "reproducing" monsters on the current
- * level.  This should prevent the level from being "swamped" by
- * reproducing monsters.  It also allows a large mass of mice to
- * prevent a louse from multiplying, but this is a small price to
- * pay for a simple multiplication method.
- *
- * XXX Monster fear is slightly odd, in particular, monsters will
- * fixate on opening a door even if they cannot open it.  Actually,
- * the same thing happens to normal monsters when they hit a door
- *
- * XXX XXX XXX In addition, monsters which *cannot* open or bash
- * down a door will still stand there trying to open it...
- *
- * XXX Technically, need to check for monster in the way
- * combined with that monster being in a wall (or door?)
- *
- * A "direction" of "5" means "pick a random direction".
+ * @param m_idx 行動モンスターの参照ID
+ * @return なし
+ * @details
+ * The monster is known to be within 100 grids of the player\n
+ *\n
+ * In several cases, we directly update the monster lore\n
+ *\n
+ * Note that a monster is only allowed to "reproduce" if there\n
+ * are a limited number of "reproducing" monsters on the current\n
+ * level.  This should prevent the level from being "swamped" by\n
+ * reproducing monsters.  It also allows a large mass of mice to\n
+ * prevent a louse from multiplying, but this is a small price to\n
+ * pay for a simple multiplication method.\n
+ *\n
+ * XXX Monster fear is slightly odd, in particular, monsters will\n
+ * fixate on opening a door even if they cannot open it.  Actually,\n
+ * the same thing happens to normal monsters when they hit a door\n
+ *\n
+ * XXX XXX XXX In addition, monsters which *cannot* open or bash\n
+ * down a door will still stand there trying to open it...\n
+ *\n
+ * XXX Technically, need to check for monster in the way\n
+ * combined with that monster being in a wall (or door?)\n
+ *\n
+ * A "direction" of "5" means "pick a random direction".\n
  */
-static void process_monster(int m_idx)
+static void process_monster(MONSTER_IDX m_idx)
 {
        monster_type    *m_ptr = &m_list[m_idx];
        monster_race    *r_ptr = &r_info[m_ptr->r_idx];
        monster_race    *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
 
-       int             i, d, oy, ox, ny, nx;
+       int             i, d;
+       POSITION        oy, ox, ny, nx;
 
        int             mm[8];
 
@@ -2264,6 +2120,7 @@ static void process_monster(int m_idx)
        bool            do_turn;
        bool            do_move;
        bool            do_view;
+       bool            must_alter_to_move;
 
        bool            did_open_door;
        bool            did_bash_door;
@@ -2280,12 +2137,14 @@ static void process_monster(int m_idx)
 
        bool            is_riding_mon = (m_idx == p_ptr->riding);
 
+       bool            see_m = is_seen(m_ptr);
+
        if (is_riding_mon && !(r_ptr->flags7 & RF7_RIDING))
        {
                if (rakuba(0, TRUE))
                {
 #ifdef JP
-                       msg_print("ÃÏÌ̤ËÍî¤È¤µ¤ì¤¿¡£");
+                       msg_print("地面に落とされた。");
 #else
                        char m_name[80];
                        monster_desc(m_name, &m_list[p_ptr->riding], 0);
@@ -2294,7 +2153,7 @@ static void process_monster(int m_idx)
                }
        }
 
-       if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && one_in_(13) && !m_ptr->csleep)
+       if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && one_in_(13) && !MON_CSLEEP(m_ptr))
        {
                choose_new_monster(m_idx, FALSE, 0);
                r_ptr = &r_info[m_ptr->r_idx];
@@ -2316,18 +2175,21 @@ static void process_monster(int m_idx)
        {
                /* Its parent have gone, it also goes away. */
 
-               if (m_ptr->ml)
+               if (see_m)
                {
                        char m_name[80];
-                       
+
                        /* Acquire the monster name */
                        monster_desc(m_name, m_ptr, 0);
+                       msg_format(_("%sは消え去った!", "%^s disappears!"), m_name);
+               }
 
-#ifdef JP
-                       msg_format("%s¤Ï¾Ã¤¨µî¤Ã¤¿¡ª", m_name);
-#else
-                       msg_format("%^s disappears!", m_name);
-#endif
+               if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
+               {
+                       char m_name[80];
+
+                       monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
+                       do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_LOSE_PARENT, m_name);
                }
 
                /* Delete the monster */
@@ -2350,7 +2212,7 @@ static void process_monster(int m_idx)
                        if (is_pet(m_ptr) && !(m_ptr->ml))
                                sad = TRUE;
 
-                       if (m_ptr->ml)
+                       if (see_m)
                        {
                                char m_name[80];
 
@@ -2358,12 +2220,7 @@ static void process_monster(int m_idx)
                                monster_desc(m_name, m_ptr, 0);
 
                                /* Oops */
-#ifdef JP
-msg_format("%s¤Ï¾Ã¤¨µî¤Ã¤¿¡ª", m_name);
-#else
-                               msg_format("%^s disappears!", m_name);
-#endif
-
+                               msg_format(_("%sは消え去った!", "%^s disappears!"), m_name);
                        }
 
                        /* Generate treasure, etc */
@@ -2374,12 +2231,7 @@ msg_format("%s
 
                        if (sad)
                        {
-#ifdef JP
-msg_print("¾¯¤·¤Î´ÖÈᤷ¤¤µ¤Ê¬¤Ë¤Ê¤Ã¤¿¡£");
-#else
-                               msg_print("You feel sad for a moment.");
-#endif
-
+                               msg_print(_("少しの間悲しい気分になった。", "You feel sad for a moment."));
                        }
 
                        return;
@@ -2387,11 +2239,7 @@ msg_print("
        }
 
        if (m_ptr->r_idx == MON_SHURYUUDAN)
-#ifdef JP
-               mon_take_hit_mon(m_idx, 1, &fear, "¤ÏÇúȯ¤·¤ÆÊ´¡¹¤Ë¤Ê¤Ã¤¿¡£", m_idx);
-#else
-               mon_take_hit_mon(m_idx, 1, &fear, " explodes into tiny shreds.", m_idx);
-#endif
+               mon_take_hit_mon(m_idx, 1, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
 
        if ((is_pet(m_ptr) || is_friendly(m_ptr)) && ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) && !p_ptr->inside_battle)
        {
@@ -2404,59 +2252,36 @@ msg_print("
 
                        if (is_riding_mon && riding_pinch < 2)
                        {
-#ifdef JP
-                               msg_format("%s¤Ï½ý¤ÎÄˤµ¤Î;¤ê¤¢¤Ê¤¿¤Î«Çû¤«¤éƨ¤ì¤è¤¦¤È¤·¤Æ¤¤¤ë¡£", m_name);
-#else
-                               msg_format("%^s seems to be in so much pain, and trying to escape from your restriction.", m_name);
-#endif
+                               msg_format(_("%sは傷の痛さの余りあなたの束縛から逃れようとしている。",
+                                                        "%^s seems to be in so much pain, and trying to escape from your restriction."), m_name);
                                riding_pinch++;
-                               disturb(1, 0);
+                               disturb(1, 1);
                        }
                        else
                        {
                                if (is_riding_mon)
                                {
-#ifdef JP
-                                       msg_format("%s¤Ï¤¢¤Ê¤¿¤Î«Çû¤«¤éæ½Ð¤·¤¿¡£", m_name);
-#else
-                                       msg_format("%^s succeeded to escape from your restriction!", m_name);
-#endif
+                                       msg_format(_("%sはあなたの束縛から脱出した。", "%^s succeeded to escape from your restriction!"), m_name);
                                        if (rakuba(-1, FALSE))
                                        {
-#ifdef JP
-                                               msg_print("ÃÏÌ̤ËÍî¤È¤µ¤ì¤¿¡£");
-#else
-                                               msg_print("You have fallen from riding pet.");
-#endif
+                                               msg_print(_("地面に落とされた。", "You have fallen from riding pet."));
                                        }
                                }
 
-                               if (m_ptr->ml)
+                               if (see_m)
                                {
-                                       if ((r_ptr->flags2 & RF2_CAN_SPEAK) && (m_ptr->r_idx != MON_GRIP) && (m_ptr->r_idx != MON_WOLF) && (m_ptr->r_idx != MON_FANG))
+                                       if ((r_ptr->flags2 & RF2_CAN_SPEAK) && (m_ptr->r_idx != MON_GRIP) && (m_ptr->r_idx != MON_WOLF) && (m_ptr->r_idx != MON_FANG) &&
+                                           player_has_los_bold(m_ptr->fy, m_ptr->fx) && projectable(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x))
                                        {
-#ifdef JP
-                                               msg_format("%^s¡Ö¥Ô¥ó¥Á¤À¡ªÂàµÑ¤µ¤»¤Æ¤â¤é¤¦¡ª¡×", m_name);
-#else
-                                               msg_format("%^s says 'It is the pinch! I will retreat'.", m_name);
-#endif
+                                               msg_format(_("%^s「ピンチだ!退却させてもらう!」", "%^s says 'It is the pinch! I will retreat'."), m_name);
                                        }
-#ifdef JP
-                                       msg_format("%^s¤¬¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë¤Î´¬Êª¤òÆɤó¤À¡£", m_name);
-                                       msg_format("%^s¤¬¾Ã¤¨µî¤Ã¤¿¡£", m_name);
-#else
-                                       msg_format("%^s read a scroll of teleport level.", m_name);
-                                       msg_format("%^s disappears.", m_name);
-#endif
+                                       msg_format(_("%^sがテレポート・レベルの巻物を読んだ。", "%^s read a scroll of teleport level."), m_name);
+                                       msg_format(_("%^sが消え去った。", "%^s disappears."), m_name);
                                }
 
                                if (is_riding_mon && rakuba(-1, FALSE))
                                {
-#ifdef JP
-                                       msg_print("ÃÏÌ̤ËÍî¤È¤µ¤ì¤¿¡£");
-#else
-                                       msg_print("You have fallen from riding pet.");
-#endif
+                                       msg_print(_("地面に落とされた。", "You have fallen from riding pet."));
                                }
 
                                /* Check for quest completion */
@@ -2475,7 +2300,7 @@ msg_print("
        }
 
        /* Handle "sleep" */
-       if (m_ptr->csleep)
+       if (MON_CSLEEP(m_ptr))
        {
                /* Handle non-aggravation - Still sleeping */
                if (!(p_ptr->cursed & TRC_AGGRAVATE)) return;
@@ -2483,9 +2308,7 @@ msg_print("
                /* Handle aggravation */
 
                /* Reset sleep counter */
-               m_ptr->csleep = 0;
-
-               if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+               (void)set_monster_csleep(m_idx, 0);
 
                /* Notice the "waking up" */
                if (m_ptr->ml)
@@ -2496,26 +2319,18 @@ msg_print("
                        monster_desc(m_name, m_ptr, 0);
 
                        /* Dump a message */
-#ifdef JP
-                       msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
-#else
-                       msg_format("%^s wakes up.", m_name);
-#endif
-
-                       /* Redraw the health bar */
-                       if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
-                       if (is_riding_mon) p_ptr->redraw |= (PR_UHEALTH);
+                       msg_format(_("%^sが目を覚ました。", "%^s wakes up."), m_name);
+               }
 
-                       /* Hack -- Count the wakings */
-                       if (r_ptr->r_wake < MAX_UCHAR)
-                       {
-                               r_ptr->r_wake++;
-                       }
+               /* Hack -- Count the wakings */
+               if (is_original_ap_and_seen(m_ptr) && (r_ptr->r_wake < MAX_UCHAR))
+               {
+                       r_ptr->r_wake++;
                }
        }
 
        /* Handle "stun" */
-       if (m_ptr->stunned)
+       if (MON_STUNNED(m_ptr))
        {
                /* Sometimes skip move */
                if (one_in_(2)) return;
@@ -2543,13 +2358,12 @@ msg_print("
 
        if (gets_angry)
        {
-               char m_name[80];
-               monster_desc(m_name, m_ptr, 0);
-#ifdef JP
-msg_format("%^s¤ÏÆÍÁ³Å¨¤Ë¤Þ¤ï¤Ã¤¿¡ª", m_name);
-#else
-               msg_format("%^s suddenly becomes hostile!", m_name);
-#endif
+               if (is_pet(m_ptr) || see_m)
+               {
+                       char m_name[80];
+                       monster_desc(m_name, m_ptr, is_pet(m_ptr) ? MD_ASSUME_VISIBLE : 0);
+                       msg_format(_("%^sは突然敵にまわった!", "%^s suddenly becomes hostile!"), m_name);
+               }
 
                set_hostile(m_ptr);
        }
@@ -2576,6 +2390,9 @@ msg_format("%^s
                        }
                }
 
+               /* Hex */
+               if (multiply_barrier(m_idx)) k = 8;
+
                /* Hack -- multiply slower in crowded areas */
                if ((k < 4) && (!k || !randint0(k * MON_MULT_ADJ)))
                {
@@ -2583,7 +2400,7 @@ msg_format("%^s
                        if (multiply_monster(m_idx, FALSE, (is_pet(m_ptr) ? PM_FORCE_PET : 0)))
                        {
                                /* Take note if visible */
-                               if (m_ptr->ml && m_list[hack_m_idx_ii].ml && is_original_ap(m_ptr))
+                               if (m_list[hack_m_idx_ii].ml && is_original_ap_and_seen(m_ptr))
                                {
                                        r_ptr->r_flags2 |= (RF2_MULTIPLY);
                                }
@@ -2595,7 +2412,7 @@ msg_format("%^s
        }
 
 
-       if (r_ptr->flags6 & RF6_SPECIAL)
+       if (r_ptr->a_ability_flags2 & RF6_SPECIAL)
        {
                /* Hack -- Ohmu scatters molds! */
                if (m_ptr->r_idx == MON_OHMU)
@@ -2610,13 +2427,13 @@ msg_format("%^s
 
                                        for (k = 0; k < 6; k++)
                                        {
-                                               if (summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_BIZARRE1, (PM_ALLOW_GROUP | p_mode)))
+                                               if (summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_MOLD, (PM_ALLOW_GROUP | p_mode)))
                                                {
                                                        if (m_list[hack_m_idx_ii].ml) count++;
                                                }
                                        }
 
-                                       if (count && m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags6 |= (RF6_SPECIAL);
+                                       if (count && is_original_ap_and_seen(m_ptr)) r_ptr->r_flags6 |= (RF6_SPECIAL);
                                }
                        }
                }
@@ -2631,19 +2448,14 @@ msg_format("%^s
                    !m_ptr->ml && (m_ptr->cdis <= MAX_SIGHT))
                {
                        if (disturb_minor) disturb(FALSE, FALSE);
-#ifdef JP
-msg_print("½Å¸ü¤Ê­²»¤¬Ê¹¤³¤¨¤¿¡£");
-#else
-                       msg_print("You hear heavy steps.");
-#endif
-
+                       msg_print(_("重厚な足音が聞こえた。", "You hear heavy steps."));
                }
 
                /* Some monsters can speak */
                if ((ap_r_ptr->flags2 & RF2_CAN_SPEAK) && aware &&
                    one_in_(SPEAK_CHANCE) &&
                    player_has_los_bold(oy, ox) &&
-                   projectable(oy, ox, py, px))
+                   projectable(oy, ox, p_ptr->y, p_ptr->x))
                {
                        char m_name[80];
                        char monmessage[1024];
@@ -2653,53 +2465,22 @@ msg_print("
                        if (m_ptr->ml)
                                monster_desc(m_name, m_ptr, 0);
                        else
-#ifdef JP
-strcpy(m_name, "¤½¤ì");
-#else
-                               strcpy(m_name, "It");
-#endif
-
+                               strcpy(m_name, _("それ", "It"));
 
                        /* Select the file for monster quotes */
-                       if (m_ptr->monfear)
-#ifdef JP
-filename = "monfear_j.txt";
-#else
-                               filename = "monfear.txt";
-#endif
-
+                       if (MON_MONFEAR(m_ptr))
+                               filename = _("monfear_j.txt", "monfear.txt");
                        else if (is_pet(m_ptr))
-#ifdef JP
-filename = "monpet_j.txt";
-#else
-                               filename = "monpet.txt";
-#endif
-
+                               filename = _("monpet_j.txt", "monpet.txt");
                        else if (is_friendly(m_ptr))
-#ifdef JP
-filename = "monfrien_j.txt";
-#else
-                               filename = "monfrien.txt";
-#endif
-
+                               filename = _("monfrien_j.txt", "monfrien.txt");
                        else
-#ifdef JP
-                               filename = "monspeak_j.txt";
-#else
-                               filename = "monspeak.txt";
-#endif
-
-
+                               filename = _("monspeak_j.txt", "monspeak.txt");
                        /* Get the monster line */
                        if (get_rnd_line(filename, m_ptr->ap_r_idx, monmessage) == 0)
                        {
                                /* Say something */
-#ifdef JP
-msg_format("%^s%s", m_name, monmessage);
-#else
-                               msg_format("%^s %s", m_name, monmessage);
-#endif
-
+                               msg_format(_("%^s%s", "%^s %s"), m_name, monmessage);
                        }
                }
        }
@@ -2749,7 +2530,7 @@ msg_format("%^s%s", m_name, monmessage);
 
 
        /* Confused -- 100% random */
-       if (m_ptr->confused || !aware)
+       if (MON_CONFUSED(m_ptr) || !aware)
        {
                /* Try four "random" directions */
                mm[0] = mm[1] = mm[2] = mm[3] = 5;
@@ -2760,7 +2541,7 @@ msg_format("%^s%s", m_name, monmessage);
                 (randint0(100) < 75))
        {
                /* Memorize flags */
-               if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags1 |= (RF1_RAND_50 | RF1_RAND_25);
+               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags1 |= (RF1_RAND_50 | RF1_RAND_25);
 
                /* Try four "random" directions */
                mm[0] = mm[1] = mm[2] = mm[3] = 5;
@@ -2771,7 +2552,7 @@ msg_format("%^s%s", m_name, monmessage);
                                (randint0(100) < 50))
        {
                /* Memorize flags */
-               if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags1 |= (RF1_RAND_50);
+               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags1 |= (RF1_RAND_50);
 
                /* Try four "random" directions */
                mm[0] = mm[1] = mm[2] = mm[3] = 5;
@@ -2782,7 +2563,7 @@ msg_format("%^s%s", m_name, monmessage);
                                (randint0(100) < 25))
        {
                /* Memorize flags */
-               if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags1 |= RF1_RAND_25;
+               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags1 |= RF1_RAND_25;
 
                /* Try four "random" directions */
                mm[0] = mm[1] = mm[2] = mm[3] = 5;
@@ -2835,7 +2616,7 @@ msg_format("%^s%s", m_name, monmessage);
                                (void)get_moves(m_idx, mm);
 
                                /* Restore the leash */
-                               p_ptr->pet_follow_distance = dis;
+                               p_ptr->pet_follow_distance = (s16b)dis;
                        }
                }
        }
@@ -2860,6 +2641,7 @@ msg_format("%^s%s", m_name, monmessage);
        do_turn = FALSE;
        do_move = FALSE;
        do_view = FALSE;
+       must_alter_to_move = FALSE;
 
        /* Assume nothing */
        did_open_door = FALSE;
@@ -2901,12 +2683,26 @@ msg_format("%^s%s", m_name, monmessage);
                        do_move = TRUE;
                }
 
+               /* Possibly a monster to attack */
                else if (c_ptr->m_idx)
                {
-                       /* Possibly a monster to attack */
                        do_move = TRUE;
                }
 
+               /* Monster destroys walls (and doors) */
+               else if ((r_ptr->flags2 & RF2_KILL_WALL) &&
+                        (can_cross ? !have_flag(f_ptr->flags, FF_LOS) : !is_riding_mon) &&
+                        have_flag(f_ptr->flags, FF_HURT_DISI) && !have_flag(f_ptr->flags, FF_PERMANENT) &&
+                        check_hp_for_feat_destruction(f_ptr, m_ptr))
+               {
+                       /* Eat through walls/doors/rubble */
+                       do_move = TRUE;
+                       if (!can_cross) must_alter_to_move = TRUE;
+
+                       /* Monster destroyed a wall (later) */
+                       did_kill_wall = TRUE;
+               }
+
                /* Floor is open? */
                else if (can_cross)
                {
@@ -2915,36 +2711,17 @@ msg_format("%^s%s", m_name, monmessage);
 
                        /* Monster moves through walls (and doors) */
                        if ((r_ptr->flags2 & RF2_PASS_WALL) && (!is_riding_mon || p_ptr->pass_wall) &&
-                           !have_flag(f_ptr->flags, FF_MOVE))
+                           have_flag(f_ptr->flags, FF_CAN_PASS))
                        {
                                /* Monster went through a wall */
                                did_pass_wall = TRUE;
                        }
-
-                       if ((r_ptr->flags2 & RF2_KILL_WALL) && have_flag(f_ptr->flags, FF_TUNNEL) &&
-                           !have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_PERMANENT))
-                       {
-                               /* Monster destroyed a wall (later) */
-                               did_kill_wall = TRUE;
-                       }
-               }
-
-               /* Monster destroys walls (and doors) */
-               else if ((r_ptr->flags2 & RF2_KILL_WALL) && !is_riding_mon &&
-                        have_flag(f_ptr->flags, FF_TUNNEL) && !have_flag(f_ptr->flags, FF_PERMANENT))
-               {
-                       /* Eat through walls/doors/rubble */
-                       do_move = TRUE;
-
-                       /* Monster destroyed a wall (later) */
-                       did_kill_wall = TRUE;
                }
 
                /* Handle doors and secret doors */
                else if (is_closed_door(c_ptr->feat))
                {
                        bool may_bash = TRUE;
-                       feature_type *f_ptr = &f_info[c_ptr->feat];
 
                        /* Assume no move allowed */
                        do_move = FALSE;
@@ -2962,8 +2739,8 @@ msg_format("%^s%s", m_name, monmessage);
                                        /* Do not bash the door */
                                        may_bash = FALSE;
 
-                                       /* Assume no move allowed */
-                                       do_move = TRUE;
+                                       /* Take a turn */
+                                       do_turn = TRUE;
                                }
 
                                /* Locked doors (not jammed) */
@@ -2973,10 +2750,13 @@ msg_format("%^s%s", m_name, monmessage);
                                        if (randint0(m_ptr->hp / 10) > f_ptr->power)
                                        {
                                                /* Unlock the door */
-                                               cave_alter_feat(ny, nx, FF_OPEN);
+                                               cave_alter_feat(ny, nx, FF_DISARM);
 
                                                /* Do not bash the door */
                                                may_bash = FALSE;
+
+                                               /* Take a turn */
+                                               do_turn = TRUE;
                                        }
                                }
                        }
@@ -2986,14 +2766,13 @@ msg_format("%^s%s", m_name, monmessage);
                                (!is_pet(m_ptr) || (p_ptr->pet_extra_flags & PF_OPEN_DOORS)))
                        {
                                /* Attempt to Bash XXX XXX XXX */
-                               if (randint0(m_ptr->hp / 10) > f_ptr->power)
+                               if (check_hp_for_feat_destruction(f_ptr, m_ptr) && (randint0(m_ptr->hp / 10) > f_ptr->power))
                                {
                                        /* Message */
-#ifdef JP
-                                       msg_print("¥É¥¢¤ò᤭³«¤±¤ë²»¤¬¤·¤¿¡ª");
-#else
-                                       msg_print("You hear a door burst open!");
-#endif
+                                       if (have_flag(f_ptr->flags, FF_GLASS))
+                                               msg_print(_("ガラスが砕ける音がした!", "You hear a glass was crashed!"));
+                                       else
+                                               msg_print(_("ドアを叩き開ける音がした!", "You hear a door burst open!"));
 
                                        /* Disturb (sometimes) */
                                        if (disturb_minor) disturb(0, 0);
@@ -3003,6 +2782,7 @@ msg_format("%^s%s", m_name, monmessage);
 
                                        /* Hack -- fall into doorway */
                                        do_move = TRUE;
+                                       must_alter_to_move = TRUE;
                                }
                        }
 
@@ -3011,9 +2791,19 @@ msg_format("%^s%s", m_name, monmessage);
                        if (did_open_door || did_bash_door)
                        {
                                /* Break down the door */
-                               if (did_bash_door && ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat)))
+                               if (did_bash_door && ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat) || have_flag(f_ptr->flags, FF_GLASS)))
                                {
                                        cave_alter_feat(ny, nx, FF_BASH);
+
+                                       if (!m_ptr->r_idx) /* Killed by shards of glass, etc. */
+                                       {
+                                               /* Update some things */
+                                               p_ptr->update |= (PU_FLOW);
+                                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_BASH_DOOR);
+
+                                               return;
+                                       }
                                }
 
                                /* Open the door */
@@ -3022,8 +2812,10 @@ msg_format("%^s%s", m_name, monmessage);
                                        cave_alter_feat(ny, nx, FF_OPEN);
                                }
 
+                               f_ptr = &f_info[c_ptr->feat];
+
                                /* Handle viewable doors */
-                               if (player_has_los_bold(ny, nx)) do_view = TRUE;
+                               do_view = TRUE;
                        }
                }
 
@@ -3040,11 +2832,7 @@ msg_format("%^s%s", m_name, monmessage);
                                /* Describe observable breakage */
                                if (c_ptr->info & CAVE_MARK)
                                {
-#ifdef JP
-                                       msg_print("¼é¤ê¤Î¥ë¡¼¥ó¤¬²õ¤ì¤¿¡ª");
-#else
-                                       msg_print("The rune of protection is broken!");
-#endif
+                                       msg_print(_("守りのルーンが壊れた!", "The rune of protection is broken!"));
                                }
 
                                /* Forget the rune */
@@ -3076,22 +2864,13 @@ msg_format("%^s%s", m_name, monmessage);
                                        /* Describe observable breakage */
                                        if (c_ptr->info & CAVE_MARK)
                                        {
-#ifdef JP
-                                               msg_print("¥ë¡¼¥ó¤¬Çúȯ¤·¤¿¡ª");
-#else
-                                               msg_print("The rune explodes!");
-#endif
-
+                                               msg_print(_("ルーンが爆発した!", "The rune explodes!"));
                                                project(0, 2, ny, nx, 2 * (p_ptr->lev + damroll(7, 7)), GF_MANA, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
                                        }
                                }
                                else
                                {
-#ifdef JP
-                                       msg_print("Çúȯ¤Î¥ë¡¼¥ó¤Ï²ò½ü¤µ¤ì¤¿¡£");
-#else
-                                       msg_print("An explosive rune was disarmed.");
-#endif
+                                       msg_print(_("爆発のルーンは解除された。", "An explosive rune was disarmed."));
                                }
 
                                /* Forget the rune */
@@ -3117,7 +2896,7 @@ msg_format("%^s%s", m_name, monmessage);
                        if (r_ptr->flags1 & RF1_NEVER_BLOW)
                        {
                                /* Hack -- memorize lack of attacks */
-                               if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags1 |= (RF1_NEVER_BLOW);
+                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags1 |= (RF1_NEVER_BLOW);
 
                                /* Do not move */
                                do_move = FALSE;
@@ -3126,12 +2905,12 @@ msg_format("%^s%s", m_name, monmessage);
                        /* In anti-melee dungeon, stupid or confused monster takes useless turn */
                        if (do_move && (d_info[dungeon_type].flags1 & DF1_NO_MELEE))
                        {
-                               if (!m_ptr->confused)
+                               if (!MON_CONFUSED(m_ptr))
                                {
                                        if (!(r_ptr->flags2 & RF2_STUPID)) do_move = FALSE;
                                        else
                                        {
-                                               if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags2 |= (RF2_STUPID);
+                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_STUPID);
                                        }
                                }
                        }
@@ -3165,13 +2944,13 @@ msg_format("%^s%s", m_name, monmessage);
                        if (((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW) &&
                                 (r_ptr->mexp * r_ptr->level > z_ptr->mexp * z_ptr->level) &&
                                 can_cross && (c_ptr->m_idx != p_ptr->riding)) ||
-                               are_enemies(m_ptr, y_ptr) || m_ptr->confused)
+                               are_enemies(m_ptr, y_ptr) || MON_CONFUSED(m_ptr))
                        {
                                if (!(r_ptr->flags1 & RF1_NEVER_BLOW))
                                {
                                        if (r_ptr->flags2 & RF2_KILL_BODY)
                                        {
-                                               if (is_original_ap(m_ptr)) r_ptr->r_flags2 |= (RF2_KILL_BODY);
+                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_KILL_BODY);
                                        }
 
                                        /* attack */
@@ -3182,10 +2961,10 @@ msg_format("%^s%s", m_name, monmessage);
                                                /* In anti-melee dungeon, stupid or confused monster takes useless turn */
                                                else if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
                                                {
-                                                       if (m_ptr->confused) return;
+                                                       if (MON_CONFUSED(m_ptr)) return;
                                                        else if (r_ptr->flags2 & RF2_STUPID)
                                                        {
-                                                               if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags2 |= (RF2_STUPID);
+                                                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_STUPID);
                                                                return;
                                                        }
                                                }
@@ -3194,7 +2973,7 @@ msg_format("%^s%s", m_name, monmessage);
                        }
 
                        /* Push past weaker monsters (unless leaving a wall) */
-                       else if ((r_ptr->flags2 & RF2_MOVE_BODY) &&
+                       else if ((r_ptr->flags2 & RF2_MOVE_BODY) && !(r_ptr->flags1 & RF1_NEVER_MOVE) &&
                                (r_ptr->mexp > z_ptr->mexp) &&
                                can_cross && (c_ptr->m_idx != p_ptr->riding) &&
                                monster_can_cross_terrain(cave[m_ptr->fy][m_ptr->fx].feat, z_ptr, 0))
@@ -3205,17 +2984,65 @@ msg_format("%^s%s", m_name, monmessage);
                                /* Monster pushed past another monster */
                                did_move_body = TRUE;
 
+                               /* Wake up the moved monster */
+                               (void)set_monster_csleep(c_ptr->m_idx, 0);
+
                                /* XXX XXX XXX Message */
                        }
                }
 
+               if (is_riding_mon)
+               {
+                       if (!p_ptr->riding_ryoute && !MON_MONFEAR(&m_list[p_ptr->riding])) do_move = FALSE;
+               }
+
+               if (did_kill_wall && do_move)
+               {
+                       if (one_in_(GRINDNOISE))
+                       {
+                               if (have_flag(f_ptr->flags, FF_GLASS))
+                                       msg_print(_("何かの砕ける音が聞こえる。", "There is a crashing sound."));
+                               else
+                                       msg_print(_("ギシギシいう音が聞こえる。", "There is a grinding sound."));
+                       }
+
+                       cave_alter_feat(ny, nx, FF_HURT_DISI);
+
+                       if (!m_ptr->r_idx) /* Killed by shards of glass, etc. */
+                       {
+                               /* Update some things */
+                               p_ptr->update |= (PU_FLOW);
+                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                               if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_KILL_WALL);
+
+                               return;
+                       }
+
+                       f_ptr = &f_info[c_ptr->feat];
+
+                       /* Note changes to viewable region */
+                       do_view = TRUE;
+
+                       /* Take a turn */
+                       do_turn = TRUE;
+               }
+
+               if (must_alter_to_move && (r_ptr->flags7 & RF7_AQUATIC))
+               {
+                       if (!monster_can_cross_terrain(c_ptr->feat, r_ptr, is_riding_mon ? CEM_RIDING : 0))
+                       {
+                               /* Assume no move allowed */
+                               do_move = FALSE;
+                       }
+               }
+
                /*
                 * Check if monster can cross terrain
                 * This is checked after the normal attacks
                 * to allow monsters to attack an enemy,
                 * even if it can't enter the terrain.
                 */
-               if (do_move && !can_cross && !did_kill_wall)
+               if (do_move && !can_cross && !did_kill_wall && !did_bash_door)
                {
                        /* Assume no move allowed */
                        do_move = FALSE;
@@ -3224,150 +3051,111 @@ msg_format("%^s%s", m_name, monmessage);
                /* Some monsters never move */
                if (do_move && (r_ptr->flags1 & RF1_NEVER_MOVE))
                {
-                       /* Hack -- memorize lack of attacks */
-                       if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flags1 |= (RF1_NEVER_MOVE);
+                       /* Hack -- memorize lack of moves */
+                       if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags1 |= (RF1_NEVER_MOVE);
 
                        /* Do not move */
                        do_move = FALSE;
                }
 
-               if (is_riding_mon)
-               {
-                       if (!p_ptr->riding_ryoute && !(m_list[p_ptr->riding].monfear)) do_move = FALSE;
-               }
-
                /* Creature has been allowed move */
                if (do_move)
                {
-                       s16b this_o_idx, next_o_idx;
-
                        /* Take a turn */
                        do_turn = TRUE;
 
-                       /* Hack -- Update the old location */
-                       cave[oy][ox].m_idx = c_ptr->m_idx;
-
-                       if (did_kill_wall)
+                       if (have_flag(f_ptr->flags, FF_TREE))
                        {
-                               if (one_in_(GRINDNOISE))
-                               {
-#ifdef JP
-                                       msg_print("¥®¥·¥®¥·¤¤¤¦²»¤¬Ê¹¤³¤¨¤ë¡£");
-#else
-                                       msg_print("There is a grinding sound.");
-#endif
-                               }
-
-                               cave_alter_feat(ny, nx, FF_HURT_DISI);
-
-                               /* Note changes to viewable region */
-                               if (player_has_los_bold(ny, nx)) do_view = TRUE;
-                       }
-                       else if (have_flag(f_ptr->flags, FF_TREE))
-                       {
-                               if (!(r_ptr->flags7 & RF7_CAN_FLY) && (!is_riding_mon || !p_ptr->ffall) && !(r_ptr->flags8 & RF8_WILD_WOOD))
+                               if (!(r_ptr->flags7 & RF7_CAN_FLY) && !(r_ptr->flags8 & RF8_WILD_WOOD))
                                {
                                        m_ptr->energy_need += ENERGY_NEED();
                                }
                        }
 
-                       /* Mega-Hack -- move the old monster, if any */
-                       if (c_ptr->m_idx)
+                       if (!is_riding_mon)
                        {
-                               /* Move the old monster */
-                               y_ptr->fy = oy;
-                               y_ptr->fx = ox;
+                               /* Hack -- Update the old location */
+                               cave[oy][ox].m_idx = c_ptr->m_idx;
 
-                               /* Update the old monster */
-                               update_mon(c_ptr->m_idx, TRUE);
+                               /* Mega-Hack -- move the old monster, if any */
+                               if (c_ptr->m_idx)
+                               {
+                                       /* Move the old monster */
+                                       y_ptr->fy = oy;
+                                       y_ptr->fx = ox;
 
-                               /* Wake up the moved monster */
-                               y_ptr->csleep = 0;
+                                       /* Update the old monster */
+                                       update_mon(c_ptr->m_idx, TRUE);
+                               }
 
-                               if (r_info[y_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
-                                       p_ptr->update |= (PU_MON_LITE);
-                       }
+                               /* Hack -- Update the new location */
+                               c_ptr->m_idx = (s16b)m_idx;
 
-                       /* Hack -- Update the new location */
-                       c_ptr->m_idx = m_idx;
+                               /* Move the monster */
+                               m_ptr->fy = ny;
+                               m_ptr->fx = nx;
 
-                       /* Move the monster */
-                       m_ptr->fy = ny;
-                       m_ptr->fx = nx;
+                               /* Update the monster */
+                               update_mon(m_idx, TRUE);
 
-                       /* Update the monster */
-                       update_mon(m_idx, TRUE);
+                               /* Redraw the old grid */
+                               lite_spot(oy, ox);
 
-                       if (is_riding_mon)
-                       {
-                               py = ny;
-                               px = nx;
+                               /* Redraw the new grid */
+                               lite_spot(ny, nx);
                        }
-
-                       /* Redraw the old grid */
-                       lite_spot(oy, ox);
-
-                       /* Redraw the new grid */
-                       lite_spot(ny, nx);
-
-                       if (is_riding_mon)
+                       else
                        {
-                               verify_panel();
-
-                               /* Update stuff */
-                               p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
-
-                               /* Update the monsters */
-                               p_ptr->update |= (PU_DISTANCE);
+                               /* Sound */
+                               /* sound(SOUND_WALK); */
 
-                               /* Update sub-windows */
-                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                               /* Move the player */
+                               if (!move_player_effect(ny, nx, MPE_DONT_PICKUP)) break;
                        }
 
                        /* Possible disturb */
                        if (m_ptr->ml &&
                            (disturb_move ||
-                            (disturb_near && (m_ptr->mflag & MFLAG_VIEW)) ||
+                            (disturb_near && (m_ptr->mflag & MFLAG_VIEW) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)) ||
                             (disturb_high && ap_r_ptr->r_tkills && ap_r_ptr->level >= p_ptr->lev)))
                        {
                                /* Disturb */
                                if (is_hostile(m_ptr))
-                                       disturb(0, 0);
+                                       disturb(0, 1);
                        }
 
-                       /* Scan all objects in the grid */
-                       for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
+                       /* Take or Kill objects on the floor */
+                       if (c_ptr->o_idx && (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) &&
+                           (!is_pet(m_ptr) || ((p_ptr->pet_extra_flags & PF_PICKUP_ITEMS) && (r_ptr->flags2 & RF2_TAKE_ITEM))))
                        {
-                               object_type *o_ptr;
-
-                               /* Acquire object */
-                               o_ptr = &o_list[this_o_idx];
-
-                               /* Acquire next object */
-                               next_o_idx = o_ptr->next_o_idx;
-
-                               /* Skip gold */
-                               if (o_ptr->tval == TV_GOLD) continue;
+                               s16b this_o_idx, next_o_idx;
+                               bool do_take = (r_ptr->flags2 & RF2_TAKE_ITEM) ? TRUE : FALSE;
 
-                               /*
-                                * Skip "real" corpses and statues, to avoid extreme
-                                * silliness like a novice rogue pockets full of statues
-                                * and corpses.
-                                */
-                               if ((o_ptr->tval == TV_CORPSE) ||
-                                   (o_ptr->tval == TV_STATUE)) continue;
-
-                               /* Take or Kill objects on the floor */
-                               if ((r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) &&
-                                        (!is_pet(m_ptr) || (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS)))
+                               /* Scan all objects in the grid */
+                               for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
                                {
-                                       u32b flgs[TR_FLAG_SIZE];
+                                       u32b flgs[TR_FLAG_SIZE], flg2 = 0L, flg3 = 0L, flgr = 0L;
+                                       char m_name[80], o_name[MAX_NLEN];
 
-                                       u32b flg2 = 0L;
-                                       u32b flg3 = 0L;
+                                       /* Acquire object */
+                                       object_type *o_ptr = &o_list[this_o_idx];
 
-                                       char m_name[80];
-                                       char o_name[MAX_NLEN];
+                                       /* Acquire next object */
+                                       next_o_idx = o_ptr->next_o_idx;
+
+                                       if (do_take)
+                                       {
+                                               /* Skip gold */
+                                               if (o_ptr->tval == TV_GOLD) continue;
+
+                                               /*
+                                                * Skip "real" corpses and statues, to avoid extreme
+                                                * silliness like a novice rogue pockets full of statues
+                                                * and corpses.
+                                                */
+                                               if ((o_ptr->tval == TV_CORPSE) ||
+                                                   (o_ptr->tval == TV_STATUE)) continue;
+                                       }
 
                                        /* Extract some flags */
                                        object_flags(o_ptr, flgs);
@@ -3379,12 +3167,12 @@ msg_format("%^s%s", m_name, monmessage);
                                        monster_desc(m_name, m_ptr, MD_INDEF_HIDDEN);
 
                                        /* React to objects that hurt the monster */
-                                       if (have_flag(flgs, TR_KILL_DRAGON)) flg3 |= (RF3_DRAGON);
                                        if (have_flag(flgs, TR_SLAY_DRAGON)) flg3 |= (RF3_DRAGON);
+                                       if (have_flag(flgs, TR_KILL_DRAGON)) flg3 |= (RF3_DRAGON);
                                        if (have_flag(flgs, TR_SLAY_TROLL))  flg3 |= (RF3_TROLL);
                                        if (have_flag(flgs, TR_KILL_TROLL))  flg3 |= (RF3_TROLL);
-                                       if (have_flag(flgs, TR_KILL_GIANT))  flg3 |= (RF3_GIANT);
                                        if (have_flag(flgs, TR_SLAY_GIANT))  flg3 |= (RF3_GIANT);
+                                       if (have_flag(flgs, TR_KILL_GIANT))  flg3 |= (RF3_GIANT);
                                        if (have_flag(flgs, TR_SLAY_ORC))    flg3 |= (RF3_ORC);
                                        if (have_flag(flgs, TR_KILL_ORC))    flg3 |= (RF3_ORC);
                                        if (have_flag(flgs, TR_SLAY_DEMON))  flg3 |= (RF3_DEMON);
@@ -3397,13 +3185,18 @@ msg_format("%^s%s", m_name, monmessage);
                                        if (have_flag(flgs, TR_KILL_EVIL))   flg3 |= (RF3_EVIL);
                                        if (have_flag(flgs, TR_SLAY_HUMAN))  flg2 |= (RF2_HUMAN);
                                        if (have_flag(flgs, TR_KILL_HUMAN))  flg2 |= (RF2_HUMAN);
+                                       if (have_flag(flgs, TR_BRAND_ACID))  flgr |= (RFR_IM_ACID);
+                                       if (have_flag(flgs, TR_BRAND_ELEC))  flgr |= (RFR_IM_ELEC);
+                                       if (have_flag(flgs, TR_BRAND_FIRE))  flgr |= (RFR_IM_FIRE);
+                                       if (have_flag(flgs, TR_BRAND_COLD))  flgr |= (RFR_IM_COLD);
+                                       if (have_flag(flgs, TR_BRAND_POIS))  flgr |= (RFR_IM_POIS);
 
                                        /* The object cannot be picked up by the monster */
-                                       if (artifact_p(o_ptr) || (r_ptr->flags3 & flg3) || (r_ptr->flags2 & flg2) ||
-                                               (o_ptr->art_name))
+                                       if (object_is_artifact(o_ptr) || (r_ptr->flags3 & flg3) || (r_ptr->flags2 & flg2) ||
+                                           ((~(r_ptr->flagsr) & flgr) && !(r_ptr->flagsr & RFR_RES_ALL)))
                                        {
                                                /* Only give a message for "take_item" */
-                                               if ((r_ptr->flags2 & (RF2_TAKE_ITEM)) && (r_ptr->flags2 & (RF2_STUPID)))
+                                               if (do_take && (r_ptr->flags2 & RF2_STUPID))
                                                {
                                                        /* Take note */
                                                        did_take_item = TRUE;
@@ -3412,17 +3205,13 @@ msg_format("%^s%s", m_name, monmessage);
                                                        if (m_ptr->ml && player_can_see_bold(ny, nx))
                                                        {
                                                                /* Dump a message */
-#ifdef JP
-                                                               msg_format("%^s¤Ï%s¤ò½¦¤ª¤¦¤È¤·¤¿¤¬¡¢¤À¤á¤À¤Ã¤¿¡£", m_name, o_name);
-#else
-                                                               msg_format("%^s tries to pick up %s, but fails.", m_name, o_name);
-#endif
+                                                               msg_format(_("%^sは%sを拾おうとしたが、だめだった。", "%^s tries to pick up %s, but fails."), m_name, o_name);
                                                        }
                                                }
                                        }
 
                                        /* Pick up the item */
-                                       else if (r_ptr->flags2 & RF2_TAKE_ITEM)
+                                       else if (do_take)
                                        {
                                                /* Take note */
                                                did_take_item = TRUE;
@@ -3431,24 +3220,20 @@ msg_format("%^s%s", m_name, monmessage);
                                                if (player_can_see_bold(ny, nx))
                                                {
                                                        /* Dump a message */
-#ifdef JP
-                                                       msg_format("%^s¤¬%s¤ò½¦¤Ã¤¿¡£", m_name, o_name);
-#else
-                                                       msg_format("%^s picks up %s.", m_name, o_name);
-#endif
+                                                       msg_format(_("%^sが%sを拾った。", "%^s picks up %s."), m_name, o_name);
                                                }
 
                                                /* Excise the object */
                                                excise_object_idx(this_o_idx);
 
                                                /* Forget mark */
-                                               o_ptr->marked = 0;
+                                               o_ptr->marked &= OM_TOUCHED;
 
                                                /* Forget location */
                                                o_ptr->iy = o_ptr->ix = 0;
 
                                                /* Memorize monster */
-                                               o_ptr->held_m_idx = m_idx;
+                                               o_ptr->held_m_idx = (s16b)m_idx;
 
                                                /* Build a stack */
                                                o_ptr->next_o_idx = m_ptr->hold_o_idx;
@@ -3467,11 +3252,7 @@ msg_format("%^s%s", m_name, monmessage);
                                                if (player_has_los_bold(ny, nx))
                                                {
                                                        /* Dump a message */
-#ifdef JP
-                                                       msg_format("%^s¤¬%s¤òÇ˲õ¤·¤¿¡£", m_name, o_name);
-#else
-                                                       msg_format("%^s destroys %s.", m_name, o_name);
-#endif
+                                                       msg_format(_("%^sが%sを破壊した。", "%^s destroys %s."), m_name, o_name);
                                                }
 
                                                /* Delete the object */
@@ -3493,7 +3274,7 @@ msg_format("%^s%s", m_name, monmessage);
                m_ptr->mflag2 &= ~MFLAG2_NOFLOW;
 
        /* If we haven't done anything, try casting a spell again */
-       if (!do_turn && !do_move && !m_ptr->monfear && !is_riding_mon && aware)
+       if (!do_turn && !do_move && !MON_MONFEAR(m_ptr) && !is_riding_mon && aware)
        {
                /* Try to cast spell again */
                if (r_ptr->freq_spell && randint1(100) <= r_ptr->freq_spell)
@@ -3507,7 +3288,7 @@ msg_format("%^s%s", m_name, monmessage);
        if (do_view)
        {
                /* Update some things */
-               p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS | PU_MON_LITE);
+               p_ptr->update |= (PU_FLOW);
 
                /* Window stuff */
                p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
@@ -3522,7 +3303,7 @@ msg_format("%^s%s", m_name, monmessage);
        }
 
        /* Learn things from observable monster */
-       if (m_ptr->ml && is_original_ap(m_ptr))
+       if (is_original_ap_and_seen(m_ptr))
        {
                /* Monster opened a door */
                if (did_open_door) r_ptr->r_flags2 |= (RF2_OPEN_DOOR);
@@ -3548,13 +3329,13 @@ msg_format("%^s%s", m_name, monmessage);
 
 
        /* Hack -- get "bold" if out of options */
-       if (!do_turn && !do_move && m_ptr->monfear && aware)
+       if (!do_turn && !do_move && MON_MONFEAR(m_ptr) && aware)
        {
                /* No longer afraid */
-               m_ptr->monfear = 0;
+               (void)set_monster_monfear(m_idx, 0);
 
                /* Message if seen */
-               if (m_ptr->ml)
+               if (see_m)
                {
                        char m_name[80];
 
@@ -3562,58 +3343,53 @@ msg_format("%^s%s", m_name, monmessage);
                        monster_desc(m_name, m_ptr, 0);
 
                        /* Dump a message */
-#ifdef JP
-msg_format("%^s¤ÏÀ襤¤ò·è°Õ¤·¤¿¡ª", m_name);
-#else
-                       msg_format("%^s turns to fight!", m_name);
-#endif
-
-                       /* Redraw (later) if needed */
-                       if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
-
-                       chg_virtue(V_COMPASSION, -1);
+                       msg_format(_("%^sは戦いを決意した!", "%^s turns to fight!"), m_name);
                }
 
+               if (m_ptr->ml) chg_virtue(V_COMPASSION, -1);
+
                /* XXX XXX XXX Actually do something now (?) */
        }
 }
 
-/*
+/*!
+ * @brief 全モンスターのターン管理メインルーチン /
  * Process all the "live" monsters, once per game turn.
- *
- * During each game turn, we scan through the list of all the "live" monsters,
- * (backwards, so we can excise any "freshly dead" monsters), energizing each
- * monster, and allowing fully energized monsters to move, attack, pass, etc.
- *
- * Note that monsters can never move in the monster array (except when the
- * "compact_monsters()" function is called by "dungeon()" or "save_player()").
- *
- * This function is responsible for at least half of the processor time
- * on a normal system with a "normal" amount of monsters and a player doing
- * normal things.
- *
- * When the player is resting, virtually 90% of the processor time is spent
- * in this function, and its children, "process_monster()" and "make_move()".
- *
- * Most of the rest of the time is spent in "update_view()" and "lite_spot()",
- * especially when the player is running.
- *
- * Note the special "MFLAG_BORN" flag, which allows us to ignore "fresh"
- * monsters while they are still being "born".  A monster is "fresh" only
- * during the turn in which it is created, and we use the "hack_m_idx" to
- * determine if the monster is yet to be processed during the current turn.
- *
- * Note the special "MFLAG_NICE" flag, which allows the player to get one
- * move before any "nasty" monsters get to use their spell attacks.
- *
- * Note that when the "knowledge" about the currently tracked monster
- * changes (flags, attacks, spells), we induce a redraw of the monster
- * recall window.
+ * @return なし
+ * @details
+ * During each game turn, we scan through the list of all the "live" monsters,\n
+ * (backwards, so we can excise any "freshly dead" monsters), energizing each\n
+ * monster, and allowing fully energized monsters to move, attack, pass, etc.\n
+ *\n
+ * Note that monsters can never move in the monster array (except when the\n
+ * "compact_monsters()" function is called by "dungeon()" or "save_player()").\n
+ *\n
+ * This function is responsible for at least half of the processor time\n
+ * on a normal system with a "normal" amount of monsters and a player doing\n
+ * normal things.\n
+ *\n
+ * When the player is resting, virtually 90% of the processor time is spent\n
+ * in this function, and its children, "process_monster()" and "make_move()".\n
+ *\n
+ * Most of the rest of the time is spent in "update_view()" and "lite_spot()",\n
+ * especially when the player is running.\n
+ *\n
+ * Note the special "MFLAG_BORN" flag, which allows us to ignore "fresh"\n
+ * monsters while they are still being "born".  A monster is "fresh" only\n
+ * during the turn in which it is created, and we use the "hack_m_idx" to\n
+ * determine if the monster is yet to be processed during the current turn.\n
+ *\n
+ * Note the special "MFLAG_NICE" flag, which allows the player to get one\n
+ * move before any "nasty" monsters get to use their spell attacks.\n
+ *\n
+ * Note that when the "knowledge" about the currently tracked monster\n
+ * changes (flags, attacks, spells), we induce a redraw of the monster\n
+ * recall window.\n
  */
 void process_monsters(void)
 {
-       int             i;
-       int             fx, fy;
+       IDX i;
+       POSITION fx, fy;
 
        bool            test;
 
@@ -3722,19 +3498,19 @@ void process_monsters(void)
                }
 
                /* Handle "sight" and "aggravation" */
-               else if ((m_ptr->cdis <= MAX_SIGHT) &&
+        else if ((m_ptr->cdis <= MAX_SIGHT || p_ptr->inside_battle) &&
                        (player_has_los_bold(fy, fx) || (p_ptr->cursed & TRC_AGGRAVATE)))
                {
                        /* We can "see" or "feel" the player */
                        test = TRUE;
                }
 
-#if 0 /* (cave[py][px].when == cave[fy][fx].when) is always FALSE... */
+#if 0 /* (cave[p_ptr->y][p_ptr->x].when == cave[fy][fx].when) is always FALSE... */
                /* Hack -- Monsters can "smell" the player from far away */
                /* Note that most monsters have "aaf" of "20" or so */
                else if (!(m_ptr->mflag2 & MFLAG2_NOFLOW) &&
-                       have_flag(f_flags_bold(py, px), FF_MOVE) &&
-                       (cave[py][px].when == cave[fy][fx].when) &&
+                       cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_MOVE) &&
+                       (cave[p_ptr->y][p_ptr->x].when == cave[fy][fx].when) &&
                        (cave[fy][fx].dist < MONSTER_FLOW_DEPTH) &&
                        (cave[fy][fx].dist < r_ptr->aaf))
                {
@@ -3757,8 +3533,8 @@ void process_monsters(void)
                        /* Monsters move quickly in Nightmare mode */
                        if (ironman_nightmare) speed += 5;
 
-                       if (m_ptr->fast) speed += 10;
-                       if (m_ptr->slow) speed -= 10;
+                       if (MON_FAST(m_ptr)) speed += 10;
+                       if (MON_SLOW(m_ptr)) speed -= 10;
                }
 
                /* Give this monster some energy */
@@ -3820,8 +3596,683 @@ void process_monsters(void)
        }
 }
 
+/*!
+ * @brief モンスターの時限ステータスを取得する
+ * @return m_idx モンスターの参照ID
+ * @return mproc_type モンスターの時限ステータスID
+ * @return 残りターン値
+ */
+int get_mproc_idx(MONSTER_IDX m_idx, int mproc_type)
+{
+       s16b *cur_mproc_list = mproc_list[mproc_type];
+       int i;
+
+       for (i = mproc_max[mproc_type] - 1; i >= 0; i--)
+       {
+               if (cur_mproc_list[i] == m_idx) return i;
+       }
+
+       return -1;
+}
+
+/*!
+ * @brief モンスターの時限ステータスリストを追加する
+ * @return m_idx モンスターの参照ID
+ * @return mproc_type 追加したいモンスターの時限ステータスID
+ * @return なし
+ */
+static void mproc_add(MONSTER_IDX m_idx, int mproc_type)
+{
+       if (mproc_max[mproc_type] < max_m_idx) mproc_list[mproc_type][mproc_max[mproc_type]++] = (s16b)m_idx;
+}
+
+
+/*!
+ * @brief モンスターの時限ステータスリストを削除
+ * @return m_idx モンスターの参照ID
+ * @return mproc_type 削除したいモンスターの時限ステータスID
+ * @return なし
+ */
+static void mproc_remove(MONSTER_IDX m_idx, int mproc_type)
+{
+       int mproc_idx = get_mproc_idx(m_idx, mproc_type);
+       if (mproc_idx >= 0) mproc_list[mproc_type][mproc_idx] = mproc_list[mproc_type][--mproc_max[mproc_type]];
+}
+
+
+/*!
+ * @brief モンスターの時限ステータスリストを初期化する / Initialize monster process
+ * @return なし
+ */
+void mproc_init(void)
+{
+       monster_type *m_ptr;
+       MONSTER_IDX i;
+       int cmi;
+
+       /* Reset "mproc_max[]" */
+       for (cmi = 0; cmi < MAX_MTIMED; cmi++) mproc_max[cmi] = 0;
+
+       /* Process the monsters (backwards) */
+       for (i = m_max - 1; i >= 1; i--)
+       {
+               /* Access the monster */
+               m_ptr = &m_list[i];
+
+               /* Ignore "dead" monsters */
+               if (!m_ptr->r_idx) continue;
+
+               for (cmi = 0; cmi < MAX_MTIMED; cmi++)
+               {
+                       if (m_ptr->mtimed[cmi]) mproc_add(i, cmi);
+               }
+       }
+}
+
+
+/*!
+ * @brief モンスターの睡眠状態値をセットする /
+ * Set "m_ptr->mtimed[MTIMED_CSLEEP]", notice observable changes
+ * @param m_idx モンスター参照ID
+ * @param v セットする値
+ * @return 別途更新処理が必要な場合TRUEを返す
+ */
+bool set_monster_csleep(MONSTER_IDX m_idx, int v)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_CSLEEP(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_CSLEEP);
+                       notice = TRUE;
+               }
+       }
+
+       /* Shut */
+       else
+       {
+               if (MON_CSLEEP(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_CSLEEP);
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_CSLEEP] = (s16b)v;
+
+       if (!notice) return FALSE;
+
+       if (m_ptr->ml)
+       {
+               /* Update health bar as needed */
+               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+       }
+
+       if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+
+       return TRUE;
+}
+
+
+/*!
+ * @brief モンスターの加速状態値をセット /
+ * Set "m_ptr->mtimed[MTIMED_FAST]", notice observable changes
+ * @param m_idx モンスター参照ID
+ * @param v セットする値
+ * @return 別途更新処理が必要な場合TRUEを返す
+ */
+bool set_monster_fast(MONSTER_IDX m_idx, int v)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_FAST(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_FAST);
+                       notice = TRUE;
+               }
+       }
+
+       /* Shut */
+       else
+       {
+               if (MON_FAST(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_FAST);
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_FAST] = (s16b)v;
+
+       if (!notice) return FALSE;
+
+       if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);
+
+       return TRUE;
+}
+
+
+/*
+ * Set "m_ptr->mtimed[MTIMED_SLOW]", notice observable changes
+ */
+bool set_monster_slow(MONSTER_IDX m_idx, int v)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_SLOW(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_SLOW);
+                       notice = TRUE;
+               }
+       }
+
+       /* Shut */
+       else
+       {
+               if (MON_SLOW(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_SLOW);
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_SLOW] = (s16b)v;
+
+       if (!notice) return FALSE;
 
+       if ((p_ptr->riding == m_idx) && !p_ptr->leaving) p_ptr->update |= (PU_BONUS);
+
+       return TRUE;
+}
+
+
+/*!
+ * @brief モンスターの朦朧状態値をセット /
+ * Set "m_ptr->mtimed[MTIMED_STUNNED]", notice observable changes
+ * @param m_idx モンスター参照ID
+ * @param v セットする値
+ * @return 別途更新処理が必要な場合TRUEを返す
+ */
+bool set_monster_stunned(MONSTER_IDX m_idx, int v)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_STUNNED(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_STUNNED);
+                       notice = TRUE;
+               }
+       }
+
+       /* Shut */
+       else
+       {
+               if (MON_STUNNED(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_STUNNED);
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_STUNNED] = (s16b)v;
+
+       return notice;
+}
+
+
+/*!
+ * @brief モンスターの混乱状態値をセット /
+ * Set "m_ptr->mtimed[MTIMED_CONFUSED]", notice observable changes
+ * @param m_idx モンスター参照ID
+ * @param v セットする値
+ * @return 別途更新処理が必要な場合TRUEを返す
+ */
+bool set_monster_confused(MONSTER_IDX m_idx, int v)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_CONFUSED(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_CONFUSED);
+                       notice = TRUE;
+               }
+       }
+
+       /* Shut */
+       else
+       {
+               if (MON_CONFUSED(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_CONFUSED);
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)v;
+
+       return notice;
+}
+
+
+/*!
+ * @brief モンスターの恐慌状態値をセット /
+ * Set "m_ptr->mtimed[MTIMED_MONFEAR]", notice observable changes
+ * @param m_idx モンスター参照ID
+ * @param v セットする値
+ * @return 別途更新処理が必要な場合TRUEを返す
+ */
+bool set_monster_monfear(MONSTER_IDX m_idx, int v)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_MONFEAR(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_MONFEAR);
+                       notice = TRUE;
+               }
+       }
 
+       /* Shut */
+       else
+       {
+               if (MON_MONFEAR(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_MONFEAR);
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)v;
+
+       if (!notice) return FALSE;
+
+       if (m_ptr->ml)
+       {
+               /* Update health bar as needed */
+               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+       }
+
+       return TRUE;
+}
+
+
+/*!
+ * @brief モンスターの無敵状態値をセット /
+ * Set "m_ptr->mtimed[MTIMED_INVULNER]", notice observable changes
+ * @param m_idx モンスター参照ID
+ * @param v セットする値
+ * @param energy_need TRUEならば無敵解除時に行動ターン消費を行う
+ * @return 別途更新処理が必要な場合TRUEを返す
+ */
+bool set_monster_invulner(MONSTER_IDX m_idx, int v, bool energy_need)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       bool notice = FALSE;
+
+       /* Hack -- Force good values */
+       v = (v > 200) ? 200 : (v < 0) ? 0 : v;
+
+       /* Open */
+       if (v)
+       {
+               if (!MON_INVULNER(m_ptr))
+               {
+                       mproc_add(m_idx, MTIMED_INVULNER);
+                       notice = TRUE;
+               }
+       }
+
+       /* Shut */
+       else
+       {
+               if (MON_INVULNER(m_ptr))
+               {
+                       mproc_remove(m_idx, MTIMED_INVULNER);
+                       if (energy_need && !p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED();
+                       notice = TRUE;
+               }
+       }
+
+       /* Use the value */
+       m_ptr->mtimed[MTIMED_INVULNER] = (s16b)v;
+
+       if (!notice) return FALSE;
+
+       if (m_ptr->ml)
+       {
+               /* Update health bar as needed */
+               if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+               if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
+       }
+
+       return TRUE;
+}
+
+
+static u32b csleep_noise;
+
+/*!
+ * @brief モンスターの各種状態値を時間経過により更新するサブルーチン
+ * @param m_idx モンスター参照ID
+ * @param mtimed_idx 更新するモンスターの時限ステータスID
+ * @return なし
+ */
+static void process_monsters_mtimed_aux(MONSTER_IDX m_idx, int mtimed_idx)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+
+       switch (mtimed_idx)
+       {
+       case MTIMED_CSLEEP:
+       {
+               monster_race *r_ptr = &r_info[m_ptr->r_idx];
+
+               /* Assume does not wake up */
+               bool test = FALSE;
+
+               /* Hack -- Require proximity */
+               if (m_ptr->cdis < AAF_LIMIT)
+               {
+                       /* Handle "sensing radius" */
+                       if (m_ptr->cdis <= (is_pet(m_ptr) ? ((r_ptr->aaf > MAX_SIGHT) ? MAX_SIGHT : r_ptr->aaf) : r_ptr->aaf))
+                       {
+                               /* We may wake up */
+                               test = TRUE;
+                       }
+
+                       /* Handle "sight" and "aggravation" */
+                       else if ((m_ptr->cdis <= MAX_SIGHT) && (player_has_los_bold(m_ptr->fy, m_ptr->fx)))
+                       {
+                               /* We may wake up */
+                               test = TRUE;
+                       }
+               }
+
+               if (test)
+               {
+                       u32b notice = randint0(1024);
+
+                       /* Nightmare monsters are more alert */
+                       if (ironman_nightmare) notice /= 2;
+
+                       /* Hack -- See if monster "notices" player */
+                       if ((notice * notice * notice) <= csleep_noise)
+                       {
+                               /* Hack -- amount of "waking" */
+                               /* Wake up faster near the player */
+                               int d = (m_ptr->cdis < AAF_LIMIT / 2) ? (AAF_LIMIT / m_ptr->cdis) : 1;
+
+                               /* Hack -- amount of "waking" is affected by speed of player */
+                               d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10;
+                               if (d < 0) d = 1;
+
+                               /* Monster wakes up "a little bit" */
+
+                               /* Still asleep */
+                               if (!set_monster_csleep(m_idx, MON_CSLEEP(m_ptr) - d))
+                               {
+                                       /* Notice the "not waking up" */
+                                       if (is_original_ap_and_seen(m_ptr))
+                                       {
+                                               /* Hack -- Count the ignores */
+                                               if (r_ptr->r_ignore < MAX_UCHAR) r_ptr->r_ignore++;
+                                       }
+                               }
+
+                               /* Just woke up */
+                               else
+                               {
+                                       /* Notice the "waking up" */
+                                       if (m_ptr->ml)
+                                       {
+                                               char m_name[80];
+
+                                               /* Acquire the monster name */
+                                               monster_desc(m_name, m_ptr, 0);
+
+                                               /* Dump a message */
+                                               msg_format(_("%^sが目を覚ました。", "%^s wakes up."), m_name);
+                                       }
+
+                                       if (is_original_ap_and_seen(m_ptr))
+                                       {
+                                               /* Hack -- Count the wakings */
+                                               if (r_ptr->r_wake < MAX_UCHAR) r_ptr->r_wake++;
+                                       }
+                               }
+                       }
+               }
+               break;
+       }
+
+       case MTIMED_FAST:
+               /* Reduce by one, note if expires */
+               if (set_monster_fast(m_idx, MON_FAST(m_ptr) - 1))
+               {
+                       if (is_seen(m_ptr))
+                       {
+                               char m_name[80];
+
+                               /* Acquire the monster name */
+                               monster_desc(m_name, m_ptr, 0);
+
+                               /* Dump a message */
+                               msg_format(_("%^sはもう加速されていない。", "%^s is no longer fast."), m_name);
+                       }
+               }
+               break;
+
+       case MTIMED_SLOW:
+               /* Reduce by one, note if expires */
+               if (set_monster_slow(m_idx, MON_SLOW(m_ptr) - 1))
+               {
+                       if (is_seen(m_ptr))
+                       {
+                               char m_name[80];
+
+                               /* Acquire the monster name */
+                               monster_desc(m_name, m_ptr, 0);
+
+                               /* Dump a message */
+                               msg_format(_("%^sはもう減速されていない。", "%^s is no longer slow."), m_name);
+                       }
+               }
+               break;
+
+       case MTIMED_STUNNED:
+       {
+               int rlev = r_info[m_ptr->r_idx].level;
+
+               /* Recover from stun */
+               if (set_monster_stunned(m_idx, (randint0(10000) <= rlev * rlev) ? 0 : (MON_STUNNED(m_ptr) - 1)))
+               {
+                       /* Message if visible */
+                       if (is_seen(m_ptr))
+                       {
+                               char m_name[80];
+
+                               /* Acquire the monster name */
+                               monster_desc(m_name, m_ptr, 0);
+
+                               /* Dump a message */
+                               msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), m_name);
+                       }
+               }
+               break;
+       }
+
+       case MTIMED_CONFUSED:
+               /* Reduce the confusion */
+               if (set_monster_confused(m_idx, MON_CONFUSED(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))
+               {
+                       /* Message if visible */
+                       if (is_seen(m_ptr))
+                       {
+                               char m_name[80];
+
+                               /* Acquire the monster name */
+                               monster_desc(m_name, m_ptr, 0);
+
+                               /* Dump a message */
+                               msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), m_name);
+                       }
+               }
+               break;
+
+       case MTIMED_MONFEAR:
+               /* Reduce the fear */
+               if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(r_info[m_ptr->r_idx].level / 20 + 1)))
+               {
+                       /* Visual note */
+                       if (is_seen(m_ptr))
+                       {
+                               char m_name[80];
+#ifndef JP
+                               char m_poss[80];
+
+                               /* Acquire the monster possessive */
+                               monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
+#endif
+
+                               /* Acquire the monster name */
+                               monster_desc(m_name, m_ptr, 0);
+
+                               /* Dump a message */
+#ifdef JP
+                               msg_format("%^sは勇気を取り戻した。", m_name);
+#else
+                               msg_format("%^s recovers %s courage.", m_name, m_poss);
+#endif
+                       }
+               }
+               break;
+
+       case MTIMED_INVULNER:
+               /* Reduce by one, note if expires */
+               if (set_monster_invulner(m_idx, MON_INVULNER(m_ptr) - 1, TRUE))
+               {
+                       if (is_seen(m_ptr))
+                       {
+                               char m_name[80];
+
+                               /* Acquire the monster name */
+                               monster_desc(m_name, m_ptr, 0);
+
+                               /* Dump a message */
+                               msg_format(_("%^sはもう無敵でない。", "%^s is no longer invulnerable."), m_name);
+                       }
+               }
+               break;
+       }
+}
+
+
+/*!
+ * @brief 全モンスターの各種状態値を時間経過により更新するメインルーチン
+ * @param mtimed_idx 更新するモンスターの時限ステータスID
+ * @return なし
+ * @details
+ * Process the counters of monsters (once per 10 game turns)\n
+ * These functions are to process monsters' counters same as player's.
+ */
+void process_monsters_mtimed(int mtimed_idx)
+{
+       int  i;
+       s16b *cur_mproc_list = mproc_list[mtimed_idx];
+
+       /* Hack -- calculate the "player noise" */
+       if (mtimed_idx == MTIMED_CSLEEP) csleep_noise = (1L << (30 - p_ptr->skill_stl));
+
+       /* Process the monsters (backwards) */
+       for (i = mproc_max[mtimed_idx] - 1; i >= 0; i--)
+       {
+               /* Access the monster */
+               process_monsters_mtimed_aux(cur_mproc_list[i], mtimed_idx);
+       }
+}
+
+/*!
+ * @brief モンスターへの魔力消去処理
+ * @param m_idx 魔力消去を受けるモンスターの参照ID
+ * @return なし
+ */
+void dispel_monster_status(MONSTER_IDX m_idx)
+{
+       monster_type *m_ptr = &m_list[m_idx];
+       char         m_name[80];
+
+       monster_desc(m_name, m_ptr, 0);
+       if (set_monster_invulner(m_idx, 0, TRUE))
+       {
+               if (m_ptr->ml) msg_format(_("%sはもう無敵ではない。", "%^s is no longer invulnerable."), m_name);
+       }
+       if (set_monster_fast(m_idx, 0))
+       {
+               if (m_ptr->ml) msg_format(_("%sはもう加速されていない。", "%^s is no longer fast."), m_name);
+       }
+       if (set_monster_slow(m_idx, 0))
+       {
+               if (m_ptr->ml) msg_format(_("%sはもう減速されていない。", "%^s is no longer slow."), m_name);
+       }
+}
+
+/*!
+ * @brief モンスターの時間停止処理
+ * @param num 時間停止を行った敵が行動できる回数
+ * @param who 時間停止処理の主体ID
+ * @param vs_player TRUEならば時間停止開始処理を行う
+ * @return 時間停止が行われている状態ならばTRUEを返す
+ */
 bool process_the_world(int num, int who, bool vs_player)
 {
        monster_type *m_ptr = &m_list[hack_m_idx];  /* the world monster */
@@ -3834,17 +4285,9 @@ bool process_the_world(int num, int who, bool vs_player)
                monster_desc(m_name, m_ptr, 0);
 
                if (who == 1)
-#ifdef JP
-                       msg_print("¡Ö¡Ø¥¶¡¦¥ï¡¼¥ë¥É¡Ù¡ª»þ¤Ï»ß¤Þ¤Ã¤¿¡ª¡×");
-#else
-                       msg_format("%s yells 'The World! Time has stopped!'", m_name);
-#endif
+                       msg_format(_("「『ザ・ワールド』!時は止まった!」", "%s yells 'The World! Time has stopped!'"), m_name);
                else if (who == 3)
-#ifdef JP
-                       msg_print("¡Ö»þ¤è¡ª¡×");
-#else
-                       msg_format("%s yells 'Time!'", m_name);
-#endif
+                       msg_format(_("「時よ!」", "%s yells 'Time!'"), m_name);
                else msg_print("hek!");
 
                msg_print(NULL);
@@ -3888,13 +4331,9 @@ bool process_the_world(int num, int who, bool vs_player)
        p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
 
        world_monster = 0;
-       if (vs_player || (los(py, px, m_ptr->fy, m_ptr->fx) && projectable(py, px, m_ptr->fy, m_ptr->fx)))
+       if (vs_player || (player_has_los_bold(m_ptr->fy, m_ptr->fx) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)))
        {
-#ifdef JP
-               msg_print("¡Ö»þ¤ÏÆ°¤­¤À¤¹¡Ä¡×");
-#else
-               msg_print("You feel time flowing around you once more.");
-#endif
+               msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
                msg_print(NULL);
        }
 
@@ -3903,14 +4342,30 @@ bool process_the_world(int num, int who, bool vs_player)
        return (TRUE);
 }
 
-
-void monster_gain_exp(int m_idx, int s_idx)
+/*!
+ * @brief モンスターの経験値取得処理
+ * @param m_idx 経験値を得るモンスターの参照ID
+ * @param s_idx 撃破されたモンスター種族の参照ID
+ * @return なし
+ */
+void monster_gain_exp(MONSTER_IDX m_idx, IDX s_idx)
 {
-       monster_type *m_ptr = &m_list[m_idx];
-       monster_race *r_ptr = &r_info[m_ptr->r_idx];
-       monster_race *s_ptr = &r_info[s_idx];
+       monster_type *m_ptr;
+       monster_race *r_ptr;
+       monster_race *s_ptr;
        int new_exp;
 
+       /* Paranoia */
+       if (m_idx <= 0 || s_idx <= 0) return;
+
+       m_ptr = &m_list[m_idx];
+
+       /* Paranoia -- Skip dead monsters */
+       if (!m_ptr->r_idx) return;
+
+       r_ptr = &r_info[m_ptr->r_idx];
+       s_ptr = &r_info[s_idx];
+
        if (p_ptr->inside_battle) return;
 
        if (!r_ptr->next_exp) return;
@@ -3957,6 +4412,9 @@ void monster_gain_exp(int m_idx, int s_idx)
                }
                m_ptr->maxhp = m_ptr->max_maxhp;
                m_ptr->hp = old_hp * m_ptr->maxhp / old_maxhp;
+               
+               /* dealt damage is 0 at initial*/
+               m_ptr->dealt_damage = 0;
 
                /* Extract the monster base speed */
                m_ptr->mspeed = get_mspeed(r_ptr);
@@ -3975,12 +4433,26 @@ void monster_gain_exp(int m_idx, int s_idx)
 
                if (is_pet(m_ptr) || m_ptr->ml)
                {
-#ifdef JP
-                       msg_format("%s¤Ï%s¤Ë¿Ê²½¤·¤¿¡£", m_name, r_name + r_ptr->name);
-#else
-                       msg_format("%^s evolved into %s.", m_name, r_name + r_ptr->name);
-#endif
-                       r_info[old_r_idx].r_xtra1 |= MR1_SINKA;
+                       if (!ignore_unview || player_can_see_bold(m_ptr->fy, m_ptr->fx))
+                       {
+                               if (p_ptr->image)
+                               {
+                                       monster_race *hallu_race;
+
+                                       do
+                                       {
+                                               hallu_race = &r_info[randint1(max_r_idx - 1)];
+                                       }
+                                       while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
+                                       msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_name + hallu_race->name);
+                               }
+                               else
+                               {
+                                       msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_name + r_ptr->name);
+                               }
+                       }
+
+                       if (!p_ptr->image) r_info[old_r_idx].r_xtra1 |= MR1_SINKA;
 
                        /* Now you feel very close to this pet. */
                        m_ptr->parent_m_idx = 0;