OSDN Git Service

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