*/
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;
*/
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
+#define COMPLEX_WALL_ILLUMINATION
+
/*
* Check for "local" illumination
*/
int xx = (x < px) ? (x + 1) : (x > px) ? (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 */
+}
+
+
+#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)); \
+ } \
+}
+
+
+/*
+ * Update "local" illumination
+ */
+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 != py) && (x != px))
+ {
+ yy = (y < py) ? (y - 1) : (y + 1);
+ xx = (x < px) ? (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 != px) /* y == py */
+ {
+ xx = (x < px) ? (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 != py) /* x == px */
+ {
+ yy = (y < py) ? (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 != py) && (x != px))
+ {
+ yy = (y < py) ? (y - 1) : (y + 1);
+ xx = (x < px) ? (x - 1) : (x + 1);
+ update_local_illumination_aux(yy, xx);
+ }
+ else if (x != px) /* y == py */
+ {
+ xx = (x < px) ? (x - 1) : (x + 1);
+ for (i = -1; i <= 1; i++)
+ {
+ yy = y + i;
+ update_local_illumination_aux(yy, xx);
+ }
+ }
+ else if (y != py) /* x == px */
+ {
+ yy = (y < py) ? (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 */
}
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;
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);
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);
-}
-
-
-
-
-/*
- * 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);
+ if (object_is_artifact(o_ptr)) return (FALSE);
}
/* Accept */
* The layout of the array is [x][0] = light and [x][1] = dark.
*/
-byte lighting_colours[16][2] =
+static byte lighting_colours[16][2] =
{
/* TERM_DARK */
{TERM_L_DARK, TERM_DARK},
/*
- * 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".
+ * Apply "default" feature lighting effects
*/
-#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? */
#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)
+ !p_ptr->see_nocto)
/*
/* 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)
/* 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 */
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];
}
}
/* 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];
}
/* 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 */
}
/* 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];
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];
}
}
next_o_idx = o_ptr->next_o_idx;
/* Memorized objects */
- if (o_ptr->marked)
+ if (o_ptr->marked & OM_FOUND)
{
if (display_autopick)
{
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 &&
}
/* Memorize normal grids */
- else if (feat_supports_los(feat))
+ else if (have_flag(f_ptr->flags, FF_LOS))
{
/* Memorize */
c_ptr->info |= (CAVE_MARK);
/* 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];
}
/* 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;
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);
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 (!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 (!cave_los_bold(y - 1, x)) return;
}
+
+ /* Hack XXX XXX - Is it a wall and monster not in LOS? */
+ else if (mon_invis) return;
}
}
/* 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 */
/* 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 */
/* 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;
}
}
s16b fx, fy;
void (*add_mon_lite)(int, int);
+ int f_flag;
s16b end_temp;
/* 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);
+ }
}
}
}
/* 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? */
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;
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;
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+
+ if (p_ptr->special_defense & NINJA_S_STEALTH)
+ {
+ if (cave[py][px].info & CAVE_GLOW) set_superstealth(FALSE);
+ }
}
if (o_ptr->held_m_idx) continue;
/* Forget the object */
- o_ptr->marked = 0;
+ o_ptr->marked &= OM_TOUCHED;
}
/* Mega-Hack -- Forget the view and lite */
{
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);
+
+ /* 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 deep lava */
+ /* 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[py][px].info & CAVE_GLOW) set_superstealth(FALSE);
+ }
+ }
}
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)];
#endif
}
}
+
+ 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);
+ }
+ }
}
/* 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);
/* 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 */
p_ptr->update |= (PU_FLOW);
}
+#ifdef TRAVEL
+ if (travel.run)
+ {
+ /* 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();
}
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);
}