OSDN Git Service

Merge branch 'master' of git.sourceforge.jp:/gitroot/hengband/hengband
[hengband/hengband.git] / src / cave.c
index 5c376a2..d8c615a 100644 (file)
@@ -1,44 +1,48 @@
-/* File: cave.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 cave.c
+ * @brief ダンジョンの基礎部分実装(主にマスの実装) / low level dungeon routines -BEN-
+ * @date 2013/12/30
+ * @author
+ * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
+ *\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
+ * \n
+ * Support for Adam Bolt's tileset, lighting and transparency effects\n
+ * by Robert Ruehlmann (rr9@angband.org)\n
+ * \n
+ * 2013 Deskull Doxygen向けのコメント整理\n
  */
 
-/* Purpose: low level dungeon routines -BEN- */
-
 
 #include "angband.h"
 
-
-/*
- * Support for Adam Bolt's tileset, lighting and transparency effects
- * by Robert Ruehlmann (rr9@angband.org)
- */
-
-static byte display_autopick;
+static byte display_autopick; /*!< 自動拾い状態の設定フラグ */
 static int match_autopick;
-static object_type *autopick_obj;
-static int feat_priority;
-
-/*
- * Distance between two points via Newton-Raphson technique
+static object_type *autopick_obj; /*!< 各種自動拾い処理時に使うオブジェクトポインタ */
+static int feat_priority; /*!< マップ縮小表示時に表示すべき地形の優先度を保管する */
+
+/*!
+ * @brief 2点間の距離をニュートン・ラプソン法で算出する / Distance between two points via Newton-Raphson technique
+ * @param y1 1点目のy座標
+ * @param x1 1点目のx座標
+ * @param y2 2点目のy座標
+ * @param x2 2点目のx座標
+ * @return 2点間の距離
  */
-int distance (int y1, int x1, int y2, int x2)
+POSITION distance (POSITION y1, POSITION x1, POSITION y2, POSITION x2)
 {
-       int dy = (y1 > y2) ? (y1 - y2) : (y2 - y1);
-       int dx = (x1 > x2) ? (x1 - x2) : (x2 - x1);
+       POSITION dy = (y1 > y2) ? (y1 - y2) : (y2 - y1);
+       POSITION dx = (x1 > x2) ? (x1 - x2) : (x2 - x1);
 
        /* Squared distance */
-       int target = (dy * dy) + (dx * dx);
+       POSITION target = (dy * dy) + (dx * dx);
 
        /* Approximate distance: hypot(dy,dx) = max(dy,dx) + min(dy,dx) / 2 */
-       int d = (dy > dx) ? (dy + (dx>>1)) : (dx + (dy>>1));
+       POSITION d = (dy > dx) ? (dy + (dx>>1)) : (dx + (dy>>1));
 
-       int err;
+       POSITION err;
 
        /* Simple case */
        if (!dy || !dx) return d;
@@ -58,32 +62,35 @@ int distance (int y1, int x1, int y2, int x2)
        return d;
 }
 
-
-/*
- * Return TRUE if the given feature is a trap
+/*!
+ * @brief 地形が罠持ちであるかの判定を行う。 / Return TRUE if the given feature is a trap
+ * @param feat 地形情報のID
+ * @return 罠持ちの地形ならばTRUEを返す。
  */
-bool is_trap(int feat)
+bool is_trap(IDX feat)
 {
        return have_flag(f_info[feat].flags, FF_TRAP);
 }
 
