3 * @brief モンスターの打撃処理 / Monster attacks
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research,\n
8 * and not for profit purposes provided that this copyright and statement\n
9 * are included in all such copies. Other copyrights may also apply.\n
10 * 2014 Deskull rearranged comment for Doxygen.\n
18 * @brief モンスター打撃のクリティカルランクを返す /
19 * Critical blow. All hits that do 95% of total possible damage,
20 * @param dice モンスター打撃のダイス数
21 * @param sides モンスター打撃の最大ダイス目
22 * @param dam プレイヤーに与えたダメージ
24 * and which also do at least 20 damage, or, sometimes, N damage.
25 * This is used only to determine "cuts" and "stuns".
27 static int monster_critical(int dice, int sides, HIT_POINT dam)
30 int total = dice * sides;
32 /* Must do at least 95% of perfect */
33 if (dam < total * 19 / 20) return (0);
35 /* Weak blows rarely work */
36 if ((dam < 20) && (randint0(100) >= dam)) return (0);
39 if ((dam >= total) && (dam >= 40)) max++;
44 while (randint0(100) < 2) max++;
48 if (dam > 45) return (6 + max);
49 if (dam > 33) return (5 + max);
50 if (dam > 25) return (4 + max);
51 if (dam > 18) return (3 + max);
52 if (dam > 11) return (2 + max);
57 * @brief モンスター打撃の命中を判定する /
58 * Determine if a monster attack against the player succeeds.
59 * @param power 打撃属性毎の基本命中値
60 * @param level モンスターのレベル
61 * @param stun モンスターの朦朧値
64 * Always miss 5% of the time, Always hit 5% of the time.
65 * Otherwise, match monster power against player armor.
67 static int check_hit(int power, int level, int stun)
74 if (stun && one_in_(2)) return FALSE;
76 /* Hack -- Always miss or hit */
77 if (k < 10) return (k < 5);
79 /* Calculate the "attack quality" */
80 i = (power + (level * 3));
83 ac = p_ptr->ac + p_ptr->to_a;
84 if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
86 /* Power and Level compete against Armor */
87 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
95 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
96 static cptr desc_insult[] =
111 "insults your mother!",
112 "gives you the finger!",
115 "dances around you!",
116 "makes obscene gestures!",
118 "calls you a parasite!",
119 "calls you a cyborg!"
125 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
126 static cptr desc_moan[] =
130 "が彼の飼い犬を見なかったかと尋ねている。",
134 "seems sad about something.",
135 "asks if you have seen his dogs.",
136 "tells you to get off his land.",
137 "mumbles something about mushrooms."
144 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
145 * @param m_idx 打撃を行うモンスターのID
146 * @return 実際に攻撃処理を行った場合TRUEを返す
148 bool make_attack_normal(MONSTER_IDX m_idx)
150 monster_type *m_ptr = &m_list[m_idx];
151 monster_race *r_ptr = &r_info[m_ptr->r_idx];
155 int i, k, tmp, ac, rlev;
162 char o_name[MAX_NLEN];
169 bool touched = FALSE, fear = FALSE, alive = TRUE;
170 bool explode = FALSE;
171 bool do_silly_attack = (one_in_(2) && p_ptr->image);
172 HIT_POINT get_damage = 0;
175 /* Not allowed to attack */
176 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
178 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE) return (FALSE);
180 /* ...nor if friendly */
181 if (!is_hostile(m_ptr)) return FALSE;
183 /* Extract the effective monster level */
184 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
187 /* Get the monster name (or "it") */
188 monster_desc(m_name, m_ptr, 0);
190 /* Get the "died from" information (i.e. "a kobold") */
191 monster_desc(ddesc, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
193 if (p_ptr->special_defense & KATA_IAI)
195 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
196 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
199 if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
201 if (kawarimi(TRUE)) return TRUE;
204 /* Assume no blink */
207 /* Scan through all four blows */
208 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
210 bool obvious = FALSE;
213 HIT_POINT damage = 0;
217 /* Extract the attack infomation */
218 int effect = r_ptr->blow[ap_cnt].effect;
219 int method = r_ptr->blow[ap_cnt].method;
220 int d_dice = r_ptr->blow[ap_cnt].d_dice;
221 int d_side = r_ptr->blow[ap_cnt].d_side;
224 if (!m_ptr->r_idx) break;
226 /* Hack -- no more attacks */
229 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
235 /* Stop if player is dead or gone */
236 if (!p_ptr->playing || p_ptr->is_dead) break;
237 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
239 /* Handle "leaving" */
240 if (p_ptr->leaving) break;
242 if (method == RBM_SHOOT) continue;
244 /* Extract the attack "power" */
245 power = mbe_info[effect].power;
248 ac = p_ptr->ac + p_ptr->to_a;
250 /* Monster hits player */
251 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
253 /* Always disturbing */
257 /* Hack -- Apply "protection from evil" */
258 if ((p_ptr->protevil > 0) &&
259 (r_ptr->flags3 & RF3_EVIL) &&
260 (p_ptr->lev >= rlev) &&
261 ((randint0(100) + p_ptr->lev) > 50))
263 /* Remember the Evil-ness */
264 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
271 msg_format("%^sは撃退された。", m_name);
272 abbreviate = 1;/*2回目以降は省略 */
274 msg_format("%^s is repelled.", m_name);
278 /* Hack -- Next attack */
283 /* Assume no cut or stun */
284 do_cut = do_stun = 0;
286 /* Describe the attack method */
291 act = _("殴られた。", "hits you.");
292 do_cut = do_stun = 1;
300 act = _("触られた。", "touches you.");
308 act = _("パンチされた。", "punches you.");
317 act = _("蹴られた。", "kicks you.");
326 act = _("ひっかかれた。", "claws you.");
335 act = _("噛まれた。", "bites you.");
344 act = _("刺された。", "stings you.");
352 act = _("斬られた。", "slashes you.");
361 act = _("角で突かれた。", "butts you.");
370 act = _("体当たりされた。", "crushes you.");
379 act = _("飲み込まれた。", "engulfs you.");
388 act = _("は請求書をよこした。", "charges you.");
390 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
397 act = _("が体の上を這い回った。", "crawls on you.");
405 act = _("よだれをたらされた。", "drools on you.");
412 act = _("唾を吐かれた。", "spits on you.");
420 act = _("は爆発した。", "explodes.");
427 act = _("にらまれた。", "gazes at you.");
433 act = _("泣き叫ばれた。", "wails at you.");
440 act = _("胞子を飛ばされた。", "releases spores at you.");
448 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
454 act = _("金をせがまれた。", "begs you for money.");
464 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
474 act = desc_moan[randint0(4)];
484 if (m_ptr->r_idx == MON_JAIAN)
492 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
495 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
498 act = "「♪の~び太スネ夫はメじゃないよ~~」";
501 act = "「♪け~んかスポ~ツ~どんとこい~」";
504 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
507 act = "「♪ま~ちいちば~んのに~んきもの~~」";
510 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
513 act = "「♪きはやさし~くて~ち~からもち~」";
516 act = "「♪かお~も~~スタイルも~バツグンさ~」";
519 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
522 act = "「♪ド~ラもドラミもメじゃないよ~~」";
525 act = "「♪よじげんぽけっと~な~くたって~」";
528 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
532 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
539 act = "は♪僕らは楽しい家族♪と歌っている。";
541 act = "は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。";
543 act = "sings 'We are a happy family.'";
545 act = "sings 'I love you, you love me.'";
562 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
566 msg_format("%^sに%s", m_name, act);
567 else if (abbreviate == 1)
568 msg_format("%s", act);
569 else /* if (abbreviate == -1) */
570 msg_format("%^s%s", m_name, act);
571 abbreviate = 1;/*2回目以降は省略 */
573 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
577 /* Hack -- assume all attacks are obvious */
580 /* Roll out the damage */
581 damage = damroll(d_dice, d_side);
584 * Skip the effect when exploding, since the explosion
585 * already causes the effect.
589 /* Apply appropriate damage */
594 /* Hack -- Assume obvious */
597 /* Hack -- No damage */
605 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
607 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
608 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
609 tmp_damage = MAX(damage, tmp_damage*2);
612 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
621 /* Hack -- Player armor reduces total damage */
622 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
625 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
634 /* Take "poison" effect */
635 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
637 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
643 /* Take some damage */
644 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
646 /* Learn about the player */
647 update_smart_learn(m_idx, DRS_POIS);
656 /* Allow complete resist */
657 if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
659 /* Apply disenchantment */
660 if (apply_disenchant(0))
662 /* Hack -- Update AC */
668 /* Take some damage */
669 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
671 /* Learn about the player */
672 update_smart_learn(m_idx, DRS_DISEN);
679 /* Take some damage */
680 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
682 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
685 for (k = 0; k < 10; k++)
688 i = randint0(INVEN_PACK);
690 /* Obtain the item */
691 o_ptr = &inventory[i];
693 /* Skip non-objects */
694 if (!o_ptr->k_idx) continue;
696 /* Drain charged wands/staffs */
697 if (((o_ptr->tval == TV_STAFF) ||
698 (o_ptr->tval == TV_WAND)) &&
701 /* Calculate healed hitpoints */
702 int heal=rlev * o_ptr->pval;
703 if( o_ptr->tval == TV_STAFF)
704 heal *= o_ptr->number;
706 /* Don't heal more than max hp */
707 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
710 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
715 /* Heal the monster */
716 m_ptr->hp += (HIT_POINT)heal;
718 /* Redraw (later) if needed */
719 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
720 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
725 /* Combine / Reorder the pack */
726 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
729 p_ptr->window |= (PW_INVEN);
741 /* Take some damage */
742 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
744 /* Confused monsters cannot steal successfully. -LM-*/
745 if (MON_CONFUSED(m_ptr)) break;
747 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
752 /* Saving throw (unless paralyzed) based on dex and level */
753 if (!p_ptr->paralyzed &&
754 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
757 /* Saving throw message */
758 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
760 /* Occasional blink anyway */
761 if (randint0(3)) blinked = TRUE;
767 gold = (p_ptr->au / 10) + randint1(25);
768 if (gold < 2) gold = 2;
769 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
770 if (gold > p_ptr->au) gold = p_ptr->au;
774 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
778 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
779 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
780 chg_virtue(V_SACRIFICE, 1);
784 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
785 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
786 chg_virtue(V_SACRIFICE, 2);
790 p_ptr->redraw |= (PR_GOLD);
793 p_ptr->window |= (PW_PLAYER);
804 /* Take some damage */
805 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
807 /* Confused monsters cannot steal successfully. -LM-*/
808 if (MON_CONFUSED(m_ptr)) break;
810 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
812 /* Saving throw (unless paralyzed) based on dex and level */
813 if (!p_ptr->paralyzed &&
814 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
817 /* Saving throw message */
818 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
820 /* Occasional "blink" anyway */
831 for (k = 0; k < 10; k++)
836 i = randint0(INVEN_PACK);
838 /* Obtain the item */
839 o_ptr = &inventory[i];
841 /* Skip non-objects */
842 if (!o_ptr->k_idx) continue;
845 if (object_is_artifact(o_ptr)) continue;
847 /* Get a description */
848 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
852 msg_format("%s(%c)を%s盗まれた!",
853 o_name, index_to_label(i),
854 ((o_ptr->number > 1) ? "一つ" : ""));
856 msg_format("%sour %s (%c) was stolen!",
857 ((o_ptr->number > 1) ? "One of y" : "Y"),
858 o_name, index_to_label(i));
861 chg_virtue(V_SACRIFICE, 1);
873 j_ptr = &o_list[o_idx];
876 object_copy(j_ptr, o_ptr);
881 /* Hack -- If a rod or wand, allocate total
882 * maximum timeouts or charges between those
883 * stolen and those missed. -LM-
885 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
887 j_ptr->pval = o_ptr->pval / o_ptr->number;
888 o_ptr->pval -= j_ptr->pval;
892 j_ptr->marked = OM_TOUCHED;
894 /* Memorize monster */
895 j_ptr->held_m_idx = m_idx;
898 j_ptr->next_o_idx = m_ptr->hold_o_idx;
901 m_ptr->hold_o_idx = o_idx;
904 /* Steal the items */
905 inven_item_increase(i, -1);
906 inven_item_optimize(i);
923 /* Take some damage */
924 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
926 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
928 /* Steal some food */
929 for (k = 0; k < 10; k++)
931 /* Pick an item from the pack */
932 i = randint0(INVEN_PACK);
935 o_ptr = &inventory[i];
937 /* Skip non-objects */
938 if (!o_ptr->k_idx) continue;
940 /* Skip non-food objects */
941 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
943 /* Get a description */
944 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
948 msg_format("%s(%c)を%s食べられてしまった!",
949 o_name, index_to_label(i),
950 ((o_ptr->number > 1) ? "一つ" : ""));
952 msg_format("%sour %s (%c) was eaten!",
953 ((o_ptr->number > 1) ? "One of y" : "Y"),
954 o_name, index_to_label(i));
958 /* Steal the items */
959 inven_item_increase(i, -1);
960 inven_item_optimize(i);
974 /* Access the lite */
975 o_ptr = &inventory[INVEN_LITE];
977 /* Take some damage */
978 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
980 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
983 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
986 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
987 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
992 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
997 p_ptr->window |= (PW_EQUIP);
1010 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
1012 /* Special damage */
1013 get_damage += acid_dam(damage, ddesc, -1, FALSE);
1015 /* Hack -- Update AC */
1018 /* Learn about the player */
1019 update_smart_learn(m_idx, DRS_ACID);
1031 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
1033 /* Special damage */
1034 get_damage += elec_dam(damage, ddesc, -1, FALSE);
1036 /* Learn about the player */
1037 update_smart_learn(m_idx, DRS_ELEC);
1049 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
1051 /* Special damage */
1052 get_damage += fire_dam(damage, ddesc, -1, FALSE);
1054 /* Learn about the player */
1055 update_smart_learn(m_idx, DRS_FIRE);
1067 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
1069 /* Special damage */
1070 get_damage += cold_dam(damage, ddesc, -1, FALSE);
1072 /* Learn about the player */
1073 update_smart_learn(m_idx, DRS_COLD);
1081 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1083 if (p_ptr->is_dead) break;
1085 /* Increase "blind" */
1086 if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
1088 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
1091 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
1099 /* Learn about the player */
1100 update_smart_learn(m_idx, DRS_BLIND);
1109 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1111 if (p_ptr->is_dead) break;
1113 /* Increase "confused" */
1114 if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
1116 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
1122 /* Learn about the player */
1123 update_smart_learn(m_idx, DRS_CONF);
1131 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1133 if (p_ptr->is_dead) break;
1135 /* Increase "afraid" */
1136 if (CHECK_MULTISHADOW())
1140 else if (p_ptr->resist_fear)
1142 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
1145 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
1147 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
1152 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
1158 /* Learn about the player */
1159 update_smart_learn(m_idx, DRS_FEAR);
1167 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1169 if (p_ptr->is_dead) break;
1171 /* Increase "paralyzed" */
1172 if (CHECK_MULTISHADOW())
1176 else if (p_ptr->free_act)
1178 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
1181 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
1183 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
1188 if (!p_ptr->paralyzed)
1190 if (set_paralyzed(3 + randint1(rlev)))
1197 /* Learn about the player */
1198 update_smart_learn(m_idx, DRS_FREE);
1205 /* Damage (physical) */
1206 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1208 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1211 if (do_dec_stat(A_STR)) obvious = TRUE;
1218 /* Damage (physical) */
1219 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1221 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1224 if (do_dec_stat(A_INT)) obvious = TRUE;
1231 /* Damage (physical) */
1232 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1234 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1237 if (do_dec_stat(A_WIS)) obvious = TRUE;
1244 /* Damage (physical) */
1245 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1247 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1250 if (do_dec_stat(A_DEX)) obvious = TRUE;
1257 /* Damage (physical) */
1258 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1260 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1263 if (do_dec_stat(A_CON)) obvious = TRUE;
1270 /* Damage (physical) */
1271 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1273 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1276 if (do_dec_stat(A_CHR)) obvious = TRUE;
1283 /* Damage (physical) */
1284 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1286 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1288 /* Damage (stats) */
1289 if (do_dec_stat(A_STR)) obvious = TRUE;
1290 if (do_dec_stat(A_DEX)) obvious = TRUE;
1291 if (do_dec_stat(A_CON)) obvious = TRUE;
1292 if (do_dec_stat(A_INT)) obvious = TRUE;
1293 if (do_dec_stat(A_WIS)) obvious = TRUE;
1294 if (do_dec_stat(A_CHR)) obvious = TRUE;
1304 /* Hack -- Reduce damage based on the player armor class */
1305 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
1308 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1310 /* Radius 8 earthquake centered at the monster */
1311 if (damage > 23 || explode)
1313 earthquake_aux(m_ptr->fy, m_ptr->fx, 8, m_idx);
1321 s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1327 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1329 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1331 (void)drain_exp(d, d / 10, 95);
1337 s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1343 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1345 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1347 (void)drain_exp(d, d / 10, 90);
1353 s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1359 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1361 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1363 (void)drain_exp(d, d / 10, 75);
1369 s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1375 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1377 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1379 (void)drain_exp(d, d / 10, 50);
1385 /* Take some damage */
1386 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1388 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1390 /* Take "poison" effect */
1391 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
1393 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
1399 /* Damage CON (10% chance)*/
1400 if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
1402 /* 1% chance for perm. damage */
1403 bool perm = one_in_(10);
1404 if (dec_stat(A_CON, randint1(10), perm))
1406 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
1416 if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
1418 switch (randint1(10))
1420 case 1: case 2: case 3: case 4: case 5:
1422 if (p_ptr->prace == RACE_ANDROID) break;
1423 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
1424 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
1428 case 6: case 7: case 8: case 9:
1430 int stat = randint0(6);
1435 case A_STR: act = "強く"; break;
1436 case A_INT: act = "聡明で"; break;
1437 case A_WIS: act = "賢明で"; break;
1438 case A_DEX: act = "器用で"; break;
1439 case A_CON: act = "健康で"; break;
1440 case A_CHR: act = "美しく"; break;
1442 case A_STR: act = "strong"; break;
1443 case A_INT: act = "bright"; break;
1444 case A_WIS: act = "wise"; break;
1445 case A_DEX: act = "agile"; break;
1446 case A_CON: act = "hale"; break;
1447 case A_CHR: act = "beautiful"; break;
1452 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
1453 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
1454 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
1455 p_ptr->update |= (PU_BONUS);
1461 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
1463 for (k = 0; k < 6; k++)
1465 p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
1466 if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
1468 p_ptr->update |= (PU_BONUS);
1473 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1479 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1486 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1488 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
1490 resist_drain = !drain_exp(d, d / 10, 50);
1492 /* Heal the attacker? */
1493 if (p_ptr->mimic_form)
1495 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
1496 resist_drain = TRUE;
1500 switch (p_ptr->prace)
1509 resist_drain = TRUE;
1514 if ((damage > 5) && !resist_drain)
1516 bool did_heal = FALSE;
1518 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1521 m_ptr->hp += damroll(4, damage / 6);
1522 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1524 /* Redraw (later) if needed */
1525 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
1526 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
1528 /* Special message */
1529 if (m_ptr->ml && did_heal)
1531 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
1542 if (CHECK_MULTISHADOW())
1544 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
1551 p_ptr->csp -= damage;
1555 p_ptr->csp_frac = 0;
1558 p_ptr->redraw |= (PR_MANA);
1561 /* Learn about the player */
1562 update_smart_learn(m_idx, DRS_MANA);
1569 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1571 if (p_ptr->is_dead) break;
1573 /* Decrease speed */
1574 if (CHECK_MULTISHADOW())
1580 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
1591 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1593 if (p_ptr->is_dead) break;
1595 /* Decrease speed */
1596 if (p_ptr->resist_sound || CHECK_MULTISHADOW())
1602 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
1612 /* Hack -- only one of cut or stun */
1613 if (do_cut && do_stun)
1616 if (randint0(100) < 50)
1633 /* Critical hit (zero if non-critical) */
1634 tmp = monster_critical(d_dice, d_side, damage);
1636 /* Roll for damage */
1639 case 0: cut_plus = 0; break;
1640 case 1: cut_plus = randint1(5); break;
1641 case 2: cut_plus = randint1(5) + 5; break;
1642 case 3: cut_plus = randint1(20) + 20; break;
1643 case 4: cut_plus = randint1(50) + 50; break;
1644 case 5: cut_plus = randint1(100) + 100; break;
1645 case 6: cut_plus = 300; break;
1646 default: cut_plus = 500; break;
1650 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
1658 /* Critical hit (zero if non-critical) */
1659 tmp = monster_critical(d_dice, d_side, damage);
1661 /* Roll for damage */
1664 case 0: stun_plus = 0; break;
1665 case 1: stun_plus = randint1(5); break;
1666 case 2: stun_plus = randint1(5) + 10; break;
1667 case 3: stun_plus = randint1(10) + 20; break;
1668 case 4: stun_plus = randint1(15) + 30; break;
1669 case 5: stun_plus = randint1(20) + 40; break;
1670 case 6: stun_plus = 80; break;
1671 default: stun_plus = 150; break;
1674 /* Apply the stun */
1675 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
1680 sound(SOUND_EXPLODE);
1682 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
1691 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
1693 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
1695 HIT_POINT dam = damroll(2, 6);
1697 /* Modify the damage */
1698 dam = mon_damage_mod(m_ptr, dam, FALSE);
1701 msg_format("%^sは突然熱くなった!", m_name);
1702 if (mon_take_hit(m_idx, dam, &fear,
1705 msg_format("%^s is suddenly very hot!", m_name);
1707 if (mon_take_hit(m_idx, dam, &fear,
1708 " turns into a pile of ash."))
1718 if (is_original_ap_and_seen(m_ptr))
1719 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
1723 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
1725 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
1727 HIT_POINT dam = damroll(2, 6);
1729 /* Modify the damage */
1730 dam = mon_damage_mod(m_ptr, dam, FALSE);
1733 msg_format("%^sは電撃をくらった!", m_name);
1734 if (mon_take_hit(m_idx, dam, &fear,
1737 msg_format("%^s gets zapped!", m_name);
1739 if (mon_take_hit(m_idx, dam, &fear,
1740 " turns into a pile of cinder."))
1750 if (is_original_ap_and_seen(m_ptr))
1751 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
1755 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
1757 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
1759 HIT_POINT dam = damroll(2, 6);
1761 /* Modify the damage */
1762 dam = mon_damage_mod(m_ptr, dam, FALSE);
1765 msg_format("%^sは冷気をくらった!", m_name);
1766 if (mon_take_hit(m_idx, dam, &fear,
1769 msg_format("%^s is very cold!", m_name);
1771 if (mon_take_hit(m_idx, dam, &fear,
1782 if (is_original_ap_and_seen(m_ptr))
1783 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
1788 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
1790 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
1792 HIT_POINT dam = damroll(2, 6);
1794 /* Modify the damage */
1795 dam = mon_damage_mod(m_ptr, dam, FALSE);
1798 msg_format("%^sは鏡の破片をくらった!", m_name);
1799 if (mon_take_hit(m_idx, dam, &fear,
1802 msg_format("%^s gets zapped!", m_name);
1804 if (mon_take_hit(m_idx, dam, &fear,
1805 " had torn to pieces."))
1814 if (is_original_ap_and_seen(m_ptr))
1815 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
1818 if (is_mirror_grid(&cave[p_ptr->y][p_ptr->x]))
1820 teleport_player(10, 0L);
1824 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
1826 if (r_ptr->flags3 & RF3_EVIL)
1828 if (!(r_ptr->flagsr & RFR_RES_ALL))
1830 HIT_POINT dam = damroll(2, 6);
1832 /* Modify the damage */
1833 dam = mon_damage_mod(m_ptr, dam, FALSE);
1836 msg_format("%^sは聖なるオーラで傷ついた!", m_name);
1837 if (mon_take_hit(m_idx, dam, &fear,
1840 msg_format("%^s is injured by holy power!", m_name);
1842 if (mon_take_hit(m_idx, dam, &fear,
1849 if (is_original_ap_and_seen(m_ptr))
1850 r_ptr->r_flags3 |= RF3_EVIL;
1854 if (is_original_ap_and_seen(m_ptr))
1855 r_ptr->r_flagsr |= RFR_RES_ALL;
1860 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
1862 if (!(r_ptr->flagsr & RFR_RES_ALL))
1864 HIT_POINT dam = damroll(2, 6);
1866 /* Modify the damage */
1867 dam = mon_damage_mod(m_ptr, dam, FALSE);
1870 msg_format("%^sが鋭い闘気のオーラで傷ついた!", m_name);
1871 if (mon_take_hit(m_idx, dam, &fear,
1874 msg_format("%^s is injured by the Force", m_name);
1876 if (mon_take_hit(m_idx, dam, &fear,
1887 if (is_original_ap_and_seen(m_ptr))
1888 r_ptr->r_flagsr |= RFR_RES_ALL;
1892 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
1895 object_type *o_armed_ptr = &inventory[INVEN_RARM];
1897 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
1899 if (o_armed_ptr->k_idx)
1901 int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
1902 dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
1905 /* Cursed armor makes damages doubled */
1906 o_armed_ptr = &inventory[INVEN_BODY];
1907 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
1909 /* Modify the damage */
1910 dam = mon_damage_mod(m_ptr, dam, FALSE);
1913 msg_format("影のオーラが%^sに反撃した!", m_name);
1914 if (mon_take_hit(m_idx, dam, &fear, "は倒れた。"))
1916 msg_format("Enveloped shadows attack %^s.", m_name);
1918 if (mon_take_hit(m_idx, dam, &fear, " is destroyed."))
1924 else /* monster does not dead */
1927 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
1929 { INVEN_HEAD, GF_OLD_CONF },
1930 { INVEN_LARM, GF_OLD_SLEEP },
1931 { INVEN_HANDS, GF_TURN_ALL },
1932 { INVEN_FEET, GF_OLD_SLOW }
1935 /* Some cursed armours gives an extra effect */
1936 for (j = 0; j < 4; j++)
1938 o_armed_ptr = &inventory[typ[j][0]];
1939 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
1940 project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
1946 if (is_original_ap_and_seen(m_ptr))
1947 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
1953 /* Monster missed player */
1956 /* Analyze failed attacks */
1972 /* Visible monsters */
1981 msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
1983 msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
1984 abbreviate = 1;/*2回目以降は省略 */
1986 msg_format("%^s misses you.", m_name);
1997 /* Analyze "visible" monsters only */
1998 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
2000 /* Count "obvious" attacks (and ones that cause damage) */
2001 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
2003 /* Count attacks of this type */
2004 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
2006 r_ptr->r_blows[ap_cnt]++;
2011 if (p_ptr->riding && damage)
2013 char m_steed_name[80];
2014 monster_desc(m_steed_name, &m_list[p_ptr->riding], 0);
2015 if (rakuba((damage > 200) ? 200 : damage, FALSE))
2017 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
2021 if (p_ptr->special_defense & NINJA_KAWARIMI)
2023 if (kawarimi(FALSE)) return TRUE;
2027 /* Hex - revenge damage stored */
2028 revenge_store(get_damage);
2030 if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
2031 && get_damage > 0 && !p_ptr->is_dead)
2034 msg_format("攻撃が%s自身を傷つけた!", m_name);
2036 char m_name_self[80];
2039 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
2041 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
2043 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
2044 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
2047 if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
2049 char m_target_name[80];
2050 monster_desc(m_target_name, m_ptr, 0);
2053 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
2054 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
2058 p_ptr->redraw |= (PR_MANA);
2062 if (blinked && alive && !p_ptr->is_dead)
2064 if (teleport_barrier(m_idx))
2066 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
2070 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
2071 teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
2076 /* Always notice cause of death */
2077 if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
2082 if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
2085 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
2088 if (p_ptr->special_defense & KATA_IAI)
2090 set_action(ACTION_NONE);
2093 /* Assume we attacked */