OSDN Git Service

空腹充足の巻物の記述を削除.
[hengband/hengband.git] / src / cave.c
index 32a7cf1..e163283 100644 (file)
@@ -626,41 +626,6 @@ 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 (object_is_artifact(o_ptr)) return (FALSE);
-       }
-
-       /* Accept */
-       return (TRUE);
-}
-
-
-
-
-/*
  * Hack -- Legal monster codes
  */
 static char image_monster_hack[] = \
@@ -1003,7 +968,7 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                        else if (darkened_grid(c_ptr))
                        {
                                /* Unsafe cave grid -- idea borrowed from Unangband */
-                               feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? FEAT_UNDETECTED : FEAT_NONE;
+                               feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
 
                                /* Access darkness */
                                f_ptr = &f_info[feat];
@@ -1054,10 +1019,7 @@ 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];
@@ -1096,7 +1058,7 @@ void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
                                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;
+                                       feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
 
                                        /* Access darkness */
                                        f_ptr = &f_info[feat];
@@ -1170,10 +1132,7 @@ 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];
@@ -1607,7 +1566,7 @@ void display_dungeon(void)
                                /* 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];
@@ -2779,7 +2738,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);
@@ -3068,14 +3027,14 @@ void update_mon_lite(void)
                        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 (!(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)) && (m_ptr->csleep || (!dun_level && !is_daytime()))) continue;
+                               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 */
@@ -4573,7 +4532,35 @@ void cave_set_feat(int y, int x, int feat)
 {
        cave_type *c_ptr = &cave[y][x];
        feature_type *f_ptr = &f_info[feat];
-       bool old_los = cave_have_flag_bold(y, x, FF_LOS);
+       bool old_los, old_mirror;
+
+       if (!character_dungeon)
+       {
+               /* 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;
@@ -4581,47 +4568,44 @@ void cave_set_feat(int y, int x, int feat)
        /* Change the feature */
        c_ptr->feat = feat;
 
-       if (character_dungeon)
-       {
-               if (is_mirror_grid(c_ptr) && (d_info[dungeon_type].flags1 & DF1_DARKNESS))
-               {
-                       c_ptr->info &= ~(CAVE_GLOW);
-                       if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK);
+       /* Remove flag for mirror/glyph */
+       c_ptr->info &= ~(CAVE_OBJECT);
 
-                       update_local_illumination(y, x);
-               }
+       if (old_mirror && (d_info[dungeon_type].flags1 & DF1_DARKNESS))
+       {
+               c_ptr->info &= ~(CAVE_GLOW);
+               if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK);
 
-               /* Remove flag for mirror/glyph */
-               c_ptr->info &= ~(CAVE_OBJECT);
+               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 boring grid */
+       if (!have_flag(f_ptr->flags, FF_REMEMBER)) c_ptr->info &= ~(CAVE_MARK);
 
-               /* Update the monster */
-               if (c_ptr->m_idx) update_mon(c_ptr->m_idx, FALSE);
+       /* Update the monster */
+       if (c_ptr->m_idx) update_mon(c_ptr->m_idx, FALSE);
 
-               /* Notice */
-               note_spot(y, x);
+       /* Notice */
+       note_spot(y, x);
 
-               /* Redraw */
-               lite_spot(y, x);
+       /* Redraw */
+       lite_spot(y, x);
 
-               /* Check if los has changed */
-               if (old_los ^ have_flag(f_ptr->flags, FF_LOS))
-               {
+       /* 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);
+               update_local_illumination(y, x);
 
 #endif /* COMPLEX_WALL_ILLUMINATION */
 
-                       /* Update the visuals */
-                       p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE | PU_MONSTERS);
-               }
+               /* 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;
@@ -4634,27 +4618,25 @@ void cave_set_feat(int y, int x, int feat)
                        if (!in_bounds2(yy, xx)) continue;
                        cc_ptr = &cave[yy][xx];
                        cc_ptr->info |= CAVE_GLOW;
-                       if (character_dungeon)
-                       {
-                               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);
+                       if (player_has_los_grid(cc_ptr))
+                       {
+                               /* Update the monster */
+                               if (cc_ptr->m_idx) update_mon(cc_ptr->m_idx, FALSE);
 
-                                       /* Redraw */
-                                       lite_spot(yy, xx);
-                               }
+                               /* Notice */
+                               note_spot(yy, xx);
 
-                               update_local_illumination(yy, xx);
+                               /* Redraw */
+                               lite_spot(yy, xx);
                        }
+
+                       update_local_illumination(yy, xx);
                }
 
                if (p_ptr->special_defense & NINJA_S_STEALTH)
                {
-                       if (character_dungeon && (cave[py][px].info & CAVE_GLOW)) set_superstealth(FALSE);
+                       if (cave[py][px].info & CAVE_GLOW) set_superstealth(FALSE);
                }
        }
 }
@@ -4666,7 +4648,7 @@ int conv_dungeon_feat(int 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)];
@@ -4759,6 +4741,17 @@ void cave_alter_feat(int y, int x, int action)
 #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);
+               }
+       }
 }