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"
20 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
23 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
26 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
27 FlagGroup<RF_ABILITY> vault_aux_dragon_mask4;
30 * @brief pit/nestの基準となる単種モンスターを決める /
31 * @param player_ptr プレーヤーへの参照ポインタ
34 void vault_prep_clone(player_type *player_ptr)
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);
42 * @brief pit/nestの基準となるモンスターシンボルを決める /
43 * @param player_ptr プレーヤーへの参照ポインタ
46 void vault_prep_symbol(player_type *player_ptr)
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;
55 * @brief pit/nestの基準となるドラゴンの種類を決める /
56 * @param player_ptr プレーヤーへの参照ポインタ
59 void vault_prep_dragon(player_type *player_ptr)
64 vault_aux_dragon_mask4.clear();
65 switch (randint0(6)) {
67 vault_aux_dragon_mask4.set(RF_ABILITY::BR_ACID);
70 vault_aux_dragon_mask4.set(RF_ABILITY::BR_ELEC);
73 vault_aux_dragon_mask4.set(RF_ABILITY::BR_FIRE);
76 vault_aux_dragon_mask4.set(RF_ABILITY::BR_COLD);
79 vault_aux_dragon_mask4.set(RF_ABILITY::BR_POIS);
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 });
88 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
89 * @param r_idx モンスターID
90 * @return 討伐対象にできるならTRUEを返す。
92 bool mon_hook_quest(player_type *player_ptr, MONRACE_IDX r_idx)
97 monster_race *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 (any_bits(r_ptr->flags7, RF7_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(player_type *player_ptr, MONRACE_IDX r_idx)
128 if (!is_in_dungeon(player_ptr) && !player_ptr->current_floor_ptr->inside_quest)
131 monster_race *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)
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)));
144 * @brief モンスターが海洋に出現するかどうかを返す
145 * @param r_idx 判定するモンスターの種族ID
146 * @return 海洋に出現するならばTRUEを返す
148 bool mon_hook_ocean(player_type *player_ptr, MONRACE_IDX r_idx)
153 monster_race *r_ptr = &r_info[r_idx];
154 return any_bits(r_ptr->flags8, RF8_WILD_OCEAN);
158 * @brief モンスターが海岸に出現するかどうかを返す
159 * @param r_idx 判定するモンスターの種族ID
160 * @return 海岸に出現するならばTRUEを返す
162 bool mon_hook_shore(player_type *player_ptr, MONRACE_IDX r_idx)
167 monster_race *r_ptr = &r_info[r_idx];
168 return any_bits(r_ptr->flags8, RF8_WILD_SHORE);
172 * @brief モンスターが荒地に出現するかどうかを返す
173 * @param r_idx 判定するモンスターの種族ID
174 * @return 荒地に出現するならばTRUEを返す
176 bool mon_hook_waste(player_type *player_ptr, MONRACE_IDX r_idx)
181 monster_race *r_ptr = &r_info[r_idx];
182 return any_bits(r_ptr->flags8, (RF8_WILD_WASTE | RF8_WILD_ALL));
186 * @brief モンスターが町に出現するかどうかを返す
187 * @param r_idx 判定するモンスターの種族ID
188 * @return 荒地に出現するならばTRUEを返す
190 bool mon_hook_town(player_type *player_ptr, MONRACE_IDX r_idx)
195 monster_race *r_ptr = &r_info[r_idx];
196 return any_bits(r_ptr->flags8, (RF8_WILD_TOWN | RF8_WILD_ALL));
200 * @brief モンスターが森林に出現するかどうかを返す
201 * @param r_idx 判定するモンスターの種族ID
202 * @return 森林に出現するならばTRUEを返す
204 bool mon_hook_wood(player_type *player_ptr, MONRACE_IDX r_idx)
209 monster_race *r_ptr = &r_info[r_idx];
210 return any_bits(r_ptr->flags8, (RF8_WILD_WOOD | RF8_WILD_ALL));
214 * @brief モンスターが火山に出現するかどうかを返す
215 * @param r_idx 判定するモンスターの種族ID
216 * @return 火山に出現するならばTRUEを返す
218 bool mon_hook_volcano(player_type *player_ptr, MONRACE_IDX r_idx)
223 monster_race *r_ptr = &r_info[r_idx];
224 return any_bits(r_ptr->flags8, RF8_WILD_VOLCANO);
228 * @brief モンスターが山地に出現するかどうかを返す
229 * @param r_idx 判定するモンスターの種族ID
230 * @return 山地に出現するならばTRUEを返す
232 bool mon_hook_mountain(player_type *player_ptr, MONRACE_IDX r_idx)
237 monster_race *r_ptr = &r_info[r_idx];
238 return any_bits(r_ptr->flags8, RF8_WILD_MOUNTAIN);
242 * @brief モンスターが草原に出現するかどうかを返す
243 * @param r_idx 判定するモンスターの種族ID
244 * @return 森林に出現するならばTRUEを返す
246 bool mon_hook_grass(player_type *player_ptr, MONRACE_IDX r_idx)
251 monster_race *r_ptr = &r_info[r_idx];
252 return any_bits(r_ptr->flags8, (RF8_WILD_GRASS | RF8_WILD_ALL));
256 * @brief モンスターが深い水地形に出現するかどうかを返す
257 * @param r_idx 判定するモンスターの種族ID
258 * @return 深い水地形に出現するならばTRUEを返す
260 bool mon_hook_deep_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 any_bits(r_ptr->flags7, RF7_AQUATIC);
270 * @brief モンスターが浅い水地形に出現するかどうかを返す
271 * @param r_idx 判定するモンスターの種族ID
272 * @return 浅い水地形に出現するならばTRUEを返す
274 bool mon_hook_shallow_water(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 none_bits(r_ptr->flags2, RF2_AURA_FIRE);
284 * @brief モンスターが溶岩地形に出現するかどうかを返す
285 * @param r_idx 判定するモンスターの種族ID
286 * @return 溶岩地形に出現するならばTRUEを返す
288 bool mon_hook_lava(player_type *player_ptr, MONRACE_IDX r_idx)
290 monster_race *r_ptr = &r_info[r_idx];
291 if (!mon_hook_dungeon(player_ptr, r_idx))
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);
298 * @brief モンスターが通常の床地形に出現するかどうかを返す
299 * @param r_idx 判定するモンスターの種族ID
300 * @return 通常の床地形に出現するならばTRUEを返す
302 bool mon_hook_floor(player_type *player_ptr, MONRACE_IDX r_idx)
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))
315 * Helper function for "glass room"
317 bool vault_aux_lite(player_type *player_ptr, MONRACE_IDX r_idx)
322 monster_race *r_ptr = &r_info[r_idx];
323 if (!vault_monster_okay(player_ptr, r_idx))
326 if (r_ptr->ability_flags.has_none_of({ RF_ABILITY::BR_LITE, RF_ABILITY::BA_LITE }))
329 if (any_bits(r_ptr->flags2, (RF2_PASS_WALL | RF2_KILL_WALL)))
332 if (r_ptr->ability_flags.has(RF_ABILITY::BR_DISI))
339 * Helper function for "glass room"
341 bool vault_aux_shards(player_type *player_ptr, MONRACE_IDX r_idx)
343 monster_race *r_ptr = &r_info[r_idx];
344 if (!vault_monster_okay(player_ptr, r_idx))
347 if (r_ptr->ability_flags.has_not(RF_ABILITY::BR_SHAR))
354 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
355 * Helper monster selection function
356 * @param r_idx 確認したいモンスター種族ID
357 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
359 bool vault_aux_simple(player_type *player_ptr, MONRACE_IDX r_idx)
364 return (vault_monster_okay(player_ptr, r_idx));
368 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
369 * Helper function for "monster nest (jelly)"
370 * @param r_idx 確認したいモンスター種族ID
371 * @return 生成必要条件を満たしているならTRUEを返す。
373 bool vault_aux_jelly(player_type *player_ptr, MONRACE_IDX r_idx)
375 monster_race *r_ptr = &r_info[r_idx];
376 if (!vault_monster_okay(player_ptr, r_idx))
379 if (any_bits(r_ptr->flags2, RF2_KILL_BODY) && none_bits(r_ptr->flags1, RF1_NEVER_BLOW))
382 if (any_bits(r_ptr->flags3, RF3_EVIL))
385 if (!angband_strchr("ijm,", r_ptr->d_char))
392 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
393 * Helper function for "monster nest (animal)"
394 * @param r_idx 確認したいモンスター種族ID
395 * @return 生成必要条件を満たしているならTRUEを返す。
397 bool vault_aux_animal(player_type *player_ptr, MONRACE_IDX r_idx)
399 monster_race *r_ptr = &r_info[r_idx];
400 if (!vault_monster_okay(player_ptr, r_idx))
403 if (none_bits(r_ptr->flags3, RF3_ANIMAL))
410 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
411 * Helper function for "monster nest (undead)"
412 * @param r_idx 確認したいモンスター種族ID
413 * @return 生成必要条件を満たしているならTRUEを返す。
415 bool vault_aux_undead(player_type *player_ptr, MONRACE_IDX r_idx)
417 monster_race *r_ptr = &r_info[r_idx];
418 if (!vault_monster_okay(player_ptr, r_idx))
421 if (none_bits(r_ptr->flags3, RF3_UNDEAD))
428 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
429 * Helper function for "monster nest (chapel)"
430 * @param r_idx 確認したいモンスター種族ID
431 * @return 生成必要条件を満たしているならTRUEを返す。
433 bool vault_aux_chapel_g(player_type *player_ptr, MONRACE_IDX r_idx)
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 };
438 monster_race *r_ptr = &r_info[r_idx];
439 if (!vault_monster_okay(player_ptr, r_idx))
442 if (any_bits(r_ptr->flags3, RF3_EVIL))
445 if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER))
448 if (r_ptr->d_char == 'A')
451 for (int i = 0; chapel_list[i]; i++)
452 if (r_idx == chapel_list[i])
459 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
460 * Helper function for "monster nest (kennel)"
461 * @param r_idx 確認したいモンスター種族ID
462 * @return 生成必要条件を満たしているならTRUEを返す。
464 bool vault_aux_kennel(player_type *player_ptr, MONRACE_IDX r_idx)
466 monster_race *r_ptr = &r_info[r_idx];
467 if (!vault_monster_okay(player_ptr, r_idx))
470 if (!angband_strchr("CZ", r_ptr->d_char))
477 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
478 * Helper function for "monster nest (mimic)"
479 * @param r_idx 確認したいモンスター種族ID
480 * @return 生成必要条件を満たしているならTRUEを返す。
482 bool vault_aux_mimic(player_type *player_ptr, MONRACE_IDX r_idx)
484 monster_race *r_ptr = &r_info[r_idx];
485 if (!vault_monster_okay(player_ptr, r_idx))
488 if (!angband_strchr("!$&(/=?[\\|][`~>+", r_ptr->d_char))
495 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
496 * Helper function for "monster nest (clone)"
497 * @param r_idx 確認したいモンスター種族ID
498 * @return 生成必要条件を満たしているならTRUEを返す。
500 bool vault_aux_clone(player_type *player_ptr, MONRACE_IDX r_idx)
502 if (!vault_monster_okay(player_ptr, r_idx))
505 return (r_idx == vault_aux_race);
509 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
510 * Helper function for "monster nest (symbol clone)"
511 * @param r_idx 確認したいモンスター種族ID
512 * @return 生成必要条件を満たしているならTRUEを返す。
514 bool vault_aux_symbol_e(player_type *player_ptr, MONRACE_IDX r_idx)
516 monster_race *r_ptr = &r_info[r_idx];
517 if (!vault_monster_okay(player_ptr, r_idx))
520 if (any_bits(r_ptr->flags2, RF2_KILL_BODY) && none_bits(r_ptr->flags1, RF1_NEVER_BLOW))
523 if (any_bits(r_ptr->flags3, RF3_GOOD))
526 if (r_ptr->d_char != vault_aux_char)
533 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
534 * Helper function for "monster nest (symbol clone)"
535 * @param r_idx 確認したいモンスター種族ID
536 * @return 生成必要条件を満たしているならTRUEを返す。
538 bool vault_aux_symbol_g(player_type *player_ptr, MONRACE_IDX r_idx)
540 monster_race *r_ptr = &r_info[r_idx];
541 if (!vault_monster_okay(player_ptr, r_idx))
544 if (any_bits(r_ptr->flags2, RF2_KILL_BODY) && none_bits(r_ptr->flags1, RF1_NEVER_BLOW))
547 if (any_bits(r_ptr->flags3, RF3_EVIL))
550 if (r_ptr->d_char != vault_aux_char)
557 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
558 * Helper function for "monster pit (orc)"
559 * @param r_idx 確認したいモンスター種族ID
560 * @return 生成必要条件を満たしているならTRUEを返す。
562 bool vault_aux_orc(player_type *player_ptr, MONRACE_IDX r_idx)
564 monster_race *r_ptr = &r_info[r_idx];
565 if (!vault_monster_okay(player_ptr, r_idx))
568 if (none_bits(r_ptr->flags3, RF3_ORC))
571 if (any_bits(r_ptr->flags3, RF3_UNDEAD))
578 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
579 * Helper function for "monster pit (troll)"
580 * @param r_idx 確認したいモンスター種族ID
581 * @return 生成必要条件を満たしているならTRUEを返す。
583 bool vault_aux_troll(player_type *player_ptr, MONRACE_IDX r_idx)
585 monster_race *r_ptr = &r_info[r_idx];
586 if (!vault_monster_okay(player_ptr, r_idx))
589 if (none_bits(r_ptr->flags3, RF3_TROLL))
592 if (any_bits(r_ptr->flags3, RF3_UNDEAD))
599 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
600 * Helper function for "monster pit (giant)"
601 * @param r_idx 確認したいモンスター種族ID
602 * @return 生成必要条件を満たしているならTRUEを返す。
604 bool vault_aux_giant(player_type *player_ptr, MONRACE_IDX r_idx)
606 monster_race *r_ptr = &r_info[r_idx];
607 if (!vault_monster_okay(player_ptr, r_idx))
610 if (none_bits(r_ptr->flags3, RF3_GIANT))
613 if (any_bits(r_ptr->flags3, RF3_GOOD))
616 if (any_bits(r_ptr->flags3, RF3_UNDEAD))
623 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
624 * Helper function for "monster pit (dragon)"
625 * @param r_idx 確認したいモンスター種族ID
626 * @return 生成必要条件を満たしているならTRUEを返す。
628 bool vault_aux_dragon(player_type *player_ptr, MONRACE_IDX r_idx)
630 monster_race *r_ptr = &r_info[r_idx];
631 if (!vault_monster_okay(player_ptr, r_idx))
634 if (none_bits(r_ptr->flags3, RF3_DRAGON))
637 if (any_bits(r_ptr->flags3, RF3_UNDEAD))
640 auto flags = RF_ABILITY_BREATH_MASK;
641 flags.reset(vault_aux_dragon_mask4);
643 if (r_ptr->ability_flags.has_any_of(flags) || !r_ptr->ability_flags.has_all_of(vault_aux_dragon_mask4))
650 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
651 * Helper function for "monster pit (demon)"
652 * @param r_idx 確認したいモンスター種族ID
653 * @return 生成必要条件を満たしているならTRUEを返す。
655 bool vault_aux_demon(player_type *player_ptr, MONRACE_IDX r_idx)
657 monster_race *r_ptr = &r_info[r_idx];
658 if (!vault_monster_okay(player_ptr, r_idx))
661 if (any_bits(r_ptr->flags2, RF2_KILL_BODY) && none_bits(r_ptr->flags1, RF1_NEVER_BLOW))
664 if (none_bits(r_ptr->flags3, RF3_DEMON))
671 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
672 * Helper function for "monster pit (lovecraftian)"
673 * @param r_idx 確認したいモンスター種族ID
674 * @return 生成必要条件を満たしているならTRUEを返す。
676 bool vault_aux_cthulhu(player_type *player_ptr, MONRACE_IDX r_idx)
678 monster_race *r_ptr = &r_info[r_idx];
679 if (!vault_monster_okay(player_ptr, r_idx))
682 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
685 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
692 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
693 * Helper function for "monster pit (dark elf)"
694 * @param r_idx 確認したいモンスター種族ID
695 * @return 生成必要条件を満たしているならTRUEを返す。
697 bool vault_aux_dark_elf(player_type *player_ptr, MONRACE_IDX r_idx)
699 static int dark_elf_list[] = {
713 if (!vault_monster_okay(player_ptr, r_idx))
716 for (int i = 0; dark_elf_list[i]; i++)
717 if (r_idx == dark_elf_list[i])
724 * @brief モンスターが生命体かどうかを返す
725 * Is the monster "alive"?
726 * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
727 * @return 生命体ならばTRUEを返す
729 * Used to determine the message to print for a killed monster.
730 * ("dies", "destroyed")
732 bool monster_living(MONRACE_IDX r_idx)
734 monster_race *r_ptr = &r_info[r_idx];
735 return none_bits(r_ptr->flags3, (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING));
739 * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
740 * Is the monster "alive"? / Is this monster declined to be questor or bounty?
741 * @param r_idx モンスターの種族ID
742 * @return 賞金首に加えられないならばTRUEを返す
746 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
750 * Decline them to be questor or bounty because they use
751 * special motion "split and combine"
753 case MON_BANORLUPART:
763 * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
764 * @param r_idx モンスターID
765 * @return 死体を食べられるならTRUEを返す。
767 bool monster_hook_human(player_type *player_ptr, MONRACE_IDX r_idx)
772 monster_race *r_ptr = &r_info[r_idx];
773 if (any_bits(r_ptr->flags1, RF1_UNIQUE))
776 if (angband_strchr("pht", r_ptr->d_char))
783 * @brief 悪夢の元凶となるモンスターかどうかを返す。
784 * @param r_idx 判定対象となるモンスターのID
785 * @return 悪夢の元凶となり得るか否か。
787 bool get_nightmare(player_type *player_ptr, MONRACE_IDX r_idx)
789 monster_race *r_ptr = &r_info[r_idx];
790 if (none_bits(r_ptr->flags2, RF2_ELDRITCH_HORROR))
793 if (r_ptr->level <= player_ptr->lev)
800 * @brief モンスター種族が釣れる種族かどうかを判定する。
801 * @param r_idx 判定したいモンスター種族のID
802 * @return 釣れる対象ならばTRUEを返す
804 bool monster_is_fishing_target(player_type *player_ptr, MONRACE_IDX r_idx)
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))
817 * @brief モンスター闘技場に参加できるモンスターの判定
818 * @param r_idx モンスターID
819 * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
820 * 自爆以外のなんらかのHP攻撃手段を持っていること。
823 bool monster_can_entry_arena(player_type *player_ptr, MONRACE_IDX r_idx)
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);
838 for (int i = 0; i < 4; i++) {
839 if (r_ptr->blow[i].method == RBM_EXPLODE)
842 if (r_ptr->blow[i].effect != RBE_DR_MANA)
843 dam += r_ptr->blow[i].d_dice;
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))
853 * モンスターが人形のベースにできるかを返す
854 * @param r_idx チェックしたいモンスター種族のID
855 * @return 人形にできるならTRUEを返す
857 bool item_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
862 monster_race *r_ptr = &r_info[r_idx];
863 if (any_bits(r_ptr->flags1, RF1_UNIQUE))
866 if (any_bits(r_ptr->flags7, RF7_KAGE))
869 if (any_bits(r_ptr->flagsr, RFR_RES_ALL))
872 if (any_bits(r_ptr->flags7, RF7_NAZGUL))
875 if (any_bits(r_ptr->flags1, RF1_FORCE_DEPTH))
878 if (any_bits(r_ptr->flags7, RF7_UNIQUE2))
885 * vaultに配置可能なモンスターの条件を指定する / Monster validation
886 * @param r_idx モンスター種別ID
887 * @param Vaultに配置可能であればTRUE
889 * Line 1 -- forbid town monsters
890 * Line 2 -- forbid uniques
891 * Line 3 -- forbid aquatic monsters
893 bool vault_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
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));