OSDN Git Service

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