5 #include "floor-generate.h"
8 #include "monsterrace-hook.h"
9 #include "objectkind-hook.h"
16 * @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms
17 * @param player_ptr プレーヤーへの参照ポインタ
20 bool build_type15(player_type *player_ptr)
22 POSITION y, x, y2, x2, yval, xval;
23 POSITION y1, x1, xsize, ysize;
28 /* Pick a room size */
29 xsize = rand_range(9, 13);
30 ysize = rand_range(9, 13);
32 /* Find and reserve some space in the dungeon. Get center of room. */
33 floor_type *floor_ptr = player_ptr->current_floor_ptr;
34 if (!find_space(floor_ptr, &yval, &xval, ysize + 2, xsize + 2)) return FALSE;
36 /* Choose lite or dark */
37 light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
39 /* Get corner values */
40 y1 = yval - ysize / 2;
41 x1 = xval - xsize / 2;
42 y2 = yval + (ysize - 1) / 2;
43 x2 = xval + (xsize - 1) / 2;
45 /* Place a full floor under the room */
46 for (y = y1 - 1; y <= y2 + 1; y++)
48 for (x = x1 - 1; x <= x2 + 1; x++)
50 g_ptr = &floor_ptr->grid_array[y][x];
51 place_floor_grid(g_ptr);
52 g_ptr->feat = feat_glass_floor;
53 g_ptr->info |= (CAVE_ROOM);
54 if (light) g_ptr->info |= (CAVE_GLOW);
58 /* Walls around the room */
59 for (y = y1 - 1; y <= y2 + 1; y++)
61 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
62 place_outer_grid(g_ptr);
63 g_ptr->feat = feat_glass_wall;
64 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
65 place_outer_grid(g_ptr);
66 g_ptr->feat = feat_glass_wall;
68 for (x = x1 - 1; x <= x2 + 1; x++)
70 g_ptr = &floor_ptr->grid_array[y1 - 1][x];
71 place_outer_grid(g_ptr);
72 g_ptr->feat = feat_glass_wall;
73 g_ptr = &floor_ptr->grid_array[y2 + 1][x];
74 place_outer_grid(g_ptr);
75 g_ptr->feat = feat_glass_wall;
80 case 1: /* 4 lite breathers + potion */
83 get_mon_num_prep(vault_aux_lite, NULL);
85 /* Place fixed lite berathers */
86 for (dir1 = 4; dir1 < 8; dir1++)
88 MONRACE_IDX r_idx = get_mon_num(floor_ptr->dun_level);
90 y = yval + 2 * ddy_ddd[dir1];
91 x = xval + 2 * ddx_ddd[dir1];
92 if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);
94 /* Walls around the breather */
95 for (dir2 = 0; dir2 < 8; dir2++)
97 g_ptr = &floor_ptr->grid_array[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];
98 place_inner_grid(g_ptr);
99 g_ptr->feat = feat_glass_wall;
103 /* Walls around the potion */
104 for (dir1 = 0; dir1 < 4; dir1++)
106 y = yval + 2 * ddy_ddd[dir1];
107 x = xval + 2 * ddx_ddd[dir1];
108 g_ptr = &floor_ptr->grid_array[y][x];
109 place_inner_perm_grid(g_ptr);
110 g_ptr->feat = feat_permanent_glass_wall;
111 floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);
116 y = yval + 2 * ddy_ddd[dir1];
117 x = xval + 2 * ddx_ddd[dir1];
118 place_secret_door(floor_ptr, y, x, DOOR_GLASS_DOOR);
119 g_ptr = &floor_ptr->grid_array[y][x];
120 if (is_closed_door(g_ptr->feat)) g_ptr->mimic = feat_glass_wall;
123 get_obj_num_hook = kind_is_potion;
124 place_object(player_ptr, yval, xval, AM_NO_FIXED_ART);
125 floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
129 case 2: /* 1 lite breather + random object */
135 g_ptr = &floor_ptr->grid_array[y1 + 1][x1 + 1];
136 place_inner_grid(g_ptr);
137 g_ptr->feat = feat_glass_wall;
139 g_ptr = &floor_ptr->grid_array[y1 + 1][x2 - 1];
140 place_inner_grid(g_ptr);
141 g_ptr->feat = feat_glass_wall;
143 g_ptr = &floor_ptr->grid_array[y2 - 1][x1 + 1];
144 place_inner_grid(g_ptr);
145 g_ptr->feat = feat_glass_wall;
147 g_ptr = &floor_ptr->grid_array[y2 - 1][x2 - 1];
148 place_inner_grid(g_ptr);
149 g_ptr->feat = feat_glass_wall;
150 get_mon_num_prep(vault_aux_lite, NULL);
152 r_idx = get_mon_num(floor_ptr->dun_level);
153 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);
155 /* Walls around the breather */
156 for (dir1 = 0; dir1 < 8; dir1++)
158 g_ptr = &floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];
159 place_inner_grid(g_ptr);
160 g_ptr->feat = feat_glass_wall;
163 /* Curtains around the breather */
164 for (y = yval - 1; y <= yval + 1; y++)
166 place_closed_door(floor_ptr, y, xval - 2, DOOR_CURTAIN);
167 place_closed_door(floor_ptr, y, xval + 2, DOOR_CURTAIN);
169 for (x = xval - 1; x <= xval + 1; x++)
171 place_closed_door(floor_ptr, yval - 2, x, DOOR_CURTAIN);
172 place_closed_door(floor_ptr, yval + 2, x, DOOR_CURTAIN);
175 /* Place an object */
176 place_object(player_ptr, yval, xval, AM_NO_FIXED_ART);
177 floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
181 case 3: /* 4 shards breathers + 2 potions */
185 /* Walls around the potion */
186 for (y = yval - 2; y <= yval + 2; y++)
188 g_ptr = &floor_ptr->grid_array[y][xval - 3];
189 place_inner_grid(g_ptr);
190 g_ptr->feat = feat_glass_wall;
191 g_ptr = &floor_ptr->grid_array[y][xval + 3];
192 place_inner_grid(g_ptr);
193 g_ptr->feat = feat_glass_wall;
195 for (x = xval - 2; x <= xval + 2; x++)
197 g_ptr = &floor_ptr->grid_array[yval - 3][x];
198 place_inner_grid(g_ptr);
199 g_ptr->feat = feat_glass_wall;
200 g_ptr = &floor_ptr->grid_array[yval + 3][x];
201 place_inner_grid(g_ptr);
202 g_ptr->feat = feat_glass_wall;
204 for (dir1 = 4; dir1 < 8; dir1++)
206 g_ptr = &floor_ptr->grid_array[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];
207 place_inner_grid(g_ptr);
208 g_ptr->feat = feat_glass_wall;
210 get_mon_num_prep(vault_aux_shards, NULL);
212 /* Place shard berathers */
213 for (dir1 = 4; dir1 < 8; dir1++)
215 MONRACE_IDX r_idx = get_mon_num(floor_ptr->dun_level);
217 y = yval + ddy_ddd[dir1];
218 x = xval + ddx_ddd[dir1];
219 if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);
222 /* Place two potions */
225 get_obj_num_hook = kind_is_potion;
226 place_object(player_ptr, yval, xval - 1, AM_NO_FIXED_ART);
227 get_obj_num_hook = kind_is_potion;
228 place_object(player_ptr, yval, xval + 1, AM_NO_FIXED_ART);
232 get_obj_num_hook = kind_is_potion;
233 place_object(player_ptr, yval - 1, xval, AM_NO_FIXED_ART);
234 get_obj_num_hook = kind_is_potion;
235 place_object(player_ptr, yval + 1, xval, AM_NO_FIXED_ART);
238 for (y = yval - 2; y <= yval + 2; y++)
239 for (x = xval - 2; x <= xval + 2; x++)
240 floor_ptr->grid_array[y][x].info |= (CAVE_ICKY);
246 msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));