OSDN Git Service

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