OSDN Git Service

Changed to match the For2.2.2-Refactoring-Cocoa2 branch. Put se_maoudamashii_voice_m...
[hengbandforosx/hengbandosx.git] / src / monsterrace-hook.c
1 #include "angband.h"
2 #include "monsterrace-hook.h"
3 #include "monster-spell.h"
4
5 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
6 int vault_aux_race;
7
8 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
9 char vault_aux_char;
10
11 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
12 BIT_FLAGS vault_aux_dragon_mask4;
13
14
15 /*!
16 * @brief pit/nestの基準となる単種モンスターを決める /
17 * @return なし
18 */
19 void vault_prep_clone(void)
20 {
21         /* Apply the monster restriction */
22         get_mon_num_prep(vault_aux_simple, NULL);
23
24         /* Pick a race to clone */
25         vault_aux_race = get_mon_num(current_floor_ptr->dun_level + 10);
26
27         /* Remove the monster restriction */
28         get_mon_num_prep(NULL, NULL);
29 }
30
31
32 /*!
33 * @brief pit/nestの基準となるモンスターシンボルを決める /
34 * @return なし
35 */
36 void vault_prep_symbol(void)
37 {
38         MONRACE_IDX r_idx;
39
40         /* Apply the monster restriction */
41         get_mon_num_prep(vault_aux_simple, NULL);
42
43         /* Pick a race to clone */
44         r_idx = get_mon_num(current_floor_ptr->dun_level + 10);
45
46         /* Remove the monster restriction */
47         get_mon_num_prep(NULL, NULL);
48
49         /* Extract the symbol */
50         vault_aux_char = r_info[r_idx].d_char;
51 }
52
53
54 /*!
55 * @brief pit/nestの基準となるドラゴンの種類を決める /
56 * @return なし
57 */
58 void vault_prep_dragon(void)
59 {
60         /* Pick dragon type */
61         switch (randint0(6))
62         {
63         case 0: /* Black */
64                 vault_aux_dragon_mask4 = RF4_BR_ACID;
65                 break;
66         case 1: /* Blue */
67                 vault_aux_dragon_mask4 = RF4_BR_ELEC;
68                 break;
69         case 2: /* Red */
70                 vault_aux_dragon_mask4 = RF4_BR_FIRE;
71                 break;
72         case 3: /* White */
73                 vault_aux_dragon_mask4 = RF4_BR_COLD;
74                 break;
75         case 4: /* Green */
76                 vault_aux_dragon_mask4 = RF4_BR_POIS;
77                 break;
78         default: /* Multi-hued */
79                 vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS);
80                 break;
81         }
82 }
83
84 /*!
85 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
86 * @param r_idx モンスターID
87 * @return 討伐対象にできるならTRUEを返す。
88 */
89 bool mon_hook_quest(MONRACE_IDX r_idx)
90 {
91         monster_race *r_ptr = &r_info[r_idx];
92
93         /* Random quests are in the dungeon */
94         if (r_ptr->flags8 & RF8_WILD_ONLY) return FALSE;
95
96         /* No random quests for aquatic monsters */
97         if (r_ptr->flags7 & RF7_AQUATIC) return FALSE;
98
99         /* No random quests for multiplying monsters */
100         if (r_ptr->flags2 & RF2_MULTIPLY) return FALSE;
101
102         /* No quests to kill friendly monsters */
103         if (r_ptr->flags7 & RF7_FRIENDLY) return FALSE;
104
105         return TRUE;
106 }
107
108
109 /*!
110 * @brief モンスターがダンジョンに出現するかどうかを返す
111 * @param r_idx 判定するモンスターの種族ID
112 * @return ダンジョンに出現するならばTRUEを返す
113 */
114 bool mon_hook_dungeon(MONRACE_IDX r_idx)
115 {
116         monster_race *r_ptr = &r_info[r_idx];
117
118         if (!(r_ptr->flags8 & RF8_WILD_ONLY))
119                 return TRUE;
120         else
121         {
122                 dungeon_type *d_ptr = &d_info[p_ptr->dungeon_idx];
123                 if ((d_ptr->mflags8 & RF8_WILD_MOUNTAIN) &&
124                         (r_ptr->flags8 & RF8_WILD_MOUNTAIN)) return TRUE;
125                 return FALSE;
126         }
127 }
128
129
130 /*!
131 * @brief モンスターが海洋に出現するかどうかを返す
132 * @param r_idx 判定するモンスターの種族ID
133 * @return 海洋に出現するならばTRUEを返す
134 */
135 bool mon_hook_ocean(MONRACE_IDX r_idx)
136 {
137         monster_race *r_ptr = &r_info[r_idx];
138
139         if (r_ptr->flags8 & RF8_WILD_OCEAN)
140                 return TRUE;
141         else
142                 return FALSE;
143 }
144
145
146 /*!
147 * @brief モンスターが海岸に出現するかどうかを返す
148 * @param r_idx 判定するモンスターの種族ID
149 * @return 海岸に出現するならばTRUEを返す
150 */
151 bool mon_hook_shore(MONRACE_IDX r_idx)
152 {
153         monster_race *r_ptr = &r_info[r_idx];
154
155         if (r_ptr->flags8 & RF8_WILD_SHORE)
156                 return TRUE;
157         else
158                 return FALSE;
159 }
160
161
162 /*!
163 * @brief モンスターが荒地に出現するかどうかを返す
164 * @param r_idx 判定するモンスターの種族ID
165 * @return 荒地に出現するならばTRUEを返す
166 */
167 bool mon_hook_waste(MONRACE_IDX r_idx)
168 {
169         monster_race *r_ptr = &r_info[r_idx];
170
171         if (r_ptr->flags8 & (RF8_WILD_WASTE | RF8_WILD_ALL))
172                 return TRUE;
173         else
174                 return FALSE;
175 }
176
177
178 /*!
179 * @brief モンスターが町に出現するかどうかを返す
180 * @param r_idx 判定するモンスターの種族ID
181 * @return 荒地に出現するならばTRUEを返す
182 */
183 bool mon_hook_town(MONRACE_IDX r_idx)
184 {
185         monster_race *r_ptr = &r_info[r_idx];
186
187         if (r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL))
188                 return TRUE;
189         else
190                 return FALSE;
191 }
192
193
194 /*!
195 * @brief モンスターが森林に出現するかどうかを返す
196 * @param r_idx 判定するモンスターの種族ID
197 * @return 森林に出現するならばTRUEを返す
198 */
199 bool mon_hook_wood(MONRACE_IDX r_idx)
200 {
201         monster_race *r_ptr = &r_info[r_idx];
202
203         if (r_ptr->flags8 & (RF8_WILD_WOOD | RF8_WILD_ALL))
204                 return TRUE;
205         else
206                 return FALSE;
207 }
208
209
210 /*!
211 * @brief モンスターが火山に出現するかどうかを返す
212 * @param r_idx 判定するモンスターの種族ID
213 * @return 火山に出現するならばTRUEを返す
214 */
215 bool mon_hook_volcano(MONRACE_IDX r_idx)
216 {
217         monster_race *r_ptr = &r_info[r_idx];
218
219         if (r_ptr->flags8 & RF8_WILD_VOLCANO)
220                 return TRUE;
221         else
222                 return FALSE;
223 }
224
225 /*!
226 * @brief モンスターが山地に出現するかどうかを返す
227 * @param r_idx 判定するモンスターの種族ID
228 * @return 山地に出現するならばTRUEを返す
229 */
230 bool mon_hook_mountain(MONRACE_IDX r_idx)
231 {
232         monster_race *r_ptr = &r_info[r_idx];
233
234         if (r_ptr->flags8 & RF8_WILD_MOUNTAIN)
235                 return TRUE;
236         else
237                 return FALSE;
238 }
239
240
241 /*!
242 * @brief モンスターが草原に出現するかどうかを返す
243 * @param r_idx 判定するモンスターの種族ID
244 * @return 森林に出現するならばTRUEを返す
245 */
246 bool mon_hook_grass(MONRACE_IDX r_idx)
247 {
248         monster_race *r_ptr = &r_info[r_idx];
249
250         if (r_ptr->flags8 & (RF8_WILD_GRASS | RF8_WILD_ALL))
251                 return TRUE;
252         else
253                 return FALSE;
254 }
255
256 /*!
257 * @brief モンスターが深い水地形に出現するかどうかを返す
258 * @param r_idx 判定するモンスターの種族ID
259 * @return 深い水地形に出現するならばTRUEを返す
260 */
261 bool mon_hook_deep_water(MONRACE_IDX r_idx)
262 {
263         monster_race *r_ptr = &r_info[r_idx];
264
265         if (!mon_hook_dungeon(r_idx)) return FALSE;
266
267         if (r_ptr->flags7 & RF7_AQUATIC)
268                 return TRUE;
269         else
270                 return FALSE;
271 }
272
273
274 /*!
275 * @brief モンスターが浅い水地形に出現するかどうかを返す
276 * @param r_idx 判定するモンスターの種族ID
277 * @return 浅い水地形に出現するならばTRUEを返す
278 */
279 bool mon_hook_shallow_water(MONRACE_IDX r_idx)
280 {
281         monster_race *r_ptr = &r_info[r_idx];
282
283         if (!mon_hook_dungeon(r_idx)) return FALSE;
284
285         if (r_ptr->flags2 & RF2_AURA_FIRE)
286                 return FALSE;
287         else
288                 return TRUE;
289 }
290
291
292 /*!
293 * @brief モンスターが溶岩地形に出現するかどうかを返す
294 * @param r_idx 判定するモンスターの種族ID
295 * @return 溶岩地形に出現するならばTRUEを返す
296 */
297 bool mon_hook_lava(MONRACE_IDX r_idx)
298 {
299         monster_race *r_ptr = &r_info[r_idx];
300         if (!mon_hook_dungeon(r_idx)) return FALSE;
301         if (((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) ||
302                 (r_ptr->flags7 & RF7_CAN_FLY)) &&
303                 !(r_ptr->flags3 & RF3_AURA_COLD))
304                 return TRUE;
305         else
306                 return FALSE;
307 }
308
309
310 /*!
311 * @brief モンスターが通常の床地形に出現するかどうかを返す
312 * @param r_idx 判定するモンスターの種族ID
313 * @return 通常の床地形に出現するならばTRUEを返す
314 */
315 bool mon_hook_floor(MONRACE_IDX r_idx)
316 {
317         monster_race *r_ptr = &r_info[r_idx];
318         if (!(r_ptr->flags7 & RF7_AQUATIC) || (r_ptr->flags7 & RF7_CAN_FLY))
319                 return TRUE;
320         else
321                 return FALSE;
322 }
323
324 /*
325 * Helper function for "glass room"
326 */
327 bool vault_aux_lite(MONRACE_IDX r_idx)
328 {
329         monster_race *r_ptr = &r_info[r_idx];
330         if (!vault_monster_okay(r_idx)) return FALSE;
331         if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE)) return FALSE;
332         if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL)) return FALSE;
333         if (r_ptr->flags4 & RF4_BR_DISI) return FALSE;
334         return TRUE;
335 }
336
337 /*
338 * Helper function for "glass room"
339 */
340 bool vault_aux_shards(MONRACE_IDX r_idx)
341 {
342         monster_race *r_ptr = &r_info[r_idx];
343         if (!vault_monster_okay(r_idx)) return FALSE;
344         if (!(r_ptr->flags4 & RF4_BR_SHAR)) return FALSE;
345         return TRUE;
346 }
347
348
349 /*!
350 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
351 * Helper monster selection function
352 * @param r_idx 確認したいモンスター種族ID
353 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
354 */
355 bool vault_aux_simple(MONRACE_IDX r_idx)
356 {
357         return (vault_monster_okay(r_idx));
358 }
359
360
361 /*!
362 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
363 * Helper function for "monster nest (jelly)"
364 * @param r_idx 確認したいモンスター種族ID
365 * @return 生成必要条件を満たしているならTRUEを返す。
366 */
367 bool vault_aux_jelly(MONRACE_IDX r_idx)
368 {
369         monster_race *r_ptr = &r_info[r_idx];
370         if (!vault_monster_okay(r_idx)) return (FALSE);
371         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
372         if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
373         if (!my_strchr("ijm,", r_ptr->d_char)) return (FALSE);
374         return (TRUE);
375 }
376
377 /*!
378 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
379 * Helper function for "monster nest (animal)"
380 * @param r_idx 確認したいモンスター種族ID
381 * @return 生成必要条件を満たしているならTRUEを返す。
382 */
383 bool vault_aux_animal(MONRACE_IDX r_idx)
384 {
385         monster_race *r_ptr = &r_info[r_idx];
386         if (!vault_monster_okay(r_idx)) return (FALSE);
387         if (!(r_ptr->flags3 & (RF3_ANIMAL))) return (FALSE);
388         return (TRUE);
389 }
390
391
392 /*!
393 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
394 * Helper function for "monster nest (undead)"
395 * @param r_idx 確認したいモンスター種族ID
396 * @return 生成必要条件を満たしているならTRUEを返す。
397 */
398 bool vault_aux_undead(MONRACE_IDX r_idx)
399 {
400         monster_race *r_ptr = &r_info[r_idx];
401         if (!vault_monster_okay(r_idx)) return (FALSE);
402         if (!(r_ptr->flags3 & (RF3_UNDEAD))) return (FALSE);
403         return (TRUE);
404 }
405
406 /*!
407 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
408 * Helper function for "monster nest (chapel)"
409 * @param r_idx 確認したいモンスター種族ID
410 * @return 生成必要条件を満たしているならTRUEを返す。
411 */
412 bool vault_aux_chapel_g(MONRACE_IDX r_idx)
413 {
414         static int chapel_list[] = {
415                 MON_NOV_PRIEST, MON_NOV_PALADIN, MON_NOV_PRIEST_G, MON_NOV_PALADIN_G,
416                 MON_PRIEST, MON_JADE_MONK, MON_IVORY_MONK, MON_ULTRA_PALADIN,
417                 MON_EBONY_MONK, MON_W_KNIGHT, MON_KNI_TEMPLAR, MON_PALADIN,
418                 MON_TOPAZ_MONK, 0 };
419
420         int i;
421         monster_race *r_ptr = &r_info[r_idx];
422         if (!vault_monster_okay(r_idx)) return (FALSE);
423         if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
424         if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER)) return (FALSE);
425         if (r_ptr->d_char == 'A') return TRUE;
426         for (i = 0; chapel_list[i]; i++)
427                 if (r_idx == chapel_list[i]) return TRUE;
428         return FALSE;
429 }
430
431 /*!
432 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
433 * Helper function for "monster nest (kennel)"
434 * @param r_idx 確認したいモンスター種族ID
435 * @return 生成必要条件を満たしているならTRUEを返す。
436 */
437 bool vault_aux_kennel(MONRACE_IDX r_idx)
438 {
439         monster_race *r_ptr = &r_info[r_idx];
440         if (!vault_monster_okay(r_idx)) return (FALSE);
441         if (!my_strchr("CZ", r_ptr->d_char)) return (FALSE);
442         return (TRUE);
443 }
444
445 /*!
446 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
447 * Helper function for "monster nest (mimic)"
448 * @param r_idx 確認したいモンスター種族ID
449 * @return 生成必要条件を満たしているならTRUEを返す。
450 */
451 bool vault_aux_mimic(MONRACE_IDX r_idx)
452 {
453         monster_race *r_ptr = &r_info[r_idx];
454         if (!vault_monster_okay(r_idx)) return (FALSE);
455         if (!my_strchr("!$&(/=?[\\|", r_ptr->d_char)) return (FALSE);
456         return (TRUE);
457 }
458
459 /*!
460 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
461 * Helper function for "monster nest (clone)"
462 * @param r_idx 確認したいモンスター種族ID
463 * @return 生成必要条件を満たしているならTRUEを返す。
464 */
465 bool vault_aux_clone(MONRACE_IDX r_idx)
466 {
467         if (!vault_monster_okay(r_idx)) return (FALSE);
468         return (r_idx == vault_aux_race);
469 }
470
471
472 /*!
473 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
474 * Helper function for "monster nest (symbol clone)"
475 * @param r_idx 確認したいモンスター種族ID
476 * @return 生成必要条件を満たしているならTRUEを返す。
477 */
478 bool vault_aux_symbol_e(MONRACE_IDX r_idx)
479 {
480         monster_race *r_ptr = &r_info[r_idx];
481         if (!vault_monster_okay(r_idx)) return (FALSE);
482         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
483         if (r_ptr->flags3 & (RF3_GOOD)) return (FALSE);
484         if (r_ptr->d_char != vault_aux_char) return (FALSE);
485         return (TRUE);
486 }
487
488
489 /*!
490 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
491 * Helper function for "monster nest (symbol clone)"
492 * @param r_idx 確認したいモンスター種族ID
493 * @return 生成必要条件を満たしているならTRUEを返す。
494 */
495 bool vault_aux_symbol_g(MONRACE_IDX r_idx)
496 {
497         monster_race *r_ptr = &r_info[r_idx];
498         if (!vault_monster_okay(r_idx)) return (FALSE);
499         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
500         if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
501         if (r_ptr->d_char != vault_aux_char) return (FALSE);
502         return (TRUE);
503 }
504
505
506 /*!
507 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
508 * Helper function for "monster pit (orc)"
509 * @param r_idx 確認したいモンスター種族ID
510 * @return 生成必要条件を満たしているならTRUEを返す。
511 */
512 bool vault_aux_orc(MONRACE_IDX r_idx)
513 {
514         monster_race *r_ptr = &r_info[r_idx];
515         if (!vault_monster_okay(r_idx)) return (FALSE);
516         if (!(r_ptr->flags3 & RF3_ORC)) return (FALSE);
517         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
518         return (TRUE);
519 }
520
521
522 /*!
523 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
524 * Helper function for "monster pit (troll)"
525 * @param r_idx 確認したいモンスター種族ID
526 * @return 生成必要条件を満たしているならTRUEを返す。
527 */
528 bool vault_aux_troll(MONRACE_IDX r_idx)
529 {
530         monster_race *r_ptr = &r_info[r_idx];
531         if (!vault_monster_okay(r_idx)) return (FALSE);
532         if (!(r_ptr->flags3 & RF3_TROLL)) return (FALSE);
533         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
534         return (TRUE);
535 }
536
537
538 /*!
539 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
540 * Helper function for "monster pit (giant)"
541 * @param r_idx 確認したいモンスター種族ID
542 * @return 生成必要条件を満たしているならTRUEを返す。
543 */
544 bool vault_aux_giant(MONRACE_IDX r_idx)
545 {
546         monster_race *r_ptr = &r_info[r_idx];
547         if (!vault_monster_okay(r_idx)) return (FALSE);
548         if (!(r_ptr->flags3 & RF3_GIANT)) return (FALSE);
549         if (r_ptr->flags3 & RF3_GOOD) return (FALSE);
550         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
551         return (TRUE);
552 }
553
554
555 /*!
556 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
557 * Helper function for "monster pit (dragon)"
558 * @param r_idx 確認したいモンスター種族ID
559 * @return 生成必要条件を満たしているならTRUEを返す。
560 */
561 bool vault_aux_dragon(MONRACE_IDX r_idx)
562 {
563         monster_race *r_ptr = &r_info[r_idx];
564         if (!vault_monster_okay(r_idx)) return (FALSE);
565         if (!(r_ptr->flags3 & RF3_DRAGON)) return (FALSE);
566         if (r_ptr->flags4 != vault_aux_dragon_mask4) return (FALSE);
567         if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
568         return (TRUE);
569 }
570
571
572 /*!
573 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
574 * Helper function for "monster pit (demon)"
575 * @param r_idx 確認したいモンスター種族ID
576 * @return 生成必要条件を満たしているならTRUEを返す。
577 */
578 bool vault_aux_demon(MONRACE_IDX r_idx)
579 {
580         monster_race *r_ptr = &r_info[r_idx];
581         if (!vault_monster_okay(r_idx)) return (FALSE);
582         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
583         if (!(r_ptr->flags3 & RF3_DEMON)) return (FALSE);
584         return (TRUE);
585 }
586
587
588 /*!
589 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
590 * Helper function for "monster pit (lovecraftian)"
591 * @param r_idx 確認したいモンスター種族ID
592 * @return 生成必要条件を満たしているならTRUEを返す。
593 */
594 bool vault_aux_cthulhu(MONRACE_IDX r_idx)
595 {
596         monster_race *r_ptr = &r_info[r_idx];
597         if (!vault_monster_okay(r_idx)) return (FALSE);
598         if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
599         if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
600         return (TRUE);
601 }
602
603 /*!
604 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
605 * Helper function for "monster pit (dark elf)"
606 * @param r_idx 確認したいモンスター種族ID
607 * @return 生成必要条件を満たしているならTRUEを返す。
608 */
609 bool vault_aux_dark_elf(MONRACE_IDX r_idx)
610 {
611         int i;
612         static int dark_elf_list[] =
613         {
614                 MON_D_ELF, MON_D_ELF_MAGE, MON_D_ELF_WARRIOR, MON_D_ELF_PRIEST,
615                 MON_D_ELF_LORD, MON_D_ELF_WARLOCK, MON_D_ELF_DRUID, MON_NIGHTBLADE,
616                 MON_D_ELF_SORC, MON_D_ELF_SHADE, 0,
617         };
618         if (!vault_monster_okay(r_idx)) return FALSE;
619         for (i = 0; dark_elf_list[i]; i++) if (r_idx == dark_elf_list[i]) return TRUE;
620         return FALSE;
621 }
622
623
624
625 /*!
626  * @brief モンスターが生命体かどうかを返す
627  * Is the monster "alive"?
628  * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
629  * @return 生命体ならばTRUEを返す
630  * @details
631  * Used to determine the message to print for a killed monster.
632  * ("dies", "destroyed")
633  */
634 bool monster_living(MONRACE_IDX r_idx)
635 {
636         monster_race *r_ptr = &r_info[r_idx];
637
638         /* Non-living, undead, or demon */
639         if (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING))
640                 return FALSE;
641         else
642                 return TRUE;
643 }
644
645 /*!
646  * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
647  * Is the monster "alive"? / Is this monster declined to be questor or bounty?
648  * @param r_idx モンスターの種族ID
649  * @return 賞金首に加えられないならばTRUEを返す
650  * @details
651  * 実質バーノール=ルパート用。
652  */
653 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
654 {
655         switch (r_idx)
656         {
657                 /*
658                  * Decline them to be questor or bounty because they use
659                  * special motion "split and combine"
660                  */
661         case MON_BANORLUPART:
662         case MON_BANOR:
663         case MON_LUPART:
664                 return TRUE;
665         default:
666                 return FALSE;
667         }
668 }
669
670 /*!
671  * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
672  * @param r_idx モンスターID
673  * @return 死体を食べられるならTRUEを返す。
674  */
675 bool monster_hook_human(MONRACE_IDX r_idx)
676 {
677         monster_race *r_ptr = &r_info[r_idx];
678         if (r_ptr->flags1 & (RF1_UNIQUE)) return FALSE;
679         if (my_strchr("pht", r_ptr->d_char)) return TRUE;
680
681         return FALSE;
682 }
683
684 /*!
685  * @brief 悪夢の元凶となるモンスターかどうかを返す。
686  * @param r_idx 判定対象となるモンスターのID
687  * @return 悪夢の元凶となり得るか否か。
688  */
689 bool get_nightmare(MONRACE_IDX r_idx)
690 {
691         monster_race *r_ptr = &r_info[r_idx];
692
693         /* Require eldritch horrors */
694         if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
695
696         /* Require high level */
697         if (r_ptr->level <= p_ptr->lev) return (FALSE);
698
699         /* Accept this monster */
700         return (TRUE);
701 }
702
703 /*!
704  * @brief モンスター種族が釣れる種族かどうかを判定する。
705  * @param r_idx 判定したいモンスター種族のID
706  * @return 釣れる対象ならばTRUEを返す
707  */
708 bool monster_is_fishing_target(MONRACE_IDX r_idx)
709 {
710         monster_race *r_ptr = &r_info[r_idx];
711
712         if ((r_ptr->flags7 & RF7_AQUATIC) && !(r_ptr->flags1 & RF1_UNIQUE) && my_strchr("Jjlw", r_ptr->d_char))
713                 return TRUE;
714         else
715                 return FALSE;
716 }
717
718 /*!
719  * @brief モンスター闘技場に参加できるモンスターの判定
720  * @param r_idx モンスターID
721  * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
722  * 自爆以外のなんらかのHP攻撃手段を持っていること。
723  * @return 参加できるか否か
724  */
725 bool monster_can_entry_arena(MONRACE_IDX r_idx)
726 {
727         int i;
728         HIT_POINT dam = 0;
729
730         monster_race *r_ptr = &r_info[r_idx];
731
732         /* Decline town monsters */
733 /*      if (!mon_hook_dungeon(r_idx)) return FALSE; */
734
735         /* Decline unique monsters */
736 /*      if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */
737 /*      if (r_ptr->flags7 & (RF7_NAZGUL)) return (FALSE); */
738
739         if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE);
740         if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE);
741         if (r_ptr->flags2 & (RF2_QUANTUM)) return (FALSE);
742         if (r_ptr->flags7 & (RF7_AQUATIC)) return (FALSE);
743         if (r_ptr->flags7 & (RF7_CHAMELEON)) return (FALSE);
744
745         for (i = 0; i < 4; i++)
746         {
747                 if (r_ptr->blow[i].method == RBM_EXPLODE) return (FALSE);
748                 if (r_ptr->blow[i].effect != RBE_DR_MANA) dam += r_ptr->blow[i].d_dice;
749         }
750         if (!dam && !(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK)) && !(r_ptr->a_ability_flags1 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK)) && !(r_ptr->a_ability_flags2 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK))) return (FALSE);
751
752         return (TRUE);
753 }
754
755 /*!
756  * @brief モンスターが人形のベースにできるかを返す
757  * @param r_idx チェックしたいモンスター種族のID
758  * @return 人形にできるならTRUEを返す
759  */
760 bool item_monster_okay(MONRACE_IDX r_idx)
761 {
762         monster_race *r_ptr = &r_info[r_idx];
763
764         /* No uniques */
765         if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
766         if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
767         if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
768         if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
769         if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
770         if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
771
772         return (TRUE);
773 }
774