OSDN Git Service

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