3 /* Purpose: Monster attacks */
6 * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research, and
9 * not for profit purposes provided that this copyright and statement are
10 * included in all such copies.
15 extern cptr silly_attacks[MAX_SILLY_ATTACK];
18 * Critical blow. All hits that do 95% of total possible damage,
19 * and which also do at least 20 damage, or, sometimes, N damage.
20 * This is used only to determine "cuts" and "stuns".
22 static int monster_critical(int dice, int sides, int dam)
25 int total = dice * sides;
27 /* Must do at least 95% of perfect */
28 if (dam < total * 19 / 20) return (0);
30 /* Weak blows rarely work */
31 if ((dam < 20) && (rand_int(100) >= dam)) return (0);
34 if (dam == total && dam >= 40) max++;
39 while (rand_int(100) < 2) max++;
43 if (dam > 45) return (6 + max);
44 if (dam > 33) return (5 + max);
45 if (dam > 25) return (4 + max);
46 if (dam > 18) return (3 + max);
47 if (dam > 11) return (2 + max);
56 * Determine if a monster attack against the player succeeds.
57 * Always miss 5% of the time, Always hit 5% of the time.
58 * Otherwise, match monster power against player armor.
60 static int check_hit(int power, int level, int stun)
67 if (stun && one_in_(2)) return FALSE;
69 /* Hack -- Always miss or hit */
70 if (k < 10) return (k < 5);
72 /* Calculate the "attack quality" */
73 i = (power + (level * 3));
76 ac = p_ptr->ac + p_ptr->to_a;
77 if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
79 /* Power and Level compete against Armor */
80 if ((i > 0) && (randint(i) > ((ac * 3) / 4))) return (TRUE);
89 * Hack -- possible "insult" messages
91 static cptr desc_insult[] =
94 "¤¬¤¢¤Ê¤¿¤òÉî¿«¤·¤¿¡ª",
95 "¤¬¤¢¤Ê¤¿¤ÎÊì¤òÉî¿«¤·¤¿¡ª",
96 "¤¬¤¢¤Ê¤¿¤ò·ÚÊΤ·¤¿¡ª",
99 "¤¬¤¢¤Ê¤¿¤Î²ó¤ê¤ÇÍ٤ä¿¡ª",
100 "¤¬àÐêø¤Ê¿È¤Ö¤ê¤ò¤·¤¿¡ª",
101 "¤¬¤¢¤Ê¤¿¤ò¤Ü¤ó¤ä¤ê¤È¸«¤¿¡ª¡ª¡ª",
102 "¤¬¤¢¤Ê¤¿¤ò¥Ñ¥é¥µ¥¤¥È¸Æ¤Ð¤ï¤ê¤·¤¿¡ª",
103 "¤¬¤¢¤Ê¤¿¤ò¥µ¥¤¥Ü¡¼¥°°·¤¤¤·¤¿¡ª"
106 "insults your mother!",
107 "gives you the finger!",
110 "dances around you!",
111 "makes obscene gestures!",
120 * Hack -- possible "insult" messages
122 static cptr desc_moan[] =
125 "¤Ï²¿¤«¤òÈᤷ¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£",
126 "¤¬Èà¤Î»ô¤¤¸¤¤ò¸«¤Ê¤«¤Ã¤¿¤«¤È¿Ò¤Í¤Æ¤¤¤ë¡£",
127 "¤¬ÆìÄ¥¤ê¤«¤é½Ð¤Æ¹Ô¤±¤È¸À¤Ã¤Æ¤¤¤ë¡£",
128 "¤Ï¥¥Î¥³¤¬¤É¤¦¤È¤«Ò줤¤Æ¤¤¤ë¡£"
130 "seems sad about something.",
131 "asks if you have seen his dogs.",
132 "tells you to get off his land.",
133 "mumbles something about mushrooms."
140 * Attack the player via physical attacks.
142 bool make_attack_normal(int m_idx)
144 monster_type *m_ptr = &m_list[m_idx];
146 monster_race *r_ptr = &r_info[m_ptr->r_idx];
150 int i, k, tmp, ac, rlev;
159 char o_name[MAX_NLEN];
166 bool touched = FALSE, fear = FALSE, alive = TRUE;
167 bool explode = FALSE;
168 bool resist_drain = FALSE;
169 bool do_silly_attack = (one_in_(2) && p_ptr->image);
172 /* Not allowed to attack */
173 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
175 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE) return (FALSE);
177 /* ...nor if friendly */
178 if (!is_hostile(m_ptr)) return FALSE;
181 ac = p_ptr->ac + p_ptr->to_a;
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, 0x88);
193 if (p_ptr->special_defense & KATA_IAI)
196 msg_print("Áê¼ê¤¬½±¤¤¤«¤«¤ëÁ°¤ËÁÇÁ᤯Éð´ï¤ò¿¶¤ë¤Ã¤¿¡£");
198 msg_format("You took sen, draw and cut in one motion before %s move.", m_name);
200 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
203 if ((p_ptr->special_defense & NINJA_KAWARIMI) && (rand_int(55) < (p_ptr->lev*3/5+20)))
209 /* Assume no blink */
212 /* Scan through all four blows */
213 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
215 bool visible = FALSE;
216 bool obvious = FALSE;
223 /* Extract the attack infomation */
224 int effect = r_ptr->blow[ap_cnt].effect;
225 int method = r_ptr->blow[ap_cnt].method;
226 int d_dice = r_ptr->blow[ap_cnt].d_dice;
227 int d_side = r_ptr->blow[ap_cnt].d_side;
230 if (!m_ptr->r_idx) break;
232 /* Hack -- no more attacks */
235 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
241 /* Stop if player is dead or gone */
242 if (!alive || death) break;
243 if (distance(py, px, m_ptr->fy, m_ptr->fx) > 1) break;
245 /* Handle "leaving" */
246 if (p_ptr->leaving) break;
248 /* Extract visibility (before blink) */
249 if (m_ptr->ml) visible = TRUE;
251 /* Extract the attack "power" */
254 case RBE_HURT: power = 60; break;
255 case RBE_POISON: power = 5; break;
256 case RBE_UN_BONUS: power = 20; break;
257 case RBE_UN_POWER: power = 15; break;
258 case RBE_EAT_GOLD: power = 5; break;
259 case RBE_EAT_ITEM: power = 5; break;
260 case RBE_EAT_FOOD: power = 5; break;
261 case RBE_EAT_LITE: power = 5; break;
262 case RBE_ACID: power = 0; break;
263 case RBE_ELEC: power = 10; break;
264 case RBE_FIRE: power = 10; break;
265 case RBE_COLD: power = 10; break;
266 case RBE_BLIND: power = 2; break;
267 case RBE_CONFUSE: power = 10; break;
268 case RBE_TERRIFY: power = 10; break;
269 case RBE_PARALYZE: power = 2; break;
270 case RBE_LOSE_STR: power = 0; break;
271 case RBE_LOSE_DEX: power = 0; break;
272 case RBE_LOSE_CON: power = 0; break;
273 case RBE_LOSE_INT: power = 0; break;
274 case RBE_LOSE_WIS: power = 0; break;
275 case RBE_LOSE_CHR: power = 0; break;
276 case RBE_LOSE_ALL: power = 2; break;
277 case RBE_SHATTER: power = 60; break;
278 case RBE_EXP_10: power = 5; break;
279 case RBE_EXP_20: power = 5; break;
280 case RBE_EXP_40: power = 5; break;
281 case RBE_EXP_80: power = 5; break;
282 case RBE_DISEASE: power = 5; break;
283 case RBE_TIME: power = 5; break;
284 case RBE_EXP_VAMP: power = 5; break;
285 case RBE_DR_MANA: power = 5; break;
286 case RBE_SUPERHURT: power = 60; break;
290 /* Monster hits player */
291 if (!effect || check_hit(power, rlev, m_ptr->stunned))
293 /* Always disturbing */
297 /* Hack -- Apply "protection from evil" */
298 if ((p_ptr->protevil > 0) &&
299 (r_ptr->flags3 & RF3_EVIL) &&
300 (p_ptr->lev >= rlev) &&
301 ((rand_int(100) + p_ptr->lev) > 50))
303 /* Remember the Evil-ness */
306 r_ptr->r_flags3 |= RF3_EVIL;
312 msg_format("·âÂष¤¿¡£");
314 msg_format("%^s¤Ï·âÂव¤ì¤¿¡£", m_name);
315 syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
317 msg_format("%^s is repelled.", m_name);
321 /* Hack -- Next attack */
326 /* Assume no cut or stun */
327 do_cut = do_stun = 0;
329 /* Describe the attack method */
340 do_cut = do_stun = 1;
351 act = "touches you.";
362 act = "¥Ñ¥ó¥Á¤µ¤ì¤¿¡£";
364 act = "punches you.";
390 act = "¤Ò¤Ã¤«¤«¤ì¤¿¡£";
433 act = "slashes you.";
445 act = "³Ñ¤ÇÆͤ«¤ì¤¿¡£";
459 act = "ÂÎÅö¤¿¤ê¤µ¤ì¤¿¡£";
461 act = "crushes you.";
473 act = "°û¤ß¹þ¤Þ¤ì¤¿¡£";
475 act = "engulfs you.";
487 act = "¤ÏÀÁµá½ñ¤ò¤è¤³¤·¤¿¡£";
489 act = "charges you.";
493 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
501 act = "¤¬ÂΤξå¤òÇ礤²ó¤Ã¤¿¡£";
503 act = "crawls on you.";
514 act = "¤è¤À¤ì¤ò¤¿¤é¤µ¤ì¤¿¡£";
516 act = "drools on you.";
526 act = "ÂäòÅǤ«¤ì¤¿¡£";
528 act = "spits on you.";
539 act = "¤ÏÇúȯ¤·¤¿¡£";
551 act = "¤Ë¤é¤Þ¤ì¤¿¡£";
553 act = "gazes at you.";
562 act = "µã¤¶«¤Ð¤ì¤¿¡£";
564 act = "wails at you.";
574 act = "˦»Ò¤òÈô¤Ð¤µ¤ì¤¿¡£";
576 act = "releases spores at you.";
587 act = "¤¬ XXX4 ¤òȯ¼Í¤·¤¿¡£";
589 act = "projects XXX4's at you.";
598 act = "¶â¤ò¤»¤¬¤Þ¤ì¤¿¡£";
600 act = "begs you for money.";
610 act = desc_insult[rand_int(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
618 act = desc_moan[rand_int(4)];
626 if (m_ptr->r_idx == MON_JAIAN)
634 act = "¡Ö¢ö¤ª¡Á¤ì¤Ï¥¸¥ã¥¤¥¢¥ó¡Á¡Á¥¬¡Á¥¤À¤¤¤·¤ç¤¦¡Á¡×";
637 act = "¡Ö¢ö¤Æ¡Á¤ó¤«¤à¡Á¤Æ¤¤Î¤ª¡Á¤È¤³¤À¤¼¡Á¡Á¡×";
640 act = "¡Ö¢ö¤Î¡Á¤ÓÂÀ¥¹¥ÍÉפϥᤸ¤ã¤Ê¤¤¤è¡Á¡Á¡×";
643 act = "¡Ö¢ö¤±¡Á¤ó¤«¥¹¥Ý¡Á¥Ä¡Á¤É¤ó¤È¤³¤¤¡Á¡×";
646 act = "¡Ö¢ö¤¦¤¿¡Á¤â¡Á¡Á¤¦¡Á¤Þ¤¤¤¼¡Á¤Þ¤«¤·¤È¤±¡Á¡×";
649 act = "¡Ö¢ö¤Þ¡Á¤Á¤¤¤Á¤Ð¡Á¤ó¤Î¤Ë¡Á¤ó¤¤â¤Î¡Á¡Á¡×";
652 act = "¡Ö¢ö¤Ù¤ó¤¤ç¤¦¤·¤å¤¯¤À¤¤¥á¤¸¤ã¤Ê¤¤¤è¡Á¡Á¡×";
655 act = "¡Ö¢ö¤¤Ï¤ä¤µ¤·¡Á¤¯¤Æ¡Á¤Á¡Á¤«¤é¤â¤Á¡Á¡×";
658 act = "¡Ö¢ö¤«¤ª¡Á¤â¡Á¡Á¥¹¥¿¥¤¥ë¤â¡Á¥Ð¥Ä¥°¥ó¤µ¡Á¡×";
661 act = "¡Ö¢ö¤¬¤Ã¤³¤¦¤¤¡Á¤Á¤Î¡Á¤¢¡Á¤Ð¤ì¤ó¤Ü¤¦¡Á¡Á¡×";
664 act = "¡Ö¢ö¥É¡Á¥é¤â¥É¥é¥ß¤â¥á¤¸¤ã¤Ê¤¤¤è¡Á¡Á¡×";
667 act = "¡Ö¢ö¤è¤¸¤²¤ó¤Ý¤±¤Ã¤È¡Á¤Ê¡Á¤¯¤¿¤Ã¤Æ¡Á¡×";
670 act = "¡Ö¢ö¤¢¤·¡Á¤Î¡Á¡Á¤Ê¤¬¤µ¡Á¤Ï¡Á¤Þ¤±¤Ê¤¤¤¼¡Á¡×";
674 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
681 act = "¤Ï¢öËͤé¤Ï³Ú¤·¤¤²È²¢ö¤È²Î¤Ã¤Æ¤¤¤ë¡£";
683 act = "¤Ï¢ö¥¢¥¤ ¥é¥Ö ¥æ¡¼¡¢¥æ¡¼ ¥é¥Ö ¥ß¡¼¢ö¤È²Î¤Ã¤Æ¤¤¤ë¡£";
685 act = "sings 'We are a happy family.'";
687 act = "sings 'I love you, you love me.'";
702 act = silly_attacks[rand_int(MAX_SILLY_ATTACK)];
706 msg_format("%^s¤Ë%s", m_name, act);
707 else if(syouryaku==1)
708 msg_format("%s", act);
709 else /*if(syouryaku==-1)*/
710 msg_format("%^s%s", m_name, act);
711 syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
713 msg_format("%^s %s", m_name, act);
717 /* Hack -- assume all attacks are obvious */
720 /* Roll out the damage */
721 damage = damroll(d_dice, d_side);
724 * Skip the effect when exploding, since the explosion
725 * already causes the effect.
729 /* Apply appropriate damage */
734 /* Hack -- Assume obvious */
737 /* Hack -- No damage */
745 int ac = p_ptr->ac+p_ptr->to_a;
746 if ((randint(rlev*2+300) > (ac+200)) || one_in_(13)) {
747 int tmp_damage = damage-(damage*((ac < 150) ? ac : 150)/250);
749 msg_print("Ä˺¨¤Î°ì·â¡ª");
751 msg_print("It was a critical hit!");
754 tmp_damage = MAX(damage, tmp_damage*2);
757 take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
766 /* Hack -- Player armor reduces total damage */
767 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
770 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
779 /* Take "poison" effect */
780 if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
782 if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5))
788 /* Take some damage */
789 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
791 /* Learn about the player */
792 update_smart_learn(m_idx, DRS_POIS);
801 /* Allow complete resist */
802 if (!p_ptr->resist_disen)
804 /* Apply disenchantment */
805 if (apply_disenchant(0)) obvious = TRUE;
808 /* Take some damage */
809 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
811 /* Learn about the player */
812 update_smart_learn(m_idx, DRS_DISEN);
819 /* Take some damage */
820 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
825 for (k = 0; k < 10; k++)
828 i = rand_int(INVEN_PACK);
830 /* Obtain the item */
831 o_ptr = &inventory[i];
833 /* Skip non-objects */
834 if (!o_ptr->k_idx) continue;
836 /* Drain charged wands/staffs */
837 if (((o_ptr->tval == TV_STAFF) ||
838 (o_ptr->tval == TV_WAND)) &&
841 /* Calculate healed hitpoints */
842 int heal=rlev * o_ptr->pval;
843 if( o_ptr->tval == TV_STAFF)
844 heal *= o_ptr->number;
846 /* Don't heal more than max hp */
847 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
851 msg_print("¥¶¥Ã¥¯¤«¤é¥¨¥Í¥ë¥®¡¼¤¬µÛ¤¤¼è¤é¤ì¤¿¡ª");
853 msg_print("Energy drains from your pack!");
860 /* Heal the monster */
863 /* Redraw (later) if needed */
864 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
865 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
870 /* Combine / Reorder the pack */
871 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
874 p_ptr->window |= (PW_INVEN);
886 /* Take some damage */
887 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
889 /* Confused monsters cannot steal successfully. -LM-*/
890 if (m_ptr->confused) break;
897 /* Saving throw (unless paralyzed) based on dex and level */
898 if (!p_ptr->paralyzed &&
899 (rand_int(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
902 /* Saving throw message */
904 msg_print("¤·¤«¤·ÁÇÁ᤯ºâÉÛ¤ò¼é¤Ã¤¿¡ª");
906 msg_print("You quickly protect your money pouch!");
910 /* Occasional blink anyway */
911 if (rand_int(3)) blinked = TRUE;
917 gold = (p_ptr->au / 10) + randint(25);
918 if (gold < 2) gold = 2;
919 if (gold > 5000) gold = (p_ptr->au / 20) + randint(3000);
920 if (gold > p_ptr->au) gold = p_ptr->au;
925 msg_print("¤·¤«¤·²¿¤âÅð¤Þ¤ì¤Ê¤«¤Ã¤¿¡£");
927 msg_print("Nothing was stolen.");
934 msg_print("ºâÉÛ¤¬·Ú¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£");
935 msg_format("$%ld ¤Î¤ª¶â¤¬Åð¤Þ¤ì¤¿¡ª", (long)gold);
937 msg_print("Your purse feels lighter.");
938 msg_format("%ld coins were stolen!", (long)gold);
940 chg_virtue(V_SACRIFICE, 1);
945 msg_print("ºâÉÛ¤¬·Ú¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£");
946 msg_print("¤ª¶â¤¬Á´ÉôÅð¤Þ¤ì¤¿¡ª");
948 msg_print("Your purse feels lighter.");
949 msg_print("All of your coins were stolen!");
952 chg_virtue(V_SACRIFICE, 2);
956 p_ptr->redraw |= (PR_GOLD);
959 p_ptr->window |= (PW_PLAYER);
970 /* Take some damage */
971 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
973 /* Confused monsters cannot steal successfully. -LM-*/
974 if (m_ptr->confused) break;
978 /* Saving throw (unless paralyzed) based on dex and level */
979 if (!p_ptr->paralyzed &&
980 (rand_int(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
983 /* Saving throw message */
985 msg_print("¤·¤«¤·¤¢¤ï¤Æ¤Æ¥¶¥Ã¥¯¤ò¼è¤êÊÖ¤·¤¿¡ª");
987 msg_print("You grab hold of your backpack!");
991 /* Occasional "blink" anyway */
1002 for (k = 0; k < 10; k++)
1007 i = rand_int(INVEN_PACK);
1009 /* Obtain the item */
1010 o_ptr = &inventory[i];
1012 /* Skip non-objects */
1013 if (!o_ptr->k_idx) continue;
1015 /* Skip artifacts */
1016 if (artifact_p(o_ptr) || o_ptr->art_name) continue;
1018 /* Get a description */
1019 object_desc(o_name, o_ptr, FALSE, 3);
1023 msg_format("%s(%c)¤ò%sÅð¤Þ¤ì¤¿¡ª",
1024 o_name, index_to_label(i),
1025 ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
1027 msg_format("%sour %s (%c) was stolen!",
1028 ((o_ptr->number > 1) ? "One of y" : "Y"),
1029 o_name, index_to_label(i));
1032 chg_virtue(V_SACRIFICE, 1);
1035 /* Make an object */
1043 /* Get new object */
1044 j_ptr = &o_list[o_idx];
1047 object_copy(j_ptr, o_ptr);
1052 /* Hack -- If a rod or wand, allocate total
1053 * maximum timeouts or charges between those
1054 * stolen and those missed. -LM-
1056 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
1058 k_ptr = &k_info[o_ptr->k_idx];
1059 j_ptr->pval = o_ptr->pval / o_ptr->number;
1060 o_ptr->pval -= j_ptr->pval;
1064 j_ptr->marked = FALSE;
1066 /* Memorize monster */
1067 j_ptr->held_m_idx = m_idx;
1070 j_ptr->next_o_idx = m_ptr->hold_o_idx;
1073 m_ptr->hold_o_idx = o_idx;
1076 /* Steal the items */
1077 inven_item_increase(i, -1);
1078 inven_item_optimize(i);
1095 /* Take some damage */
1096 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1100 /* Steal some food */
1101 for (k = 0; k < 10; k++)
1103 /* Pick an item from the pack */
1104 i = rand_int(INVEN_PACK);
1107 o_ptr = &inventory[i];
1109 /* Skip non-objects */
1110 if (!o_ptr->k_idx) continue;
1112 /* Skip non-food objects */
1113 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
1115 /* Get a description */
1116 object_desc(o_name, o_ptr, FALSE, 0);
1120 msg_format("%s(%c)¤ò%s¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª",
1121 o_name, index_to_label(i),
1122 ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
1124 msg_format("%sour %s (%c) was eaten!",
1125 ((o_ptr->number > 1) ? "One of y" : "Y"),
1126 o_name, index_to_label(i));
1130 /* Steal the items */
1131 inven_item_increase(i, -1);
1132 inven_item_optimize(i);
1146 /* Access the lite */
1147 o_ptr = &inventory[INVEN_LITE];
1149 /* Take some damage */
1150 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1155 if ((o_ptr->xtra4 > 0) && (!artifact_p(o_ptr)))
1158 o_ptr->pval -= (250 + randint(250));
1159 if (o_ptr->pval < 1) o_ptr->pval = 1;
1165 msg_print("ÌÀ¤«¤ê¤¬°Å¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¡£");
1167 msg_print("Your light dims.");
1174 p_ptr->window |= (PW_EQUIP);
1188 msg_print("»À¤òÍá¤Ó¤»¤é¤ì¤¿¡ª");
1190 msg_print("You are covered in acid!");
1194 /* Special damage */
1195 acid_dam(damage, ddesc, -1);
1197 /* Learn about the player */
1198 update_smart_learn(m_idx, DRS_ACID);
1211 msg_print("ÅÅ·â¤òÍá¤Ó¤»¤é¤ì¤¿¡ª");
1213 msg_print("You are struck by electricity!");
1217 /* Special damage */
1218 elec_dam(damage, ddesc, -1);
1220 /* Learn about the player */
1221 update_smart_learn(m_idx, DRS_ELEC);
1234 msg_print("Á´¿È¤¬±ê¤ËÊñ¤Þ¤ì¤¿¡ª");
1236 msg_print("You are enveloped in flames!");
1240 /* Special damage */
1241 fire_dam(damage, ddesc, -1);
1243 /* Learn about the player */
1244 update_smart_learn(m_idx, DRS_FIRE);
1257 msg_print("Á´¿È¤¬Î䵤¤Çʤ¤ï¤ì¤¿¡ª");
1259 msg_print("You are covered with frost!");
1263 /* Special damage */
1264 cold_dam(damage, ddesc, -1);
1266 /* Learn about the player */
1267 update_smart_learn(m_idx, DRS_COLD);
1275 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1279 /* Increase "blind" */
1280 if (!p_ptr->resist_blind)
1282 if (set_blind(p_ptr->blind + 10 + randint(rlev)))
1285 if(m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª");
1293 /* Learn about the player */
1294 update_smart_learn(m_idx, DRS_BLIND);
1303 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1307 /* Increase "confused" */
1308 if (!p_ptr->resist_conf)
1310 if (set_confused(p_ptr->confused + 3 + randint(rlev)))
1316 /* Learn about the player */
1317 update_smart_learn(m_idx, DRS_CONF);
1325 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1329 /* Increase "afraid" */
1330 if (p_ptr->resist_fear)
1333 msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
1335 msg_print("You stand your ground!");
1340 else if (rand_int(100 + r_ptr->level/2) < p_ptr->skill_sav)
1343 msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
1345 msg_print("You stand your ground!");
1352 if (set_afraid(p_ptr->afraid + 3 + randint(rlev)))
1358 /* Learn about the player */
1359 update_smart_learn(m_idx, DRS_FEAR);
1367 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1371 /* Increase "paralyzed" */
1372 if (p_ptr->free_act)
1375 msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
1377 msg_print("You are unaffected!");
1382 else if (rand_int(100 + r_ptr->level/2) < p_ptr->skill_sav)
1385 msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª");
1387 msg_print("You resist the effects!");
1394 if (!p_ptr->paralyzed)
1396 if (set_paralyzed(3 + randint(rlev)))
1403 /* Learn about the player */
1404 update_smart_learn(m_idx, DRS_FREE);
1411 /* Damage (physical) */
1412 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1417 if (do_dec_stat(A_STR)) obvious = TRUE;
1424 /* Damage (physical) */
1425 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1430 if (do_dec_stat(A_INT)) obvious = TRUE;
1437 /* Damage (physical) */
1438 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1443 if (do_dec_stat(A_WIS)) obvious = TRUE;
1450 /* Damage (physical) */
1451 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1456 if (do_dec_stat(A_DEX)) obvious = TRUE;
1463 /* Damage (physical) */
1464 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1469 if (do_dec_stat(A_CON)) obvious = TRUE;
1476 /* Damage (physical) */
1477 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1482 if (do_dec_stat(A_CHR)) obvious = TRUE;
1489 /* Damage (physical) */
1490 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1494 /* Damage (stats) */
1495 if (do_dec_stat(A_STR)) obvious = TRUE;
1496 if (do_dec_stat(A_DEX)) obvious = TRUE;
1497 if (do_dec_stat(A_CON)) obvious = TRUE;
1498 if (do_dec_stat(A_INT)) obvious = TRUE;
1499 if (do_dec_stat(A_WIS)) obvious = TRUE;
1500 if (do_dec_stat(A_CHR)) obvious = TRUE;
1510 /* Hack -- Reduce damage based on the player armor class */
1511 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
1514 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1516 /* Radius 8 earthquake centered at the monster */
1517 if (damage > 23 || explode)
1519 earthquake(m_ptr->fy, m_ptr->fx, 8);
1531 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1535 if (p_ptr->prace == RACE_ANDROID)
1538 else if (p_ptr->hold_life && (rand_int(100) < 95))
1541 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
1543 msg_print("You keep hold of your life force!");
1549 s32b d = damroll(10, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1550 if (p_ptr->hold_life)
1553 msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1555 msg_print("You feel your life slipping away!");
1563 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1565 msg_print("You feel your life draining away!");
1580 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1584 if (p_ptr->prace == RACE_ANDROID)
1587 else if (p_ptr->hold_life && (rand_int(100) < 90))
1590 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
1592 msg_print("You keep hold of your life force!");
1598 s32b d = damroll(20, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1599 if (p_ptr->hold_life)
1602 msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1604 msg_print("You feel your life slipping away!");
1612 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1614 msg_print("You feel your life draining away!");
1629 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1633 if (p_ptr->prace == RACE_ANDROID)
1636 else if (p_ptr->hold_life && (rand_int(100) < 75))
1639 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
1641 msg_print("You keep hold of your life force!");
1647 s32b d = damroll(40, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1648 if (p_ptr->hold_life)
1651 msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1653 msg_print("You feel your life slipping away!");
1661 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1663 msg_print("You feel your life draining away!");
1678 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1682 if (p_ptr->prace == RACE_ANDROID)
1685 else if (p_ptr->hold_life && (rand_int(100) < 50))
1688 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
1690 msg_print("You keep hold of your life force!");
1696 s32b d = damroll(80, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1697 if (p_ptr->hold_life)
1700 msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1702 msg_print("You feel your life slipping away!");
1710 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1712 msg_print("You feel your life draining away!");
1723 /* Take some damage */
1724 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1728 /* Take "poison" effect */
1729 if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
1731 if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5))
1737 /* Damage CON (10% chance)*/
1738 if ((randint(100) < 11) && (p_ptr->prace != RACE_ANDROID))
1740 /* 1% chance for perm. damage */
1741 bool perm = (randint(10) == 1);
1742 if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE;
1750 if (!p_ptr->resist_time)
1752 switch (randint(10))
1754 case 1: case 2: case 3: case 4: case 5:
1756 if (p_ptr->prace == RACE_ANDROID) break;
1758 msg_print("¿ÍÀ¸¤¬µÕÌá¤ê¤·¤¿µ¤¤¬¤¹¤ë¡£");
1760 msg_print("You feel life has clocked back.");
1763 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
1767 case 6: case 7: case 8: case 9:
1769 int stat = rand_int(6);
1774 case A_STR: act = "¶¯¤¯"; break;
1775 case A_INT: act = "ÁïÌÀ¤Ç"; break;
1776 case A_WIS: act = "¸ÌÀ¤Ç"; break;
1777 case A_DEX: act = "´ïÍѤÇ"; break;
1778 case A_CON: act = "·ò¹¯¤Ç"; break;
1779 case A_CHR: act = "Èþ¤·¤¯"; break;
1781 case A_STR: act = "strong"; break;
1782 case A_INT: act = "bright"; break;
1783 case A_WIS: act = "wise"; break;
1784 case A_DEX: act = "agile"; break;
1785 case A_CON: act = "hale"; break;
1786 case A_CHR: act = "beautiful"; break;
1792 msg_format("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤É%s¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£", act);
1794 msg_format("You're not as %s as you used to be...", act);
1798 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
1799 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
1800 p_ptr->update |= (PU_BONUS);
1807 msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
1809 msg_print("You're not as powerful as you used to be...");
1813 for (k = 0; k < 6; k++)
1815 p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
1816 if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
1818 p_ptr->update |= (PU_BONUS);
1823 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1833 take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1837 if (p_ptr->prace == RACE_ANDROID)
1840 else if (p_ptr->hold_life && (rand_int(100) < 50))
1843 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤¤Ã¤¿¡ª");
1845 msg_print("You keep hold of your life force!");
1848 resist_drain = TRUE;
1852 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1853 if (p_ptr->hold_life)
1856 msg_print("À¸Ì¿ÎϤ¬¾¯¤·ÂΤ«¤éÈ´¤±Íî¤Á¤¿µ¤¤¬¤¹¤ë¡ª");
1858 msg_print("You feel your life slipping away!");
1866 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1868 msg_print("You feel your life draining away!");
1875 /* Heal the attacker? */
1876 if ((!(p_ptr->prace == RACE_ZOMBIE ||
1877 p_ptr->prace == RACE_VAMPIRE ||
1878 p_ptr->prace == RACE_SPECTRE ||
1879 p_ptr->prace == RACE_SKELETON ||
1880 p_ptr->prace == RACE_DEMON ||
1881 p_ptr->prace == RACE_GOLEM ||
1882 p_ptr->prace == RACE_ANDROID) ||
1883 !(mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)) &&
1884 (damage > 5) && !(resist_drain))
1886 bool did_heal = FALSE;
1888 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1891 m_ptr->hp += damroll(4, damage / 6);
1892 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1894 /* Redraw (later) if needed */
1895 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
1896 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
1898 /* Special message */
1899 if ((m_ptr->ml) && (did_heal))
1902 msg_format("%s¤ÏÂÎÎϤò²óÉü¤·¤¿¤è¤¦¤À¡£", m_name);
1904 msg_format("%^s appears healthier.", m_name);
1914 bool did_heal = FALSE;
1922 p_ptr->csp -= damage;
1926 p_ptr->csp_frac = 0;
1929 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1931 p_ptr->redraw |= (PR_MANA);
1937 /* Hack -- only one of cut or stun */
1938 if (do_cut && do_stun)
1941 if (rand_int(100) < 50)
1958 /* Critical hit (zero if non-critical) */
1959 tmp = monster_critical(d_dice, d_side, damage);
1961 /* Roll for damage */
1964 case 0: k = 0; break;
1965 case 1: k = randint(5); break;
1966 case 2: k = randint(5) + 5; break;
1967 case 3: k = randint(20) + 20; break;
1968 case 4: k = randint(50) + 50; break;
1969 case 5: k = randint(100) + 100; break;
1970 case 6: k = 300; break;
1971 default: k = 500; break;
1975 if (k) (void)set_cut(p_ptr->cut + k);
1983 /* Critical hit (zero if non-critical) */
1984 tmp = monster_critical(d_dice, d_side, damage);
1986 /* Roll for damage */
1989 case 0: k = 0; break;
1990 case 1: k = randint(5); break;
1991 case 2: k = randint(5) + 10; break;
1992 case 3: k = randint(10) + 20; break;
1993 case 4: k = randint(15) + 30; break;
1994 case 5: k = randint(20) + 40; break;
1995 case 6: k = 80; break;
1996 default: k = 150; break;
1999 /* Apply the stun */
2000 if (k) (void)set_stun(p_ptr->stun + k);
2005 sound(SOUND_EXPLODE);
2007 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
2016 if (p_ptr->sh_fire && alive && !death)
2018 if (!(r_ptr->flags3 & RF3_IM_FIRE))
2020 int dam = damroll(2, 6);
2022 /* Modify the damage */
2023 dam = mon_damage_mod(m_ptr, dam, FALSE);
2026 msg_format("%^s¤ÏÆÍÁ³Ç®¤¯¤Ê¤Ã¤¿¡ª", m_name);
2027 if (mon_take_hit(m_idx, dam, &fear,
2028 "¤Ï³¥¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
2030 msg_format("%^s is suddenly very hot!", m_name);
2032 if (mon_take_hit(m_idx, dam, &fear,
2033 " turns into a pile of ash."))
2044 r_ptr->r_flags3 |= RF3_IM_FIRE;
2048 if (p_ptr->sh_elec && alive && !death)
2050 if (!(r_ptr->flags3 & RF3_IM_ELEC))
2052 int dam = damroll(2, 6);
2054 /* Modify the damage */
2055 dam = mon_damage_mod(m_ptr, dam, FALSE);
2058 msg_format("%^s¤ÏÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2059 if (mon_take_hit(m_idx, dam, &fear,
2060 "¤Ïdz¤¨³Ì¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
2062 msg_format("%^s gets zapped!", m_name);
2064 if (mon_take_hit(m_idx, dam, &fear,
2065 " turns into a pile of cinder."))
2076 r_ptr->r_flags3 |= RF3_IM_ELEC;
2080 if (p_ptr->sh_cold && alive && !death)
2082 if (!(r_ptr->flags3 & RF3_IM_COLD))
2084 int dam = damroll(2, 6);
2086 /* Modify the damage */
2087 dam = mon_damage_mod(m_ptr, dam, FALSE);
2090 msg_format("%^s¤ÏÎ䵤¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2091 if (mon_take_hit(m_idx, dam, &fear,
2094 msg_format("%^s is very cold!", m_name);
2096 if (mon_take_hit(m_idx, dam, &fear,
2108 r_ptr->r_flags3 |= RF3_IM_COLD;
2113 if (p_ptr->dustrobe && alive && !death)
2115 if (!(r_ptr->flags4 & RF4_BR_SHAR))
2117 int dam = damroll(2, 6);
2119 /* Modify the damage */
2120 dam = mon_damage_mod(m_ptr, dam, FALSE);
2123 msg_format("%^s¤Ï¶À¤ÎÇËÊÒ¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2124 if (mon_take_hit(m_idx, dam, &fear,
2125 "¤Ï¥º¥¿¥º¥¿¤Ë¤Ê¤Ã¤¿¡£"))
2127 msg_format("%^s gets zapped!", m_name);
2129 if (mon_take_hit(m_idx, dam, &fear,
2130 " had torn to pieces."))
2138 if( cave[py][px].feat == FEAT_MIRROR ){
2139 teleport_player(10);
2144 if (p_ptr->tim_sh_touki && alive && !death)
2146 int dam = damroll(2, 6);
2148 /* Modify the damage */
2149 dam = mon_damage_mod(m_ptr, dam, FALSE);
2152 msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
2153 if (mon_take_hit(m_idx, dam, &fear,
2156 msg_format("%^s is suddenly very hot!", m_name);
2158 if (mon_take_hit(m_idx, dam, &fear,
2159 " turns into a pile of ash."))
2171 /* Monster missed player */
2174 /* Analyze failed attacks */
2190 /* Visible monsters */
2199 msg_format("%s¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤¤Ç" : "");
2201 msg_format("%s%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤¤Ç" : "", m_name);
2202 syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
2204 msg_format("%^s misses you.", m_name);
2215 /* Analyze "visible" monsters only */
2216 if (visible && !do_silly_attack)
2218 /* Count "obvious" attacks (and ones that cause damage) */
2219 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
2221 /* Count attacks of this type */
2222 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
2224 r_ptr->r_blows[ap_cnt]++;
2229 if (p_ptr->riding && damage)
2232 monster_desc(m_name, &m_list[p_ptr->riding], 0);
2233 if (rakuba((damage > 200) ? 200 : damage, FALSE))
2236 msg_format("%^s¤«¤éÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
2238 msg_format("You have fallen from %s.", m_name);
2242 if (p_ptr->special_defense & NINJA_KAWARIMI)
2250 if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !death && m_ptr->ml && (p_ptr->csp > 7))
2253 monster_desc(m_name, m_ptr, 0);
2257 msg_format("%^s¤ËÈ¿·â¤·¤¿¡ª", m_name);
2259 msg_format("Your counterattack to %s!", m_name);
2261 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
2269 msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
2271 msg_print("The thief flees laughing!");
2274 teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE);
2278 /* Always notice cause of death */
2279 if (death && (r_ptr->r_deaths < MAX_SHORT))
2284 if (m_ptr->ml && fear)
2288 msg_format("%^s¤Ï¶²ÉݤÇƨ¤²½Ð¤·¤¿¡ª", m_name);
2290 msg_format("%^s flees in terror!", m_name);
2295 if (p_ptr->special_defense & KATA_IAI)
2297 set_action(ACTION_NONE);
2300 /* Assume we attacked */