OSDN Git Service

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