OSDN Git Service

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