OSDN Git Service

[Refactor] #40413 Separated display-messages.c/h from util.c/h
[hengband/hengband.git] / src / room / rooms-trap.c
1 #include "dungeon/dungeon.h"
2 #include "floor/floor-generate.h"
3 #include "floor/floor.h"
4 #include "grid/feature.h"
5 #include "grid/grid.h"
6 #include "room/rooms.h"
7 #include "util/util.h"
8 #include "view/display-messages.h"
9
10 /*!
11 * @brief タイプ14の部屋…特殊トラップ部屋の生成 / Type 14 -- trapped rooms
12 * @param player_ptr プレーヤーへの参照ポインタ
13 * @return なし
14 * @details
15 * A special trap is placed at center of the room
16 */
17 bool build_type14(player_type *player_ptr)
18 {
19         POSITION y, x, y2, x2, yval, xval;
20         POSITION y1, x1, xsize, ysize;
21
22         bool light;
23
24         grid_type *g_ptr;
25         s16b trap;
26
27         /* Pick a room size */
28         y1 = randint1(4);
29         x1 = randint1(11);
30         y2 = randint1(3);
31         x2 = randint1(11);
32
33         xsize = x1 + x2 + 1;
34         ysize = y1 + y2 + 1;
35
36         /* Find and reserve some space in the dungeon.  Get center of room. */
37         if (!find_space(player_ptr, &yval, &xval, ysize + 2, xsize + 2)) return FALSE;
38
39         /* Choose lite or dark */
40         floor_type *floor_ptr = player_ptr->current_floor_ptr;
41         light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
42
43
44         /* Get corner values */
45         y1 = yval - ysize / 2;
46         x1 = xval - xsize / 2;
47         y2 = yval + (ysize - 1) / 2;
48         x2 = xval + (xsize - 1) / 2;
49
50
51         /* Place a full floor under the room */
52         for (y = y1 - 1; y <= y2 + 1; y++)
53         {
54                 for (x = x1 - 1; x <= x2 + 1; x++)
55                 {
56                         g_ptr = &floor_ptr->grid_array[y][x];
57                         place_grid(player_ptr, g_ptr, GB_FLOOR);
58                         g_ptr->info |= (CAVE_ROOM);
59                         if (light) g_ptr->info |= (CAVE_GLOW);
60                 }
61         }
62
63         /* Walls around the room */
64         for (y = y1 - 1; y <= y2 + 1; y++)
65         {
66                 g_ptr = &floor_ptr->grid_array[y][x1 - 1];
67                 place_grid(player_ptr, g_ptr, GB_OUTER);
68                 g_ptr = &floor_ptr->grid_array[y][x2 + 1];
69                 place_grid(player_ptr, g_ptr, GB_OUTER);
70         }
71         for (x = x1 - 1; x <= x2 + 1; x++)
72         {
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);
77         }
78
79         if (floor_ptr->dun_level < 30 + randint1(30))
80                 trap = feat_trap_piranha;
81         else
82                 trap = feat_trap_armageddon;
83
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;
87         g_ptr->feat = trap;
88
89         msg_format_wizard(CHEAT_DUNGEON, _("%sの部屋が生成されました。", "Room of %s was generated."), f_name + f_info[trap].name);
90
91         return TRUE;
92 }
93