OSDN Git Service

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