OSDN Git Service

[Refactor] #37353 ソースファイル改名。
[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 \r
6 /*\r
7 * Helper function for "glass room"\r
8 */\r
9 static bool vault_aux_lite(MONRACE_IDX r_idx)\r
10 {\r
11         monster_race *r_ptr = &r_info[r_idx];\r
12 \r
13         /* Validate the monster */\r
14         if (!vault_monster_okay(r_idx)) return FALSE;\r
15 \r
16         /* Require lite attack */\r
17         if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE)) return FALSE;\r
18 \r
19         /* No wall passing monsters */\r
20         if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL)) return FALSE;\r
21 \r
22         /* No disintegrating monsters */\r
23         if (r_ptr->flags4 & RF4_BR_DISI) return FALSE;\r
24 \r
25         return TRUE;\r
26 }\r
27 \r
28 /*\r
29 * Helper function for "glass room"\r
30 */\r
31 static bool vault_aux_shards(MONRACE_IDX r_idx)\r
32 {\r
33         monster_race *r_ptr = &r_info[r_idx];\r
34 \r
35         /* Validate the monster */\r
36         if (!vault_monster_okay(r_idx)) return FALSE;\r
37 \r
38         /* Require shards breath attack */\r
39         if (!(r_ptr->flags4 & RF4_BR_SHAR)) return FALSE;\r
40 \r
41         return TRUE;\r
42 }\r
43 \r
44 /*\r
45 * Hack -- determine if a template is potion\r
46 */\r
47 static bool kind_is_potion(KIND_OBJECT_IDX k_idx)\r
48 {\r
49         return k_info[k_idx].tval == TV_POTION;\r
50 }\r
51 \r
52 /*!\r
53 * @brief \83^\83C\83v15\82Ì\95\94\89®\81c\83K\83\89\83X\95\94\89®\82Ì\90\90¬ / Type 15 -- glass rooms\r
54 * @return \82È\82µ\r
55 */\r
56 bool build_type15(void)\r
57 {\r
58         POSITION y, x, y2, x2, yval, xval;\r
59         POSITION y1, x1, xsize, ysize;\r
60         bool light;\r
61 \r
62         cave_type *c_ptr;\r
63 \r
64         /* Pick a room size */\r
65         xsize = rand_range(9, 13);\r
66         ysize = rand_range(9, 13);\r
67 \r
68         /* Find and reserve some space in the dungeon.  Get center of room. */\r
69         if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;\r
70 \r
71         /* Choose lite or dark */\r
72         light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
73 \r
74         /* Get corner values */\r
75         y1 = yval - ysize / 2;\r
76         x1 = xval - xsize / 2;\r
77         y2 = yval + (ysize - 1) / 2;\r
78         x2 = xval + (xsize - 1) / 2;\r
79 \r
80         /* Place a full floor under the room */\r
81         for (y = y1 - 1; y <= y2 + 1; y++)\r
82         {\r
83                 for (x = x1 - 1; x <= x2 + 1; x++)\r
84                 {\r
85                         c_ptr = &cave[y][x];\r
86                         place_floor_grid(c_ptr);\r
87                         c_ptr->feat = feat_glass_floor;\r
88                         c_ptr->info |= (CAVE_ROOM);\r
89                         if (light) c_ptr->info |= (CAVE_GLOW);\r
90                 }\r
91         }\r
92 \r
93         /* Walls around the room */\r
94         for (y = y1 - 1; y <= y2 + 1; y++)\r
95         {\r
96                 c_ptr = &cave[y][x1 - 1];\r
97                 place_outer_grid(c_ptr);\r
98                 c_ptr->feat = feat_glass_wall;\r
99                 c_ptr = &cave[y][x2 + 1];\r
100                 place_outer_grid(c_ptr);\r
101                 c_ptr->feat = feat_glass_wall;\r
102         }\r
103         for (x = x1 - 1; x <= x2 + 1; x++)\r
104         {\r
105                 c_ptr = &cave[y1 - 1][x];\r
106                 place_outer_grid(c_ptr);\r
107                 c_ptr->feat = feat_glass_wall;\r
108                 c_ptr = &cave[y2 + 1][x];\r
109                 place_outer_grid(c_ptr);\r
110                 c_ptr->feat = feat_glass_wall;\r
111         }\r
112 \r
113         switch (randint1(3))\r
114         {\r
115         case 1: /* 4 lite breathers + potion */\r
116         {\r
117                 int dir1, dir2;\r
118 \r
119                 /* Prepare allocation table */\r
120                 get_mon_num_prep(vault_aux_lite, NULL);\r
121 \r
122                 /* Place fixed lite berathers */\r
123                 for (dir1 = 4; dir1 < 8; dir1++)\r
124                 {\r
125                         MONRACE_IDX r_idx = get_mon_num(dun_level);\r
126 \r
127                         y = yval + 2 * ddy_ddd[dir1];\r
128                         x = xval + 2 * ddx_ddd[dir1];\r
129                         if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);\r
130 \r
131                         /* Walls around the breather */\r
132                         for (dir2 = 0; dir2 < 8; dir2++)\r
133                         {\r
134                                 c_ptr = &cave[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];\r
135                                 place_inner_grid(c_ptr);\r
136                                 c_ptr->feat = feat_glass_wall;\r
137                         }\r
138                 }\r
139 \r
140                 /* Walls around the potion */\r
141                 for (dir1 = 0; dir1 < 4; dir1++)\r
142                 {\r
143                         y = yval + 2 * ddy_ddd[dir1];\r
144                         x = xval + 2 * ddx_ddd[dir1];\r
145                         c_ptr = &cave[y][x];\r
146                         place_inner_perm_grid(c_ptr);\r
147                         c_ptr->feat = feat_permanent_glass_wall;\r
148                         cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);\r
149                 }\r
150 \r
151                 /* Glass door */\r
152                 dir1 = randint0(4);\r
153                 y = yval + 2 * ddy_ddd[dir1];\r
154                 x = xval + 2 * ddx_ddd[dir1];\r
155                 place_secret_door(y, x, DOOR_GLASS_DOOR);\r
156                 c_ptr = &cave[y][x];\r
157                 if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;\r
158 \r
159                 /* Place a potion */\r
160                 get_obj_num_hook = kind_is_potion;\r
161                 place_object(yval, xval, AM_NO_FIXED_ART);\r
162                 cave[yval][xval].info |= (CAVE_ICKY);\r
163         }\r
164         break;\r
165 \r
166         case 2: /* 1 lite breather + random object */\r
167         {\r
168                 MONRACE_IDX r_idx;\r
169                 DIRECTION dir1;\r
170 \r
171                 /* Pillars */\r
172                 c_ptr = &cave[y1 + 1][x1 + 1];\r
173                 place_inner_grid(c_ptr);\r
174                 c_ptr->feat = feat_glass_wall;\r
175 \r
176                 c_ptr = &cave[y1 + 1][x2 - 1];\r
177                 place_inner_grid(c_ptr);\r
178                 c_ptr->feat = feat_glass_wall;\r
179 \r
180                 c_ptr = &cave[y2 - 1][x1 + 1];\r
181                 place_inner_grid(c_ptr);\r
182                 c_ptr->feat = feat_glass_wall;\r
183 \r
184                 c_ptr = &cave[y2 - 1][x2 - 1];\r
185                 place_inner_grid(c_ptr);\r
186                 c_ptr->feat = feat_glass_wall;\r
187 \r
188                 /* Prepare allocation table */\r
189                 get_mon_num_prep(vault_aux_lite, NULL);\r
190 \r
191                 r_idx = get_mon_num(dun_level);\r
192                 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);\r
193 \r
194                 /* Walls around the breather */\r
195                 for (dir1 = 0; dir1 < 8; dir1++)\r
196                 {\r
197                         c_ptr = &cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];\r
198                         place_inner_grid(c_ptr);\r
199                         c_ptr->feat = feat_glass_wall;\r
200                 }\r
201 \r
202                 /* Curtains around the breather */\r
203                 for (y = yval - 1; y <= yval + 1; y++)\r
204                 {\r
205                         place_closed_door(y, xval - 2, DOOR_CURTAIN);\r
206                         place_closed_door(y, xval + 2, DOOR_CURTAIN);\r
207                 }\r
208                 for (x = xval - 1; x <= xval + 1; x++)\r
209                 {\r
210                         place_closed_door(yval - 2, x, DOOR_CURTAIN);\r
211                         place_closed_door(yval + 2, x, DOOR_CURTAIN);\r
212                 }\r
213 \r
214                 /* Place an object */\r
215                 place_object(yval, xval, AM_NO_FIXED_ART);\r
216                 cave[yval][xval].info |= (CAVE_ICKY);\r
217         }\r
218         break;\r
219 \r
220         case 3: /* 4 shards breathers + 2 potions */\r
221         {\r
222                 int dir1;\r
223 \r
224                 /* Walls around the potion */\r
225                 for (y = yval - 2; y <= yval + 2; y++)\r
226                 {\r
227                         c_ptr = &cave[y][xval - 3];\r
228                         place_inner_grid(c_ptr);\r
229                         c_ptr->feat = feat_glass_wall;\r
230                         c_ptr = &cave[y][xval + 3];\r
231                         place_inner_grid(c_ptr);\r
232                         c_ptr->feat = feat_glass_wall;\r
233                 }\r
234                 for (x = xval - 2; x <= xval + 2; x++)\r
235                 {\r
236                         c_ptr = &cave[yval - 3][x];\r
237                         place_inner_grid(c_ptr);\r
238                         c_ptr->feat = feat_glass_wall;\r
239                         c_ptr = &cave[yval + 3][x];\r
240                         place_inner_grid(c_ptr);\r
241                         c_ptr->feat = feat_glass_wall;\r
242                 }\r
243                 for (dir1 = 4; dir1 < 8; dir1++)\r
244                 {\r
245                         c_ptr = &cave[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];\r
246                         place_inner_grid(c_ptr);\r
247                         c_ptr->feat = feat_glass_wall;\r
248                 }\r
249 \r
250                 /* Prepare allocation table */\r
251                 get_mon_num_prep(vault_aux_shards, NULL);\r
252 \r
253                 /* Place shard berathers */\r
254                 for (dir1 = 4; dir1 < 8; dir1++)\r
255                 {\r
256                         MONRACE_IDX r_idx = get_mon_num(dun_level);\r
257 \r
258                         y = yval + ddy_ddd[dir1];\r
259                         x = xval + ddx_ddd[dir1];\r
260                         if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);\r
261                 }\r
262 \r
263                 /* Place two potions */\r
264                 if (one_in_(2))\r
265                 {\r
266                         get_obj_num_hook = kind_is_potion;\r
267                         place_object(yval, xval - 1, AM_NO_FIXED_ART);\r
268                         get_obj_num_hook = kind_is_potion;\r
269                         place_object(yval, xval + 1, AM_NO_FIXED_ART);\r
270                 }\r
271                 else\r
272                 {\r
273                         get_obj_num_hook = kind_is_potion;\r
274                         place_object(yval - 1, xval, AM_NO_FIXED_ART);\r
275                         get_obj_num_hook = kind_is_potion;\r
276                         place_object(yval + 1, xval, AM_NO_FIXED_ART);\r
277                 }\r
278 \r
279                 for (y = yval - 2; y <= yval + 2; y++)\r
280                         for (x = xval - 2; x <= xval + 2; x++)\r
281                                 cave[y][x].info |= (CAVE_ICKY);\r
282 \r
283         }\r
284         break;\r
285         }\r
286 \r
287         msg_print_wizard(CHEAT_DUNGEON, _("\83K\83\89\83X\82Ì\95\94\89®\82ª\90\90¬\82³\82ê\82Ü\82µ\82½\81B", "Glass room was generated."));\r
288 \r
289         return TRUE;\r
290 }\r