3 #include "floor-save.h"
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
13 floor_type floor_info;
16 * The array of saved floors
18 saved_floor_type saved_floors[MAX_SAVED_FLOORS];
21 * @brief 鍵のかかったドアを配置する
22 * @param y 配置したいフロアのY座標
23 * @param x 配置したいフロアのX座標
26 void place_locked_door(floor_type *floor_ptr, POSITION y, POSITION x)
28 if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
30 place_floor_bold(y, x);
34 set_cave_feat(floor_ptr, y, x, feat_locked_door_random((d_info[p_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
35 floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
43 * @param y 配置したいフロアのY座標
44 * @param x 配置したいフロアのX座標
45 * @param type DOOR_DEFAULT / DOOR_DOOR / DOOR_GLASS_DOOR / DOOR_CURTAIN のいずれか
48 void place_secret_door(floor_type *floor_ptr, POSITION y, POSITION x, int type)
50 if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
52 place_floor_bold(y, x);
56 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
58 if (type == DOOR_DEFAULT)
60 type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) &&
61 one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :
62 ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
65 /* Create secret door */
66 place_closed_door(y, x, type);
68 if (type != DOOR_CURTAIN)
70 /* Hide by inner wall because this is used in rooms only */
71 g_ptr->mimic = feat_wall_inner;
73 /* Floor type terrain cannot hide a door */
74 if (feat_supports_los(g_ptr->mimic) && !feat_supports_los(g_ptr->feat))
76 if (have_flag(f_info[g_ptr->mimic].flags, FF_MOVE) || have_flag(f_info[g_ptr->mimic].flags, FF_CAN_FLY))
78 g_ptr->feat = one_in_(2) ? g_ptr->mimic : feat_ground_type[randint0(100)];
84 g_ptr->info &= ~(CAVE_FLOOR);
89 static int scent_when = 0;
92 * Characters leave scent trails for perceptive monsters to track.
94 * Smell is rather more limited than sound. Many creatures cannot use
95 * it at all, it doesn't extend very far outwards from the character's
96 * current position, and monsters can use it to home in the character,
97 * but not to run away from him.
99 * Smell is valued according to age. When a character takes his turn,
100 * scent is aged by one, and new scent of the current age is laid down.
101 * Speedy characters leave more scent, true, but it also ages faster,
102 * which makes it harder to hunt them down.
104 * Whenever the age count loops, most of the scent trail is erased and
105 * the age of the remainder is recalculated.
107 void update_smell(floor_type *floor_ptr, player_type *subject_ptr)
112 /* Create a table that controls the spread of scent */
113 const int scent_adjust[5][5] =
122 /* Loop the age and adjust scent values when necessary */
123 if (++scent_when == 254)
125 /* Scan the entire dungeon */
126 for (y = 0; y < floor_ptr->height; y++)
128 for (x = 0; x < floor_ptr->width; x++)
130 int w = floor_ptr->grid_array[y][x].when;
131 floor_ptr->grid_array[y][x].when = (w > 128) ? (w - 128) : 0;
140 /* Lay down new scent */
141 for (i = 0; i < 5; i++)
143 for (j = 0; j < 5; j++)
147 /* Translate table to map grids */
148 y = i + subject_ptr->y - 2;
149 x = j + subject_ptr->x - 2;
152 if (!in_bounds(floor_ptr, y, x)) continue;
154 g_ptr = &floor_ptr->grid_array[y][x];
156 /* Walls, water, and lava cannot hold scent. */
157 if (!cave_have_flag_grid(g_ptr, FF_MOVE) && !is_closed_door(g_ptr->feat)) continue;
159 /* Grid must not be blocked by walls from the character */
160 if (!player_has_los_bold(subject_ptr, y, x)) continue;
162 /* Note grids that are too far away */
163 if (scent_adjust[i][j] == -1) continue;
165 /* Mark the grid with new scent */
166 g_ptr->when = scent_when + scent_adjust[i][j];
173 * Hack -- forget the "flow" information
175 void forget_flow(floor_type *floor_ptr)
179 /* Check the entire dungeon */
180 for (y = 0; y < floor_ptr->height; y++)
182 for (x = 0; x < floor_ptr->width; x++)
184 /* Forget the old data */
185 floor_ptr->grid_array[y][x].dist = 0;
186 floor_ptr->grid_array[y][x].cost = 0;
187 floor_ptr->grid_array[y][x].when = 0;
193 * Routine used by the random vault creators to add a door to a location
194 * Note that range checking has to be done in the calling routine.
196 * The doors must be INSIDE the allocated region.
198 void add_door(floor_type* floor_ptr, POSITION x, POSITION y)
200 /* Need to have a wall in the center square */
201 if (!is_outer_bold(floor_ptr, y, x)) return;
212 if (is_floor_bold(floor_ptr, y - 1, x) && is_floor_bold(floor_ptr, y + 1, x) &&
213 (is_outer_bold(floor_ptr, y, x - 1) && is_outer_bold(floor_ptr, y, x + 1)))
216 place_secret_door(floor_ptr, y, x, DOOR_DEFAULT);
218 /* set boundarys so don't get wide doors */
219 place_solid_bold(y, x - 1);
220 place_solid_bold(y, x + 1);
229 * where x = don't care
232 if (is_outer_bold(floor_ptr, y - 1, x) && is_outer_bold(floor_ptr, y + 1, x) &&
233 is_floor_bold(floor_ptr, y, x - 1) && is_floor_bold(floor_ptr, y, x + 1))
236 place_secret_door(floor_ptr, y, x, DOOR_DEFAULT);
238 /* set boundarys so don't get wide doors */
239 place_solid_bold(y - 1, x);
240 place_solid_bold(y + 1, x);