-
-/*
- * Return TRUE if the given grid is a known trap
+/*!
+ * @brief マスに看破済みの罠があるかの判定を行う。 / Return TRUE if the given grid is a known trap
+ * @param c_ptr マス構造体の参照ポインタ
+ * @return 看破済みの罠があるならTRUEを返す。
  */
 bool is_known_trap(cave_type *c_ptr)
 {
-       if (!c_ptr->mimic && !have_flag(f_flags_grid(c_ptr), FF_SECRET) &&
+       if (!c_ptr->mimic && !cave_have_flag_grid(c_ptr, FF_SECRET) &&
            is_trap(c_ptr->feat)) return TRUE;
        else
                return FALSE;
 }
 
-
-/*
- * Return TRUE if the given grid is a closed door
+/*!
+ * @brief 地形が閉じたドアであるかの判定を行う。 / Return TRUE if the given grid is a closed door
+ * @param feat 地形情報のID
+ * @return 閉じたドアのある地形ならばTRUEを返す。
  */
-bool is_closed_door(int feat)
+bool is_closed_door(IDX feat)
 {
        feature_type *f_ptr = &f_info[feat];
 
@@ -91,59 +98,66 @@ bool is_closed_door(int feat)
               !have_flag(f_ptr->flags, FF_MOVE);
 }
 
-
-/*
- * Return TRUE if the given grid is a hidden closed door
+/*!
+ * @brief マスに隠されたドアがあるかの判定を行う。 / Return TRUE if the given grid is a hidden closed door
+ * @param c_ptr マス構造体の参照ポインタ
+ * @return 隠されたドアがあるならTRUEを返す。
  */
 bool is_hidden_door(cave_type *c_ptr)
 {
-       if ((c_ptr->mimic || have_flag(f_flags_grid(c_ptr), FF_SECRET)) &&
+       if ((c_ptr->mimic || cave_have_flag_grid(c_ptr, FF_SECRET)) &&
            is_closed_door(c_ptr->feat))
                return TRUE;
        else
                return FALSE;
 }
 
-
-/*
- * A simple, fast, integer-based line-of-sight algorithm.  By Joseph Hall,
- * 4116 Brewster Drive, Raleigh NC 27606.  Email to jnh@ecemwl.ncsu.edu.
- *
- * Returns TRUE if a line of sight can be traced from (x1,y1) to (x2,y2).
- *
- * The LOS begins at the center of the tile (x1,y1) and ends at the center of
- * the tile (x2,y2).  If los() is to return TRUE, all of the tiles this line
- * passes through must be floor tiles, except for (x1,y1) and (x2,y2).
- *
- * We assume that the "mathematical corner" of a non-floor tile does not
- * block line of sight.
- *
- * Because this function uses (short) ints for all calculations, overflow may
- * occur if dx and dy exceed 90.
- *
- * Once all the degenerate cases are eliminated, the values "qx", "qy", and
- * "m" are multiplied by a scale factor "f1 = abs(dx * dy * 2)", so that
- * we can use integer arithmetic.
- *
- * We travel from start to finish along the longer axis, starting at the border
- * between the first and second tiles, where the y offset = .5 * slope, taking
- * into account the scale factor.  See below.
- *
- * Also note that this function and the "move towards target" code do NOT
- * share the same properties.  Thus, you can see someone, target them, and
- * then fire a bolt at them, but the bolt may hit a wall, not them.  However,
- * by clever choice of target locations, you can sometimes throw a "curve".
- *
- * Note that "line of sight" is not "reflexive" in all cases.
- *
- * Use the "projectable()" routine to test "spell/missile line of sight".
- *
- * Use the "update_view()" function to determine player line-of-sight.
+/*!
+ * @brief LOS(Line Of Sight / 視線が通っているか)の判定を行う。
+ * @param y1 始点のy座標
+ * @param x1 始点のx座標
+ * @param y2 終点のy座標
+ * @param x2 終点のx座標
+ * @return LOSが通っているならTRUEを返す。
+ * @details
+ * A simple, fast, integer-based line-of-sight algorithm.  By Joseph Hall,\n
+ * 4116 Brewster Drive, Raleigh NC 27606.  Email to jnh@ecemwl.ncsu.edu.\n
+ *\n
+ * Returns TRUE if a line of sight can be traced from (x1,y1) to (x2,y2).\n
+ *\n
+ * The LOS begins at the center of the tile (x1,y1) and ends at the center of\n
+ * the tile (x2,y2).  If los() is to return TRUE, all of the tiles this line\n
+ * passes through must be floor tiles, except for (x1,y1) and (x2,y2).\n
+ *\n
+ * We assume that the "mathematical corner" of a non-floor tile does not\n
+ * block line of sight.\n
+ *\n
+ * Because this function uses (short) ints for all calculations, overflow may\n
+ * occur if dx and dy exceed 90.\n
+ *\n
+ * Once all the degenerate cases are eliminated, the values "qx", "qy", and\n
+ * "m" are multiplied by a scale factor "f1 = abs(dx * dy * 2)", so that\n
+ * we can use integer arithmetic.\n
+ *\n
+ * We travel from start to finish along the longer axis, starting at the border\n
+ * between the first and second tiles, where the y offset = .5 * slope, taking\n
+ * into account the scale factor.  See below.\n
+ *\n
+ * Also note that this function and the "move towards target" code do NOT\n
+ * share the same properties.  Thus, you can see someone, target them, and\n
+ * then fire a bolt at them, but the bolt may hit a wall, not them.  However\n,
+ * by clever choice of target locations, you can sometimes throw a "curve".\n
+ *\n
+ * Note that "line of sight" is not "reflexive" in all cases.\n
+ *\n
+ * Use the "projectable()" routine to test "spell/missile line of sight".\n
+ *\n
+ * Use the "update_view()" function to determine player line-of-sight.\n
  */
-bool los(int y1, int x1, int y2, int x2)
+bool los(POSITION y1, POSITION x1, POSITION y2, POSITION x2)
 {
        /* Delta */
-       int dx, dy;
+       POSITION dx, dy;
 
        /* Absolute */
        int ax, ay;
@@ -363,62 +377,196 @@ bool los(int y1, int x1, int y2, int x2)
        return TRUE;
 }
 
+#define COMPLEX_WALL_ILLUMINATION /*!< 照明状態を壁により影響を受ける、より複雑な判定に切り替えるマクロ */
 
 
-
-
-
-/*
- * Check for "local" illumination
+/*!
+ * @brief 指定された座標のマスが現在照らされているかを返す。 / Check for "local" illumination
+ * @param y y座標
+ * @param x x座標
+ * @return 指定された座標に照明がかかっているならTRUEを返す。。
  */
 static bool check_local_illumination(int y, int x)
 {
        /* Hack -- move towards player */
-       int yy = (y < py) ? (y + 1) : (y > py) ? (y - 1) : y;
-       int xx = (x < px) ? (x + 1) : (x > px) ? (x - 1) : x;
+       int yy = (y < p_ptr->y) ? (y + 1) : (y > p_ptr->y) ? (y - 1) : y;
+       int xx = (x < p_ptr->x) ? (x + 1) : (x > p_ptr->x) ? (x - 1) : x;
 
        /* Check for "local" illumination */
-       return (cave[yy][xx].info & (CAVE_LITE | CAVE_MNLT)) ||
-              ((cave[yy][xx].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW);
+
+#ifdef COMPLEX_WALL_ILLUMINATION /* COMPLEX_WALL_ILLUMINATION */
+
+       /* Check for "complex" illumination */
+       if ((feat_supports_los(get_feat_mimic(&cave[yy][xx])) &&
+            (cave[yy][xx].info & CAVE_GLOW)) ||
+           (feat_supports_los(get_feat_mimic(&cave[y][xx])) &&
+            (cave[y][xx].info & CAVE_GLOW)) ||
+           (feat_supports_los(get_feat_mimic(&cave[yy][x])) &&
+            (cave[yy][x].info & CAVE_GLOW)))
+       {
+               return TRUE;
+       }
+       else return FALSE;
+
+#else /* COMPLEX_WALL_ILLUMINATION */
+
+       /* Check for "simple" illumination */
+       return (cave[yy][xx].info & CAVE_GLOW) ? TRUE : FALSE;
+
+#endif /* COMPLEX_WALL_ILLUMINATION */
 }
 
 
-/*
- * Can the player "see" the given grid in detail?
- *
- * He must have vision, illumination, and line of sight.
- *
- * Note -- "CAVE_LITE" is only set if the "torch" has "los()".
- * So, given "CAVE_LITE", we know that the grid is "fully visible".
- *
- * Note that "CAVE_GLOW" makes little sense for a wall, since it would mean
- * that a wall is visible from any direction.  That would be odd.  Except
- * under wizard light, which might make sense.  Thus, for walls, we require
- * not only that they be "CAVE_GLOW", but also, that they be adjacent to a
- * grid which is not only "CAVE_GLOW", but which is a non-wall, and which is
- * in line of sight of the player.
- *
- * This extra check is expensive, but it provides a more "correct" semantics.
- *
- * Note that we should not run this check on walls which are "outer walls" of
- * the dungeon, or we will induce a memory fault, but actually verifying all
- * of the locations would be extremely expensive.
- *
- * Thus, to speed up the function, we assume that all "perma-walls" which are
- * "CAVE_GLOW" are "illuminated" from all sides.  This is correct for all cases
- * except "vaults" and the "buildings" in town.  But the town is a hack anyway,
- * and the player has more important things on his mind when he is attacking a
- * monster vault.  It is annoying, but an extremely important optimization.
- *
- * Note that "glowing walls" are only considered to be "illuminated" if the
- * grid which is next to the wall in the direction of the player is also a
- * "glowing" grid.  This prevents the player from being able to "see" the
- * walls of illuminated rooms from a corridor outside the room.
+/*! 対象座標のマスの照明状態を更新する際の補助処理マクロ */
+#define update_local_illumination_aux(Y, X) \
+{ \
+       if (player_has_los_bold((Y), (X))) \
+       { \
+               /* Update the monster */ \
+               if (cave[(Y)][(X)].m_idx) update_mon(cave[(Y)][(X)].m_idx, FALSE); \
+\
+               /* Notice and redraw */ \
+               note_spot((Y), (X)); \
+               lite_spot((Y), (X)); \
+       } \
+}
+
+/*!
+ * @brief 指定された座標の照明状態を更新する / Update "local" illumination
+ * @param y y座標
+ * @param x x座標
+ * @return なし
+ */
+void update_local_illumination(int y, int x)
+{
+       int i, yy, xx;
+
+       if (!in_bounds(y, x)) return;
+
+#ifdef COMPLEX_WALL_ILLUMINATION /* COMPLEX_WALL_ILLUMINATION */
+
+       if ((y != p_ptr->y) && (x != p_ptr->x))
+       {
+               yy = (y < p_ptr->y) ? (y - 1) : (y + 1);
+               xx = (x < p_ptr->x) ? (x - 1) : (x + 1);
+               update_local_illumination_aux(yy, xx);
+               update_local_illumination_aux(y, xx);
+               update_local_illumination_aux(yy, x);
+       }
+       else if (x != p_ptr->x) /* y == p_ptr->y */
+       {
+               xx = (x < p_ptr->x) ? (x - 1) : (x + 1);
+               for (i = -1; i <= 1; i++)
+               {
+                       yy = y + i;
+                       update_local_illumination_aux(yy, xx);
+               }
+               yy = y - 1;
+               update_local_illumination_aux(yy, x);
+               yy = y + 1;
+               update_local_illumination_aux(yy, x);
+       }
+       else if (y != p_ptr->y) /* x == p_ptr->x */
+       {
+               yy = (y < p_ptr->y) ? (y - 1) : (y + 1);
+               for (i = -1; i <= 1; i++)
+               {
+                       xx = x + i;
+                       update_local_illumination_aux(yy, xx);
+               }
+               xx = x - 1;
+               update_local_illumination_aux(y, xx);
+               xx = x + 1;
+               update_local_illumination_aux(y, xx);
+       }
+       else /* Player's grid */
+       {
+               for (i = 0; i < 8; i++)
+               {
+                       yy = y + ddy_cdd[i];
+                       xx = x + ddx_cdd[i];
+                       update_local_illumination_aux(yy, xx);
+               }
+       }
+
+#else /* COMPLEX_WALL_ILLUMINATION */
+
+       if ((y != p_ptr->y) && (x != p_ptr->x))
+       {
+               yy = (y < p_ptr->y) ? (y - 1) : (y + 1);
+               xx = (x < p_ptr->x) ? (x - 1) : (x + 1);
+               update_local_illumination_aux(yy, xx);
+       }
+       else if (x != p_ptr->x) /* y == p_ptr->y */
+       {
+               xx = (x < p_ptr->x) ? (x - 1) : (x + 1);
+               for (i = -1; i <= 1; i++)
+               {
+                       yy = y + i;
+                       update_local_illumination_aux(yy, xx);
+               }
+       }
+       else if (y != p_ptr->y) /* x == p_ptr->x */
+       {
+               yy = (y < p_ptr->y) ? (y - 1) : (y + 1);
+               for (i = -1; i <= 1; i++)
+               {
+                       xx = x + i;
+                       update_local_illumination_aux(yy, xx);
+               }
+       }
+       else /* Player's grid */
+       {
+               for (i = 0; i < 8; i++)
+               {
+                       yy = y + ddy_cdd[i];
+                       xx = x + ddx_cdd[i];
+                       update_local_illumination_aux(yy, xx);
+               }
+       }
+
+#endif /* COMPLEX_WALL_ILLUMINATION */
+}
+
+
+/*!
+ * @brief 指定された座標をプレイヤーが視覚に収められるかを返す。 / Can the player "see" the given grid in detail?
+ * @param y y座標
+ * @param x x座標
+ * @return 視覚に収められる状態ならTRUEを返す
+ * @details
+ * He must have vision, illumination, and line of sight.\n
+ * \n
+ * Note -- "CAVE_LITE" is only set if the "torch" has "los()".\n
+ * So, given "CAVE_LITE", we know that the grid is "fully visible".\n
+ *\n
+ * Note that "CAVE_GLOW" makes little sense for a wall, since it would mean\n
+ * that a wall is visible from any direction.  That would be odd.  Except\n
+ * under wizard light, which might make sense.  Thus, for walls, we require\n
+ * not only that they be "CAVE_GLOW", but also, that they be adjacent to a\n
+ * grid which is not only "CAVE_GLOW", but which is a non-wall, and which is\n
+ * in line of sight of the player.\n
+ *\n
+ * This extra check is expensive, but it provides a more "correct" semantics.\n
+ *\n
+ * Note that we should not run this check on walls which are "outer walls" of\n
+ * the dungeon, or we will induce a memory fault, but actually verifying all\n
+ * of the locations would be extremely expensive.\n
+ *\n
+ * Thus, to speed up the function, we assume that all "perma-walls" which are\n
+ * "CAVE_GLOW" are "illuminated" from all sides.  This is correct for all cases\n
+ * except "vaults" and the "buildings" in town.  But the town is a hack anyway,\n
+ * and the player has more important things on his mind when he is attacking a\n
+ * monster vault.  It is annoying, but an extremely important optimization.\n
+ *\n
+ * Note that "glowing walls" are only considered to be "illuminated" if the\n
+ * grid which is next to the wall in the direction of the player is also a\n
+ * "glowing" grid.  This prevents the player from being able to "see" the\n
+ * walls of illuminated rooms from a corridor outside the room.\n
  */
 bool player_can_see_bold(int y, int x)
 {
        cave_type *c_ptr;
-       s16b feat;
 
        /* Blind players see nothing */
        if (p_ptr->blind) return FALSE;
@@ -439,32 +587,31 @@ bool player_can_see_bold(int y, int x)
        if ((c_ptr->info & (CAVE_GLOW | CAVE_MNDK)) != CAVE_GLOW) return FALSE;
 
        /* Feature code (applying "mimic" field) */
-       feat = get_feat_mimic(c_ptr);
-
        /* Floors are simple */
-       if (feat_supports_los(feat)) return TRUE;
+       if (feat_supports_los(get_feat_mimic(c_ptr))) return TRUE;
 
        /* Check for "local" illumination */
        return check_local_illumination(y, x);
 }
 
-
-
-/*
- * Returns true if the player's grid is dark
+/*!
+ * @brief 指定された座標をプレイヤー収められていない状態かどうか / Returns true if the player's grid is dark
+ * @return 視覚に収められていないならTRUEを返す
+ * @details player_can_see_bold()関数の返り値の否定を返している。
  */
 bool no_lite(void)
 {
-       return (!player_can_see_bold(py, px));
+       return (!player_can_see_bold(p_ptr->y, p_ptr->x));
 }
 
 
-
-
-/*
- * Determine if a given location may be "destroyed"
- *
- * Used by destruction spells, and for placing stairs, etc.
+/*!
+ * @brief 指定された座標が地震や階段生成の対象となるマスかを返す。 / Determine if a given location may be "destroyed"
+ * @param y y座標
+ * @param x x座標
+ * @return 各種の変更が可能ならTRUEを返す。
+ * @details 
+ * 条件は永久地形でなく、なおかつ該当のマスにアーティファクトが存在しないか、である。英語の旧コメントに反して*破壊*の抑止判定には現在使われていない。
  */
 bool cave_valid_bold(int y, int x)
 {
@@ -488,7 +635,7 @@ bool cave_valid_bold(int y, int x)
                next_o_idx = o_ptr->next_o_idx;
 
                /* Forbid artifact grids */
-               if ((o_ptr->art_name) || artifact_p(o_ptr)) return (FALSE);
+               if (object_is_artifact(o_ptr)) return (FALSE);
        }
 
        /* Accept */
@@ -498,54 +645,22 @@ bool cave_valid_bold(int y, int x)
 
 
 
-/*
- * Determine if a given location may be "destroyed"
- *
- * Used by destruction spells, and for placing stairs, etc.
- */
-bool cave_valid_grid(cave_type *c_ptr)
-{
-       s16b this_o_idx, next_o_idx = 0;
-
-
-       /* Forbid perma-grids */
-       if (cave_perma_grid(c_ptr)) return (FALSE);
-
-       /* Check objects */
-       for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
-       {
-               object_type *o_ptr;
-
-               /* Acquire object */
-               o_ptr = &o_list[this_o_idx];
-
-               /* Acquire next object */
-               next_o_idx = o_ptr->next_o_idx;
-
-               /* Forbid artifact grids */
-               if ((o_ptr->art_name) || artifact_p(o_ptr)) return (FALSE);
-       }
-
-       /* Accept */
-       return (TRUE);
-}
-
-
-
-
-/*
- * Hack -- Legal monster codes
+/*!
+ * 一般的にモンスターシンボルとして扱われる記号を定義する(幻覚処理向け) / Hack -- Legal monster codes
  */
 static char image_monster_hack[] = \
 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
-/*
- * Hack -- Legal object codes
+/*!
+ * 一般的にオブジェクトシンボルとして扱われる記号を定義する(幻覚処理向け) /  Hack -- Legal object codes
  */
 static char image_object_hack[] = "?/|\\\"!$()_-=[]{},~";
 
-/*
- * Mega-Hack -- Hallucinatory monster
+/*!
+ * @brief モンスターの表示を幻覚状態に差し替える / Mega-Hack -- Hallucinatory monster
+ * @param ap 本来の色
+ * @param cp 本来のシンボル
+ * @return なし
  */
 static void image_monster(byte *ap, char *cp)
 {
@@ -569,9 +684,11 @@ static void image_monster(byte *ap, char *cp)
        }
 }
 
-
-/*
- * Mega-Hack -- Hallucinatory object
+/*!
+ * @brief オブジェクトの表示を幻覚状態に差し替える / Hallucinatory object
+ * @param ap 本来の色
+ * @param cp 本来のシンボル
+ * @return なし
  */
 static void image_object(byte *ap, char *cp)
 {
@@ -594,9 +711,11 @@ static void image_object(byte *ap, char *cp)
 }
 
 
-
-/*
- * Hack -- Random hallucination
+/*!
+ * @brief オブジェクト&モンスターの表示を幻覚状態に差し替える / Hack -- Random hallucination
+ * @param ap 本来の色
+ * @param cp 本来のシンボル
+ * @return なし
  */
 static void image_random(byte *ap, char *cp)
 {
@@ -613,16 +732,16 @@ static void image_random(byte *ap, char *cp)
        }
 }
 
-/*
- * This array lists the effects of "brightness" on various "base" colours.
- *
- * This is used to do dynamic lighting effects in ascii :-)
- * At the moment, only the various "floor" tiles are affected.
- *
- * The layout of the array is [x][0] = light and [x][1] = dark.
+/*!
+ * 照明の表現を行うための色合いの関係を{暗闇時, 照明時} で定義する /
+ * This array lists the effects of "brightness" on various "base" colours.\n
+ *\n
+ * This is used to do dynamic lighting effects in ascii :-)\n
+ * At the moment, only the various "floor" tiles are affected.\n
+ *\n
+ * The layout of the array is [x][0] = light and [x][1] = dark.\n
  */
-
-byte lighting_colours[16][2] =
+static byte lighting_colours[16][2] =
 {
        /* TERM_DARK */
        {TERM_L_DARK, TERM_DARK},
@@ -673,161 +792,156 @@ byte lighting_colours[16][2] =
        {TERM_L_UMBER, TERM_UMBER}
 };
 
-
-/*
- * Mega-Hack -- Partial code of map_info() for darkened grids
- * Note: Each variable is declared in map_info().
- *       This macro modifies "feat", "f_ptr", "c" and "a".
+/*!
+ * @brief 調査中
+ * @todo コメントを付加すること
  */
-#define darkened_grid_hack() \
-{ \
-       if (feat_supports_los(feat)) \
-       { \
-               /* Unsafe cave grid -- idea borrowed from Unangband */ \
-               if (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) \
-                       feat = FEAT_UNDETECTED; \
-               else \
-                       feat = FEAT_NONE; \
-\
-               /* Access darkness */ \
-               f_ptr = &f_info[feat]; \
-\
-               /* Char and attr of darkness */ \
-               c = f_ptr->x_char[F_LIT_STANDARD]; \
-               a = f_ptr->x_attr[F_LIT_STANDARD]; \
-       } \
-       else if (view_granite_lite && view_yellow_lite) \
-       { \
-               /* Use a darkly darkened colour/tile */ \
-               a = f_ptr->x_attr[F_LIT_DARKDARK]; \
-               c = f_ptr->x_char[F_LIT_DARKDARK]; \
-       } \
-} ;
+void apply_default_feat_lighting(byte f_attr[F_LIT_MAX], byte f_char[F_LIT_MAX])
+{
+       byte s_attr = f_attr[F_LIT_STANDARD];
+       byte s_char = f_char[F_LIT_STANDARD];
+       int i;
+
+       if (is_ascii_graphics(s_attr)) /* For ASCII */
+       {
+               f_attr[F_LIT_LITE] = lighting_colours[s_attr & 0x0f][0];
+               f_attr[F_LIT_DARK] = lighting_colours[s_attr & 0x0f][1];
+               for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++) f_char[i] = s_char;
+       }
+       else /* For tile graphics */
+       {
+               for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++) f_attr[i] = s_attr;
+               f_char[F_LIT_LITE] = s_char + 2;
+               f_char[F_LIT_DARK] = s_char + 1;
+       }
+}
 
 
-/* Is this grid "darkened" by monster? */
+/*!
+ * モンスターにより照明が消されている地形か否かを判定する。 / Is this grid "darkened" by monster?
+ */
 #define darkened_grid(C) \
        ((((C)->info & (CAVE_VIEW | CAVE_LITE | CAVE_MNLT | CAVE_MNDK)) == (CAVE_VIEW | CAVE_MNDK)) && \
-       !p_ptr->see_nocto && !p_ptr->blind)
-
-
-/*
- * Extract the attr/char to display at the given (legal) map location
- *
- * Basically, we "paint" the chosen attr/char in several passes, starting
- * with any known "terrain features" (defaulting to darkness), then adding
- * any known "objects", and finally, adding any known "monsters".  This
- * is not the fastest method but since most of the calls to this function
- * are made for grids with no monsters or objects, it is fast enough.
- *
- * Note that this function, if used on the grid containing the "player",
- * will return the attr/char of the grid underneath the player, and not
- * the actual player attr/char itself, allowing a lot of optimization
- * in various "display" functions.
- *
- * Note that the "zero" entry in the feature/object/monster arrays are
- * used to provide "special" attr/char codes, with "monster zero" being
- * used for the player attr/char, "object zero" being used for the "stack"
- * attr/char, and "feature zero" being used for the "nothing" attr/char,
- * though this function makes use of only "feature zero".
- *
- * Note that monsters can have some "special" flags, including "ATTR_MULTI",
- * which means their color changes, and "ATTR_CLEAR", which means they take
- * the color of whatever is under them, and "CHAR_CLEAR", which means that
- * they take the symbol of whatever is under them.  Technically, the flag
- * "CHAR_MULTI" is supposed to indicate that a monster looks strange when
- * examined, but this flag is currently ignored.
- *
- * Currently, we do nothing with multi-hued objects, because there are
- * not any.  If there were, they would have to set "shimmer_objects"
- * when they were created, and then new "shimmer" code in "dungeon.c"
- * would have to be created handle the "shimmer" effect, and the code
- * in "cave.c" would have to be updated to create the shimmer effect.
- *
- * Note the effects of hallucination.  Objects always appear as random
- * "objects", monsters as random "monsters", and normal grids occasionally
- * appear as random "monsters" or "objects", but note that these random
- * "monsters" and "objects" are really just "colored ascii symbols".
- *
- * Note that "floors" and "invisible traps" (and "zero" features) are
- * drawn as "floors" using a special check for optimization purposes,
- * and these are the only features which get drawn using the special
- * lighting effects activated by "view_special_lite".
- *
- * Note the use of the "mimic" field in the "terrain feature" processing,
- * which allows any feature to "pretend" to be another feature.  This is
- * used to "hide" secret doors, and to make all "doors" appear the same,
- * and all "walls" appear the same, and "hidden" treasure stay hidden.
- * It is possible to use this field to make a feature "look" like a floor,
- * but the "special lighting effects" for floors will not be used.
- *
- * Note the use of the new "terrain feature" information.  Note that the
- * assumption that all interesting "objects" and "terrain features" are
- * memorized allows extremely optimized processing below.  Note the use
- * of separate flags on objects to mark them as memorized allows a grid
- * to have memorized "terrain" without granting knowledge of any object
- * which may appear in that grid.
- *
- * Note the efficient code used to determine if a "floor" grid is
- * "memorized" or "viewable" by the player, where the test for the
- * grid being "viewable" is based on the facts that (1) the grid
- * must be "lit" (torch-lit or perma-lit), (2) the grid must be in
- * line of sight, and (3) the player must not be blind, and uses the
- * assumption that all torch-lit grids are in line of sight.
- *
- * Note that floors (and invisible traps) are the only grids which are
- * not memorized when seen, so only these grids need to check to see if
- * the grid is "viewable" to the player (if it is not memorized).  Since
- * most non-memorized grids are in fact walls, this induces *massive*
- * efficiency, at the cost of *forcing* the memorization of non-floor
- * grids when they are first seen.  Note that "invisible traps" are
- * always treated exactly like "floors", which prevents "cheating".
- *
- * Note the "special lighting effects" which can be activated for floor
- * grids using the "view_special_lite" option (for "white" floor grids),
- * causing certain grids to be displayed using special colors.  If the
- * player is "blind", we will use "dark gray", else if the grid is lit
- * by the torch, and the "view_yellow_lite" option is set, we will use
- * "yellow", else if the grid is "dark", we will use "dark gray", else
- * if the grid is not "viewable", and the "view_bright_lite" option is
- * set, and the we will use "slate" (gray).  We will use "white" for all
- * other cases, in particular, for illuminated viewable floor grids.
- *
- * Note the "special lighting effects" which can be activated for wall
- * grids using the "view_granite_lite" option (for "white" wall grids),
- * causing certain grids to be displayed using special colors.  If the
- * player is "blind", we will use "dark gray", else if the grid is lit
- * by the torch, and the "view_yellow_lite" option is set, we will use
- * "yellow", else if the "view_bright_lite" option is set, and the grid
- * is not "viewable", or is "dark", or is glowing, but not when viewed
- * from the player's current location, we will use "slate" (gray).  We
- * will use "white" for all other cases, in particular, for correctly
- * illuminated viewable wall grids.
- *
- * Note that, when "view_granite_lite" is set, we use an inline version
- * of the "player_can_see_bold()" function to check the "viewability" of
- * grids when the "view_bright_lite" option is set, and we do NOT use
- * any special colors for "dark" wall grids, since this would allow the
- * player to notice the walls of illuminated rooms from a hallway that
- * happened to run beside the room.  The alternative, by the way, would
- * be to prevent the generation of hallways next to rooms, but this
- * would still allow problems when digging towards a room.
- *
- * Note that bizarre things must be done when the "attr" and/or "char"
- * codes have the "high-bit" set, since these values are used to encode
- * various "special" pictures in some versions, and certain situations,
- * such as "multi-hued" or "clear" monsters, cause the attr/char codes
- * to be "scrambled" in various ways.
- *
- * Note that eventually we may use the "&" symbol for embedded treasure,
- * and use the "*" symbol to indicate multiple objects, though this will
- * have to wait for Angband 2.8.0 or later.  Note that currently, this
- * is not important, since only one object or terrain feature is allowed
- * in each grid.  If needed, "k_info[0]" will hold the "stack" attr/char.
- *
- * Note the assumption that doing "x_ptr = &x_info[x]" plus a few of
- * "x_ptr->xxx", is quicker than "x_info[x].xxx", if this is incorrect
- * then a whole lot of code should be changed...  XXX XXX
+       !p_ptr->see_nocto)
+
+
+/*!
+ * @brief Mコマンドによる縮小マップの表示を行う / Extract the attr/char to display at the given (legal) map location
+ * @details
+ * Basically, we "paint" the chosen attr/char in several passes, starting\n
+ * with any known "terrain features" (defaulting to darkness), then adding\n
+ * any known "objects", and finally, adding any known "monsters".  This\n
+ * is not the fastest method but since most of the calls to this function\n
+ * are made for grids with no monsters or objects, it is fast enough.\n
+ *\n
+ * Note that this function, if used on the grid containing the "player",\n
+ * will return the attr/char of the grid underneath the player, and not\n
+ * the actual player attr/char itself, allowing a lot of optimization\n
+ * in various "display" functions.\n
+ *\n
+ * Note that the "zero" entry in the feature/object/monster arrays are\n
+ * used to provide "special" attr/char codes, with "monster zero" being\n
+ * used for the player attr/char, "object zero" being used for the "stack"\n
+ * attr/char, and "feature zero" being used for the "nothing" attr/char,\n
+ * though this function makes use of only "feature zero".\n
+ *\n
+ * Note that monsters can have some "special" flags, including "ATTR_MULTI",\n
+ * which means their color changes, and "ATTR_CLEAR", which means they take\n
+ * the color of whatever is under them, and "CHAR_CLEAR", which means that\n
+ * they take the symbol of whatever is under them.  Technically, the flag\n
+ * "CHAR_MULTI" is supposed to indicate that a monster looks strange when\n
+ * examined, but this flag is currently ignored.\n
+ *\n
+ * Currently, we do nothing with multi-hued objects, because there are\n
+ * not any.  If there were, they would have to set "shimmer_objects"\n
+ * when they were created, and then new "shimmer" code in "dungeon.c"\n
+ * would have to be created handle the "shimmer" effect, and the code\n
+ * in "cave.c" would have to be updated to create the shimmer effect.\n
+ *\n
+ * Note the effects of hallucination.  Objects always appear as random\n
+ * "objects", monsters as random "monsters", and normal grids occasionally\n
+ * appear as random "monsters" or "objects", but note that these random\n
+ * "monsters" and "objects" are really just "colored ascii symbols".\n
+ *\n
+ * Note that "floors" and "invisible traps" (and "zero" features) are\n
+ * drawn as "floors" using a special check for optimization purposes,\n
+ * and these are the only features which get drawn using the special\n
+ * lighting effects activated by "view_special_lite".\n
+ *\n
+ * Note the use of the "mimic" field in the "terrain feature" processing,\n
+ * which allows any feature to "pretend" to be another feature.  This is\n
+ * used to "hide" secret doors, and to make all "doors" appear the same,\n
+ * and all "walls" appear the same, and "hidden" treasure stay hidden.\n
+ * It is possible to use this field to make a feature "look" like a floor,\n
+ * but the "special lighting effects" for floors will not be used.\n
+ *\n
+ * Note the use of the new "terrain feature" information.  Note that the\n
+ * assumption that all interesting "objects" and "terrain features" are\n
+ * memorized allows extremely optimized processing below.  Note the use\n
+ * of separate flags on objects to mark them as memorized allows a grid\n
+ * to have memorized "terrain" without granting knowledge of any object\n
+ * which may appear in that grid.\n
+ *\n
+ * Note the efficient code used to determine if a "floor" grid is\n
+ * "memorized" or "viewable" by the player, where the test for the\n
+ * grid being "viewable" is based on the facts that (1) the grid\n
+ * must be "lit" (torch-lit or perma-lit), (2) the grid must be in\n
+ * line of sight, and (3) the player must not be blind, and uses the\n
+ * assumption that all torch-lit grids are in line of sight.\n
+ *\n
+ * Note that floors (and invisible traps) are the only grids which are\n
+ * not memorized when seen, so only these grids need to check to see if\n
+ * the grid is "viewable" to the player (if it is not memorized).  Since\n
+ * most non-memorized grids are in fact walls, this induces *massive*\n
+ * efficiency, at the cost of *forcing* the memorization of non-floor\n
+ * grids when they are first seen.  Note that "invisible traps" are\n
+ * always treated exactly like "floors", which prevents "cheating".\n
+ *\n
+ * Note the "special lighting effects" which can be activated for floor\n
+ * grids using the "view_special_lite" option (for "white" floor grids),\n
+ * causing certain grids to be displayed using special colors.  If the\n
+ * player is "blind", we will use "dark gray", else if the grid is lit\n
+ * by the torch, and the "view_yellow_lite" option is set, we will use\n
+ * "yellow", else if the grid is "dark", we will use "dark gray", else\n
+ * if the grid is not "viewable", and the "view_bright_lite" option is\n
+ * set, and the we will use "slate" (gray).  We will use "white" for all\n
+ * other cases, in particular, for illuminated viewable floor grids.\n
+ *\n
+ * Note the "special lighting effects" which can be activated for wall\n
+ * grids using the "view_granite_lite" option (for "white" wall grids),\n
+ * causing certain grids to be displayed using special colors.  If the\n
+ * player is "blind", we will use "dark gray", else if the grid is lit\n
+ * by the torch, and the "view_yellow_lite" option is set, we will use\n
+ * "yellow", else if the "view_bright_lite" option is set, and the grid\n
+ * is not "viewable", or is "dark", or is glowing, but not when viewed\n
+ * from the player's current location, we will use "slate" (gray).  We\n
+ * will use "white" for all other cases, in particular, for correctly\n
+ * illuminated viewable wall grids.\n
+ *\n
+ * Note that, when "view_granite_lite" is set, we use an inline version\n
+ * of the "player_can_see_bold()" function to check the "viewability" of\n
+ * grids when the "view_bright_lite" option is set, and we do NOT use\n
+ * any special colors for "dark" wall grids, since this would allow the\n
+ * player to notice the walls of illuminated rooms from a hallway that\n
+ * happened to run beside the room.  The alternative, by the way, would\n
+ * be to prevent the generation of hallways next to rooms, but this\n
+ * would still allow problems when digging towards a room.\n
+ *\n
+ * Note that bizarre things must be done when the "attr" and/or "char"\n
+ * codes have the "high-bit" set, since these values are used to encode\n
+ * various "special" pictures in some versions, and certain situations,\n
+ * such as "multi-hued" or "clear" monsters, cause the attr/char codes\n
+ * to be "scrambled" in various ways.\n
+ *\n
+ * Note that eventually we may use the "&" symbol for embedded treasure,\n
+ * and use the "*" symbol to indicate multiple objects, though this will\n
+ * have to wait for Angband 2.8.0 or later.  Note that currently, this\n
+ * is not important, since only one object or terrain feature is allowed\n
+ * in each grid.  If needed, "k_info[0]" will hold the "stack" attr/char.\n
+ *\n
+ * Note the assumption that doing "x_ptr = &x_info[x]" plus a few of\n
+ * "x_ptr->xxx", is quicker than "x_info[x].xxx", if this is incorrect\n
+ * then a whole lot of code should be changed...  XXX XXX\n
  */
 void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
 {
@@ -848,50 +962,56 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
        /* Boring grids (floors, etc) */
        if (!have_flag(f_ptr->flags, FF_REMEMBER))
        {
-               /* Memorized (or visible) floor */
-               if ((c_ptr->info & CAVE_MARK) ||
-                 (((c_ptr->info & (CAVE_LITE | CAVE_MNLT)) ||
-                  ((c_ptr->info & CAVE_VIEW) &&
-                 (((c_ptr->info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) || p_ptr->see_nocto))) &&
-                  !p_ptr->blind))
+               /*
+                * Handle Memorized or visible floor
+                *
+                * No visual when blinded.
+                *   (to prevent strange effects on darkness breath)
+                * otherwise,
+                * - Can see grids with CAVE_MARK.
+                * - Can see grids with CAVE_LITE or CAVE_MNLT.
+                *   (Such grids also have CAVE_VIEW)
+                * - Can see grids with CAVE_VIEW unless darkened by monsters.
+                */
+               if (!p_ptr->blind &&
+                   ((c_ptr->info & (CAVE_MARK | CAVE_LITE | CAVE_MNLT)) ||
+                    ((c_ptr->info & CAVE_VIEW) && (((c_ptr->info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) || p_ptr->see_nocto))))
                {
-                       /* Normal char */
-                       c = f_ptr->x_char[F_LIT_STANDARD];
-
-                       /* Normal attr */
+                       /* Normal attr/char */
                        a = f_ptr->x_attr[F_LIT_STANDARD];
+                       c = f_ptr->x_char[F_LIT_STANDARD];
 
                        if (p_ptr->wild_mode)
                        {
                                /* Special lighting effects */
-                               /* Handle "blind" */
-                               if (view_special_lite && p_ptr->blind)
+                               /* Handle "night" */
+                               if (view_special_lite && !is_daytime())
                                {
-                                       /* Use a darkly darkened colour/tile */
-                                       a = f_ptr->x_attr[F_LIT_DARKDARK];
-                                       c = f_ptr->x_char[F_LIT_DARKDARK];
+                                       /* Use a darkened colour/tile */
+                                       a = f_ptr->x_attr[F_LIT_DARK];
+                                       c = f_ptr->x_char[F_LIT_DARK];
                                }
                        }
 
                        /* Mega-Hack -- Handle "in-sight" and "darkened" grids */
                        else if (darkened_grid(c_ptr))
                        {
-                               darkened_grid_hack();
+                               /* Unsafe cave grid -- idea borrowed from Unangband */
+                               feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
+
+                               /* Access darkness */
+                               f_ptr = &f_info[feat];
+
+                               /* Char and attr of darkness */
+                               a = f_ptr->x_attr[F_LIT_STANDARD];
+                               c = f_ptr->x_char[F_LIT_STANDARD];
                        }
 
                        /* Special lighting effects */
                        else if (view_special_lite)
                        {
-                               /* Handle "blind" */
-                               if (p_ptr->blind)
-                               {
-                                       /* Use a darkly darkened colour/tile */
-                                       a = f_ptr->x_attr[F_LIT_DARKDARK];
-                                       c = f_ptr->x_char[F_LIT_DARKDARK];
-                               }
-
                                /* Handle "torch-lit" grids */
-                               else if (c_ptr->info & (CAVE_LITE | CAVE_MNLT))
+                               if (c_ptr->info & (CAVE_LITE | CAVE_MNLT))
                                {
                                        /* Torch lite */
                                        if (view_yellow_lite)
@@ -905,9 +1025,9 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                                /* Handle "dark" grids */
                                else if ((c_ptr->info & (CAVE_GLOW | CAVE_MNDK)) != CAVE_GLOW)
                                {
-                                       /* Use a darkly darkened colour/tile */
-                                       a = f_ptr->x_attr[F_LIT_DARKDARK];
-                                       c = f_ptr->x_char[F_LIT_DARKDARK];
+                                       /* Use a darkened colour/tile */
+                                       a = f_ptr->x_attr[F_LIT_DARK];
+                                       c = f_ptr->x_char[F_LIT_DARK];
                                }
 
                                /* Handle "out-of-sight" grids */
@@ -928,18 +1048,13 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                else
                {
                        /* Unsafe cave grid -- idea borrowed from Unangband */
-                       if (view_unsafe_grids && (c_ptr->info & (CAVE_UNSAFE)))
-                               feat = FEAT_UNDETECTED;
-                       else
-                               feat = FEAT_NONE;
+                       feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
 
                        /* Access darkness */
                        f_ptr = &f_info[feat];
 
-                       /* Normal attr */
+                       /* Normal attr/char */
                        a = f_ptr->x_attr[F_LIT_STANDARD];
-
-                       /* Normal char */
                        c = f_ptr->x_char[F_LIT_STANDARD];
                }
        }
@@ -950,17 +1065,15 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                /* Memorized grids */
                if (c_ptr->info & CAVE_MARK)
                {
-                       /* Normal char */
-                       c = f_ptr->x_char[F_LIT_STANDARD];
-
-                       /* Normal attr */
+                       /* Normal attr/char */
                        a = f_ptr->x_attr[F_LIT_STANDARD];
+                       c = f_ptr->x_char[F_LIT_STANDARD];
 
                        if (p_ptr->wild_mode)
                        {
                                /* Special lighting effects */
-                               /* Handle "blind" */
-                               if (view_granite_lite && p_ptr->blind)
+                               /* Handle "blind" or "night" */
+                               if (view_granite_lite && (p_ptr->blind || !is_daytime()))
                                {
                                        /* Use a darkened colour/tile */
                                        a = f_ptr->x_attr[F_LIT_DARK];
@@ -969,9 +1082,26 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                        }
 
                        /* Mega-Hack -- Handle "in-sight" and "darkened" grids */
-                       else if (darkened_grid(c_ptr))
+                       else if (darkened_grid(c_ptr) && !p_ptr->blind)
                        {
-                               darkened_grid_hack();
+                               if (have_flag(f_ptr->flags, FF_LOS) && have_flag(f_ptr->flags, FF_PROJECT))
+                               {
+                                       /* Unsafe cave grid -- idea borrowed from Unangband */
+                                       feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
+
+                                       /* Access darkness */
+                                       f_ptr = &f_info[feat];
+
+                                       /* Char and attr of darkness */
+                                       a = f_ptr->x_attr[F_LIT_STANDARD];
+                                       c = f_ptr->x_char[F_LIT_STANDARD];
+                               }
+                               else if (view_granite_lite && view_bright_lite)
+                               {
+                                       /* Use a darkened colour/tile */
+                                       a = f_ptr->x_attr[F_LIT_DARK];
+                                       c = f_ptr->x_char[F_LIT_DARK];
+                               }
                        }
 
                        /* Special lighting effects */
@@ -1017,7 +1147,7 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                                        }
 
                                        /* Not glowing correctly */
-                                       else if (!feat_supports_los(feat) && !check_local_illumination(y, x))
+                                       else if (!have_flag(f_ptr->flags, FF_LOS) && !check_local_illumination(y, x))
                                        {
                                                /* Use a darkened colour/tile */
                                                a = f_ptr->x_attr[F_LIT_DARK];
@@ -1031,18 +1161,13 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                else
                {
                        /* Unsafe cave grid -- idea borrowed from Unangband */
-                       if (view_unsafe_grids && (c_ptr->info & (CAVE_UNSAFE)))
-                               feat = FEAT_UNDETECTED;
-                       else
-                               feat = FEAT_NONE;
+                       feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
 
                        /* Access feature */
                        f_ptr = &f_info[feat];
 
-                       /* Normal attr */
+                       /* Normal attr/char */
                        a = f_ptr->x_attr[F_LIT_STANDARD];
-
-                       /* Normal char */
                        c = f_ptr->x_char[F_LIT_STANDARD];
                }
        }
@@ -1079,7 +1204,7 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                next_o_idx = o_ptr->next_o_idx;
 
                /* Memorized objects */
-               if (o_ptr->marked)
+               if (o_ptr->marked & OM_FOUND)
                {
                        if (display_autopick)
                        {
@@ -1383,10 +1508,10 @@ void note_spot(int y, int x)
        if (!(c_ptr->info & (CAVE_MARK)))
        {
                /* Feature code (applying "mimic" field) */
-               s16b feat = get_feat_mimic(c_ptr);
+               feature_type *f_ptr = &f_info[get_feat_mimic(c_ptr)];
 
                /* Memorize some "boring" grids */
-               if (!have_flag(f_info[feat].flags, FF_REMEMBER))
+               if (!have_flag(f_ptr->flags, FF_REMEMBER))
                {
                        /* Option -- memorize all torch-lit floors */
                        if (view_torch_grids &&
@@ -1405,7 +1530,7 @@ void note_spot(int y, int x)
                }
 
                /* Memorize normal grids */
-               else if (feat_supports_los(feat))
+               else if (have_flag(f_ptr->flags, FF_LOS))
                {
                        /* Memorize */
                        c_ptr->info |= (CAVE_MARK);
@@ -1432,6 +1557,9 @@ void note_spot(int y, int x)
                        c_ptr->info |= (CAVE_MARK);
                }
        }
+
+       /* Memorize terrain of the grid */
+       c_ptr->info |= (CAVE_KNOWN);
 }
 
 
@@ -1441,12 +1569,12 @@ void display_dungeon(void)
        byte a;
        char c;
 
-       byte ta;
-       char tc;
+       byte ta = 0;
+       char tc = '\0';
 
-       for (x = px - Term->wid / 2 + 1; x <= px + Term->wid / 2; x++)
+       for (x = p_ptr->x - Term->wid / 2 + 1; x <= p_ptr->x + Term->wid / 2; x++)
        {
-               for (y = py - Term->hgt / 2 + 1; y <= py + Term->hgt / 2; y++)
+               for (y = p_ptr->y - Term->hgt / 2 + 1; y <= p_ptr->y + Term->hgt / 2; y++)
                {
                        if (in_bounds2(y, x))
                        {
@@ -1463,14 +1591,14 @@ void display_dungeon(void)
                                }
 
                                /* Hack -- Queue it */
-                               Term_queue_char(x - px + Term->wid / 2 - 1, y - py + Term->hgt / 2 - 1, a, c, ta, tc);
+                               Term_queue_char(x - p_ptr->x + Term->wid / 2 - 1, y - p_ptr->y + Term->hgt / 2 - 1, a, c, ta, tc);
                        }
                        else
                        {
                                /* Clear out-of-bound tiles */
 
                                /* Access darkness */
-                               feature_type *f_ptr = &f_info[FEAT_NONE];
+                               feature_type *f_ptr = &f_info[feat_none];
 
                                /* Normal attr */
                                a = f_ptr->x_attr[F_LIT_STANDARD];
@@ -1479,7 +1607,7 @@ void display_dungeon(void)
                                c = f_ptr->x_char[F_LIT_STANDARD];
 
                                /* Hack -- Queue it */
-                               Term_queue_char(x - px + Term->wid / 2 - 1, y - py + Term->hgt / 2 - 1, a, c, ta, tc);
+                               Term_queue_char(x - p_ptr->x + Term->wid / 2 - 1, y - p_ptr->y + Term->hgt / 2 - 1, a, c, ta, tc);
                        }
                }
        }
@@ -1601,7 +1729,7 @@ void prt_map(void)
        }
 
        /* Display player */
-       lite_spot(py, px);
+       lite_spot(p_ptr->y, p_ptr->x);
 
        /* Restore the cursor */
        (void)Term_set_cursor(v);
@@ -1617,14 +1745,14 @@ void prt_path(int y, int x)
        int i;
        int path_n;
        u16b path_g[512];
-       int default_color = TERM_SLATE;
+       byte_hack default_color = TERM_SLATE;
 
        if (!display_path) return;
        if (-1 == project_length)
                return;
 
        /* Get projection path */
-       path_n = project_path(path_g, (project_length ? project_length : MAX_RANGE), py, px, y, x, PROJECT_PATH|PROJECT_THRU);
+       path_n = project_path(path_g, (project_length ? project_length : MAX_RANGE), p_ptr->y, p_ptr->x, y, x, PROJECT_PATH|PROJECT_THRU);
 
        /* Redraw map */
        p_ptr->redraw |= (PR_MAP);
@@ -1674,7 +1802,7 @@ void prt_path(int y, int x)
                }
 
                /* Known Wall */
-               if ((c_ptr->info & CAVE_MARK) && !have_flag(f_flags_grid(c_ptr), FF_PROJECT)) break;
+               if ((c_ptr->info & CAVE_MARK) && !cave_have_flag_grid(c_ptr, FF_PROJECT)) break;
 
                /* Change color */
                if (nx == x && ny == y) default_color = TERM_L_DARK;
@@ -1685,7 +1813,7 @@ void prt_path(int y, int x)
 static cptr simplify_list[][2] =
 {
 #ifdef JP
-       {"¤ÎËâË¡½ñ", ""},
+       {"の魔法書", ""},
        {NULL, NULL}
 #else
        {"^Ring of ",   "="},
@@ -1720,11 +1848,7 @@ static void display_shortened_item_name(object_type *o_ptr, int y)
        if (p_ptr->image)
        {
                attr = TERM_WHITE;
-#ifdef JP
-               strcpy(buf, "²¿¤«´ñ̯¤Êʪ");
-#else
-               strcpy(buf, "something strange");
-#endif
+               strcpy(buf, _("何か奇妙な物", "something strange"));
        }
 
        for (c = buf; *c; c++)
@@ -1758,7 +1882,7 @@ static void display_shortened_item_name(object_type *o_ptr, int y)
 
        c = buf;
        len = 0;
-       /* È¾³Ñ 12 Ê¸»úʬ¤ÇÀÚ¤ë */
+       /* 半角 12 文字分で切る */
        while(*c)
        {
 #ifdef JP
@@ -1894,7 +2018,7 @@ void display_map(int *cy, int *cx)
                        map_info(j, i, &ta, &tc, &ta, &tc);
 
                        /* Extract the priority */
-                       tp = feat_priority;
+                       tp = (byte_hack)feat_priority;
 
                        if(match_autopick!=-1
                           && (match_autopick_yx[y][x] == -1
@@ -2022,11 +2146,11 @@ void display_map(int *cy, int *cx)
        }
 
        /* Player location */
-               (*cy) = py / yrat + 1 + ROW_MAP;
+               (*cy) = p_ptr->y / yrat + 1 + ROW_MAP;
        if (!use_bigtile)
-               (*cx) = px / xrat + 1 + COL_MAP;
+               (*cx) = p_ptr->x / xrat + 1 + COL_MAP;
        else
-               (*cx) = (px / xrat + 1) * 2 + COL_MAP;
+               (*cx) = (p_ptr->x / xrat + 1) * 2 + COL_MAP;
 
        /* Restore lighting effects */
        view_special_lite = old_view_special_lite;
@@ -2036,33 +2160,33 @@ void display_map(int *cy, int *cx)
        for (y = 0; y < (hgt + 2); y++)
        {
                /* Free one row each array */
-               C_FREE(ma[y], (wid + 2), byte);
-               C_FREE(mc[y], (wid + 2), char);
-               C_FREE(mp[y], (wid + 2), byte);
-               C_FREE(match_autopick_yx[y], (wid + 2), int);
-               C_FREE(object_autopick_yx[y], (wid + 2), object_type **);
+               C_KILL(ma[y], (wid + 2), byte);
+               C_KILL(mc[y], (wid + 2), char);
+               C_KILL(mp[y], (wid + 2), byte);
+               C_KILL(match_autopick_yx[y], (wid + 2), int);
+               C_KILL(object_autopick_yx[y], (wid + 2), object_type *);
        }
 
        /* Free each line map */
-       C_FREE(ma, (hgt + 2), byte_ptr);
-       C_FREE(mc, (hgt + 2), char_ptr);
-       C_FREE(mp, (hgt + 2), byte_ptr);
-       C_FREE(match_autopick_yx, (hgt + 2), sint_ptr);
-       C_FREE(object_autopick_yx, (hgt + 2), object_type **);
+       C_KILL(ma, (hgt + 2), byte_ptr);
+       C_KILL(mc, (hgt + 2), char_ptr);
+       C_KILL(mp, (hgt + 2), byte_ptr);
+       C_KILL(match_autopick_yx, (hgt + 2), sint_ptr);
+       C_KILL(object_autopick_yx, (hgt + 2), object_type **);
 
        /* Free each line map */
        for (y = 0; y < (cur_hgt + 2); y++)
        {
                /* Free one row each array */
-               C_FREE(bigma[y], (cur_wid + 2), byte);
-               C_FREE(bigmc[y], (cur_wid + 2), char);
-               C_FREE(bigmp[y], (cur_wid + 2), byte);
+               C_KILL(bigma[y], (cur_wid + 2), byte);
+               C_KILL(bigmc[y], (cur_wid + 2), char);
+               C_KILL(bigmp[y], (cur_wid + 2), byte);
        }
 
        /* Free each line map */
-       C_FREE(bigma, (cur_hgt + 2), byte_ptr);
-       C_FREE(bigmc, (cur_hgt + 2), char_ptr);
-       C_FREE(bigmp, (cur_hgt + 2), byte_ptr);
+       C_KILL(bigma, (cur_hgt + 2), byte_ptr);
+       C_KILL(bigmc, (cur_hgt + 2), char_ptr);
+       C_KILL(bigmp, (cur_hgt + 2), byte_ptr);
 }
 
 
@@ -2080,11 +2204,7 @@ void do_cmd_view_map(void)
        screen_save();
 
        /* Note */
-#ifdef JP
-prt("¤ªÂÔ¤Á²¼¤µ¤¤...", 0, 0);
-#else
-       prt("Please wait...", 0, 0);
-#endif
+       prt(_("お待ち下さい...", "Please wait..."), 0, 0);
 
        /* Flush */
        Term_fresh();
@@ -2112,11 +2232,8 @@ prt("
                        Term_get_size(&wid, &hgt);
                        row_message = hgt - 1;
 
-#ifdef JP
-                       put_str("²¿¤«¥­¡¼¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤('M':½¦¤¦ 'N':ÊüÃÖ 'D':M+N 'K':²õ¤¹¥¢¥¤¥Æ¥à¤òɽ¼¨)", row_message, 1);
-#else
-                       put_str(" Hit M, N(for ~), K(for !), or D(same as M+N) to display auto-picker items.", row_message, 1);
-#endif
+                       put_str(_("何かキーを押してください('M':拾う 'N':放置 'D':M+N 'K':壊すアイテムを表示)",
+                                         " Hit M, N(for ~), K(for !), or D(same as M+N) to display auto-picker items."), row_message, 1);
 
                        /* Hilite the player */
                        move_cursor(cy, cx);
@@ -2149,11 +2266,8 @@ prt("
        }
        else
        {
-#ifdef JP
-               put_str("²¿¤«¥­¡¼¤ò²¡¤¹¤È¥²¡¼¥à¤ËÌá¤ê¤Þ¤¹", 23, 30);
-#else
-               put_str("Hit any key to continue", 23, 30);
-#endif         /* Hilite the player */
+               put_str(_("何かキーを押すとゲームに戻ります", "Hit any key to continue"), 23, 30);              
+               /* Hilite the player */
                move_cursor(cy, cx);
                /* Get any key */
                inkey();
@@ -2491,7 +2605,7 @@ void update_lite(void)
                /* forget_lite(); Perhaps don't need? */
 
                /* Add it to later visual update */
-               cave_redraw_later(&cave[py][px], py, px);
+               cave_redraw_later(&cave[p_ptr->y][p_ptr->x], p_ptr->y, p_ptr->x);
        }
 #endif
 
@@ -2525,54 +2639,54 @@ void update_lite(void)
        if (p >= 1)
        {
                /* Player grid */
-               cave_lite_hack(py, px);
+               cave_lite_hack(p_ptr->y, p_ptr->x);
 
                /* Adjacent grid */
-               cave_lite_hack(py+1, px);
-               cave_lite_hack(py-1, px);
-               cave_lite_hack(py, px+1);
-               cave_lite_hack(py, px-1);
+               cave_lite_hack(p_ptr->y+1, p_ptr->x);
+               cave_lite_hack(p_ptr->y-1, p_ptr->x);
+               cave_lite_hack(p_ptr->y, p_ptr->x+1);
+               cave_lite_hack(p_ptr->y, p_ptr->x-1);
 
                /* Diagonal grids */
-               cave_lite_hack(py+1, px+1);
-               cave_lite_hack(py+1, px-1);
-               cave_lite_hack(py-1, px+1);
-               cave_lite_hack(py-1, px-1);
+               cave_lite_hack(p_ptr->y+1, p_ptr->x+1);
+               cave_lite_hack(p_ptr->y+1, p_ptr->x-1);
+               cave_lite_hack(p_ptr->y-1, p_ptr->x+1);
+               cave_lite_hack(p_ptr->y-1, p_ptr->x-1);
        }
 
        /* Radius 2 -- lantern radius */
        if (p >= 2)
        {
                /* South of the player */
-               if (cave_los_bold(py + 1, px))
+               if (cave_los_bold(p_ptr->y + 1, p_ptr->x))
                {
-                       cave_lite_hack(py+2, px);
-                       cave_lite_hack(py+2, px+1);
-                       cave_lite_hack(py+2, px-1);
+                       cave_lite_hack(p_ptr->y+2, p_ptr->x);
+                       cave_lite_hack(p_ptr->y+2, p_ptr->x+1);
+                       cave_lite_hack(p_ptr->y+2, p_ptr->x-1);
                }
 
                /* North of the player */
-               if (cave_los_bold(py - 1, px))
+               if (cave_los_bold(p_ptr->y - 1, p_ptr->x))
                {
-                       cave_lite_hack(py-2, px);
-                       cave_lite_hack(py-2, px+1);
-                       cave_lite_hack(py-2, px-1);
+                       cave_lite_hack(p_ptr->y-2, p_ptr->x);
+                       cave_lite_hack(p_ptr->y-2, p_ptr->x+1);
+                       cave_lite_hack(p_ptr->y-2, p_ptr->x-1);
                }
 
                /* East of the player */
-               if (cave_los_bold(py, px + 1))
+               if (cave_los_bold(p_ptr->y, p_ptr->x + 1))
                {
-                       cave_lite_hack(py, px+2);
-                       cave_lite_hack(py+1, px+2);
-                       cave_lite_hack(py-1, px+2);
+                       cave_lite_hack(p_ptr->y, p_ptr->x+2);
+                       cave_lite_hack(p_ptr->y+1, p_ptr->x+2);
+                       cave_lite_hack(p_ptr->y-1, p_ptr->x+2);
                }
 
                /* West of the player */
-               if (cave_los_bold(py, px - 1))
+               if (cave_los_bold(p_ptr->y, p_ptr->x - 1))
                {
-                       cave_lite_hack(py, px-2);
-                       cave_lite_hack(py+1, px-2);
-                       cave_lite_hack(py-1, px-2);
+                       cave_lite_hack(p_ptr->y, p_ptr->x-2);
+                       cave_lite_hack(p_ptr->y+1, p_ptr->x-2);
+                       cave_lite_hack(p_ptr->y-1, p_ptr->x-2);
                }
        }
 
@@ -2585,43 +2699,43 @@ void update_lite(void)
                if (p > 14) p = 14;
 
                /* South-East of the player */
-               if (cave_los_bold(py + 1, px + 1))
+               if (cave_los_bold(p_ptr->y + 1, p_ptr->x + 1))
                {
-                       cave_lite_hack(py+2, px+2);
+                       cave_lite_hack(p_ptr->y+2, p_ptr->x+2);
                }
 
                /* South-West of the player */
-               if (cave_los_bold(py + 1, px - 1))
+               if (cave_los_bold(p_ptr->y + 1, p_ptr->x - 1))
                {
-                       cave_lite_hack(py+2, px-2);
+                       cave_lite_hack(p_ptr->y+2, p_ptr->x-2);
                }
 
                /* North-East of the player */
-               if (cave_los_bold(py - 1, px + 1))
+               if (cave_los_bold(p_ptr->y - 1, p_ptr->x + 1))
                {
-                       cave_lite_hack(py-2, px+2);
+                       cave_lite_hack(p_ptr->y-2, p_ptr->x+2);
                }
 
                /* North-West of the player */
-               if (cave_los_bold(py - 1, px - 1))
+               if (cave_los_bold(p_ptr->y - 1, p_ptr->x - 1))
                {
-                       cave_lite_hack(py-2, px-2);
+                       cave_lite_hack(p_ptr->y-2, p_ptr->x-2);
                }
 
                /* Maximal north */
-               min_y = py - p;
+               min_y = p_ptr->y - p;
                if (min_y < 0) min_y = 0;
 
                /* Maximal south */
-               max_y = py + p;
+               max_y = p_ptr->y + p;
                if (max_y > cur_hgt-1) max_y = cur_hgt-1;
 
                /* Maximal west */
-               min_x = px - p;
+               min_x = p_ptr->x - p;
                if (min_x < 0) min_x = 0;
 
                /* Maximal east */
-               max_x = px + p;
+               max_x = p_ptr->x + p;
                if (max_x > cur_wid-1) max_x = cur_wid-1;
 
                /* Scan the maximal box */
@@ -2629,8 +2743,8 @@ void update_lite(void)
                {
                        for (x = min_x; x <= max_x; x++)
                        {
-                               int dy = (py > y) ? (py - y) : (y - py);
-                               int dx = (px > x) ? (px - x) : (x - px);
+                               int dy = (p_ptr->y > y) ? (p_ptr->y - y) : (y - p_ptr->y);
+                               int dx = (p_ptr->x > x) ? (p_ptr->x - x) : (x - p_ptr->x);
 
                                /* Skip the "central" grids (above) */
                                if ((dy <= 2) && (dx <= 2)) continue;
@@ -2642,7 +2756,7 @@ void update_lite(void)
                                if (d > p) continue;
 
                                /* Viewable, nearby, grids get "torch lit" */
-                               if (player_has_los_bold(y, x))
+                               if (cave[y][x].info & CAVE_VIEW)
                                {
                                        /* This grid is "torch lit" */
                                        cave_lite_hack(y, x);
@@ -2696,15 +2810,16 @@ void update_lite(void)
 
 
 static bool mon_invis;
-static s16b mon_fy, mon_fx;
+static POSITION mon_fy, mon_fx;
 
 /*
  * Add a square to the changes array
  */
-static void mon_lite_hack(int y, int x)
+static void mon_lite_hack(POSITION y, POSITION x)
 {
        cave_type *c_ptr;
-       int       midpoint, dpf, d;
+       int dpf, d;
+       POSITION midpoint;
 
        /* We trust this grid is in bounds */
        /* if (!in_bounds2(y, x)) return; */
@@ -2716,17 +2831,14 @@ static void mon_lite_hack(int y, int x)
 
        if (!cave_los_grid(c_ptr))
        {
-               /* Hack XXX XXX - Is it a wall and monster not in LOS? */
-               if (mon_invis) return;
-
                /* Hack -- Prevent monster lite leakage in walls */
 
                /* Horizontal walls between player and a monster */
-               if (((y < py) && (y > mon_fy)) || ((y > py) && (y < mon_fy)))
+               if (((y < p_ptr->y) && (y > mon_fy)) || ((y > p_ptr->y) && (y < mon_fy)))
                {
-                       dpf = py - mon_fy;
+                       dpf = p_ptr->y - mon_fy;
                        d = y - mon_fy;
-                       midpoint = mon_fx + ((px - mon_fx) * ABS(d)) / ABS(dpf);
+                       midpoint = mon_fx + ((p_ptr->x - mon_fx) * ABS(d)) / ABS(dpf);
 
                        /* Only first wall viewed from mid-x is lit */
                        if (x < midpoint)
@@ -2737,14 +2849,17 @@ static void mon_lite_hack(int y, int x)
                        {
                                if (!cave_los_bold(y, x - 1)) return;
                        }
+
+                       /* Hack XXX XXX - Is it a wall and monster not in LOS? */
+                       else if (mon_invis) return;
                }
 
                /* Vertical walls between player and a monster */
-               if (((x < px) && (x > mon_fx)) || ((x > px) && (x < mon_fx)))
+               if (((x < p_ptr->x) && (x > mon_fx)) || ((x > p_ptr->x) && (x < mon_fx)))
                {
-                       dpf = px - mon_fx;
+                       dpf = p_ptr->x - mon_fx;
                        d = x - mon_fx;
-                       midpoint = mon_fy + ((py - mon_fy) * ABS(d)) / ABS(dpf);
+                       midpoint = mon_fy + ((p_ptr->y - mon_fy) * ABS(d)) / ABS(dpf);
 
                        /* Only first wall viewed from mid-y is lit */
                        if (y < midpoint)
@@ -2755,6 +2870,9 @@ static void mon_lite_hack(int y, int x)
                        {
                                if (!cave_los_bold(y - 1, x)) return;
                        }
+
+                       /* Hack XXX XXX - Is it a wall and monster not in LOS? */
+                       else if (mon_invis) return;
                }
        }
 
@@ -2784,7 +2902,7 @@ static void mon_lite_hack(int y, int x)
 /*
  * Add a square to the changes array
  */
-static void mon_dark_hack(int y, int x)
+static void mon_dark_hack(POSITION y, POSITION x)
 {
        cave_type *c_ptr;
        int       midpoint, dpf, d;
@@ -2797,47 +2915,50 @@ static void mon_dark_hack(int y, int x)
        /* Want a unlit and undarkened square in view of the player */
        if ((c_ptr->info & (CAVE_LITE | CAVE_MNLT | CAVE_MNDK | CAVE_VIEW)) != CAVE_VIEW) return;
 
-       if (!cave_los_grid(c_ptr))
+       if (!cave_los_grid(c_ptr) && !cave_have_flag_grid(c_ptr, FF_PROJECT))
        {
-               /* Hack XXX XXX - Is it a wall and monster not in LOS? */
-               if (mon_invis) return;
-
                /* Hack -- Prevent monster dark lite leakage in walls */
 
                /* Horizontal walls between player and a monster */
-               if (((y < py) && (y > mon_fy)) || ((y > py) && (y < mon_fy)))
+               if (((y < p_ptr->y) && (y > mon_fy)) || ((y > p_ptr->y) && (y < mon_fy)))
                {
-                       dpf = py - mon_fy;
+                       dpf = p_ptr->y - mon_fy;
                        d = y - mon_fy;
-                       midpoint = mon_fx + ((px - mon_fx) * ABS(d)) / ABS(dpf);
+                       midpoint = mon_fx + ((p_ptr->x - mon_fx) * ABS(d)) / ABS(dpf);
 
                        /* Only first wall viewed from mid-x is lit */
                        if (x < midpoint)
                        {
-                               if (!cave_los_bold(y, x + 1)) return;
+                               if (!cave_los_bold(y, x + 1) && !cave_have_flag_bold(y, x + 1, FF_PROJECT)) return;
                        }
                        else if (x > midpoint)
                        {
-                               if (!cave_los_bold(y, x - 1)) return;
+                               if (!cave_los_bold(y, x - 1) && !cave_have_flag_bold(y, x - 1, FF_PROJECT)) return;
                        }
+
+                       /* Hack XXX XXX - Is it a wall and monster not in LOS? */
+                       else if (mon_invis) return;
                }
 
                /* Vertical walls between player and a monster */
-               if (((x < px) && (x > mon_fx)) || ((x > px) && (x < mon_fx)))
+               if (((x < p_ptr->x) && (x > mon_fx)) || ((x > p_ptr->x) && (x < mon_fx)))
                {
-                       dpf = px - mon_fx;
+                       dpf = p_ptr->x - mon_fx;
                        d = x - mon_fx;
-                       midpoint = mon_fy + ((py - mon_fy) * ABS(d)) / ABS(dpf);
+                       midpoint = mon_fy + ((p_ptr->y - mon_fy) * ABS(d)) / ABS(dpf);
 
                        /* Only first wall viewed from mid-y is lit */
                        if (y < midpoint)
                        {
-                               if (!cave_los_bold(y + 1, x)) return;
+                               if (!cave_los_bold(y + 1, x) && !cave_have_flag_bold(y + 1, x, FF_PROJECT)) return;
                        }
                        else if (y > midpoint)
                        {
-                               if (!cave_los_bold(y - 1, x)) return;
+                               if (!cave_los_bold(y - 1, x) && !cave_have_flag_bold(y - 1, x, FF_PROJECT)) return;
                        }
+
+                       /* Hack XXX XXX - Is it a wall and monster not in LOS? */
+                       else if (mon_invis) return;
                }
        }
 
@@ -2868,8 +2989,9 @@ void update_mon_lite(void)
        int i, rad;
        cave_type *c_ptr;
 
-       s16b fx, fy;
-       void (*add_mon_lite)(int, int);
+       POSITION fx, fy;
+       void (*add_mon_lite)(POSITION, POSITION);
+       int f_flag;
 
        s16b end_temp;
 
@@ -2893,166 +3015,172 @@ void update_mon_lite(void)
        /* Empty temp list of new squares to lite up */
        temp_n = 0;
 
-       /* Loop through monsters, adding newly lit squares to changes list */
-       for (i = 1; i < m_max; i++)
+       /* If a monster stops time, don't process */
+       if (!world_monster)
        {
-               monster_type *m_ptr = &m_list[i];
-               monster_race *r_ptr = &r_info[m_ptr->r_idx];
+               monster_type *m_ptr;
+               monster_race *r_ptr;
 
-               /* Skip dead monsters */
-               if (!m_ptr->r_idx) continue;
+               /* Loop through monsters, adding newly lit squares to changes list */
+               for (i = 1; i < m_max; i++)
+               {
+                       m_ptr = &m_list[i];
+                       r_ptr = &r_info[m_ptr->r_idx];
 
-               /* Is it too far away? */
-               if (m_ptr->cdis > dis_lim) continue;
+                       /* Skip dead monsters */
+                       if (!m_ptr->r_idx) continue;
 
-               /* If a monster stops time, break */
-               if (world_monster) break;
+                       /* Is it too far away? */
+                       if (m_ptr->cdis > dis_lim) continue;
 
-               /* Get lite radius */
-               rad = 0;
+                       /* Get lite radius */
+                       rad = 0;
 
-               /* Note the radii are cumulative */
-               if (r_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_SELF_LITE_1)) rad++;
-               if (r_ptr->flags7 & (RF7_HAS_LITE_2 | RF7_SELF_LITE_2)) rad += 2;
-               if (r_ptr->flags7 & (RF7_HAS_DARK_1 | RF7_SELF_DARK_1)) rad--;
-               if (r_ptr->flags7 & (RF7_HAS_DARK_2 | RF7_SELF_DARK_2)) rad -= 2;
+                       /* Note the radii are cumulative */
+                       if (r_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_SELF_LITE_1)) rad++;
+                       if (r_ptr->flags7 & (RF7_HAS_LITE_2 | RF7_SELF_LITE_2)) rad += 2;
+                       if (r_ptr->flags7 & (RF7_HAS_DARK_1 | RF7_SELF_DARK_1)) rad--;
+                       if (r_ptr->flags7 & (RF7_HAS_DARK_2 | RF7_SELF_DARK_2)) rad -= 2;
 
-               /* Exit if has no light */
-               if (!rad) continue;
-               else if (rad > 0)
-               {
-                       if (!(r_ptr->flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) && (m_ptr->csleep || (!dun_level && is_daytime()) || p_ptr->inside_battle)) continue;
-                       if (d_info[dungeon_type].flags1 & DF1_DARKNESS) rad = 1;
-                       add_mon_lite = mon_lite_hack;
-               }
-               else
-               {
-                       if (!(r_ptr->flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2)) && (m_ptr->csleep || (!dun_level && !is_daytime()))) continue;
-                       add_mon_lite = mon_dark_hack;
-                       rad = -rad; /* Use absolute value */
-               }
+                       /* Exit if has no light */
+                       if (!rad) continue;
+                       else if (rad > 0)
+                       {
+                               if (!(r_ptr->flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) && (MON_CSLEEP(m_ptr) || (!dun_level && is_daytime()) || p_ptr->inside_battle)) continue;
+                               if (d_info[dungeon_type].flags1 & DF1_DARKNESS) rad = 1;
+                               add_mon_lite = mon_lite_hack;
+                               f_flag = FF_LOS;
+                       }
+                       else
+                       {
+                               if (!(r_ptr->flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2)) && (MON_CSLEEP(m_ptr) || (!dun_level && !is_daytime()))) continue;
+                               add_mon_lite = mon_dark_hack;
+                               f_flag = FF_PROJECT;
+                               rad = -rad; /* Use absolute value */
+                       }
 
-               /* Access the location */
-               mon_fx = m_ptr->fx;
-               mon_fy = m_ptr->fy;
+                       /* Access the location */
+                       mon_fx = m_ptr->fx;
+                       mon_fy = m_ptr->fy;
 
-               /* Is the monster visible? */
-               mon_invis = !(cave[mon_fy][mon_fx].info & CAVE_VIEW);
+                       /* Is the monster visible? */
+                       mon_invis = !(cave[mon_fy][mon_fx].info & CAVE_VIEW);
 
-               /* The square it is on */
-               add_mon_lite(mon_fy, mon_fx);
+                       /* The square it is on */
+                       add_mon_lite(mon_fy, mon_fx);
 
-               /* Adjacent squares */
-               add_mon_lite(mon_fy + 1, mon_fx);
-               add_mon_lite(mon_fy - 1, mon_fx);
-               add_mon_lite(mon_fy, mon_fx + 1);
-               add_mon_lite(mon_fy, mon_fx - 1);
-               add_mon_lite(mon_fy + 1, mon_fx + 1);
-               add_mon_lite(mon_fy + 1, mon_fx - 1);
-               add_mon_lite(mon_fy - 1, mon_fx + 1);
-               add_mon_lite(mon_fy - 1, mon_fx - 1);
+                       /* Adjacent squares */
+                       add_mon_lite(mon_fy + 1, mon_fx);
+                       add_mon_lite(mon_fy - 1, mon_fx);
+                       add_mon_lite(mon_fy, mon_fx + 1);
+                       add_mon_lite(mon_fy, mon_fx - 1);
+                       add_mon_lite(mon_fy + 1, mon_fx + 1);
+                       add_mon_lite(mon_fy + 1, mon_fx - 1);
+                       add_mon_lite(mon_fy - 1, mon_fx + 1);
+                       add_mon_lite(mon_fy - 1, mon_fx - 1);
 
-               /* Radius 2 */
-               if (rad >= 2)
-               {
-                       /* South of the monster */
-                       if (cave_los_bold(mon_fy + 1, mon_fx))
+                       /* Radius 2 */
+                       if (rad >= 2)
                        {
-                               add_mon_lite(mon_fy + 2, mon_fx + 1);
-                               add_mon_lite(mon_fy + 2, mon_fx);
-                               add_mon_lite(mon_fy + 2, mon_fx - 1);
+                               /* South of the monster */
+                               if (cave_have_flag_bold(mon_fy + 1, mon_fx, f_flag))
+                               {
+                                       add_mon_lite(mon_fy + 2, mon_fx + 1);
+                                       add_mon_lite(mon_fy + 2, mon_fx);
+                                       add_mon_lite(mon_fy + 2, mon_fx - 1);
 
-                               c_ptr = &cave[mon_fy + 2][mon_fx];
+                                       c_ptr = &cave[mon_fy + 2][mon_fx];
 
-                               /* Radius 3 */
-                               if ((rad == 3) && cave_los_grid(c_ptr))
-                               {
-                                       add_mon_lite(mon_fy + 3, mon_fx + 1);
-                                       add_mon_lite(mon_fy + 3, mon_fx);
-                                       add_mon_lite(mon_fy + 3, mon_fx - 1);
+                                       /* Radius 3 */
+                                       if ((rad == 3) && cave_have_flag_grid(c_ptr, f_flag))
+                                       {
+                                               add_mon_lite(mon_fy + 3, mon_fx + 1);
+                                               add_mon_lite(mon_fy + 3, mon_fx);
+                                               add_mon_lite(mon_fy + 3, mon_fx - 1);
+                                       }
                                }
-                       }
 
-                       /* North of the monster */
-                       if (cave_los_bold(mon_fy - 1, mon_fx))
-                       {
-                               add_mon_lite(mon_fy - 2, mon_fx + 1);
-                               add_mon_lite(mon_fy - 2, mon_fx);
-                               add_mon_lite(mon_fy - 2, mon_fx - 1);
+                               /* North of the monster */
+                               if (cave_have_flag_bold(mon_fy - 1, mon_fx, f_flag))
+                               {
+                                       add_mon_lite(mon_fy - 2, mon_fx + 1);
+                                       add_mon_lite(mon_fy - 2, mon_fx);
+                                       add_mon_lite(mon_fy - 2, mon_fx - 1);
 
-                               c_ptr = &cave[mon_fy - 2][mon_fx];
+                                       c_ptr = &cave[mon_fy - 2][mon_fx];
 
-                               /* Radius 3 */
-                               if ((rad == 3) && cave_los_grid(c_ptr))
-                               {
-                                       add_mon_lite(mon_fy - 3, mon_fx + 1);
-                                       add_mon_lite(mon_fy - 3, mon_fx);
-                                       add_mon_lite(mon_fy - 3, mon_fx - 1);
+                                       /* Radius 3 */
+                                       if ((rad == 3) && cave_have_flag_grid(c_ptr, f_flag))
+                                       {
+                                               add_mon_lite(mon_fy - 3, mon_fx + 1);
+                                               add_mon_lite(mon_fy - 3, mon_fx);
+                                               add_mon_lite(mon_fy - 3, mon_fx - 1);
+                                       }
                                }
-                       }
 
-                       /* East of the monster */
-                       if (cave_los_bold(mon_fy, mon_fx + 1))
-                       {
-                               add_mon_lite(mon_fy + 1, mon_fx + 2);
-                               add_mon_lite(mon_fy, mon_fx + 2);
-                               add_mon_lite(mon_fy - 1, mon_fx + 2);
+                               /* East of the monster */
+                               if (cave_have_flag_bold(mon_fy, mon_fx + 1, f_flag))
+                               {
+                                       add_mon_lite(mon_fy + 1, mon_fx + 2);
+                                       add_mon_lite(mon_fy, mon_fx + 2);
+                                       add_mon_lite(mon_fy - 1, mon_fx + 2);
 
-                               c_ptr = &cave[mon_fy][mon_fx + 2];
+                                       c_ptr = &cave[mon_fy][mon_fx + 2];
 
-                               /* Radius 3 */
-                               if ((rad == 3) && cave_los_grid(c_ptr))
-                               {
-                                       add_mon_lite(mon_fy + 1, mon_fx + 3);
-                                       add_mon_lite(mon_fy, mon_fx + 3);
-                                       add_mon_lite(mon_fy - 1, mon_fx + 3);
+                                       /* Radius 3 */
+                                       if ((rad == 3) && cave_have_flag_grid(c_ptr, f_flag))
+                                       {
+                                               add_mon_lite(mon_fy + 1, mon_fx + 3);
+                                               add_mon_lite(mon_fy, mon_fx + 3);
+                                               add_mon_lite(mon_fy - 1, mon_fx + 3);
+                                       }
                                }
-                       }
 
-                       /* West of the monster */
-                       if (cave_los_bold(mon_fy, mon_fx - 1))
-                       {
-                               add_mon_lite(mon_fy + 1, mon_fx - 2);
-                               add_mon_lite(mon_fy, mon_fx - 2);
-                               add_mon_lite(mon_fy - 1, mon_fx - 2);
+                               /* West of the monster */
+                               if (cave_have_flag_bold(mon_fy, mon_fx - 1, f_flag))
+                               {
+                                       add_mon_lite(mon_fy + 1, mon_fx - 2);
+                                       add_mon_lite(mon_fy, mon_fx - 2);
+                                       add_mon_lite(mon_fy - 1, mon_fx - 2);
 
-                               c_ptr = &cave[mon_fy][mon_fx - 2];
+                                       c_ptr = &cave[mon_fy][mon_fx - 2];
 
-                               /* Radius 3 */
-                               if ((rad == 3) && cave_los_grid(c_ptr))
-                               {
-                                       add_mon_lite(mon_fy + 1, mon_fx - 3);
-                                       add_mon_lite(mon_fy, mon_fx - 3);
-                                       add_mon_lite(mon_fy - 1, mon_fx - 3);
+                                       /* Radius 3 */
+                                       if ((rad == 3) && cave_have_flag_grid(c_ptr, f_flag))
+                                       {
+                                               add_mon_lite(mon_fy + 1, mon_fx - 3);
+                                               add_mon_lite(mon_fy, mon_fx - 3);
+                                               add_mon_lite(mon_fy - 1, mon_fx - 3);
+                                       }
                                }
                        }
-               }
 
-               /* Radius 3 */
-               if (rad == 3)
-               {
-                       /* South-East of the monster */
-                       if (cave_los_bold(mon_fy + 1, mon_fx + 1))
+                       /* Radius 3 */
+                       if (rad == 3)
                        {
-                               add_mon_lite(mon_fy + 2, mon_fx + 2);
-                       }
+                               /* South-East of the monster */
+                               if (cave_have_flag_bold(mon_fy + 1, mon_fx + 1, f_flag))
+                               {
+                                       add_mon_lite(mon_fy + 2, mon_fx + 2);
+                               }
 
-                       /* South-West of the monster */
-                       if (cave_los_bold(mon_fy + 1, mon_fx - 1))
-                       {
-                               add_mon_lite(mon_fy + 2, mon_fx - 2);
-                       }
+                               /* South-West of the monster */
+                               if (cave_have_flag_bold(mon_fy + 1, mon_fx - 1, f_flag))
+                               {
+                                       add_mon_lite(mon_fy + 2, mon_fx - 2);
+                               }
 
-                       /* North-East of the monster */
-                       if (cave_los_bold(mon_fy - 1, mon_fx + 1))
-                       {
-                               add_mon_lite(mon_fy - 2, mon_fx + 2);
-                       }
+                               /* North-East of the monster */
+                               if (cave_have_flag_bold(mon_fy - 1, mon_fx + 1, f_flag))
+                               {
+                                       add_mon_lite(mon_fy - 2, mon_fx + 2);
+                               }
 
-                       /* North-West of the monster */
-                       if (cave_los_bold(mon_fy - 1, mon_fx - 1))
-                       {
-                               add_mon_lite(mon_fy - 2, mon_fx - 2);
+                               /* North-West of the monster */
+                               if (cave_have_flag_bold(mon_fy - 1, mon_fx - 1, f_flag))
+                               {
+                                       add_mon_lite(mon_fy - 2, mon_fx - 2);
+                               }
                        }
                }
        }
@@ -3095,8 +3223,8 @@ void update_mon_lite(void)
                }
 
                /* Add to end of temp array */
-               temp_x[temp_n] = (byte)fx;
-               temp_y[temp_n] = (byte)fy;
+               temp_x[temp_n] = fx;
+               temp_y[temp_n] = fy;
                temp_n++;
        }
 
@@ -3155,7 +3283,7 @@ void update_mon_lite(void)
        /* Mega-Hack -- Visual update later */
        p_ptr->update |= (PU_DELAY_VIS);
 
-       p_ptr->monlite = (cave[py][px].info & CAVE_MNLT) ? TRUE : FALSE;
+       p_ptr->monlite = (cave[p_ptr->y][p_ptr->x].info & CAVE_MNLT) ? TRUE : FALSE;
 
        if (p_ptr->special_defense & NINJA_S_STEALTH)
        {
@@ -3163,19 +3291,11 @@ void update_mon_lite(void)
                {
                        if (p_ptr->monlite)
                        {
-#ifdef JP
-                               msg_print("±Æ¤Îʤ¤¤¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
-#else
-                               msg_print("Your mantle of shadow become thin.");
-#endif
+                               msg_print(_("影の覆いが薄れた気がする。", "Your mantle of shadow become thin."));
                        }
                        else
                        {
-#ifdef JP
-                               msg_print("±Æ¤Îʤ¤¤¤¬Ç»¤¯¤Ê¤Ã¤¿¡ª");
-#else
-                               msg_print("Your mantle of shadow restored its original darkness.");
-#endif
+                               msg_print(_("影の覆いが濃くなった!", "Your mantle of shadow restored its original darkness."));
                        }
                }
        }
@@ -3227,7 +3347,7 @@ void forget_view(void)
                /* Forget that the grid is viewable */
                c_ptr->info &= ~(CAVE_VIEW);
 
-               if (!panel_contains(y, x)) continue;
+               /* if (!panel_contains(y, x)) continue; */
 
                /* Update the screen */
                /* lite_spot(y, x); Perhaps don't need? */
@@ -3263,8 +3383,8 @@ void forget_view(void)
  *
  * This function assumes that (y,x) is legal (i.e. on the map).
  *
- * Grid (y1,x1) is on the "diagonal" between (py,px) and (y,x)
- * Grid (y2,x2) is "adjacent", also between (py,px) and (y,x).
+ * Grid (y1,x1) is on the "diagonal" between (p_ptr->y,p_ptr->x) and (y,x)
+ * Grid (y2,x2) is "adjacent", also between (p_ptr->y,p_ptr->x) and (y,x).
  *
  * Note that we are using the "CAVE_XTRA" field for marking grids as
  * "easily viewable".  This bit is cleared at the end of "update_view()".
@@ -3354,7 +3474,7 @@ static bool update_view_aux(int y, int x, int y1, int x1, int y2, int x2)
 
 
        /* Hack -- check line of sight */
-       if (los(py, px, y, x))
+       if (los(p_ptr->y, p_ptr->x, y, x))
        {
                cave_view_hack(c_ptr, y, x);
 
@@ -3461,14 +3581,15 @@ static bool update_view_aux(int y, int x, int y1, int x1, int y2, int x2)
  */
 void update_view(void)
 {
-       int n, m, d, k, y, x, z;
+       int n, m, d, k, z;
+       POSITION y, x;
 
        int se, sw, ne, nw, es, en, ws, wn;
 
        int full, over;
 
-       int y_max = cur_hgt - 1;
-       int x_max = cur_wid - 1;
+       POSITION y_max = cur_hgt - 1;
+       POSITION x_max = cur_wid - 1;
 
        cave_type *c_ptr;
 
@@ -3524,8 +3645,8 @@ void update_view(void)
        /*** Step 1 -- adjacent grids ***/
 
        /* Now start on the player */
-       y = py;
-       x = px;
+       y = p_ptr->y;
+       x = p_ptr->x;
 
        /* Access the grid */
        c_ptr = &cave[y][x];
@@ -3981,8 +4102,8 @@ void forget_flow(void)
  * it everytime the player moves out of LOS of the last
  * "way-point".
  */
-static u16b flow_x = 0;
-static u16b flow_y = 0;
+static POSITION flow_x = 0;
+static POSITION flow_y = 0;
 
 
 
@@ -4001,7 +4122,7 @@ static u16b flow_y = 0;
  */
 void update_flow(void)
 {
-       int x, y, d;
+       POSITION x, y, d;
        int flow_head = 1;
        int flow_tail = 0;
 
@@ -4026,12 +4147,12 @@ void update_flow(void)
        }
 
        /* Save player position */
-       flow_y = py;
-       flow_x = px;
+       flow_y = p_ptr->y;
+       flow_x = p_ptr->x;
 
        /* Add the player's grid to the queue */
-       temp_y[0] = py;
-       temp_x[0] = px;
+       temp_y[0] = p_ptr->y;
+       temp_x[0] = p_ptr->x;
 
        /* Now process the queue */
        while (flow_head != flow_tail)
@@ -4049,8 +4170,8 @@ void update_flow(void)
                for (d = 0; d < 8; d++)
                {
                        int old_head = flow_head;
-                       int m = cave[ty][tx].cost + 1;
-                       int n = cave[ty][tx].dist + 1;
+                       byte_hack m = cave[ty][tx].cost + 1;
+                       byte_hack n = cave[ty][tx].dist + 1;
                        cave_type *c_ptr;
 
                        /* Child location */
@@ -4068,7 +4189,7 @@ void update_flow(void)
                        if (c_ptr->dist != 0 && c_ptr->dist <= n && c_ptr->cost <= m) continue;
 
                        /* Ignore "walls" and "rubble" */
-                       if (!have_flag(f_flags_grid(c_ptr), FF_MOVE) && !is_closed_door(c_ptr->feat)) continue;
+                       if (!cave_have_flag_grid(c_ptr, FF_MOVE) && !is_closed_door(c_ptr->feat)) continue;
 
                        /* Save the flow cost */
                        if (c_ptr->cost == 0 || c_ptr->cost > m) c_ptr->cost = m;
@@ -4150,8 +4271,8 @@ void update_smell(void)
                        cave_type *c_ptr;
 
                        /* Translate table to map grids */
-                       y = i + py - 2;
-                       x = j + px - 2;
+                       y = i + p_ptr->y - 2;
+                       x = j + p_ptr->x - 2;
 
                        /* Check Bounds */
                        if (!in_bounds(y, x)) continue;
@@ -4159,7 +4280,7 @@ void update_smell(void)
                        c_ptr = &cave[y][x];
 
                        /* Walls, water, and lava cannot hold scent. */
-                       if (!have_flag(f_flags_grid(c_ptr), FF_MOVE) && !is_closed_door(c_ptr->feat)) continue;
+                       if (!cave_have_flag_grid(c_ptr, FF_MOVE) && !is_closed_door(c_ptr->feat)) continue;
 
                        /* Grid must not be blocked by walls from the character */
                        if (!player_has_los_bold(y, x)) continue;
@@ -4177,7 +4298,7 @@ void update_smell(void)
 /*
  * Hack -- map the current panel (plus some) ala "magic mapping"
  */
-void map_area(int range)
+void map_area(POSITION range)
 {
        int             i, x, y;
        cave_type       *c_ptr;
@@ -4191,10 +4312,13 @@ void map_area(int range)
        {
                for (x = 1; x < cur_wid - 1; x++)
                {
-                       if (distance(py, px, y, x) > range) continue;
+                       if (distance(p_ptr->y, p_ptr->x, y, x) > range) continue;
 
                        c_ptr = &cave[y][x];
 
+                       /* Memorize terrain of the grid */
+                       c_ptr->info |= (CAVE_KNOWN);
+
                        /* Feature code (applying "mimic" field) */
                        feat = get_feat_mimic(c_ptr);
                        f_ptr = &f_info[feat];
@@ -4283,6 +4407,9 @@ void wiz_lite(bool ninja)
                {
                        cave_type *c_ptr = &cave[y][x];
 
+                       /* Memorize terrain of the grid */
+                       c_ptr->info |= (CAVE_KNOWN);
+
                        /* Feature code (applying "mimic" field) */
                        feat = get_feat_mimic(c_ptr);
                        f_ptr = &f_info[feat];
@@ -4338,6 +4465,11 @@ void wiz_lite(bool ninja)
 
        /* Window stuff */
        p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+
+       if (p_ptr->special_defense & NINJA_S_STEALTH)
+       {
+               if (cave[p_ptr->y][p_ptr->x].info & CAVE_GLOW) set_superstealth(FALSE);
+       }
 }
 
 
@@ -4357,7 +4489,7 @@ void wiz_dark(void)
                        cave_type *c_ptr = &cave[y][x];
 
                        /* Process the grid */
-                       c_ptr->info &= ~(CAVE_MARK | CAVE_IN_DETECT);
+                       c_ptr->info &= ~(CAVE_MARK | CAVE_IN_DETECT | CAVE_KNOWN);
                        c_ptr->info |= (CAVE_UNSAFE);
                }
        }
@@ -4388,9 +4520,12 @@ void wiz_dark(void)
                if (o_ptr->held_m_idx) continue;
 
                /* Forget the object */
-               o_ptr->marked = 0;
+               o_ptr->marked &= OM_TOUCHED;
        }
 
+       /* Forget travel route when we have forgotten map */
+       forget_travel_flow();
+
        /* Mega-Hack -- Forget the view and lite */
        p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
 
@@ -4414,69 +4549,127 @@ void wiz_dark(void)
 /*
  * Change the "feat" flag for a grid, and notice/redraw the grid
  */
-void cave_set_feat(int y, int x, int feat)
+void cave_set_feat(POSITION y, POSITION x, IDX feat)
 {
        cave_type *c_ptr = &cave[y][x];
        feature_type *f_ptr = &f_info[feat];
+       bool old_los, old_mirror;
 
-       if (character_dungeon && is_mirror_grid(c_ptr) && (d_info[dungeon_type].flags1 & DF1_DARKNESS))
+       if (!character_dungeon)
        {
-               c_ptr->info &= ~(CAVE_GLOW);
-               if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK);
+               /* Clear mimic type */
+               c_ptr->mimic = 0;
+
+               /* Change the feature */
+               c_ptr->feat = feat;
+
+               /* Hack -- glow the GLOW terrain */
+               if (have_flag(f_ptr->flags, FF_GLOW) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS))
+               {
+                       int i, yy, xx;
+
+                       for (i = 0; i < 9; i++)
+                       {
+                               yy = y + ddy_ddd[i];
+                               xx = x + ddx_ddd[i];
+                               if (!in_bounds2(yy, xx)) continue;
+                               cave[yy][xx].info |= CAVE_GLOW;
+                       }
+               }
+
+               return;
        }
 
+       old_los = cave_have_flag_bold(y, x, FF_LOS);
+       old_mirror = is_mirror_grid(c_ptr);
+
        /* Clear mimic type */
        c_ptr->mimic = 0;
 
+       /* Change the feature */
+       c_ptr->feat = feat;
+
        /* Remove flag for mirror/glyph */
        c_ptr->info &= ~(CAVE_OBJECT);
 
-       /* Change the feature */
-       c_ptr->feat = feat;
+       if (old_mirror && (d_info[dungeon_type].flags1 & DF1_DARKNESS))
+       {
+               c_ptr->info &= ~(CAVE_GLOW);
+               if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK);
+
+               update_local_illumination(y, x);
+       }
 
        /* Check for change to boring grid */
        if (!have_flag(f_ptr->flags, FF_REMEMBER)) c_ptr->info &= ~(CAVE_MARK);
 
-       /* Check for change to out of sight grid */
-       else if (!player_can_see_bold(y, x)) c_ptr->info &= ~(CAVE_MARK);
+       /* Update the monster */
+       if (c_ptr->m_idx) update_mon(c_ptr->m_idx, FALSE);
 
-       /* Hack -- glow the deep lava */
+       /* Notice */
+       note_spot(y, x);
+
+       /* Redraw */
+       lite_spot(y, x);
+
+       /* Check if los has changed */
+       if (old_los ^ have_flag(f_ptr->flags, FF_LOS))
+       {
+
+#ifdef COMPLEX_WALL_ILLUMINATION /* COMPLEX_WALL_ILLUMINATION */
+
+               update_local_illumination(y, x);
+
+#endif /* COMPLEX_WALL_ILLUMINATION */
+
+               /* Update the visuals */
+               p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE | PU_MONSTERS);
+       }
+
+       /* Hack -- glow the GLOW terrain */
        if (have_flag(f_ptr->flags, FF_GLOW) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS))
        {
                int i, yy, xx;
+               cave_type *cc_ptr;
 
                for (i = 0; i < 9; i++)
                {
                        yy = y + ddy_ddd[i];
                        xx = x + ddx_ddd[i];
                        if (!in_bounds2(yy, xx)) continue;
-                       cave[yy][xx].info |= CAVE_GLOW;
-                       if (player_has_los_bold(yy, xx))
+                       cc_ptr = &cave[yy][xx];
+                       cc_ptr->info |= CAVE_GLOW;
+
+                       if (player_has_los_grid(cc_ptr))
                        {
+                               /* Update the monster */
+                               if (cc_ptr->m_idx) update_mon(cc_ptr->m_idx, FALSE);
+
                                /* Notice */
                                note_spot(yy, xx);
 
                                /* Redraw */
                                lite_spot(yy, xx);
                        }
-               }
-       }
 
-       /* Notice */
-       note_spot(y, x);
+                       update_local_illumination(yy, xx);
+               }
 
-       /* Redraw */
-       lite_spot(y, x);
+               if (p_ptr->special_defense & NINJA_S_STEALTH)
+               {
+                       if (cave[p_ptr->y][p_ptr->x].info & CAVE_GLOW) set_superstealth(FALSE);
+               }
+       }
 }
 
 
-int conv_dungeon_feat(int newfeat)
+IDX conv_dungeon_feat(IDX newfeat)
 {
        feature_type *f_ptr = &f_info[newfeat];
 
        if (have_flag(f_ptr->flags, FF_CONVERT))
        {
-               switch (f_ptr->power)
+               switch (f_ptr->subtype)
                {
                case CONVERT_TYPE_FLOOR:
                        return floor_type[randint0(100)];
@@ -4504,7 +4697,7 @@ int conv_dungeon_feat(int newfeat)
  * Take a feature, determine what that feature becomes
  * through applying the given action.
  */
-int feat_state(int feat, int action)
+IDX feat_state(IDX feat, int action)
 {
        feature_type *f_ptr = &f_info[feat];
        int i;
@@ -4527,10 +4720,10 @@ int feat_state(int feat, int action)
 void cave_alter_feat(int y, int x, int action)
 {
        /* Set old feature */
-       int oldfeat = cave[y][x].feat;
+       IDX oldfeat = cave[y][x].feat;
 
        /* Get the new feat */
-       int newfeat = feat_state(oldfeat, action);
+       IDX newfeat = feat_state(oldfeat, action);
 
        /* No change */
        if (newfeat == oldfeat) return;
@@ -4562,11 +4755,18 @@ void cave_alter_feat(int y, int x, int action)
 
                if (found && character_dungeon && player_can_see_bold(y, x))
                {
-#ifdef JP
-                       msg_print("²¿¤«¤òȯ¸«¤·¤¿¡ª");
-#else
-                       msg_print("You have found something!");
-#endif
+                       msg_print(_("何かを発見した!", "You have found something!"));
+               }
+       }
+
+       if (feature_action_flags[action] & FAF_CRASH_GLASS)
+       {
+               feature_type *old_f_ptr = &f_info[oldfeat];
+
+               if (have_flag(old_f_ptr->flags, FF_GLASS) && character_dungeon)
+               {
+                       project(PROJECT_WHO_GLASS_SHARDS, 1, y, x, MIN(dun_level, 100) / 4, GF_SHARDS,
+                               (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_HIDE | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
                }
        }
 }
@@ -4575,15 +4775,23 @@ void cave_alter_feat(int y, int x, int action)
 /* Remove a mirror */
 void remove_mirror(int y, int x)
 {
+       cave_type *c_ptr = &cave[y][x];
+
        /* Remove the mirror */
-       cave[y][x].info &= ~(CAVE_OBJECT);
-       cave[y][x].mimic = 0;
+       c_ptr->info &= ~(CAVE_OBJECT);
+       c_ptr->mimic = 0;
 
        if (d_info[dungeon_type].flags1 & DF1_DARKNESS)
        {
-               cave[y][x].info &= ~(CAVE_GLOW);
-               if( !view_torch_grids )cave[y][x].info &= ~(CAVE_MARK);
+               c_ptr->info &= ~(CAVE_GLOW);
+               if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK);
+
+               /* Update the monster */
+               if (c_ptr->m_idx) update_mon(c_ptr->m_idx, FALSE);
+
+               update_local_illumination(y, x);
        }
+
        /* Notice */
        note_spot(y, x);
 
@@ -4690,9 +4898,9 @@ void mmove2(int *y, int *x, int y1, int x1, int y2, int x2)
  *
  * This is slightly (but significantly) different from "los(y1,x1,y2,x2)".
  */
-bool projectable(int y1, int x1, int y2, int x2)
+bool projectable(POSITION y1, POSITION x1, POSITION y2, POSITION x2)
 {
-       int y, x;
+       POSITION y, x;
 
        int grid_n = 0;
        u16b grid_g[512];
@@ -4726,12 +4934,12 @@ bool projectable(int y1, int x1, int y2, int x2)
  *
  * Currently the "m" parameter is unused.
  */
-void scatter(int *yp, int *xp, int y, int x, int d, int m)
+void scatter(POSITION *yp, POSITION *xp, POSITION y, POSITION x, POSITION d, BIT_FLAGS mode)
 {
-       int nx, ny;
+       POSITION nx, ny;
 
        /* Unused */
-       m = m;
+       mode = mode;
 
        /* Pick a location */
        while (TRUE)
@@ -4746,8 +4954,8 @@ void scatter(int *yp, int *xp, int y, int x, int d, int m)
                /* Ignore "excessively distant" locations */
                if ((d > 1) && (distance(y, x, ny, nx) > d)) continue;
 
-               /* Require "line of sight" */
-               if (los(y, x, ny, nx)) break;
+               /* Require "line of projection" */
+               if (projectable(y, x, ny, nx)) break;
        }
 
        /* Save the location */
@@ -4761,7 +4969,7 @@ void scatter(int *yp, int *xp, int y, int x, int d, int m)
 /*
  * Track a new monster
  */
-void health_track(int m_idx)
+void health_track(MONSTER_IDX m_idx)
 {
        /* Mount monster is already tracked */
        if (m_idx && m_idx == p_ptr->riding) return;
@@ -4778,7 +4986,7 @@ void health_track(int m_idx)
 /*
  * Hack -- track the given monster race
  */
-void monster_race_track(int r_idx)
+void monster_race_track(MONRACE_IDX r_idx)
 {
        /* Save this monster ID */
        p_ptr->monster_race_idx = r_idx;
@@ -4792,7 +5000,7 @@ void monster_race_track(int r_idx)
 /*
  * Hack -- track the given object kind
  */
-void object_kind_track(int k_idx)
+void object_kind_track(IDX k_idx)
 {
        /* Save this monster ID */
        p_ptr->object_kind_idx = k_idx;
@@ -4812,10 +5020,12 @@ void object_kind_track(int k_idx)
  *
  * All disturbance cancels repeated commands, resting, and running.
  */
-void disturb(int stop_search, int unused_flag)
+void disturb(int stop_search, int stop_travel)
 {
+#ifndef TRAVEL
        /* Unused */
-       unused_flag = unused_flag;
+       stop_travel = stop_travel;
+#endif
 
        /* Cancel auto-commands */
        /* command_new = 0; */
@@ -4853,6 +5063,20 @@ void disturb(int stop_search, int unused_flag)
                p_ptr->update |= (PU_FLOW);
        }
 
+#ifdef TRAVEL
+       if (stop_travel)
+       {
+               /* Cancel */
+               travel.run = 0;
+
+               /* Check for new panel if appropriate */
+               if (center_player && !center_running) verify_panel();
+
+               /* Calculate torch radius */
+               p_ptr->update |= (PU_TORCH);
+       }
+#endif
+
        /* Flush the input if requested */
        if (flush_disturb) flush();
 }
@@ -4885,9 +5109,14 @@ void glow_deep_lava_and_bldg(void)
                                        xx = x + ddx_ddd[i];
                                        if (!in_bounds2(yy, xx)) continue;
                                        cave[yy][xx].info |= CAVE_GLOW;
-                                       if (player_has_los_bold(yy, xx)) note_spot(yy, xx);
                                }
                        }
                }
        }
+
+       /* Update the view and lite */
+       p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
+
+       /* Redraw map */
+       p_ptr->redraw |= (PR_MAP);
 }