OSDN Git Service

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