3 #include "generate.h"
\r
5 #include "monster-hook.h"
\r
8 * Helper function for "glass room"
\r
10 static bool vault_aux_lite(MONRACE_IDX r_idx)
\r
12 monster_race *r_ptr = &r_info[r_idx];
\r
14 /* Validate the monster */
\r
15 if (!vault_monster_okay(r_idx)) return FALSE;
\r
17 /* Require lite attack */
\r
18 if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE)) return FALSE;
\r
20 /* No wall passing monsters */
\r
21 if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL)) return FALSE;
\r
23 /* No disintegrating monsters */
\r
24 if (r_ptr->flags4 & RF4_BR_DISI) return FALSE;
\r
30 * Helper function for "glass room"
\r
32 static bool vault_aux_shards(MONRACE_IDX r_idx)
\r
34 monster_race *r_ptr = &r_info[r_idx];
\r
36 /* Validate the monster */
\r
37 if (!vault_monster_okay(r_idx)) return FALSE;
\r
39 /* Require shards breath attack */
\r
40 if (!(r_ptr->flags4 & RF4_BR_SHAR)) return FALSE;
\r
46 * Hack -- determine if a template is potion
\r
48 static bool kind_is_potion(KIND_OBJECT_IDX k_idx)
\r
50 return k_info[k_idx].tval == TV_POTION;
\r
54 * @brief
\83^
\83C
\83v15
\82Ì
\95\94\89®
\81c
\83K
\83\89\83X
\95\94\89®
\82Ì
\90¶
\90¬ / Type 15 -- glass rooms
\r
57 bool build_type15(void)
\r
59 POSITION y, x, y2, x2, yval, xval;
\r
60 POSITION y1, x1, xsize, ysize;
\r
65 /* Pick a room size */
\r
66 xsize = rand_range(9, 13);
\r
67 ysize = rand_range(9, 13);
\r
69 /* Find and reserve some space in the dungeon. Get center of room. */
\r
70 if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;
\r
72 /* Choose lite or dark */
\r
73 light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));
\r
75 /* Get corner values */
\r
76 y1 = yval - ysize / 2;
\r
77 x1 = xval - xsize / 2;
\r
78 y2 = yval + (ysize - 1) / 2;
\r
79 x2 = xval + (xsize - 1) / 2;
\r
81 /* Place a full floor under the room */
\r
82 for (y = y1 - 1; y <= y2 + 1; y++)
\r
84 for (x = x1 - 1; x <= x2 + 1; x++)
\r
86 c_ptr = &cave[y][x];
\r
87 place_floor_grid(c_ptr);
\r
88 c_ptr->feat = feat_glass_floor;
\r
89 c_ptr->info |= (CAVE_ROOM);
\r
90 if (light) c_ptr->info |= (CAVE_GLOW);
\r
94 /* Walls around the room */
\r
95 for (y = y1 - 1; y <= y2 + 1; y++)
\r
97 c_ptr = &cave[y][x1 - 1];
\r
98 place_outer_grid(c_ptr);
\r
99 c_ptr->feat = feat_glass_wall;
\r
100 c_ptr = &cave[y][x2 + 1];
\r
101 place_outer_grid(c_ptr);
\r
102 c_ptr->feat = feat_glass_wall;
\r
104 for (x = x1 - 1; x <= x2 + 1; x++)
\r
106 c_ptr = &cave[y1 - 1][x];
\r
107 place_outer_grid(c_ptr);
\r
108 c_ptr->feat = feat_glass_wall;
\r
109 c_ptr = &cave[y2 + 1][x];
\r
110 place_outer_grid(c_ptr);
\r
111 c_ptr->feat = feat_glass_wall;
\r
114 switch (randint1(3))
\r
116 case 1: /* 4 lite breathers + potion */
\r
120 /* Prepare allocation table */
\r
121 get_mon_num_prep(vault_aux_lite, NULL);
\r
123 /* Place fixed lite berathers */
\r
124 for (dir1 = 4; dir1 < 8; dir1++)
\r
126 MONRACE_IDX r_idx = get_mon_num(dun_level);
\r
128 y = yval + 2 * ddy_ddd[dir1];
\r
129 x = xval + 2 * ddx_ddd[dir1];
\r
130 if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);
\r
132 /* Walls around the breather */
\r
133 for (dir2 = 0; dir2 < 8; dir2++)
\r
135 c_ptr = &cave[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];
\r
136 place_inner_grid(c_ptr);
\r
137 c_ptr->feat = feat_glass_wall;
\r
141 /* Walls around the potion */
\r
142 for (dir1 = 0; dir1 < 4; dir1++)
\r
144 y = yval + 2 * ddy_ddd[dir1];
\r
145 x = xval + 2 * ddx_ddd[dir1];
\r
146 c_ptr = &cave[y][x];
\r
147 place_inner_perm_grid(c_ptr);
\r
148 c_ptr->feat = feat_permanent_glass_wall;
\r
149 cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);
\r
153 dir1 = randint0(4);
\r
154 y = yval + 2 * ddy_ddd[dir1];
\r
155 x = xval + 2 * ddx_ddd[dir1];
\r
156 place_secret_door(y, x, DOOR_GLASS_DOOR);
\r
157 c_ptr = &cave[y][x];
\r
158 if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;
\r
160 /* Place a potion */
\r
161 get_obj_num_hook = kind_is_potion;
\r
162 place_object(yval, xval, AM_NO_FIXED_ART);
\r
163 cave[yval][xval].info |= (CAVE_ICKY);
\r
167 case 2: /* 1 lite breather + random object */
\r
173 c_ptr = &cave[y1 + 1][x1 + 1];
\r
174 place_inner_grid(c_ptr);
\r
175 c_ptr->feat = feat_glass_wall;
\r
177 c_ptr = &cave[y1 + 1][x2 - 1];
\r
178 place_inner_grid(c_ptr);
\r
179 c_ptr->feat = feat_glass_wall;
\r
181 c_ptr = &cave[y2 - 1][x1 + 1];
\r
182 place_inner_grid(c_ptr);
\r
183 c_ptr->feat = feat_glass_wall;
\r
185 c_ptr = &cave[y2 - 1][x2 - 1];
\r
186 place_inner_grid(c_ptr);
\r
187 c_ptr->feat = feat_glass_wall;
\r
189 /* Prepare allocation table */
\r
190 get_mon_num_prep(vault_aux_lite, NULL);
\r
192 r_idx = get_mon_num(dun_level);
\r
193 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);
\r
195 /* Walls around the breather */
\r
196 for (dir1 = 0; dir1 < 8; dir1++)
\r
198 c_ptr = &cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];
\r
199 place_inner_grid(c_ptr);
\r
200 c_ptr->feat = feat_glass_wall;
\r
203 /* Curtains around the breather */
\r
204 for (y = yval - 1; y <= yval + 1; y++)
\r
206 place_closed_door(y, xval - 2, DOOR_CURTAIN);
\r
207 place_closed_door(y, xval + 2, DOOR_CURTAIN);
\r
209 for (x = xval - 1; x <= xval + 1; x++)
\r
211 place_closed_door(yval - 2, x, DOOR_CURTAIN);
\r
212 place_closed_door(yval + 2, x, DOOR_CURTAIN);
\r
215 /* Place an object */
\r
216 place_object(yval, xval, AM_NO_FIXED_ART);
\r
217 cave[yval][xval].info |= (CAVE_ICKY);
\r
221 case 3: /* 4 shards breathers + 2 potions */
\r
225 /* Walls around the potion */
\r
226 for (y = yval - 2; y <= yval + 2; y++)
\r
228 c_ptr = &cave[y][xval - 3];
\r
229 place_inner_grid(c_ptr);
\r
230 c_ptr->feat = feat_glass_wall;
\r
231 c_ptr = &cave[y][xval + 3];
\r
232 place_inner_grid(c_ptr);
\r
233 c_ptr->feat = feat_glass_wall;
\r
235 for (x = xval - 2; x <= xval + 2; x++)
\r
237 c_ptr = &cave[yval - 3][x];
\r
238 place_inner_grid(c_ptr);
\r
239 c_ptr->feat = feat_glass_wall;
\r
240 c_ptr = &cave[yval + 3][x];
\r
241 place_inner_grid(c_ptr);
\r
242 c_ptr->feat = feat_glass_wall;
\r
244 for (dir1 = 4; dir1 < 8; dir1++)
\r
246 c_ptr = &cave[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];
\r
247 place_inner_grid(c_ptr);
\r
248 c_ptr->feat = feat_glass_wall;
\r
251 /* Prepare allocation table */
\r
252 get_mon_num_prep(vault_aux_shards, NULL);
\r
254 /* Place shard berathers */
\r
255 for (dir1 = 4; dir1 < 8; dir1++)
\r
257 MONRACE_IDX r_idx = get_mon_num(dun_level);
\r
259 y = yval + ddy_ddd[dir1];
\r
260 x = xval + ddx_ddd[dir1];
\r
261 if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);
\r
264 /* Place two potions */
\r
267 get_obj_num_hook = kind_is_potion;
\r
268 place_object(yval, xval - 1, AM_NO_FIXED_ART);
\r
269 get_obj_num_hook = kind_is_potion;
\r
270 place_object(yval, xval + 1, AM_NO_FIXED_ART);
\r
274 get_obj_num_hook = kind_is_potion;
\r
275 place_object(yval - 1, xval, AM_NO_FIXED_ART);
\r
276 get_obj_num_hook = kind_is_potion;
\r
277 place_object(yval + 1, xval, AM_NO_FIXED_ART);
\r
280 for (y = yval - 2; y <= yval + 2; y++)
\r
281 for (x = xval - 2; x <= xval + 2; x++)
\r
282 cave[y][x].info |= (CAVE_ICKY);
\r
288 msg_print_wizard(CHEAT_DUNGEON, _("
\83K
\83\89\83X
\82Ì
\95\94\89®
\82ª
\90¶
\90¬
\82³
\82ê
\82Ü
\82µ
\82½
\81B", "Glass room was generated."));
\r