1 #include "room/rooms-trap.h"
2 #include "dungeon/dungeon-flag-types.h"
3 #include "dungeon/dungeon.h"
4 #include "floor/floor-generator.h"
5 #include "game-option/cheat-types.h"
6 #include "grid/feature.h"
8 #include "room/space-finder.h"
9 #include "system/dungeon-data-definition.h"
10 #include "system/floor-type-definition.h"
11 #include "system/grid-type-definition.h"
12 #include "system/player-type-definition.h"
13 #include "wizard/wizard-messages.h"
16 * @brief タイプ14の部屋…特殊トラップ部屋の生成 / Type 14 -- trapped rooms
17 * @param player_ptr プレイヤーへの参照ポインタ
19 * A special trap is placed at center of the room
21 bool build_type14(PlayerType *player_ptr, dun_data_type *dd_ptr)
23 POSITION y, x, y2, x2, yval, xval;
24 POSITION y1, x1, xsize, ysize;
31 /* Pick a room size */
40 /* Find and reserve some space in the dungeon. Get center of room. */
41 if (!find_space(player_ptr, dd_ptr, &yval, &xval, ysize + 2, xsize + 2))
44 /* Choose lite or dark */
45 auto *floor_ptr = player_ptr->current_floor_ptr;
46 light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
48 /* Get corner values */
49 y1 = yval - ysize / 2;
50 x1 = xval - xsize / 2;
51 y2 = yval + (ysize - 1) / 2;
52 x2 = xval + (xsize - 1) / 2;
54 /* Place a full floor under the room */
55 for (y = y1 - 1; y <= y2 + 1; y++) {
56 for (x = x1 - 1; x <= x2 + 1; x++) {
57 g_ptr = &floor_ptr->grid_array[y][x];
58 place_grid(player_ptr, g_ptr, GB_FLOOR);
59 g_ptr->info |= (CAVE_ROOM);
61 g_ptr->info |= (CAVE_GLOW);
65 /* Walls around the room */
66 for (y = y1 - 1; y <= y2 + 1; y++) {
67 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
68 place_grid(player_ptr, g_ptr, GB_OUTER);
69 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
70 place_grid(player_ptr, g_ptr, GB_OUTER);
72 for (x = x1 - 1; x <= x2 + 1; x++) {
73 g_ptr = &floor_ptr->grid_array[y1 - 1][x];
74 place_grid(player_ptr, g_ptr, GB_OUTER);
75 g_ptr = &floor_ptr->grid_array[y2 + 1][x];
76 place_grid(player_ptr, g_ptr, GB_OUTER);
79 if (floor_ptr->dun_level < 30 + randint1(30))
80 trap = feat_trap_piranha;
82 trap = feat_trap_armageddon;
84 /* Place a special trap */
85 g_ptr = &floor_ptr->grid_array[rand_spread(yval, ysize / 4)][rand_spread(xval, xsize / 4)];
86 g_ptr->mimic = g_ptr->feat;
89 msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("%sの部屋が生成されました。", "Room of %s was generated."), f_info[trap].name.c_str());