OSDN Git Service

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