1 #include "monster-race/monster-race-hook.h"
2 #include "dungeon/dungeon.h"
3 #include "floor/floor.h"
4 #include "monster-attack/monster-attack-effect.h"
5 #include "monster-attack/monster-attack-types.h"
6 #include "monster-race/monster-race.h"
7 #include "monster-race/race-indice-types.h"
8 #include "monster/monster-util.h"
9 #include "monster/monster2.h"
10 #include "mspell/monster-spell.h"
11 #include "util/util.h"
13 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
16 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
19 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
20 BIT_FLAGS vault_aux_dragon_mask4;
23 * @brief pit/nestの基準となる単種モンスターを決める /
24 * @param player_ptr プレーヤーへの参照ポインタ
27 void vault_prep_clone(player_type *player_ptr)
29 get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
30 vault_aux_race = get_mon_num(player_ptr, player_ptr->current_floor_ptr->dun_level + 10, 0);
31 get_mon_num_prep(player_ptr, NULL, NULL);
35 * @brief pit/nestの基準となるモンスターシンボルを決める /
36 * @param player_ptr プレーヤーへの参照ポインタ
39 void vault_prep_symbol(player_type *player_ptr)
41 get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
42 MONRACE_IDX r_idx = get_mon_num(player_ptr, player_ptr->current_floor_ptr->dun_level + 10, 0);
43 get_mon_num_prep(player_ptr, NULL, NULL);
44 vault_aux_char = r_info[r_idx].d_char;
48 * todo 関数ポインタ設計の都合上、使わないが引数に含めなければならない
49 * @brief pit/nestの基準となるドラゴンの種類を決める /
50 * @param player_ptr プレーヤーへの参照ポインタ
53 void vault_prep_dragon(player_type *player_ptr)
56 switch (randint0(6)) {
58 vault_aux_dragon_mask4 = RF4_BR_ACID;
61 vault_aux_dragon_mask4 = RF4_BR_ELEC;
64 vault_aux_dragon_mask4 = RF4_BR_FIRE;
67 vault_aux_dragon_mask4 = RF4_BR_COLD;
70 vault_aux_dragon_mask4 = RF4_BR_POIS;
72 default: /* Multi-hued */
73 vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS);
79 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
80 * @param r_idx モンスターID
81 * @return 討伐対象にできるならTRUEを返す。
83 bool mon_hook_quest(MONRACE_IDX r_idx)
85 monster_race *r_ptr = &r_info[r_idx];
86 if (r_ptr->flags8 & RF8_WILD_ONLY)
89 if (r_ptr->flags7 & RF7_AQUATIC)
92 if (r_ptr->flags2 & RF2_MULTIPLY)
95 if (r_ptr->flags7 & RF7_FRIENDLY)
102 * @brief モンスターがダンジョンに出現するかどうかを返す
103 * @param r_idx 判定するモンスターの種族ID
104 * @return ダンジョンに出現するならばTRUEを返す
106 bool mon_hook_dungeon(MONRACE_IDX r_idx)
108 monster_race *r_ptr = &r_info[r_idx];
109 if (!(r_ptr->flags8 & RF8_WILD_ONLY))
112 dungeon_type *d_ptr = &d_info[p_ptr->dungeon_idx];
113 return ((d_ptr->mflags8 & RF8_WILD_MOUNTAIN) != 0) && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0);
117 * @brief モンスターが海洋に出現するかどうかを返す
118 * @param r_idx 判定するモンスターの種族ID
119 * @return 海洋に出現するならばTRUEを返す
121 bool mon_hook_ocean(MONRACE_IDX r_idx)
123 monster_race *r_ptr = &r_info[r_idx];
124 return (r_ptr->flags8 & RF8_WILD_OCEAN) != 0;
128 * @brief モンスターが海岸に出現するかどうかを返す
129 * @param r_idx 判定するモンスターの種族ID
130 * @return 海岸に出現するならばTRUEを返す
132 bool mon_hook_shore(MONRACE_IDX r_idx)
134 monster_race *r_ptr = &r_info[r_idx];
135 return (r_ptr->flags8 & RF8_WILD_SHORE) != 0;
139 * @brief モンスターが荒地に出現するかどうかを返す
140 * @param r_idx 判定するモンスターの種族ID
141 * @return 荒地に出現するならばTRUEを返す
143 bool mon_hook_waste(MONRACE_IDX r_idx)
145 monster_race *r_ptr = &r_info[r_idx];
146 return (r_ptr->flags8 & (RF8_WILD_WASTE | RF8_WILD_ALL)) != 0;
150 * @brief モンスターが町に出現するかどうかを返す
151 * @param r_idx 判定するモンスターの種族ID
152 * @return 荒地に出現するならばTRUEを返す
154 bool mon_hook_town(MONRACE_IDX r_idx)
156 monster_race *r_ptr = &r_info[r_idx];
157 return (r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL)) != 0;
161 * @brief モンスターが森林に出現するかどうかを返す
162 * @param r_idx 判定するモンスターの種族ID
163 * @return 森林に出現するならばTRUEを返す
165 bool mon_hook_wood(MONRACE_IDX r_idx)
167 monster_race *r_ptr = &r_info[r_idx];
168 return (r_ptr->flags8 & (RF8_WILD_WOOD | RF8_WILD_ALL)) != 0;
172 * @brief モンスターが火山に出現するかどうかを返す
173 * @param r_idx 判定するモンスターの種族ID
174 * @return 火山に出現するならばTRUEを返す
176 bool mon_hook_volcano(MONRACE_IDX r_idx)
178 monster_race *r_ptr = &r_info[r_idx];
179 return (r_ptr->flags8 & RF8_WILD_VOLCANO) != 0;
183 * @brief モンスターが山地に出現するかどうかを返す
184 * @param r_idx 判定するモンスターの種族ID
185 * @return 山地に出現するならばTRUEを返す
187 bool mon_hook_mountain(MONRACE_IDX r_idx)
189 monster_race *r_ptr = &r_info[r_idx];
190 return (r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0;
194 * @brief モンスターが草原に出現するかどうかを返す
195 * @param r_idx 判定するモンスターの種族ID
196 * @return 森林に出現するならばTRUEを返す
198 bool mon_hook_grass(MONRACE_IDX r_idx)
200 monster_race *r_ptr = &r_info[r_idx];
201 return (r_ptr->flags8 & (RF8_WILD_GRASS | RF8_WILD_ALL)) != 0;
205 * @brief モンスターが深い水地形に出現するかどうかを返す
206 * @param r_idx 判定するモンスターの種族ID
207 * @return 深い水地形に出現するならばTRUEを返す
209 bool mon_hook_deep_water(MONRACE_IDX r_idx)
211 monster_race *r_ptr = &r_info[r_idx];
212 if (!mon_hook_dungeon(r_idx))
215 return (r_ptr->flags7 & RF7_AQUATIC) != 0;
219 * @brief モンスターが浅い水地形に出現するかどうかを返す
220 * @param r_idx 判定するモンスターの種族ID
221 * @return 浅い水地形に出現するならばTRUEを返す
223 bool mon_hook_shallow_water(MONRACE_IDX r_idx)
225 monster_race *r_ptr = &r_info[r_idx];
226 if (!mon_hook_dungeon(r_idx))
229 return (r_ptr->flags2 & RF2_AURA_FIRE) != 0;
233 * @brief モンスターが溶岩地形に出現するかどうかを返す
234 * @param r_idx 判定するモンスターの種族ID
235 * @return 溶岩地形に出現するならばTRUEを返す
237 bool mon_hook_lava(MONRACE_IDX r_idx)
239 monster_race *r_ptr = &r_info[r_idx];
240 if (!mon_hook_dungeon(r_idx))
243 if (((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) || (r_ptr->flags7 & RF7_CAN_FLY)) && !(r_ptr->flags3 & RF3_AURA_COLD))
250 * @brief モンスターが通常の床地形に出現するかどうかを返す
251 * @param r_idx 判定するモンスターの種族ID
252 * @return 通常の床地形に出現するならばTRUEを返す
254 bool mon_hook_floor(MONRACE_IDX r_idx)
256 monster_race *r_ptr = &r_info[r_idx];
257 if (!(r_ptr->flags7 & RF7_AQUATIC) || (r_ptr->flags7 & RF7_CAN_FLY))
264 * Helper function for "glass room"
266 bool vault_aux_lite(MONRACE_IDX r_idx)
268 monster_race *r_ptr = &r_info[r_idx];
269 if (!vault_monster_okay(r_idx))
272 if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE))
275 if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL))
278 if (r_ptr->flags4 & RF4_BR_DISI)
285 * Helper function for "glass room"
287 bool vault_aux_shards(MONRACE_IDX r_idx)
289 monster_race *r_ptr = &r_info[r_idx];
290 if (!vault_monster_okay(r_idx))
293 if (!(r_ptr->flags4 & RF4_BR_SHAR))
300 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
301 * Helper monster selection function
302 * @param r_idx 確認したいモンスター種族ID
303 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
305 bool vault_aux_simple(MONRACE_IDX r_idx) { return (vault_monster_okay(r_idx)); }
308 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
309 * Helper function for "monster nest (jelly)"
310 * @param r_idx 確認したいモンスター種族ID
311 * @return 生成必要条件を満たしているならTRUEを返す。
313 bool vault_aux_jelly(MONRACE_IDX r_idx)
315 monster_race *r_ptr = &r_info[r_idx];
316 if (!vault_monster_okay(r_idx))
319 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
322 if (r_ptr->flags3 & (RF3_EVIL))
325 if (!my_strchr("ijm,", r_ptr->d_char))
332 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
333 * Helper function for "monster nest (animal)"
334 * @param r_idx 確認したいモンスター種族ID
335 * @return 生成必要条件を満たしているならTRUEを返す。
337 bool vault_aux_animal(MONRACE_IDX r_idx)
339 monster_race *r_ptr = &r_info[r_idx];
340 if (!vault_monster_okay(r_idx))
343 if (!(r_ptr->flags3 & (RF3_ANIMAL)))
350 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
351 * Helper function for "monster nest (undead)"
352 * @param r_idx 確認したいモンスター種族ID
353 * @return 生成必要条件を満たしているならTRUEを返す。
355 bool vault_aux_undead(MONRACE_IDX r_idx)
357 monster_race *r_ptr = &r_info[r_idx];
358 if (!vault_monster_okay(r_idx))
361 if (!(r_ptr->flags3 & (RF3_UNDEAD)))
368 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
369 * Helper function for "monster nest (chapel)"
370 * @param r_idx 確認したいモンスター種族ID
371 * @return 生成必要条件を満たしているならTRUEを返す。
373 bool vault_aux_chapel_g(MONRACE_IDX r_idx)
375 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,
376 MON_ULTRA_PALADIN, MON_EBONY_MONK, MON_W_KNIGHT, MON_KNI_TEMPLAR, MON_PALADIN, MON_TOPAZ_MONK, 0 };
378 monster_race *r_ptr = &r_info[r_idx];
379 if (!vault_monster_okay(r_idx))
382 if (r_ptr->flags3 & (RF3_EVIL))
385 if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER))
388 if (r_ptr->d_char == 'A')
391 for (int i = 0; chapel_list[i]; i++)
392 if (r_idx == chapel_list[i])
399 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
400 * Helper function for "monster nest (kennel)"
401 * @param r_idx 確認したいモンスター種族ID
402 * @return 生成必要条件を満たしているならTRUEを返す。
404 bool vault_aux_kennel(MONRACE_IDX r_idx)
406 monster_race *r_ptr = &r_info[r_idx];
407 if (!vault_monster_okay(r_idx))
410 if (!my_strchr("CZ", r_ptr->d_char))
417 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
418 * Helper function for "monster nest (mimic)"
419 * @param r_idx 確認したいモンスター種族ID
420 * @return 生成必要条件を満たしているならTRUEを返す。
422 bool vault_aux_mimic(MONRACE_IDX r_idx)
424 monster_race *r_ptr = &r_info[r_idx];
425 if (!vault_monster_okay(r_idx))
428 if (!my_strchr("!$&(/=?[\\|", r_ptr->d_char))
435 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
436 * Helper function for "monster nest (clone)"
437 * @param r_idx 確認したいモンスター種族ID
438 * @return 生成必要条件を満たしているならTRUEを返す。
440 bool vault_aux_clone(MONRACE_IDX r_idx)
442 if (!vault_monster_okay(r_idx))
445 return (r_idx == vault_aux_race);
449 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
450 * Helper function for "monster nest (symbol clone)"
451 * @param r_idx 確認したいモンスター種族ID
452 * @return 生成必要条件を満たしているならTRUEを返す。
454 bool vault_aux_symbol_e(MONRACE_IDX r_idx)
456 monster_race *r_ptr = &r_info[r_idx];
457 if (!vault_monster_okay(r_idx))
460 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
463 if (r_ptr->flags3 & (RF3_GOOD))
466 if (r_ptr->d_char != vault_aux_char)
473 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
474 * Helper function for "monster nest (symbol clone)"
475 * @param r_idx 確認したいモンスター種族ID
476 * @return 生成必要条件を満たしているならTRUEを返す。
478 bool vault_aux_symbol_g(MONRACE_IDX r_idx)
480 monster_race *r_ptr = &r_info[r_idx];
481 if (!vault_monster_okay(r_idx))
484 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
487 if (r_ptr->flags3 & (RF3_EVIL))
490 if (r_ptr->d_char != vault_aux_char)
497 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
498 * Helper function for "monster pit (orc)"
499 * @param r_idx 確認したいモンスター種族ID
500 * @return 生成必要条件を満たしているならTRUEを返す。
502 bool vault_aux_orc(MONRACE_IDX r_idx)
504 monster_race *r_ptr = &r_info[r_idx];
505 if (!vault_monster_okay(r_idx))
508 if (!(r_ptr->flags3 & RF3_ORC))
511 if (r_ptr->flags3 & RF3_UNDEAD)
518 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
519 * Helper function for "monster pit (troll)"
520 * @param r_idx 確認したいモンスター種族ID
521 * @return 生成必要条件を満たしているならTRUEを返す。
523 bool vault_aux_troll(MONRACE_IDX r_idx)
525 monster_race *r_ptr = &r_info[r_idx];
526 if (!vault_monster_okay(r_idx))
529 if (!(r_ptr->flags3 & RF3_TROLL))
532 if (r_ptr->flags3 & RF3_UNDEAD)
539 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
540 * Helper function for "monster pit (giant)"
541 * @param r_idx 確認したいモンスター種族ID
542 * @return 生成必要条件を満たしているならTRUEを返す。
544 bool vault_aux_giant(MONRACE_IDX r_idx)
546 monster_race *r_ptr = &r_info[r_idx];
547 if (!vault_monster_okay(r_idx))
550 if (!(r_ptr->flags3 & RF3_GIANT))
553 if (r_ptr->flags3 & RF3_GOOD)
556 if (r_ptr->flags3 & RF3_UNDEAD)
563 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
564 * Helper function for "monster pit (dragon)"
565 * @param r_idx 確認したいモンスター種族ID
566 * @return 生成必要条件を満たしているならTRUEを返す。
568 bool vault_aux_dragon(MONRACE_IDX r_idx)
570 monster_race *r_ptr = &r_info[r_idx];
571 if (!vault_monster_okay(r_idx))
574 if (!(r_ptr->flags3 & RF3_DRAGON))
577 if (r_ptr->flags4 != vault_aux_dragon_mask4)
580 if (r_ptr->flags3 & RF3_UNDEAD)
587 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
588 * Helper function for "monster pit (demon)"
589 * @param r_idx 確認したいモンスター種族ID
590 * @return 生成必要条件を満たしているならTRUEを返す。
592 bool vault_aux_demon(MONRACE_IDX r_idx)
594 monster_race *r_ptr = &r_info[r_idx];
595 if (!vault_monster_okay(r_idx))
598 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
601 if (!(r_ptr->flags3 & RF3_DEMON))
608 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
609 * Helper function for "monster pit (lovecraftian)"
610 * @param r_idx 確認したいモンスター種族ID
611 * @return 生成必要条件を満たしているならTRUEを返す。
613 bool vault_aux_cthulhu(MONRACE_IDX r_idx)
615 monster_race *r_ptr = &r_info[r_idx];
616 if (!vault_monster_okay(r_idx))
619 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
622 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
629 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
630 * Helper function for "monster pit (dark elf)"
631 * @param r_idx 確認したいモンスター種族ID
632 * @return 生成必要条件を満たしているならTRUEを返す。
634 bool vault_aux_dark_elf(MONRACE_IDX r_idx)
636 static int dark_elf_list[] = {
650 if (!vault_monster_okay(r_idx))
653 for (int i = 0; dark_elf_list[i]; i++)
654 if (r_idx == dark_elf_list[i])
661 * @brief モンスターが生命体かどうかを返す
662 * Is the monster "alive"?
663 * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
664 * @return 生命体ならばTRUEを返す
666 * Used to determine the message to print for a killed monster.
667 * ("dies", "destroyed")
669 bool monster_living(MONRACE_IDX r_idx)
671 monster_race *r_ptr = &r_info[r_idx];
672 return (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING)) == 0;
676 * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
677 * Is the monster "alive"? / Is this monster declined to be questor or bounty?
678 * @param r_idx モンスターの種族ID
679 * @return 賞金首に加えられないならばTRUEを返す
683 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
687 * Decline them to be questor or bounty because they use
688 * special motion "split and combine"
690 case MON_BANORLUPART:
700 * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
701 * @param r_idx モンスターID
702 * @return 死体を食べられるならTRUEを返す。
704 bool monster_hook_human(MONRACE_IDX r_idx)
706 monster_race *r_ptr = &r_info[r_idx];
707 if (r_ptr->flags1 & (RF1_UNIQUE))
710 if (my_strchr("pht", r_ptr->d_char))
717 * @brief 悪夢の元凶となるモンスターかどうかを返す。
718 * @param r_idx 判定対象となるモンスターのID
719 * @return 悪夢の元凶となり得るか否か。
721 bool get_nightmare(MONRACE_IDX r_idx)
723 monster_race *r_ptr = &r_info[r_idx];
724 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
727 if (r_ptr->level <= p_ptr->lev)
734 * @brief モンスター種族が釣れる種族かどうかを判定する。
735 * @param r_idx 判定したいモンスター種族のID
736 * @return 釣れる対象ならばTRUEを返す
738 bool monster_is_fishing_target(MONRACE_IDX r_idx)
740 monster_race *r_ptr = &r_info[r_idx];
741 if ((r_ptr->flags7 & RF7_AQUATIC) && !(r_ptr->flags1 & RF1_UNIQUE) && my_strchr("Jjlw", r_ptr->d_char))
748 * @brief モンスター闘技場に参加できるモンスターの判定
749 * @param r_idx モンスターID
750 * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
751 * 自爆以外のなんらかのHP攻撃手段を持っていること。
754 bool monster_can_entry_arena(MONRACE_IDX r_idx)
757 monster_race *r_ptr = &r_info[r_idx];
758 if (r_ptr->flags1 & (RF1_NEVER_MOVE))
761 if (r_ptr->flags2 & (RF2_MULTIPLY))
764 if (r_ptr->flags2 & (RF2_QUANTUM))
767 if (r_ptr->flags7 & (RF7_AQUATIC))
770 if (r_ptr->flags7 & (RF7_CHAMELEON))
773 for (int i = 0; i < 4; i++) {
774 if (r_ptr->blow[i].method == RBM_EXPLODE)
777 if (r_ptr->blow[i].effect != RBE_DR_MANA)
778 dam += r_ptr->blow[i].d_dice;
781 if (!dam && !(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK))
782 && !(r_ptr->a_ability_flags1 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK))
783 && !(r_ptr->a_ability_flags2 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK)))
790 * @brief モンスターが人形のベースにできるかを返す
791 * @param r_idx チェックしたいモンスター種族のID
792 * @return 人形にできるならTRUEを返す
794 bool item_monster_okay(MONRACE_IDX r_idx)
796 monster_race *r_ptr = &r_info[r_idx];
797 if (r_ptr->flags1 & RF1_UNIQUE)
800 if (r_ptr->flags7 & RF7_KAGE)
803 if (r_ptr->flagsr & RFR_RES_ALL)
806 if (r_ptr->flags7 & RF7_NAZGUL)
809 if (r_ptr->flags1 & RF1_FORCE_DEPTH)
812 if (r_ptr->flags7 & RF7_UNIQUE2)
819 * vaultに配置可能なモンスターの条件を指定するマクロ / Monster validation macro
820 * @param r_idx モンスター種別ID
821 * @param Vaultに配置可能であればTRUE
823 * Line 1 -- forbid town monsters
824 * Line 2 -- forbid uniques
825 * Line 3 -- forbid aquatic monsters
827 bool vault_monster_okay(MONRACE_IDX r_idx)
829 return (mon_hook_dungeon(r_idx) && !(r_info[r_idx].flags1 & RF1_UNIQUE) && !(r_info[r_idx].flags7 & RF7_UNIQUE2) && !(r_info[r_idx].flagsr & RFR_RES_ALL)
830 && !(r_info[r_idx].flags7 & RF7_AQUATIC));