OSDN Git Service

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