OSDN Git Service

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