OSDN Git Service

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