OSDN Git Service

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