2 #include "monsterrace-hook.h"
4 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
7 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
10 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
11 BIT_FLAGS vault_aux_dragon_mask4;
15 * @brief pit/nestの基準となる単種モンスターを決める /
18 void vault_prep_clone(void)
20 /* Apply the monster restriction */
21 get_mon_num_prep(vault_aux_simple, NULL);
23 /* Pick a race to clone */
24 vault_aux_race = get_mon_num(dun_level + 10);
26 /* Remove the monster restriction */
27 get_mon_num_prep(NULL, NULL);
32 * @brief pit/nestの基準となるモンスターシンボルを決める /
35 void vault_prep_symbol(void)
39 /* Apply the monster restriction */
40 get_mon_num_prep(vault_aux_simple, NULL);
42 /* Pick a race to clone */
43 r_idx = get_mon_num(dun_level + 10);
45 /* Remove the monster restriction */
46 get_mon_num_prep(NULL, NULL);
48 /* Extract the symbol */
49 vault_aux_char = r_info[r_idx].d_char;
54 * @brief pit/nestの基準となるドラゴンの種類を決める /
57 void vault_prep_dragon(void)
59 /* Pick dragon type */
63 vault_aux_dragon_mask4 = RF4_BR_ACID;
66 vault_aux_dragon_mask4 = RF4_BR_ELEC;
69 vault_aux_dragon_mask4 = RF4_BR_FIRE;
72 vault_aux_dragon_mask4 = RF4_BR_COLD;
75 vault_aux_dragon_mask4 = RF4_BR_POIS;
77 default: /* Multi-hued */
78 vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS);
84 * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
85 * @param r_idx モンスターID
86 * @return 討伐対象にできるならTRUEを返す。
88 bool mon_hook_quest(MONRACE_IDX r_idx)
90 monster_race *r_ptr = &r_info[r_idx];
92 /* Random quests are in the dungeon */
93 if (r_ptr->flags8 & RF8_WILD_ONLY) return FALSE;
95 /* No random quests for aquatic monsters */
96 if (r_ptr->flags7 & RF7_AQUATIC) return FALSE;
98 /* No random quests for multiplying monsters */
99 if (r_ptr->flags2 & RF2_MULTIPLY) return FALSE;
101 /* No quests to kill friendly monsters */
102 if (r_ptr->flags7 & RF7_FRIENDLY) return FALSE;
109 * @brief モンスターがダンジョンに出現するかどうかを返す
110 * @param r_idx 判定するモンスターの種族ID
111 * @return ダンジョンに出現するならばTRUEを返す
113 bool mon_hook_dungeon(MONRACE_IDX r_idx)
115 monster_race *r_ptr = &r_info[r_idx];
117 if (!(r_ptr->flags8 & RF8_WILD_ONLY))
121 dungeon_info_type *d_ptr = &d_info[p_ptr->dungeon_idx];
122 if ((d_ptr->mflags8 & RF8_WILD_MOUNTAIN) &&
123 (r_ptr->flags8 & RF8_WILD_MOUNTAIN)) return TRUE;
130 * @brief モンスターが海洋に出現するかどうかを返す
131 * @param r_idx 判定するモンスターの種族ID
132 * @return 海洋に出現するならばTRUEを返す
134 bool mon_hook_ocean(MONRACE_IDX r_idx)
136 monster_race *r_ptr = &r_info[r_idx];
138 if (r_ptr->flags8 & RF8_WILD_OCEAN)
146 * @brief モンスターが海岸に出現するかどうかを返す
147 * @param r_idx 判定するモンスターの種族ID
148 * @return 海岸に出現するならばTRUEを返す
150 bool mon_hook_shore(MONRACE_IDX r_idx)
152 monster_race *r_ptr = &r_info[r_idx];
154 if (r_ptr->flags8 & RF8_WILD_SHORE)
162 * @brief モンスターが荒地に出現するかどうかを返す
163 * @param r_idx 判定するモンスターの種族ID
164 * @return 荒地に出現するならばTRUEを返す
166 bool mon_hook_waste(MONRACE_IDX r_idx)
168 monster_race *r_ptr = &r_info[r_idx];
170 if (r_ptr->flags8 & (RF8_WILD_WASTE | RF8_WILD_ALL))
178 * @brief モンスターが町に出現するかどうかを返す
179 * @param r_idx 判定するモンスターの種族ID
180 * @return 荒地に出現するならばTRUEを返す
182 bool mon_hook_town(MONRACE_IDX r_idx)
184 monster_race *r_ptr = &r_info[r_idx];
186 if (r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL))
194 * @brief モンスターが森林に出現するかどうかを返す
195 * @param r_idx 判定するモンスターの種族ID
196 * @return 森林に出現するならばTRUEを返す
198 bool mon_hook_wood(MONRACE_IDX r_idx)
200 monster_race *r_ptr = &r_info[r_idx];
202 if (r_ptr->flags8 & (RF8_WILD_WOOD | RF8_WILD_ALL))
210 * @brief モンスターが火山に出現するかどうかを返す
211 * @param r_idx 判定するモンスターの種族ID
212 * @return 火山に出現するならばTRUEを返す
214 bool mon_hook_volcano(MONRACE_IDX r_idx)
216 monster_race *r_ptr = &r_info[r_idx];
218 if (r_ptr->flags8 & RF8_WILD_VOLCANO)
225 * @brief モンスターが山地に出現するかどうかを返す
226 * @param r_idx 判定するモンスターの種族ID
227 * @return 山地に出現するならばTRUEを返す
229 bool mon_hook_mountain(MONRACE_IDX r_idx)
231 monster_race *r_ptr = &r_info[r_idx];
233 if (r_ptr->flags8 & RF8_WILD_MOUNTAIN)
241 * @brief モンスターが草原に出現するかどうかを返す
242 * @param r_idx 判定するモンスターの種族ID
243 * @return 森林に出現するならばTRUEを返す
245 bool mon_hook_grass(MONRACE_IDX r_idx)
247 monster_race *r_ptr = &r_info[r_idx];
249 if (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(MONRACE_IDX r_idx)
262 monster_race *r_ptr = &r_info[r_idx];
264 if (!mon_hook_dungeon(r_idx)) return FALSE;
266 if (r_ptr->flags7 & RF7_AQUATIC)
274 * @brief モンスターが浅い水地形に出現するかどうかを返す
275 * @param r_idx 判定するモンスターの種族ID
276 * @return 浅い水地形に出現するならばTRUEを返す
278 bool mon_hook_shallow_water(MONRACE_IDX r_idx)
280 monster_race *r_ptr = &r_info[r_idx];
282 if (!mon_hook_dungeon(r_idx)) return FALSE;
284 if (r_ptr->flags2 & RF2_AURA_FIRE)
292 * @brief モンスターが溶岩地形に出現するかどうかを返す
293 * @param r_idx 判定するモンスターの種族ID
294 * @return 溶岩地形に出現するならばTRUEを返す
296 bool mon_hook_lava(MONRACE_IDX r_idx)
298 monster_race *r_ptr = &r_info[r_idx];
299 if (!mon_hook_dungeon(r_idx)) return FALSE;
300 if (((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) ||
301 (r_ptr->flags7 & RF7_CAN_FLY)) &&
302 !(r_ptr->flags3 & RF3_AURA_COLD))
310 * @brief モンスターが通常の床地形に出現するかどうかを返す
311 * @param r_idx 判定するモンスターの種族ID
312 * @return 通常の床地形に出現するならばTRUEを返す
314 bool mon_hook_floor(MONRACE_IDX r_idx)
316 monster_race *r_ptr = &r_info[r_idx];
317 if (!(r_ptr->flags7 & RF7_AQUATIC) || (r_ptr->flags7 & RF7_CAN_FLY))
324 * Helper function for "glass room"
326 bool vault_aux_lite(MONRACE_IDX r_idx)
328 monster_race *r_ptr = &r_info[r_idx];
329 if (!vault_monster_okay(r_idx)) return FALSE;
330 if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE)) return FALSE;
331 if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL)) return FALSE;
332 if (r_ptr->flags4 & RF4_BR_DISI) return FALSE;
337 * Helper function for "glass room"
339 bool vault_aux_shards(MONRACE_IDX r_idx)
341 monster_race *r_ptr = &r_info[r_idx];
342 if (!vault_monster_okay(r_idx)) return FALSE;
343 if (!(r_ptr->flags4 & RF4_BR_SHAR)) return FALSE;
349 * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
350 * Helper monster selection function
351 * @param r_idx 確認したいモンスター種族ID
352 * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
354 bool vault_aux_simple(MONRACE_IDX r_idx)
356 return (vault_monster_okay(r_idx));
361 * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
362 * Helper function for "monster nest (jelly)"
363 * @param r_idx 確認したいモンスター種族ID
364 * @return 生成必要条件を満たしているならTRUEを返す。
366 bool vault_aux_jelly(MONRACE_IDX r_idx)
368 monster_race *r_ptr = &r_info[r_idx];
369 if (!vault_monster_okay(r_idx)) return (FALSE);
370 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
371 if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
372 if (!my_strchr("ijm,", r_ptr->d_char)) return (FALSE);
377 * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
378 * Helper function for "monster nest (animal)"
379 * @param r_idx 確認したいモンスター種族ID
380 * @return 生成必要条件を満たしているならTRUEを返す。
382 bool vault_aux_animal(MONRACE_IDX r_idx)
384 monster_race *r_ptr = &r_info[r_idx];
385 if (!vault_monster_okay(r_idx)) return (FALSE);
386 if (!(r_ptr->flags3 & (RF3_ANIMAL))) return (FALSE);
392 * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
393 * Helper function for "monster nest (undead)"
394 * @param r_idx 確認したいモンスター種族ID
395 * @return 生成必要条件を満たしているならTRUEを返す。
397 bool vault_aux_undead(MONRACE_IDX r_idx)
399 monster_race *r_ptr = &r_info[r_idx];
400 if (!vault_monster_okay(r_idx)) return (FALSE);
401 if (!(r_ptr->flags3 & (RF3_UNDEAD))) return (FALSE);
406 * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
407 * Helper function for "monster nest (chapel)"
408 * @param r_idx 確認したいモンスター種族ID
409 * @return 生成必要条件を満たしているならTRUEを返す。
411 bool vault_aux_chapel_g(MONRACE_IDX r_idx)
413 static int chapel_list[] = {
414 MON_NOV_PRIEST, MON_NOV_PALADIN, MON_NOV_PRIEST_G, MON_NOV_PALADIN_G,
415 MON_PRIEST, MON_JADE_MONK, MON_IVORY_MONK, MON_ULTRA_PALADIN,
416 MON_EBONY_MONK, MON_W_KNIGHT, MON_KNI_TEMPLAR, MON_PALADIN,
420 monster_race *r_ptr = &r_info[r_idx];
421 if (!vault_monster_okay(r_idx)) return (FALSE);
422 if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
423 if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER)) return (FALSE);
424 if (r_ptr->d_char == 'A') return TRUE;
425 for (i = 0; chapel_list[i]; i++)
426 if (r_idx == chapel_list[i]) return TRUE;
431 * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
432 * Helper function for "monster nest (kennel)"
433 * @param r_idx 確認したいモンスター種族ID
434 * @return 生成必要条件を満たしているならTRUEを返す。
436 bool vault_aux_kennel(MONRACE_IDX r_idx)
438 monster_race *r_ptr = &r_info[r_idx];
439 if (!vault_monster_okay(r_idx)) return (FALSE);
440 if (!my_strchr("CZ", r_ptr->d_char)) return (FALSE);
445 * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
446 * Helper function for "monster nest (mimic)"
447 * @param r_idx 確認したいモンスター種族ID
448 * @return 生成必要条件を満たしているならTRUEを返す。
450 bool vault_aux_mimic(MONRACE_IDX r_idx)
452 monster_race *r_ptr = &r_info[r_idx];
453 if (!vault_monster_okay(r_idx)) return (FALSE);
454 if (!my_strchr("!$&(/=?[\\|", r_ptr->d_char)) return (FALSE);
459 * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
460 * Helper function for "monster nest (clone)"
461 * @param r_idx 確認したいモンスター種族ID
462 * @return 生成必要条件を満たしているならTRUEを返す。
464 bool vault_aux_clone(MONRACE_IDX r_idx)
466 if (!vault_monster_okay(r_idx)) return (FALSE);
467 return (r_idx == vault_aux_race);
472 * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
473 * Helper function for "monster nest (symbol clone)"
474 * @param r_idx 確認したいモンスター種族ID
475 * @return 生成必要条件を満たしているならTRUEを返す。
477 bool vault_aux_symbol_e(MONRACE_IDX r_idx)
479 monster_race *r_ptr = &r_info[r_idx];
480 if (!vault_monster_okay(r_idx)) return (FALSE);
481 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
482 if (r_ptr->flags3 & (RF3_GOOD)) return (FALSE);
483 if (r_ptr->d_char != vault_aux_char) return (FALSE);
489 * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
490 * Helper function for "monster nest (symbol clone)"
491 * @param r_idx 確認したいモンスター種族ID
492 * @return 生成必要条件を満たしているならTRUEを返す。
494 bool vault_aux_symbol_g(MONRACE_IDX r_idx)
496 monster_race *r_ptr = &r_info[r_idx];
497 if (!vault_monster_okay(r_idx)) return (FALSE);
498 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
499 if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
500 if (r_ptr->d_char != vault_aux_char) return (FALSE);
506 * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
507 * Helper function for "monster pit (orc)"
508 * @param r_idx 確認したいモンスター種族ID
509 * @return 生成必要条件を満たしているならTRUEを返す。
511 bool vault_aux_orc(MONRACE_IDX r_idx)
513 monster_race *r_ptr = &r_info[r_idx];
514 if (!vault_monster_okay(r_idx)) return (FALSE);
515 if (!(r_ptr->flags3 & RF3_ORC)) return (FALSE);
516 if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
522 * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
523 * Helper function for "monster pit (troll)"
524 * @param r_idx 確認したいモンスター種族ID
525 * @return 生成必要条件を満たしているならTRUEを返す。
527 bool vault_aux_troll(MONRACE_IDX r_idx)
529 monster_race *r_ptr = &r_info[r_idx];
530 if (!vault_monster_okay(r_idx)) return (FALSE);
531 if (!(r_ptr->flags3 & RF3_TROLL)) return (FALSE);
532 if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
538 * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
539 * Helper function for "monster pit (giant)"
540 * @param r_idx 確認したいモンスター種族ID
541 * @return 生成必要条件を満たしているならTRUEを返す。
543 bool vault_aux_giant(MONRACE_IDX r_idx)
545 monster_race *r_ptr = &r_info[r_idx];
546 if (!vault_monster_okay(r_idx)) return (FALSE);
547 if (!(r_ptr->flags3 & RF3_GIANT)) return (FALSE);
548 if (r_ptr->flags3 & RF3_GOOD) return (FALSE);
549 if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
555 * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
556 * Helper function for "monster pit (dragon)"
557 * @param r_idx 確認したいモンスター種族ID
558 * @return 生成必要条件を満たしているならTRUEを返す。
560 bool vault_aux_dragon(MONRACE_IDX r_idx)
562 monster_race *r_ptr = &r_info[r_idx];
563 if (!vault_monster_okay(r_idx)) return (FALSE);
564 if (!(r_ptr->flags3 & RF3_DRAGON)) return (FALSE);
565 if (r_ptr->flags4 != vault_aux_dragon_mask4) return (FALSE);
566 if (r_ptr->flags3 & RF3_UNDEAD) return (FALSE);
572 * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
573 * Helper function for "monster pit (demon)"
574 * @param r_idx 確認したいモンスター種族ID
575 * @return 生成必要条件を満たしているならTRUEを返す。
577 bool vault_aux_demon(MONRACE_IDX r_idx)
579 monster_race *r_ptr = &r_info[r_idx];
580 if (!vault_monster_okay(r_idx)) return (FALSE);
581 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
582 if (!(r_ptr->flags3 & RF3_DEMON)) return (FALSE);
588 * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
589 * Helper function for "monster pit (lovecraftian)"
590 * @param r_idx 確認したいモンスター種族ID
591 * @return 生成必要条件を満たしているならTRUEを返す。
593 bool vault_aux_cthulhu(MONRACE_IDX r_idx)
595 monster_race *r_ptr = &r_info[r_idx];
596 if (!vault_monster_okay(r_idx)) return (FALSE);
597 if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW)) return (FALSE);
598 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
603 * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
604 * Helper function for "monster pit (dark elf)"
605 * @param r_idx 確認したいモンスター種族ID
606 * @return 生成必要条件を満たしているならTRUEを返す。
608 bool vault_aux_dark_elf(MONRACE_IDX r_idx)
611 static int dark_elf_list[] =
613 MON_D_ELF, MON_D_ELF_MAGE, MON_D_ELF_WARRIOR, MON_D_ELF_PRIEST,
614 MON_D_ELF_LORD, MON_D_ELF_WARLOCK, MON_D_ELF_DRUID, MON_NIGHTBLADE,
615 MON_D_ELF_SORC, MON_D_ELF_SHADE, 0,
617 if (!vault_monster_okay(r_idx)) return FALSE;
618 for (i = 0; dark_elf_list[i]; i++) if (r_idx == dark_elf_list[i]) return TRUE;
625 * @brief モンスターが生命体かどうかを返す
626 * Is the monster "alive"?
627 * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
628 * @return 生命体ならばTRUEを返す
630 * Used to determine the message to print for a killed monster.
631 * ("dies", "destroyed")
633 bool monster_living(MONRACE_IDX r_idx)
635 monster_race *r_ptr = &r_info[r_idx];
637 /* Non-living, undead, or demon */
638 if (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING))
645 * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
646 * Is the monster "alive"? / Is this monster declined to be questor or bounty?
647 * @param r_idx モンスターの種族ID
648 * @return 賞金首に加えられないならばTRUEを返す
652 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
657 * Decline them to be questor or bounty because they use
658 * special motion "split and combine"
660 case MON_BANORLUPART:
670 * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
671 * @param r_idx モンスターID
672 * @return 死体を食べられるならTRUEを返す。
674 bool monster_hook_human(MONRACE_IDX r_idx)
676 monster_race *r_ptr = &r_info[r_idx];
677 if (r_ptr->flags1 & (RF1_UNIQUE)) return FALSE;
678 if (my_strchr("pht", r_ptr->d_char)) return TRUE;
684 * @brief 悪夢の元凶となるモンスターかどうかを返す。
685 * @param r_idx 判定対象となるモンスターのID
686 * @return 悪夢の元凶となり得るか否か。
688 bool get_nightmare(MONRACE_IDX r_idx)
690 monster_race *r_ptr = &r_info[r_idx];
692 /* Require eldritch horrors */
693 if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
695 /* Require high level */
696 if (r_ptr->level <= p_ptr->lev) return (FALSE);
698 /* Accept this monster */
703 * @brief モンスター種族が釣れる種族かどうかを判定する。
704 * @param r_idx 判定したいモンスター種族のID
705 * @return 釣れる対象ならばTRUEを返す
707 bool monster_is_fishing_target(MONRACE_IDX r_idx)
709 monster_race *r_ptr = &r_info[r_idx];
711 if ((r_ptr->flags7 & RF7_AQUATIC) && !(r_ptr->flags1 & RF1_UNIQUE) && my_strchr("Jjlw", r_ptr->d_char))
718 * @brief モンスター闘技場に参加できるモンスターの判定
719 * @param r_idx モンスターID
720 * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
721 * 自爆以外のなんらかのHP攻撃手段を持っていること。
724 bool monster_can_entry_arena(MONRACE_IDX r_idx)
729 monster_race *r_ptr = &r_info[r_idx];
731 /* Decline town monsters */
732 /* if (!mon_hook_dungeon(r_idx)) return FALSE; */
734 /* Decline unique monsters */
735 /* if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */
736 /* if (r_ptr->flags7 & (RF7_NAZGUL)) return (FALSE); */
738 if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE);
739 if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE);
740 if (r_ptr->flags2 & (RF2_QUANTUM)) return (FALSE);
741 if (r_ptr->flags7 & (RF7_AQUATIC)) return (FALSE);
742 if (r_ptr->flags7 & (RF7_CHAMELEON)) return (FALSE);
744 for (i = 0; i < 4; i++)
746 if (r_ptr->blow[i].method == RBM_EXPLODE) return (FALSE);
747 if (r_ptr->blow[i].effect != RBE_DR_MANA) dam += r_ptr->blow[i].d_dice;
749 if (!dam && !(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK)) && !(r_ptr->a_ability_flags1 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK)) && !(r_ptr->a_ability_flags2 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK))) return (FALSE);