OSDN Git Service

[Fix] #39525 コメント置換ミス修正. / Fix comment replacing error.
[hengband/hengband.git] / src / floor.c
1 #include "angband.h"
2 #include "floor.h"
3 #include "floor-save.h"
4 #include "grid.h"
5 #include "dungeon.h"
6 #include "rooms.h"
7
8 /*
9  * The array of floor [MAX_WID][MAX_HGT].
10  * Not completely allocated, that would be inefficient
11  * Not completely hardcoded, that would overflow memory
12  */
13 floor_type floor_info;
14
15 /*
16  * The array of saved floors
17  */
18 saved_floor_type saved_floors[MAX_SAVED_FLOORS];
19
20 /*!
21 * @brief 鍵のかかったドアを配置する
22 * @param y 配置したいフロアのY座標
23 * @param x 配置したいフロアのX座標
24 * @return なし
25 */
26 void place_locked_door(floor_type *floor_ptr, POSITION y, POSITION x)
27 {
28         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
29         {
30                 place_floor_bold(y, x);
31         }
32         else
33         {
34                 set_cave_feat(p_ptr->current_floor_ptr, y, x, feat_locked_door_random((d_info[p_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
35                 p_ptr->current_floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
36                 delete_monster(y, x);
37         }
38 }
39
40
41 /*!
42 * @brief 隠しドアを配置する
43 * @param y 配置したいフロアのY座標
44 * @param x 配置したいフロアのX座標
45 * @param type DOOR_DEFAULT / DOOR_DOOR / DOOR_GLASS_DOOR / DOOR_CURTAIN のいずれか
46 * @return なし
47 */
48 void place_secret_door(floor_type *floor_ptr, POSITION y, POSITION x, int type)
49 {
50         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
51         {
52                 place_floor_bold(y, x);
53         }
54         else
55         {
56                 grid_type *g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
57
58                 if (type == DOOR_DEFAULT)
59                 {
60                         type = ((d_info[p_ptr->dungeon_idx].flags1 & DF1_CURTAIN) &&
61                                 one_in_((d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :
62                                 ((d_info[p_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
63                 }
64
65                 /* Create secret door */
66                 place_closed_door(y, x, type);
67
68                 if (type != DOOR_CURTAIN)
69                 {
70                         /* Hide by inner wall because this is used in rooms only */
71                         g_ptr->mimic = feat_wall_inner;
72
73                         /* Floor type terrain cannot hide a door */
74                         if (feat_supports_los(g_ptr->mimic) && !feat_supports_los(g_ptr->feat))
75                         {
76                                 if (have_flag(f_info[g_ptr->mimic].flags, FF_MOVE) || have_flag(f_info[g_ptr->mimic].flags, FF_CAN_FLY))
77                                 {
78                                         g_ptr->feat = one_in_(2) ? g_ptr->mimic : feat_ground_type[randint0(100)];
79                                 }
80                                 g_ptr->mimic = 0;
81                         }
82                 }
83
84                 g_ptr->info &= ~(CAVE_FLOOR);
85                 delete_monster(y, x);
86         }
87 }
88
89
90 static int scent_when = 0;
91
92 /*
93  * Characters leave scent trails for perceptive monsters to track.
94  *
95  * Smell is rather more limited than sound.  Many creatures cannot use
96  * it at all, it doesn't extend very far outwards from the character's
97  * current position, and monsters can use it to home in the character,
98  * but not to run away from him.
99  *
100  * Smell is valued according to age.  When a character takes his turn,
101  * scent is aged by one, and new scent of the current age is laid down.
102  * Speedy characters leave more scent, true, but it also ages faster,
103  * which makes it harder to hunt them down.
104  *
105  * Whenever the age count loops, most of the scent trail is erased and
106  * the age of the remainder is recalculated.
107  */
108 void update_smell(floor_type *floor_ptr)
109 {
110         POSITION i, j;
111         POSITION y, x;
112
113         /* Create a table that controls the spread of scent */
114         const int scent_adjust[5][5] =
115         {
116                 { -1, 0, 0, 0,-1 },
117                 {  0, 1, 1, 1, 0 },
118                 {  0, 1, 2, 1, 0 },
119                 {  0, 1, 1, 1, 0 },
120                 { -1, 0, 0, 0,-1 },
121         };
122
123         /* Loop the age and adjust scent values when necessary */
124         if (++scent_when == 254)
125         {
126                 /* Scan the entire dungeon */
127                 for (y = 0; y < floor_ptr->height; y++)
128                 {
129                         for (x = 0; x < floor_ptr->width; x++)
130                         {
131                                 int w = floor_ptr->grid_array[y][x].when;
132                                 floor_ptr->grid_array[y][x].when = (w > 128) ? (w - 128) : 0;
133                         }
134                 }
135
136                 /* Restart */
137                 scent_when = 126;
138         }
139
140
141         /* Lay down new scent */
142         for (i = 0; i < 5; i++)
143         {
144                 for (j = 0; j < 5; j++)
145                 {
146                         grid_type *g_ptr;
147
148                         /* Translate table to map grids */
149                         y = i + p_ptr->y - 2;
150                         x = j + p_ptr->x - 2;
151
152                         /* Check Bounds */
153                         if (!in_bounds(floor_ptr, y, x)) continue;
154
155                         g_ptr = &floor_ptr->grid_array[y][x];
156
157                         /* Walls, water, and lava cannot hold scent. */
158                         if (!cave_have_flag_grid(g_ptr, FF_MOVE) && !is_closed_door(g_ptr->feat)) continue;
159
160                         /* Grid must not be blocked by walls from the character */
161                         if (!player_has_los_bold(y, x)) continue;
162
163                         /* Note grids that are too far away */
164                         if (scent_adjust[i][j] == -1) continue;
165
166                         /* Mark the grid with new scent */
167                         g_ptr->when = scent_when + scent_adjust[i][j];
168                 }
169         }
170 }
171