OSDN Git Service

87f0eb17a1d5c3afb0835cd77f1e0bae979ad8ca
[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, 0);
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 = 0;
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 -= (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);
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);
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);
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);
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                         }
1785
1786                         /* Hack -- only one of cut or stun */
1787                         if (do_cut && do_stun)
1788                         {
1789                                 /* Cancel cut */
1790                                 if (randint0(100) < 50)
1791                                 {
1792                                         do_cut = 0;
1793                                 }
1794
1795                                 /* Cancel stun */
1796                                 else
1797                                 {
1798                                         do_stun = 0;
1799                                 }
1800                         }
1801
1802                         /* Handle cut */
1803                         if (do_cut)
1804                         {
1805                                 int k = 0;
1806
1807                                 /* Critical hit (zero if non-critical) */
1808                                 tmp = monster_critical(d_dice, d_side, damage);
1809
1810                                 /* Roll for damage */
1811                                 switch (tmp)
1812                                 {
1813                                         case 0: k = 0; break;
1814                                         case 1: k = randint1(5); break;
1815                                         case 2: k = randint1(5) + 5; break;
1816                                         case 3: k = randint1(20) + 20; break;
1817                                         case 4: k = randint1(50) + 50; break;
1818                                         case 5: k = randint1(100) + 100; break;
1819                                         case 6: k = 300; break;
1820                                         default: k = 500; break;
1821                                 }
1822
1823                                 /* Apply the cut */
1824                                 if (k) (void)set_cut(p_ptr->cut + k);
1825                         }
1826
1827                         /* Handle stun */
1828                         if (do_stun)
1829                         {
1830                                 int k = 0;
1831
1832                                 /* Critical hit (zero if non-critical) */
1833                                 tmp = monster_critical(d_dice, d_side, damage);
1834
1835                                 /* Roll for damage */
1836                                 switch (tmp)
1837                                 {
1838                                         case 0: k = 0; break;
1839                                         case 1: k = randint1(5); break;
1840                                         case 2: k = randint1(5) + 10; break;
1841                                         case 3: k = randint1(10) + 20; break;
1842                                         case 4: k = randint1(15) + 30; break;
1843                                         case 5: k = randint1(20) + 40; break;
1844                                         case 6: k = 80; break;
1845                                         default: k = 150; break;
1846                                 }
1847
1848                                 /* Apply the stun */
1849                                 if (k) (void)set_stun(p_ptr->stun + k);
1850                         }
1851
1852                         if (explode)
1853                         {
1854                                 sound(SOUND_EXPLODE);
1855
1856                                 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
1857                                 {
1858                                         blinked = FALSE;
1859                                         alive = FALSE;
1860                                 }
1861                         }
1862
1863                         if (touched)
1864                         {
1865                                 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
1866                                 {
1867                                         if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
1868                                         {
1869                                                 int dam = damroll(2, 6);
1870
1871                                                 /* Modify the damage */
1872                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
1873
1874 #ifdef JP
1875                                                 msg_format("%^s¤ÏÆÍÁ³Ç®¤¯¤Ê¤Ã¤¿¡ª", m_name);
1876                                                 if (mon_take_hit(m_idx, dam, &fear,
1877                                                     "¤Ï³¥¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
1878 #else
1879                                                 msg_format("%^s is suddenly very hot!", m_name);
1880
1881                                                 if (mon_take_hit(m_idx, dam, &fear,
1882                                                     " turns into a pile of ash."))
1883 #endif
1884
1885                                                 {
1886                                                         blinked = FALSE;
1887                                                         alive = FALSE;
1888                                                 }
1889                                         }
1890                                         else
1891                                         {
1892                                                 if (is_original_ap_and_seen(m_ptr))
1893                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
1894                                         }
1895                                 }
1896
1897                                 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
1898                                 {
1899                                         if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
1900                                         {
1901                                                 int dam = damroll(2, 6);
1902
1903                                                 /* Modify the damage */
1904                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
1905
1906 #ifdef JP
1907                                                 msg_format("%^s¤ÏÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
1908                                                 if (mon_take_hit(m_idx, dam, &fear,
1909                                                     "¤Ïdz¤¨³Ì¤Î»³¤Ë¤Ê¤Ã¤¿¡£"))
1910 #else
1911                                                 msg_format("%^s gets zapped!", m_name);
1912
1913                                                 if (mon_take_hit(m_idx, dam, &fear,
1914                                                     " turns into a pile of cinder."))
1915 #endif
1916
1917                                                 {
1918                                                         blinked = FALSE;
1919                                                         alive = FALSE;
1920                                                 }
1921                                         }
1922                                         else
1923                                         {
1924                                                 if (is_original_ap_and_seen(m_ptr))
1925                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
1926                                         }
1927                                 }
1928
1929                                 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
1930                                 {
1931                                         if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
1932                                         {
1933                                                 int dam = damroll(2, 6);
1934
1935                                                 /* Modify the damage */
1936                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
1937
1938 #ifdef JP
1939                                                 msg_format("%^s¤ÏÎ䵤¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
1940                                                 if (mon_take_hit(m_idx, dam, &fear,
1941                                                     "¤ÏÅà¤ê¤Ä¤¤¤¿¡£"))
1942 #else
1943                                                 msg_format("%^s is very cold!", m_name);
1944
1945                                                 if (mon_take_hit(m_idx, dam, &fear,
1946                                                     " was frozen."))
1947 #endif
1948
1949                                                 {
1950                                                         blinked = FALSE;
1951                                                         alive = FALSE;
1952                                                 }
1953                                         }
1954                                         else
1955                                         {
1956                                                 if (is_original_ap_and_seen(m_ptr))
1957                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
1958                                         }
1959                                 }
1960
1961                                 /* by henkma */
1962                                 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
1963                                 {
1964                                         if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
1965                                         {
1966                                                 int dam = damroll(2, 6);
1967
1968                                                 /* Modify the damage */
1969                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
1970
1971 #ifdef JP
1972                                                 msg_format("%^s¤Ï¶À¤ÎÇËÊÒ¤ò¤¯¤é¤Ã¤¿¡ª", m_name);
1973                                                 if (mon_take_hit(m_idx, dam, &fear,
1974                                                     "¤Ï¥º¥¿¥º¥¿¤Ë¤Ê¤Ã¤¿¡£"))
1975 #else
1976                                                 msg_format("%^s gets zapped!", m_name);
1977
1978                                                 if (mon_take_hit(m_idx, dam, &fear,
1979                                                     " had torn to pieces."))
1980 #endif
1981                                                 {
1982                                                         blinked = FALSE;
1983                                                         alive = FALSE;
1984                                                 }
1985                                         }
1986                                         else
1987                                         {
1988                                                 if (is_original_ap_and_seen(m_ptr))
1989                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
1990                                         }
1991
1992                                         if (is_mirror_grid(&cave[py][px]))
1993                                         {
1994                                                 teleport_player(10, 0L);
1995                                         }
1996                                 }
1997
1998                                 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
1999                                 {
2000                                         if (r_ptr->flags3 & RF3_EVIL)
2001                                         {
2002                                                 if (!(r_ptr->flagsr & RFR_RES_ALL))
2003                                                 {
2004                                                         int dam = damroll(2, 6);
2005
2006                                                         /* Modify the damage */
2007                                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
2008
2009 #ifdef JP
2010                                                         msg_format("%^s¤ÏÀ»¤Ê¤ë¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
2011                                                         if (mon_take_hit(m_idx, dam, &fear,
2012                                                             "¤ÏÅݤ줿¡£"))
2013 #else
2014                                                         msg_format("%^s is injured by holy power!", m_name);
2015
2016                                                         if (mon_take_hit(m_idx, dam, &fear,
2017                                                             " is destroyed."))
2018 #endif
2019                                                         {
2020                                                                 blinked = FALSE;
2021                                                                 alive = FALSE;
2022                                                         }
2023                                                         if (is_original_ap_and_seen(m_ptr))
2024                                                                 r_ptr->r_flags3 |= RF3_EVIL;
2025                                                 }
2026                                                 else
2027                                                 {
2028                                                         if (is_original_ap_and_seen(m_ptr))
2029                                                                 r_ptr->r_flagsr |= RFR_RES_ALL;
2030                                                 }
2031                                         }
2032                                 }
2033
2034                                 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
2035                                 {
2036                                         if (!(r_ptr->flagsr & RFR_RES_ALL))
2037                                         {
2038                                                 int dam = damroll(2, 6);
2039
2040                                                 /* Modify the damage */
2041                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2042
2043 #ifdef JP
2044                                                 msg_format("%^s¤¬±Ô¤¤Æ®µ¤¤Î¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
2045                                                 if (mon_take_hit(m_idx, dam, &fear,
2046                                                     "¤ÏÅݤ줿¡£"))
2047 #else
2048                                                 msg_format("%^s is injured by the Force", m_name);
2049
2050                                                 if (mon_take_hit(m_idx, dam, &fear,
2051                                                     " is destroyed."))
2052 #endif
2053
2054                                                 {
2055                                                         blinked = FALSE;
2056                                                         alive = FALSE;
2057                                                 }
2058                                         }
2059                                         else
2060                                         {
2061                                                 if (is_original_ap_and_seen(m_ptr))
2062                                                         r_ptr->r_flagsr |= RFR_RES_ALL;
2063                                         }
2064                                 }
2065                         }
2066                 }
2067
2068                 /* Monster missed player */
2069                 else
2070                 {
2071                         /* Analyze failed attacks */
2072                         switch (method)
2073                         {
2074                                 case RBM_HIT:
2075                                 case RBM_TOUCH:
2076                                 case RBM_PUNCH:
2077                                 case RBM_KICK:
2078                                 case RBM_CLAW:
2079                                 case RBM_BITE:
2080                                 case RBM_STING:
2081                                 case RBM_SLASH:
2082                                 case RBM_BUTT:
2083                                 case RBM_CRUSH:
2084                                 case RBM_ENGULF:
2085                                 case RBM_CHARGE:
2086
2087                                 /* Visible monsters */
2088                                 if (m_ptr->ml)
2089                                 {
2090                                         /* Disturbing */
2091                                         disturb(1, 0);
2092
2093                                         /* Message */
2094 #ifdef JP
2095                                         if (abbreviate)
2096                                             msg_format("%s¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤­¤Ç" : "");
2097                                         else
2098                                             msg_format("%s%^s¤Î¹¶·â¤ò¤«¤ï¤·¤¿¡£", (p_ptr->special_attack & ATTACK_SUIKEN) ? "´ñ̯¤ÊÆ°¤­¤Ç" : "", m_name);
2099                                         abbreviate = 1;/*£²²óÌܰʹߤϾÊά */
2100 #else
2101                                         msg_format("%^s misses you.", m_name);
2102 #endif
2103
2104                                 }
2105                                 damage = 0;
2106
2107                                 break;
2108                         }
2109                 }
2110
2111
2112                 /* Analyze "visible" monsters only */
2113                 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
2114                 {
2115                         /* Count "obvious" attacks (and ones that cause damage) */
2116                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
2117                         {
2118                                 /* Count attacks of this type */
2119                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
2120                                 {
2121                                         r_ptr->r_blows[ap_cnt]++;
2122                                 }
2123                         }
2124                 }
2125
2126                 if (p_ptr->riding && damage)
2127                 {
2128                         char m_name[80];
2129                         monster_desc(m_name, &m_list[p_ptr->riding], 0);
2130                         if (rakuba((damage > 200) ? 200 : damage, FALSE))
2131                         {
2132 #ifdef JP
2133 msg_format("%^s¤«¤éÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
2134 #else
2135                                 msg_format("You have fallen from %s.", m_name);
2136 #endif
2137                         }
2138                 }
2139
2140                 if (p_ptr->special_defense & NINJA_KAWARIMI)
2141                 {
2142                         if (kawarimi(FALSE)) return TRUE;
2143                 }
2144         }
2145
2146         if (p_ptr->tim_eyeeye && get_damage > 0 && !p_ptr->is_dead)
2147         {
2148 #ifdef JP
2149                 msg_format("¹¶·â¤¬%s¼«¿È¤ò½ý¤Ä¤±¤¿¡ª", m_name);
2150 #else
2151                 char m_name_self[80];
2152
2153                 /* hisself */
2154                 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
2155
2156                 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
2157 #endif
2158                 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
2159                 set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
2160         }
2161
2162
2163         if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
2164         {
2165                 char m_name[80];
2166                 monster_desc(m_name, m_ptr, 0);
2167
2168                 p_ptr->csp -= 7;
2169 #ifdef JP
2170                 msg_format("%^s¤ËÈ¿·â¤·¤¿¡ª", m_name);
2171 #else
2172                 msg_format("Your counterattack to %s!", m_name);
2173 #endif
2174                 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
2175                 fear = FALSE;
2176
2177                 /* Redraw mana */
2178                 p_ptr->redraw |= (PR_MANA);
2179         }
2180
2181         /* Blink away */
2182         if (blinked && alive && !p_ptr->is_dead)
2183         {
2184 #ifdef JP
2185                 msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
2186 #else
2187                 msg_print("The thief flees laughing!");
2188 #endif
2189
2190                 teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
2191         }
2192
2193
2194         /* Always notice cause of death */
2195         if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
2196         {
2197                 r_ptr->r_deaths++;
2198         }
2199
2200         if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
2201         {
2202                 sound(SOUND_FLEE);
2203 #ifdef JP
2204                 msg_format("%^s¤Ï¶²ÉݤÇƨ¤²½Ð¤·¤¿¡ª", m_name);
2205 #else
2206                 msg_format("%^s flees in terror!", m_name);
2207 #endif
2208
2209         }
2210
2211         if (p_ptr->special_defense & KATA_IAI)
2212         {
2213                 set_action(ACTION_NONE);
2214         }
2215
2216         /* Assume we attacked */
2217         return (TRUE);
2218 }