OSDN Git Service

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