3 #include "floor-generate.h"
6 #include "monsterrace-hook.h"
7 #include "objectkind-hook.h"
13 * @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms
16 bool build_type15(void)
18 POSITION y, x, y2, x2, yval, xval;
19 POSITION y1, x1, xsize, ysize;
24 /* Pick a room size */
25 xsize = rand_range(9, 13);
26 ysize = rand_range(9, 13);
28 /* Find and reserve some space in the dungeon. Get center of room. */
29 if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;
31 /* Choose lite or dark */
32 light = ((current_floor_ptr->dun_level <= randint1(25)) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
34 /* Get corner values */
35 y1 = yval - ysize / 2;
36 x1 = xval - xsize / 2;
37 y2 = yval + (ysize - 1) / 2;
38 x2 = xval + (xsize - 1) / 2;
40 /* Place a full floor under the room */
41 for (y = y1 - 1; y <= y2 + 1; y++)
43 for (x = x1 - 1; x <= x2 + 1; x++)
45 g_ptr = ¤t_floor_ptr->grid_array[y][x];
46 place_floor_grid(g_ptr);
47 g_ptr->feat = feat_glass_floor;
48 g_ptr->info |= (CAVE_ROOM);
49 if (light) g_ptr->info |= (CAVE_GLOW);
53 /* Walls around the room */
54 for (y = y1 - 1; y <= y2 + 1; y++)
56 g_ptr = ¤t_floor_ptr->grid_array[y][x1 - 1];
57 place_outer_grid(g_ptr);
58 g_ptr->feat = feat_glass_wall;
59 g_ptr = ¤t_floor_ptr->grid_array[y][x2 + 1];
60 place_outer_grid(g_ptr);
61 g_ptr->feat = feat_glass_wall;
63 for (x = x1 - 1; x <= x2 + 1; x++)
65 g_ptr = ¤t_floor_ptr->grid_array[y1 - 1][x];
66 place_outer_grid(g_ptr);
67 g_ptr->feat = feat_glass_wall;
68 g_ptr = ¤t_floor_ptr->grid_array[y2 + 1][x];
69 place_outer_grid(g_ptr);
70 g_ptr->feat = feat_glass_wall;
75 case 1: /* 4 lite breathers + potion */
78 get_mon_num_prep(vault_aux_lite, NULL);
80 /* Place fixed lite berathers */
81 for (dir1 = 4; dir1 < 8; dir1++)
83 MONRACE_IDX r_idx = get_mon_num(current_floor_ptr->dun_level);
85 y = yval + 2 * ddy_ddd[dir1];
86 x = xval + 2 * ddx_ddd[dir1];
87 if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);
89 /* Walls around the breather */
90 for (dir2 = 0; dir2 < 8; dir2++)
92 g_ptr = ¤t_floor_ptr->grid_array[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];
93 place_inner_grid(g_ptr);
94 g_ptr->feat = feat_glass_wall;
98 /* Walls around the potion */
99 for (dir1 = 0; dir1 < 4; dir1++)
101 y = yval + 2 * ddy_ddd[dir1];
102 x = xval + 2 * ddx_ddd[dir1];
103 g_ptr = ¤t_floor_ptr->grid_array[y][x];
104 place_inner_perm_grid(g_ptr);
105 g_ptr->feat = feat_permanent_glass_wall;
106 current_floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);
111 y = yval + 2 * ddy_ddd[dir1];
112 x = xval + 2 * ddx_ddd[dir1];
113 place_secret_door(y, x, DOOR_GLASS_DOOR);
114 g_ptr = ¤t_floor_ptr->grid_array[y][x];
115 if (is_closed_door(g_ptr->feat)) g_ptr->mimic = feat_glass_wall;
118 get_obj_num_hook = kind_is_potion;
119 place_object(yval, xval, AM_NO_FIXED_ART);
120 current_floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
124 case 2: /* 1 lite breather + random object */
130 g_ptr = ¤t_floor_ptr->grid_array[y1 + 1][x1 + 1];
131 place_inner_grid(g_ptr);
132 g_ptr->feat = feat_glass_wall;
134 g_ptr = ¤t_floor_ptr->grid_array[y1 + 1][x2 - 1];
135 place_inner_grid(g_ptr);
136 g_ptr->feat = feat_glass_wall;
138 g_ptr = ¤t_floor_ptr->grid_array[y2 - 1][x1 + 1];
139 place_inner_grid(g_ptr);
140 g_ptr->feat = feat_glass_wall;
142 g_ptr = ¤t_floor_ptr->grid_array[y2 - 1][x2 - 1];
143 place_inner_grid(g_ptr);
144 g_ptr->feat = feat_glass_wall;
145 get_mon_num_prep(vault_aux_lite, NULL);
147 r_idx = get_mon_num(current_floor_ptr->dun_level);
148 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);
150 /* Walls around the breather */
151 for (dir1 = 0; dir1 < 8; dir1++)
153 g_ptr = ¤t_floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];
154 place_inner_grid(g_ptr);
155 g_ptr->feat = feat_glass_wall;
158 /* Curtains around the breather */
159 for (y = yval - 1; y <= yval + 1; y++)
161 place_closed_door(y, xval - 2, DOOR_CURTAIN);
162 place_closed_door(y, xval + 2, DOOR_CURTAIN);
164 for (x = xval - 1; x <= xval + 1; x++)
166 place_closed_door(yval - 2, x, DOOR_CURTAIN);
167 place_closed_door(yval + 2, x, DOOR_CURTAIN);
170 /* Place an object */
171 place_object(yval, xval, AM_NO_FIXED_ART);
172 current_floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
176 case 3: /* 4 shards breathers + 2 potions */
180 /* Walls around the potion */
181 for (y = yval - 2; y <= yval + 2; y++)
183 g_ptr = ¤t_floor_ptr->grid_array[y][xval - 3];
184 place_inner_grid(g_ptr);
185 g_ptr->feat = feat_glass_wall;
186 g_ptr = ¤t_floor_ptr->grid_array[y][xval + 3];
187 place_inner_grid(g_ptr);
188 g_ptr->feat = feat_glass_wall;
190 for (x = xval - 2; x <= xval + 2; x++)
192 g_ptr = ¤t_floor_ptr->grid_array[yval - 3][x];
193 place_inner_grid(g_ptr);
194 g_ptr->feat = feat_glass_wall;
195 g_ptr = ¤t_floor_ptr->grid_array[yval + 3][x];
196 place_inner_grid(g_ptr);
197 g_ptr->feat = feat_glass_wall;
199 for (dir1 = 4; dir1 < 8; dir1++)
201 g_ptr = ¤t_floor_ptr->grid_array[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];
202 place_inner_grid(g_ptr);
203 g_ptr->feat = feat_glass_wall;
205 get_mon_num_prep(vault_aux_shards, NULL);
207 /* Place shard berathers */
208 for (dir1 = 4; dir1 < 8; dir1++)
210 MONRACE_IDX r_idx = get_mon_num(current_floor_ptr->dun_level);
212 y = yval + ddy_ddd[dir1];
213 x = xval + ddx_ddd[dir1];
214 if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);
217 /* Place two potions */
220 get_obj_num_hook = kind_is_potion;
221 place_object(yval, xval - 1, AM_NO_FIXED_ART);
222 get_obj_num_hook = kind_is_potion;
223 place_object(yval, xval + 1, AM_NO_FIXED_ART);
227 get_obj_num_hook = kind_is_potion;
228 place_object(yval - 1, xval, AM_NO_FIXED_ART);
229 get_obj_num_hook = kind_is_potion;
230 place_object(yval + 1, xval, AM_NO_FIXED_ART);
233 for (y = yval - 2; y <= yval + 2; y++)
234 for (x = xval - 2; x <= xval + 2; x++)
235 current_floor_ptr->grid_array[y][x].info |= (CAVE_ICKY);
241 msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));