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"
23 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
26 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
29 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
30 EnumClassFlagGroup<MonsterAbilityType> vault_aux_dragon_mask4;
33 * @brief pit/nestの基準となる単種モンスターを決める /
34 * @param player_ptr プレイヤーへの参照ポインタ
36 void vault_prep_clone(PlayerType *player_ptr)
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);
44 * @brief pit/nestの基準となるモンスターシンボルを決める /
45 * @param player_ptr プレイヤーへの参照ポインタ
47 void vault_prep_symbol(PlayerType *player_ptr)
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;
56 * @brief pit/nestの基準となるドラゴンの種類を決める /
57 * @param player_ptr プレイヤーへの参照ポインタ
59 void vault_prep_dragon(PlayerType *player_ptr)
64 vault_aux_dragon_mask4.clear();
65 switch (randint0(6)) {
67 vault_aux_dragon_mask4.set(MonsterAbilityType::BR_ACID);
70 vault_aux_dragon_mask4.set(MonsterAbilityType::BR_ELEC);
73 vault_aux_dragon_mask4.set(MonsterAbilityType::BR_FIRE);
76 vault_aux_dragon_mask4.set(MonsterAbilityType::BR_COLD);
79 vault_aux_dragon_mask4.set(MonsterAbilityType::BR_POIS);
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 });
88 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
89 * @param r_idx モンスターID
90 * @return 討伐対象にできるならTRUEを返す。
92 bool mon_hook_quest(PlayerType *player_ptr, MONRACE_IDX r_idx)
97 auto *r_ptr = &r_info[r_idx];
98 if (any_bits(r_ptr->flags8, RF8_WILD_ONLY))
101 if (any_bits(r_ptr->flags7, RF7_AQUATIC))
104 if (any_bits(r_ptr->flags2, RF2_MULTIPLY))
107 if (r_ptr->behavior_flags.has(MonsterBehaviorType::FRIENDLY))
114 * @brief モンスターがダンジョンに出現するかどうかを返す
115 * @param r_idx 判定するモンスターの種族ID
116 * @return ダンジョンに出現するならばTRUEを返す
119 * 地上は常にTRUE(荒野の出現は別hookで絞るため)。
120 * 荒野限定(WILD_ONLY)の場合、荒野の山に出るモンスターにのみダンジョンの山に出現を許可する。
121 * その他の場合、山及び火山以外のダンジョンでは全てのモンスターに出現を許可する。
122 * ダンジョンが山の場合は、荒野の山(WILD_MOUNTAIN)に出ない水棲動物(AQUATIC)は許可しない。
123 * ダンジョンが火山の場合は、荒野の火山(WILD_VOLCANO)に出ない水棲動物(AQUATIC)は許可しない。
126 bool mon_hook_dungeon(PlayerType *player_ptr, MONRACE_IDX r_idx)
128 if (!is_in_dungeon(player_ptr) && !inside_quest(player_ptr->current_floor_ptr->quest_number))
131 auto *r_ptr = &r_info[r_idx];
132 dungeon_type *d_ptr = &d_info[player_ptr->dungeon_idx];
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);
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)));
142 * @brief モンスターが海洋に出現するかどうかを返す
143 * @param r_idx 判定するモンスターの種族ID
144 * @return 海洋に出現するならばTRUEを返す
146 bool mon_hook_ocean(PlayerType *player_ptr, MONRACE_IDX r_idx)
151 auto *r_ptr = &r_info[r_idx];
152 return any_bits(r_ptr->flags8, RF8_WILD_OCEAN);
156 * @brief モンスターが海岸に出現するかどうかを返す
157 * @param r_idx 判定するモンスターの種族ID
158 * @return 海岸に出現するならばTRUEを返す
160 bool mon_hook_shore(PlayerType *player_ptr, MONRACE_IDX r_idx)
165 auto *r_ptr = &r_info[r_idx];
166 return any_bits(r_ptr->flags8, RF8_WILD_SHORE);
170 * @brief モンスターが荒地に出現するかどうかを返す
171 * @param r_idx 判定するモンスターの種族ID
172 * @return 荒地に出現するならばTRUEを返す
174 bool mon_hook_waste(PlayerType *player_ptr, MONRACE_IDX r_idx)
179 auto *r_ptr = &r_info[r_idx];
180 return any_bits(r_ptr->flags8, (RF8_WILD_WASTE | RF8_WILD_ALL));
184 * @brief モンスターが町に出現するかどうかを返す
185 * @param r_idx 判定するモンスターの種族ID
186 * @return 荒地に出現するならばTRUEを返す
188 bool mon_hook_town(PlayerType *player_ptr, MONRACE_IDX r_idx)
193 auto *r_ptr = &r_info[r_idx];
194 return any_bits(r_ptr->flags8, (RF8_WILD_TOWN | RF8_WILD_ALL));
198 * @brief モンスターが森林に出現するかどうかを返す
199 * @param r_idx 判定するモンスターの種族ID
200 * @return 森林に出現するならばTRUEを返す
202 bool mon_hook_wood(PlayerType *player_ptr, MONRACE_IDX r_idx)
207 auto *r_ptr = &r_info[r_idx];
208 return any_bits(r_ptr->flags8, (RF8_WILD_WOOD | RF8_WILD_ALL));
212 * @brief モンスターが火山に出現するかどうかを返す
213 * @param r_idx 判定するモンスターの種族ID
214 * @return 火山に出現するならばTRUEを返す
216 bool mon_hook_volcano(PlayerType *player_ptr, MONRACE_IDX r_idx)
221 auto *r_ptr = &r_info[r_idx];
222 return any_bits(r_ptr->flags8, RF8_WILD_VOLCANO);
226 * @brief モンスターが山地に出現するかどうかを返す
227 * @param r_idx 判定するモンスターの種族ID
228 * @return 山地に出現するならばTRUEを返す
230 bool mon_hook_mountain(PlayerType *player_ptr, MONRACE_IDX r_idx)
235 auto *r_ptr = &r_info[r_idx];
236 return any_bits(r_ptr->flags8, RF8_WILD_MOUNTAIN);
240 * @brief モンスターが草原に出現するかどうかを返す
241 * @param r_idx 判定するモンスターの種族ID
242 * @return 森林に出現するならばTRUEを返す
244 bool mon_hook_grass(PlayerType *player_ptr, MONRACE_IDX r_idx)
249 auto *r_ptr = &r_info[r_idx];
250 return any_bits(r_ptr->flags8, (RF8_WILD_GRASS | RF8_WILD_ALL));
254 * @brief モンスターが深い水地形に出現するかどうかを返す
255 * @param r_idx 判定するモンスターの種族ID
256 * @return 深い水地形に出現するならばTRUEを返す
258 bool mon_hook_deep_water(PlayerType *player_ptr, MONRACE_IDX r_idx)
260 auto *r_ptr = &r_info[r_idx];
261 if (!mon_hook_dungeon(player_ptr, r_idx))
264 return any_bits(r_ptr->flags7, RF7_AQUATIC);
268 * @brief モンスターが浅い水地形に出現するかどうかを返す
269 * @param r_idx 判定するモンスターの種族ID
270 * @return 浅い水地形に出現するならばTRUEを返す
272 bool mon_hook_shallow_water(PlayerType *player_ptr, MONRACE_IDX r_idx)
274 auto *r_ptr = &r_info[r_idx];
275 if (!mon_hook_dungeon(player_ptr, r_idx))
278 return r_ptr->aura_flags.has_not(MonsterAuraType::FIRE);
282 * @brief モンスターが溶岩地形に出現するかどうかを返す
283 * @param r_idx 判定するモンスターの種族ID
284 * @return 溶岩地形に出現するならばTRUEを返す
286 bool mon_hook_lava(PlayerType *player_ptr, MONRACE_IDX r_idx)
288 auto *r_ptr = &r_info[r_idx];
289 if (!mon_hook_dungeon(player_ptr, r_idx))
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);
296 * @brief モンスターが通常の床地形に出現するかどうかを返す
297 * @param r_idx 判定するモンスターの種族ID
298 * @return 通常の床地形に出現するならばTRUEを返す
300 bool mon_hook_floor(PlayerType *player_ptr, MONRACE_IDX r_idx)
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))
313 * Helper function for "glass room"
315 bool vault_aux_lite(PlayerType *player_ptr, MONRACE_IDX r_idx)
320 auto *r_ptr = &r_info[r_idx];
321 if (!vault_monster_okay(player_ptr, r_idx))
324 if (r_ptr->ability_flags.has_none_of({ MonsterAbilityType::BR_LITE, MonsterAbilityType::BA_LITE }))
327 if (any_bits(r_ptr->flags2, (RF2_PASS_WALL | RF2_KILL_WALL)))
330 if (r_ptr->ability_flags.has(MonsterAbilityType::BR_DISI))
337 * Helper function for "glass room"
339 bool vault_aux_shards(PlayerType *player_ptr, MONRACE_IDX r_idx)
341 auto *r_ptr = &r_info[r_idx];
342 if (!vault_monster_okay(player_ptr, r_idx))
345 if (r_ptr->ability_flags.has_not(MonsterAbilityType::BR_SHAR))
352 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
353 * Helper monster selection function
354 * @param r_idx 確認したいモンスター種族ID
355 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
357 bool vault_aux_simple(PlayerType *player_ptr, MONRACE_IDX r_idx)
362 return vault_monster_okay(player_ptr, r_idx);
366 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
367 * Helper function for "monster nest (jelly)"
368 * @param r_idx 確認したいモンスター種族ID
369 * @return 生成必要条件を満たしているならTRUEを返す。
371 bool vault_aux_jelly(PlayerType *player_ptr, MONRACE_IDX r_idx)
373 auto *r_ptr = &r_info[r_idx];
374 if (!vault_monster_okay(player_ptr, r_idx))
377 if (r_ptr->behavior_flags.has(MonsterBehaviorType::KILL_BODY) && r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW))
380 if (r_ptr->kind_flags.has(MonsterKindType::EVIL))
383 if (!angband_strchr("ijm,", r_ptr->d_char))
390 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
391 * Helper function for "monster nest (animal)"
392 * @param r_idx 確認したいモンスター種族ID
393 * @return 生成必要条件を満たしているならTRUEを返す。
395 bool vault_aux_animal(PlayerType *player_ptr, MONRACE_IDX r_idx)
397 auto *r_ptr = &r_info[r_idx];
398 if (!vault_monster_okay(player_ptr, r_idx))
401 if (r_ptr->kind_flags.has_not(MonsterKindType::ANIMAL))
408 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
409 * Helper function for "monster nest (undead)"
410 * @param r_idx 確認したいモンスター種族ID
411 * @return 生成必要条件を満たしているならTRUEを返す。
413 bool vault_aux_undead(PlayerType *player_ptr, MONRACE_IDX r_idx)
415 auto *r_ptr = &r_info[r_idx];
416 if (!vault_monster_okay(player_ptr, r_idx))
419 if (r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD))
426 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
427 * Helper function for "monster nest (chapel)"
428 * @param r_idx 確認したいモンスター種族ID
429 * @return 生成必要条件を満たしているならTRUEを返す。
431 bool vault_aux_chapel_g(PlayerType *player_ptr, MONRACE_IDX r_idx)
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 };
436 auto *r_ptr = &r_info[r_idx];
437 if (!vault_monster_okay(player_ptr, r_idx))
440 if (r_ptr->kind_flags.has(MonsterKindType::EVIL))
443 if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER))
446 if (r_ptr->d_char == 'A')
449 for (int i = 0; chapel_list[i]; i++)
450 if (r_idx == chapel_list[i])
457 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
458 * Helper function for "monster nest (kennel)"
459 * @param r_idx 確認したいモンスター種族ID
460 * @return 生成必要条件を満たしているならTRUEを返す。
462 bool vault_aux_kennel(PlayerType *player_ptr, MONRACE_IDX r_idx)
464 auto *r_ptr = &r_info[r_idx];
465 if (!vault_monster_okay(player_ptr, r_idx))
468 if (!angband_strchr("CZ", r_ptr->d_char))
475 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
476 * Helper function for "monster nest (mimic)"
477 * @param r_idx 確認したいモンスター種族ID
478 * @return 生成必要条件を満たしているならTRUEを返す。
480 bool vault_aux_mimic(PlayerType *player_ptr, MONRACE_IDX r_idx)
482 auto *r_ptr = &r_info[r_idx];
483 if (!vault_monster_okay(player_ptr, r_idx))
486 if (!angband_strchr("!$&(/=?[\\|][`~>+", r_ptr->d_char))
493 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
494 * Helper function for "monster nest (clone)"
495 * @param r_idx 確認したいモンスター種族ID
496 * @return 生成必要条件を満たしているならTRUEを返す。
498 bool vault_aux_clone(PlayerType *player_ptr, MONRACE_IDX r_idx)
500 if (!vault_monster_okay(player_ptr, r_idx))
503 return r_idx == vault_aux_race;
507 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
508 * Helper function for "monster nest (symbol clone)"
509 * @param r_idx 確認したいモンスター種族ID
510 * @return 生成必要条件を満たしているならTRUEを返す。
512 bool vault_aux_symbol_e(PlayerType *player_ptr, MONRACE_IDX r_idx)
514 auto *r_ptr = &r_info[r_idx];
515 if (!vault_monster_okay(player_ptr, r_idx))
518 if (r_ptr->behavior_flags.has(MonsterBehaviorType::KILL_BODY) && r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW))
521 if (r_ptr->kind_flags.has(MonsterKindType::GOOD))
524 if (r_ptr->d_char != vault_aux_char)
531 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
532 * Helper function for "monster nest (symbol clone)"
533 * @param r_idx 確認したいモンスター種族ID
534 * @return 生成必要条件を満たしているならTRUEを返す。
536 bool vault_aux_symbol_g(PlayerType *player_ptr, MONRACE_IDX r_idx)
538 auto *r_ptr = &r_info[r_idx];
539 if (!vault_monster_okay(player_ptr, r_idx))
542 if (r_ptr->behavior_flags.has(MonsterBehaviorType::KILL_BODY) && r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW))
545 if (r_ptr->kind_flags.has(MonsterKindType::EVIL))
548 if (r_ptr->d_char != vault_aux_char)
555 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
556 * Helper function for "monster pit (orc)"
557 * @param r_idx 確認したいモンスター種族ID
558 * @return 生成必要条件を満たしているならTRUEを返す。
560 bool vault_aux_orc(PlayerType *player_ptr, MONRACE_IDX r_idx)
562 auto *r_ptr = &r_info[r_idx];
563 if (!vault_monster_okay(player_ptr, r_idx))
566 if (r_ptr->kind_flags.has_not(MonsterKindType::ORC))
569 if (r_ptr->kind_flags.has(MonsterKindType::UNDEAD))
576 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
577 * Helper function for "monster pit (troll)"
578 * @param r_idx 確認したいモンスター種族ID
579 * @return 生成必要条件を満たしているならTRUEを返す。
581 bool vault_aux_troll(PlayerType *player_ptr, MONRACE_IDX r_idx)
583 auto *r_ptr = &r_info[r_idx];
584 if (!vault_monster_okay(player_ptr, r_idx))
587 if (r_ptr->kind_flags.has_not(MonsterKindType::TROLL))
590 if (r_ptr->kind_flags.has(MonsterKindType::UNDEAD))
597 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
598 * Helper function for "monster pit (giant)"
599 * @param r_idx 確認したいモンスター種族ID
600 * @return 生成必要条件を満たしているならTRUEを返す。
602 bool vault_aux_giant(PlayerType *player_ptr, MONRACE_IDX r_idx)
604 auto *r_ptr = &r_info[r_idx];
605 if (!vault_monster_okay(player_ptr, r_idx))
608 if (r_ptr->kind_flags.has_not(MonsterKindType::GIANT))
611 if (r_ptr->kind_flags.has(MonsterKindType::GOOD))
614 if (r_ptr->kind_flags.has(MonsterKindType::UNDEAD))
621 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
622 * Helper function for "monster pit (dragon)"
623 * @param r_idx 確認したいモンスター種族ID
624 * @return 生成必要条件を満たしているならTRUEを返す。
626 bool vault_aux_dragon(PlayerType *player_ptr, MONRACE_IDX r_idx)
628 auto *r_ptr = &r_info[r_idx];
629 if (!vault_monster_okay(player_ptr, r_idx))
632 if (r_ptr->kind_flags.has_not(MonsterKindType::DRAGON))
635 if (r_ptr->kind_flags.has(MonsterKindType::UNDEAD))
638 auto flags = RF_ABILITY_BREATH_MASK;
639 flags.reset(vault_aux_dragon_mask4);
641 if (r_ptr->ability_flags.has_any_of(flags) || !r_ptr->ability_flags.has_all_of(vault_aux_dragon_mask4))
648 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
649 * Helper function for "monster pit (demon)"
650 * @param r_idx 確認したいモンスター種族ID
651 * @return 生成必要条件を満たしているならTRUEを返す。
653 bool vault_aux_demon(PlayerType *player_ptr, MONRACE_IDX r_idx)
655 auto *r_ptr = &r_info[r_idx];
656 if (!vault_monster_okay(player_ptr, r_idx))
659 if (r_ptr->behavior_flags.has(MonsterBehaviorType::KILL_BODY) && r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW))
662 if (r_ptr->kind_flags.has_not(MonsterKindType::DEMON))
669 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
670 * Helper function for "monster pit (lovecraftian)"
671 * @param r_idx 確認したいモンスター種族ID
672 * @return 生成必要条件を満たしているならTRUEを返す。
674 bool vault_aux_cthulhu(PlayerType *player_ptr, MONRACE_IDX r_idx)
676 auto *r_ptr = &r_info[r_idx];
677 if (!vault_monster_okay(player_ptr, r_idx))
680 if (r_ptr->behavior_flags.has(MonsterBehaviorType::KILL_BODY) && r_ptr->behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW))
683 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
690 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
691 * Helper function for "monster pit (dark elf)"
692 * @param r_idx 確認したいモンスター種族ID
693 * @return 生成必要条件を満たしているならTRUEを返す。
695 bool vault_aux_dark_elf(PlayerType *player_ptr, MONRACE_IDX r_idx)
697 static int dark_elf_list[] = {
711 if (!vault_monster_okay(player_ptr, r_idx))
714 for (int i = 0; dark_elf_list[i]; i++)
715 if (r_idx == dark_elf_list[i])
722 * @brief モンスターが生命体かどうかを返す
723 * Is the monster "alive"?
724 * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
725 * @return 生命体ならばTRUEを返す
727 * Used to determine the message to print for a killed monster.
728 * ("dies", "destroyed")
730 bool monster_living(MONRACE_IDX r_idx)
732 auto *r_ptr = &r_info[r_idx];
733 return r_ptr->kind_flags.has_none_of({ MonsterKindType::DEMON, MonsterKindType::UNDEAD, MonsterKindType::NONLIVING });
737 * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
738 * Is the monster "alive"? / Is this monster declined to be questor or bounty?
739 * @param r_idx モンスターの種族ID
740 * @return 賞金首に加えられないならばTRUEを返す
744 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
748 * Decline them to be questor or bounty because they use
749 * special motion "split and combine"
751 case MON_BANORLUPART:
761 * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
762 * @param r_idx モンスターID
763 * @return 死体を食べられるならTRUEを返す。
765 bool monster_hook_human(PlayerType *player_ptr, MONRACE_IDX r_idx)
770 auto *r_ptr = &r_info[r_idx];
771 if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE))
774 if (angband_strchr("pht", r_ptr->d_char))
781 * @brief 悪夢の元凶となるモンスターかどうかを返す。
782 * @param r_idx 判定対象となるモンスターのID
783 * @return 悪夢の元凶となり得るか否か。
785 bool get_nightmare(PlayerType *player_ptr, MONRACE_IDX r_idx)
787 auto *r_ptr = &r_info[r_idx];
788 if (none_bits(r_ptr->flags2, RF2_ELDRITCH_HORROR))
791 if (r_ptr->level <= player_ptr->lev)
798 * @brief モンスター種族が釣れる種族かどうかを判定する。
799 * @param r_idx 判定したいモンスター種族のID
800 * @return 釣れる対象ならばTRUEを返す
802 bool monster_is_fishing_target(PlayerType *player_ptr, MONRACE_IDX r_idx)
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))
815 * @brief モンスター闘技場に参加できるモンスターの判定
816 * @param r_idx モンスターID
817 * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
818 * 自爆以外のなんらかのHP攻撃手段を持っていること。
821 bool monster_can_entry_arena(PlayerType *player_ptr, MONRACE_IDX r_idx)
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);
836 for (int i = 0; i < 4; i++) {
837 if (r_ptr->blow[i].method == RaceBlowMethodType::EXPLODE)
840 if (r_ptr->blow[i].effect != RaceBlowEffectType::DR_MANA)
841 dam += r_ptr->blow[i].d_dice;
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))
851 * モンスターが人形のベースにできるかを返す
852 * @param r_idx チェックしたいモンスター種族のID
853 * @return 人形にできるならTRUEを返す
855 bool item_monster_okay(PlayerType *player_ptr, MONRACE_IDX r_idx)
860 auto *r_ptr = &r_info[r_idx];
861 if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE))
864 if (any_bits(r_ptr->flags7, RF7_KAGE))
867 if (any_bits(r_ptr->flagsr, RFR_RES_ALL))
870 if (any_bits(r_ptr->flags7, RF7_NAZGUL))
873 if (any_bits(r_ptr->flags1, RF1_FORCE_DEPTH))
876 if (any_bits(r_ptr->flags7, RF7_UNIQUE2))
883 * vaultに配置可能なモンスターの条件を指定する / Monster validation
884 * @param r_idx モンスター種別ID
885 * @param Vaultに配置可能であればTRUE
887 * Line 1 -- forbid town monsters
888 * Line 2 -- forbid uniques
889 * Line 3 -- forbid aquatic monsters
891 bool vault_monster_okay(PlayerType *player_ptr, MONRACE_IDX r_idx)
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);