OSDN Git Service

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