OSDN Git Service

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