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/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 BIT_FLAGS vault_aux_dragon_mask4;
33 * @brief pit/nestの基準となる単種モンスターを決める /
34 * @param player_ptr プレーヤーへの参照ポインタ
37 void vault_prep_clone(player_type *player_ptr)
39 get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
40 vault_aux_race = get_mon_num(player_ptr, 0, player_ptr->current_floor_ptr->dun_level + 10, 0);
41 get_mon_num_prep(player_ptr, NULL, NULL);
45 * @brief pit/nestの基準となるモンスターシンボルを決める /
46 * @param player_ptr プレーヤーへの参照ポインタ
49 void vault_prep_symbol(player_type *player_ptr)
51 get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
52 MONRACE_IDX r_idx = get_mon_num(player_ptr, 0, player_ptr->current_floor_ptr->dun_level + 10, 0);
53 get_mon_num_prep(player_ptr, NULL, NULL);
54 vault_aux_char = r_info[r_idx].d_char;
58 * @brief pit/nestの基準となるドラゴンの種類を決める /
59 * @param player_ptr プレーヤーへの参照ポインタ
62 void vault_prep_dragon(player_type *player_ptr)
67 switch (randint0(6)) {
69 vault_aux_dragon_mask4 = RF4_BR_ACID;
72 vault_aux_dragon_mask4 = RF4_BR_ELEC;
75 vault_aux_dragon_mask4 = RF4_BR_FIRE;
78 vault_aux_dragon_mask4 = RF4_BR_COLD;
81 vault_aux_dragon_mask4 = RF4_BR_POIS;
83 default: /* Multi-hued */
84 vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS);
90 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
91 * @param r_idx モンスターID
92 * @return 討伐対象にできるならTRUEを返す。
94 bool mon_hook_quest(player_type *player_ptr, MONRACE_IDX r_idx)
99 monster_race *r_ptr = &r_info[r_idx];
100 if (test_bit(r_ptr->flags8, RF8_WILD_ONLY))
103 if (test_bit(r_ptr->flags7, RF7_AQUATIC))
106 if (test_bit(r_ptr->flags2, RF2_MULTIPLY))
109 if (test_bit(r_ptr->flags7, RF7_FRIENDLY))
116 * @brief モンスターがダンジョンに出現するかどうかを返す
117 * @param r_idx 判定するモンスターの種族ID
118 * @return ダンジョンに出現するならばTRUEを返す
120 bool mon_hook_dungeon(player_type *player_ptr, MONRACE_IDX r_idx)
122 monster_race *r_ptr = &r_info[r_idx];
123 if ((r_ptr->flags8 & RF8_WILD_ONLY) == 0)
126 dungeon_type *d_ptr = &d_info[player_ptr->dungeon_idx];
127 return (test_bit(d_ptr->mflags8, RF8_WILD_MOUNTAIN) && test_bit(r_ptr->flags8, RF8_WILD_MOUNTAIN));
131 * @brief モンスターが海洋に出現するかどうかを返す
132 * @param r_idx 判定するモンスターの種族ID
133 * @return 海洋に出現するならばTRUEを返す
135 bool mon_hook_ocean(player_type *player_ptr, MONRACE_IDX r_idx)
140 monster_race *r_ptr = &r_info[r_idx];
141 return test_bit(r_ptr->flags8, RF8_WILD_OCEAN);
145 * @brief モンスターが海岸に出現するかどうかを返す
146 * @param r_idx 判定するモンスターの種族ID
147 * @return 海岸に出現するならばTRUEを返す
149 bool mon_hook_shore(player_type *player_ptr, MONRACE_IDX r_idx)
154 monster_race *r_ptr = &r_info[r_idx];
155 return test_bit(r_ptr->flags8, RF8_WILD_SHORE);
159 * @brief モンスターが荒地に出現するかどうかを返す
160 * @param r_idx 判定するモンスターの種族ID
161 * @return 荒地に出現するならばTRUEを返す
163 bool mon_hook_waste(player_type *player_ptr, MONRACE_IDX r_idx)
168 monster_race *r_ptr = &r_info[r_idx];
169 return test_bit(r_ptr->flags8, (RF8_WILD_WASTE | RF8_WILD_ALL));
173 * @brief モンスターが町に出現するかどうかを返す
174 * @param r_idx 判定するモンスターの種族ID
175 * @return 荒地に出現するならばTRUEを返す
177 bool mon_hook_town(player_type *player_ptr, MONRACE_IDX r_idx)
182 monster_race *r_ptr = &r_info[r_idx];
183 return test_bit(r_ptr->flags8, (RF8_WILD_TOWN | RF8_WILD_ALL));
187 * @brief モンスターが森林に出現するかどうかを返す
188 * @param r_idx 判定するモンスターの種族ID
189 * @return 森林に出現するならばTRUEを返す
191 bool mon_hook_wood(player_type *player_ptr, MONRACE_IDX r_idx)
196 monster_race *r_ptr = &r_info[r_idx];
197 return test_bit(r_ptr->flags8, (RF8_WILD_WOOD | RF8_WILD_ALL));
201 * @brief モンスターが火山に出現するかどうかを返す
202 * @param r_idx 判定するモンスターの種族ID
203 * @return 火山に出現するならばTRUEを返す
205 bool mon_hook_volcano(player_type *player_ptr, MONRACE_IDX r_idx)
210 monster_race *r_ptr = &r_info[r_idx];
211 return test_bit(r_ptr->flags8, RF8_WILD_VOLCANO);
215 * @brief モンスターが山地に出現するかどうかを返す
216 * @param r_idx 判定するモンスターの種族ID
217 * @return 山地に出現するならばTRUEを返す
219 bool mon_hook_mountain(player_type *player_ptr, MONRACE_IDX r_idx)
224 monster_race *r_ptr = &r_info[r_idx];
225 return test_bit(r_ptr->flags8, RF8_WILD_MOUNTAIN);
229 * @brief モンスターが草原に出現するかどうかを返す
230 * @param r_idx 判定するモンスターの種族ID
231 * @return 森林に出現するならばTRUEを返す
233 bool mon_hook_grass(player_type *player_ptr, MONRACE_IDX r_idx)
238 monster_race *r_ptr = &r_info[r_idx];
239 return test_bit(r_ptr->flags8, (RF8_WILD_GRASS | RF8_WILD_ALL));
243 * @brief モンスターが深い水地形に出現するかどうかを返す
244 * @param r_idx 判定するモンスターの種族ID
245 * @return 深い水地形に出現するならばTRUEを返す
247 bool mon_hook_deep_water(player_type *player_ptr, MONRACE_IDX r_idx)
249 monster_race *r_ptr = &r_info[r_idx];
250 if (!mon_hook_dungeon(player_ptr, r_idx))
253 return test_bit(r_ptr->flags7, RF7_AQUATIC);
257 * @brief モンスターが浅い水地形に出現するかどうかを返す
258 * @param r_idx 判定するモンスターの種族ID
259 * @return 浅い水地形に出現するならばTRUEを返す
261 bool mon_hook_shallow_water(player_type *player_ptr, MONRACE_IDX r_idx)
263 monster_race *r_ptr = &r_info[r_idx];
264 if (!mon_hook_dungeon(player_ptr, r_idx))
267 return !test_bit(r_ptr->flags2, RF2_AURA_FIRE);
271 * @brief モンスターが溶岩地形に出現するかどうかを返す
272 * @param r_idx 判定するモンスターの種族ID
273 * @return 溶岩地形に出現するならばTRUEを返す
275 bool mon_hook_lava(player_type *player_ptr, MONRACE_IDX r_idx)
277 monster_race *r_ptr = &r_info[r_idx];
278 if (!mon_hook_dungeon(player_ptr, r_idx))
281 return (test_bit(r_ptr->flagsr, RFR_EFF_IM_FIRE_MASK) || test_bit(r_ptr->flags7, RF7_CAN_FLY)) && !test_bit(r_ptr->flags3, RF3_AURA_COLD);
285 * @brief モンスターが通常の床地形に出現するかどうかを返す
286 * @param r_idx 判定するモンスターの種族ID
287 * @return 通常の床地形に出現するならばTRUEを返す
289 bool mon_hook_floor(player_type *player_ptr, MONRACE_IDX r_idx)
294 monster_race *r_ptr = &r_info[r_idx];
295 if (!test_bit(r_ptr->flags7, RF7_AQUATIC) || test_bit(r_ptr->flags7, RF7_CAN_FLY))
302 * Helper function for "glass room"
304 bool vault_aux_lite(player_type *player_ptr, MONRACE_IDX r_idx)
309 monster_race *r_ptr = &r_info[r_idx];
310 if (!vault_monster_okay(player_ptr, r_idx))
313 if (!test_bit(r_ptr->flags4, RF4_BR_LITE) && !test_bit(r_ptr->a_ability_flags1, RF5_BA_LITE))
316 if (test_bit(r_ptr->flags2, (RF2_PASS_WALL | RF2_KILL_WALL)))
319 if (test_bit(r_ptr->flags4, RF4_BR_DISI))
326 * Helper function for "glass room"
328 bool vault_aux_shards(player_type *player_ptr, MONRACE_IDX r_idx)
330 monster_race *r_ptr = &r_info[r_idx];
331 if (!vault_monster_okay(player_ptr, r_idx))
334 if (!test_bit(r_ptr->flags4, RF4_BR_SHAR))
341 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
342 * Helper monster selection function
343 * @param r_idx 確認したいモンスター種族ID
344 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
346 bool vault_aux_simple(player_type *player_ptr, MONRACE_IDX r_idx)
351 return (vault_monster_okay(player_ptr, r_idx));
355 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
356 * Helper function for "monster nest (jelly)"
357 * @param r_idx 確認したいモンスター種族ID
358 * @return 生成必要条件を満たしているならTRUEを返す。
360 bool vault_aux_jelly(player_type *player_ptr, MONRACE_IDX r_idx)
362 monster_race *r_ptr = &r_info[r_idx];
363 if (!vault_monster_okay(player_ptr, r_idx))
366 if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
369 if (test_bit(r_ptr->flags3, RF3_EVIL))
372 if (!angband_strchr("ijm,", r_ptr->d_char))
379 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
380 * Helper function for "monster nest (animal)"
381 * @param r_idx 確認したいモンスター種族ID
382 * @return 生成必要条件を満たしているならTRUEを返す。
384 bool vault_aux_animal(player_type *player_ptr, MONRACE_IDX r_idx)
386 monster_race *r_ptr = &r_info[r_idx];
387 if (!vault_monster_okay(player_ptr, r_idx))
390 if (!test_bit(r_ptr->flags3, RF3_ANIMAL))
397 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
398 * Helper function for "monster nest (undead)"
399 * @param r_idx 確認したいモンスター種族ID
400 * @return 生成必要条件を満たしているならTRUEを返す。
402 bool vault_aux_undead(player_type *player_ptr, MONRACE_IDX r_idx)
404 monster_race *r_ptr = &r_info[r_idx];
405 if (!vault_monster_okay(player_ptr, r_idx))
408 if (!test_bit(r_ptr->flags3, RF3_UNDEAD))
415 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
416 * Helper function for "monster nest (chapel)"
417 * @param r_idx 確認したいモンスター種族ID
418 * @return 生成必要条件を満たしているならTRUEを返す。
420 bool vault_aux_chapel_g(player_type *player_ptr, MONRACE_IDX r_idx)
422 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,
423 MON_ULTRA_PALADIN, MON_EBONY_MONK, MON_W_KNIGHT, MON_KNI_TEMPLAR, MON_PALADIN, MON_TOPAZ_MONK, 0 };
425 monster_race *r_ptr = &r_info[r_idx];
426 if (!vault_monster_okay(player_ptr, r_idx))
429 if (test_bit(r_ptr->flags3, RF3_EVIL))
432 if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER))
435 if (r_ptr->d_char == 'A')
438 for (int i = 0; chapel_list[i]; i++)
439 if (r_idx == chapel_list[i])
446 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
447 * Helper function for "monster nest (kennel)"
448 * @param r_idx 確認したいモンスター種族ID
449 * @return 生成必要条件を満たしているならTRUEを返す。
451 bool vault_aux_kennel(player_type *player_ptr, MONRACE_IDX r_idx)
453 monster_race *r_ptr = &r_info[r_idx];
454 if (!vault_monster_okay(player_ptr, r_idx))
457 if (!angband_strchr("CZ", r_ptr->d_char))
464 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
465 * Helper function for "monster nest (mimic)"
466 * @param r_idx 確認したいモンスター種族ID
467 * @return 生成必要条件を満たしているならTRUEを返す。
469 bool vault_aux_mimic(player_type *player_ptr, MONRACE_IDX r_idx)
471 monster_race *r_ptr = &r_info[r_idx];
472 if (!vault_monster_okay(player_ptr, r_idx))
475 if (!angband_strchr("!$&(/=?[\\|][`~>+", r_ptr->d_char))
482 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
483 * Helper function for "monster nest (clone)"
484 * @param r_idx 確認したいモンスター種族ID
485 * @return 生成必要条件を満たしているならTRUEを返す。
487 bool vault_aux_clone(player_type *player_ptr, MONRACE_IDX r_idx)
489 if (!vault_monster_okay(player_ptr, r_idx))
492 return (r_idx == vault_aux_race);
496 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
497 * Helper function for "monster nest (symbol clone)"
498 * @param r_idx 確認したいモンスター種族ID
499 * @return 生成必要条件を満たしているならTRUEを返す。
501 bool vault_aux_symbol_e(player_type *player_ptr, MONRACE_IDX r_idx)
503 monster_race *r_ptr = &r_info[r_idx];
504 if (!vault_monster_okay(player_ptr, r_idx))
507 if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
510 if (test_bit(r_ptr->flags3, RF3_GOOD))
513 if (r_ptr->d_char != vault_aux_char)
520 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
521 * Helper function for "monster nest (symbol clone)"
522 * @param r_idx 確認したいモンスター種族ID
523 * @return 生成必要条件を満たしているならTRUEを返す。
525 bool vault_aux_symbol_g(player_type *player_ptr, MONRACE_IDX r_idx)
527 monster_race *r_ptr = &r_info[r_idx];
528 if (!vault_monster_okay(player_ptr, r_idx))
531 if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
534 if (test_bit(r_ptr->flags3, RF3_EVIL))
537 if (r_ptr->d_char != vault_aux_char)
544 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
545 * Helper function for "monster pit (orc)"
546 * @param r_idx 確認したいモンスター種族ID
547 * @return 生成必要条件を満たしているならTRUEを返す。
549 bool vault_aux_orc(player_type *player_ptr, MONRACE_IDX r_idx)
551 monster_race *r_ptr = &r_info[r_idx];
552 if (!vault_monster_okay(player_ptr, r_idx))
555 if (!test_bit(r_ptr->flags3, RF3_ORC))
558 if (test_bit(r_ptr->flags3, RF3_UNDEAD))
565 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
566 * Helper function for "monster pit (troll)"
567 * @param r_idx 確認したいモンスター種族ID
568 * @return 生成必要条件を満たしているならTRUEを返す。
570 bool vault_aux_troll(player_type *player_ptr, MONRACE_IDX r_idx)
572 monster_race *r_ptr = &r_info[r_idx];
573 if (!vault_monster_okay(player_ptr, r_idx))
576 if (!test_bit(r_ptr->flags3, RF3_TROLL))
579 if (test_bit(r_ptr->flags3, RF3_UNDEAD))
586 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
587 * Helper function for "monster pit (giant)"
588 * @param r_idx 確認したいモンスター種族ID
589 * @return 生成必要条件を満たしているならTRUEを返す。
591 bool vault_aux_giant(player_type *player_ptr, MONRACE_IDX r_idx)
593 monster_race *r_ptr = &r_info[r_idx];
594 if (!vault_monster_okay(player_ptr, r_idx))
597 if (!test_bit(r_ptr->flags3, RF3_GIANT))
600 if (test_bit(r_ptr->flags3, RF3_GOOD))
603 if (test_bit(r_ptr->flags3, RF3_UNDEAD))
610 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
611 * Helper function for "monster pit (dragon)"
612 * @param r_idx 確認したいモンスター種族ID
613 * @return 生成必要条件を満たしているならTRUEを返す。
615 bool vault_aux_dragon(player_type *player_ptr, MONRACE_IDX r_idx)
617 monster_race *r_ptr = &r_info[r_idx];
618 if (!vault_monster_okay(player_ptr, r_idx))
621 if (!test_bit(r_ptr->flags3, RF3_DRAGON))
624 if (!test_bit(r_ptr->flags4, vault_aux_dragon_mask4))
627 if (test_bit(r_ptr->flags3, RF3_UNDEAD))
634 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
635 * Helper function for "monster pit (demon)"
636 * @param r_idx 確認したいモンスター種族ID
637 * @return 生成必要条件を満たしているならTRUEを返す。
639 bool vault_aux_demon(player_type *player_ptr, MONRACE_IDX r_idx)
641 monster_race *r_ptr = &r_info[r_idx];
642 if (!vault_monster_okay(player_ptr, r_idx))
645 if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
648 if (!test_bit(r_ptr->flags3, RF3_DEMON))
655 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
656 * Helper function for "monster pit (lovecraftian)"
657 * @param r_idx 確認したいモンスター種族ID
658 * @return 生成必要条件を満たしているならTRUEを返す。
660 bool vault_aux_cthulhu(player_type *player_ptr, MONRACE_IDX r_idx)
662 monster_race *r_ptr = &r_info[r_idx];
663 if (!vault_monster_okay(player_ptr, r_idx))
666 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
669 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
676 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
677 * Helper function for "monster pit (dark elf)"
678 * @param r_idx 確認したいモンスター種族ID
679 * @return 生成必要条件を満たしているならTRUEを返す。
681 bool vault_aux_dark_elf(player_type *player_ptr, MONRACE_IDX r_idx)
683 static int dark_elf_list[] = {
697 if (!vault_monster_okay(player_ptr, r_idx))
700 for (int i = 0; dark_elf_list[i]; i++)
701 if (r_idx == dark_elf_list[i])
708 * @brief モンスターが生命体かどうかを返す
709 * Is the monster "alive"?
710 * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
711 * @return 生命体ならばTRUEを返す
713 * Used to determine the message to print for a killed monster.
714 * ("dies", "destroyed")
716 bool monster_living(MONRACE_IDX r_idx)
718 monster_race *r_ptr = &r_info[r_idx];
719 return !test_bit(r_ptr->flags3, (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING));
723 * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
724 * Is the monster "alive"? / Is this monster declined to be questor or bounty?
725 * @param r_idx モンスターの種族ID
726 * @return 賞金首に加えられないならばTRUEを返す
730 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
734 * Decline them to be questor or bounty because they use
735 * special motion "split and combine"
737 case MON_BANORLUPART:
747 * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
748 * @param r_idx モンスターID
749 * @return 死体を食べられるならTRUEを返す。
751 bool monster_hook_human(player_type *player_ptr, MONRACE_IDX r_idx)
756 monster_race *r_ptr = &r_info[r_idx];
757 if (test_bit(r_ptr->flags1, RF1_UNIQUE))
760 if (angband_strchr("pht", r_ptr->d_char))
767 * @brief 悪夢の元凶となるモンスターかどうかを返す。
768 * @param r_idx 判定対象となるモンスターのID
769 * @return 悪夢の元凶となり得るか否か。
771 bool get_nightmare(player_type *player_ptr, MONRACE_IDX r_idx)
773 monster_race *r_ptr = &r_info[r_idx];
774 if (!test_bit(r_ptr->flags2, RF2_ELDRITCH_HORROR))
777 if (r_ptr->level <= player_ptr->lev)
784 * @brief モンスター種族が釣れる種族かどうかを判定する。
785 * @param r_idx 判定したいモンスター種族のID
786 * @return 釣れる対象ならばTRUEを返す
788 bool monster_is_fishing_target(player_type *player_ptr, MONRACE_IDX r_idx)
793 monster_race *r_ptr = &r_info[r_idx];
794 if (test_bit(r_ptr->flags7, RF7_AQUATIC) && !test_bit(r_ptr->flags1, RF1_UNIQUE) && angband_strchr("Jjlw", r_ptr->d_char))
801 * @brief モンスター闘技場に参加できるモンスターの判定
802 * @param r_idx モンスターID
803 * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
804 * 自爆以外のなんらかのHP攻撃手段を持っていること。
807 bool monster_can_entry_arena(player_type *player_ptr, MONRACE_IDX r_idx)
813 monster_race *r_ptr = &r_info[r_idx];
814 bool unselectable = test_bit(r_ptr->flags1, RF1_NEVER_MOVE);
815 unselectable |= test_bit(r_ptr->flags2, RF2_MULTIPLY);
816 unselectable |= test_bit(r_ptr->flags2, RF2_QUANTUM) && !test_bit(r_ptr->flags1, RF1_UNIQUE);
817 unselectable |= test_bit(r_ptr->flags7, RF7_AQUATIC);
818 unselectable |= test_bit(r_ptr->flags7, RF7_CHAMELEON);
822 for (int i = 0; i < 4; i++) {
823 if (r_ptr->blow[i].method == RBM_EXPLODE)
826 if (r_ptr->blow[i].effect != RBE_DR_MANA)
827 dam += r_ptr->blow[i].d_dice;
830 if (!dam && !test_bit(r_ptr->flags4, (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK))
831 && !test_bit(r_ptr->a_ability_flags1, (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK))
832 && !test_bit(r_ptr->a_ability_flags2, (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK)))
839 * @brief モンスターが人形のベースにできるかを返す
840 * @param r_idx チェックしたいモンスター種族のID
841 * @return 人形にできるならTRUEを返す
843 bool item_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
848 monster_race *r_ptr = &r_info[r_idx];
849 if (test_bit(r_ptr->flags1, RF1_UNIQUE))
852 if (test_bit(r_ptr->flags7, RF7_KAGE))
855 if (test_bit(r_ptr->flagsr, RFR_RES_ALL))
858 if (test_bit(r_ptr->flags7, RF7_NAZGUL))
861 if (test_bit(r_ptr->flags1, RF1_FORCE_DEPTH))
864 if (test_bit(r_ptr->flags7, RF7_UNIQUE2))
871 * vaultに配置可能なモンスターの条件を指定する / Monster validation
872 * @param r_idx モンスター種別ID
873 * @param Vaultに配置可能であればTRUE
875 * Line 1 -- forbid town monsters
876 * Line 2 -- forbid uniques
877 * Line 3 -- forbid aquatic monsters
879 bool vault_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
881 return (mon_hook_dungeon(player_ptr, r_idx) && !test_bit(r_info[r_idx].flags1, RF1_UNIQUE) && !test_bit(r_info[r_idx].flags7, RF7_UNIQUE2)
882 && !test_bit(r_info[r_idx].flagsr, RFR_RES_ALL) && !test_bit(r_info[r_idx].flags7, RF7_AQUATIC));