OSDN Git Service

[Refactor] #37353 generate.h を floor-generate.hへ統合。
[hengband/hengband.git] / src / rooms-special.c
1 #include "angband.h"
2 #include "grid.h"
3 #include "floor-generate.h"
4 #include "rooms.h"
5 #include "monster.h"
6 #include "monsterrace-hook.h"
7 #include "objectkind-hook.h"
8 #include "feature.h"
9 #include "floor.h"
10
11
12 /*!
13 * @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms
14 * @return なし
15 */
16 bool build_type15(void)
17 {
18         POSITION y, x, y2, x2, yval, xval;
19         POSITION y1, x1, xsize, ysize;
20         bool light;
21
22         grid_type *g_ptr;
23
24         /* Pick a room size */
25         xsize = rand_range(9, 13);
26         ysize = rand_range(9, 13);
27
28         /* Find and reserve some space in the dungeon.  Get center of room. */
29         if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;
30
31         /* Choose lite or dark */
32         light = ((current_floor_ptr->dun_level <= randint1(25)) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
33
34         /* Get corner values */
35         y1 = yval - ysize / 2;
36         x1 = xval - xsize / 2;
37         y2 = yval + (ysize - 1) / 2;
38         x2 = xval + (xsize - 1) / 2;
39
40         /* Place a full floor under the room */
41         for (y = y1 - 1; y <= y2 + 1; y++)
42         {
43                 for (x = x1 - 1; x <= x2 + 1; x++)
44                 {
45                         g_ptr = &current_floor_ptr->grid_array[y][x];
46                         place_floor_grid(g_ptr);
47                         g_ptr->feat = feat_glass_floor;
48                         g_ptr->info |= (CAVE_ROOM);
49                         if (light) g_ptr->info |= (CAVE_GLOW);
50                 }
51         }
52
53         /* Walls around the room */
54         for (y = y1 - 1; y <= y2 + 1; y++)
55         {
56                 g_ptr = &current_floor_ptr->grid_array[y][x1 - 1];
57                 place_outer_grid(g_ptr);
58                 g_ptr->feat = feat_glass_wall;
59                 g_ptr = &current_floor_ptr->grid_array[y][x2 + 1];
60                 place_outer_grid(g_ptr);
61                 g_ptr->feat = feat_glass_wall;
62         }
63         for (x = x1 - 1; x <= x2 + 1; x++)
64         {
65                 g_ptr = &current_floor_ptr->grid_array[y1 - 1][x];
66                 place_outer_grid(g_ptr);
67                 g_ptr->feat = feat_glass_wall;
68                 g_ptr = &current_floor_ptr->grid_array[y2 + 1][x];
69                 place_outer_grid(g_ptr);
70                 g_ptr->feat = feat_glass_wall;
71         }
72
73         switch (randint1(3))
74         {
75         case 1: /* 4 lite breathers + potion */
76         {
77                 DIRECTION dir1, dir2;
78                 get_mon_num_prep(vault_aux_lite, NULL);
79
80                 /* Place fixed lite berathers */
81                 for (dir1 = 4; dir1 < 8; dir1++)
82                 {
83                         MONRACE_IDX r_idx = get_mon_num(current_floor_ptr->dun_level);
84
85                         y = yval + 2 * ddy_ddd[dir1];
86                         x = xval + 2 * ddx_ddd[dir1];
87                         if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);
88
89                         /* Walls around the breather */
90                         for (dir2 = 0; dir2 < 8; dir2++)
91                         {
92                                 g_ptr = &current_floor_ptr->grid_array[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];
93                                 place_inner_grid(g_ptr);
94                                 g_ptr->feat = feat_glass_wall;
95                         }
96                 }
97
98                 /* Walls around the potion */
99                 for (dir1 = 0; dir1 < 4; dir1++)
100                 {
101                         y = yval + 2 * ddy_ddd[dir1];
102                         x = xval + 2 * ddx_ddd[dir1];
103                         g_ptr = &current_floor_ptr->grid_array[y][x];
104                         place_inner_perm_grid(g_ptr);
105                         g_ptr->feat = feat_permanent_glass_wall;
106                         current_floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);
107                 }
108
109                 /* Glass door */
110                 dir1 = randint0(4);
111                 y = yval + 2 * ddy_ddd[dir1];
112                 x = xval + 2 * ddx_ddd[dir1];
113                 place_secret_door(y, x, DOOR_GLASS_DOOR);
114                 g_ptr = &current_floor_ptr->grid_array[y][x];
115                 if (is_closed_door(g_ptr->feat)) g_ptr->mimic = feat_glass_wall;
116
117                 /* Place a potion */
118                 get_obj_num_hook = kind_is_potion;
119                 place_object(yval, xval, AM_NO_FIXED_ART);
120                 current_floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
121         }
122         break;
123
124         case 2: /* 1 lite breather + random object */
125         {
126                 MONRACE_IDX r_idx;
127                 DIRECTION dir1;
128
129                 /* Pillars */
130                 g_ptr = &current_floor_ptr->grid_array[y1 + 1][x1 + 1];
131                 place_inner_grid(g_ptr);
132                 g_ptr->feat = feat_glass_wall;
133
134                 g_ptr = &current_floor_ptr->grid_array[y1 + 1][x2 - 1];
135                 place_inner_grid(g_ptr);
136                 g_ptr->feat = feat_glass_wall;
137
138                 g_ptr = &current_floor_ptr->grid_array[y2 - 1][x1 + 1];
139                 place_inner_grid(g_ptr);
140                 g_ptr->feat = feat_glass_wall;
141
142                 g_ptr = &current_floor_ptr->grid_array[y2 - 1][x2 - 1];
143                 place_inner_grid(g_ptr);
144                 g_ptr->feat = feat_glass_wall;
145                 get_mon_num_prep(vault_aux_lite, NULL);
146
147                 r_idx = get_mon_num(current_floor_ptr->dun_level);
148                 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);
149
150                 /* Walls around the breather */
151                 for (dir1 = 0; dir1 < 8; dir1++)
152                 {
153                         g_ptr = &current_floor_ptr->grid_array[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];
154                         place_inner_grid(g_ptr);
155                         g_ptr->feat = feat_glass_wall;
156                 }
157
158                 /* Curtains around the breather */
159                 for (y = yval - 1; y <= yval + 1; y++)
160                 {
161                         place_closed_door(y, xval - 2, DOOR_CURTAIN);
162                         place_closed_door(y, xval + 2, DOOR_CURTAIN);
163                 }
164                 for (x = xval - 1; x <= xval + 1; x++)
165                 {
166                         place_closed_door(yval - 2, x, DOOR_CURTAIN);
167                         place_closed_door(yval + 2, x, DOOR_CURTAIN);
168                 }
169
170                 /* Place an object */
171                 place_object(yval, xval, AM_NO_FIXED_ART);
172                 current_floor_ptr->grid_array[yval][xval].info |= (CAVE_ICKY);
173         }
174         break;
175
176         case 3: /* 4 shards breathers + 2 potions */
177         {
178                 DIRECTION dir1;
179
180                 /* Walls around the potion */
181                 for (y = yval - 2; y <= yval + 2; y++)
182                 {
183                         g_ptr = &current_floor_ptr->grid_array[y][xval - 3];
184                         place_inner_grid(g_ptr);
185                         g_ptr->feat = feat_glass_wall;
186                         g_ptr = &current_floor_ptr->grid_array[y][xval + 3];
187                         place_inner_grid(g_ptr);
188                         g_ptr->feat = feat_glass_wall;
189                 }
190                 for (x = xval - 2; x <= xval + 2; x++)
191                 {
192                         g_ptr = &current_floor_ptr->grid_array[yval - 3][x];
193                         place_inner_grid(g_ptr);
194                         g_ptr->feat = feat_glass_wall;
195                         g_ptr = &current_floor_ptr->grid_array[yval + 3][x];
196                         place_inner_grid(g_ptr);
197                         g_ptr->feat = feat_glass_wall;
198                 }
199                 for (dir1 = 4; dir1 < 8; dir1++)
200                 {
201                         g_ptr = &current_floor_ptr->grid_array[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];
202                         place_inner_grid(g_ptr);
203                         g_ptr->feat = feat_glass_wall;
204                 }
205                 get_mon_num_prep(vault_aux_shards, NULL);
206
207                 /* Place shard berathers */
208                 for (dir1 = 4; dir1 < 8; dir1++)
209                 {
210                         MONRACE_IDX r_idx = get_mon_num(current_floor_ptr->dun_level);
211
212                         y = yval + ddy_ddd[dir1];
213                         x = xval + ddx_ddd[dir1];
214                         if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);
215                 }
216
217                 /* Place two potions */
218                 if (one_in_(2))
219                 {
220                         get_obj_num_hook = kind_is_potion;
221                         place_object(yval, xval - 1, AM_NO_FIXED_ART);
222                         get_obj_num_hook = kind_is_potion;
223                         place_object(yval, xval + 1, AM_NO_FIXED_ART);
224                 }
225                 else
226                 {
227                         get_obj_num_hook = kind_is_potion;
228                         place_object(yval - 1, xval, AM_NO_FIXED_ART);
229                         get_obj_num_hook = kind_is_potion;
230                         place_object(yval + 1, xval, AM_NO_FIXED_ART);
231                 }
232
233                 for (y = yval - 2; y <= yval + 2; y++)
234                         for (x = xval - 2; x <= xval + 2; x++)
235                                 current_floor_ptr->grid_array[y][x].info |= (CAVE_ICKY);
236
237         }
238         break;
239         }
240
241         msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));
242
243         return TRUE;
244 }