1 #include "room/rooms-normal.h"
2 #include "dungeon/dungeon-flag-types.h"
3 #include "dungeon/dungeon.h"
4 #include "floor/geometry.h"
7 #include "grid/stair.h"
8 #include "grid/object-placer.h"
10 #include "room/door-definition.h"
11 #include "room/rooms-builder.h"
12 #include "room/space-finder.h"
13 #include "room/vault-builder.h"
14 #include "system/floor-type-definition.h"
15 #include "system/grid-type-definition.h"
16 #include "system/player-type-definition.h"
19 * @brief タイプ1の部屋…通常可変長方形の部屋を生成する / Type 1 -- normal rectangular rooms
20 * @param player_ptr プレイヤーへの参照ポインタ
22 bool build_type1(player_type *player_ptr, dun_data_type *dd_ptr)
24 POSITION y, x, y2, x2, yval, xval;
25 POSITION y1, x1, xsize, ysize;
31 floor_type *floor_ptr = player_ptr->current_floor_ptr;
32 bool curtain = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN)) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 48 : 512);
34 /* Pick a room size */
43 /* Find and reserve some space in the dungeon. Get center of room. */
44 if (!find_space(player_ptr, dd_ptr, &yval, &xval, ysize + 2, xsize + 2)) {
45 /* Limit to the minimum room size, and retry */
54 /* Find and reserve some space in the dungeon. Get center of room. */
55 if (!find_space(player_ptr, dd_ptr, &yval, &xval, ysize + 2, xsize + 2))
59 /* Choose lite or dark */
60 light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
62 /* Get corner values */
63 y1 = yval - ysize / 2;
64 x1 = xval - xsize / 2;
65 y2 = yval + (ysize - 1) / 2;
66 x2 = xval + (xsize - 1) / 2;
68 /* Place a full floor under the room */
69 for (y = y1 - 1; y <= y2 + 1; y++) {
70 for (x = x1 - 1; x <= x2 + 1; x++) {
71 g_ptr = &floor_ptr->grid_array[y][x];
72 place_grid(player_ptr, g_ptr, GB_FLOOR);
73 g_ptr->info |= (CAVE_ROOM);
75 g_ptr->info |= (CAVE_GLOW);
79 /* Walls around the room */
80 for (y = y1 - 1; y <= y2 + 1; y++) {
81 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
82 place_grid(player_ptr, g_ptr, GB_OUTER);
83 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
84 place_grid(player_ptr, g_ptr, GB_OUTER);
86 for (x = x1 - 1; x <= x2 + 1; x++) {
87 g_ptr = &floor_ptr->grid_array[y1 - 1][x];
88 place_grid(player_ptr, g_ptr, GB_OUTER);
89 g_ptr = &floor_ptr->grid_array[y2 + 1][x];
90 place_grid(player_ptr, g_ptr, GB_OUTER);
93 /* Hack -- Occasional curtained room */
94 if (curtain && (y2 - y1 > 2) && (x2 - x1 > 2)) {
95 for (y = y1; y <= y2; y++) {
96 g_ptr = &floor_ptr->grid_array[y][x1];
97 g_ptr->feat = feat_door[DOOR_CURTAIN].closed;
98 g_ptr->info &= ~(CAVE_MASK);
99 g_ptr = &floor_ptr->grid_array[y][x2];
100 g_ptr->feat = feat_door[DOOR_CURTAIN].closed;
101 g_ptr->info &= ~(CAVE_MASK);
103 for (x = x1; x <= x2; x++) {
104 g_ptr = &floor_ptr->grid_array[y1][x];
105 g_ptr->feat = feat_door[DOOR_CURTAIN].closed;
106 g_ptr->info &= ~(CAVE_MASK);
107 g_ptr = &floor_ptr->grid_array[y2][x];
108 g_ptr->feat = feat_door[DOOR_CURTAIN].closed;
109 g_ptr->info &= ~(CAVE_MASK);
113 /* Hack -- Occasional pillar room */
115 for (y = y1; y <= y2; y += 2) {
116 for (x = x1; x <= x2; x += 2) {
117 g_ptr = &floor_ptr->grid_array[y][x];
118 place_grid(player_ptr, g_ptr, GB_INNER);
123 /* Hack -- Occasional room with four pillars */
124 else if (one_in_(20)) {
125 if ((y1 + 4 < y2) && (x1 + 4 < x2)) {
126 g_ptr = &floor_ptr->grid_array[y1 + 1][x1 + 1];
127 place_grid(player_ptr, g_ptr, GB_INNER);
129 g_ptr = &floor_ptr->grid_array[y1 + 1][x2 - 1];
130 place_grid(player_ptr, g_ptr, GB_INNER);
132 g_ptr = &floor_ptr->grid_array[y2 - 1][x1 + 1];
133 place_grid(player_ptr, g_ptr, GB_INNER);
135 g_ptr = &floor_ptr->grid_array[y2 - 1][x2 - 1];
136 place_grid(player_ptr, g_ptr, GB_INNER);
140 /* Hack -- Occasional ragged-edge room */
141 else if (one_in_(50)) {
142 for (y = y1 + 2; y <= y2 - 2; y += 2) {
143 g_ptr = &floor_ptr->grid_array[y][x1];
144 place_grid(player_ptr, g_ptr, GB_INNER);
145 g_ptr = &floor_ptr->grid_array[y][x2];
146 place_grid(player_ptr, g_ptr, GB_INNER);
148 for (x = x1 + 2; x <= x2 - 2; x += 2) {
149 g_ptr = &floor_ptr->grid_array[y1][x];
150 place_grid(player_ptr, g_ptr, GB_INNER);
151 g_ptr = &floor_ptr->grid_array[y2][x];
152 place_grid(player_ptr, g_ptr, GB_INNER);
155 /* Hack -- Occasional divided room */
156 else if (one_in_(50)) {
157 bool curtain2 = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN)) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 2 : 128);
159 if (randint1(100) < 50) {
160 /* Horizontal wall */
161 for (x = x1; x <= x2; x++) {
162 place_bold(player_ptr, yval, x, GB_INNER);
164 floor_ptr->grid_array[yval][x].feat = feat_door[DOOR_CURTAIN].closed;
167 /* Prevent edge of wall from being tunneled */
168 place_bold(player_ptr, yval, x1 - 1, GB_SOLID);
169 place_bold(player_ptr, yval, x2 + 1, GB_SOLID);
172 for (y = y1; y <= y2; y++) {
173 place_bold(player_ptr, y, xval, GB_INNER);
175 floor_ptr->grid_array[y][xval].feat = feat_door[DOOR_CURTAIN].closed;
178 /* Prevent edge of wall from being tunneled */
179 place_bold(player_ptr, y1 - 1, xval, GB_SOLID);
180 place_bold(player_ptr, y2 + 1, xval, GB_SOLID);
183 place_random_door(player_ptr, yval, xval, true);
185 floor_ptr->grid_array[yval][xval].feat = feat_door[DOOR_CURTAIN].closed;
192 * @brief タイプ2の部屋…二重長方形の部屋を生成する / Type 2 -- Overlapping rectangular rooms
193 * @param player_ptr プレイヤーへの参照ポインタ
195 bool build_type2(player_type *player_ptr, dun_data_type *dd_ptr)
197 POSITION y, x, xval, yval;
198 POSITION y1a, x1a, y2a, x2a;
199 POSITION y1b, x1b, y2b, x2b;
203 /* Find and reserve some space in the dungeon. Get center of room. */
204 floor_type *floor_ptr = player_ptr->current_floor_ptr;
205 if (!find_space(player_ptr, dd_ptr, &yval, &xval, 11, 25))
208 /* Choose lite or dark */
209 light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
211 /* Determine extents of the first room */
212 y1a = yval - randint1(4);
213 y2a = yval + randint1(3);
214 x1a = xval - randint1(11);
215 x2a = xval + randint1(10);
217 /* Determine extents of the second room */
218 y1b = yval - randint1(3);
219 y2b = yval + randint1(4);
220 x1b = xval - randint1(10);
221 x2b = xval + randint1(11);
223 /* Place a full floor for room "a" */
224 for (y = y1a - 1; y <= y2a + 1; y++) {
225 for (x = x1a - 1; x <= x2a + 1; x++) {
226 g_ptr = &floor_ptr->grid_array[y][x];
227 place_grid(player_ptr, g_ptr, GB_FLOOR);
228 g_ptr->info |= (CAVE_ROOM);
230 g_ptr->info |= (CAVE_GLOW);
234 /* Place a full floor for room "b" */
235 for (y = y1b - 1; y <= y2b + 1; y++) {
236 for (x = x1b - 1; x <= x2b + 1; x++) {
237 g_ptr = &floor_ptr->grid_array[y][x];
238 place_grid(player_ptr, g_ptr, GB_FLOOR);
239 g_ptr->info |= (CAVE_ROOM);
241 g_ptr->info |= (CAVE_GLOW);
245 /* Place the walls around room "a" */
246 for (y = y1a - 1; y <= y2a + 1; y++) {
247 g_ptr = &floor_ptr->grid_array[y][x1a - 1];
248 place_grid(player_ptr, g_ptr, GB_OUTER);
249 g_ptr = &floor_ptr->grid_array[y][x2a + 1];
250 place_grid(player_ptr, g_ptr, GB_OUTER);
252 for (x = x1a - 1; x <= x2a + 1; x++) {
253 g_ptr = &floor_ptr->grid_array[y1a - 1][x];
254 place_grid(player_ptr, g_ptr, GB_OUTER);
255 g_ptr = &floor_ptr->grid_array[y2a + 1][x];
256 place_grid(player_ptr, g_ptr, GB_OUTER);
259 /* Place the walls around room "b" */
260 for (y = y1b - 1; y <= y2b + 1; y++) {
261 g_ptr = &floor_ptr->grid_array[y][x1b - 1];
262 place_grid(player_ptr, g_ptr, GB_OUTER);
263 g_ptr = &floor_ptr->grid_array[y][x2b + 1];
264 place_grid(player_ptr, g_ptr, GB_OUTER);
266 for (x = x1b - 1; x <= x2b + 1; x++) {
267 g_ptr = &floor_ptr->grid_array[y1b - 1][x];
268 place_grid(player_ptr, g_ptr, GB_OUTER);
269 g_ptr = &floor_ptr->grid_array[y2b + 1][x];
270 place_grid(player_ptr, g_ptr, GB_OUTER);
273 /* Replace the floor for room "a" */
274 for (y = y1a; y <= y2a; y++) {
275 for (x = x1a; x <= x2a; x++) {
276 g_ptr = &floor_ptr->grid_array[y][x];
277 place_grid(player_ptr, g_ptr, GB_FLOOR);
281 /* Replace the floor for room "b" */
282 for (y = y1b; y <= y2b; y++) {
283 for (x = x1b; x <= x2b; x++) {
284 g_ptr = &floor_ptr->grid_array[y][x];
285 place_grid(player_ptr, g_ptr, GB_FLOOR);
293 * @brief タイプ3の部屋…十字型の部屋を生成する / Type 3 -- Cross shaped rooms
294 * @param player_ptr プレイヤーへの参照ポインタ
296 * Builds a room at a row, column coordinate\n
298 * Room "a" runs north/south, and Room "b" runs east/east\n
299 * So the "central pillar" runs from x1a, y1b to x2a, y2b.\n
301 * Note that currently, the "center" is always 3x3, but I think that\n
302 * the code below will work (with "bounds checking") for 5x5, or even\n
303 * for unsymetric values like 4x3 or 5x3 or 3x4 or 3x5, or even larger.\n
305 bool build_type3(player_type *player_ptr, dun_data_type *dd_ptr)
307 POSITION y, x, dy, dx, wy, wx;
308 POSITION y1a, x1a, y2a, x2a;
309 POSITION y1b, x1b, y2b, x2b;
314 /* Find and reserve some space in the dungeon. Get center of room. */
315 floor_type *floor_ptr = player_ptr->current_floor_ptr;
316 if (!find_space(player_ptr, dd_ptr, &yval, &xval, 11, 25))
319 /* Choose lite or dark */
320 light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
322 /* For now, always 3x3 */
325 /* Pick max vertical size (at most 4) */
326 dy = rand_range(3, 4);
328 /* Pick max horizontal size (at most 15) */
329 dx = rand_range(3, 11);
331 /* Determine extents of the north/south room */
337 /* Determine extents of the east/west room */
343 /* Place a full floor for room "a" */
344 for (y = y1a - 1; y <= y2a + 1; y++) {
345 for (x = x1a - 1; x <= x2a + 1; x++) {
346 g_ptr = &floor_ptr->grid_array[y][x];
347 place_grid(player_ptr, g_ptr, GB_FLOOR);
348 g_ptr->info |= (CAVE_ROOM);
350 g_ptr->info |= (CAVE_GLOW);
354 /* Place a full floor for room "b" */
355 for (y = y1b - 1; y <= y2b + 1; y++) {
356 for (x = x1b - 1; x <= x2b + 1; x++) {
357 g_ptr = &floor_ptr->grid_array[y][x];
358 place_grid(player_ptr, g_ptr, GB_FLOOR);
359 g_ptr->info |= (CAVE_ROOM);
361 g_ptr->info |= (CAVE_GLOW);
365 /* Place the walls around room "a" */
366 for (y = y1a - 1; y <= y2a + 1; y++) {
367 g_ptr = &floor_ptr->grid_array[y][x1a - 1];
368 place_grid(player_ptr, g_ptr, GB_OUTER);
369 g_ptr = &floor_ptr->grid_array[y][x2a + 1];
370 place_grid(player_ptr, g_ptr, GB_OUTER);
372 for (x = x1a - 1; x <= x2a + 1; x++) {
373 g_ptr = &floor_ptr->grid_array[y1a - 1][x];
374 place_grid(player_ptr, g_ptr, GB_OUTER);
375 g_ptr = &floor_ptr->grid_array[y2a + 1][x];
376 place_grid(player_ptr, g_ptr, GB_OUTER);
379 /* Place the walls around room "b" */
380 for (y = y1b - 1; y <= y2b + 1; y++) {
381 g_ptr = &floor_ptr->grid_array[y][x1b - 1];
382 place_grid(player_ptr, g_ptr, GB_OUTER);
383 g_ptr = &floor_ptr->grid_array[y][x2b + 1];
384 place_grid(player_ptr, g_ptr, GB_OUTER);
386 for (x = x1b - 1; x <= x2b + 1; x++) {
387 g_ptr = &floor_ptr->grid_array[y1b - 1][x];
388 place_grid(player_ptr, g_ptr, GB_OUTER);
389 g_ptr = &floor_ptr->grid_array[y2b + 1][x];
390 place_grid(player_ptr, g_ptr, GB_OUTER);
393 /* Replace the floor for room "a" */
394 for (y = y1a; y <= y2a; y++) {
395 for (x = x1a; x <= x2a; x++) {
396 g_ptr = &floor_ptr->grid_array[y][x];
397 place_grid(player_ptr, g_ptr, GB_FLOOR);
401 /* Replace the floor for room "b" */
402 for (y = y1b; y <= y2b; y++) {
403 for (x = x1b; x <= x2b; x++) {
404 g_ptr = &floor_ptr->grid_array[y][x];
405 place_grid(player_ptr, g_ptr, GB_FLOOR);
409 /* Special features (3/4) */
410 switch (randint0(4)) {
411 /* Large solid middle pillar */
413 for (y = y1b; y <= y2b; y++) {
414 for (x = x1a; x <= x2a; x++) {
415 g_ptr = &floor_ptr->grid_array[y][x];
416 place_grid(player_ptr, g_ptr, GB_INNER);
422 /* Inner treasure vault */
424 /* Build the vault */
425 for (y = y1b; y <= y2b; y++) {
426 g_ptr = &floor_ptr->grid_array[y][x1a];
427 place_grid(player_ptr, g_ptr, GB_INNER);
428 g_ptr = &floor_ptr->grid_array[y][x2a];
429 place_grid(player_ptr, g_ptr, GB_INNER);
431 for (x = x1a; x <= x2a; x++) {
432 g_ptr = &floor_ptr->grid_array[y1b][x];
433 place_grid(player_ptr, g_ptr, GB_INNER);
434 g_ptr = &floor_ptr->grid_array[y2b][x];
435 place_grid(player_ptr, g_ptr, GB_INNER);
438 /* Place a secret door on the inner room */
439 switch (randint0(4)) {
441 place_secret_door(player_ptr, y1b, xval, DOOR_DEFAULT);
444 place_secret_door(player_ptr, y2b, xval, DOOR_DEFAULT);
447 place_secret_door(player_ptr, yval, x1a, DOOR_DEFAULT);
450 place_secret_door(player_ptr, yval, x2a, DOOR_DEFAULT);
454 /* Place a treasure in the vault */
455 place_object(player_ptr, yval, xval, 0L);
457 /* Let's guard the treasure well */
458 vault_monsters(player_ptr, yval, xval, randint0(2) + 3);
460 /* Traps naturally */
461 vault_traps(player_ptr, yval, xval, 4, 4, randint0(3) + 2);
468 /* Occasionally pinch the center shut */
470 /* Pinch the east/west sides */
471 for (y = y1b; y <= y2b; y++) {
474 g_ptr = &floor_ptr->grid_array[y][x1a - 1];
475 place_grid(player_ptr, g_ptr, GB_INNER);
476 g_ptr = &floor_ptr->grid_array[y][x2a + 1];
477 place_grid(player_ptr, g_ptr, GB_INNER);
480 /* Pinch the north/south sides */
481 for (x = x1a; x <= x2a; x++) {
484 g_ptr = &floor_ptr->grid_array[y1b - 1][x];
485 place_grid(player_ptr, g_ptr, GB_INNER);
486 g_ptr = &floor_ptr->grid_array[y2b + 1][x];
487 place_grid(player_ptr, g_ptr, GB_INNER);
490 /* Sometimes shut using secret doors */
493 = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
495 : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
497 place_secret_door(player_ptr, yval, x1a - 1, door_type);
498 place_secret_door(player_ptr, yval, x2a + 1, door_type);
499 place_secret_door(player_ptr, y1b - 1, xval, door_type);
500 place_secret_door(player_ptr, y2b + 1, xval, door_type);
504 /* Occasionally put a "plus" in the center */
505 else if (one_in_(3)) {
506 g_ptr = &floor_ptr->grid_array[yval][xval];
507 place_grid(player_ptr, g_ptr, GB_INNER);
508 g_ptr = &floor_ptr->grid_array[y1b][xval];
509 place_grid(player_ptr, g_ptr, GB_INNER);
510 g_ptr = &floor_ptr->grid_array[y2b][xval];
511 place_grid(player_ptr, g_ptr, GB_INNER);
512 g_ptr = &floor_ptr->grid_array[yval][x1a];
513 place_grid(player_ptr, g_ptr, GB_INNER);
514 g_ptr = &floor_ptr->grid_array[yval][x2a];
515 place_grid(player_ptr, g_ptr, GB_INNER);
518 /* Occasionally put a pillar in the center */
519 else if (one_in_(3)) {
520 g_ptr = &floor_ptr->grid_array[yval][xval];
521 place_grid(player_ptr, g_ptr, GB_INNER);
532 * @brief タイプ4の部屋…固定サイズの二重構造部屋を生成する / Type 4 -- Large room with inner features
533 * @param player_ptr プレイヤーへの参照ポインタ
535 * Possible sub-types:\n
536 * 1 - Just an inner room with one door\n
537 * 2 - An inner room within an inner room\n
538 * 3 - An inner room with pillar(s)\n
539 * 4 - Inner room has a maze\n
540 * 5 - A set of four inner rooms\n
542 bool build_type4(player_type *player_ptr, dun_data_type *dd_ptr)
544 POSITION y, x, y1, x1;
545 POSITION y2, x2, tmp, yval, xval;
549 /* Find and reserve some space in the dungeon. Get center of room. */
550 floor_type *floor_ptr = player_ptr->current_floor_ptr;
551 if (!find_space(player_ptr, dd_ptr, &yval, &xval, 11, 25))
554 /* Choose lite or dark */
555 light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
563 /* Place a full floor under the room */
564 for (y = y1 - 1; y <= y2 + 1; y++) {
565 for (x = x1 - 1; x <= x2 + 1; x++) {
566 g_ptr = &floor_ptr->grid_array[y][x];
567 place_grid(player_ptr, g_ptr, GB_FLOOR);
568 g_ptr->info |= (CAVE_ROOM);
570 g_ptr->info |= (CAVE_GLOW);
575 for (y = y1 - 1; y <= y2 + 1; y++) {
576 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
577 place_grid(player_ptr, g_ptr, GB_OUTER);
578 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
579 place_grid(player_ptr, g_ptr, GB_OUTER);
581 for (x = x1 - 1; x <= x2 + 1; x++) {
582 g_ptr = &floor_ptr->grid_array[y1 - 1][x];
583 place_grid(player_ptr, g_ptr, GB_OUTER);
584 g_ptr = &floor_ptr->grid_array[y2 + 1][x];
585 place_grid(player_ptr, g_ptr, GB_OUTER);
594 /* The inner walls */
595 for (y = y1 - 1; y <= y2 + 1; y++) {
596 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
597 place_grid(player_ptr, g_ptr, GB_INNER);
598 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
599 place_grid(player_ptr, g_ptr, GB_INNER);
601 for (x = x1 - 1; x <= x2 + 1; x++) {
602 g_ptr = &floor_ptr->grid_array[y1 - 1][x];
603 place_grid(player_ptr, g_ptr, GB_INNER);
604 g_ptr = &floor_ptr->grid_array[y2 + 1][x];
605 place_grid(player_ptr, g_ptr, GB_INNER);
608 /* Inner room variations */
609 switch (randint1(5)) {
610 /* Just an inner room with a monster */
612 /* Place a secret door */
613 switch (randint1(4)) {
615 place_secret_door(player_ptr, y1 - 1, xval, DOOR_DEFAULT);
618 place_secret_door(player_ptr, y2 + 1, xval, DOOR_DEFAULT);
621 place_secret_door(player_ptr, yval, x1 - 1, DOOR_DEFAULT);
624 place_secret_door(player_ptr, yval, x2 + 1, DOOR_DEFAULT);
628 /* Place a monster in the room */
629 vault_monsters(player_ptr, yval, xval, 1);
634 /* Treasure Vault (with a door) */
636 /* Place a secret door */
637 switch (randint1(4)) {
639 place_secret_door(player_ptr, y1 - 1, xval, DOOR_DEFAULT);
642 place_secret_door(player_ptr, y2 + 1, xval, DOOR_DEFAULT);
645 place_secret_door(player_ptr, yval, x1 - 1, DOOR_DEFAULT);
648 place_secret_door(player_ptr, yval, x2 + 1, DOOR_DEFAULT);
652 /* Place another inner room */
653 for (y = yval - 1; y <= yval + 1; y++) {
654 for (x = xval - 1; x <= xval + 1; x++) {
655 if ((x == xval) && (y == yval))
657 g_ptr = &floor_ptr->grid_array[y][x];
658 place_grid(player_ptr, g_ptr, GB_INNER);
662 /* Place a locked door on the inner room */
663 switch (randint1(4)) {
665 place_locked_door(player_ptr, yval - 1, xval);
668 place_locked_door(player_ptr, yval + 1, xval);
671 place_locked_door(player_ptr, yval, xval - 1);
674 place_locked_door(player_ptr, yval, xval + 1);
678 /* Monsters to guard the "treasure" */
679 vault_monsters(player_ptr, yval, xval, randint1(3) + 2);
682 if (randint0(100) < 80) {
683 place_object(player_ptr, yval, xval, 0L);
688 place_random_stairs(player_ptr, yval, xval);
691 /* Traps to protect the treasure */
692 vault_traps(player_ptr, yval, xval, 4, 10, 2 + randint1(3));
697 /* Inner pillar(s). */
699 /* Place a secret door */
700 switch (randint1(4)) {
702 place_secret_door(player_ptr, y1 - 1, xval, DOOR_DEFAULT);
705 place_secret_door(player_ptr, y2 + 1, xval, DOOR_DEFAULT);
708 place_secret_door(player_ptr, yval, x1 - 1, DOOR_DEFAULT);
711 place_secret_door(player_ptr, yval, x2 + 1, DOOR_DEFAULT);
715 /* Large Inner Pillar */
716 for (y = yval - 1; y <= yval + 1; y++) {
717 for (x = xval - 1; x <= xval + 1; x++) {
718 g_ptr = &floor_ptr->grid_array[y][x];
719 place_grid(player_ptr, g_ptr, GB_INNER);
723 /* Occasionally, two more Large Inner Pillars */
726 for (y = yval - 1; y <= yval + 1; y++) {
727 for (x = xval - 5 - tmp; x <= xval - 3 - tmp; x++) {
728 g_ptr = &floor_ptr->grid_array[y][x];
729 place_grid(player_ptr, g_ptr, GB_INNER);
731 for (x = xval + 3 + tmp; x <= xval + 5 + tmp; x++) {
732 g_ptr = &floor_ptr->grid_array[y][x];
733 place_grid(player_ptr, g_ptr, GB_INNER);
738 /* Occasionally, some Inner rooms */
740 int door_type = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
742 : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
744 /* Long horizontal walls */
745 for (x = xval - 5; x <= xval + 5; x++) {
746 g_ptr = &floor_ptr->grid_array[yval - 1][x];
747 place_grid(player_ptr, g_ptr, GB_INNER);
748 g_ptr = &floor_ptr->grid_array[yval + 1][x];
749 place_grid(player_ptr, g_ptr, GB_INNER);
752 /* Close off the left/right edges */
753 g_ptr = &floor_ptr->grid_array[yval][xval - 5];
754 place_grid(player_ptr, g_ptr, GB_INNER);
755 g_ptr = &floor_ptr->grid_array[yval][xval + 5];
756 place_grid(player_ptr, g_ptr, GB_INNER);
758 /* Secret doors (random top/bottom) */
759 place_secret_door(player_ptr, yval - 3 + (randint1(2) * 2), xval - 3, door_type);
760 place_secret_door(player_ptr, yval - 3 + (randint1(2) * 2), xval + 3, door_type);
763 vault_monsters(player_ptr, yval, xval - 2, randint1(2));
764 vault_monsters(player_ptr, yval, xval + 2, randint1(2));
768 place_object(player_ptr, yval, xval - 2, 0L);
770 place_object(player_ptr, yval, xval + 2, 0L);
778 /* Place a secret door */
779 switch (randint1(4)) {
781 place_secret_door(player_ptr, y1 - 1, xval, DOOR_DEFAULT);
784 place_secret_door(player_ptr, y2 + 1, xval, DOOR_DEFAULT);
787 place_secret_door(player_ptr, yval, x1 - 1, DOOR_DEFAULT);
790 place_secret_door(player_ptr, yval, x2 + 1, DOOR_DEFAULT);
794 /* Maze (really a checkerboard) */
795 for (y = y1; y <= y2; y++) {
796 for (x = x1; x <= x2; x++) {
798 g_ptr = &floor_ptr->grid_array[y][x];
799 place_grid(player_ptr, g_ptr, GB_INNER);
804 /* Monsters just love mazes. */
805 vault_monsters(player_ptr, yval, xval - 5, randint1(3));
806 vault_monsters(player_ptr, yval, xval + 5, randint1(3));
808 /* Traps make them entertaining. */
809 vault_traps(player_ptr, yval, xval - 3, 2, 8, randint1(3));
810 vault_traps(player_ptr, yval, xval + 3, 2, 8, randint1(3));
812 /* Mazes should have some treasure too. */
813 vault_objects(player_ptr, yval, xval, 3);
818 /* Four small rooms. */
820 int door_type = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
822 : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
825 for (y = y1; y <= y2; y++) {
826 g_ptr = &floor_ptr->grid_array[y][xval];
827 place_grid(player_ptr, g_ptr, GB_INNER);
829 for (x = x1; x <= x2; x++) {
830 g_ptr = &floor_ptr->grid_array[yval][x];
831 place_grid(player_ptr, g_ptr, GB_INNER);
834 /* Doors into the rooms */
835 if (randint0(100) < 50) {
836 int i = randint1(10);
837 place_secret_door(player_ptr, y1 - 1, xval - i, door_type);
838 place_secret_door(player_ptr, y1 - 1, xval + i, door_type);
839 place_secret_door(player_ptr, y2 + 1, xval - i, door_type);
840 place_secret_door(player_ptr, y2 + 1, xval + i, door_type);
843 place_secret_door(player_ptr, yval + i, x1 - 1, door_type);
844 place_secret_door(player_ptr, yval - i, x1 - 1, door_type);
845 place_secret_door(player_ptr, yval + i, x2 + 1, door_type);
846 place_secret_door(player_ptr, yval - i, x2 + 1, door_type);
849 /* Treasure, centered at the center of the cross */
850 vault_objects(player_ptr, yval, xval, 2 + randint1(2));
852 /* Gotta have some monsters. */
853 vault_monsters(player_ptr, yval + 1, xval - 4, randint1(4));
854 vault_monsters(player_ptr, yval + 1, xval + 4, randint1(4));
855 vault_monsters(player_ptr, yval - 1, xval - 4, randint1(4));
856 vault_monsters(player_ptr, yval - 1, xval + 4, randint1(4));
866 * @brief タイプ11の部屋…円形部屋の生成 / Type 11 -- Build an vertical oval room.
867 * @param player_ptr プレイヤーへの参照ポインタ
869 * For every grid in the possible square, check the distance.\n
870 * If it's less than the radius, make it a room square.\n
872 * When done fill from the inside to find the walls,\n
874 bool build_type11(player_type *player_ptr, dun_data_type *dd_ptr)
876 POSITION rad, x, y, x0, y0;
879 /* Occasional light */
880 floor_type *floor_ptr = player_ptr->current_floor_ptr;
881 if ((randint1(floor_ptr->dun_level) <= 15) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
886 /* Find and reserve some space in the dungeon. Get center of room. */
887 if (!find_space(player_ptr, dd_ptr, &y0, &x0, rad * 2 + 1, rad * 2 + 1))
890 /* Make circular floor */
891 for (x = x0 - rad; x <= x0 + rad; x++) {
892 for (y = y0 - rad; y <= y0 + rad; y++) {
893 if (distance(y0, x0, y, x) <= rad - 1) {
894 /* inside- so is floor */
895 place_bold(player_ptr, y, x, GB_FLOOR);
896 } else if (distance(y0, x0, y, x) <= rad + 1) {
897 /* make granite outside so on_defeat_arena_monster works */
898 place_bold(player_ptr, y, x, GB_EXTRA);
903 /* Find visible outer walls and set to be FEAT_OUTER */
904 add_outer_wall(player_ptr, x0, y0, light, x0 - rad, y0 - rad, x0 + rad, y0 + rad);
910 * @brief タイプ12の部屋…ドーム型部屋の生成 / Type 12 -- Build crypt room.
911 * @param player_ptr プレイヤーへの参照ポインタ
913 * For every grid in the possible square, check the (fake) distance.\n
914 * If it's less than the radius, make it a room square.\n
916 * When done fill from the inside to find the walls,\n
918 bool build_type12(player_type *player_ptr, dun_data_type *dd_ptr)
920 POSITION rad, x, y, x0, y0;
922 bool emptyflag = true;
924 /* Make a random metric */
925 POSITION h1, h2, h3, h4;
926 h1 = randint1(32) - 16;
929 h4 = randint1(32) - 16;
931 /* Occasional light */
932 floor_type *floor_ptr = player_ptr->current_floor_ptr;
933 if ((randint1(floor_ptr->dun_level) <= 5) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
938 /* Find and reserve some space in the dungeon. Get center of room. */
939 if (!find_space(player_ptr, dd_ptr, &y0, &x0, rad * 2 + 3, rad * 2 + 3))
943 for (x = x0 - rad; x <= x0 + rad; x++) {
944 for (y = y0 - rad; y <= y0 + rad; y++) {
945 /* clear room flag */
946 floor_ptr->grid_array[y][x].info &= ~(CAVE_ROOM);
948 if (dist2(y0, x0, y, x, h1, h2, h3, h4) <= rad - 1) {
949 /* inside - so is floor */
950 place_bold(player_ptr, y, x, GB_FLOOR);
951 } else if (distance(y0, x0, y, x) < 3) {
952 place_bold(player_ptr, y, x, GB_FLOOR);
954 /* make granite outside so on_defeat_arena_monster works */
955 place_bold(player_ptr, y, x, GB_EXTRA);
958 /* proper boundary for on_defeat_arena_monster */
959 if (((y + rad) == y0) || ((y - rad) == y0) || ((x + rad) == x0) || ((x - rad) == x0)) {
960 place_bold(player_ptr, y, x, GB_EXTRA);
965 /* Find visible outer walls and set to be FEAT_OUTER */
966 add_outer_wall(player_ptr, x0, y0, light, x0 - rad - 1, y0 - rad - 1, x0 + rad + 1, y0 + rad + 1);
968 /* Check to see if there is room for an inner vault */
969 for (x = x0 - 2; x <= x0 + 2; x++) {
970 for (y = y0 - 2; y <= y0 + 2; y++) {
971 if (!floor_ptr->grid_array[y][x].is_floor()) {
972 /* Wall in the way */
978 if (emptyflag && one_in_(2)) {
979 /* Build the vault */
980 build_small_room(player_ptr, x0, y0);
982 /* Place a treasure in the vault */
983 place_object(player_ptr, y0, x0, 0L);
985 /* Let's guard the treasure well */
986 vault_monsters(player_ptr, y0, x0, randint0(2) + 3);
988 /* Traps naturally */
989 vault_traps(player_ptr, y0, x0, 4, 4, randint0(3) + 2);