OSDN Git Service

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