OSDN Git Service

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