OSDN Git Service

ヌヒシル、ャ、タ、、、ソ、、、ヌ、ュ、ソ。」
[hengband/hengband.git] / src / melee1.c
1 /* File: melee1.c */
2
3 /* Purpose: Monster attacks */
4
5 /*
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
7  *
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.
11  */
12
13 #include "angband.h"
14
15 extern cptr silly_attacks[MAX_SILLY_ATTACK];
16
17 /*
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".
21  */
22 static int monster_critical(int dice, int sides, int dam)
23 {
24         int max = 0;
25         int total = dice * sides;
26
27         /* Must do at least 95% of perfect */
28         if (dam < total * 19 / 20) return (0);
29
30         /* Weak blows rarely work */
31         if ((dam < 20) && (randint0(100) >= dam)) return (0);
32
33         /* Perfect damage */
34         if (dam == total && dam >= 40) max++;
35
36         /* Super-charge */
37         if (dam >= 20)
38         {
39                 while (randint0(100) < 2) max++;
40         }
41
42         /* Critical damage */
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);
48         return (1 + max);
49 }
50
51
52
53
54
55 /*
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.
59  */
60 static int check_hit(int power, int level, int stun)
61 {
62         int i, k, ac;
63
64         /* Percentile dice */
65         k = randint0(100);
66
67         if (stun && one_in_(2)) return FALSE;
68
69         /* Hack -- Always miss or hit */
70         if (k < 10) return (k < 5);
71
72         /* Calculate the "attack quality" */
73         i = (power + (level * 3));
74
75         /* Total armor */
76         ac = p_ptr->ac + p_ptr->to_a;
77         if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
78
79         /* Power and Level compete against Armor */
80         if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
81
82         /* Assume miss */
83         return (FALSE);
84 }
85
86
87
88 /*
89  * Hack -- possible "insult" messages
90  */
91 static cptr desc_insult[] =
92 {
93 #ifdef JP
94         "¤¬¤¢¤Ê¤¿¤òÉî¿«¤·¤¿¡ª",
95         "¤¬¤¢¤Ê¤¿¤ÎÊì¤òÉî¿«¤·¤¿¡ª",
96         "¤¬¤¢¤Ê¤¿¤ò·ÚÊΤ·¤¿¡ª",
97         "¤¬¤¢¤Ê¤¿¤ò¿«¤á¤¿¡ª",
98         "¤¬¤¢¤Ê¤¿¤ò±ø¤·¤¿¡ª",
99         "¤¬¤¢¤Ê¤¿¤Î²ó¤ê¤ÇÍ٤ä¿¡ª",
100         "¤¬àÐêø¤Ê¿È¤Ö¤ê¤ò¤·¤¿¡ª",
101         "¤¬¤¢¤Ê¤¿¤ò¤Ü¤ó¤ä¤ê¤È¸«¤¿¡ª¡ª¡ª",
102         "¤¬¤¢¤Ê¤¿¤ò¥Ñ¥é¥µ¥¤¥È¸Æ¤Ð¤ï¤ê¤·¤¿¡ª",
103         "¤¬¤¢¤Ê¤¿¤ò¥µ¥¤¥Ü¡¼¥°°·¤¤¤·¤¿¡ª"
104 #else
105         "insults you!",
106         "insults your mother!",
107         "gives you the finger!",
108         "humiliates you!",
109         "defiles you!",
110         "dances around you!",
111         "makes obscene gestures!",
112         "moons you!!!"
113         "calls you a parasite!",
114         "calls you a cyborg!"
115 #endif
116
117 };
118
119
120
121 /*
122  * Hack -- possible "insult" messages
123  */
124 static cptr desc_moan[] =
125 {
126 #ifdef JP
127         "¤Ï²¿¤«¤òÈᤷ¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£",
128         "¤¬Èà¤Î»ô¤¤¸¤¤ò¸«¤Ê¤«¤Ã¤¿¤«¤È¿Ò¤Í¤Æ¤¤¤ë¡£",
129         "¤¬ÆìÄ¥¤ê¤«¤é½Ð¤Æ¹Ô¤±¤È¸À¤Ã¤Æ¤¤¤ë¡£",
130         "¤Ï¥­¥Î¥³¤¬¤É¤¦¤È¤«Ò줤¤Æ¤¤¤ë¡£"
131 #else
132         "seems sad about something.",
133         "asks if you have seen his dogs.",
134         "tells you to get off his land.",
135         "mumbles something about mushrooms."
136 #endif
137
138 };
139
140
141 /*
142  * Attack the player via physical attacks.
143  */
144 bool make_attack_normal(int m_idx)
145 {
146         monster_type *m_ptr = &m_list[m_idx];
147
148         monster_race *r_ptr = &r_info[m_ptr->r_idx];
149
150         int ap_cnt;
151
152         int i, k, tmp, ac, rlev;
153         int do_cut, do_stun;
154
155         s32b gold;
156
157         object_type *o_ptr;
158
159         object_kind *k_ptr;
160
161         char o_name[MAX_NLEN];
162
163         char m_name[80];
164
165         char ddesc[80];
166
167         bool blinked;
168         bool touched = FALSE, fear = FALSE, alive = TRUE;
169         bool explode = FALSE;
170         bool resist_drain = FALSE;
171         bool do_silly_attack = (one_in_(2) && p_ptr->image);
172         int syouryaku = 0;
173         int get_damage = 0;
174
175         /* Not allowed to attack */
176         if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
177
178         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE) return (FALSE);
179
180         /* ...nor if friendly */
181         if (!is_hostile(m_ptr)) return FALSE;
182
183         /* Total armor */
184         ac = p_ptr->ac + p_ptr->to_a;
185
186         /* Extract the effective monster level */
187         rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
188
189
190         /* Get the monster name (or "it") */
191         monster_desc(m_name, m_ptr, 0);
192
193         /* Get the "died from" information (i.e. "a kobold") */
194         monster_desc(ddesc, m_ptr, 0x288);
195
196         if (p_ptr->special_defense & KATA_IAI)
197         {
198 #ifdef JP
199                 msg_print("Áê¼ê¤¬½±¤¤¤«¤«¤ëÁ°¤ËÁÇÁ᤯Éð´ï¤ò¿¶¤ë¤Ã¤¿¡£");
200 #else
201                 msg_format("You took sen, draw and cut in one motion before %s move.", m_name);
202 #endif
203                 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
204         }
205
206         if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
207         {
208                 kawarimi(TRUE);
209                 return TRUE;
210         }
211
212         /* Assume no blink */
213         blinked = FALSE;
214
215         /* Scan through all four blows */
216         for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
217         {
218                 bool visible = FALSE;
219                 bool obvious = FALSE;
220
221                 int power = 0;
222                 int damage = 0;
223
224                 cptr act = NULL;
225
226                 /* Extract the attack infomation */
227                 int effect = r_ptr->blow[ap_cnt].effect;
228                 int method = r_ptr->blow[ap_cnt].method;
229                 int d_dice = r_ptr->blow[ap_cnt].d_dice;
230                 int d_side = r_ptr->blow[ap_cnt].d_side;
231
232
233                 if (!m_ptr->r_idx) break;
234
235                 /* Hack -- no more attacks */
236                 if (!method) break;
237
238                 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
239                 {
240                         method = RBM_HIT;
241                         d_dice /= 10;
242                 }
243
244                 /* Stop if player is dead or gone */
245                 if (!alive || death) break;
246                 if (distance(py, px, m_ptr->fy, m_ptr->fx) > 1) break;
247
248                 /* Handle "leaving" */
249                 if (p_ptr->leaving) break;
250
251                 if (method == RBM_SHOOT) continue;
252
253                 /* Extract visibility (before blink) */
254                 if (m_ptr->ml) visible = TRUE;
255
256                 /* Extract the attack "power" */
257                 switch (effect)
258                 {
259                         case RBE_HURT:      power = 60; break;
260                         case RBE_POISON:    power =  5; break;
261                         case RBE_UN_BONUS:  power = 20; break;
262                         case RBE_UN_POWER:  power = 15; break;
263                         case RBE_EAT_GOLD:  power =  5; break;
264                         case RBE_EAT_ITEM:  power =  5; break;
265                         case RBE_EAT_FOOD:  power =  5; break;
266                         case RBE_EAT_LITE:  power =  5; break;
267                         case RBE_ACID:      power =  0; break;
268                         case RBE_ELEC:      power = 10; break;
269                         case RBE_FIRE:      power = 10; break;
270                         case RBE_COLD:      power = 10; break;
271                         case RBE_BLIND:     power =  2; break;
272                         case RBE_CONFUSE:   power = 10; break;
273                         case RBE_TERRIFY:   power = 10; break;
274                         case RBE_PARALYZE:  power =  2; break;
275                         case RBE_LOSE_STR:  power =  0; break;
276                         case RBE_LOSE_DEX:  power =  0; break;
277                         case RBE_LOSE_CON:  power =  0; break;
278                         case RBE_LOSE_INT:  power =  0; break;
279                         case RBE_LOSE_WIS:  power =  0; break;
280                         case RBE_LOSE_CHR:  power =  0; break;
281                         case RBE_LOSE_ALL:  power =  2; break;
282                         case RBE_SHATTER:   power = 60; break;
283                         case RBE_EXP_10:    power =  5; break;
284                         case RBE_EXP_20:    power =  5; break;
285                         case RBE_EXP_40:    power =  5; break;
286                         case RBE_EXP_80:    power =  5; break;
287                         case RBE_DISEASE:   power =  5; break;
288                         case RBE_TIME:      power =  5; break;
289                         case RBE_EXP_VAMP:  power =  5; break;
290                         case RBE_DR_MANA:   power =  5; break;
291                         case RBE_SUPERHURT: power = 60; break;
292                 }
293
294
295                 /* Monster hits player */
296                 if (!effect || check_hit(power, rlev, m_ptr->stunned))
297                 {
298                         /* Always disturbing */
299                         disturb(1, 0);
300
301
302                         /* Hack -- Apply "protection from evil" */
303                         if ((p_ptr->protevil > 0) &&
304                             (r_ptr->flags3 & RF3_EVIL) &&
305                             (p_ptr->lev >= rlev) &&
306                             ((randint0(100) + p_ptr->lev) > 50))
307                         {
308                                 /* Remember the Evil-ness */
309                                 if (m_ptr->ml)
310                                 {
311                                         r_ptr->r_flags3 |= RF3_EVIL;
312                                 }
313
314                                 /* Message */
315 #ifdef JP
316                                 if (syouryaku)
317                                     msg_format("·âÂष¤¿¡£");
318                                 else
319                                     msg_format("%^s¤Ï·âÂव¤ì¤¿¡£", m_name);
320                                 syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
321 #else
322                                 msg_format("%^s is repelled.", m_name);
323 #endif
324
325
326                                 /* Hack -- Next attack */
327                                 continue;
328                         }
329
330
331                         /* Assume no cut or stun */
332                         do_cut = do_stun = 0;
333
334                         /* Describe the attack method */
335                         switch (method)
336                         {
337                                 case RBM_HIT:
338                                 {
339 #ifdef JP
340                                         act = "²¥¤é¤ì¤¿¡£";
341 #else
342                                         act = "hits you.";
343 #endif
344
345                                         do_cut = do_stun = 1;
346                                         touched = TRUE;
347                                         sound(SOUND_HIT);
348                                         break;
349                                 }
350
351                                 case RBM_TOUCH:
352                                 {
353 #ifdef JP
354                                         act = "¿¨¤é¤ì¤¿¡£";
355 #else
356                                         act = "touches you.";
357 #endif
358
359                                         touched = TRUE;
360                                         sound(SOUND_TOUCH);
361                                         break;
362                                 }
363
364                                 case RBM_PUNCH:
365                                 {
366 #ifdef JP
367                                         act = "¥Ñ¥ó¥Á¤µ¤ì¤¿¡£";
368 #else
369                                         act = "punches you.";
370 #endif
371
372                                         touched = TRUE;
373                                         do_stun = 1;
374                                         sound(SOUND_HIT);
375                                         break;
376                                 }
377
378                                 case RBM_KICK:
379                                 {
380 #ifdef JP
381                                         act = "½³¤é¤ì¤¿¡£";
382 #else
383                                         act = "kicks you.";
384 #endif
385
386                                         touched = TRUE;
387                                         do_stun = 1;
388                                         sound(SOUND_HIT);
389                                         break;
390                                 }
391
392                                 case RBM_CLAW:
393                                 {
394 #ifdef JP
395                                         act = "¤Ò¤Ã¤«¤«¤ì¤¿¡£";
396 #else
397                                         act = "claws you.";
398 #endif
399
400                                         touched = TRUE;
401                                         do_cut = 1;
402                                         sound(SOUND_CLAW);
403                                         break;
404                                 }
405
406                                 case RBM_BITE:
407                                 {
408 #ifdef JP
409                                         act = "³ú¤Þ¤ì¤¿¡£";
410 #else
411                                         act = "bites you.";
412 #endif
413
414                                         do_cut = 1;
415                                         touched = TRUE;
416                                         sound(SOUND_BITE);
417                                         break;
418                                 }
419
420                                 case RBM_STING:
421                                 {
422 #ifdef JP
423                                         act = "»É¤µ¤ì¤¿¡£";
424 #else
425                                         act = "stings you.";
426 #endif
427
428                                         touched = TRUE;
429                                         sound(SOUND_STING);
430                                         break;
431                                 }
432
433                                 case RBM_SLASH:
434                                 {
435 #ifdef JP
436                                         act = "»Â¤é¤ì¤¿¡£";
437 #else
438                                         act = "slashes you.";
439 #endif
440
441                                         touched = TRUE;
442                                         do_cut = 1;
443                                         sound(SOUND_CLAW);
444                                         break;
445                                 }
446
447                                 case RBM_BUTT:
448                                 {
449 #ifdef JP
450                                         act = "³Ñ¤ÇÆͤ«¤ì¤¿¡£";
451 #else
452                                         act = "butts you.";
453 #endif
454
455                                         do_stun = 1;
456                                         touched = TRUE;
457                                         sound(SOUND_HIT);
458                                         break;
459                                 }
460
461                                 case RBM_CRUSH:
462                                 {
463 #ifdef JP
464                                         act = "ÂÎÅö¤¿¤ê¤µ¤ì¤¿¡£";
465 #else
466                                         act = "crushes you.";
467 #endif
468
469                                         do_stun = 1;
470                                         touched = TRUE;
471                                         sound(SOUND_CRUSH);
472                                         break;
473                                 }
474
475                                 case RBM_ENGULF:
476                                 {
477 #ifdef JP
478                                         act = "°û¤ß¹þ¤Þ¤ì¤¿¡£";
479 #else
480                                         act = "engulfs you.";
481 #endif
482
483                                         touched = TRUE;
484                                         sound(SOUND_CRUSH);
485                                         break;
486                                 }
487
488                                 case RBM_CHARGE:
489                                 {
490 #ifdef JP
491                                         syouryaku = -1;
492                                         act = "¤ÏÀÁµá½ñ¤ò¤è¤³¤·¤¿¡£";
493 #else
494                                         act = "charges you.";
495 #endif
496
497                                         touched = TRUE;
498                                         sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
499                                         break;
500                                 }
501
502                                 case RBM_CRAWL:
503                                 {
504 #ifdef JP
505                                         syouryaku = -1;
506                                         act = "¤¬ÂΤξå¤òÇ礤²ó¤Ã¤¿¡£";
507 #else
508                                         act = "crawls on you.";
509 #endif
510
511                                         touched = TRUE;
512                                         sound(SOUND_SLIME);
513                                         break;
514                                 }
515
516                                 case RBM_DROOL:
517                                 {
518 #ifdef JP
519                                         act = "¤è¤À¤ì¤ò¤¿¤é¤µ¤ì¤¿¡£";
520 #else
521                                         act = "drools on you.";
522 #endif
523
524                                         sound(SOUND_SLIME);
525                                         break;
526                                 }
527
528                                 case RBM_SPIT:
529                                 {
530 #ifdef JP
531                                         act = "ÂäòÅǤ«¤ì¤¿¡£";
532 #else
533                                         act = "spits on you.";
534 #endif
535
536                                         sound(SOUND_SLIME);
537                                         break;
538                                 }
539
540                                 case RBM_EXPLODE:
541                                 {
542                                         syouryaku = -1;
543 #ifdef JP
544                                         act = "¤ÏÇúȯ¤·¤¿¡£";
545 #else
546                                         act = "explodes.";
547 #endif
548
549                                         explode = TRUE;
550                                         break;
551                                 }
552
553                                 case RBM_GAZE:
554                                 {
555 #ifdef JP
556                                         act = "¤Ë¤é¤Þ¤ì¤¿¡£";
557 #else
558                                         act = "gazes at you.";
559 #endif
560
561                                         break;
562                                 }
563
564                                 case RBM_WAIL:
565                                 {
566 #ifdef JP
567                                         act = "µã¤­¶«¤Ð¤ì¤¿¡£";
568 #else
569                                         act = "wails at you.";
570 #endif
571
572                                         sound(SOUND_WAIL);
573                                         break;
574                                 }
575
576                                 case RBM_SPORE:
577                                 {
578 #ifdef JP
579                                         act = "˦»Ò¤òÈô¤Ð¤µ¤ì¤¿¡£";
580 #else
581                                         act = "releases spores at you.";
582 #endif
583
584                                         sound(SOUND_SLIME);
585                                         break;
586                                 }
587
588                                 case RBM_XXX4:
589                                 {
590                                         syouryaku = -1;
591 #ifdef JP
592                                         act = "¤¬ XXX4 ¤òȯ¼Í¤·¤¿¡£";
593 #else
594                                         act = "projects XXX4's at you.";
595 #endif
596
597                                         break;
598                                 }
599
600                                 case RBM_BEG:
601                                 {
602 #ifdef JP
603                                         act = "¶â¤ò¤»¤¬¤Þ¤ì¤¿¡£";
604 #else
605                                         act = "begs you for money.";
606 #endif
607
608                                         sound(SOUND_MOAN);
609                                         break;
610                                 }
611
612                                 case RBM_INSULT:
613                                 {
614                                         syouryaku = -1;
615                                         act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
616                                         sound(SOUND_MOAN);
617                                         break;
618                                 }
619
620                                 case RBM_MOAN:
621                                 {
622                                         syouryaku = -1;
623                                         act = desc_moan[randint0(4)];
624                                         sound(SOUND_MOAN);
625                                         break;
626                                 }
627
628                                 case RBM_SHOW:
629                                 {
630                                         syouryaku = -1;
631                                         if (m_ptr->r_idx == MON_JAIAN)
632                                         {
633 #ifdef JP
634                                                 switch(randint1(15))
635                                                 {
636                                                   case 1:
637                                                   case 6:
638                                                   case 11:
639                                                         act = "¡Ö¢ö¤ª¡Á¤ì¤Ï¥¸¥ã¥¤¥¢¥ó¡Á¡Á¥¬¡Á¥­¤À¤¤¤·¤ç¤¦¡Á¡×";
640                                                         break;
641                                                   case 2:
642                                                         act = "¡Ö¢ö¤Æ¡Á¤ó¤«¤à¡Á¤Æ¤­¤Î¤ª¡Á¤È¤³¤À¤¼¡Á¡Á¡×";
643                                                         break;
644                                                   case 3:
645                                                         act = "¡Ö¢ö¤Î¡Á¤ÓÂÀ¥¹¥ÍÉפϥᤸ¤ã¤Ê¤¤¤è¡Á¡Á¡×";
646                                                         break;
647                                                   case 4:
648                                                         act = "¡Ö¢ö¤±¡Á¤ó¤«¥¹¥Ý¡Á¥Ä¡Á¤É¤ó¤È¤³¤¤¡Á¡×";
649                                                         break;
650                                                   case 5:
651                                                         act = "¡Ö¢ö¤¦¤¿¡Á¤â¡Á¡Á¤¦¡Á¤Þ¤¤¤¼¡Á¤Þ¤«¤·¤È¤±¡Á¡×";
652                                                         break;
653                                                   case 7:
654                                                         act = "¡Ö¢ö¤Þ¡Á¤Á¤¤¤Á¤Ð¡Á¤ó¤Î¤Ë¡Á¤ó¤­¤â¤Î¡Á¡Á¡×";
655                                                         break;
656                                                   case 8:
657                                                         act = "¡Ö¢ö¤Ù¤ó¤­¤ç¤¦¤·¤å¤¯¤À¤¤¥á¤¸¤ã¤Ê¤¤¤è¡Á¡Á¡×";
658                                                         break;
659                                                   case 9:
660                                                         act = "¡Ö¢ö¤­¤Ï¤ä¤µ¤·¡Á¤¯¤Æ¡Á¤Á¡Á¤«¤é¤â¤Á¡Á¡×";
661                                                         break;
662                                                   case 10:
663                                                         act = "¡Ö¢ö¤«¤ª¡Á¤â¡Á¡Á¥¹¥¿¥¤¥ë¤â¡Á¥Ð¥Ä¥°¥ó¤µ¡Á¡×";
664                                                         break;
665                                                   case 12:
666                                                         act = "¡Ö¢ö¤¬¤Ã¤³¤¦¤¤¡Á¤Á¤Î¡Á¤¢¡Á¤Ð¤ì¤ó¤Ü¤¦¡Á¡Á¡×";
667                                                         break;
668                                                   case 13:
669                                                         act = "¡Ö¢ö¥É¡Á¥é¤â¥É¥é¥ß¤â¥á¤¸¤ã¤Ê¤¤¤è¡Á¡Á¡×";
670                                                         break;
671                                                   case 14:
672                                                         act = "¡Ö¢ö¤è¤¸¤²¤ó¤Ý¤±¤Ã¤È¡Á¤Ê¡Á¤¯¤¿¤Ã¤Æ¡Á¡×";
673                                                         break;
674                                                   case 15:
675                                                         act = "¡Ö¢ö¤¢¤·¡Á¤Î¡Á¡Á¤Ê¤¬¤µ¡Á¤Ï¡Á¤Þ¤±¤Ê¤¤¤¼¡Á¡×";
676                                                         break;
677                                                 }
678 #else
679                                                 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
680 #endif
681                                         }
682                                         else
683                                         {
684                                                 if (one_in_(3))
685 #ifdef JP
686                                                         act = "¤Ï¢öËͤé¤Ï³Ú¤·¤¤²È²¢ö¤È²Î¤Ã¤Æ¤¤¤ë¡£";
687                                                 else
688                                                         act = "¤Ï¢ö¥¢¥¤ ¥é¥Ö ¥æ¡¼¡¢¥æ¡¼ ¥é¥Ö ¥ß¡¼¢ö¤È²Î¤Ã¤Æ¤¤¤ë¡£";
689 #else
690                                                         act = "sings 'We are a happy family.'";
691                                                 else
692                                                         act = "sings 'I love you, you love me.'";
693 #endif
694                                         }
695
696                                         sound(SOUND_SHOW);
697                                         break;
698                                 }
699                         }
700
701                         /* Message */
702                         if (act)
703                         {
704                                 if (do_silly_attack)
705                                 {
706                                         syouryaku = -1;
707                                         act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
708                                 }
709 #ifdef JP
710                                 if(syouryaku==0)
711                                     msg_format("%^s¤Ë%s", m_name, act);
712                                 else if(syouryaku==1)
713                                     msg_format("%s", act);
714                                 else /*if(syouryaku==-1)*/
715                                     msg_format("%^s%s", m_name, act);
716                                 syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
717 #else
718                                 msg_format("%^s %s", m_name, act);
719 #endif
720                         }
721
722                         /* Hack -- assume all attacks are obvious */
723                         obvious = TRUE;
724
725                         /* Roll out the damage */
726                         damage = damroll(d_dice, d_side);
727
728                         /*
729                          * Skip the effect when exploding, since the explosion
730                          * already causes the effect.
731                          */
732                         if (explode)
733                                 damage = 0;
734                         /* Apply appropriate damage */
735                         switch (effect)
736                         {
737                                 case 0:
738                                 {
739                                         /* Hack -- Assume obvious */
740                                         obvious = TRUE;
741
742                                         /* Hack -- No damage */
743                                         damage = 0;
744
745                                         break;
746                                 }
747
748                                 case RBE_SUPERHURT:
749                                 {
750                                         int ac = p_ptr->ac+p_ptr->to_a;
751                                         if ((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) {
752                                                 int tmp_damage = damage-(damage*((ac < 150) ? ac : 150)/250);
753 #ifdef JP
754                                                 msg_print("Ä˺¨¤Î°ì·â¡ª");
755 #else
756                                                 msg_print("It was a critical hit!");
757 #endif
758
759                                                 tmp_damage = MAX(damage, tmp_damage*2);
760
761                                                 /* Take damage */
762                                                 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
763                                                 break;
764                                         }
765                                 }
766                                 case RBE_HURT:
767                                 {
768                                         /* Obvious */
769                                         obvious = TRUE;
770
771                                         /* Hack -- Player armor reduces total damage */
772                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
773
774                                         /* Take damage */
775                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
776
777                                         break;
778                                 }
779
780                                 case RBE_POISON:
781                                 {
782                                         if (explode) break;
783
784                                         /* Take "poison" effect */
785                                         if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
786                                         {
787                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
788                                                 {
789                                                         obvious = TRUE;
790                                                 }
791                                         }
792
793                                         /* Take some damage */
794                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
795
796                                         /* Learn about the player */
797                                         update_smart_learn(m_idx, DRS_POIS);
798
799                                         break;
800                                 }
801
802                                 case RBE_UN_BONUS:
803                                 {
804                                         if (explode) break;
805
806                                         /* Allow complete resist */
807                                         if (!p_ptr->resist_disen)
808                                         {
809                                                 /* Apply disenchantment */
810                                                 if (apply_disenchant(0)) obvious = TRUE;
811                                         }
812
813                                         /* Take some damage */
814                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
815
816                                         /* Learn about the player */
817                                         update_smart_learn(m_idx, DRS_DISEN);
818
819                                         break;
820                                 }
821
822                                 case RBE_UN_POWER:
823                                 {
824                                         /* Take some damage */
825                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
826
827                                         if (death) break;
828
829                                         /* Find an item */
830                                         for (k = 0; k < 10; k++)
831                                         {
832                                                 /* Pick an item */
833                                                 i = randint0(INVEN_PACK);
834
835                                                 /* Obtain the item */
836                                                 o_ptr = &inventory[i];
837
838                                                 /* Skip non-objects */
839                                                 if (!o_ptr->k_idx) continue;
840
841                                                 /* Drain charged wands/staffs */
842                                                 if (((o_ptr->tval == TV_STAFF) ||
843                                                      (o_ptr->tval == TV_WAND)) &&
844                                                     (o_ptr->pval))
845                                                 {
846                                                         /* Calculate healed hitpoints */
847                                                         int heal=rlev * o_ptr->pval;
848                                                         if( o_ptr->tval == TV_STAFF)
849                                                             heal *=  o_ptr->number;
850
851                                                         /* Don't heal more than max hp */
852                                                         heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
853
854                                                         /* Message */
855 #ifdef JP
856                                                         msg_print("¥¶¥Ã¥¯¤«¤é¥¨¥Í¥ë¥®¡¼¤¬µÛ¤¤¼è¤é¤ì¤¿¡ª");
857 #else
858                                                         msg_print("Energy drains from your pack!");
859 #endif
860
861
862                                                         /* Obvious */
863                                                         obvious = TRUE;
864
865                                                         /* Heal the monster */
866                                                         m_ptr->hp += heal;
867
868                                                         /* Redraw (later) if needed */
869                                                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
870                                                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
871
872                                                         /* Uncharge */
873                                                         o_ptr->pval = 0;
874
875                                                         /* Combine / Reorder the pack */
876                                                         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
877
878                                                         /* Window stuff */
879                                                         p_ptr->window |= (PW_INVEN);
880
881                                                         /* Done */
882                                                         break;
883                                                 }
884                                         }
885
886                                         break;
887                                 }
888
889                                 case RBE_EAT_GOLD:
890                                 {
891                                         /* Take some damage */
892                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
893
894                                         /* Confused monsters cannot steal successfully. -LM-*/
895                                         if (m_ptr->confused) break;
896
897                                         if (death) break;
898
899                                         /* Obvious */
900                                         obvious = TRUE;
901
902                                         /* Saving throw (unless paralyzed) based on dex and level */
903                                         if (!p_ptr->paralyzed &&
904                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
905                                                               p_ptr->lev)))
906                                         {
907                                                 /* Saving throw message */
908 #ifdef JP
909                                                 msg_print("¤·¤«¤·ÁÇÁ᤯ºâÉÛ¤ò¼é¤Ã¤¿¡ª");
910 #else
911                                                 msg_print("You quickly protect your money pouch!");
912 #endif
913
914
915                                                 /* Occasional blink anyway */
916                                                 if (randint0(3)) blinked = TRUE;
917                                         }
918
919                                         /* Eat gold */
920                                         else
921                                         {
922                                                 gold = (p_ptr->au / 10) + randint1(25);
923                                                 if (gold < 2) gold = 2;
924                                                 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
925                                                 if (gold > p_ptr->au) gold = p_ptr->au;
926                                                 p_ptr->au -= gold;
927                                                 if (gold <= 0)
928                                                 {
929 #ifdef JP
930                                                         msg_print("¤·¤«¤·²¿¤âÅð¤Þ¤ì¤Ê¤«¤Ã¤¿¡£");
931 #else
932                                                         msg_print("Nothing was stolen.");
933 #endif
934
935                                                 }
936                                                 else if (p_ptr->au)
937                                                 {
938 #ifdef JP
939                                                         msg_print("ºâÉÛ¤¬·Ú¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£");
940                                                         msg_format("$%ld ¤Î¤ª¶â¤¬Åð¤Þ¤ì¤¿¡ª", (long)gold);
941 #else
942                                                         msg_print("Your purse feels lighter.");
943                                                         msg_format("%ld coins were stolen!", (long)gold);
944 #endif
945                                                         chg_virtue(V_SACRIFICE, 1);
946                                                 }
947                                                 else
948                                                 {
949 #ifdef JP
950                                                         msg_print("ºâÉÛ¤¬·Ú¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£");
951                                                         msg_print("¤ª¶â¤¬Á´ÉôÅð¤Þ¤ì¤¿¡ª");
952 #else
953                                                         msg_print("Your purse feels lighter.");
954                                                         msg_print("All of your coins were stolen!");
955 #endif
956
957                                                         chg_virtue(V_SACRIFICE, 2);
958                                                 }
959
960                                                 /* Redraw gold */
961                                                 p_ptr->redraw |= (PR_GOLD);
962
963                                                 /* Window stuff */
964                                                 p_ptr->window |= (PW_PLAYER);
965
966                                                 /* Blink away */
967                                                 blinked = TRUE;
968                                         }
969
970                                         break;
971                                 }
972
973                                 case RBE_EAT_ITEM:
974                                 {
975                                         /* Take some damage */
976                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
977
978                                         /* Confused monsters cannot steal successfully. -LM-*/
979                                         if (m_ptr->confused) break;
980
981                                         if (death) break;
982
983                                         /* Saving throw (unless paralyzed) based on dex and level */
984                                         if (!p_ptr->paralyzed &&
985                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
986                                                               p_ptr->lev)))
987                                         {
988                                                 /* Saving throw message */
989 #ifdef JP
990                                                 msg_print("¤·¤«¤·¤¢¤ï¤Æ¤Æ¥¶¥Ã¥¯¤ò¼è¤êÊÖ¤·¤¿¡ª");
991 #else
992                                                 msg_print("You grab hold of your backpack!");
993 #endif
994
995
996                                                 /* Occasional "blink" anyway */
997                                                 blinked = TRUE;
998
999                                                 /* Obvious */
1000                                                 obvious = TRUE;
1001
1002                                                 /* Done */
1003                                                 break;
1004                                         }
1005
1006                                         /* Find an item */
1007                                         for (k = 0; k < 10; k++)
1008                                         {
1009                                                 s16b o_idx;
1010
1011                                                 /* Pick an item */
1012                                                 i = randint0(INVEN_PACK);
1013
1014                                                 /* Obtain the item */
1015                                                 o_ptr = &inventory[i];
1016
1017                                                 /* Skip non-objects */
1018                                                 if (!o_ptr->k_idx) continue;
1019
1020                                                 /* Skip artifacts */
1021                                                 if (artifact_p(o_ptr) || o_ptr->art_name) continue;
1022
1023                                                 /* Get a description */
1024                                                 object_desc(o_name, o_ptr, FALSE, 3);
1025
1026                                                 /* Message */
1027 #ifdef JP
1028                                                 msg_format("%s(%c)¤ò%sÅð¤Þ¤ì¤¿¡ª",
1029                                                            o_name, index_to_label(i),
1030                                                            ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
1031 #else
1032                                                 msg_format("%sour %s (%c) was stolen!",
1033                                                            ((o_ptr->number > 1) ? "One of y" : "Y"),
1034                                                            o_name, index_to_label(i));
1035 #endif
1036
1037                                                 chg_virtue(V_SACRIFICE, 1);
1038
1039
1040                                                 /* Make an object */
1041                                                 o_idx = o_pop();
1042                                                 
1043                                                 /* Success */
1044                                                 if (o_idx)
1045                                                 {
1046                                                         object_type *j_ptr;
1047                                                         
1048                                                         /* Get new object */
1049                                                         j_ptr = &o_list[o_idx];
1050                                                         
1051                                                         /* Copy object */
1052                                                         object_copy(j_ptr, o_ptr);
1053                                                         
1054                                                         /* Modify number */
1055                                                         j_ptr->number = 1;
1056                                                         
1057                                                         /* Hack -- If a rod or wand, allocate total
1058                                                          * maximum timeouts or charges between those
1059                                                          * stolen and those missed. -LM-
1060                                                          */
1061                                                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
1062                                                         {
1063                                                                 k_ptr = &k_info[o_ptr->k_idx];
1064                                                                 j_ptr->pval = o_ptr->pval / o_ptr->number;
1065                                                                 o_ptr->pval -= j_ptr->pval;
1066                                                         }
1067                                                         
1068                                                         /* Forget mark */
1069                                                         j_ptr->marked = FALSE;
1070                                                         
1071                                                         /* Memorize monster */
1072                                                         j_ptr->held_m_idx = m_idx;
1073                                                         
1074                                                         /* Build stack */
1075                                                         j_ptr->next_o_idx = m_ptr->hold_o_idx;
1076                                                         
1077                                                         /* Build stack */
1078                                                         m_ptr->hold_o_idx = o_idx;
1079                                                 }
1080
1081                                                 /* Steal the items */
1082                                                 inven_item_increase(i, -1);
1083                                                 inven_item_optimize(i);
1084
1085                                                 /* Obvious */
1086                                                 obvious = TRUE;
1087
1088                                                 /* Blink away */
1089                                                 blinked = TRUE;
1090
1091                                                 /* Done */
1092                                                 break;
1093                                         }
1094
1095                                         break;
1096                                 }
1097
1098                                 case RBE_EAT_FOOD:
1099                                 {
1100                                         /* Take some damage */
1101                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1102
1103                                         if (death) break;
1104
1105                                         /* Steal some food */
1106                                         for (k = 0; k < 10; k++)
1107                                         {
1108                                                 /* Pick an item from the pack */
1109                                                 i = randint0(INVEN_PACK);
1110
1111                                                 /* Get the item */
1112                                                 o_ptr = &inventory[i];
1113
1114                                                 /* Skip non-objects */
1115                                                 if (!o_ptr->k_idx) continue;
1116
1117                                                 /* Skip non-food objects */
1118                                                 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
1119
1120                                                 /* Get a description */
1121                                                 object_desc(o_name, o_ptr, FALSE, 0);
1122
1123                                                 /* Message */
1124 #ifdef JP
1125                                                 msg_format("%s(%c)¤ò%s¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª",
1126                                                           o_name, index_to_label(i),
1127                                                           ((o_ptr->number > 1) ? "°ì¤Ä" : ""));
1128 #else
1129                                                 msg_format("%sour %s (%c) was eaten!",
1130                                                            ((o_ptr->number > 1) ? "One of y" : "Y"),
1131                                                            o_name, index_to_label(i));
1132 #endif
1133
1134
1135                                                 /* Steal the items */
1136                                                 inven_item_increase(i, -1);
1137                                                 inven_item_optimize(i);
1138
1139                                                 /* Obvious */
1140                                                 obvious = TRUE;
1141
1142                                                 /* Done */
1143                                                 break;
1144                                         }
1145
1146                                         break;
1147                                 }
1148
1149                                 case RBE_EAT_LITE:
1150                                 {
1151                                         /* Access the lite */
1152                                         o_ptr = &inventory[INVEN_LITE];
1153
1154                                         /* Take some damage */
1155                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1156
1157                                         if (death) break;
1158
1159                                         /* Drain fuel */
1160                                         if ((o_ptr->xtra4 > 0) && (!artifact_p(o_ptr)))
1161                                         {
1162                                                 /* Reduce fuel */
1163                                                 o_ptr->pval -= (250 + randint1(250));
1164                                                 if (o_ptr->pval < 1) o_ptr->pval = 1;
1165
1166                                                 /* Notice */
1167                                                 if (!p_ptr->blind)
1168                                                 {
1169 #ifdef JP
1170                                                         msg_print("ÌÀ¤«¤ê¤¬°Å¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¡£");
1171 #else
1172                                                         msg_print("Your light dims.");
1173 #endif
1174
1175                                                         obvious = TRUE;
1176                                                 }
1177
1178                                                 /* Window stuff */
1179                                                 p_ptr->window |= (PW_EQUIP);
1180                                         }
1181
1182                                         break;
1183                                 }
1184
1185                                 case RBE_ACID:
1186                                 {
1187                                         if (explode) break;
1188                                         /* Obvious */
1189                                         obvious = TRUE;
1190
1191                                         /* Message */
1192 #ifdef JP
1193                                         msg_print("»À¤òÍá¤Ó¤»¤é¤ì¤¿¡ª");
1194 #else
1195                                         msg_print("You are covered in acid!");
1196 #endif
1197
1198
1199                                         /* Special damage */
1200                                         acid_dam(damage, ddesc, -1);
1201
1202                                         /* Learn about the player */
1203                                         update_smart_learn(m_idx, DRS_ACID);
1204
1205                                         break;
1206                                 }
1207
1208                                 case RBE_ELEC:
1209                                 {
1210                                         if (explode) break;
1211                                         /* Obvious */
1212                                         obvious = TRUE;
1213
1214                                         /* Message */
1215 #ifdef JP
1216                                         msg_print("ÅÅ·â¤òÍá¤Ó¤»¤é¤ì¤¿¡ª");
1217 #else
1218                                         msg_print("You are struck by electricity!");
1219 #endif
1220
1221
1222                                         /* Special damage */
1223                                         elec_dam(damage, ddesc, -1);
1224
1225                                         /* Learn about the player */
1226                                         update_smart_learn(m_idx, DRS_ELEC);
1227
1228                                         break;
1229                                 }
1230
1231                                 case RBE_FIRE:
1232                                 {
1233                                         if (explode) break;
1234                                         /* Obvious */
1235                                         obvious = TRUE;
1236
1237                                         /* Message */
1238 #ifdef JP
1239                                         msg_print("Á´¿È¤¬±ê¤ËÊñ¤Þ¤ì¤¿¡ª");
1240 #else
1241                                         msg_print("You are enveloped in flames!");
1242 #endif
1243
1244
1245                                         /* Special damage */
1246                                         fire_dam(damage, ddesc, -1);
1247
1248                                         /* Learn about the player */
1249                                         update_smart_learn(m_idx, DRS_FIRE);
1250
1251                                         break;
1252                                 }
1253
1254                                 case RBE_COLD:
1255                                 {
1256                                         if (explode) break;
1257                                         /* Obvious */
1258                                         obvious = TRUE;
1259
1260                                         /* Message */
1261 #ifdef JP
1262                                         msg_print("Á´¿È¤¬Î䵤¤Çʤ¤ï¤ì¤¿¡ª");
1263 #else
1264                                         msg_print("You are covered with frost!");
1265 #endif
1266
1267
1268                                         /* Special damage */
1269                                         cold_dam(damage, ddesc, -1);
1270
1271                                         /* Learn about the player */
1272                                         update_smart_learn(m_idx, DRS_COLD);
1273
1274                                         break;
1275                                 }
1276
1277                                 case RBE_BLIND:
1278                                 {
1279                                         /* Take damage */
1280                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1281
1282                                         if (death) break;
1283
1284                                         /* Increase "blind" */
1285                                         if (!p_ptr->resist_blind)
1286                                         {
1287                                                 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
1288                                                 {
1289 #ifdef JP
1290                                                         if(m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª");
1291 #else
1292                                                         /* nanka */
1293 #endif
1294                                                         obvious = TRUE;
1295                                                 }
1296                                         }
1297
1298                                         /* Learn about the player */
1299                                         update_smart_learn(m_idx, DRS_BLIND);
1300
1301                                         break;
1302                                 }
1303
1304                                 case RBE_CONFUSE:
1305                                 {
1306                                         if (explode) break;
1307                                         /* Take damage */
1308                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1309
1310                                         if (death) break;
1311
1312                                         /* Increase "confused" */
1313                                         if (!p_ptr->resist_conf)
1314                                         {
1315                                                 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
1316                                                 {
1317                                                         obvious = TRUE;
1318                                                 }
1319                                         }
1320
1321                                         /* Learn about the player */
1322                                         update_smart_learn(m_idx, DRS_CONF);
1323
1324                                         break;
1325                                 }
1326
1327                                 case RBE_TERRIFY:
1328                                 {
1329                                         /* Take damage */
1330                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1331
1332                                         if (death) break;
1333
1334                                         /* Increase "afraid" */
1335                                         if (p_ptr->resist_fear)
1336                                         {
1337 #ifdef JP
1338                                                 msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
1339 #else
1340                                                 msg_print("You stand your ground!");
1341 #endif
1342
1343                                                 obvious = TRUE;
1344                                         }
1345                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
1346                                         {
1347 #ifdef JP
1348                                                 msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª");
1349 #else
1350                                                 msg_print("You stand your ground!");
1351 #endif
1352
1353                                                 obvious = TRUE;
1354                                         }
1355                                         else
1356                                         {
1357                                                 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
1358                                                 {
1359                                                         obvious = TRUE;
1360                                                 }
1361                                         }
1362
1363                                         /* Learn about the player */
1364                                         update_smart_learn(m_idx, DRS_FEAR);
1365
1366                                         break;
1367                                 }
1368
1369                                 case RBE_PARALYZE:
1370                                 {
1371                                         /* Take damage */
1372                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1373
1374                                         if (death) break;
1375
1376                                         /* Increase "paralyzed" */
1377                                         if (p_ptr->free_act)
1378                                         {
1379 #ifdef JP
1380                                                 msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
1381 #else
1382                                                 msg_print("You are unaffected!");
1383 #endif
1384
1385                                                 obvious = TRUE;
1386                                         }
1387                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
1388                                         {
1389 #ifdef JP
1390                                                 msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª");
1391 #else
1392                                                 msg_print("You resist the effects!");
1393 #endif
1394
1395                                                 obvious = TRUE;
1396                                         }
1397                                         else
1398                                         {
1399                                                 if (!p_ptr->paralyzed)
1400                                                 {
1401                                                         if (set_paralyzed(3 + randint1(rlev)))
1402                                                         {
1403                                                                 obvious = TRUE;
1404                                                         }
1405                                                 }
1406                                         }
1407
1408                                         /* Learn about the player */
1409                                         update_smart_learn(m_idx, DRS_FREE);
1410
1411                                         break;
1412                                 }
1413
1414                                 case RBE_LOSE_STR:
1415                                 {
1416                                         /* Damage (physical) */
1417                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1418
1419                                         if (death) break;
1420
1421                                         /* Damage (stat) */
1422                                         if (do_dec_stat(A_STR)) obvious = TRUE;
1423
1424                                         break;
1425                                 }
1426
1427                                 case RBE_LOSE_INT:
1428                                 {
1429                                         /* Damage (physical) */
1430                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1431
1432                                         if (death) break;
1433
1434                                         /* Damage (stat) */
1435                                         if (do_dec_stat(A_INT)) obvious = TRUE;
1436
1437                                         break;
1438                                 }
1439
1440                                 case RBE_LOSE_WIS:
1441                                 {
1442                                         /* Damage (physical) */
1443                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1444
1445                                         if (death) break;
1446
1447                                         /* Damage (stat) */
1448                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
1449
1450                                         break;
1451                                 }
1452
1453                                 case RBE_LOSE_DEX:
1454                                 {
1455                                         /* Damage (physical) */
1456                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1457
1458                                         if (death) break;
1459
1460                                         /* Damage (stat) */
1461                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
1462
1463                                         break;
1464                                 }
1465
1466                                 case RBE_LOSE_CON:
1467                                 {
1468                                         /* Damage (physical) */
1469                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1470
1471                                         if (death) break;
1472
1473                                         /* Damage (stat) */
1474                                         if (do_dec_stat(A_CON)) obvious = TRUE;
1475
1476                                         break;
1477                                 }
1478
1479                                 case RBE_LOSE_CHR:
1480                                 {
1481                                         /* Damage (physical) */
1482                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1483
1484                                         if (death) break;
1485
1486                                         /* Damage (stat) */
1487                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
1488
1489                                         break;
1490                                 }
1491
1492                                 case RBE_LOSE_ALL:
1493                                 {
1494                                         /* Damage (physical) */
1495                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1496
1497                                         if (death) break;
1498
1499                                         /* Damage (stats) */
1500                                         if (do_dec_stat(A_STR)) obvious = TRUE;
1501                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
1502                                         if (do_dec_stat(A_CON)) obvious = TRUE;
1503                                         if (do_dec_stat(A_INT)) obvious = TRUE;
1504                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
1505                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
1506
1507                                         break;
1508                                 }
1509
1510                                 case RBE_SHATTER:
1511                                 {
1512                                         /* Obvious */
1513                                         obvious = TRUE;
1514
1515                                         /* Hack -- Reduce damage based on the player armor class */
1516                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
1517
1518                                         /* Take damage */
1519                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1520
1521                                         /* Radius 8 earthquake centered at the monster */
1522                                         if (damage > 23 || explode)
1523                                         {
1524                                                 earthquake(m_ptr->fy, m_ptr->fx, 8);
1525                                         }
1526
1527                                         break;
1528                                 }
1529
1530                                 case RBE_EXP_10:
1531                                 {
1532                                         /* Obvious */
1533                                         obvious = TRUE;
1534
1535                                         /* Take damage */
1536                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1537
1538                                         if (death) break;
1539
1540                                         if (p_ptr->prace == RACE_ANDROID)
1541                                         {
1542                                         }
1543                                         else if (p_ptr->hold_life && (randint0(100) < 95))
1544                                         {
1545 #ifdef JP
1546                                                 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
1547 #else
1548                                                 msg_print("You keep hold of your life force!");
1549 #endif
1550
1551                                         }
1552                                         else
1553                                         {
1554                                                 s32b d = damroll(10, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1555                                                 if (p_ptr->hold_life)
1556                                                 {
1557 #ifdef JP
1558                                                         msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1559 #else
1560                                                         msg_print("You feel your life slipping away!");
1561 #endif
1562
1563                                                         lose_exp(d/10);
1564                                                 }
1565                                                 else
1566                                                 {
1567 #ifdef JP
1568                                                         msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1569 #else
1570                                                         msg_print("You feel your life draining away!");
1571 #endif
1572
1573                                                         lose_exp(d);
1574                                                 }
1575                                         }
1576                                         break;
1577                                 }
1578
1579                                 case RBE_EXP_20:
1580                                 {
1581                                         /* Obvious */
1582                                         obvious = TRUE;
1583
1584                                         /* Take damage */
1585                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1586
1587                                         if (death) break;
1588
1589                                         if (p_ptr->prace == RACE_ANDROID)
1590                                         {
1591                                         }
1592                                         else if (p_ptr->hold_life && (randint0(100) < 90))
1593                                         {
1594 #ifdef JP
1595                                                 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
1596 #else
1597                                                 msg_print("You keep hold of your life force!");
1598 #endif
1599
1600                                         }
1601                                         else
1602                                         {
1603                                                 s32b d = damroll(20, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1604                                                 if (p_ptr->hold_life)
1605                                                 {
1606 #ifdef JP
1607                                                         msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1608 #else
1609                                                         msg_print("You feel your life slipping away!");
1610 #endif
1611
1612                                                         lose_exp(d/10);
1613                                                 }
1614                                                 else
1615                                                 {
1616 #ifdef JP
1617                                                         msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1618 #else
1619                                                         msg_print("You feel your life draining away!");
1620 #endif
1621
1622                                                         lose_exp(d);
1623                                                 }
1624                                         }
1625                                         break;
1626                                 }
1627
1628                                 case RBE_EXP_40:
1629                                 {
1630                                         /* Obvious */
1631                                         obvious = TRUE;
1632
1633                                         /* Take damage */
1634                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1635
1636                                         if (death) break;
1637
1638                                         if (p_ptr->prace == RACE_ANDROID)
1639                                         {
1640                                         }
1641                                         else if (p_ptr->hold_life && (randint0(100) < 75))
1642                                         {
1643 #ifdef JP
1644                                                 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
1645 #else
1646                                                 msg_print("You keep hold of your life force!");
1647 #endif
1648
1649                                         }
1650                                         else
1651                                         {
1652                                                 s32b d = damroll(40, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1653                                                 if (p_ptr->hold_life)
1654                                                 {
1655 #ifdef JP
1656                                                         msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1657 #else
1658                                                         msg_print("You feel your life slipping away!");
1659 #endif
1660
1661                                                         lose_exp(d/10);
1662                                                 }
1663                                                 else
1664                                                 {
1665 #ifdef JP
1666                                                         msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1667 #else
1668                                                         msg_print("You feel your life draining away!");
1669 #endif
1670
1671                                                         lose_exp(d);
1672                                                 }
1673                                         }
1674                                         break;
1675                                 }
1676
1677                                 case RBE_EXP_80:
1678                                 {
1679                                         /* Obvious */
1680                                         obvious = TRUE;
1681
1682                                         /* Take damage */
1683                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1684
1685                                         if (death) break;
1686
1687                                         if (p_ptr->prace == RACE_ANDROID)
1688                                         {
1689                                         }
1690                                         else if (p_ptr->hold_life && (randint0(100) < 50))
1691                                         {
1692 #ifdef JP
1693                                                 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
1694 #else
1695                                                 msg_print("You keep hold of your life force!");
1696 #endif
1697
1698                                         }
1699                                         else
1700                                         {
1701                                                 s32b d = damroll(80, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE;
1702                                                 if (p_ptr->hold_life)
1703                                                 {
1704 #ifdef JP
1705                                                         msg_print("À¸Ì¿ÎϤò¾¯¤·µÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1706 #else
1707                                                         msg_print("You feel your life slipping away!");
1708 #endif
1709
1710                                                         lose_exp(d/10);
1711                                                 }
1712                                                 else
1713                                                 {
1714 #ifdef JP
1715                                                         msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1716 #else
1717                                                         msg_print("You feel your life draining away!");
1718 #endif
1719
1720                                                         lose_exp(d);
1721                                                 }
1722                                         }
1723                                         break;
1724                                 }
1725
1726                                 case RBE_DISEASE:
1727                                 {
1728                                         /* Take some damage */
1729                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1730
1731                                         if (death) break;
1732
1733                                         /* Take "poison" effect */
1734                                         if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
1735                                         {
1736                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
1737                                                 {
1738                                                         obvious = TRUE;
1739                                                 }
1740                                         }
1741
1742                                         /* Damage CON (10% chance)*/
1743                                         if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
1744                                         {
1745                                                 /* 1% chance for perm. damage */
1746                                                 bool perm = one_in_(10);
1747                                                 if (dec_stat(A_CON, randint1(10), perm)) obvious = TRUE;
1748                                         }
1749
1750                                         break;
1751                                 }
1752                                 case RBE_TIME:
1753                                 {
1754                                         if (explode) break;
1755                                         if (!p_ptr->resist_time)
1756                                         {
1757                                                 switch (randint1(10))
1758                                                 {
1759                                                         case 1: case 2: case 3: case 4: case 5:
1760                                                         {
1761                                                                 if (p_ptr->prace == RACE_ANDROID) break;
1762 #ifdef JP
1763                                                                 msg_print("¿ÍÀ¸¤¬µÕÌá¤ê¤·¤¿µ¤¤¬¤¹¤ë¡£");
1764 #else
1765                                                                 msg_print("You feel life has clocked back.");
1766 #endif
1767
1768                                                                 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
1769                                                                 break;
1770                                                         }
1771
1772                                                         case 6: case 7: case 8: case 9:
1773                                                         {
1774                                                                 int stat = randint0(6);
1775
1776                                                                 switch (stat)
1777                                                                 {
1778 #ifdef JP
1779                                                                         case A_STR: act = "¶¯¤¯"; break;
1780                                                                         case A_INT: act = "ÁïÌÀ¤Ç"; break;
1781                                                                         case A_WIS: act = "¸­ÌÀ¤Ç"; break;
1782                                                                         case A_DEX: act = "´ïÍѤÇ"; break;
1783                                                                         case A_CON: act = "·ò¹¯¤Ç"; break;
1784                                                                         case A_CHR: act = "Èþ¤·¤¯"; break;
1785 #else
1786                                                                         case A_STR: act = "strong"; break;
1787                                                                         case A_INT: act = "bright"; break;
1788                                                                         case A_WIS: act = "wise"; break;
1789                                                                         case A_DEX: act = "agile"; break;
1790                                                                         case A_CON: act = "hale"; break;
1791                                                                         case A_CHR: act = "beautiful"; break;
1792 #endif
1793
1794                                                                 }
1795
1796 #ifdef JP
1797                                                                 msg_format("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤É%s¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£", act);
1798 #else
1799                                                                 msg_format("You're not as %s as you used to be...", act);
1800 #endif
1801
1802
1803                                                                 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
1804                                                                 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
1805                                                                 p_ptr->update |= (PU_BONUS);
1806                                                                 break;
1807                                                         }
1808
1809                                                         case 10:
1810                                                         {
1811 #ifdef JP
1812                                                 msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
1813 #else
1814                                                                 msg_print("You're not as powerful as you used to be...");
1815 #endif
1816
1817
1818                                                                 for (k = 0; k < 6; k++)
1819                                                                 {
1820                                                                         p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
1821                                                                         if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
1822                                                                 }
1823                                                                 p_ptr->update |= (PU_BONUS);
1824                                                                 break;
1825                                                         }
1826                                                 }
1827                                         }
1828                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1829
1830                                         break;
1831                                 }
1832                                 case RBE_EXP_VAMP:
1833                                 {
1834                                         /* Obvious */
1835                                         obvious = TRUE;
1836
1837                                         /* Take damage */
1838                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1839
1840                                         if (death) break;
1841
1842                                         if (p_ptr->prace == RACE_ANDROID)
1843                                         {
1844                                         }
1845                                         else if (p_ptr->hold_life && (randint0(100) < 50))
1846                                         {
1847 #ifdef JP
1848 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
1849 #else
1850                                                 msg_print("You keep hold of your life force!");
1851 #endif
1852
1853                                                 resist_drain = TRUE;
1854                                         }
1855                                         else
1856                                         {
1857                                                 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1858                                                 if (p_ptr->hold_life)
1859                                                 {
1860 #ifdef JP
1861 msg_print("À¸Ì¿ÎϤ¬¾¯¤·ÂΤ«¤éÈ´¤±Íî¤Á¤¿µ¤¤¬¤¹¤ë¡ª");
1862 #else
1863                                                         msg_print("You feel your life slipping away!");
1864 #endif
1865
1866                                                         lose_exp(d / 10);
1867                                                 }
1868                                                 else
1869                                                 {
1870 #ifdef JP
1871 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1872 #else
1873                                                         msg_print("You feel your life draining away!");
1874 #endif
1875
1876                                                         lose_exp(d);
1877                                                 }
1878                                         }
1879
1880                                         /* Heal the attacker? */
1881                                         if ((!(p_ptr->prace == RACE_ZOMBIE ||
1882                                               p_ptr->prace == RACE_VAMPIRE ||
1883                                               p_ptr->prace == RACE_SPECTRE ||
1884                                               p_ptr->prace == RACE_SKELETON ||
1885                                               p_ptr->prace == RACE_DEMON ||
1886                                               p_ptr->prace == RACE_GOLEM ||
1887                                               p_ptr->prace == RACE_ANDROID) ||
1888                                              !(mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)) &&
1889                                             (damage > 5) && !(resist_drain))
1890                                         {
1891                                                 bool did_heal = FALSE;
1892
1893                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1894
1895                                                 /* Heal */
1896                                                 m_ptr->hp += damroll(4, damage / 6);
1897                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1898
1899                                                 /* Redraw (later) if needed */
1900                                                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
1901                                                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
1902
1903                                                 /* Special message */
1904                                                 if ((m_ptr->ml) && (did_heal))
1905                                                 {
1906 #ifdef JP
1907 msg_format("%s¤ÏÂÎÎϤò²óÉü¤·¤¿¤è¤¦¤À¡£", m_name);
1908 #else
1909                                                         msg_format("%^s appears healthier.", m_name);
1910 #endif
1911
1912                                                 }
1913                                         }
1914
1915                                         break;
1916                                 }
1917                                 case RBE_DR_MANA:
1918                                 {
1919                                         bool did_heal = FALSE;
1920
1921                                         /* Obvious */
1922                                         obvious = TRUE;
1923
1924                                         do_cut = 0;
1925
1926                                         /* Take damage */
1927                                         p_ptr->csp -= damage;
1928                                         if (p_ptr->csp < 0)
1929                                         {
1930                                                 p_ptr->csp = 0;
1931                                                 p_ptr->csp_frac = 0;
1932                                         }
1933
1934                                         if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1935
1936                                         p_ptr->redraw |= (PR_MANA);
1937
1938                                         break;
1939                                 }
1940                         }
1941
1942                         /* Hack -- only one of cut or stun */
1943                         if (do_cut && do_stun)
1944                         {
1945                                 /* Cancel cut */
1946                                 if (randint0(100) < 50)
1947                                 {
1948                                         do_cut = 0;
1949                                 }
1950
1951                                 /* Cancel stun */
1952                                 else
1953                                 {
1954                                         do_stun = 0;
1955                                 }
1956                         }
1957
1958                         /* Handle cut */
1959                         if (do_cut)
1960                         {
1961                                 int k = 0;
1962
1963                                 /* Critical hit (zero if non-critical) */
1964                                 tmp = monster_critical(d_dice, d_side, damage);
1965
1966                                 /* Roll for damage */
1967                                 switch (tmp)
1968                                 {
1969                                         case 0: k = 0; break;
1970                                         case 1: k = randint1(5); break;
1971                                         case 2: k = randint1(5) + 5; break;
1972                                         case 3: k = randint1(20) + 20; break;
1973                                         case 4: k = randint1(50) + 50; break;
1974                                         case 5: k = randint1(100) + 100; break;
1975                                         case 6: k = 300; break;
1976                                         default: k = 500; break;
1977                                 }
1978
1979                                 /* Apply the cut */
1980                                 if (k) (void)set_cut(p_ptr->cut + k);
1981                         }
1982
1983                         /* Handle stun */
1984                         if (do_stun)
1985                         {
1986                                 int k = 0;
1987
1988                                 /* Critical hit (zero if non-critical) */
1989                                 tmp = monster_critical(d_dice, d_side, damage);
1990
1991                                 /* Roll for damage */
1992                                 switch (tmp)
1993                                 {
1994                                         case 0: k = 0; break;
1995                                         case 1: k = randint1(5); break;
1996                                         case 2: k = randint1(5) + 10; break;
1997                                         case 3: k = randint1(10) + 20; break;
1998                                         case 4: k = randint1(15) + 30; break;
1999                                         case 5: k = randint1(20) + 40; break;
2000                                         case 6: k = 80; break;
2001                                         default: k = 150; break;
2002                                 }
2003
2004                                 /* Apply the stun */
2005                                 if (k) (void)set_stun(p_ptr->stun + k);
2006                         }
2007
2008                         if (explode)
2009                         {
2010                                 sound(SOUND_EXPLODE);
2011
2012                                 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
2013                                 {
2014                                         blinked = FALSE;
2015                                         alive = FALSE;
2016                                 }
2017                         }
2018
2019                         if (touched)
2020                         {
2021                                 if (p_ptr->sh_fire && alive && !death)
2022                                 {
2023                                         if (!(r_ptr->flags3 & RF3_IM_FIRE))
2024                                         {
2025                                                 int dam = damroll(2, 6);
2026
2027                                                 /* Modify the damage */
2028                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2029
2030 #ifdef JP
2031                                                 msg_format("%^s¤ÏÆÍÁ³Ç®¤¯¤Ê¤Ã¤¿¡ª", m_name);
2032                                                 if (mon_take_hit(m_idx, dam, &fear,
2033                                                     "¤Ï³¥¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
2034 #else
2035                                                 msg_format("%^s is suddenly very hot!", m_name);
2036
2037                                                 if (mon_take_hit(m_idx, dam, &fear,
2038                                                     " turns into a pile of ash."))
2039 #endif
2040
2041                                                 {
2042                                                         blinked = FALSE;
2043                                                         alive = FALSE;
2044                                                 }
2045                                         }
2046                                         else
2047                                         {
2048                                                 if (m_ptr->ml)
2049                                                         r_ptr->r_flags3 |= RF3_IM_FIRE;
2050                                         }
2051                                 }
2052
2053                                 if (p_ptr->sh_elec && alive && !death)
2054                                 {
2055                                         if (!(r_ptr->flags3 & RF3_IM_ELEC))
2056                                         {
2057                                                 int dam = damroll(2, 6);
2058
2059                                                 /* Modify the damage */
2060                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2061
2062 #ifdef JP
2063                                                 msg_format("%^s¤ÏÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2064                                                 if (mon_take_hit(m_idx, dam, &fear,
2065                                                     "¤Ïdz¤¨³Ì¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
2066 #else
2067                                                 msg_format("%^s gets zapped!", m_name);
2068
2069                                                 if (mon_take_hit(m_idx, dam, &fear,
2070                                                     " turns into a pile of cinder."))
2071 #endif
2072
2073                                                 {
2074                                                         blinked = FALSE;
2075                                                         alive = FALSE;
2076                                                 }
2077                                         }
2078                                         else
2079                                         {
2080                                                 if (m_ptr->ml)
2081                                                         r_ptr->r_flags3 |= RF3_IM_ELEC;
2082                                         }
2083                                 }
2084
2085                                 if (p_ptr->sh_cold && alive && !death)
2086                                 {
2087                                         if (!(r_ptr->flags3 & RF3_IM_COLD))
2088                                         {
2089                                                 int dam = damroll(2, 6);
2090
2091                                                 /* Modify the damage */
2092                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2093
2094 #ifdef JP
2095                                                 msg_format("%^s¤ÏÎ䵤¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2096                                                 if (mon_take_hit(m_idx, dam, &fear,
2097                                                     "¤ÏÅà¤ê¤Ä¤¤¤¿¡£"))
2098 #else
2099                                                 msg_format("%^s is very cold!", m_name);
2100
2101                                                 if (mon_take_hit(m_idx, dam, &fear,
2102                                                     " was frozen."))
2103 #endif
2104
2105                                                 {
2106                                                         blinked = FALSE;
2107                                                         alive = FALSE;
2108                                                 }
2109                                         }
2110                                         else
2111                                         {
2112                                                 if (m_ptr->ml)
2113                                                         r_ptr->r_flags3 |= RF3_IM_COLD;
2114                                         }
2115                                 }
2116
2117                                 /* by henkma */
2118                                 if (p_ptr->dustrobe && alive && !death)
2119                                 {
2120                                         if (!(r_ptr->flags4 & RF4_BR_SHAR))
2121                                         {
2122                                                 int dam = damroll(2, 6);
2123
2124                                                 /* Modify the damage */
2125                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2126
2127 #ifdef JP
2128                                                 msg_format("%^s¤Ï¶À¤ÎÇËÊÒ¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2129                                                 if (mon_take_hit(m_idx, dam, &fear,
2130                                                     "¤Ï¥º¥¿¥º¥¿¤Ë¤Ê¤Ã¤¿¡£"))
2131 #else
2132                                                 msg_format("%^s gets zapped!", m_name);
2133
2134                                                 if (mon_take_hit(m_idx, dam, &fear,
2135                                                     " had torn to pieces."))
2136 #endif
2137                                                   
2138                                                 {
2139                                                         blinked = FALSE;
2140                                                         alive = FALSE;
2141                                                 }
2142                                         }
2143                                         if( cave[py][px].feat == FEAT_MIRROR ){
2144                                                 teleport_player(10);
2145                                         }
2146                                 }
2147
2148                                 if (p_ptr->tim_sh_holy && alive && !death)
2149                                 {
2150                                         if (r_ptr->flags3 & RF3_EVIL)
2151                                         {
2152                                                 int dam = damroll(2, 6);
2153
2154                                                 /* Modify the damage */
2155                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2156
2157 #ifdef JP
2158                                                 msg_format("%^s¤ÏÀ»¤Ê¤ë¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
2159                                                 if (mon_take_hit(m_idx, dam, &fear,
2160                                                     "¤ÏÅݤ줿¡£"))
2161 #else
2162                                                 msg_format("%^s nanka!", m_name);
2163
2164                                                 if (mon_take_hit(m_idx, dam, &fear,
2165                                                     " nanka."))
2166 #endif
2167
2168                                                 {
2169                                                         blinked = FALSE;
2170                                                         alive = FALSE;
2171                                                 }
2172                                                 if (m_ptr->ml)
2173                                                         r_ptr->r_flags3 |= RF3_EVIL;
2174                                         }
2175                                 }
2176
2177                                 if (p_ptr->tim_sh_touki && alive && !death)
2178                                 {
2179                                         int dam = damroll(2, 6);
2180
2181                                         /* Modify the damage */
2182                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
2183
2184 #ifdef JP
2185                                         msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
2186                                         if (mon_take_hit(m_idx, dam, &fear,
2187                                             "¤ÏÅݤ줿¡£"))
2188 #else
2189                                         msg_format("%^s nanka", m_name);
2190
2191                                         if (mon_take_hit(m_idx, dam, &fear,
2192                                             " nanka."))
2193 #endif
2194
2195                                         {
2196                                                 blinked = FALSE;
2197                                                 alive = FALSE;
2198                                         }
2199                                 }
2200                         }
2201                 }
2202
2203                 /* Monster missed player */
2204                 else
2205                 {
2206                         /* Analyze failed attacks */
2207                         switch (method)
2208                         {
2209                                 case RBM_HIT:
2210                                 case RBM_TOUCH:
2211                                 case RBM_PUNCH:
2212                                 case RBM_KICK:
2213                                 case RBM_CLAW:
2214                                 case RBM_BITE:
2215                                 case RBM_STING:
2216                                 case RBM_SLASH:
2217                                 case RBM_BUTT:
2218                                 case RBM_CRUSH:
2219                                 case RBM_ENGULF:
2220                                 case RBM_CHARGE:
2221
2222                                 /* Visible monsters */
2223                                 if (m_ptr->ml)
2224                                 {
2225                                         /* Disturbing */
2226                                         disturb(1, 0);
2227
2228                                         /* Message */
2229 #ifdef JP
2230                                         if (syouryaku)
2231                                             msg_format("%s¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤­¤Ç" : "");
2232                                         else
2233                                             msg_format("%s%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤­¤Ç" : "", m_name);
2234                                         syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
2235 #else
2236                                         msg_format("%^s misses you.", m_name);
2237 #endif
2238
2239                                 }
2240                                 damage = 0;
2241
2242                                 break;
2243                         }
2244                 }
2245
2246
2247                 /* Analyze "visible" monsters only */
2248                 if (visible && !do_silly_attack)
2249                 {
2250                         /* Count "obvious" attacks (and ones that cause damage) */
2251                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
2252                         {
2253                                 /* Count attacks of this type */
2254                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
2255                                 {
2256                                         r_ptr->r_blows[ap_cnt]++;
2257                                 }
2258                         }
2259                 }
2260
2261                 if (p_ptr->riding && damage)
2262                 {
2263                         char m_name[80];
2264                         monster_desc(m_name, &m_list[p_ptr->riding], 0);
2265                         if (rakuba((damage > 200) ? 200 : damage, FALSE))
2266                         {
2267 #ifdef JP
2268 msg_format("%^s¤«¤éÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
2269 #else
2270                                 msg_format("You have fallen from %s.", m_name);
2271 #endif
2272                         }
2273                 }
2274                 if (p_ptr->special_defense & NINJA_KAWARIMI)
2275                 {
2276                         kawarimi(FALSE);
2277                         return TRUE;
2278                 }
2279         }
2280
2281         if (p_ptr->tim_eyeeye && get_damage > 0 && !death)
2282         {
2283                 msg_format("¹¶·â¤¬%s¼«¿È¤ò½ý¤Ä¤±¤¿¡ª", m_name);
2284                 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL | PROJECT_NO_REF, -1);
2285                 set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
2286         }
2287
2288
2289         if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !death && m_ptr->ml && (p_ptr->csp > 7))
2290         {
2291                 char m_name[80];
2292                 monster_desc(m_name, m_ptr, 0);
2293
2294                 p_ptr->csp -= 7;
2295 #ifdef JP
2296                 msg_format("%^s¤ËÈ¿·â¤·¤¿¡ª", m_name);
2297 #else
2298                 msg_format("Your counterattack to %s!", m_name);
2299 #endif
2300                 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
2301                 fear = FALSE;
2302         }
2303
2304         /* Blink away */
2305         if (blinked && alive && !death)
2306         {
2307 #ifdef JP
2308                 msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
2309 #else
2310                 msg_print("The thief flees laughing!");
2311 #endif
2312
2313                 teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE);
2314         }
2315
2316
2317         /* Always notice cause of death */
2318         if (death && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
2319         {
2320                 r_ptr->r_deaths++;
2321         }
2322
2323         if (m_ptr->ml && fear && alive && !death)
2324         {
2325                 sound(SOUND_FLEE);
2326 #ifdef JP
2327                 msg_format("%^s¤Ï¶²ÉݤÇƨ¤²½Ð¤·¤¿¡ª", m_name);
2328 #else
2329                 msg_format("%^s flees in terror!", m_name);
2330 #endif
2331
2332         }
2333
2334         if (p_ptr->special_defense & KATA_IAI)
2335         {
2336                 set_action(ACTION_NONE);
2337         }
2338
2339         /* Assume we attacked */
2340         return (TRUE);
2341 }