OSDN Git Service

52229d64e58f55b53a84226608b98544d0e2cd21
[hengband/hengband.git] / src / rooms-normal.c
1 #include "angband.h"\r
2 #include "grid.h"\r
3 #include "rooms.h"\r
4 \r
5 /*!\r
6 * @brief \83^\83C\83v1\82Ì\95\94\89®\81c\92Ê\8fí\89Â\95Ï\92·\95û\8c`\82Ì\95\94\89®\82ð\90\90¬\82·\82é / Type 1 -- normal rectangular rooms\r
7 * @return \82È\82µ\r
8 */\r
9 bool build_type1(void)\r
10 {\r
11         POSITION y, x, y2, x2, yval, xval;\r
12         POSITION y1, x1, xsize, ysize;\r
13 \r
14         bool light;\r
15 \r
16         cave_type *c_ptr;\r
17 \r
18         bool curtain = (d_info[dungeon_type].flags1 & DF1_CURTAIN) &&\r
19                 one_in_((d_info[dungeon_type].flags1 & DF1_NO_CAVE) ? 48 : 512);\r
20 \r
21         /* Pick a room size */\r
22         y1 = randint1(4);\r
23         x1 = randint1(11);\r
24         y2 = randint1(3);\r
25         x2 = randint1(11);\r
26 \r
27         xsize = x1 + x2 + 1;\r
28         ysize = y1 + y2 + 1;\r
29 \r
30         /* Find and reserve some space in the dungeon.  Get center of room. */\r
31         if (!find_space(&yval, &xval, ysize + 2, xsize + 2))\r
32         {\r
33                 /* Limit to the minimum room size, and retry */\r
34                 y1 = 1;\r
35                 x1 = 1;\r
36                 y2 = 1;\r
37                 x2 = 1;\r
38 \r
39                 xsize = x1 + x2 + 1;\r
40                 ysize = y1 + y2 + 1;\r
41 \r
42                 /* Find and reserve some space in the dungeon.  Get center of room. */\r
43                 if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;\r
44         }\r
45 \r
46         /* Choose lite or dark */\r
47         light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
48 \r
49 \r
50         /* Get corner values */\r
51         y1 = yval - ysize / 2;\r
52         x1 = xval - xsize / 2;\r
53         y2 = yval + (ysize - 1) / 2;\r
54         x2 = xval + (xsize - 1) / 2;\r
55 \r
56 \r
57         /* Place a full floor under the room */\r
58         for (y = y1 - 1; y <= y2 + 1; y++)\r
59         {\r
60                 for (x = x1 - 1; x <= x2 + 1; x++)\r
61                 {\r
62                         c_ptr = &cave[y][x];\r
63                         place_floor_grid(c_ptr);\r
64                         c_ptr->info |= (CAVE_ROOM);\r
65                         if (light) c_ptr->info |= (CAVE_GLOW);\r
66                 }\r
67         }\r
68 \r
69         /* Walls around the room */\r
70         for (y = y1 - 1; y <= y2 + 1; y++)\r
71         {\r
72                 c_ptr = &cave[y][x1 - 1];\r
73                 place_outer_grid(c_ptr);\r
74                 c_ptr = &cave[y][x2 + 1];\r
75                 place_outer_grid(c_ptr);\r
76         }\r
77         for (x = x1 - 1; x <= x2 + 1; x++)\r
78         {\r
79                 c_ptr = &cave[y1 - 1][x];\r
80                 place_outer_grid(c_ptr);\r
81                 c_ptr = &cave[y2 + 1][x];\r
82                 place_outer_grid(c_ptr);\r
83         }\r
84 \r
85 \r
86         /* Hack -- Occasional curtained room */\r
87         if (curtain && (y2 - y1 > 2) && (x2 - x1 > 2))\r
88         {\r
89                 for (y = y1; y <= y2; y++)\r
90                 {\r
91                         c_ptr = &cave[y][x1];\r
92                         c_ptr->feat = feat_door[DOOR_CURTAIN].closed;\r
93                         c_ptr->info &= ~(CAVE_MASK);\r
94                         c_ptr = &cave[y][x2];\r
95                         c_ptr->feat = feat_door[DOOR_CURTAIN].closed;\r
96                         c_ptr->info &= ~(CAVE_MASK);\r
97                 }\r
98                 for (x = x1; x <= x2; x++)\r
99                 {\r
100                         c_ptr = &cave[y1][x];\r
101                         c_ptr->feat = feat_door[DOOR_CURTAIN].closed;\r
102                         c_ptr->info &= ~(CAVE_MASK);\r
103                         c_ptr = &cave[y2][x];\r
104                         c_ptr->feat = feat_door[DOOR_CURTAIN].closed;\r
105                         c_ptr->info &= ~(CAVE_MASK);\r
106                 }\r
107         }\r
108 \r
109 \r
110         /* Hack -- Occasional pillar room */\r
111         if (one_in_(20))\r
112         {\r
113                 for (y = y1; y <= y2; y += 2)\r
114                 {\r
115                         for (x = x1; x <= x2; x += 2)\r
116                         {\r
117                                 c_ptr = &cave[y][x];\r
118                                 place_inner_grid(c_ptr);\r
119                         }\r
120                 }\r
121         }\r
122 \r
123         /* Hack -- Occasional room with four pillars */\r
124         else if (one_in_(20))\r
125         {\r
126                 if ((y1 + 4 < y2) && (x1 + 4 < x2))\r
127                 {\r
128                         c_ptr = &cave[y1 + 1][x1 + 1];\r
129                         place_inner_grid(c_ptr);\r
130 \r
131                         c_ptr = &cave[y1 + 1][x2 - 1];\r
132                         place_inner_grid(c_ptr);\r
133 \r
134                         c_ptr = &cave[y2 - 1][x1 + 1];\r
135                         place_inner_grid(c_ptr);\r
136 \r
137                         c_ptr = &cave[y2 - 1][x2 - 1];\r
138                         place_inner_grid(c_ptr);\r
139                 }\r
140         }\r
141 \r
142         /* Hack -- Occasional ragged-edge room */\r
143         else if (one_in_(50))\r
144         {\r
145                 for (y = y1 + 2; y <= y2 - 2; y += 2)\r
146                 {\r
147                         c_ptr = &cave[y][x1];\r
148                         place_inner_grid(c_ptr);\r
149                         c_ptr = &cave[y][x2];\r
150                         place_inner_grid(c_ptr);\r
151                 }\r
152                 for (x = x1 + 2; x <= x2 - 2; x += 2)\r
153                 {\r
154                         c_ptr = &cave[y1][x];\r
155                         place_inner_grid(c_ptr);\r
156                         c_ptr = &cave[y2][x];\r
157                         place_inner_grid(c_ptr);\r
158                 }\r
159         }\r
160         /* Hack -- Occasional divided room */\r
161         else if (one_in_(50))\r
162         {\r
163                 bool curtain2 = (d_info[dungeon_type].flags1 & DF1_CURTAIN) &&\r
164                         one_in_((d_info[dungeon_type].flags1 & DF1_NO_CAVE) ? 2 : 128);\r
165 \r
166                 if (randint1(100) < 50)\r
167                 {\r
168                         /* Horizontal wall */\r
169                         for (x = x1; x <= x2; x++)\r
170                         {\r
171                                 place_inner_bold(yval, x);\r
172                                 if (curtain2) cave[yval][x].feat = feat_door[DOOR_CURTAIN].closed;\r
173                         }\r
174 \r
175                         /* Prevent edge of wall from being tunneled */\r
176                         place_solid_bold(yval, x1 - 1);\r
177                         place_solid_bold(yval, x2 + 1);\r
178                 }\r
179                 else\r
180                 {\r
181                         /* Vertical wall */\r
182                         for (y = y1; y <= y2; y++)\r
183                         {\r
184                                 place_inner_bold(y, xval);\r
185                                 if (curtain2) cave[y][xval].feat = feat_door[DOOR_CURTAIN].closed;\r
186                         }\r
187 \r
188                         /* Prevent edge of wall from being tunneled */\r
189                         place_solid_bold(y1 - 1, xval);\r
190                         place_solid_bold(y2 + 1, xval);\r
191                 }\r
192 \r
193                 place_random_door(yval, xval, TRUE);\r
194                 if (curtain2) cave[yval][xval].feat = feat_door[DOOR_CURTAIN].closed;\r
195         }\r
196 \r
197         return TRUE;\r
198 }\r
199 \r
200 /*!\r
201 * @brief \83^\83C\83v2\82Ì\95\94\89®\81c\93ñ\8fd\92·\95û\8c`\82Ì\95\94\89®\82ð\90\90¬\82·\82é / Type 2 -- Overlapping rectangular rooms\r
202 * @return \82È\82µ\r
203 */\r
204 bool build_type2(void)\r
205 {\r
206         POSITION        y, x, xval, yval;\r
207         POSITION        y1a, x1a, y2a, x2a;\r
208         POSITION        y1b, x1b, y2b, x2b;\r
209         bool            light;\r
210         cave_type   *c_ptr;\r
211 \r
212         /* Find and reserve some space in the dungeon.  Get center of room. */\r
213         if (!find_space(&yval, &xval, 11, 25)) return FALSE;\r
214 \r
215         /* Choose lite or dark */\r
216         light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
217 \r
218         /* Determine extents of the first room */\r
219         y1a = yval - randint1(4);\r
220         y2a = yval + randint1(3);\r
221         x1a = xval - randint1(11);\r
222         x2a = xval + randint1(10);\r
223 \r
224         /* Determine extents of the second room */\r
225         y1b = yval - randint1(3);\r
226         y2b = yval + randint1(4);\r
227         x1b = xval - randint1(10);\r
228         x2b = xval + randint1(11);\r
229 \r
230 \r
231         /* Place a full floor for room "a" */\r
232         for (y = y1a - 1; y <= y2a + 1; y++)\r
233         {\r
234                 for (x = x1a - 1; x <= x2a + 1; x++)\r
235                 {\r
236                         c_ptr = &cave[y][x];\r
237                         place_floor_grid(c_ptr);\r
238                         c_ptr->info |= (CAVE_ROOM);\r
239                         if (light) c_ptr->info |= (CAVE_GLOW);\r
240                 }\r
241         }\r
242 \r
243         /* Place a full floor for room "b" */\r
244         for (y = y1b - 1; y <= y2b + 1; y++)\r
245         {\r
246                 for (x = x1b - 1; x <= x2b + 1; x++)\r
247                 {\r
248                         c_ptr = &cave[y][x];\r
249                         place_floor_grid(c_ptr);\r
250                         c_ptr->info |= (CAVE_ROOM);\r
251                         if (light) c_ptr->info |= (CAVE_GLOW);\r
252                 }\r
253         }\r
254 \r
255 \r
256         /* Place the walls around room "a" */\r
257         for (y = y1a - 1; y <= y2a + 1; y++)\r
258         {\r
259                 c_ptr = &cave[y][x1a - 1];\r
260                 place_outer_grid(c_ptr);\r
261                 c_ptr = &cave[y][x2a + 1];\r
262                 place_outer_grid(c_ptr);\r
263         }\r
264         for (x = x1a - 1; x <= x2a + 1; x++)\r
265         {\r
266                 c_ptr = &cave[y1a - 1][x];\r
267                 place_outer_grid(c_ptr);\r
268                 c_ptr = &cave[y2a + 1][x];\r
269                 place_outer_grid(c_ptr);\r
270         }\r
271 \r
272         /* Place the walls around room "b" */\r
273         for (y = y1b - 1; y <= y2b + 1; y++)\r
274         {\r
275                 c_ptr = &cave[y][x1b - 1];\r
276                 place_outer_grid(c_ptr);\r
277                 c_ptr = &cave[y][x2b + 1];\r
278                 place_outer_grid(c_ptr);\r
279         }\r
280         for (x = x1b - 1; x <= x2b + 1; x++)\r
281         {\r
282                 c_ptr = &cave[y1b - 1][x];\r
283                 place_outer_grid(c_ptr);\r
284                 c_ptr = &cave[y2b + 1][x];\r
285                 place_outer_grid(c_ptr);\r
286         }\r
287 \r
288 \r
289 \r
290         /* Replace the floor for room "a" */\r
291         for (y = y1a; y <= y2a; y++)\r
292         {\r
293                 for (x = x1a; x <= x2a; x++)\r
294                 {\r
295                         c_ptr = &cave[y][x];\r
296                         place_floor_grid(c_ptr);\r
297                 }\r
298         }\r
299 \r
300         /* Replace the floor for room "b" */\r
301         for (y = y1b; y <= y2b; y++)\r
302         {\r
303                 for (x = x1b; x <= x2b; x++)\r
304                 {\r
305                         c_ptr = &cave[y][x];\r
306                         place_floor_grid(c_ptr);\r
307                 }\r
308         }\r
309 \r
310         return TRUE;\r
311 }\r
312 \r
313 /*!\r
314 * @brief \83^\83C\83v3\82Ì\95\94\89®\81c\8f\\8e\9a\8c^\82Ì\95\94\89®\82ð\90\90¬\82·\82é / Type 3 -- Cross shaped rooms\r
315 * @return \82È\82µ\r
316 * @details\r
317 * Builds a room at a row, column coordinate\n\r
318 *\n\r
319 * Room "a" runs north/south, and Room "b" runs east/east\n\r
320 * So the "central pillar" runs from x1a, y1b to x2a, y2b.\n\r
321 *\n\r
322 * Note that currently, the "center" is always 3x3, but I think that\n\r
323 * the code below will work (with "bounds checking") for 5x5, or even\n\r
324 * for unsymetric values like 4x3 or 5x3 or 3x4 or 3x5, or even larger.\n\r
325 */\r
326 bool build_type3(void)\r
327 {\r
328         POSITION y, x, dy, dx, wy, wx;\r
329         POSITION y1a, x1a, y2a, x2a;\r
330         POSITION y1b, x1b, y2b, x2b;\r
331         POSITION yval, xval;\r
332         bool            light;\r
333         cave_type   *c_ptr;\r
334 \r
335 \r
336         /* Find and reserve some space in the dungeon.  Get center of room. */\r
337         if (!find_space(&yval, &xval, 11, 25)) return FALSE;\r
338 \r
339 \r
340         /* Choose lite or dark */\r
341         light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
342 \r
343         /* For now, always 3x3 */\r
344         wx = wy = 1;\r
345 \r
346         /* Pick max vertical size (at most 4) */\r
347         dy = rand_range(3, 4);\r
348 \r
349         /* Pick max horizontal size (at most 15) */\r
350         dx = rand_range(3, 11);\r
351 \r
352 \r
353         /* Determine extents of the north/south room */\r
354         y1a = yval - dy;\r
355         y2a = yval + dy;\r
356         x1a = xval - wx;\r
357         x2a = xval + wx;\r
358 \r
359         /* Determine extents of the east/west room */\r
360         y1b = yval - wy;\r
361         y2b = yval + wy;\r
362         x1b = xval - dx;\r
363         x2b = xval + dx;\r
364 \r
365 \r
366         /* Place a full floor for room "a" */\r
367         for (y = y1a - 1; y <= y2a + 1; y++)\r
368         {\r
369                 for (x = x1a - 1; x <= x2a + 1; x++)\r
370                 {\r
371                         c_ptr = &cave[y][x];\r
372                         place_floor_grid(c_ptr);\r
373                         c_ptr->info |= (CAVE_ROOM);\r
374                         if (light) c_ptr->info |= (CAVE_GLOW);\r
375                 }\r
376         }\r
377 \r
378         /* Place a full floor for room "b" */\r
379         for (y = y1b - 1; y <= y2b + 1; y++)\r
380         {\r
381                 for (x = x1b - 1; x <= x2b + 1; x++)\r
382                 {\r
383                         c_ptr = &cave[y][x];\r
384                         place_floor_grid(c_ptr);\r
385                         c_ptr->info |= (CAVE_ROOM);\r
386                         if (light) c_ptr->info |= (CAVE_GLOW);\r
387                 }\r
388         }\r
389 \r
390 \r
391         /* Place the walls around room "a" */\r
392         for (y = y1a - 1; y <= y2a + 1; y++)\r
393         {\r
394                 c_ptr = &cave[y][x1a - 1];\r
395                 place_outer_grid(c_ptr);\r
396                 c_ptr = &cave[y][x2a + 1];\r
397                 place_outer_grid(c_ptr);\r
398         }\r
399         for (x = x1a - 1; x <= x2a + 1; x++)\r
400         {\r
401                 c_ptr = &cave[y1a - 1][x];\r
402                 place_outer_grid(c_ptr);\r
403                 c_ptr = &cave[y2a + 1][x];\r
404                 place_outer_grid(c_ptr);\r
405         }\r
406 \r
407         /* Place the walls around room "b" */\r
408         for (y = y1b - 1; y <= y2b + 1; y++)\r
409         {\r
410                 c_ptr = &cave[y][x1b - 1];\r
411                 place_outer_grid(c_ptr);\r
412                 c_ptr = &cave[y][x2b + 1];\r
413                 place_outer_grid(c_ptr);\r
414         }\r
415         for (x = x1b - 1; x <= x2b + 1; x++)\r
416         {\r
417                 c_ptr = &cave[y1b - 1][x];\r
418                 place_outer_grid(c_ptr);\r
419                 c_ptr = &cave[y2b + 1][x];\r
420                 place_outer_grid(c_ptr);\r
421         }\r
422 \r
423 \r
424         /* Replace the floor for room "a" */\r
425         for (y = y1a; y <= y2a; y++)\r
426         {\r
427                 for (x = x1a; x <= x2a; x++)\r
428                 {\r
429                         c_ptr = &cave[y][x];\r
430                         place_floor_grid(c_ptr);\r
431                 }\r
432         }\r
433 \r
434         /* Replace the floor for room "b" */\r
435         for (y = y1b; y <= y2b; y++)\r
436         {\r
437                 for (x = x1b; x <= x2b; x++)\r
438                 {\r
439                         c_ptr = &cave[y][x];\r
440                         place_floor_grid(c_ptr);\r
441                 }\r
442         }\r
443 \r
444 \r
445 \r
446         /* Special features (3/4) */\r
447         switch (randint0(4))\r
448         {\r
449                 /* Large solid middle pillar */\r
450         case 1:\r
451         {\r
452                 for (y = y1b; y <= y2b; y++)\r
453                 {\r
454                         for (x = x1a; x <= x2a; x++)\r
455                         {\r
456                                 c_ptr = &cave[y][x];\r
457                                 place_inner_grid(c_ptr);\r
458                         }\r
459                 }\r
460                 break;\r
461         }\r
462 \r
463         /* Inner treasure vault */\r
464         case 2:\r
465         {\r
466                 /* Build the vault */\r
467                 for (y = y1b; y <= y2b; y++)\r
468                 {\r
469                         c_ptr = &cave[y][x1a];\r
470                         place_inner_grid(c_ptr);\r
471                         c_ptr = &cave[y][x2a];\r
472                         place_inner_grid(c_ptr);\r
473                 }\r
474                 for (x = x1a; x <= x2a; x++)\r
475                 {\r
476                         c_ptr = &cave[y1b][x];\r
477                         place_inner_grid(c_ptr);\r
478                         c_ptr = &cave[y2b][x];\r
479                         place_inner_grid(c_ptr);\r
480                 }\r
481 \r
482                 /* Place a secret door on the inner room */\r
483                 switch (randint0(4))\r
484                 {\r
485                 case 0: place_secret_door(y1b, xval, DOOR_DEFAULT); break;\r
486                 case 1: place_secret_door(y2b, xval, DOOR_DEFAULT); break;\r
487                 case 2: place_secret_door(yval, x1a, DOOR_DEFAULT); break;\r
488                 case 3: place_secret_door(yval, x2a, DOOR_DEFAULT); break;\r
489                 }\r
490 \r
491                 /* Place a treasure in the vault */\r
492                 place_object(yval, xval, 0L);\r
493 \r
494                 /* Let's guard the treasure well */\r
495                 vault_monsters(yval, xval, randint0(2) + 3);\r
496 \r
497                 /* Traps naturally */\r
498                 vault_traps(yval, xval, 4, 4, randint0(3) + 2);\r
499 \r
500                 break;\r
501         }\r
502 \r
503         /* Something else */\r
504         case 3:\r
505         {\r
506                 /* Occasionally pinch the center shut */\r
507                 if (one_in_(3))\r
508                 {\r
509                         /* Pinch the east/west sides */\r
510                         for (y = y1b; y <= y2b; y++)\r
511                         {\r
512                                 if (y == yval) continue;\r
513                                 c_ptr = &cave[y][x1a - 1];\r
514                                 place_inner_grid(c_ptr);\r
515                                 c_ptr = &cave[y][x2a + 1];\r
516                                 place_inner_grid(c_ptr);\r
517                         }\r
518 \r
519                         /* Pinch the north/south sides */\r
520                         for (x = x1a; x <= x2a; x++)\r
521                         {\r
522                                 if (x == xval) continue;\r
523                                 c_ptr = &cave[y1b - 1][x];\r
524                                 place_inner_grid(c_ptr);\r
525                                 c_ptr = &cave[y2b + 1][x];\r
526                                 place_inner_grid(c_ptr);\r
527                         }\r
528 \r
529                         /* Sometimes shut using secret doors */\r
530                         if (one_in_(3))\r
531                         {\r
532                                 int door_type = ((d_info[dungeon_type].flags1 & DF1_CURTAIN) &&\r
533                                         one_in_((d_info[dungeon_type].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :\r
534                                         ((d_info[dungeon_type].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);\r
535 \r
536                                 place_secret_door(yval, x1a - 1, door_type);\r
537                                 place_secret_door(yval, x2a + 1, door_type);\r
538                                 place_secret_door(y1b - 1, xval, door_type);\r
539                                 place_secret_door(y2b + 1, xval, door_type);\r
540                         }\r
541                 }\r
542 \r
543                 /* Occasionally put a "plus" in the center */\r
544                 else if (one_in_(3))\r
545                 {\r
546                         c_ptr = &cave[yval][xval];\r
547                         place_inner_grid(c_ptr);\r
548                         c_ptr = &cave[y1b][xval];\r
549                         place_inner_grid(c_ptr);\r
550                         c_ptr = &cave[y2b][xval];\r
551                         place_inner_grid(c_ptr);\r
552                         c_ptr = &cave[yval][x1a];\r
553                         place_inner_grid(c_ptr);\r
554                         c_ptr = &cave[yval][x2a];\r
555                         place_inner_grid(c_ptr);\r
556                 }\r
557 \r
558                 /* Occasionally put a pillar in the center */\r
559                 else if (one_in_(3))\r
560                 {\r
561                         c_ptr = &cave[yval][xval];\r
562                         place_inner_grid(c_ptr);\r
563                 }\r
564 \r
565                 break;\r
566         }\r
567         }\r
568 \r
569         return TRUE;\r
570 }\r
571 \r
572 /*!\r
573 * @brief \83^\83C\83v4\82Ì\95\94\89®\81c\8cÅ\92è\83T\83C\83Y\82Ì\93ñ\8fd\8d\\91¢\95\94\89®\82ð\90\90¬\82·\82é / Type 4 -- Large room with inner features\r
574 * @return \82È\82µ\r
575 * @details\r
576 * Possible sub-types:\n\r
577 *       1 - Just an inner room with one door\n\r
578 *       2 - An inner room within an inner room\n\r
579 *       3 - An inner room with pillar(s)\n\r
580 *       4 - Inner room has a maze\n\r
581 *       5 - A set of four inner rooms\n\r
582 */\r
583 bool build_type4(void)\r
584 {\r
585         POSITION y, x, y1, x1;\r
586         POSITION y2, x2, tmp, yval, xval;\r
587         bool        light;\r
588         cave_type   *c_ptr;\r
589 \r
590 \r
591         /* Find and reserve some space in the dungeon.  Get center of room. */\r
592         if (!find_space(&yval, &xval, 11, 25)) return FALSE;\r
593 \r
594         /* Choose lite or dark */\r
595         light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
596 \r
597         /* Large room */\r
598         y1 = yval - 4;\r
599         y2 = yval + 4;\r
600         x1 = xval - 11;\r
601         x2 = xval + 11;\r
602 \r
603         /* Place a full floor under the room */\r
604         for (y = y1 - 1; y <= y2 + 1; y++)\r
605         {\r
606                 for (x = x1 - 1; x <= x2 + 1; x++)\r
607                 {\r
608                         c_ptr = &cave[y][x];\r
609                         place_floor_grid(c_ptr);\r
610                         c_ptr->info |= (CAVE_ROOM);\r
611                         if (light) c_ptr->info |= (CAVE_GLOW);\r
612                 }\r
613         }\r
614 \r
615         /* Outer Walls */\r
616         for (y = y1 - 1; y <= y2 + 1; y++)\r
617         {\r
618                 c_ptr = &cave[y][x1 - 1];\r
619                 place_outer_grid(c_ptr);\r
620                 c_ptr = &cave[y][x2 + 1];\r
621                 place_outer_grid(c_ptr);\r
622         }\r
623         for (x = x1 - 1; x <= x2 + 1; x++)\r
624         {\r
625                 c_ptr = &cave[y1 - 1][x];\r
626                 place_outer_grid(c_ptr);\r
627                 c_ptr = &cave[y2 + 1][x];\r
628                 place_outer_grid(c_ptr);\r
629         }\r
630 \r
631 \r
632         /* The inner room */\r
633         y1 = y1 + 2;\r
634         y2 = y2 - 2;\r
635         x1 = x1 + 2;\r
636         x2 = x2 - 2;\r
637 \r
638         /* The inner walls */\r
639         for (y = y1 - 1; y <= y2 + 1; y++)\r
640         {\r
641                 c_ptr = &cave[y][x1 - 1];\r
642                 place_inner_grid(c_ptr);\r
643                 c_ptr = &cave[y][x2 + 1];\r
644                 place_inner_grid(c_ptr);\r
645         }\r
646         for (x = x1 - 1; x <= x2 + 1; x++)\r
647         {\r
648                 c_ptr = &cave[y1 - 1][x];\r
649                 place_inner_grid(c_ptr);\r
650                 c_ptr = &cave[y2 + 1][x];\r
651                 place_inner_grid(c_ptr);\r
652         }\r
653 \r
654 \r
655         /* Inner room variations */\r
656         switch (randint1(5))\r
657         {\r
658                 /* Just an inner room with a monster */\r
659         case 1:\r
660         {\r
661                 /* Place a secret door */\r
662                 switch (randint1(4))\r
663                 {\r
664                 case 1: place_secret_door(y1 - 1, xval, DOOR_DEFAULT); break;\r
665                 case 2: place_secret_door(y2 + 1, xval, DOOR_DEFAULT); break;\r
666                 case 3: place_secret_door(yval, x1 - 1, DOOR_DEFAULT); break;\r
667                 case 4: place_secret_door(yval, x2 + 1, DOOR_DEFAULT); break;\r
668                 }\r
669 \r
670                 /* Place a monster in the room */\r
671                 vault_monsters(yval, xval, 1);\r
672 \r
673                 break;\r
674         }\r
675 \r
676         /* Treasure Vault (with a door) */\r
677         case 2:\r
678         {\r
679                 /* Place a secret door */\r
680                 switch (randint1(4))\r
681                 {\r
682                 case 1: place_secret_door(y1 - 1, xval, DOOR_DEFAULT); break;\r
683                 case 2: place_secret_door(y2 + 1, xval, DOOR_DEFAULT); break;\r
684                 case 3: place_secret_door(yval, x1 - 1, DOOR_DEFAULT); break;\r
685                 case 4: place_secret_door(yval, x2 + 1, DOOR_DEFAULT); break;\r
686                 }\r
687 \r
688                 /* Place another inner room */\r
689                 for (y = yval - 1; y <= yval + 1; y++)\r
690                 {\r
691                         for (x = xval - 1; x <= xval + 1; x++)\r
692                         {\r
693                                 if ((x == xval) && (y == yval)) continue;\r
694                                 c_ptr = &cave[y][x];\r
695                                 place_inner_grid(c_ptr);\r
696                         }\r
697                 }\r
698 \r
699                 /* Place a locked door on the inner room */\r
700                 switch (randint1(4))\r
701                 {\r
702                 case 1: place_locked_door(yval - 1, xval); break;\r
703                 case 2: place_locked_door(yval + 1, xval); break;\r
704                 case 3: place_locked_door(yval, xval - 1); break;\r
705                 case 4: place_locked_door(yval, xval + 1); break;\r
706                 }\r
707 \r
708                 /* Monsters to guard the "treasure" */\r
709                 vault_monsters(yval, xval, randint1(3) + 2);\r
710 \r
711                 /* Object (80%) */\r
712                 if (randint0(100) < 80)\r
713                 {\r
714                         place_object(yval, xval, 0L);\r
715                 }\r
716 \r
717                 /* Stairs (20%) */\r
718                 else\r
719                 {\r
720                         place_random_stairs(yval, xval);\r
721                 }\r
722 \r
723                 /* Traps to protect the treasure */\r
724                 vault_traps(yval, xval, 4, 10, 2 + randint1(3));\r
725 \r
726                 break;\r
727         }\r
728 \r
729         /* Inner pillar(s). */\r
730         case 3:\r
731         {\r
732                 /* Place a secret door */\r
733                 switch (randint1(4))\r
734                 {\r
735                 case 1: place_secret_door(y1 - 1, xval, DOOR_DEFAULT); break;\r
736                 case 2: place_secret_door(y2 + 1, xval, DOOR_DEFAULT); break;\r
737                 case 3: place_secret_door(yval, x1 - 1, DOOR_DEFAULT); break;\r
738                 case 4: place_secret_door(yval, x2 + 1, DOOR_DEFAULT); break;\r
739                 }\r
740 \r
741                 /* Large Inner Pillar */\r
742                 for (y = yval - 1; y <= yval + 1; y++)\r
743                 {\r
744                         for (x = xval - 1; x <= xval + 1; x++)\r
745                         {\r
746                                 c_ptr = &cave[y][x];\r
747                                 place_inner_grid(c_ptr);\r
748                         }\r
749                 }\r
750 \r
751                 /* Occasionally, two more Large Inner Pillars */\r
752                 if (one_in_(2))\r
753                 {\r
754                         tmp = randint1(2);\r
755                         for (y = yval - 1; y <= yval + 1; y++)\r
756                         {\r
757                                 for (x = xval - 5 - tmp; x <= xval - 3 - tmp; x++)\r
758                                 {\r
759                                         c_ptr = &cave[y][x];\r
760                                         place_inner_grid(c_ptr);\r
761                                 }\r
762                                 for (x = xval + 3 + tmp; x <= xval + 5 + tmp; x++)\r
763                                 {\r
764                                         c_ptr = &cave[y][x];\r
765                                         place_inner_grid(c_ptr);\r
766                                 }\r
767                         }\r
768                 }\r
769 \r
770                 /* Occasionally, some Inner rooms */\r
771                 if (one_in_(3))\r
772                 {\r
773                         int door_type = ((d_info[dungeon_type].flags1 & DF1_CURTAIN) &&\r
774                                 one_in_((d_info[dungeon_type].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :\r
775                                 ((d_info[dungeon_type].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);\r
776 \r
777                         /* Long horizontal walls */\r
778                         for (x = xval - 5; x <= xval + 5; x++)\r
779                         {\r
780                                 c_ptr = &cave[yval - 1][x];\r
781                                 place_inner_grid(c_ptr);\r
782                                 c_ptr = &cave[yval + 1][x];\r
783                                 place_inner_grid(c_ptr);\r
784                         }\r
785 \r
786                         /* Close off the left/right edges */\r
787                         c_ptr = &cave[yval][xval - 5];\r
788                         place_inner_grid(c_ptr);\r
789                         c_ptr = &cave[yval][xval + 5];\r
790                         place_inner_grid(c_ptr);\r
791 \r
792                         /* Secret doors (random top/bottom) */\r
793                         place_secret_door(yval - 3 + (randint1(2) * 2), xval - 3, door_type);\r
794                         place_secret_door(yval - 3 + (randint1(2) * 2), xval + 3, door_type);\r
795 \r
796                         /* Monsters */\r
797                         vault_monsters(yval, xval - 2, randint1(2));\r
798                         vault_monsters(yval, xval + 2, randint1(2));\r
799 \r
800                         /* Objects */\r
801                         if (one_in_(3)) place_object(yval, xval - 2, 0L);\r
802                         if (one_in_(3)) place_object(yval, xval + 2, 0L);\r
803                 }\r
804 \r
805                 break;\r
806         }\r
807 \r
808         /* Maze inside. */\r
809         case 4:\r
810         {\r
811                 /* Place a secret door */\r
812                 switch (randint1(4))\r
813                 {\r
814                 case 1: place_secret_door(y1 - 1, xval, DOOR_DEFAULT); break;\r
815                 case 2: place_secret_door(y2 + 1, xval, DOOR_DEFAULT); break;\r
816                 case 3: place_secret_door(yval, x1 - 1, DOOR_DEFAULT); break;\r
817                 case 4: place_secret_door(yval, x2 + 1, DOOR_DEFAULT); break;\r
818                 }\r
819 \r
820                 /* Maze (really a checkerboard) */\r
821                 for (y = y1; y <= y2; y++)\r
822                 {\r
823                         for (x = x1; x <= x2; x++)\r
824                         {\r
825                                 if (0x1 & (x + y))\r
826                                 {\r
827                                         c_ptr = &cave[y][x];\r
828                                         place_inner_grid(c_ptr);\r
829                                 }\r
830                         }\r
831                 }\r
832 \r
833                 /* Monsters just love mazes. */\r
834                 vault_monsters(yval, xval - 5, randint1(3));\r
835                 vault_monsters(yval, xval + 5, randint1(3));\r
836 \r
837                 /* Traps make them entertaining. */\r
838                 vault_traps(yval, xval - 3, 2, 8, randint1(3));\r
839                 vault_traps(yval, xval + 3, 2, 8, randint1(3));\r
840 \r
841                 /* Mazes should have some treasure too. */\r
842                 vault_objects(yval, xval, 3);\r
843 \r
844                 break;\r
845         }\r
846 \r
847         /* Four small rooms. */\r
848         case 5:\r
849         {\r
850                 int door_type = ((d_info[dungeon_type].flags1 & DF1_CURTAIN) &&\r
851                         one_in_((d_info[dungeon_type].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :\r
852                         ((d_info[dungeon_type].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);\r
853 \r
854                 /* Inner "cross" */\r
855                 for (y = y1; y <= y2; y++)\r
856                 {\r
857                         c_ptr = &cave[y][xval];\r
858                         place_inner_grid(c_ptr);\r
859                 }\r
860                 for (x = x1; x <= x2; x++)\r
861                 {\r
862                         c_ptr = &cave[yval][x];\r
863                         place_inner_grid(c_ptr);\r
864                 }\r
865 \r
866                 /* Doors into the rooms */\r
867                 if (randint0(100) < 50)\r
868                 {\r
869                         int i = randint1(10);\r
870                         place_secret_door(y1 - 1, xval - i, door_type);\r
871                         place_secret_door(y1 - 1, xval + i, door_type);\r
872                         place_secret_door(y2 + 1, xval - i, door_type);\r
873                         place_secret_door(y2 + 1, xval + i, door_type);\r
874                 }\r
875                 else\r
876                 {\r
877                         int i = randint1(3);\r
878                         place_secret_door(yval + i, x1 - 1, door_type);\r
879                         place_secret_door(yval - i, x1 - 1, door_type);\r
880                         place_secret_door(yval + i, x2 + 1, door_type);\r
881                         place_secret_door(yval - i, x2 + 1, door_type);\r
882                 }\r
883 \r
884                 /* Treasure, centered at the center of the cross */\r
885                 vault_objects(yval, xval, 2 + randint1(2));\r
886 \r
887                 /* Gotta have some monsters. */\r
888                 vault_monsters(yval + 1, xval - 4, randint1(4));\r
889                 vault_monsters(yval + 1, xval + 4, randint1(4));\r
890                 vault_monsters(yval - 1, xval - 4, randint1(4));\r
891                 vault_monsters(yval - 1, xval + 4, randint1(4));\r
892 \r
893                 break;\r
894         }\r
895         }\r
896 \r
897         return TRUE;\r
898 }