OSDN Git Service

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