OSDN Git Service

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