OSDN Git Service

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