OSDN Git Service

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