1 #include "room/rooms-special.h"
2 #include "dungeon/dungeon.h"
3 #include "floor/floor-generate.h"
4 #include "floor/floor.h"
5 #include "grid/feature.h"
7 #include "monster-race/monster-race-hook.h"
8 #include "monster/monster2.h"
9 #include "monster/place-monster-types.h"
10 #include "object-enchant/item-apply-magic.h"
11 #include "object/object-kind-hook.h"
12 #include "room/rooms.h"
13 #include "system/system-variables.h"
14 #include "util/util.h"
17 * @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms
18 * @param player_ptr プレーヤーへの参照ポインタ
21 bool build_type15(player_type *player_ptr)
23 POSITION y, x, y2, x2, yval, xval;
24 POSITION y1, x1, xsize, ysize;
29 /* Pick a room size */
30 xsize = rand_range(9, 13);
31 ysize = rand_range(9, 13);
33 /* Find and reserve some space in the dungeon. Get center of room. */
34 floor_type *floor_ptr = player_ptr->current_floor_ptr;
35 if (!find_space(player_ptr, &yval, &xval, ysize + 2, xsize + 2)) return FALSE;
37 /* Choose lite or dark */
38 light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
40 /* Get corner values */
41 y1 = yval - ysize / 2;
42 x1 = xval - xsize / 2;
43 y2 = yval + (ysize - 1) / 2;
44 x2 = xval + (xsize - 1) / 2;
46 /* Place a full floor under the room */
47 for (y = y1 - 1; y <= y2 + 1; y++)
49 for (x = x1 - 1; x <= x2 + 1; x++)
51 g_ptr = &floor_ptr->grid_array[y][x];
52 place_grid(player_ptr, g_ptr, GB_FLOOR);
53 g_ptr->feat = feat_glass_floor;
54 g_ptr->info |= (CAVE_ROOM);
55 if (light) g_ptr->info |= (CAVE_GLOW);
59 /* Walls around the room */
60 for (y = y1 - 1; y <= y2 + 1; y++)
62 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
63 place_grid(player_ptr, g_ptr, GB_OUTER);
64 g_ptr->feat = feat_glass_wall;
65 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
66 place_grid(player_ptr, g_ptr, GB_OUTER);
67 g_ptr->feat = feat_glass_wall;
70 for (x = x1 - 1; x <= x2 + 1; x++)
72 g_ptr = &floor_ptr->grid_array[y1 - 1][x];
73 place_grid(player_ptr, g_ptr, GB_OUTER);
74 g_ptr->feat = feat_glass_wall;
75 g_ptr = &floor_ptr->grid_array[y2 + 1][x];
76 place_grid(player_ptr, g_ptr, GB_OUTER);
77 g_ptr->feat = feat_glass_wall;
82 case 1: /* 4 lite breathers + potion */
85 get_mon_num_prep(player_ptr, vault_aux_lite, NULL);
87 /* Place fixed lite berathers */
88 for (dir1 = 4; dir1 < 8; dir1++)
90 MONRACE_IDX r_idx = get_mon_num(player_ptr, floor_ptr->dun_level, 0);
92 y = yval + 2 * ddy_ddd[dir1];
93 x = xval + 2 * ddx_ddd[dir1];
94 if (r_idx) place_monster_aux(player_ptr, 0, y, x, r_idx, PM_ALLOW_SLEEP);
96 /* Walls around the breather */
97 for (dir2 = 0; dir2 < 8; dir2++)
99 g_ptr = &floor_ptr->grid_array[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];
100 place_grid(player_ptr, g_ptr, GB_INNER);
101 g_ptr->feat = feat_glass_wall;
105 /* Walls around the potion */
106 for (dir1 = 0; dir1 < 4; dir1++)
108 y = yval + 2 * ddy_ddd[dir1];
109 x = xval + 2 * ddx_ddd[dir1];
110 g_ptr = &floor_ptr->grid_array[y][x];
111 place_grid(player_ptr, g_ptr, GB_INNER_PERM);
112 g_ptr->feat = feat_permanent_glass_wall;
113 floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);
118 y = yval + 2 * ddy_ddd[dir1];
119 x = xval + 2 * ddx_ddd[dir1];
120 place_secret_door(player_ptr, y, x, DOOR_GLASS_DOOR);
121 g_ptr = &floor_ptr->grid_array[y][x];
122 if (is_closed_door(player_ptr, g_ptr->feat)) g_ptr->mimic = feat_glass_wall;
125 get_obj_num_hook = kind_is_potion;
126 place_object(player_ptr, yval, xval, AM_NO_FIXED_ART);
127 floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
131 case 2: /* 1 lite breather + random object */
137 g_ptr = &floor_ptr->grid_array[y1 + 1][x1 + 1];
138 place_grid(player_ptr, g_ptr, GB_INNER);
139 g_ptr->feat = feat_glass_wall;
141 g_ptr = &floor_ptr->grid_array[y1 + 1][x2 - 1];
142 place_grid(player_ptr, g_ptr, GB_INNER);
143 g_ptr->feat = feat_glass_wall;
145 g_ptr = &floor_ptr->grid_array[y2 - 1][x1 + 1];
146 place_grid(player_ptr, g_ptr, GB_INNER);
147 g_ptr->feat = feat_glass_wall;
149 g_ptr = &floor_ptr->grid_array[y2 - 1][x2 - 1];
150 place_grid(player_ptr, g_ptr, GB_INNER);
151 g_ptr->feat = feat_glass_wall;
152 get_mon_num_prep(player_ptr, vault_aux_lite, NULL);
154 r_idx = get_mon_num(player_ptr, floor_ptr->dun_level, 0);
155 if (r_idx) place_monster_aux(player_ptr, 0, yval, xval, r_idx, 0L);
157 /* Walls around the breather */
158 for (dir1 = 0; dir1 < 8; dir1++)
160 g_ptr = &floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];
161 place_grid(player_ptr, g_ptr, GB_INNER);
162 g_ptr->feat = feat_glass_wall;
165 /* Curtains around the breather */
166 for (y = yval - 1; y <= yval + 1; y++)
168 place_secret_door(player_ptr, y, xval - 2, DOOR_CURTAIN);
169 place_secret_door(player_ptr, y, xval + 2, DOOR_CURTAIN);
172 for (x = xval - 1; x <= xval + 1; x++)
174 place_secret_door(player_ptr, yval - 2, x, DOOR_CURTAIN);
175 place_secret_door(player_ptr, yval + 2, x, DOOR_CURTAIN);
178 /* Place an object */
179 place_object(player_ptr, yval, xval, AM_NO_FIXED_ART);
180 floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
184 case 3: /* 4 shards breathers + 2 potions */
188 /* Walls around the potion */
189 for (y = yval - 2; y <= yval + 2; y++)
191 g_ptr = &floor_ptr->grid_array[y][xval - 3];
192 place_grid(player_ptr, g_ptr, GB_INNER);
193 g_ptr->feat = feat_glass_wall;
194 g_ptr = &floor_ptr->grid_array[y][xval + 3];
195 place_grid(player_ptr, g_ptr, GB_INNER);
196 g_ptr->feat = feat_glass_wall;
199 for (x = xval - 2; x <= xval + 2; x++)
201 g_ptr = &floor_ptr->grid_array[yval - 3][x];
202 place_grid(player_ptr, g_ptr, GB_INNER);
203 g_ptr->feat = feat_glass_wall;
204 g_ptr = &floor_ptr->grid_array[yval + 3][x];
205 place_grid(player_ptr, g_ptr, GB_INNER);
206 g_ptr->feat = feat_glass_wall;
209 for (dir1 = 4; dir1 < 8; dir1++)
211 g_ptr = &floor_ptr->grid_array[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];
212 place_grid(player_ptr, g_ptr, GB_INNER);
213 g_ptr->feat = feat_glass_wall;
216 get_mon_num_prep(player_ptr, vault_aux_shards, NULL);
218 /* Place shard berathers */
219 for (dir1 = 4; dir1 < 8; dir1++)
221 MONRACE_IDX r_idx = get_mon_num(player_ptr, floor_ptr->dun_level, 0);
223 y = yval + ddy_ddd[dir1];
224 x = xval + ddx_ddd[dir1];
225 if (r_idx) place_monster_aux(player_ptr, 0, y, x, r_idx, 0L);
228 /* Place two potions */
231 get_obj_num_hook = kind_is_potion;
232 place_object(player_ptr, yval, xval - 1, AM_NO_FIXED_ART);
233 get_obj_num_hook = kind_is_potion;
234 place_object(player_ptr, yval, xval + 1, AM_NO_FIXED_ART);
238 get_obj_num_hook = kind_is_potion;
239 place_object(player_ptr, yval - 1, xval, AM_NO_FIXED_ART);
240 get_obj_num_hook = kind_is_potion;
241 place_object(player_ptr, yval + 1, xval, AM_NO_FIXED_ART);
244 for (y = yval - 2; y <= yval + 2; y++)
245 for (x = xval - 2; x <= xval + 2; x++)
246 floor_ptr->grid_array[y][x].info |= (CAVE_ICKY);
252 msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));