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"
22 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
25 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
28 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
29 BIT_FLAGS vault_aux_dragon_mask4;
32 * @brief pit/nestの基準となる単種モンスターを決める /
33 * @param player_ptr プレーヤーへの参照ポインタ
36 void vault_prep_clone(player_type *player_ptr)
38 get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
39 vault_aux_race = get_mon_num(player_ptr, player_ptr->current_floor_ptr->dun_level + 10, 0);
40 get_mon_num_prep(player_ptr, NULL, NULL);
44 * @brief pit/nestの基準となるモンスターシンボルを決める /
45 * @param player_ptr プレーヤーへの参照ポインタ
48 void vault_prep_symbol(player_type *player_ptr)
50 get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
51 MONRACE_IDX r_idx = get_mon_num(player_ptr, 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;
57 * @brief pit/nestの基準となるドラゴンの種類を決める /
58 * @param player_ptr プレーヤーへの参照ポインタ
61 void vault_prep_dragon(player_type *player_ptr)
66 switch (randint0(6)) {
68 vault_aux_dragon_mask4 = RF4_BR_ACID;
71 vault_aux_dragon_mask4 = RF4_BR_ELEC;
74 vault_aux_dragon_mask4 = RF4_BR_FIRE;
77 vault_aux_dragon_mask4 = RF4_BR_COLD;
80 vault_aux_dragon_mask4 = RF4_BR_POIS;
82 default: /* Multi-hued */
83 vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS);
89 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
90 * @param r_idx モンスターID
91 * @return 討伐対象にできるならTRUEを返す。
93 bool mon_hook_quest(player_type *player_ptr, MONRACE_IDX r_idx)
98 monster_race *r_ptr = &r_info[r_idx];
99 if (r_ptr->flags8 & RF8_WILD_ONLY)
102 if (r_ptr->flags7 & RF7_AQUATIC)
105 if (r_ptr->flags2 & RF2_MULTIPLY)
108 if (r_ptr->flags7 & RF7_FRIENDLY)
115 * @brief モンスターがダンジョンに出現するかどうかを返す
116 * @param r_idx 判定するモンスターの種族ID
117 * @return ダンジョンに出現するならばTRUEを返す
119 bool mon_hook_dungeon(player_type *player_ptr, MONRACE_IDX r_idx)
121 monster_race *r_ptr = &r_info[r_idx];
122 if ((r_ptr->flags8 & RF8_WILD_ONLY) == 0)
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));
130 * @brief モンスターが海洋に出現するかどうかを返す
131 * @param r_idx 判定するモンスターの種族ID
132 * @return 海洋に出現するならばTRUEを返す
134 bool mon_hook_ocean(player_type *player_ptr, MONRACE_IDX r_idx)
139 monster_race *r_ptr = &r_info[r_idx];
140 return (r_ptr->flags8 & RF8_WILD_OCEAN) != 0;
144 * @brief モンスターが海岸に出現するかどうかを返す
145 * @param r_idx 判定するモンスターの種族ID
146 * @return 海岸に出現するならばTRUEを返す
148 bool mon_hook_shore(player_type *player_ptr, MONRACE_IDX r_idx)
153 monster_race *r_ptr = &r_info[r_idx];
154 return (r_ptr->flags8 & RF8_WILD_SHORE) != 0;
158 * @brief モンスターが荒地に出現するかどうかを返す
159 * @param r_idx 判定するモンスターの種族ID
160 * @return 荒地に出現するならばTRUEを返す
162 bool mon_hook_waste(player_type *player_ptr, MONRACE_IDX r_idx)
167 monster_race *r_ptr = &r_info[r_idx];
168 return (r_ptr->flags8 & (RF8_WILD_WASTE | RF8_WILD_ALL)) != 0;
172 * @brief モンスターが町に出現するかどうかを返す
173 * @param r_idx 判定するモンスターの種族ID
174 * @return 荒地に出現するならばTRUEを返す
176 bool mon_hook_town(player_type *player_ptr, MONRACE_IDX r_idx)
181 monster_race *r_ptr = &r_info[r_idx];
182 return (r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL)) != 0;
186 * @brief モンスターが森林に出現するかどうかを返す
187 * @param r_idx 判定するモンスターの種族ID
188 * @return 森林に出現するならばTRUEを返す
190 bool mon_hook_wood(player_type *player_ptr, MONRACE_IDX r_idx)
195 monster_race *r_ptr = &r_info[r_idx];
196 return (r_ptr->flags8 & (RF8_WILD_WOOD | RF8_WILD_ALL)) != 0;
200 * @brief モンスターが火山に出現するかどうかを返す
201 * @param r_idx 判定するモンスターの種族ID
202 * @return 火山に出現するならばTRUEを返す
204 bool mon_hook_volcano(player_type *player_ptr, MONRACE_IDX r_idx)
209 monster_race *r_ptr = &r_info[r_idx];
210 return (r_ptr->flags8 & RF8_WILD_VOLCANO) != 0;
214 * @brief モンスターが山地に出現するかどうかを返す
215 * @param r_idx 判定するモンスターの種族ID
216 * @return 山地に出現するならばTRUEを返す
218 bool mon_hook_mountain(player_type *player_ptr, MONRACE_IDX r_idx)
223 monster_race *r_ptr = &r_info[r_idx];
224 return (r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0;
228 * @brief モンスターが草原に出現するかどうかを返す
229 * @param r_idx 判定するモンスターの種族ID
230 * @return 森林に出現するならばTRUEを返す
232 bool mon_hook_grass(player_type *player_ptr, MONRACE_IDX r_idx)
237 monster_race *r_ptr = &r_info[r_idx];
238 return (r_ptr->flags8 & (RF8_WILD_GRASS | RF8_WILD_ALL)) != 0;
242 * @brief モンスターが深い水地形に出現するかどうかを返す
243 * @param r_idx 判定するモンスターの種族ID
244 * @return 深い水地形に出現するならばTRUEを返す
246 bool mon_hook_deep_water(player_type *player_ptr, MONRACE_IDX r_idx)
248 monster_race *r_ptr = &r_info[r_idx];
249 if (!mon_hook_dungeon(player_ptr, r_idx))
252 return (r_ptr->flags7 & RF7_AQUATIC) != 0;
256 * @brief モンスターが浅い水地形に出現するかどうかを返す
257 * @param r_idx 判定するモンスターの種族ID
258 * @return 浅い水地形に出現するならばTRUEを返す
260 bool mon_hook_shallow_water(player_type *player_ptr, MONRACE_IDX r_idx)
262 monster_race *r_ptr = &r_info[r_idx];
263 if (!mon_hook_dungeon(player_ptr, r_idx))
266 return (r_ptr->flags2 & RF2_AURA_FIRE) != 0;
270 * @brief モンスターが溶岩地形に出現するかどうかを返す
271 * @param r_idx 判定するモンスターの種族ID
272 * @return 溶岩地形に出現するならばTRUEを返す
274 bool mon_hook_lava(player_type *player_ptr, MONRACE_IDX r_idx)
276 monster_race *r_ptr = &r_info[r_idx];
277 if (!mon_hook_dungeon(player_ptr, r_idx))
280 return ((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) || (r_ptr->flags7 & RF7_CAN_FLY)) && !(r_ptr->flags3 & RF3_AURA_COLD);
284 * @brief モンスターが通常の床地形に出現するかどうかを返す
285 * @param r_idx 判定するモンスターの種族ID
286 * @return 通常の床地形に出現するならばTRUEを返す
288 bool mon_hook_floor(player_type *player_ptr, MONRACE_IDX r_idx)
293 monster_race *r_ptr = &r_info[r_idx];
294 if (!(r_ptr->flags7 & RF7_AQUATIC) || (r_ptr->flags7 & RF7_CAN_FLY))
301 * Helper function for "glass room"
303 bool vault_aux_lite(player_type *player_ptr, MONRACE_IDX r_idx)
308 monster_race *r_ptr = &r_info[r_idx];
309 if (!vault_monster_okay(player_ptr, r_idx))
312 if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE))
315 if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL))
318 if (r_ptr->flags4 & RF4_BR_DISI)
325 * Helper function for "glass room"
327 bool vault_aux_shards(player_type *player_ptr, MONRACE_IDX r_idx)
329 monster_race *r_ptr = &r_info[r_idx];
330 if (!vault_monster_okay(player_ptr, r_idx))
333 if (!(r_ptr->flags4 & RF4_BR_SHAR))
340 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
341 * Helper monster selection function
342 * @param r_idx 確認したいモンスター種族ID
343 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
345 bool vault_aux_simple(player_type *player_ptr, MONRACE_IDX r_idx)
350 return (vault_monster_okay(player_ptr, r_idx));
354 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
355 * Helper function for "monster nest (jelly)"
356 * @param r_idx 確認したいモンスター種族ID
357 * @return 生成必要条件を満たしているならTRUEを返す。
359 bool vault_aux_jelly(player_type *player_ptr, MONRACE_IDX r_idx)
361 monster_race *r_ptr = &r_info[r_idx];
362 if (!vault_monster_okay(player_ptr, r_idx))
365 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
368 if (r_ptr->flags3 & (RF3_EVIL))
371 if (!angband_strchr("ijm,", r_ptr->d_char))
378 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
379 * Helper function for "monster nest (animal)"
380 * @param r_idx 確認したいモンスター種族ID
381 * @return 生成必要条件を満たしているならTRUEを返す。
383 bool vault_aux_animal(player_type *player_ptr, MONRACE_IDX r_idx)
385 monster_race *r_ptr = &r_info[r_idx];
386 if (!vault_monster_okay(player_ptr, r_idx))
389 if (!(r_ptr->flags3 & (RF3_ANIMAL)))
396 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
397 * Helper function for "monster nest (undead)"
398 * @param r_idx 確認したいモンスター種族ID
399 * @return 生成必要条件を満たしているならTRUEを返す。
401 bool vault_aux_undead(player_type *player_ptr, MONRACE_IDX r_idx)
403 monster_race *r_ptr = &r_info[r_idx];
404 if (!vault_monster_okay(player_ptr, r_idx))
407 if (!(r_ptr->flags3 & (RF3_UNDEAD)))
414 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
415 * Helper function for "monster nest (chapel)"
416 * @param r_idx 確認したいモンスター種族ID
417 * @return 生成必要条件を満たしているならTRUEを返す。
419 bool vault_aux_chapel_g(player_type *player_ptr, MONRACE_IDX r_idx)
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 };
424 monster_race *r_ptr = &r_info[r_idx];
425 if (!vault_monster_okay(player_ptr, r_idx))
428 if (r_ptr->flags3 & (RF3_EVIL))
431 if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER))
434 if (r_ptr->d_char == 'A')
437 for (int i = 0; chapel_list[i]; i++)
438 if (r_idx == chapel_list[i])
445 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
446 * Helper function for "monster nest (kennel)"
447 * @param r_idx 確認したいモンスター種族ID
448 * @return 生成必要条件を満たしているならTRUEを返す。
450 bool vault_aux_kennel(player_type *player_ptr, MONRACE_IDX r_idx)
452 monster_race *r_ptr = &r_info[r_idx];
453 if (!vault_monster_okay(player_ptr, r_idx))
456 if (!angband_strchr("CZ", r_ptr->d_char))
463 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
464 * Helper function for "monster nest (mimic)"
465 * @param r_idx 確認したいモンスター種族ID
466 * @return 生成必要条件を満たしているならTRUEを返す。
468 bool vault_aux_mimic(player_type *player_ptr, MONRACE_IDX r_idx)
470 monster_race *r_ptr = &r_info[r_idx];
471 if (!vault_monster_okay(player_ptr, r_idx))
474 if (!angband_strchr("!$&(/=?[\\|", r_ptr->d_char))
481 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
482 * Helper function for "monster nest (clone)"
483 * @param r_idx 確認したいモンスター種族ID
484 * @return 生成必要条件を満たしているならTRUEを返す。
486 bool vault_aux_clone(player_type *player_ptr, MONRACE_IDX r_idx)
488 if (!vault_monster_okay(player_ptr, r_idx))
491 return (r_idx == vault_aux_race);
495 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
496 * Helper function for "monster nest (symbol clone)"
497 * @param r_idx 確認したいモンスター種族ID
498 * @return 生成必要条件を満たしているならTRUEを返す。
500 bool vault_aux_symbol_e(player_type *player_ptr, MONRACE_IDX r_idx)
502 monster_race *r_ptr = &r_info[r_idx];
503 if (!vault_monster_okay(player_ptr, r_idx))
506 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
509 if (r_ptr->flags3 & (RF3_GOOD))
512 if (r_ptr->d_char != vault_aux_char)
519 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
520 * Helper function for "monster nest (symbol clone)"
521 * @param r_idx 確認したいモンスター種族ID
522 * @return 生成必要条件を満たしているならTRUEを返す。
524 bool vault_aux_symbol_g(player_type *player_ptr, MONRACE_IDX r_idx)
526 monster_race *r_ptr = &r_info[r_idx];
527 if (!vault_monster_okay(player_ptr, r_idx))
530 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
533 if (r_ptr->flags3 & (RF3_EVIL))
536 if (r_ptr->d_char != vault_aux_char)
543 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
544 * Helper function for "monster pit (orc)"
545 * @param r_idx 確認したいモンスター種族ID
546 * @return 生成必要条件を満たしているならTRUEを返す。
548 bool vault_aux_orc(player_type *player_ptr, MONRACE_IDX r_idx)
550 monster_race *r_ptr = &r_info[r_idx];
551 if (!vault_monster_okay(player_ptr, r_idx))
554 if (!(r_ptr->flags3 & RF3_ORC))
557 if (r_ptr->flags3 & RF3_UNDEAD)
564 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
565 * Helper function for "monster pit (troll)"
566 * @param r_idx 確認したいモンスター種族ID
567 * @return 生成必要条件を満たしているならTRUEを返す。
569 bool vault_aux_troll(player_type *player_ptr, MONRACE_IDX r_idx)
571 monster_race *r_ptr = &r_info[r_idx];
572 if (!vault_monster_okay(player_ptr, r_idx))
575 if (!(r_ptr->flags3 & RF3_TROLL))
578 if (r_ptr->flags3 & RF3_UNDEAD)
585 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
586 * Helper function for "monster pit (giant)"
587 * @param r_idx 確認したいモンスター種族ID
588 * @return 生成必要条件を満たしているならTRUEを返す。
590 bool vault_aux_giant(player_type *player_ptr, MONRACE_IDX r_idx)
592 monster_race *r_ptr = &r_info[r_idx];
593 if (!vault_monster_okay(player_ptr, r_idx))
596 if (!(r_ptr->flags3 & RF3_GIANT))
599 if (r_ptr->flags3 & RF3_GOOD)
602 if (r_ptr->flags3 & RF3_UNDEAD)
609 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
610 * Helper function for "monster pit (dragon)"
611 * @param r_idx 確認したいモンスター種族ID
612 * @return 生成必要条件を満たしているならTRUEを返す。
614 bool vault_aux_dragon(player_type *player_ptr, MONRACE_IDX r_idx)
616 monster_race *r_ptr = &r_info[r_idx];
617 if (!vault_monster_okay(player_ptr, r_idx))
620 if (!(r_ptr->flags3 & RF3_DRAGON))
623 if (r_ptr->flags4 != vault_aux_dragon_mask4)
626 if (r_ptr->flags3 & RF3_UNDEAD)
633 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
634 * Helper function for "monster pit (demon)"
635 * @param r_idx 確認したいモンスター種族ID
636 * @return 生成必要条件を満たしているならTRUEを返す。
638 bool vault_aux_demon(player_type *player_ptr, MONRACE_IDX r_idx)
640 monster_race *r_ptr = &r_info[r_idx];
641 if (!vault_monster_okay(player_ptr, r_idx))
644 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
647 if (!(r_ptr->flags3 & RF3_DEMON))
654 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
655 * Helper function for "monster pit (lovecraftian)"
656 * @param r_idx 確認したいモンスター種族ID
657 * @return 生成必要条件を満たしているならTRUEを返す。
659 bool vault_aux_cthulhu(player_type *player_ptr, MONRACE_IDX r_idx)
661 monster_race *r_ptr = &r_info[r_idx];
662 if (!vault_monster_okay(player_ptr, r_idx))
665 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
668 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
675 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
676 * Helper function for "monster pit (dark elf)"
677 * @param r_idx 確認したいモンスター種族ID
678 * @return 生成必要条件を満たしているならTRUEを返す。
680 bool vault_aux_dark_elf(player_type *player_ptr, MONRACE_IDX r_idx)
682 static int dark_elf_list[] = {
696 if (!vault_monster_okay(player_ptr, r_idx))
699 for (int i = 0; dark_elf_list[i]; i++)
700 if (r_idx == dark_elf_list[i])
707 * @brief モンスターが生命体かどうかを返す
708 * Is the monster "alive"?
709 * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
710 * @return 生命体ならばTRUEを返す
712 * Used to determine the message to print for a killed monster.
713 * ("dies", "destroyed")
715 bool monster_living(MONRACE_IDX r_idx)
717 monster_race *r_ptr = &r_info[r_idx];
718 return (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING)) == 0;
722 * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
723 * Is the monster "alive"? / Is this monster declined to be questor or bounty?
724 * @param r_idx モンスターの種族ID
725 * @return 賞金首に加えられないならばTRUEを返す
729 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
733 * Decline them to be questor or bounty because they use
734 * special motion "split and combine"
736 case MON_BANORLUPART:
746 * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
747 * @param r_idx モンスターID
748 * @return 死体を食べられるならTRUEを返す。
750 bool monster_hook_human(player_type *player_ptr, MONRACE_IDX r_idx)
755 monster_race *r_ptr = &r_info[r_idx];
756 if (r_ptr->flags1 & (RF1_UNIQUE))
759 if (angband_strchr("pht", r_ptr->d_char))
766 * @brief 悪夢の元凶となるモンスターかどうかを返す。
767 * @param r_idx 判定対象となるモンスターのID
768 * @return 悪夢の元凶となり得るか否か。
770 bool get_nightmare(player_type *player_ptr, MONRACE_IDX r_idx)
772 monster_race *r_ptr = &r_info[r_idx];
773 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
776 if (r_ptr->level <= player_ptr->lev)
783 * @brief モンスター種族が釣れる種族かどうかを判定する。
784 * @param r_idx 判定したいモンスター種族のID
785 * @return 釣れる対象ならばTRUEを返す
787 bool monster_is_fishing_target(player_type *player_ptr, MONRACE_IDX r_idx)
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))
800 * @brief モンスター闘技場に参加できるモンスターの判定
801 * @param r_idx モンスターID
802 * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
803 * 自爆以外のなんらかのHP攻撃手段を持っていること。
806 bool monster_can_entry_arena(player_type *player_ptr, MONRACE_IDX r_idx)
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;
821 for (int i = 0; i < 4; i++) {
822 if (r_ptr->blow[i].method == RBM_EXPLODE)
825 if (r_ptr->blow[i].effect != RBE_DR_MANA)
826 dam += r_ptr->blow[i].d_dice;
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)))
838 * @brief モンスターが人形のベースにできるかを返す
839 * @param r_idx チェックしたいモンスター種族のID
840 * @return 人形にできるならTRUEを返す
842 bool item_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
847 monster_race *r_ptr = &r_info[r_idx];
848 if (r_ptr->flags1 & RF1_UNIQUE)
851 if (r_ptr->flags7 & RF7_KAGE)
854 if (r_ptr->flagsr & RFR_RES_ALL)
857 if (r_ptr->flags7 & RF7_NAZGUL)
860 if (r_ptr->flags1 & RF1_FORCE_DEPTH)
863 if (r_ptr->flags7 & RF7_UNIQUE2)
870 * vaultに配置可能なモンスターの条件を指定する / Monster validation
871 * @param r_idx モンスター種別ID
872 * @param Vaultに配置可能であればTRUE
874 * Line 1 -- forbid town monsters
875 * Line 2 -- forbid uniques
876 * Line 3 -- forbid aquatic monsters
878 bool vault_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
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)
882 && !(r_info[r_idx].flags7 & RF7_AQUATIC));