OSDN Git Service

852193499dd950010dec33acbd81aa360f35f9cb
[hengband/hengband.git] / src / melee1.c
1 /* File: melee1.c */
2
3 /* Purpose: Monster attacks */
4
5 /*
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
7  *
8  * This software may be copied and distributed for educational, research, and
9  * not for profit purposes provided that this copyright and statement are
10  * included in all such copies.
11  */
12
13 #include "angband.h"
14
15 extern cptr silly_attacks[MAX_SILLY_ATTACK];
16
17 /*
18  * Critical blow.  All hits that do 95% of total possible damage,
19  * and which also do at least 20 damage, or, sometimes, N damage.
20  * This is used only to determine "cuts" and "stuns".
21  */
22 static int monster_critical(int dice, int sides, int dam)
23 {
24         int max = 0;
25         int total = dice * sides;
26
27         /* Must do at least 95% of perfect */
28         if (dam < total * 19 / 20) return (0);
29
30         /* Weak blows rarely work */
31         if ((dam < 20) && (randint0(100) >= dam)) return (0);
32
33         /* Perfect damage */
34         if (dam == total && dam >= 40) max++;
35
36         /* Super-charge */
37         if (dam >= 20)
38         {
39                 while (randint0(100) < 2) max++;
40         }
41
42         /* Critical damage */
43         if (dam > 45) return (6 + max);
44         if (dam > 33) return (5 + max);
45         if (dam > 25) return (4 + max);
46         if (dam > 18) return (3 + max);
47         if (dam > 11) return (2 + max);
48         return (1 + max);
49 }
50
51
52
53
54
55 /*
56  * Determine if a monster attack against the player succeeds.
57  * Always miss 5% of the time, Always hit 5% of the time.
58  * Otherwise, match monster power against player armor.
59  */
60 static int check_hit(int power, int level, int stun)
61 {
62         int i, k, ac;
63
64         /* Percentile dice */
65         k = randint0(100);
66
67         if (stun && one_in_(2)) return FALSE;
68
69         /* Hack -- Always miss or hit */
70         if (k < 10) return (k < 5);
71
72         /* Calculate the "attack quality" */
73         i = (power + (level * 3));
74
75         /* Total armor */
76         ac = p_ptr->ac + p_ptr->to_a;
77         if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
78
79         /* Power and Level compete against Armor */
80         if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
81
82         /* Assume miss */
83         return (FALSE);
84 }
85
86
87
88 /*
89  * Hack -- possible "insult" messages
90  */
91 static cptr desc_insult[] =
92 {
93 #ifdef JP
94         "¤¬¤¢¤Ê¤¿¤òÉî¿«¤·¤¿¡ª",
95         "¤¬¤¢¤Ê¤¿¤ÎÊì¤òÉî¿«¤·¤¿¡ª",
96         "¤¬¤¢¤Ê¤¿¤ò·ÚÊΤ·¤¿¡ª",
97         "¤¬¤¢¤Ê¤¿¤ò¿«¤á¤¿¡ª",
98         "¤¬¤¢¤Ê¤¿¤ò±ø¤·¤¿¡ª",
99         "¤¬¤¢¤Ê¤¿¤Î²ó¤ê¤ÇÍ٤ä¿¡ª",
100         "¤¬àÐêø¤Ê¿È¤Ö¤ê¤ò¤·¤¿¡ª",
101         "¤¬¤¢¤Ê¤¿¤ò¤Ü¤ó¤ä¤ê¤È¸«¤¿¡ª¡ª¡ª",
102         "¤¬¤¢¤Ê¤¿¤ò¥Ñ¥é¥µ¥¤¥È¸Æ¤Ð¤ï¤ê¤·¤¿¡ª",
103         "¤¬¤¢¤Ê¤¿¤ò¥µ¥¤¥Ü¡¼¥°°·¤¤¤·¤¿¡ª"
104 #else
105         "insults you!",
106         "insults your mother!",
107         "gives you the finger!",
108         "humiliates you!",
109         "defiles you!",
110         "dances around you!",
111         "makes obscene gestures!",
112         "moons you!!!"
113         "calls you a parasite!",
114         "calls you a cyborg!"
115 #endif
116
117 };
118
119
120
121 /*
122  * Hack -- possible "insult" messages
123  */
124 static cptr desc_moan[] =
125 {
126 #ifdef JP
127         "¤Ï²¿¤«¤òÈᤷ¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£",
128         "¤¬Èà¤Î»ô¤¤¸¤¤ò¸«¤Ê¤«¤Ã¤¿¤«¤È¿Ò¤Í¤Æ¤¤¤ë¡£",
129         "¤¬ÆìÄ¥¤ê¤«¤é½Ð¤Æ¹Ô¤±¤È¸À¤Ã¤Æ¤¤¤ë¡£",
130         "¤Ï¥­¥Î¥³¤¬¤É¤¦¤È¤«Ò줤¤Æ¤¤¤ë¡£"
131 #else
132         "seems sad about something.",
133         "asks if you have seen his dogs.",
134         "tells you to get off his land.",
135         "mumbles something about mushrooms."
136 #endif
137
138 };
139
140
141 /*
142  * Attack the player via physical attacks.
143  */
144 bool make_attack_normal(int m_idx)
145 {
146         monster_type *m_ptr = &m_list[m_idx];
147
148         monster_race *r_ptr = &r_info[m_ptr->r_idx];
149
150         int ap_cnt;
151
152         int i, k, tmp, ac, rlev;
153         int do_cut, do_stun;
154
155         s32b gold;
156
157         object_type *o_ptr;
158
159         object_kind *k_ptr;
160
161         char o_name[MAX_NLEN];
162
163         char m_name[80];
164
165         char ddesc[80];
166
167         bool blinked;
168         bool touched = FALSE, fear = FALSE, alive = TRUE;
169         bool explode = FALSE;
170         bool resist_drain = FALSE;
171         bool do_silly_attack = (one_in_(2) && p_ptr->image);
172         int syouryaku = 0;
173
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, 0x88);
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 (!alive || death) 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                                                 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                                         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                                         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                                         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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
825
826                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
892
893                                         /* Confused monsters cannot steal successfully. -LM-*/
894                                         if (m_ptr->confused) break;
895
896                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
976
977                                         /* Confused monsters cannot steal successfully. -LM-*/
978                                         if (m_ptr->confused) break;
979
980                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1101
1102                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1155
1156                                         if (death) break;
1157
1158                                         /* Drain fuel */
1159                                         if ((o_ptr->xtra4 > 0) && (!artifact_p(o_ptr)))
1160                                         {
1161                                                 /* Reduce fuel */
1162                                                 o_ptr->pval -= (250 + randint1(250));
1163                                                 if (o_ptr->pval < 1) o_ptr->pval = 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                                         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                                         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                                         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                                         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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1280
1281                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1308
1309                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1330
1331                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1372
1373                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1417
1418                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1430
1431                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1443
1444                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1456
1457                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1469
1470                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1482
1483                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1495
1496                                         if (death) 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                                         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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1536
1537                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1585
1586                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1634
1635                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1683
1684                                         if (death) 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                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1729
1730                                         if (death) 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)) obvious = TRUE;
1747                                         }
1748
1749                                         break;
1750                                 }
1751                                 case RBE_TIME:
1752                                 {
1753                                         if (explode) break;
1754                                         if (!p_ptr->resist_time)
1755                                         {
1756                                                 switch (randint1(10))
1757                                                 {
1758                                                         case 1: case 2: case 3: case 4: case 5:
1759                                                         {
1760                                                                 if (p_ptr->prace == RACE_ANDROID) break;
1761 #ifdef JP
1762                                                                 msg_print("¿ÍÀ¸¤¬µÕÌá¤ê¤·¤¿µ¤¤¬¤¹¤ë¡£");
1763 #else
1764                                                                 msg_print("You feel life has clocked back.");
1765 #endif
1766
1767                                                                 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
1768                                                                 break;
1769                                                         }
1770
1771                                                         case 6: case 7: case 8: case 9:
1772                                                         {
1773                                                                 int stat = randint0(6);
1774
1775                                                                 switch (stat)
1776                                                                 {
1777 #ifdef JP
1778                                                                         case A_STR: act = "¶¯¤¯"; break;
1779                                                                         case A_INT: act = "ÁïÌÀ¤Ç"; break;
1780                                                                         case A_WIS: act = "¸­ÌÀ¤Ç"; break;
1781                                                                         case A_DEX: act = "´ïÍѤÇ"; break;
1782                                                                         case A_CON: act = "·ò¹¯¤Ç"; break;
1783                                                                         case A_CHR: act = "Èþ¤·¤¯"; break;
1784 #else
1785                                                                         case A_STR: act = "strong"; break;
1786                                                                         case A_INT: act = "bright"; break;
1787                                                                         case A_WIS: act = "wise"; break;
1788                                                                         case A_DEX: act = "agile"; break;
1789                                                                         case A_CON: act = "hale"; break;
1790                                                                         case A_CHR: act = "beautiful"; break;
1791 #endif
1792
1793                                                                 }
1794
1795 #ifdef JP
1796                                                                 msg_format("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤É%s¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£", act);
1797 #else
1798                                                                 msg_format("You're not as %s as you used to be...", act);
1799 #endif
1800
1801
1802                                                                 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
1803                                                                 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
1804                                                                 p_ptr->update |= (PU_BONUS);
1805                                                                 break;
1806                                                         }
1807
1808                                                         case 10:
1809                                                         {
1810 #ifdef JP
1811                                                 msg_print("¤¢¤Ê¤¿¤Ï°ÊÁ°¤Û¤ÉÎ϶¯¤¯¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿...¡£");
1812 #else
1813                                                                 msg_print("You're not as powerful as you used to be...");
1814 #endif
1815
1816
1817                                                                 for (k = 0; k < 6; k++)
1818                                                                 {
1819                                                                         p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
1820                                                                         if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
1821                                                                 }
1822                                                                 p_ptr->update |= (PU_BONUS);
1823                                                                 break;
1824                                                         }
1825                                                 }
1826                                         }
1827                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1828
1829                                         break;
1830                                 }
1831                                 case RBE_EXP_VAMP:
1832                                 {
1833                                         /* Obvious */
1834                                         obvious = TRUE;
1835
1836                                         /* Take damage */
1837                                         take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1838
1839                                         if (death) break;
1840
1841                                         if (p_ptr->prace == RACE_ANDROID)
1842                                         {
1843                                         }
1844                                         else if (p_ptr->hold_life && (randint0(100) < 50))
1845                                         {
1846 #ifdef JP
1847 msg_print("¤·¤«¤·¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¼é¤ê¤­¤Ã¤¿¡ª");
1848 #else
1849                                                 msg_print("You keep hold of your life force!");
1850 #endif
1851
1852                                                 resist_drain = TRUE;
1853                                         }
1854                                         else
1855                                         {
1856                                                 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
1857                                                 if (p_ptr->hold_life)
1858                                                 {
1859 #ifdef JP
1860 msg_print("À¸Ì¿ÎϤ¬¾¯¤·ÂΤ«¤éÈ´¤±Íî¤Á¤¿µ¤¤¬¤¹¤ë¡ª");
1861 #else
1862                                                         msg_print("You feel your life slipping away!");
1863 #endif
1864
1865                                                         lose_exp(d / 10);
1866                                                 }
1867                                                 else
1868                                                 {
1869 #ifdef JP
1870 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
1871 #else
1872                                                         msg_print("You feel your life draining away!");
1873 #endif
1874
1875                                                         lose_exp(d);
1876                                                 }
1877                                         }
1878
1879                                         /* Heal the attacker? */
1880                                         if ((!(p_ptr->prace == RACE_ZOMBIE ||
1881                                               p_ptr->prace == RACE_VAMPIRE ||
1882                                               p_ptr->prace == RACE_SPECTRE ||
1883                                               p_ptr->prace == RACE_SKELETON ||
1884                                               p_ptr->prace == RACE_DEMON ||
1885                                               p_ptr->prace == RACE_GOLEM ||
1886                                               p_ptr->prace == RACE_ANDROID) ||
1887                                              !(mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)) &&
1888                                             (damage > 5) && !(resist_drain))
1889                                         {
1890                                                 bool did_heal = FALSE;
1891
1892                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1893
1894                                                 /* Heal */
1895                                                 m_ptr->hp += damroll(4, damage / 6);
1896                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1897
1898                                                 /* Redraw (later) if needed */
1899                                                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
1900                                                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
1901
1902                                                 /* Special message */
1903                                                 if ((m_ptr->ml) && (did_heal))
1904                                                 {
1905 #ifdef JP
1906 msg_format("%s¤ÏÂÎÎϤò²óÉü¤·¤¿¤è¤¦¤À¡£", m_name);
1907 #else
1908                                                         msg_format("%^s appears healthier.", m_name);
1909 #endif
1910
1911                                                 }
1912                                         }
1913
1914                                         break;
1915                                 }
1916                                 case RBE_DR_MANA:
1917                                 {
1918                                         bool did_heal = FALSE;
1919
1920                                         /* Obvious */
1921                                         obvious = TRUE;
1922
1923                                         do_cut = 0;
1924
1925                                         /* Take damage */
1926                                         p_ptr->csp -= damage;
1927                                         if (p_ptr->csp < 0)
1928                                         {
1929                                                 p_ptr->csp = 0;
1930                                                 p_ptr->csp_frac = 0;
1931                                         }
1932
1933                                         if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
1934
1935                                         p_ptr->redraw |= (PR_MANA);
1936
1937                                         break;
1938                                 }
1939                         }
1940
1941                         /* Hack -- only one of cut or stun */
1942                         if (do_cut && do_stun)
1943                         {
1944                                 /* Cancel cut */
1945                                 if (randint0(100) < 50)
1946                                 {
1947                                         do_cut = 0;
1948                                 }
1949
1950                                 /* Cancel stun */
1951                                 else
1952                                 {
1953                                         do_stun = 0;
1954                                 }
1955                         }
1956
1957                         /* Handle cut */
1958                         if (do_cut)
1959                         {
1960                                 int k = 0;
1961
1962                                 /* Critical hit (zero if non-critical) */
1963                                 tmp = monster_critical(d_dice, d_side, damage);
1964
1965                                 /* Roll for damage */
1966                                 switch (tmp)
1967                                 {
1968                                         case 0: k = 0; break;
1969                                         case 1: k = randint1(5); break;
1970                                         case 2: k = randint1(5) + 5; break;
1971                                         case 3: k = randint1(20) + 20; break;
1972                                         case 4: k = randint1(50) + 50; break;
1973                                         case 5: k = randint1(100) + 100; break;
1974                                         case 6: k = 300; break;
1975                                         default: k = 500; break;
1976                                 }
1977
1978                                 /* Apply the cut */
1979                                 if (k) (void)set_cut(p_ptr->cut + k);
1980                         }
1981
1982                         /* Handle stun */
1983                         if (do_stun)
1984                         {
1985                                 int k = 0;
1986
1987                                 /* Critical hit (zero if non-critical) */
1988                                 tmp = monster_critical(d_dice, d_side, damage);
1989
1990                                 /* Roll for damage */
1991                                 switch (tmp)
1992                                 {
1993                                         case 0: k = 0; break;
1994                                         case 1: k = randint1(5); break;
1995                                         case 2: k = randint1(5) + 10; break;
1996                                         case 3: k = randint1(10) + 20; break;
1997                                         case 4: k = randint1(15) + 30; break;
1998                                         case 5: k = randint1(20) + 40; break;
1999                                         case 6: k = 80; break;
2000                                         default: k = 150; break;
2001                                 }
2002
2003                                 /* Apply the stun */
2004                                 if (k) (void)set_stun(p_ptr->stun + k);
2005                         }
2006
2007                         if (explode)
2008                         {
2009                                 sound(SOUND_EXPLODE);
2010
2011                                 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
2012                                 {
2013                                         blinked = FALSE;
2014                                         alive = FALSE;
2015                                 }
2016                         }
2017
2018                         if (touched)
2019                         {
2020                                 if (p_ptr->sh_fire && alive && !death)
2021                                 {
2022                                         if (!(r_ptr->flags3 & RF3_IM_FIRE))
2023                                         {
2024                                                 int dam = damroll(2, 6);
2025
2026                                                 /* Modify the damage */
2027                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2028
2029 #ifdef JP
2030                                                 msg_format("%^s¤ÏÆÍÁ³Ç®¤¯¤Ê¤Ã¤¿¡ª", m_name);
2031                                                 if (mon_take_hit(m_idx, dam, &fear,
2032                                                     "¤Ï³¥¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
2033 #else
2034                                                 msg_format("%^s is suddenly very hot!", m_name);
2035
2036                                                 if (mon_take_hit(m_idx, dam, &fear,
2037                                                     " turns into a pile of ash."))
2038 #endif
2039
2040                                                 {
2041                                                         blinked = FALSE;
2042                                                         alive = FALSE;
2043                                                 }
2044                                         }
2045                                         else
2046                                         {
2047                                                 if (m_ptr->ml)
2048                                                         r_ptr->r_flags3 |= RF3_IM_FIRE;
2049                                         }
2050                                 }
2051
2052                                 if (p_ptr->sh_elec && alive && !death)
2053                                 {
2054                                         if (!(r_ptr->flags3 & RF3_IM_ELEC))
2055                                         {
2056                                                 int dam = damroll(2, 6);
2057
2058                                                 /* Modify the damage */
2059                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2060
2061 #ifdef JP
2062                                                 msg_format("%^s¤ÏÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2063                                                 if (mon_take_hit(m_idx, dam, &fear,
2064                                                     "¤Ïdz¤¨³Ì¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
2065 #else
2066                                                 msg_format("%^s gets zapped!", m_name);
2067
2068                                                 if (mon_take_hit(m_idx, dam, &fear,
2069                                                     " turns into a pile of cinder."))
2070 #endif
2071
2072                                                 {
2073                                                         blinked = FALSE;
2074                                                         alive = FALSE;
2075                                                 }
2076                                         }
2077                                         else
2078                                         {
2079                                                 if (m_ptr->ml)
2080                                                         r_ptr->r_flags3 |= RF3_IM_ELEC;
2081                                         }
2082                                 }
2083
2084                                 if (p_ptr->sh_cold && alive && !death)
2085                                 {
2086                                         if (!(r_ptr->flags3 & RF3_IM_COLD))
2087                                         {
2088                                                 int dam = damroll(2, 6);
2089
2090                                                 /* Modify the damage */
2091                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2092
2093 #ifdef JP
2094                                                 msg_format("%^s¤ÏÎ䵤¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2095                                                 if (mon_take_hit(m_idx, dam, &fear,
2096                                                     "¤ÏÅà¤ê¤Ä¤¤¤¿¡£"))
2097 #else
2098                                                 msg_format("%^s is very cold!", m_name);
2099
2100                                                 if (mon_take_hit(m_idx, dam, &fear,
2101                                                     " was frozen."))
2102 #endif
2103
2104                                                 {
2105                                                         blinked = FALSE;
2106                                                         alive = FALSE;
2107                                                 }
2108                                         }
2109                                         else
2110                                         {
2111                                                 if (m_ptr->ml)
2112                                                         r_ptr->r_flags3 |= RF3_IM_COLD;
2113                                         }
2114                                 }
2115
2116                                 /* by henkma */
2117                                 if (p_ptr->dustrobe && alive && !death)
2118                                 {
2119                                         if (!(r_ptr->flags4 & RF4_BR_SHAR))
2120                                         {
2121                                                 int dam = damroll(2, 6);
2122
2123                                                 /* Modify the damage */
2124                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2125
2126 #ifdef JP
2127                                                 msg_format("%^s¤Ï¶À¤ÎÇËÊÒ¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
2128                                                 if (mon_take_hit(m_idx, dam, &fear,
2129                                                     "¤Ï¥º¥¿¥º¥¿¤Ë¤Ê¤Ã¤¿¡£"))
2130 #else
2131                                                 msg_format("%^s gets zapped!", m_name);
2132
2133                                                 if (mon_take_hit(m_idx, dam, &fear,
2134                                                     " had torn to pieces."))
2135 #endif
2136                                                   
2137                                                 {
2138                                                         blinked = FALSE;
2139                                                         alive = FALSE;
2140                                                 }
2141                                         }
2142                                         if( cave[py][px].feat == FEAT_MIRROR ){
2143                                                 teleport_player(10);
2144                                         }
2145                                 }
2146
2147
2148                                 if (p_ptr->tim_sh_touki && alive && !death)
2149                                 {
2150                                         int dam = damroll(2, 6);
2151
2152                                         /* Modify the damage */
2153                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
2154
2155 #ifdef JP
2156                                         msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
2157                                         if (mon_take_hit(m_idx, dam, &fear,
2158                                             "¤ÏÅݤ줿¡£"))
2159 #else
2160                                         msg_format("%^s is suddenly very hot!", m_name);
2161
2162                                         if (mon_take_hit(m_idx, dam, &fear,
2163                                             " turns into a pile of ash."))
2164 #endif
2165
2166                                         {
2167                                                 blinked = FALSE;
2168                                                 alive = FALSE;
2169                                         }
2170                                 }
2171                                 touched = FALSE;
2172                         }
2173                 }
2174
2175                 /* Monster missed player */
2176                 else
2177                 {
2178                         /* Analyze failed attacks */
2179                         switch (method)
2180                         {
2181                                 case RBM_HIT:
2182                                 case RBM_TOUCH:
2183                                 case RBM_PUNCH:
2184                                 case RBM_KICK:
2185                                 case RBM_CLAW:
2186                                 case RBM_BITE:
2187                                 case RBM_STING:
2188                                 case RBM_SLASH:
2189                                 case RBM_BUTT:
2190                                 case RBM_CRUSH:
2191                                 case RBM_ENGULF:
2192                                 case RBM_CHARGE:
2193
2194                                 /* Visible monsters */
2195                                 if (m_ptr->ml)
2196                                 {
2197                                         /* Disturbing */
2198                                         disturb(1, 0);
2199
2200                                         /* Message */
2201 #ifdef JP
2202                                         if (syouryaku)
2203                                             msg_format("%s¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤­¤Ç" : "");
2204                                         else
2205                                             msg_format("%s%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤­¤Ç" : "", m_name);
2206                                         syouryaku = 1;/*£²²óÌܰʹߤϾÊά */
2207 #else
2208                                         msg_format("%^s misses you.", m_name);
2209 #endif
2210
2211                                 }
2212                                 damage = 0;
2213
2214                                 break;
2215                         }
2216                 }
2217
2218
2219                 /* Analyze "visible" monsters only */
2220                 if (visible && !do_silly_attack)
2221                 {
2222                         /* Count "obvious" attacks (and ones that cause damage) */
2223                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
2224                         {
2225                                 /* Count attacks of this type */
2226                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
2227                                 {
2228                                         r_ptr->r_blows[ap_cnt]++;
2229                                 }
2230                         }
2231                 }
2232
2233                 if (p_ptr->riding && damage)
2234                 {
2235                         char m_name[80];
2236                         monster_desc(m_name, &m_list[p_ptr->riding], 0);
2237                         if (rakuba((damage > 200) ? 200 : damage, FALSE))
2238                         {
2239 #ifdef JP
2240 msg_format("%^s¤«¤éÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
2241 #else
2242                                 msg_format("You have fallen from %s.", m_name);
2243 #endif
2244                         }
2245                 }
2246                 if (p_ptr->special_defense & NINJA_KAWARIMI)
2247                 {
2248                         kawarimi(FALSE);
2249                         return TRUE;
2250                 }
2251         }
2252
2253
2254         if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !death && m_ptr->ml && (p_ptr->csp > 7))
2255         {
2256                 char m_name[80];
2257                 monster_desc(m_name, m_ptr, 0);
2258
2259                 p_ptr->csp -= 7;
2260 #ifdef JP
2261                 msg_format("%^s¤ËÈ¿·â¤·¤¿¡ª", m_name);
2262 #else
2263                 msg_format("Your counterattack to %s!", m_name);
2264 #endif
2265                 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
2266                 fear = FALSE;
2267         }
2268
2269         /* Blink away */
2270         if (blinked)
2271         {
2272 #ifdef JP
2273                 msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
2274 #else
2275                 msg_print("The thief flees laughing!");
2276 #endif
2277
2278                 teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE);
2279         }
2280
2281
2282         /* Always notice cause of death */
2283         if (death && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
2284         {
2285                 r_ptr->r_deaths++;
2286         }
2287
2288         if (m_ptr->ml && fear)
2289         {
2290                 sound(SOUND_FLEE);
2291 #ifdef JP
2292                 msg_format("%^s¤Ï¶²ÉݤÇƨ¤²½Ð¤·¤¿¡ª", m_name);
2293 #else
2294                 msg_format("%^s flees in terror!", m_name);
2295 #endif
2296
2297         }
2298
2299         if (p_ptr->special_defense & KATA_IAI)
2300         {
2301                 set_action(ACTION_NONE);
2302         }
2303
2304         /* Assume we attacked */
2305         return (TRUE);
2306 }