OSDN Git Service

[Refactor] #37353 cmd1~melee1間整理。 / Refactor between cmd1 and melee1.
[hengband/hengband.git] / src / rooms-pitnest.c
1 #include "angband.h"\r
2 #include "grid.h"\r
3 #include "generate.h"\r
4 #include "rooms.h"\r
5 #include "rooms-pitnest.h"\r
6 \r
7 \r
8 \r
9 #define NUM_NEST_MON_TYPE 64 /*!<nest\82Ì\8eí\95Ê\90\94 */\r
10 \r
11 /*! pit/nest\8c^\8fî\95ñ\82Ìtypedef */\r
12 typedef struct vault_aux_type vault_aux_type;\r
13 \r
14 /*! pit/nest\8c^\8fî\95ñ\82Ì\8d\\91¢\91Ì\92è\8b` */\r
15 struct vault_aux_type\r
16 {\r
17         cptr name;\r
18         bool(*hook_func)(MONRACE_IDX r_idx);\r
19         void(*prep_func)(void);\r
20         int level;\r
21         int chance;\r
22 };\r
23 \r
24 /*! nest\82ÌID\92è\8b` /  Nest types code */\r
25 #define NEST_TYPE_CLONE        0\r
26 #define NEST_TYPE_JELLY        1\r
27 #define NEST_TYPE_SYMBOL_GOOD  2\r
28 #define NEST_TYPE_SYMBOL_EVIL  3\r
29 #define NEST_TYPE_MIMIC        4\r
30 #define NEST_TYPE_LOVECRAFTIAN 5\r
31 #define NEST_TYPE_KENNEL       6\r
32 #define NEST_TYPE_ANIMAL       7\r
33 #define NEST_TYPE_CHAPEL       8\r
34 #define NEST_TYPE_UNDEAD       9\r
35 \r
36 /*! pit\82ÌID\92è\8b` / Pit types code */\r
37 #define PIT_TYPE_ORC           0\r
38 #define PIT_TYPE_TROLL         1\r
39 #define PIT_TYPE_GIANT         2\r
40 #define PIT_TYPE_LOVECRAFTIAN  3\r
41 #define PIT_TYPE_SYMBOL_GOOD   4\r
42 #define PIT_TYPE_SYMBOL_EVIL   5\r
43 #define PIT_TYPE_CHAPEL        6\r
44 #define PIT_TYPE_DRAGON        7\r
45 #define PIT_TYPE_DEMON         8\r
46 #define PIT_TYPE_DARK_ELF      9\r
47 \r
48 \r
49 \r
50 \r
51 \r
52 \r
53 /*! \92Ê\8fípit\90\90¬\8e\9e\82Ì\83\82\83\93\83X\83^\81[\82Ì\8d\\90¬\8fð\8c\8fID / Race index for "monster pit (clone)" */\r
54 static int vault_aux_race;\r
55 \r
56 /*! \92P\88ê\83V\83\93\83{\83\8bpit\90\90¬\8e\9e\82Ì\8ew\92è\83V\83\93\83{\83\8b / Race index for "monster pit (symbol clone)" */\r
57 static char vault_aux_char;\r
58 \r
59 /*! \83u\83\8c\83X\91®\90«\82É\8aî\82Ã\82­\83h\83\89\83S\83\93pit\90\90¬\8e\9e\8fð\8c\8f\83}\83X\83N / Breath mask for "monster pit (dragon)" */\r
60 static u32b vault_aux_dragon_mask4;\r
61 \r
62 \r
63 /*!\r
64 * @brief \83\82\83\93\83X\83^\81[\82ªVault\90\90¬\82Ì\8dÅ\92á\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
65 * Helper monster selection function\r
66 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
67 * @return Vault\90\90¬\82Ì\8dÅ\92á\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
68 */\r
69 static bool vault_aux_simple(MONRACE_IDX r_idx)\r
70 {\r
71         /* Okay */\r
72         return (vault_monster_okay(r_idx));\r
73 }\r
74 \r
75 \r
76 /*!\r
77 * @brief \83\82\83\93\83X\83^\81[\82ª\83[\83\8a\81[nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
78 * Helper function for "monster nest (jelly)"\r
79 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
80 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
81 */\r
82 static bool vault_aux_jelly(MONRACE_IDX r_idx)\r
83 {\r
84         monster_race *r_ptr = &r_info[r_idx];\r
85 \r
86         /* Validate the monster */\r
87         if (!vault_monster_okay(r_idx)) return (FALSE);\r
88 \r
89         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);\r
90 \r
91         /* Also decline evil jellies (like death molds and shoggoths) */\r
92         if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);\r
93 \r
94         /* Require icky thing, jelly, mold, or mushroom */\r
95         if (!my_strchr("ijm,", r_ptr->d_char)) return (FALSE);\r
96 \r
97         /* Okay */\r
98         return (TRUE);\r
99 }\r
100 \r
101 /*!\r
102 * @brief \83\82\83\93\83X\83^\81[\82ª\93®\95¨nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
103 * Helper function for "monster nest (animal)"\r
104 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
105 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
106 */\r
107 static bool vault_aux_animal(MONRACE_IDX r_idx)\r
108 {\r
109         monster_race *r_ptr = &r_info[r_idx];\r
110 \r
111         /* Validate the monster */\r
112         if (!vault_monster_okay(r_idx)) return (FALSE);\r
113 \r
114         /* Require "animal" flag */\r
115         if (!(r_ptr->flags3 & (RF3_ANIMAL))) return (FALSE);\r
116 \r
117         /* Okay */\r
118         return (TRUE);\r
119 }\r
120 \r
121 \r
122 /*!\r
123 * @brief \83\82\83\93\83X\83^\81[\82ª\83A\83\93\83f\83b\83hnest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
124 * Helper function for "monster nest (undead)"\r
125 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
126 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
127 */\r
128 static bool vault_aux_undead(MONRACE_IDX r_idx)\r
129 {\r
130         monster_race *r_ptr = &r_info[r_idx];\r
131 \r
132         /* Validate the monster */\r
133         if (!vault_monster_okay(r_idx)) return (FALSE);\r
134 \r
135         /* Require Undead */\r
136         if (!(r_ptr->flags3 & (RF3_UNDEAD))) return (FALSE);\r
137 \r
138         /* Okay */\r
139         return (TRUE);\r
140 }\r
141 \r
142 /*!\r
143 * @brief \83\82\83\93\83X\83^\81[\82ª\90¹\93°nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
144 * Helper function for "monster nest (chapel)"\r
145 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
146 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
147 */\r
148 static bool vault_aux_chapel_g(MONRACE_IDX r_idx)\r
149 {\r
150         static int chapel_list[] = {\r
151                 MON_NOV_PRIEST, MON_NOV_PALADIN, MON_NOV_PRIEST_G, MON_NOV_PALADIN_G,\r
152                 MON_PRIEST, MON_JADE_MONK, MON_IVORY_MONK, MON_ULTRA_PALADIN,\r
153                 MON_EBONY_MONK, MON_W_KNIGHT, MON_KNI_TEMPLAR, MON_PALADIN,\r
154                 MON_TOPAZ_MONK, 0 };\r
155 \r
156         int i;\r
157 \r
158         monster_race *r_ptr = &r_info[r_idx];\r
159 \r
160         /* Validate the monster */\r
161         if (!vault_monster_okay(r_idx)) return (FALSE);\r
162 \r
163         if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);\r
164         if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER)) return (FALSE);\r
165 \r
166         /* Require "priest" or Angel */\r
167 \r
168         if (r_ptr->d_char == 'A') return TRUE;\r
169 \r
170         for (i = 0; chapel_list[i]; i++)\r
171                 if (r_idx == chapel_list[i]) return TRUE;\r
172 \r
173         return FALSE;\r
174 }\r
175 \r
176 /*!\r
177 * @brief \83\82\83\93\83X\83^\81[\82ª\8c¢\8f¬\89®nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
178 * Helper function for "monster nest (kennel)"\r
179 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
180 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
181 */\r
182 static bool vault_aux_kennel(MONRACE_IDX r_idx)\r
183 {\r
184         monster_race *r_ptr = &r_info[r_idx];\r
185 \r
186         /* Validate the monster */\r
187         if (!vault_monster_okay(r_idx)) return (FALSE);\r
188 \r
189         /* Require a Zephyr Hound or a dog */\r
190         if (!my_strchr("CZ", r_ptr->d_char)) return (FALSE);\r
191 \r
192         /* Okay */\r
193         return (TRUE);\r
194 }\r
195 \r
196 /*!\r
197 * @brief \83\82\83\93\83X\83^\81[\82ª\83~\83~\83b\83Nnest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
198 * Helper function for "monster nest (mimic)"\r
199 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
200 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
201 */\r
202 static bool vault_aux_mimic(MONRACE_IDX r_idx)\r
203 {\r
204         monster_race *r_ptr = &r_info[r_idx];\r
205 \r
206         /* Validate the monster */\r
207         if (!vault_monster_okay(r_idx)) return (FALSE);\r
208 \r
209         /* Require mimic */\r
210         if (!my_strchr("!$&(/=?[\\|", r_ptr->d_char)) return (FALSE);\r
211 \r
212         /* Okay */\r
213         return (TRUE);\r
214 }\r
215 \r
216 /*!\r
217 * @brief \83\82\83\93\83X\83^\81[\82ª\92P\88ê\83N\83\8d\81[\83\93nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
218 * Helper function for "monster nest (clone)"\r
219 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
220 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
221 */\r
222 static bool vault_aux_clone(MONRACE_IDX r_idx)\r
223 {\r
224         /* Validate the monster */\r
225         if (!vault_monster_okay(r_idx)) return (FALSE);\r
226 \r
227         return (r_idx == vault_aux_race);\r
228 }\r
229 \r
230 \r
231 /*!\r
232 * @brief \83\82\83\93\83X\83^\81[\82ª\8e×\88«\91®\90«\83V\83\93\83{\83\8b\83N\83\8d\81[\83\93nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
233 * Helper function for "monster nest (symbol clone)"\r
234 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
235 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
236 */\r
237 static bool vault_aux_symbol_e(MONRACE_IDX r_idx)\r
238 {\r
239         monster_race *r_ptr = &r_info[r_idx];\r
240 \r
241         /* Validate the monster */\r
242         if (!vault_monster_okay(r_idx)) return (FALSE);\r
243 \r
244         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);\r
245 \r
246         if (r_ptr->flags3 & (RF3_GOOD)) return (FALSE);\r
247 \r
248         /* Decline incorrect symbol */\r
249         if (r_ptr->d_char != vault_aux_char) return (FALSE);\r
250 \r
251         /* Okay */\r
252         return (TRUE);\r
253 }\r
254 \r
255 \r
256 /*!\r
257 * @brief \83\82\83\93\83X\83^\81[\82ª\91P\97Ç\91®\90«\83V\83\93\83{\83\8b\83N\83\8d\81[\83\93nest\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
258 * Helper function for "monster nest (symbol clone)"\r
259 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
260 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
261 */\r
262 static bool vault_aux_symbol_g(MONRACE_IDX r_idx)\r
263 {\r
264         monster_race *r_ptr = &r_info[r_idx];\r
265 \r
266         /* Validate the monster */\r
267         if (!vault_monster_okay(r_idx)) return (FALSE);\r
268 \r
269         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);\r
270 \r
271         if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);\r
272 \r
273         /* Decline incorrect symbol */\r
274         if (r_ptr->d_char != vault_aux_char) return (FALSE);\r
275 \r
276         /* Okay */\r
277         return (TRUE);\r
278 }\r
279 \r
280 \r
281 /*!\r
282 * @brief \83\82\83\93\83X\83^\81[\82ª\83I\81[\83Npit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
283 * Helper function for "monster pit (orc)"\r
284 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
285 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
286 */\r
287 static bool vault_aux_orc(MONRACE_IDX r_idx)\r
288 {\r
289         monster_race *r_ptr = &r_info[r_idx];\r
290 \r
291         /* Validate the monster */\r
292         if (!vault_monster_okay(r_idx)) return (FALSE);\r
293 \r
294         /* Require orc */\r
295         if (!(r_ptr->flags3 & RF3_ORC)) return (FALSE);\r
296 \r
297         /* Decline undead */\r
298         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);\r
299 \r
300         /* Okay */\r
301         return (TRUE);\r
302 }\r
303 \r
304 \r
305 /*!\r
306 * @brief \83\82\83\93\83X\83^\81[\82ª\83g\83\8d\83\8bpit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
307 * Helper function for "monster pit (troll)"\r
308 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
309 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
310 */\r
311 static bool vault_aux_troll(MONRACE_IDX r_idx)\r
312 {\r
313         monster_race *r_ptr = &r_info[r_idx];\r
314 \r
315         /* Validate the monster */\r
316         if (!vault_monster_okay(r_idx)) return (FALSE);\r
317 \r
318         /* Require troll */\r
319         if (!(r_ptr->flags3 & RF3_TROLL)) return (FALSE);\r
320 \r
321         /* Decline undead */\r
322         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);\r
323 \r
324         /* Okay */\r
325         return (TRUE);\r
326 }\r
327 \r
328 \r
329 /*!\r
330 * @brief \83\82\83\93\83X\83^\81[\82ª\8b\90\90lpit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
331 * Helper function for "monster pit (giant)"\r
332 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
333 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
334 */\r
335 static bool vault_aux_giant(MONRACE_IDX r_idx)\r
336 {\r
337         monster_race *r_ptr = &r_info[r_idx];\r
338 \r
339         /* Validate the monster */\r
340         if (!vault_monster_okay(r_idx)) return (FALSE);\r
341 \r
342         /* Require giant */\r
343         if (!(r_ptr->flags3 & RF3_GIANT)) return (FALSE);\r
344 \r
345         if (r_ptr->flags3 & RF3_GOOD) return (FALSE);\r
346 \r
347         /* Decline undead */\r
348         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);\r
349 \r
350         /* Okay */\r
351         return (TRUE);\r
352 }\r
353 \r
354 \r
355 /*!\r
356 * @brief \83\82\83\93\83X\83^\81[\82ª\83h\83\89\83S\83\93pit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
357 * Helper function for "monster pit (dragon)"\r
358 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
359 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
360 */\r
361 static bool vault_aux_dragon(MONRACE_IDX r_idx)\r
362 {\r
363         monster_race *r_ptr = &r_info[r_idx];\r
364 \r
365         /* Validate the monster */\r
366         if (!vault_monster_okay(r_idx)) return (FALSE);\r
367 \r
368         /* Require dragon */\r
369         if (!(r_ptr->flags3 & RF3_DRAGON)) return (FALSE);\r
370 \r
371         /* Hack -- Require correct "breath attack" */\r
372         if (r_ptr->flags4 != vault_aux_dragon_mask4) return (FALSE);\r
373 \r
374         /* Decline undead */\r
375         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);\r
376 \r
377         /* Okay */\r
378         return (TRUE);\r
379 }\r
380 \r
381 \r
382 /*!\r
383 * @brief \83\82\83\93\83X\83^\81[\82ª\88«\96\82pit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
384 * Helper function for "monster pit (demon)"\r
385 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
386 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
387 */\r
388 static bool vault_aux_demon(MONRACE_IDX r_idx)\r
389 {\r
390         monster_race *r_ptr = &r_info[r_idx];\r
391 \r
392         /* Validate the monster */\r
393         if (!vault_monster_okay(r_idx)) return (FALSE);\r
394 \r
395         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);\r
396 \r
397         /* Require demon */\r
398         if (!(r_ptr->flags3 & RF3_DEMON)) return (FALSE);\r
399 \r
400         /* Okay */\r
401         return (TRUE);\r
402 }\r
403 \r
404 \r
405 /*!\r
406 * @brief \83\82\83\93\83X\83^\81[\82ª\8b\8bCpit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
407 * Helper function for "monster pit (lovecraftian)"\r
408 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
409 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
410 */\r
411 static bool vault_aux_cthulhu(MONRACE_IDX r_idx)\r
412 {\r
413         monster_race *r_ptr = &r_info[r_idx];\r
414 \r
415         /* Validate the monster */\r
416         if (!vault_monster_okay(r_idx)) return (FALSE);\r
417 \r
418         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);\r
419 \r
420         /* Require eldritch horror */\r
421         if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);\r
422 \r
423         /* Okay */\r
424         return (TRUE);\r
425 }\r
426 \r
427 \r
428 /*!\r
429 * @brief pit/nest\82Ì\8aî\8f\80\82Æ\82È\82é\92P\8eí\83\82\83\93\83X\83^\81[\82ð\8c\88\82ß\82é /\r
430 * @return \82È\82µ\r
431 */\r
432 static void vault_prep_clone(void)\r
433 {\r
434         /* Apply the monster restriction */\r
435         get_mon_num_prep(vault_aux_simple, NULL);\r
436 \r
437         /* Pick a race to clone */\r
438         vault_aux_race = get_mon_num(dun_level + 10);\r
439 \r
440         /* Remove the monster restriction */\r
441         get_mon_num_prep(NULL, NULL);\r
442 }\r
443 \r
444 \r
445 /*!\r
446 * @brief pit/nest\82Ì\8aî\8f\80\82Æ\82È\82é\83\82\83\93\83X\83^\81[\83V\83\93\83{\83\8b\82ð\8c\88\82ß\82é /\r
447 * @return \82È\82µ\r
448 */\r
449 static void vault_prep_symbol(void)\r
450 {\r
451         MONRACE_IDX r_idx;\r
452 \r
453         /* Apply the monster restriction */\r
454         get_mon_num_prep(vault_aux_simple, NULL);\r
455 \r
456         /* Pick a race to clone */\r
457         r_idx = get_mon_num(dun_level + 10);\r
458 \r
459         /* Remove the monster restriction */\r
460         get_mon_num_prep(NULL, NULL);\r
461 \r
462         /* Extract the symbol */\r
463         vault_aux_char = r_info[r_idx].d_char;\r
464 }\r
465 \r
466 /*!\r
467 * @brief pit/nest\82Ì\8aî\8f\80\82Æ\82È\82é\83h\83\89\83S\83\93\82Ì\8eí\97Þ\82ð\8c\88\82ß\82é /\r
468 * @return \82È\82µ\r
469 */\r
470 static void vault_prep_dragon(void)\r
471 {\r
472         /* Pick dragon type */\r
473         switch (randint0(6))\r
474         {\r
475                 /* Black */\r
476         case 0:\r
477         {\r
478                 /* Restrict dragon breath type */\r
479                 vault_aux_dragon_mask4 = RF4_BR_ACID;\r
480 \r
481                 /* Done */\r
482                 break;\r
483         }\r
484 \r
485         /* Blue */\r
486         case 1:\r
487         {\r
488                 /* Restrict dragon breath type */\r
489                 vault_aux_dragon_mask4 = RF4_BR_ELEC;\r
490 \r
491                 /* Done */\r
492                 break;\r
493         }\r
494 \r
495         /* Red */\r
496         case 2:\r
497         {\r
498                 /* Restrict dragon breath type */\r
499                 vault_aux_dragon_mask4 = RF4_BR_FIRE;\r
500 \r
501                 /* Done */\r
502                 break;\r
503         }\r
504 \r
505         /* White */\r
506         case 3:\r
507         {\r
508                 /* Restrict dragon breath type */\r
509                 vault_aux_dragon_mask4 = RF4_BR_COLD;\r
510 \r
511                 /* Done */\r
512                 break;\r
513         }\r
514 \r
515         /* Green */\r
516         case 4:\r
517         {\r
518                 /* Restrict dragon breath type */\r
519                 vault_aux_dragon_mask4 = RF4_BR_POIS;\r
520 \r
521                 /* Done */\r
522                 break;\r
523         }\r
524 \r
525         /* Multi-hued */\r
526         default:\r
527         {\r
528                 /* Restrict dragon breath type */\r
529                 vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC |\r
530                         RF4_BR_FIRE | RF4_BR_COLD |\r
531                         RF4_BR_POIS);\r
532 \r
533                 /* Done */\r
534                 break;\r
535         }\r
536         }\r
537 }\r
538 \r
539 \r
540 /*!\r
541 * @brief \83\82\83\93\83X\83^\81[\82ª\83_\81[\83N\83G\83\8b\83tpit\82Ì\90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82ð\95Ô\82· /\r
542 * Helper function for "monster pit (dark elf)"\r
543 * @param r_idx \8am\94F\82µ\82½\82¢\83\82\83\93\83X\83^\81[\8eí\91°ID\r
544 * @return \90\90¬\95K\97v\8fð\8c\8f\82ð\96\9e\82½\82µ\82Ä\82¢\82é\82È\82çTRUE\82ð\95Ô\82·\81B\r
545 */\r
546 static bool vault_aux_dark_elf(MONRACE_IDX r_idx)\r
547 {\r
548         int i;\r
549         static int dark_elf_list[] =\r
550         {\r
551                 MON_D_ELF, MON_D_ELF_MAGE, MON_D_ELF_WARRIOR, MON_D_ELF_PRIEST,\r
552                 MON_D_ELF_LORD, MON_D_ELF_WARLOCK, MON_D_ELF_DRUID, MON_NIGHTBLADE,\r
553                 MON_D_ELF_SORC, MON_D_ELF_SHADE, 0,\r
554         };\r
555 \r
556         /* Validate the monster */\r
557         if (!vault_monster_okay(r_idx)) return FALSE;\r
558 \r
559         /* Require dark elves */\r
560         for (i = 0; dark_elf_list[i]; i++)\r
561                 if (r_idx == dark_elf_list[i]) return TRUE;\r
562 \r
563         /* Assume not */\r
564         return FALSE;\r
565 }\r
566 \r
567 \r
568 /*!\r
569 * @brief \83_\83\93\83W\83\87\83\93\96\88\82É\8ew\92è\82³\82ê\82½\83s\83b\83g\94z\97ñ\82ð\8aî\8f\80\82É\83\89\83\93\83_\83\80\82Èpit/nest\83^\83C\83v\82ð\8c\88\82ß\82é\r
570 * @param l_ptr \91I\91ð\82³\82ê\82½pit/nest\8fî\95ñ\82ð\95Ô\82·\8eQ\8fÆ\83|\83C\83\93\83^\r
571 * @param allow_flag_mask \90\90¬\82ª\8b\96\82³\82ê\82épit/nest\82Ì\83r\83b\83g\94z\97ñ\r
572 * @return \91I\91ð\82³\82ê\82½pit/nest\82ÌID\81A\91I\91ð\8e¸\94s\82µ\82½\8fê\8d\87-1\82ð\95Ô\82·\81B\r
573 */\r
574 static int pick_vault_type(vault_aux_type *l_ptr, s16b allow_flag_mask)\r
575 {\r
576         int tmp, total, count;\r
577 \r
578         vault_aux_type *n_ptr;\r
579 \r
580         /* Calculate the total possibilities */\r
581         for (n_ptr = l_ptr, total = 0, count = 0; TRUE; n_ptr++, count++)\r
582         {\r
583                 /* Note end */\r
584                 if (!n_ptr->name) break;\r
585 \r
586                 /* Ignore excessive depth */\r
587                 if (n_ptr->level > dun_level) continue;\r
588 \r
589                 /* Not matched with pit/nest flag */\r
590                 if (!(allow_flag_mask & (1L << count))) continue;\r
591 \r
592                 /* Count this possibility */\r
593                 total += n_ptr->chance * MAX_DEPTH / (MIN(dun_level, MAX_DEPTH - 1) - n_ptr->level + 5);\r
594         }\r
595 \r
596         /* Pick a random type */\r
597         tmp = randint0(total);\r
598 \r
599         /* Find this type */\r
600         for (n_ptr = l_ptr, total = 0, count = 0; TRUE; n_ptr++, count++)\r
601         {\r
602                 /* Note end */\r
603                 if (!n_ptr->name) break;\r
604 \r
605                 /* Ignore excessive depth */\r
606                 if (n_ptr->level > dun_level) continue;\r
607 \r
608                 /* Not matched with pit/nest flag */\r
609                 if (!(allow_flag_mask & (1L << count))) continue;\r
610 \r
611                 /* Count this possibility */\r
612                 total += n_ptr->chance * MAX_DEPTH / (MIN(dun_level, MAX_DEPTH - 1) - n_ptr->level + 5);\r
613 \r
614                 /* Found the type */\r
615                 if (tmp < total) break;\r
616         }\r
617 \r
618         return n_ptr->name ? count : -1;\r
619 }\r
620 \r
621 /*!\r
622 * @brief \83f\83o\83b\83O\8e\9e\82É\90\90¬\82³\82ê\82½pit/nest\82Ì\8c^\82ð\8fo\97Í\82·\82é\8f\88\97\9d\r
623 * @param type pit/nest\82Ì\8c^ID\r
624 * @param nest TRUE\82È\82ç\82Înest\81AFALSE\82È\82ç\82Îpit\r
625 * @return \83f\83o\83b\83O\95\\8e¦\95\8e\9a\97ñ\82Ì\8eQ\8fÆ\83|\83C\83\93\83^\r
626 * @details\r
627 * Hack -- Get the string describing subtype of pit/nest\r
628 * Determined in prepare function (some pit/nest only)\r
629 */\r
630 static cptr pit_subtype_string(int type, bool nest)\r
631 {\r
632         static char inner_buf[256] = "";\r
633 \r
634         inner_buf[0] = '\0'; /* Init string */\r
635 \r
636         if (nest) /* Nests */\r
637         {\r
638                 switch (type)\r
639                 {\r
640                 case NEST_TYPE_CLONE:\r
641                         sprintf(inner_buf, "(%s)", r_name + r_info[vault_aux_race].name);\r
642                         break;\r
643                 case NEST_TYPE_SYMBOL_GOOD:\r
644                 case NEST_TYPE_SYMBOL_EVIL:\r
645                         sprintf(inner_buf, "(%c)", vault_aux_char);\r
646                         break;\r
647                 }\r
648         }\r
649         else /* Pits */\r
650         {\r
651                 switch (type)\r
652                 {\r
653                 case PIT_TYPE_SYMBOL_GOOD:\r
654                 case PIT_TYPE_SYMBOL_EVIL:\r
655                         sprintf(inner_buf, "(%c)", vault_aux_char);\r
656                         break;\r
657                 case PIT_TYPE_DRAGON:\r
658                         switch (vault_aux_dragon_mask4)\r
659                         {\r
660 #ifdef JP\r
661                         case RF4_BR_ACID: strcpy(inner_buf, "(\8e_)");   break;\r
662                         case RF4_BR_ELEC: strcpy(inner_buf, "(\88î\8dÈ)"); break;\r
663                         case RF4_BR_FIRE: strcpy(inner_buf, "(\89Î\89\8a)"); break;\r
664                         case RF4_BR_COLD: strcpy(inner_buf, "(\97â\8bC)"); break;\r
665                         case RF4_BR_POIS: strcpy(inner_buf, "(\93Å)");   break;\r
666                         case (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS) :\r
667                                 strcpy(inner_buf, "(\96\9c\90F)"); break;\r
668                         default: strcpy(inner_buf, "(\96¢\92è\8b`)"); break;\r
669 #else\r
670                         case RF4_BR_ACID: strcpy(inner_buf, "(acid)");      break;\r
671                         case RF4_BR_ELEC: strcpy(inner_buf, "(lightning)"); break;\r
672                         case RF4_BR_FIRE: strcpy(inner_buf, "(fire)");      break;\r
673                         case RF4_BR_COLD: strcpy(inner_buf, "(frost)");     break;\r
674                         case RF4_BR_POIS: strcpy(inner_buf, "(poison)");    break;\r
675                         case (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS) :\r
676                                 strcpy(inner_buf, "(multi-hued)"); break;\r
677                         default: strcpy(inner_buf, "(undefined)"); break;\r
678 #endif\r
679                         }\r
680                         break;\r
681                 }\r
682         }\r
683 \r
684         return inner_buf;\r
685 }\r
686 \r
687 \r
688 \r
689 \r
690 \r
691 /*\r
692 *! @brief nest\82Ì\83\82\83\93\83X\83^\81[\83\8a\83X\83g\82ð\83\\81[\83g\82·\82é\82½\82ß\82Ì\8aÖ\90\94 /\r
693 *  Comp function for sorting nest monster information\r
694 *  @param u \83\\81[\83g\8f\88\97\9d\91Î\8fÛ\94z\97ñ\83|\83C\83\93\83^\r
695 *  @param v \96¢\8eg\97p\r
696 *  @param a \94ä\8ar\91Î\8fÛ\8eQ\8fÆID1\r
697 *  @param b \94ä\8ar\91Î\8fÛ\8eQ\8fÆID2\r
698 */\r
699 static bool ang_sort_comp_nest_mon_info(vptr u, vptr v, int a, int b)\r
700 {\r
701         nest_mon_info_type *nest_mon_info = (nest_mon_info_type *)u;\r
702         int w1 = nest_mon_info[a].r_idx;\r
703         int w2 = nest_mon_info[b].r_idx;\r
704         monster_race *r1_ptr = &r_info[w1];\r
705         monster_race *r2_ptr = &r_info[w2];\r
706         int z1, z2;\r
707 \r
708         /* Unused */\r
709         (void)v;\r
710 \r
711         /* Extract used info */\r
712         z1 = nest_mon_info[a].used;\r
713         z2 = nest_mon_info[b].used;\r
714 \r
715         /* Compare used status */\r
716         if (z1 < z2) return FALSE;\r
717         if (z1 > z2) return TRUE;\r
718 \r
719         /* Compare levels */\r
720         if (r1_ptr->level < r2_ptr->level) return TRUE;\r
721         if (r1_ptr->level > r2_ptr->level) return FALSE;\r
722 \r
723         /* Compare experience */\r
724         if (r1_ptr->mexp < r2_ptr->mexp) return TRUE;\r
725         if (r1_ptr->mexp > r2_ptr->mexp) return FALSE;\r
726 \r
727         /* Compare indexes */\r
728         return w1 <= w2;\r
729 }\r
730 \r
731 /*!\r
732 * @brief nest\82Ì\83\82\83\93\83X\83^\81[\83\8a\83X\83g\82ð\83X\83\8f\83b\83v\82·\82é\82½\82ß\82Ì\8aÖ\90\94 /\r
733 * Swap function for sorting nest monster information\r
734 * @param u \83X\83\8f\83b\83v\8f\88\97\9d\91Î\8fÛ\94z\97ñ\83|\83C\83\93\83^\r
735 * @param v \96¢\8eg\97p\r
736 * @param a \83X\83\8f\83b\83v\91Î\8fÛ\8eQ\8fÆID1\r
737 * @param b \83X\83\8f\83b\83v\91Î\8fÛ\8eQ\8fÆID2\r
738 */\r
739 static void ang_sort_swap_nest_mon_info(vptr u, vptr v, int a, int b)\r
740 {\r
741         nest_mon_info_type *nest_mon_info = (nest_mon_info_type *)u;\r
742         nest_mon_info_type holder;\r
743 \r
744         /* Unused */\r
745         (void)v;\r
746 \r
747         /* Swap */\r
748         holder = nest_mon_info[a];\r
749         nest_mon_info[a] = nest_mon_info[b];\r
750         nest_mon_info[b] = holder;\r
751 }\r
752 \r
753 \r
754 \r
755 /*!nest\8fî\95ñ\83e\81[\83u\83\8b*/\r
756 static vault_aux_type nest_types[] =\r
757 {\r
758 #ifdef JP\r
759 { "\83N\83\8d\81[\83\93",     vault_aux_clone,    vault_prep_clone,   5, 3 },\r
760 { "\83[\83\8a\81[",       vault_aux_jelly,    NULL,               5, 6 },\r
761 { "\83V\83\93\83{\83\8b(\91P)", vault_aux_symbol_g, vault_prep_symbol, 25, 2 },\r
762 { "\83V\83\93\83{\83\8b(\88«)", vault_aux_symbol_e, vault_prep_symbol, 25, 2 },\r
763 { "\83~\83~\83b\83N",     vault_aux_mimic,    NULL,              30, 4 },\r
764 { "\8b\8bC",         vault_aux_cthulhu,  NULL,              70, 2 },\r
765 { "\8c¢\8f¬\89®",       vault_aux_kennel,   NULL,              45, 4 },\r
766 { "\93®\95¨\89\80",       vault_aux_animal,   NULL,              35, 5 },\r
767 { "\8b³\89ï",         vault_aux_chapel_g, NULL,              75, 4 },\r
768 { "\83A\83\93\83f\83b\83h",   vault_aux_undead,   NULL,              75, 5 },\r
769 { NULL,           NULL,               NULL,               0, 0 },\r
770 #else\r
771 { "clone",        vault_aux_clone,    vault_prep_clone,   5, 3 },\r
772 { "jelly",        vault_aux_jelly,    NULL,               5, 6 },\r
773 { "symbol good",  vault_aux_symbol_g, vault_prep_symbol, 25, 2 },\r
774 { "symbol evil",  vault_aux_symbol_e, vault_prep_symbol, 25, 2 },\r
775 { "mimic",        vault_aux_mimic,    NULL,              30, 4 },\r
776 { "lovecraftian", vault_aux_cthulhu,  NULL,              70, 2 },\r
777 { "kennel",       vault_aux_kennel,   NULL,              45, 4 },\r
778 { "animal",       vault_aux_animal,   NULL,              35, 5 },\r
779 { "chapel",       vault_aux_chapel_g, NULL,              75, 4 },\r
780 { "undead",       vault_aux_undead,   NULL,              75, 5 },\r
781 { NULL,           NULL,               NULL,               0, 0 },\r
782 #endif\r
783 };\r
784 \r
785 /*!pit\8fî\95ñ\83e\81[\83u\83\8b*/\r
786 static vault_aux_type pit_types[] =\r
787 {\r
788 #ifdef JP\r
789 { "\83I\81[\83N",       vault_aux_orc,      NULL,               5, 6 },\r
790 { "\83g\83\8d\83\8b",       vault_aux_troll,    NULL,              20, 6 },\r
791 { "\83W\83\83\83C\83A\83\93\83g", vault_aux_giant,    NULL,              50, 6 },\r
792 { "\8b\8bC",         vault_aux_cthulhu,  NULL,              80, 2 },\r
793 { "\83V\83\93\83{\83\8b(\91P)", vault_aux_symbol_g, vault_prep_symbol, 70, 1 },\r
794 { "\83V\83\93\83{\83\8b(\88«)", vault_aux_symbol_e, vault_prep_symbol, 70, 1 },\r
795 { "\8b³\89ï",         vault_aux_chapel_g, NULL,              65, 2 },\r
796 { "\83h\83\89\83S\83\93",     vault_aux_dragon,   vault_prep_dragon, 70, 6 },\r
797 { "\83f\81[\83\82\83\93",     vault_aux_demon,    NULL,              80, 6 },\r
798 { "\83_\81[\83N\83G\83\8b\83t", vault_aux_dark_elf, NULL,              45, 4 },\r
799 { NULL,           NULL,               NULL,               0, 0 },\r
800 #else\r
801 { "orc",          vault_aux_orc,      NULL,               5, 6 },\r
802 { "troll",        vault_aux_troll,    NULL,              20, 6 },\r
803 { "giant",        vault_aux_giant,    NULL,              50, 6 },\r
804 { "lovecraftian", vault_aux_cthulhu,  NULL,              80, 2 },\r
805 { "symbol good",  vault_aux_symbol_g, vault_prep_symbol, 70, 1 },\r
806 { "symbol evil",  vault_aux_symbol_e, vault_prep_symbol, 70, 1 },\r
807 { "chapel",       vault_aux_chapel_g, NULL,              65, 2 },\r
808 { "dragon",       vault_aux_dragon,   vault_prep_dragon, 70, 6 },\r
809 { "demon",        vault_aux_demon,    NULL,              80, 6 },\r
810 { "dark elf",     vault_aux_dark_elf, NULL,              45, 4 },\r
811 { NULL,           NULL,               NULL,               0, 0 },\r
812 #endif\r
813 };\r
814 \r
815 \r
816 \r
817 \r
818 /*!\r
819 * @brief \83^\83C\83v5\82Ì\95\94\89®\81cnest\82ð\90\90¬\82·\82é / Type 5 -- Monster nests\r
820 * @return \82È\82µ\r
821 * @details\r
822 * A monster nest is a "big" room, with an "inner" room, containing\n\r
823 * a "collection" of monsters of a given type strewn about the room.\n\r
824 *\n\r
825 * The monsters are chosen from a set of 64 randomly selected monster\n\r
826 * races, to allow the nest creation to fail instead of having "holes".\n\r
827 *\n\r
828 * Note the use of the "get_mon_num_prep()" function, and the special\n\r
829 * "get_mon_num_hook()" restriction function, to prepare the "monster\n\r
830 * allocation table" in such a way as to optimize the selection of\n\r
831 * "appropriate" non-unique monsters for the nest.\n\r
832 *\n\r
833 * Note that the "get_mon_num()" function may (rarely) fail, in which\n\r
834 * case the nest will be empty.\n\r
835 *\n\r
836 * Note that "monster nests" will never contain "unique" monsters.\n\r
837 */\r
838 bool build_type5(void)\r
839 {\r
840         POSITION y, x, y1, x1, y2, x2, xval, yval;\r
841         int i;\r
842         nest_mon_info_type nest_mon_info[NUM_NEST_MON_TYPE];\r
843 \r
844         monster_type align;\r
845 \r
846         cave_type *c_ptr;\r
847 \r
848         int cur_nest_type = pick_vault_type(nest_types, d_info[dungeon_type].nest);\r
849         vault_aux_type *n_ptr;\r
850 \r
851         /* No type available */\r
852         if (cur_nest_type < 0) return FALSE;\r
853 \r
854         n_ptr = &nest_types[cur_nest_type];\r
855 \r
856         /* Process a preparation function if necessary */\r
857         if (n_ptr->prep_func) (*(n_ptr->prep_func))();\r
858 \r
859         /* Prepare allocation table */\r
860         get_mon_num_prep(n_ptr->hook_func, NULL);\r
861 \r
862         align.sub_align = SUB_ALIGN_NEUTRAL;\r
863 \r
864         /* Pick some monster types */\r
865         for (i = 0; i < NUM_NEST_MON_TYPE; i++)\r
866         {\r
867                 MONRACE_IDX r_idx = 0;\r
868                 int attempts = 100;\r
869                 monster_race *r_ptr = NULL;\r
870 \r
871                 while (attempts--)\r
872                 {\r
873                         /* Get a (hard) monster type */\r
874                         r_idx = get_mon_num(dun_level + 11);\r
875                         r_ptr = &r_info[r_idx];\r
876 \r
877                         /* Decline incorrect alignment */\r
878                         if (monster_has_hostile_align(&align, 0, 0, r_ptr)) continue;\r
879 \r
880                         /* Accept this monster */\r
881                         break;\r
882                 }\r
883 \r
884                 /* Notice failure */\r
885                 if (!r_idx || !attempts) return FALSE;\r
886 \r
887                 /* Note the alignment */\r
888                 if (r_ptr->flags3 & RF3_EVIL) align.sub_align |= SUB_ALIGN_EVIL;\r
889                 if (r_ptr->flags3 & RF3_GOOD) align.sub_align |= SUB_ALIGN_GOOD;\r
890 \r
891                 nest_mon_info[i].r_idx = (s16b)r_idx;\r
892                 nest_mon_info[i].used = FALSE;\r
893         }\r
894 \r
895         /* Find and reserve some space in the dungeon.  Get center of room. */\r
896         if (!find_space(&yval, &xval, 11, 25)) return FALSE;\r
897 \r
898         /* Large room */\r
899         y1 = yval - 4;\r
900         y2 = yval + 4;\r
901         x1 = xval - 11;\r
902         x2 = xval + 11;\r
903 \r
904         /* Place the floor area */\r
905         for (y = y1 - 1; y <= y2 + 1; y++)\r
906         {\r
907                 for (x = x1 - 1; x <= x2 + 1; x++)\r
908                 {\r
909                         c_ptr = &cave[y][x];\r
910                         place_floor_grid(c_ptr);\r
911                         c_ptr->info |= (CAVE_ROOM);\r
912                 }\r
913         }\r
914 \r
915         /* Place the outer walls */\r
916         for (y = y1 - 1; y <= y2 + 1; y++)\r
917         {\r
918                 c_ptr = &cave[y][x1 - 1];\r
919                 place_outer_grid(c_ptr);\r
920                 c_ptr = &cave[y][x2 + 1];\r
921                 place_outer_grid(c_ptr);\r
922         }\r
923         for (x = x1 - 1; x <= x2 + 1; x++)\r
924         {\r
925                 c_ptr = &cave[y1 - 1][x];\r
926                 place_outer_grid(c_ptr);\r
927                 c_ptr = &cave[y2 + 1][x];\r
928                 place_outer_grid(c_ptr);\r
929         }\r
930 \r
931 \r
932         /* Advance to the center room */\r
933         y1 = y1 + 2;\r
934         y2 = y2 - 2;\r
935         x1 = x1 + 2;\r
936         x2 = x2 - 2;\r
937 \r
938         /* The inner walls */\r
939         for (y = y1 - 1; y <= y2 + 1; y++)\r
940         {\r
941                 c_ptr = &cave[y][x1 - 1];\r
942                 place_inner_grid(c_ptr);\r
943                 c_ptr = &cave[y][x2 + 1];\r
944                 place_inner_grid(c_ptr);\r
945         }\r
946 \r
947         for (x = x1 - 1; x <= x2 + 1; x++)\r
948         {\r
949                 c_ptr = &cave[y1 - 1][x];\r
950                 place_inner_grid(c_ptr);\r
951                 c_ptr = &cave[y2 + 1][x];\r
952                 place_inner_grid(c_ptr);\r
953         }\r
954         for (y = y1; y <= y2; y++)\r
955         {\r
956                 for (x = x1; x <= x2; x++)\r
957                 {\r
958                         add_cave_info(y, x, CAVE_ICKY);\r
959                 }\r
960         }\r
961 \r
962         /* Place a secret door */\r
963         switch (randint1(4))\r
964         {\r
965         case 1: place_secret_door(y1 - 1, xval, DOOR_DEFAULT); break;\r
966         case 2: place_secret_door(y2 + 1, xval, DOOR_DEFAULT); break;\r
967         case 3: place_secret_door(yval, x1 - 1, DOOR_DEFAULT); break;\r
968         case 4: place_secret_door(yval, x2 + 1, DOOR_DEFAULT); break;\r
969         }\r
970 \r
971         msg_format_wizard(CHEAT_DUNGEON, _("\83\82\83\93\83X\83^\81[\95\94\89®(nest)(%s%s)\82ð\90\90¬\82µ\82Ü\82·\81B", "Monster nest (%s%s)"), n_ptr->name, pit_subtype_string(cur_nest_type, TRUE));\r
972 \r
973         /* Place some monsters */\r
974         for (y = yval - 2; y <= yval + 2; y++)\r
975         {\r
976                 for (x = xval - 9; x <= xval + 9; x++)\r
977                 {\r
978                         MONRACE_IDX r_idx;\r
979 \r
980                         i = randint0(NUM_NEST_MON_TYPE);\r
981                         r_idx = nest_mon_info[i].r_idx;\r
982 \r
983                         /* Place that "random" monster (no groups) */\r
984                         (void)place_monster_aux(0, y, x, r_idx, 0L);\r
985 \r
986                         nest_mon_info[i].used = TRUE;\r
987                 }\r
988         }\r
989 \r
990         if (cheat_room)\r
991         {\r
992                 ang_sort_comp = ang_sort_comp_nest_mon_info;\r
993                 ang_sort_swap = ang_sort_swap_nest_mon_info;\r
994                 ang_sort(nest_mon_info, NULL, NUM_NEST_MON_TYPE);\r
995 \r
996                 /* Dump the entries (prevent multi-printing) */\r
997                 for (i = 0; i < NUM_NEST_MON_TYPE; i++)\r
998                 {\r
999                         if (!nest_mon_info[i].used) break;\r
1000                         for (; i < NUM_NEST_MON_TYPE - 1; i++)\r
1001                         {\r
1002                                 if (nest_mon_info[i].r_idx != nest_mon_info[i + 1].r_idx) break;\r
1003                                 if (!nest_mon_info[i + 1].used) break;\r
1004                         }\r
1005                         msg_format_wizard(CHEAT_DUNGEON, "Nest\8d\\90¬\83\82\83\93\83X\83^\81[No.%d:%s", i, r_name + r_info[nest_mon_info[i].r_idx].name);\r
1006                 }\r
1007         }\r
1008 \r
1009         return TRUE;\r
1010 }\r
1011 \r
1012 \r
1013 /*!\r
1014 * @brief \83^\83C\83v6\82Ì\95\94\89®\81cpit\82ð\90\90¬\82·\82é / Type 6 -- Monster pits\r
1015 * @return \82È\82µ\r
1016 * @details\r
1017 * A monster pit is a "big" room, with an "inner" room, containing\n\r
1018 * a "collection" of monsters of a given type organized in the room.\n\r
1019 *\n\r
1020 * The inside room in a monster pit appears as shown below, where the\n\r
1021 * actual monsters in each location depend on the type of the pit\n\r
1022 *\n\r
1023 *   XXXXXXXXXXXXXXXXXXXXX\n\r
1024 *   X0000000000000000000X\n\r
1025 *   X0112233455543322110X\n\r
1026 *   X0112233467643322110X\n\r
1027 *   X0112233455543322110X\n\r
1028 *   X0000000000000000000X\n\r
1029 *   XXXXXXXXXXXXXXXXXXXXX\n\r
1030 *\n\r
1031 * Note that the monsters in the pit are now chosen by using "get_mon_num()"\n\r
1032 * to request 16 "appropriate" monsters, sorting them by level, and using\n\r
1033 * the "even" entries in this sorted list for the contents of the pit.\n\r
1034 *\n\r
1035 * Hack -- all of the "dragons" in a "dragon" pit must be the same "color",\n\r
1036 * which is handled by requiring a specific "breath" attack for all of the\n\r
1037 * dragons.  This may include "multi-hued" breath.  Note that "wyrms" may\n\r
1038 * be present in many of the dragon pits, if they have the proper breath.\n\r
1039 *\n\r
1040 * Note the use of the "get_mon_num_prep()" function, and the special\n\r
1041 * "get_mon_num_hook()" restriction function, to prepare the "monster\n\r
1042 * allocation table" in such a way as to optimize the selection of\n\r
1043 * "appropriate" non-unique monsters for the pit.\n\r
1044 *\n\r
1045 * Note that the "get_mon_num()" function may (rarely) fail, in which case\n\r
1046 * the pit will be empty.\n\r
1047 *\n\r
1048 * Note that "monster pits" will never contain "unique" monsters.\n\r
1049 */\r
1050 bool build_type6(void)\r
1051 {\r
1052         POSITION y, x, y1, x1, y2, x2, xval, yval;\r
1053         int i, j;\r
1054 \r
1055         MONRACE_IDX what[16];\r
1056 \r
1057         monster_type align;\r
1058 \r
1059         cave_type *c_ptr;\r
1060 \r
1061         int cur_pit_type = pick_vault_type(pit_types, d_info[dungeon_type].pit);\r
1062         vault_aux_type *n_ptr;\r
1063 \r
1064         /* No type available */\r
1065         if (cur_pit_type < 0) return FALSE;\r
1066 \r
1067         n_ptr = &pit_types[cur_pit_type];\r
1068 \r
1069         /* Process a preparation function if necessary */\r
1070         if (n_ptr->prep_func) (*(n_ptr->prep_func))();\r
1071 \r
1072         /* Prepare allocation table */\r
1073         get_mon_num_prep(n_ptr->hook_func, NULL);\r
1074 \r
1075         align.sub_align = SUB_ALIGN_NEUTRAL;\r
1076 \r
1077         /* Pick some monster types */\r
1078         for (i = 0; i < 16; i++)\r
1079         {\r
1080                 MONRACE_IDX r_idx = 0;\r
1081                 int attempts = 100;\r
1082                 monster_race *r_ptr = NULL;\r
1083 \r
1084                 while (attempts--)\r
1085                 {\r
1086                         /* Get a (hard) monster type */\r
1087                         r_idx = get_mon_num(dun_level + 11);\r
1088                         r_ptr = &r_info[r_idx];\r
1089 \r
1090                         /* Decline incorrect alignment */\r
1091                         if (monster_has_hostile_align(&align, 0, 0, r_ptr)) continue;\r
1092 \r
1093                         /* Accept this monster */\r
1094                         break;\r
1095                 }\r
1096 \r
1097                 /* Notice failure */\r
1098                 if (!r_idx || !attempts) return FALSE;\r
1099 \r
1100                 /* Note the alignment */\r
1101                 if (r_ptr->flags3 & RF3_EVIL) align.sub_align |= SUB_ALIGN_EVIL;\r
1102                 if (r_ptr->flags3 & RF3_GOOD) align.sub_align |= SUB_ALIGN_GOOD;\r
1103 \r
1104                 what[i] = r_idx;\r
1105         }\r
1106 \r
1107         /* Find and reserve some space in the dungeon.  Get center of room. */\r
1108         if (!find_space(&yval, &xval, 11, 25)) return FALSE;\r
1109 \r
1110         /* Large room */\r
1111         y1 = yval - 4;\r
1112         y2 = yval + 4;\r
1113         x1 = xval - 11;\r
1114         x2 = xval + 11;\r
1115 \r
1116         /* Place the floor area */\r
1117         for (y = y1 - 1; y <= y2 + 1; y++)\r
1118         {\r
1119                 for (x = x1 - 1; x <= x2 + 1; x++)\r
1120                 {\r
1121                         c_ptr = &cave[y][x];\r
1122                         place_floor_grid(c_ptr);\r
1123                         c_ptr->info |= (CAVE_ROOM);\r
1124                 }\r
1125         }\r
1126 \r
1127         /* Place the outer walls */\r
1128         for (y = y1 - 1; y <= y2 + 1; y++)\r
1129         {\r
1130                 c_ptr = &cave[y][x1 - 1];\r
1131                 place_outer_grid(c_ptr);\r
1132                 c_ptr = &cave[y][x2 + 1];\r
1133                 place_outer_grid(c_ptr);\r
1134         }\r
1135         for (x = x1 - 1; x <= x2 + 1; x++)\r
1136         {\r
1137                 c_ptr = &cave[y1 - 1][x];\r
1138                 place_outer_grid(c_ptr);\r
1139                 c_ptr = &cave[y2 + 1][x];\r
1140                 place_outer_grid(c_ptr);\r
1141         }\r
1142 \r
1143         /* Advance to the center room */\r
1144         y1 = y1 + 2;\r
1145         y2 = y2 - 2;\r
1146         x1 = x1 + 2;\r
1147         x2 = x2 - 2;\r
1148 \r
1149         /* The inner walls */\r
1150         for (y = y1 - 1; y <= y2 + 1; y++)\r
1151         {\r
1152                 c_ptr = &cave[y][x1 - 1];\r
1153                 place_inner_grid(c_ptr);\r
1154                 c_ptr = &cave[y][x2 + 1];\r
1155                 place_inner_grid(c_ptr);\r
1156         }\r
1157         for (x = x1 - 1; x <= x2 + 1; x++)\r
1158         {\r
1159                 c_ptr = &cave[y1 - 1][x];\r
1160                 place_inner_grid(c_ptr);\r
1161                 c_ptr = &cave[y2 + 1][x];\r
1162                 place_inner_grid(c_ptr);\r
1163         }\r
1164         for (y = y1; y <= y2; y++)\r
1165         {\r
1166                 for (x = x1; x <= x2; x++)\r
1167                 {\r
1168                         add_cave_info(y, x, CAVE_ICKY);\r
1169                 }\r
1170         }\r
1171 \r
1172         /* Place a secret door */\r
1173         switch (randint1(4))\r
1174         {\r
1175         case 1: place_secret_door(y1 - 1, xval, DOOR_DEFAULT); break;\r
1176         case 2: place_secret_door(y2 + 1, xval, DOOR_DEFAULT); break;\r
1177         case 3: place_secret_door(yval, x1 - 1, DOOR_DEFAULT); break;\r
1178         case 4: place_secret_door(yval, x2 + 1, DOOR_DEFAULT); break;\r
1179         }\r
1180 \r
1181         /* Sort the entries */\r
1182         for (i = 0; i < 16 - 1; i++)\r
1183         {\r
1184                 /* Sort the entries */\r
1185                 for (j = 0; j < 16 - 1; j++)\r
1186                 {\r
1187                         int i1 = j;\r
1188                         int i2 = j + 1;\r
1189 \r
1190                         int p1 = r_info[what[i1]].level;\r
1191                         int p2 = r_info[what[i2]].level;\r
1192 \r
1193                         /* Bubble */\r
1194                         if (p1 > p2)\r
1195                         {\r
1196                                 MONRACE_IDX tmp = what[i1];\r
1197                                 what[i1] = what[i2];\r
1198                                 what[i2] = tmp;\r
1199                         }\r
1200                 }\r
1201         }\r
1202 \r
1203         msg_format_wizard(CHEAT_DUNGEON, _("\83\82\83\93\83X\83^\81[\95\94\89®(pit)(%s%s)\82ð\90\90¬\82µ\82Ü\82·\81B", "Monster pit (%s%s)"), n_ptr->name, pit_subtype_string(cur_pit_type, FALSE));\r
1204 \r
1205         /* Select the entries */\r
1206         for (i = 0; i < 8; i++)\r
1207         {\r
1208                 /* Every other entry */\r
1209                 what[i] = what[i * 2];\r
1210                 msg_format_wizard(CHEAT_DUNGEON, _("Nest\8d\\90¬\83\82\83\93\83X\83^\81[\91I\91ðNo.%d:%s", "Nest Monster Select No.%d:%s"), i, r_name + r_info[what[i]].name);\r
1211         }\r
1212 \r
1213         /* Top and bottom rows */\r
1214         for (x = xval - 9; x <= xval + 9; x++)\r
1215         {\r
1216                 place_monster_aux(0, yval - 2, x, what[0], PM_NO_KAGE);\r
1217                 place_monster_aux(0, yval + 2, x, what[0], PM_NO_KAGE);\r
1218         }\r
1219 \r
1220         /* Middle columns */\r
1221         for (y = yval - 1; y <= yval + 1; y++)\r
1222         {\r
1223                 place_monster_aux(0, y, xval - 9, what[0], PM_NO_KAGE);\r
1224                 place_monster_aux(0, y, xval + 9, what[0], PM_NO_KAGE);\r
1225 \r
1226                 place_monster_aux(0, y, xval - 8, what[1], PM_NO_KAGE);\r
1227                 place_monster_aux(0, y, xval + 8, what[1], PM_NO_KAGE);\r
1228 \r
1229                 place_monster_aux(0, y, xval - 7, what[1], PM_NO_KAGE);\r
1230                 place_monster_aux(0, y, xval + 7, what[1], PM_NO_KAGE);\r
1231 \r
1232                 place_monster_aux(0, y, xval - 6, what[2], PM_NO_KAGE);\r
1233                 place_monster_aux(0, y, xval + 6, what[2], PM_NO_KAGE);\r
1234 \r
1235                 place_monster_aux(0, y, xval - 5, what[2], PM_NO_KAGE);\r
1236                 place_monster_aux(0, y, xval + 5, what[2], PM_NO_KAGE);\r
1237 \r
1238                 place_monster_aux(0, y, xval - 4, what[3], PM_NO_KAGE);\r
1239                 place_monster_aux(0, y, xval + 4, what[3], PM_NO_KAGE);\r
1240 \r
1241                 place_monster_aux(0, y, xval - 3, what[3], PM_NO_KAGE);\r
1242                 place_monster_aux(0, y, xval + 3, what[3], PM_NO_KAGE);\r
1243 \r
1244                 place_monster_aux(0, y, xval - 2, what[4], PM_NO_KAGE);\r
1245                 place_monster_aux(0, y, xval + 2, what[4], PM_NO_KAGE);\r
1246         }\r
1247 \r
1248         /* Above/Below the center monster */\r
1249         for (x = xval - 1; x <= xval + 1; x++)\r
1250         {\r
1251                 place_monster_aux(0, yval + 1, x, what[5], PM_NO_KAGE);\r
1252                 place_monster_aux(0, yval - 1, x, what[5], PM_NO_KAGE);\r
1253         }\r
1254 \r
1255         /* Next to the center monster */\r
1256         place_monster_aux(0, yval, xval + 1, what[6], PM_NO_KAGE);\r
1257         place_monster_aux(0, yval, xval - 1, what[6], PM_NO_KAGE);\r
1258 \r
1259         /* Center monster */\r
1260         place_monster_aux(0, yval, xval, what[7], PM_NO_KAGE);\r
1261 \r
1262         return TRUE;\r
1263 }\r
1264 \r
1265 \r
1266 \r
1267 /*\r
1268 * Helper function for "trapped monster pit"\r
1269 */\r
1270 static bool vault_aux_trapped_pit(MONRACE_IDX r_idx)\r
1271 {\r
1272         monster_race *r_ptr = &r_info[r_idx];\r
1273 \r
1274         /* Validate the monster */\r
1275         if (!vault_monster_okay(r_idx)) return (FALSE);\r
1276 \r
1277         /* No wall passing monster */\r
1278         if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL)) return (FALSE);\r
1279 \r
1280         /* Okay */\r
1281         return (TRUE);\r
1282 }\r
1283 \r
1284 \r
1285 /*!\r
1286 * @brief \83^\83C\83v13\82Ì\95\94\89®\81c\83g\83\89\83b\83vpit\82Ì\90\90¬ / Type 13 -- Trapped monster pits\r
1287 * @return \82È\82µ\r
1288 * @details\r
1289 * A trapped monster pit is a "big" room with a straight corridor in\n\r
1290 * which wall opening traps are placed, and with two "inner" rooms\n\r
1291 * containing a "collection" of monsters of a given type organized in\n\r
1292 * the room.\n\r
1293 *\n\r
1294 * The trapped monster pit appears as shown below, where the actual\n\r
1295 * monsters in each location depend on the type of the pit\n\r
1296 *\n\r
1297 *  XXXXXXXXXXXXXXXXXXXXXXXXX\n\r
1298 *  X                       X\n\r
1299 *  XXXXXXXXXXXXXXXXXXXXXXX X\n\r
1300 *  XXXXX001123454321100XXX X\n\r
1301 *  XXX0012234567654322100X X\n\r
1302 *  XXXXXXXXXXXXXXXXXXXXXXX X\n\r
1303 *  X           ^           X\n\r
1304 *  X XXXXXXXXXXXXXXXXXXXXXXX\n\r
1305 *  X X0012234567654322100XXX\n\r
1306 *  X XXX001123454321100XXXXX\n\r
1307 *  X XXXXXXXXXXXXXXXXXXXXXXX\n\r
1308 *  X                       X\n\r
1309 *  XXXXXXXXXXXXXXXXXXXXXXXXX\n\r
1310 *\n\r
1311 * Note that the monsters in the pit are now chosen by using "get_mon_num()"\n\r
1312 * to request 16 "appropriate" monsters, sorting them by level, and using\n\r
1313 * the "even" entries in this sorted list for the contents of the pit.\n\r
1314 *\n\r
1315 * Hack -- all of the "dragons" in a "dragon" pit must be the same "color",\n\r
1316 * which is handled by requiring a specific "breath" attack for all of the\n\r
1317 * dragons.  This may include "multi-hued" breath.  Note that "wyrms" may\n\r
1318 * be present in many of the dragon pits, if they have the proper breath.\n\r
1319 *\n\r
1320 * Note the use of the "get_mon_num_prep()" function, and the special\n\r
1321 * "get_mon_num_hook()" restriction function, to prepare the "monster\n\r
1322 * allocation table" in such a way as to optimize the selection of\n\r
1323 * "appropriate" non-unique monsters for the pit.\n\r
1324 *\n\r
1325 * Note that the "get_mon_num()" function may (rarely) fail, in which case\n\r
1326 * the pit will be empty.\n\r
1327 *\n\r
1328 * Note that "monster pits" will never contain "unique" monsters.\n\r
1329 */\r
1330 bool build_type13(void)\r
1331 {\r
1332         static int placing[][3] = {\r
1333                 { -2, -9, 0 },{ -2, -8, 0 },{ -3, -7, 0 },{ -3, -6, 0 },\r
1334                 { +2, -9, 0 },{ +2, -8, 0 },{ +3, -7, 0 },{ +3, -6, 0 },\r
1335                 { -2, +9, 0 },{ -2, +8, 0 },{ -3, +7, 0 },{ -3, +6, 0 },\r
1336                 { +2, +9, 0 },{ +2, +8, 0 },{ +3, +7, 0 },{ +3, +6, 0 },\r
1337                 { -2, -7, 1 },{ -3, -5, 1 },{ -3, -4, 1 },\r
1338                 { +2, -7, 1 },{ +3, -5, 1 },{ +3, -4, 1 },\r
1339                 { -2, +7, 1 },{ -3, +5, 1 },{ -3, +4, 1 },\r
1340                 { +2, +7, 1 },{ +3, +5, 1 },{ +3, +4, 1 },\r
1341                 { -2, -6, 2 },{ -2, -5, 2 },{ -3, -3, 2 },\r
1342                 { +2, -6, 2 },{ +2, -5, 2 },{ +3, -3, 2 },\r
1343                 { -2, +6, 2 },{ -2, +5, 2 },{ -3, +3, 2 },\r
1344                 { +2, +6, 2 },{ +2, +5, 2 },{ +3, +3, 2 },\r
1345                 { -2, -4, 3 },{ -3, -2, 3 },\r
1346                 { +2, -4, 3 },{ +3, -2, 3 },\r
1347                 { -2, +4, 3 },{ -3, +2, 3 },\r
1348                 { +2, +4, 3 },{ +3, +2, 3 },\r
1349                 { -2, -3, 4 },{ -3, -1, 4 },\r
1350                 { +2, -3, 4 },{ +3, -1, 4 },\r
1351                 { -2, +3, 4 },{ -3, +1, 4 },\r
1352                 { +2, +3, 4 },{ +3, +1, 4 },\r
1353                 { -2, -2, 5 },{ -3, 0, 5 },{ -2, +2, 5 },\r
1354                 { +2, -2, 5 },{ +3, 0, 5 },{ +2, +2, 5 },\r
1355                 { -2, -1, 6 },{ -2, +1, 6 },\r
1356                 { +2, -1, 6 },{ +2, +1, 6 },\r
1357                 { -2, 0, 7 },{ +2, 0, 7 },\r
1358                 { 0, 0, -1 }\r
1359         };\r
1360 \r
1361         POSITION y, x, y1, x1, y2, x2, xval, yval;\r
1362         int i, j;\r
1363 \r
1364         MONRACE_IDX what[16];\r
1365 \r
1366         monster_type align;\r
1367 \r
1368         cave_type *c_ptr;\r
1369 \r
1370         int cur_pit_type = pick_vault_type(pit_types, d_info[dungeon_type].pit);\r
1371         vault_aux_type *n_ptr;\r
1372 \r
1373         /* Only in Angband */\r
1374         if (dungeon_type != DUNGEON_ANGBAND) return FALSE;\r
1375 \r
1376         /* No type available */\r
1377         if (cur_pit_type < 0) return FALSE;\r
1378 \r
1379         n_ptr = &pit_types[cur_pit_type];\r
1380 \r
1381         /* Process a preparation function if necessary */\r
1382         if (n_ptr->prep_func) (*(n_ptr->prep_func))();\r
1383 \r
1384         /* Prepare allocation table */\r
1385         get_mon_num_prep(n_ptr->hook_func, vault_aux_trapped_pit);\r
1386 \r
1387         align.sub_align = SUB_ALIGN_NEUTRAL;\r
1388 \r
1389         /* Pick some monster types */\r
1390         for (i = 0; i < 16; i++)\r
1391         {\r
1392                 MONRACE_IDX r_idx = 0;\r
1393                 int attempts = 100;\r
1394                 monster_race *r_ptr = NULL;\r
1395 \r
1396                 while (attempts--)\r
1397                 {\r
1398                         /* Get a (hard) monster type */\r
1399                         r_idx = get_mon_num(dun_level + 0);\r
1400                         r_ptr = &r_info[r_idx];\r
1401 \r
1402                         /* Decline incorrect alignment */\r
1403                         if (monster_has_hostile_align(&align, 0, 0, r_ptr)) continue;\r
1404 \r
1405                         /* Accept this monster */\r
1406                         break;\r
1407                 }\r
1408 \r
1409                 /* Notice failure */\r
1410                 if (!r_idx || !attempts) return FALSE;\r
1411 \r
1412                 /* Note the alignment */\r
1413                 if (r_ptr->flags3 & RF3_EVIL) align.sub_align |= SUB_ALIGN_EVIL;\r
1414                 if (r_ptr->flags3 & RF3_GOOD) align.sub_align |= SUB_ALIGN_GOOD;\r
1415 \r
1416                 what[i] = r_idx;\r
1417         }\r
1418 \r
1419         /* Find and reserve some space in the dungeon.  Get center of room. */\r
1420         if (!find_space(&yval, &xval, 13, 25)) return FALSE;\r
1421 \r
1422         /* Large room */\r
1423         y1 = yval - 5;\r
1424         y2 = yval + 5;\r
1425         x1 = xval - 11;\r
1426         x2 = xval + 11;\r
1427 \r
1428         /* Fill with inner walls */\r
1429         for (y = y1 - 1; y <= y2 + 1; y++)\r
1430         {\r
1431                 for (x = x1 - 1; x <= x2 + 1; x++)\r
1432                 {\r
1433                         c_ptr = &cave[y][x];\r
1434                         place_inner_grid(c_ptr);\r
1435                         c_ptr->info |= (CAVE_ROOM);\r
1436                 }\r
1437         }\r
1438 \r
1439         /* Place the floor area 1 */\r
1440         for (x = x1 + 3; x <= x2 - 3; x++)\r
1441         {\r
1442                 c_ptr = &cave[yval - 2][x];\r
1443                 place_floor_grid(c_ptr);\r
1444                 add_cave_info(yval - 2, x, CAVE_ICKY);\r
1445 \r
1446                 c_ptr = &cave[yval + 2][x];\r
1447                 place_floor_grid(c_ptr);\r
1448                 add_cave_info(yval + 2, x, CAVE_ICKY);\r
1449         }\r
1450 \r
1451         /* Place the floor area 2 */\r
1452         for (x = x1 + 5; x <= x2 - 5; x++)\r
1453         {\r
1454                 c_ptr = &cave[yval - 3][x];\r
1455                 place_floor_grid(c_ptr);\r
1456                 add_cave_info(yval - 3, x, CAVE_ICKY);\r
1457 \r
1458                 c_ptr = &cave[yval + 3][x];\r
1459                 place_floor_grid(c_ptr);\r
1460                 add_cave_info(yval + 3, x, CAVE_ICKY);\r
1461         }\r
1462 \r
1463         /* Corridor */\r
1464         for (x = x1; x <= x2; x++)\r
1465         {\r
1466                 c_ptr = &cave[yval][x];\r
1467                 place_floor_grid(c_ptr);\r
1468                 c_ptr = &cave[y1][x];\r
1469                 place_floor_grid(c_ptr);\r
1470                 c_ptr = &cave[y2][x];\r
1471                 place_floor_grid(c_ptr);\r
1472         }\r
1473 \r
1474         /* Place the outer walls */\r
1475         for (y = y1 - 1; y <= y2 + 1; y++)\r
1476         {\r
1477                 c_ptr = &cave[y][x1 - 1];\r
1478                 place_outer_grid(c_ptr);\r
1479                 c_ptr = &cave[y][x2 + 1];\r
1480                 place_outer_grid(c_ptr);\r
1481         }\r
1482         for (x = x1 - 1; x <= x2 + 1; x++)\r
1483         {\r
1484                 c_ptr = &cave[y1 - 1][x];\r
1485                 place_outer_grid(c_ptr);\r
1486                 c_ptr = &cave[y2 + 1][x];\r
1487                 place_outer_grid(c_ptr);\r
1488         }\r
1489 \r
1490         /* Random corridor */\r
1491         if (one_in_(2))\r
1492         {\r
1493                 for (y = y1; y <= yval; y++)\r
1494                 {\r
1495                         place_floor_bold(y, x2);\r
1496                         place_solid_bold(y, x1 - 1);\r
1497                 }\r
1498                 for (y = yval; y <= y2 + 1; y++)\r
1499                 {\r
1500                         place_floor_bold(y, x1);\r
1501                         place_solid_bold(y, x2 + 1);\r
1502                 }\r
1503         }\r
1504         else\r
1505         {\r
1506                 for (y = yval; y <= y2 + 1; y++)\r
1507                 {\r
1508                         place_floor_bold(y, x1);\r
1509                         place_solid_bold(y, x2 + 1);\r
1510                 }\r
1511                 for (y = y1; y <= yval; y++)\r
1512                 {\r
1513                         place_floor_bold(y, x2);\r
1514                         place_solid_bold(y, x1 - 1);\r
1515                 }\r
1516         }\r
1517 \r
1518         /* Place the wall open trap */\r
1519         cave[yval][xval].mimic = cave[yval][xval].feat;\r
1520         cave[yval][xval].feat = feat_trap_open;\r
1521 \r
1522         /* Sort the entries */\r
1523         for (i = 0; i < 16 - 1; i++)\r
1524         {\r
1525                 /* Sort the entries */\r
1526                 for (j = 0; j < 16 - 1; j++)\r
1527                 {\r
1528                         int i1 = j;\r
1529                         int i2 = j + 1;\r
1530 \r
1531                         int p1 = r_info[what[i1]].level;\r
1532                         int p2 = r_info[what[i2]].level;\r
1533 \r
1534                         /* Bubble */\r
1535                         if (p1 > p2)\r
1536                         {\r
1537                                 MONRACE_IDX tmp = what[i1];\r
1538                                 what[i1] = what[i2];\r
1539                                 what[i2] = tmp;\r
1540                         }\r
1541                 }\r
1542         }\r
1543 \r
1544         msg_format_wizard(CHEAT_DUNGEON, _("%s%s\82Ìã©\83s\83b\83g\82ª\90\90¬\82³\82ê\82Ü\82µ\82½\81B", "Trapped monster pit (%s%s)"),\r
1545                 n_ptr->name, pit_subtype_string(cur_pit_type, FALSE));\r
1546 \r
1547         /* Select the entries */\r
1548         for (i = 0; i < 8; i++)\r
1549         {\r
1550                 /* Every other entry */\r
1551                 what[i] = what[i * 2];\r
1552 \r
1553                 if (cheat_hear)\r
1554                 {\r
1555                         /* Message */\r
1556                         msg_print(r_name + r_info[what[i]].name);\r
1557                 }\r
1558         }\r
1559 \r
1560         for (i = 0; placing[i][2] >= 0; i++)\r
1561         {\r
1562                 y = yval + placing[i][0];\r
1563                 x = xval + placing[i][1];\r
1564                 place_monster_aux(0, y, x, what[placing[i][2]], PM_NO_KAGE);\r
1565         }\r
1566 \r
1567         return TRUE;\r
1568 }\r
1569 \r