6 #include "monsterrace-hook.h"
7 #include "objectkind-hook.h"
11 * @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms
14 bool build_type15(void)
16 POSITION y, x, y2, x2, yval, xval;
17 POSITION y1, x1, xsize, ysize;
22 /* Pick a room size */
23 xsize = rand_range(9, 13);
24 ysize = rand_range(9, 13);
26 /* Find and reserve some space in the dungeon. Get center of room. */
27 if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;
29 /* Choose lite or dark */
30 light = ((dun_level <= randint1(25)) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
32 /* Get corner values */
33 y1 = yval - ysize / 2;
34 x1 = xval - xsize / 2;
35 y2 = yval + (ysize - 1) / 2;
36 x2 = xval + (xsize - 1) / 2;
38 /* Place a full floor under the room */
39 for (y = y1 - 1; y <= y2 + 1; y++)
41 for (x = x1 - 1; x <= x2 + 1; x++)
43 g_ptr = &grid_array[y][x];
44 place_floor_grid(g_ptr);
45 g_ptr->feat = feat_glass_floor;
46 g_ptr->info |= (CAVE_ROOM);
47 if (light) g_ptr->info |= (CAVE_GLOW);
51 /* Walls around the room */
52 for (y = y1 - 1; y <= y2 + 1; y++)
54 g_ptr = &grid_array[y][x1 - 1];
55 place_outer_grid(g_ptr);
56 g_ptr->feat = feat_glass_wall;
57 g_ptr = &grid_array[y][x2 + 1];
58 place_outer_grid(g_ptr);
59 g_ptr->feat = feat_glass_wall;
61 for (x = x1 - 1; x <= x2 + 1; x++)
63 g_ptr = &grid_array[y1 - 1][x];
64 place_outer_grid(g_ptr);
65 g_ptr->feat = feat_glass_wall;
66 g_ptr = &grid_array[y2 + 1][x];
67 place_outer_grid(g_ptr);
68 g_ptr->feat = feat_glass_wall;
73 case 1: /* 4 lite breathers + potion */
76 get_mon_num_prep(vault_aux_lite, NULL);
78 /* Place fixed lite berathers */
79 for (dir1 = 4; dir1 < 8; dir1++)
81 MONRACE_IDX r_idx = get_mon_num(dun_level);
83 y = yval + 2 * ddy_ddd[dir1];
84 x = xval + 2 * ddx_ddd[dir1];
85 if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);
87 /* Walls around the breather */
88 for (dir2 = 0; dir2 < 8; dir2++)
90 g_ptr = &grid_array[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];
91 place_inner_grid(g_ptr);
92 g_ptr->feat = feat_glass_wall;
96 /* Walls around the potion */
97 for (dir1 = 0; dir1 < 4; dir1++)
99 y = yval + 2 * ddy_ddd[dir1];
100 x = xval + 2 * ddx_ddd[dir1];
101 g_ptr = &grid_array[y][x];
102 place_inner_perm_grid(g_ptr);
103 g_ptr->feat = feat_permanent_glass_wall;
104 grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);
109 y = yval + 2 * ddy_ddd[dir1];
110 x = xval + 2 * ddx_ddd[dir1];
111 place_secret_door(y, x, DOOR_GLASS_DOOR);
112 g_ptr = &grid_array[y][x];
113 if (is_closed_door(g_ptr->feat)) g_ptr->mimic = feat_glass_wall;
116 get_obj_num_hook = kind_is_potion;
117 place_object(yval, xval, AM_NO_FIXED_ART);
118 grid_array[yval][xval].info |= (CAVE_ICKY);
122 case 2: /* 1 lite breather + random object */
128 g_ptr = &grid_array[y1 + 1][x1 + 1];
129 place_inner_grid(g_ptr);
130 g_ptr->feat = feat_glass_wall;
132 g_ptr = &grid_array[y1 + 1][x2 - 1];
133 place_inner_grid(g_ptr);
134 g_ptr->feat = feat_glass_wall;
136 g_ptr = &grid_array[y2 - 1][x1 + 1];
137 place_inner_grid(g_ptr);
138 g_ptr->feat = feat_glass_wall;
140 g_ptr = &grid_array[y2 - 1][x2 - 1];
141 place_inner_grid(g_ptr);
142 g_ptr->feat = feat_glass_wall;
143 get_mon_num_prep(vault_aux_lite, NULL);
145 r_idx = get_mon_num(dun_level);
146 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);
148 /* Walls around the breather */
149 for (dir1 = 0; dir1 < 8; dir1++)
151 g_ptr = &grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];
152 place_inner_grid(g_ptr);
153 g_ptr->feat = feat_glass_wall;
156 /* Curtains around the breather */
157 for (y = yval - 1; y <= yval + 1; y++)
159 place_closed_door(y, xval - 2, DOOR_CURTAIN);
160 place_closed_door(y, xval + 2, DOOR_CURTAIN);
162 for (x = xval - 1; x <= xval + 1; x++)
164 place_closed_door(yval - 2, x, DOOR_CURTAIN);
165 place_closed_door(yval + 2, x, DOOR_CURTAIN);
168 /* Place an object */
169 place_object(yval, xval, AM_NO_FIXED_ART);
170 grid_array[yval][xval].info |= (CAVE_ICKY);
174 case 3: /* 4 shards breathers + 2 potions */
178 /* Walls around the potion */
179 for (y = yval - 2; y <= yval + 2; y++)
181 g_ptr = &grid_array[y][xval - 3];
182 place_inner_grid(g_ptr);
183 g_ptr->feat = feat_glass_wall;
184 g_ptr = &grid_array[y][xval + 3];
185 place_inner_grid(g_ptr);
186 g_ptr->feat = feat_glass_wall;
188 for (x = xval - 2; x <= xval + 2; x++)
190 g_ptr = &grid_array[yval - 3][x];
191 place_inner_grid(g_ptr);
192 g_ptr->feat = feat_glass_wall;
193 g_ptr = &grid_array[yval + 3][x];
194 place_inner_grid(g_ptr);
195 g_ptr->feat = feat_glass_wall;
197 for (dir1 = 4; dir1 < 8; dir1++)
199 g_ptr = &grid_array[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];
200 place_inner_grid(g_ptr);
201 g_ptr->feat = feat_glass_wall;
203 get_mon_num_prep(vault_aux_shards, NULL);
205 /* Place shard berathers */
206 for (dir1 = 4; dir1 < 8; dir1++)
208 MONRACE_IDX r_idx = get_mon_num(dun_level);
210 y = yval + ddy_ddd[dir1];
211 x = xval + ddx_ddd[dir1];
212 if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);
215 /* Place two potions */
218 get_obj_num_hook = kind_is_potion;
219 place_object(yval, xval - 1, AM_NO_FIXED_ART);
220 get_obj_num_hook = kind_is_potion;
221 place_object(yval, xval + 1, AM_NO_FIXED_ART);
225 get_obj_num_hook = kind_is_potion;
226 place_object(yval - 1, xval, AM_NO_FIXED_ART);
227 get_obj_num_hook = kind_is_potion;
228 place_object(yval + 1, xval, AM_NO_FIXED_ART);
231 for (y = yval - 2; y <= yval + 2; y++)
232 for (x = xval - 2; x <= xval + 2; x++)
233 grid_array[y][x].info |= (CAVE_ICKY);
239 msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));