OSDN Git Service

[Refactor] monster_name() で一部 cmd2.c の投擲対象処理を整理。
[hengband/hengband.git] / src / melee1.c
1 /*!
2  * @file melee1.c
3  * @brief 打撃処理 / Melee process.
4  * @date 2014/01/17
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  * This software may be copied and distributed for educational, research,\n
8  * and not for profit purposes provided that this copyright and statement\n
9  * are included in all such copies.  Other copyrights may also apply.\n
10  * 2014 Deskull rearranged comment for Doxygen.\n
11  * @details
12  */
13
14 #include "angband.h"
15 #include "artifact.h"
16 #include "cmd-pet.h"
17 #include "player-damage.h"
18 #include "monsterrace-hook.h"
19 #include "melee.h"
20 #include "projection.h"
21 #include "monster.h"
22 #include "monster-status.h"
23 #include "monster-spell.h"
24 #include "avatar.h"
25 #include "player-status.h"
26 #include "realm-hex.h"
27 #include "object-hook.h"
28 #include "grid.h"
29 #include "player-move.h"
30
31
32
33  /*!
34  * @brief プレイヤーからモンスターへの打撃命中判定 /
35  * Determine if the player "hits" a monster (normal combat).
36  * @param chance 基本命中値
37  * @param ac モンスターのAC
38  * @param visible 目標を視界に捕らえているならばTRUEを指定
39  * @return 命中と判定された場合TRUEを返す
40  * @note Always miss 5%, always hit 5%, otherwise random.
41  */
42 bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
43 {
44         if (!visible) chance = (chance + 1) / 2;
45         return hit_chance(chance, ac) >= randint1(100);
46 }
47
48 /*!
49  * @brief モンスターへの命中率の計算
50  * @param to_h 命中値
51  * @param ac 敵AC
52  * @return 命中確率
53  */
54 PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
55 {
56         PERCENTAGE chance = 5, chance_left = 90;
57         if(reli <= 0) return 5;
58         if(p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
59         chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
60         if (chance < 5) chance = 5;
61         return chance;
62 }
63
64 /*!
65  * @brief プレイヤー攻撃の種族スレイング倍率計算
66  * @param mult 算出前の基本倍率(/10倍)
67  * @param flgs スレイフラグ配列
68  * @param m_ptr 目標モンスターの構造体参照ポインタ
69  * @return スレイング加味後の倍率(/10倍)
70  */
71 static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
72 {
73         static const struct slay_table_t {
74                 int slay_flag;
75                 BIT_FLAGS affect_race_flag;
76                 MULTIPLY slay_mult;
77                 size_t flag_offset;
78                 size_t r_flag_offset;
79         } slay_table[] = {
80 #define OFFSET(X) offsetof(monster_race, X)
81                 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
82                 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
83                 {TR_SLAY_EVIL,   RF3_EVIL,   20, OFFSET(flags3), OFFSET(r_flags3)},
84                 {TR_KILL_EVIL,   RF3_EVIL,   35, OFFSET(flags3), OFFSET(r_flags3)},
85                 {TR_SLAY_GOOD,   RF3_GOOD,   20, OFFSET(flags3), OFFSET(r_flags3)},
86                 {TR_KILL_GOOD,   RF3_GOOD,   35, OFFSET(flags3), OFFSET(r_flags3)},
87                 {TR_SLAY_HUMAN,  RF2_HUMAN,  25, OFFSET(flags2), OFFSET(r_flags2)},
88                 {TR_KILL_HUMAN,  RF2_HUMAN,  40, OFFSET(flags2), OFFSET(r_flags2)},
89                 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
90                 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
91                 {TR_SLAY_DEMON,  RF3_DEMON,  30, OFFSET(flags3), OFFSET(r_flags3)},
92                 {TR_KILL_DEMON,  RF3_DEMON,  50, OFFSET(flags3), OFFSET(r_flags3)},
93                 {TR_SLAY_ORC,    RF3_ORC,    30, OFFSET(flags3), OFFSET(r_flags3)},
94                 {TR_KILL_ORC,    RF3_ORC,    50, OFFSET(flags3), OFFSET(r_flags3)},
95                 {TR_SLAY_TROLL,  RF3_TROLL,  30, OFFSET(flags3), OFFSET(r_flags3)},
96                 {TR_KILL_TROLL,  RF3_TROLL,  50, OFFSET(flags3), OFFSET(r_flags3)},
97                 {TR_SLAY_GIANT,  RF3_GIANT,  30, OFFSET(flags3), OFFSET(r_flags3)},
98                 {TR_KILL_GIANT,  RF3_GIANT,  50, OFFSET(flags3), OFFSET(r_flags3)},
99                 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
100                 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
101 #undef OFFSET
102         };
103         int i;
104         monster_race* r_ptr = &r_info[m_ptr->r_idx];
105
106         for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
107         {
108                 const struct slay_table_t* p = &slay_table[i];
109
110                 if ((have_flag(flgs, p->slay_flag)) &&
111                         (atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
112                 {
113                         if (is_original_ap_and_seen(m_ptr))
114                         {
115                                 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
116                         }
117
118                         mult = MAX(mult, p->slay_mult);
119                 }
120         }
121
122         return mult;
123 }
124
125 /*!
126  * @brief プレイヤー攻撃の属性スレイング倍率計算
127  * @param mult 算出前の基本倍率(/10倍)
128  * @param flgs スレイフラグ配列
129  * @param m_ptr 目標モンスターの構造体参照ポインタ
130  * @return スレイング加味後の倍率(/10倍)
131  */
132 static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
133 {
134         static const struct brand_table_t {
135                 int brand_flag;
136                 BIT_FLAGS resist_mask;
137                 BIT_FLAGS hurt_flag;
138         } brand_table[] = {
139                 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U           },
140                 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U           },
141                 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
142                 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
143                 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U           },
144         };
145         int i;
146         monster_race* r_ptr = &r_info[m_ptr->r_idx];
147
148         for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
149         {
150                 const struct brand_table_t* p = &brand_table[i];
151
152                 if (have_flag(flgs, p->brand_flag))
153                 {
154                         /* Notice immunity */
155                         if (r_ptr->flagsr & p->resist_mask)
156                         {
157                                 if (is_original_ap_and_seen(m_ptr))
158                                 {
159                                         r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
160                                 }
161                         }
162
163                         /* Otherwise, take the damage */
164                         else if (r_ptr->flags3 & p->hurt_flag)
165                         {
166                                 if (is_original_ap_and_seen(m_ptr))
167                                 {
168                                         r_ptr->r_flags3 |= p->hurt_flag;
169                                 }
170
171                                 mult = MAX(mult, 50);
172                         }
173                         else
174                         {
175                                 mult = MAX(mult, 25);
176                         }
177                 }
178         }
179
180         return mult;
181 }
182
183 /*!
184  * @brief 剣術のスレイ倍率計算を行う /
185  * Calcurate magnification of hissatsu technics
186  * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
187  * @param flgs 剣術に使用する武器のスレイフラグ配列
188  * @param m_ptr 目標となるモンスターの構造体参照ポインタ
189  * @param mode 剣術のスレイ型ID
190  * @return スレイの倍率(/10倍)
191  */
192 static MULTIPLY mult_hissatsu(MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
193 {
194         monster_race *r_ptr = &r_info[m_ptr->r_idx];
195
196         /* Burning Strike (Fire) */
197         if (mode == HISSATSU_FIRE)
198         {
199                 /* Notice immunity */
200                 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
201                 {
202                         if (is_original_ap_and_seen(m_ptr))
203                         {
204                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
205                         }
206                 }
207
208                 /* Otherwise, take the damage */
209                 else if (have_flag(flgs, TR_BRAND_FIRE))
210                 {
211                         if (r_ptr->flags3 & RF3_HURT_FIRE)
212                         {
213                                 if (mult < 70) mult = 70;
214                                 if (is_original_ap_and_seen(m_ptr))
215                                 {
216                                         r_ptr->r_flags3 |= RF3_HURT_FIRE;
217                                 }
218                         }
219                         else if (mult < 35) mult = 35;
220                 }
221                 else
222                 {
223                         if (r_ptr->flags3 & RF3_HURT_FIRE)
224                         {
225                                 if (mult < 50) mult = 50;
226                                 if (is_original_ap_and_seen(m_ptr))
227                                 {
228                                         r_ptr->r_flags3 |= RF3_HURT_FIRE;
229                                 }
230                         }
231                         else if (mult < 25) mult = 25;
232                 }
233         }
234
235         /* Serpent's Tongue (Poison) */
236         if (mode == HISSATSU_POISON)
237         {
238                 /* Notice immunity */
239                 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
240                 {
241                         if (is_original_ap_and_seen(m_ptr))
242                         {
243                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
244                         }
245                 }
246
247                 /* Otherwise, take the damage */
248                 else if (have_flag(flgs, TR_BRAND_POIS))
249                 {
250                         if (mult < 35) mult = 35;
251                 }
252                 else
253                 {
254                         if (mult < 25) mult = 25;
255                 }
256         }
257
258         /* Zammaken (Nonliving Evil) */
259         if (mode == HISSATSU_ZANMA)
260         {
261                 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
262                 {
263                         if (mult < 15) mult = 25;
264                         else if (mult < 50) mult = MIN(50, mult + 20);
265                 }
266         }
267
268         /* Rock Smash (Hurt Rock) */
269         if (mode == HISSATSU_HAGAN)
270         {
271                 if (r_ptr->flags3 & RF3_HURT_ROCK)
272                 {
273                         if (is_original_ap_and_seen(m_ptr))
274                         {
275                                 r_ptr->r_flags3 |= RF3_HURT_ROCK;
276                         }
277                         if (mult == 10) mult = 40;
278                         else if (mult < 60) mult = 60;
279                 }
280         }
281
282         /* Midare-Setsugekka (Cold) */
283         if (mode == HISSATSU_COLD)
284         {
285                 /* Notice immunity */
286                 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
287                 {
288                         if (is_original_ap_and_seen(m_ptr))
289                         {
290                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
291                         }
292                 }
293                 /* Otherwise, take the damage */
294                 else if (have_flag(flgs, TR_BRAND_COLD))
295                 {
296                         if (r_ptr->flags3 & RF3_HURT_COLD)
297                         {
298                                 if (mult < 70) mult = 70;
299                                 if (is_original_ap_and_seen(m_ptr))
300                                 {
301                                         r_ptr->r_flags3 |= RF3_HURT_COLD;
302                                 }
303                         }
304                         else if (mult < 35) mult = 35;
305                 }
306                 else
307                 {
308                         if (r_ptr->flags3 & RF3_HURT_COLD)
309                         {
310                                 if (mult < 50) mult = 50;
311                                 if (is_original_ap_and_seen(m_ptr))
312                                 {
313                                         r_ptr->r_flags3 |= RF3_HURT_COLD;
314                                 }
315                         }
316                         else if (mult < 25) mult = 25;
317                 }
318         }
319
320         /* Lightning Eagle (Elec) */
321         if (mode == HISSATSU_ELEC)
322         {
323                 /* Notice immunity */
324                 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
325                 {
326                         if (is_original_ap_and_seen(m_ptr))
327                         {
328                                 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
329                         }
330                 }
331
332                 /* Otherwise, take the damage */
333                 else if (have_flag(flgs, TR_BRAND_ELEC))
334                 {
335                         if (mult < 70) mult = 70;
336                 }
337                 else
338                 {
339                         if (mult < 50) mult = 50;
340                 }
341         }
342
343         /* Bloody Maelstrom */
344         if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(m_ptr->r_idx))
345         {
346                 MULTIPLY tmp = MIN(100, MAX(10, p_ptr->cut / 10));
347                 if (mult < tmp) mult = tmp;
348         }
349
350         /* Keiun-Kininken */
351         if (mode == HISSATSU_UNDEAD)
352         {
353                 if (r_ptr->flags3 & RF3_UNDEAD)
354                 {
355                         if (is_original_ap_and_seen(m_ptr))
356                         {
357                                 r_ptr->r_flags3 |= RF3_UNDEAD;
358                         }
359                         if (mult == 10) mult = 70;
360                         else if (mult < 140) mult = MIN(140, mult + 60);
361                 }
362                 if (mult == 10) mult = 40;
363                 else if (mult < 60) mult = MIN(60, mult + 30);
364         }
365
366         if (mult > 150) mult = 150;
367
368         return mult;
369 }
370
371 /*!
372  * @brief ダメージにスレイ要素を加える総合処理ルーチン /
373  * Extract the "total damage" from a given object hitting a given monster.
374  * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
375  * @param tdam 現在算出途中のダメージ値
376  * @param m_ptr 目標モンスターの構造体参照ポインタ
377  * @param mode 剣術のID
378  * @param thrown 投擲処理ならばTRUEを指定する
379  * @return 総合的なスレイを加味したダメージ値
380  * @note
381  * Note that "flasks of oil" do NOT do fire damage, although they\n
382  * certainly could be made to do so.  XXX XXX\n
383  *\n
384  * Note that most brands and slays are x3, except Slay Animal (x2),\n
385  * Slay Evil (x2), and Kill dragon (x5).\n
386  */
387 HIT_POINT tot_dam_aux(object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
388 {
389         MULTIPLY mult = 10;
390
391         BIT_FLAGS flgs[TR_FLAG_SIZE];
392         object_flags(o_ptr, flgs);
393         torch_flags(o_ptr, flgs); /* torches has secret flags */
394
395         if (!thrown)
396         {
397                 if (p_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
398                 if (p_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
399                 if (p_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
400                 if (p_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
401                 if (p_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
402         }
403
404         if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
405
406         switch (o_ptr->tval)
407         {
408         case TV_SHOT:
409         case TV_ARROW:
410         case TV_BOLT:
411         case TV_HAFTED:
412         case TV_POLEARM:
413         case TV_SWORD:
414         case TV_DIGGING:
415         case TV_LITE:
416         {
417                 mult = mult_slaying(mult, flgs, m_ptr);
418
419                 mult = mult_brand(mult, flgs, m_ptr);
420
421                 if (p_ptr->pclass == CLASS_SAMURAI)
422                 {
423                         mult = mult_hissatsu(mult, flgs, m_ptr, mode);
424                 }
425
426                 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
427                 {
428                         p_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
429                         p_ptr->redraw |= (PR_MANA);
430                         mult = mult * 3 / 2 + 20;
431                 }
432
433                 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
434                         mult = 150;
435                 break;
436         }
437         }
438         if (mult > 150) mult = 150;
439
440         return (tdam * mult / 10);
441 }
442
443 /*!
444 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
445 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
446 * @param weight 矢弾の重量
447 * @param plus 武器の命中修正
448 * @param dam 現在算出中のダメージ値
449 * @param meichuu 打撃の基本命中力
450 * @param mode オプションフラグ
451 * @return クリティカル修正が入ったダメージ値
452 */
453 HIT_POINT critical_norm(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
454 {
455         int i, k;
456
457         /* Extract "blow" power */
458         i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
459
460         /* Chance */
461         if ((randint1((p_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
462         {
463                 k = weight + randint1(650);
464                 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
465
466                 if (k < 400)
467                 {
468                         msg_print(_("手ごたえがあった!", "It was a good hit!"));
469
470                         dam = 2 * dam + 5;
471                 }
472                 else if (k < 700)
473                 {
474                         msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
475                         dam = 2 * dam + 10;
476                 }
477                 else if (k < 900)
478                 {
479                         msg_print(_("会心の一撃だ!", "It was a superb hit!"));
480                         dam = 3 * dam + 15;
481                 }
482                 else if (k < 1300)
483                 {
484                         msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
485                         dam = 3 * dam + 20;
486                 }
487                 else
488                 {
489                         msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
490                         dam = ((7 * dam) / 2) + 25;
491                 }
492         }
493
494         return (dam);
495 }
496
497 /*!
498  * @brief モンスター打撃のクリティカルランクを返す /
499  * Critical blow. All hits that do 95% of total possible damage,
500  * @param dice モンスター打撃のダイス数
501  * @param sides モンスター打撃の最大ダイス目
502  * @param dam プレイヤーに与えたダメージ
503  * @details
504  * and which also do at least 20 damage, or, sometimes, N damage.
505  * This is used only to determine "cuts" and "stuns".
506  */
507 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
508 {
509         int max = 0;
510         int total = dice * sides;
511
512         /* Must do at least 95% of perfect */
513         if (dam < total * 19 / 20) return (0);
514
515         /* Weak blows rarely work */
516         if ((dam < 20) && (randint0(100) >= dam)) return (0);
517
518         /* Perfect damage */
519         if ((dam >= total) && (dam >= 40)) max++;
520
521         /* Super-charge */
522         if (dam >= 20)
523         {
524                 while (randint0(100) < 2) max++;
525         }
526
527         /* Critical damage */
528         if (dam > 45) return (6 + max);
529         if (dam > 33) return (5 + max);
530         if (dam > 25) return (4 + max);
531         if (dam > 18) return (3 + max);
532         if (dam > 11) return (2 + max);
533         return (1 + max);
534 }
535
536 /*!
537  * @brief モンスター打撃の命中を判定する /
538  * Determine if a monster attack against the player succeeds.
539  * @param power 打撃属性毎の基本命中値
540  * @param level モンスターのレベル
541  * @param stun モンスターの朦朧値
542  * @return TRUEならば命中判定
543  * @details
544  * Always miss 5% of the time, Always hit 5% of the time.
545  * Otherwise, match monster power against player armor.
546  */
547 static int check_hit(int power, DEPTH level, int stun)
548 {
549         int i, k, ac;
550
551         /* Percentile dice */
552         k = randint0(100);
553
554         if (stun && one_in_(2)) return FALSE;
555
556         /* Hack -- Always miss or hit */
557         if (k < 10) return (k < 5);
558
559         /* Calculate the "attack quality" */
560         i = (power + (level * 3));
561
562         /* Total armor */
563         ac = p_ptr->ac + p_ptr->to_a;
564         if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
565
566         /* Power and Level compete against Armor */
567         if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
568
569         /* Assume miss */
570         return (FALSE);
571 }
572
573 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
574 static concptr desc_insult[] =
575 {
576 #ifdef JP
577         "があなたを侮辱した!",
578         "があなたの母を侮辱した!",
579         "があなたを軽蔑した!",
580         "があなたを辱めた!",
581         "があなたを汚した!",
582         "があなたの回りで踊った!",
583         "が猥褻な身ぶりをした!",
584         "があなたをぼんやりと見た!!!",
585         "があなたをパラサイト呼ばわりした!",
586         "があなたをサイボーグ扱いした!"
587 #else
588         "insults you!",
589         "insults your mother!",
590         "gives you the finger!",
591         "humiliates you!",
592         "defiles you!",
593         "dances around you!",
594         "makes obscene gestures!",
595         "moons you!!!"
596         "calls you a parasite!",
597         "calls you a cyborg!"
598 #endif
599
600 };
601
602 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
603 static concptr desc_moan[] =
604 {
605 #ifdef JP
606         "は何かを悲しんでいるようだ。",
607         "が彼の飼い犬を見なかったかと尋ねている。",
608         "が縄張りから出て行けと言っている。",
609         "はキノコがどうとか呟いている。"
610 #else
611         "seems sad about something.",
612         "asks if you have seen his dogs.",
613         "tells you to get off his land.",
614         "mumbles something about mushrooms."
615 #endif
616
617 };
618
619 /*!
620 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
621 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
622 * @param immune ダメージを回避できる免疫フラグ
623 * @param flags_offset オーラフラグ配列の参照オフセット
624 * @param r_flags_offset モンスターの耐性配列の参照オフセット
625 * @param aura_flag オーラフラグ配列
626 * @param dam_func ダメージ処理を行う関数の参照ポインタ
627 * @param message オーラダメージを受けた際のメッセージ
628 * @return なし
629 */
630 static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
631         HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
632 {
633         monster_race *r_ptr = &r_info[m_ptr->r_idx];
634
635         if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
636         {
637                 GAME_TEXT mon_name[MAX_NLEN];
638                 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
639
640                 monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
641                 msg_print(message);
642                 dam_func(aura_damage, mon_name, -1, TRUE);
643
644                 if (is_original_ap_and_seen(m_ptr))
645                 {
646                         atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
647                 }
648
649                 handle_stuff();
650         }
651 }
652
653 /*!
654 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
655 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
656 * @return なし
657 */
658 static void touch_zap_player(monster_type *m_ptr)
659 {
660         touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
661                 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
662         touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
663                 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
664         touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
665                 elec_dam, _("電撃をくらった!", "You get zapped!"));
666 }
667
668 /*!
669 * @brief プレイヤーの変異要素による打撃処理
670 * @param m_idx 攻撃目標となったモンスターの参照ID
671 * @param attack 変異要素による攻撃要素の種類
672 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
673 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
674 * @return なし
675 */
676 static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
677 {
678         HIT_POINT k;
679         int bonus, chance;
680         WEIGHT n_weight = 0;
681         monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
682         monster_race *r_ptr = &r_info[m_ptr->r_idx];
683         GAME_TEXT m_name[MAX_NLEN];
684
685         int dice_num, dice_side;
686
687         concptr atk_desc;
688
689         switch (attack)
690         {
691         case MUT2_SCOR_TAIL:
692                 dice_num = 3;
693                 dice_side = 7;
694                 n_weight = 5;
695                 atk_desc = _("尻尾", "tail");
696
697                 break;
698         case MUT2_HORNS:
699                 dice_num = 2;
700                 dice_side = 6;
701                 n_weight = 15;
702                 atk_desc = _("角", "horns");
703
704                 break;
705         case MUT2_BEAK:
706                 dice_num = 2;
707                 dice_side = 4;
708                 n_weight = 5;
709                 atk_desc = _("クチバシ", "beak");
710
711                 break;
712         case MUT2_TRUNK:
713                 dice_num = 1;
714                 dice_side = 4;
715                 n_weight = 35;
716                 atk_desc = _("象の鼻", "trunk");
717
718                 break;
719         case MUT2_TENTACLES:
720                 dice_num = 2;
721                 dice_side = 5;
722                 n_weight = 5;
723                 atk_desc = _("触手", "tentacles");
724
725                 break;
726         default:
727                 dice_num = dice_side = n_weight = 1;
728                 atk_desc = _("未定義の部位", "undefined body part");
729
730         }
731
732         /* Extract monster name (or "it") */
733         monster_desc(m_name, m_ptr, 0);
734
735         /* Calculate the "attack quality" */
736         bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
737         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
738
739         /* Test for hit */
740         if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
741         {
742                 sound(SOUND_HIT);
743                 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
744
745                 k = damroll(dice_num, dice_side);
746                 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
747
748                 /* Apply the player damage bonuses */
749                 k += p_ptr->to_d_m;
750
751                 /* No negative damage */
752                 if (k < 0) k = 0;
753
754                 /* Modify the damage */
755                 k = mon_damage_mod(m_ptr, k, FALSE);
756
757                 /* Complex message */
758                 msg_format_wizard(CHEAT_MONSTER,
759                         _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
760                         k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
761
762                 /* Anger the monster */
763                 if (k > 0) anger_monster(m_ptr);
764
765                 /* Damage, check for fear and mdeath */
766                 switch (attack)
767                 {
768                 case MUT2_SCOR_TAIL:
769                         project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
770                         *mdeath = (m_ptr->r_idx == 0);
771                         break;
772                 case MUT2_HORNS:
773                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
774                         break;
775                 case MUT2_BEAK:
776                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
777                         break;
778                 case MUT2_TRUNK:
779                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
780                         break;
781                 case MUT2_TENTACLES:
782                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
783                         break;
784                 default:
785                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
786                 }
787
788                 touch_zap_player(m_ptr);
789         }
790         /* Player misses */
791         else
792         {
793                 sound(SOUND_MISS);
794                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
795         }
796 }
797
798 /*!
799 * @brief プレイヤーの打撃処理サブルーチン /
800 * Player attacks a (poor, defenseless) creature        -RAK-
801 * @param y 攻撃目標のY座標
802 * @param x 攻撃目標のX座標
803 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
804 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
805 * @param hand 攻撃を行うための武器を持つ手
806 * @param mode 発動中の剣術ID
807 * @return なし
808 * @details
809 * If no "weapon" is available, then "punch" the monster one time.
810 */
811 static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
812 {
813         int num = 0, bonus, chance, vir;
814         HIT_POINT k;
815
816         grid_type       *g_ptr = &current_floor_ptr->grid_array[y][x];
817
818         monster_type    *m_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
819         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
820
821         /* Access the weapon */
822         object_type     *o_ptr = &inventory[INVEN_RARM + hand];
823
824         GAME_TEXT m_name[MAX_NLEN];
825
826         bool            success_hit = FALSE;
827         bool            backstab = FALSE;
828         bool            vorpal_cut = FALSE;
829         int             chaos_effect = 0;
830         bool            stab_fleeing = FALSE;
831         bool            fuiuchi = FALSE;
832         bool            monk_attack = FALSE;
833         bool            do_quake = FALSE;
834         bool            weak = FALSE;
835         bool            drain_msg = TRUE;
836         int             drain_result = 0, drain_heal = 0;
837         bool            can_drain = FALSE;
838         int             num_blow;
839         int             drain_left = MAX_VAMPIRIC_DRAIN;
840         BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
841         bool            is_human = (r_ptr->d_char == 'p');
842         bool            is_lowlevel = (r_ptr->level < (p_ptr->lev - 15));
843         bool            zantetsu_mukou, e_j_mukou;
844
845         switch (p_ptr->pclass)
846         {
847         case CLASS_ROGUE:
848         case CLASS_NINJA:
849                 if (has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
850                 {
851                         int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
852                         if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
853                         if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
854                         if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
855                         if (MON_CSLEEP(m_ptr) && m_ptr->ml)
856                         {
857                                 /* Can't backstab creatures that we can't see, right? */
858                                 backstab = TRUE;
859                         }
860                         else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
861                         {
862                                 fuiuchi = TRUE;
863                         }
864                         else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
865                         {
866                                 stab_fleeing = TRUE;
867                         }
868                 }
869                 break;
870
871         case CLASS_MONK:
872         case CLASS_FORCETRAINER:
873         case CLASS_BERSERKER:
874                 if ((empty_hands(TRUE) & EMPTY_HAND_RARM) && !p_ptr->riding) monk_attack = TRUE;
875                 break;
876         }
877
878         if (!o_ptr->k_idx) /* Empty hand */
879         {
880                 if ((r_ptr->level + 10) > p_ptr->lev)
881                 {
882                         if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
883                         {
884                                 if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
885                                         p_ptr->skill_exp[GINOU_SUDE] += 40;
886                                 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
887                                         p_ptr->skill_exp[GINOU_SUDE] += 5;
888                                 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
889                                         p_ptr->skill_exp[GINOU_SUDE] += 1;
890                                 else if ((p_ptr->lev > 34))
891                                         if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
892                                 p_ptr->update |= (PU_BONUS);
893                         }
894                 }
895         }
896         else if (object_is_melee_weapon(o_ptr))
897         {
898                 if ((r_ptr->level + 10) > p_ptr->lev)
899                 {
900                         OBJECT_TYPE_VALUE tval = inventory[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
901                         OBJECT_SUBTYPE_VALUE sval = inventory[INVEN_RARM + hand].sval;
902                         int now_exp = p_ptr->weapon_exp[tval][sval];
903                         if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
904                         {
905                                 SUB_EXP amount = 0;
906                                 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
907                                 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
908                                 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
909                                 else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
910                                 p_ptr->weapon_exp[tval][sval] += amount;
911                                 p_ptr->update |= (PU_BONUS);
912                         }
913                 }
914         }
915
916         /* Disturb the monster */
917         (void)set_monster_csleep(g_ptr->m_idx, 0);
918
919         /* Extract monster name (or "it") */
920         monster_desc(m_name, m_ptr, 0);
921
922         /* Calculate the "attack quality" */
923         bonus = p_ptr->to_h[hand] + o_ptr->to_h;
924         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
925         if (mode == HISSATSU_IAI) chance += 60;
926         if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
927         if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
928
929         vir = virtue_number(V_VALOUR);
930         if (vir)
931         {
932                 chance += (p_ptr->virtues[vir - 1] / 10);
933         }
934
935         zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
936         e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
937
938         if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
939         else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand] + 2;
940         else num_blow = p_ptr->num_blow[hand];
941
942         /* Hack -- DOKUBARI always hit once */
943         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
944
945         /* Attack once for each legal blow */
946         while ((num++ < num_blow) && !p_ptr->is_dead)
947         {
948                 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
949                 {
950                         int n = 1;
951
952                         if (p_ptr->migite && p_ptr->hidarite)
953                         {
954                                 n *= 2;
955                         }
956                         if (mode == HISSATSU_3DAN)
957                         {
958                                 n *= 2;
959                         }
960
961                         success_hit = one_in_(n);
962                 }
963                 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
964                 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
965
966                 if (mode == HISSATSU_MAJIN)
967                 {
968                         if (one_in_(2))
969                                 success_hit = FALSE;
970                 }
971
972                 /* Test for hit */
973                 if (success_hit)
974                 {
975                         int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
976
977                         sound(SOUND_HIT);
978
979                         if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
980                         else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
981                         else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
982                         else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
983
984                         /* Hack -- bare hands do one damage */
985                         k = 1;
986
987                         object_flags(o_ptr, flgs);
988
989                         /* Select a chaotic effect (50% chance) */
990                         if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
991                         {
992                                 if (one_in_(10))
993                                         chg_virtue(V_CHANCE, 1);
994
995                                 if (randint1(5) < 3)
996                                 {
997                                         /* Vampiric (20%) */
998                                         chaos_effect = 1;
999                                 }
1000                                 else if (one_in_(250))
1001                                 {
1002                                         /* Quake (0.12%) */
1003                                         chaos_effect = 2;
1004                                 }
1005                                 else if (!one_in_(10))
1006                                 {
1007                                         /* Confusion (26.892%) */
1008                                         chaos_effect = 3;
1009                                 }
1010                                 else if (one_in_(2))
1011                                 {
1012                                         /* Teleport away (1.494%) */
1013                                         chaos_effect = 4;
1014                                 }
1015                                 else
1016                                 {
1017                                         /* Polymorph (1.494%) */
1018                                         chaos_effect = 5;
1019                                 }
1020                         }
1021
1022                         /* Vampiric drain */
1023                         if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1024                         {
1025                                 /* Only drain "living" monsters */
1026                                 if (monster_living(m_ptr->r_idx))
1027                                         can_drain = TRUE;
1028                                 else
1029                                         can_drain = FALSE;
1030                         }
1031
1032                         if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1033                                 vorpal_cut = TRUE;
1034                         else vorpal_cut = FALSE;
1035
1036                         if (monk_attack)
1037                         {
1038                                 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1039                                 int min_level = 1;
1040                                 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1041                                 int resist_stun = 0;
1042                                 WEIGHT weight = 8;
1043
1044                                 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1045                                 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1046                                 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1047                                 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1048                                 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1049                                         resist_stun += 66;
1050
1051                                 if (p_ptr->special_defense & KAMAE_BYAKKO)
1052                                         max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
1053                                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1054                                         max_times = 1;
1055                                 else if (p_ptr->special_defense & KAMAE_GENBU)
1056                                         max_times = 1;
1057                                 else
1058                                         max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
1059                                 /* Attempt 'times' */
1060                                 for (times = 0; times < max_times; times++)
1061                                 {
1062                                         do
1063                                         {
1064                                                 ma_ptr = &ma_blows[randint0(MAX_MA)];
1065                                                 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1066                                                 else min_level = ma_ptr->min_level;
1067                                         } while ((min_level > p_ptr->lev) ||
1068                                                 (randint1(p_ptr->lev) < ma_ptr->chance));
1069
1070                                         /* keep the highest level attack available we found */
1071                                         if ((ma_ptr->min_level > old_ptr->min_level) &&
1072                                                 !p_ptr->stun && !p_ptr->confused)
1073                                         {
1074                                                 old_ptr = ma_ptr;
1075
1076                                                 if (p_ptr->wizard && cheat_xtra)
1077                                                 {
1078                                                         msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1079                                                 }
1080                                         }
1081                                         else
1082                                         {
1083                                                 ma_ptr = old_ptr;
1084                                         }
1085                                 }
1086
1087                                 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1088                                 else min_level = ma_ptr->min_level;
1089                                 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
1090                                 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1091
1092                                 if (ma_ptr->effect == MA_KNEE)
1093                                 {
1094                                         if (r_ptr->flags1 & RF1_MALE)
1095                                         {
1096                                                 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1097                                                 sound(SOUND_PAIN);
1098                                                 special_effect = MA_KNEE;
1099                                         }
1100                                         else
1101                                                 msg_format(ma_ptr->desc, m_name);
1102                                 }
1103
1104                                 else if (ma_ptr->effect == MA_SLOW)
1105                                 {
1106                                         if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1107                                                 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1108                                         {
1109                                                 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1110                                                 special_effect = MA_SLOW;
1111                                         }
1112                                         else msg_format(ma_ptr->desc, m_name);
1113                                 }
1114                                 else
1115                                 {
1116                                         if (ma_ptr->effect)
1117                                         {
1118                                                 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1119                                         }
1120
1121                                         msg_format(ma_ptr->desc, m_name);
1122                                 }
1123
1124                                 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1125                                 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1126                                 {
1127                                         weight += (P_PTR_KI / 30);
1128                                         if (weight > 20) weight = 20;
1129                                 }
1130
1131                                 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
1132
1133                                 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1134                                 {
1135                                         msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1136                                         stun_effect = 7 + randint1(13);
1137                                         resist_stun /= 3;
1138                                 }
1139
1140                                 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1141                                 {
1142                                         if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1143                                                 (randint1(p_ptr->lev) > r_ptr->level) &&
1144                                                 m_ptr->mspeed > 60)
1145                                         {
1146                                                 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1147                                                 m_ptr->mspeed -= 10;
1148                                         }
1149                                 }
1150
1151                                 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1152                                 {
1153                                         if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1154                                         {
1155                                                 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1156                                                 {
1157                                                         msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1158                                                 }
1159                                                 else
1160                                                 {
1161                                                         msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1162                                                 }
1163                                         }
1164                                 }
1165                         }
1166
1167                         /* Handle normal weapon */
1168                         else if (o_ptr->k_idx)
1169                         {
1170                                 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1171                                 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
1172
1173                                 if (backstab)
1174                                 {
1175                                         k *= (3 + (p_ptr->lev / 20));
1176                                 }
1177                                 else if (fuiuchi)
1178                                 {
1179                                         k = k*(5 + (p_ptr->lev * 2 / 25)) / 2;
1180                                 }
1181                                 else if (stab_fleeing)
1182                                 {
1183                                         k = (3 * k) / 2;
1184                                 }
1185
1186                                 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1187                                         (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1188                                 {
1189                                         do_quake = TRUE;
1190                                 }
1191
1192                                 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1193                                         k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1194
1195                                 drain_result = k;
1196
1197                                 if (vorpal_cut)
1198                                 {
1199                                         int mult = 2;
1200
1201                                         if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1202                                         {
1203                                                 char chainsword_noise[1024];
1204                                                 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1205                                                 {
1206                                                         msg_print(chainsword_noise);
1207                                                 }
1208                                         }
1209
1210                                         if (o_ptr->name1 == ART_VORPAL_BLADE)
1211                                         {
1212                                                 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1213                                         }
1214                                         else
1215                                         {
1216                                                 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1217                                         }
1218
1219                                         /* Try to increase the damage */
1220                                         while (one_in_(vorpal_chance))
1221                                         {
1222                                                 mult++;
1223                                         }
1224
1225                                         k *= (HIT_POINT)mult;
1226
1227                                         /* Ouch! */
1228                                         if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1229                                         {
1230                                                 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1231                                         }
1232                                         else
1233                                         {
1234                                                 switch (mult)
1235                                                 {
1236                                                 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1237                                                 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1238                                                 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1239                                                 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1240                                                 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1241                                                 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1242                                                 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1243                                                 }
1244                                         }
1245                                         drain_result = drain_result * 3 / 2;
1246                                 }
1247
1248                                 k += o_ptr->to_d;
1249                                 drain_result += o_ptr->to_d;
1250                         }
1251
1252                         /* Apply the player damage bonuses */
1253                         k += p_ptr->to_d[hand];
1254                         drain_result += p_ptr->to_d[hand];
1255
1256                         if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1257                         if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1258                         if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
1259
1260                         /* No negative damage */
1261                         if (k < 0) k = 0;
1262
1263                         if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1264                         {
1265                                 k = 0;
1266                         }
1267
1268                         if (zantetsu_mukou)
1269                         {
1270                                 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1271                                 k = 0;
1272                         }
1273
1274                         if (e_j_mukou)
1275                         {
1276                                 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1277                                 k /= 2;
1278                         }
1279
1280                         if (mode == HISSATSU_MINEUCHI)
1281                         {
1282                                 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
1283
1284                                 k = 0;
1285                                 anger_monster(m_ptr);
1286
1287                                 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1288                                 {
1289                                         /* Get stunned */
1290                                         if (MON_STUNNED(m_ptr))
1291                                         {
1292                                                 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1293                                                 tmp /= 2;
1294                                         }
1295                                         else
1296                                         {
1297                                                 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1298                                         }
1299
1300                                         /* Apply stun */
1301                                         (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1302                                 }
1303                                 else
1304                                 {
1305                                         msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1306                                 }
1307                         }
1308
1309                         /* Modify the damage */
1310                         k = mon_damage_mod(m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((p_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
1311                         if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1312                         {
1313                                 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1314                                 {
1315                                         k = m_ptr->hp + 1;
1316                                         msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1317                                 }
1318                                 else k = 1;
1319                         }
1320                         else if ((p_ptr->pclass == CLASS_NINJA) && has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand] && ((p_ptr->cur_lite <= 0) || one_in_(7)))
1321                         {
1322                                 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1323                                 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1324                                 {
1325                                         k *= 5;
1326                                         drain_result *= 2;
1327                                         msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1328                                 }
1329                                 else if (((m_ptr->hp < maxhp / 2) && one_in_((p_ptr->num_blow[0] + p_ptr->num_blow[1] + 1) * 10)) || ((one_in_(666) || ((backstab || fuiuchi) && one_in_(11))) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)))
1330                                 {
1331                                         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1332                                         {
1333                                                 k = MAX(k * 5, m_ptr->hp / 2);
1334                                                 drain_result *= 2;
1335                                                 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1336                                         }
1337                                         else
1338                                         {
1339                                                 k = m_ptr->hp + 1;
1340                                                 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1341                                         }
1342                                 }
1343                         }
1344
1345                         msg_format_wizard(CHEAT_MONSTER,
1346                                 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1347                                 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1348
1349                         if (k <= 0) can_drain = FALSE;
1350
1351                         if (drain_result > m_ptr->hp)
1352                                 drain_result = m_ptr->hp;
1353
1354                         /* Damage, check for fear and death */
1355                         if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1356                         {
1357                                 *mdeath = TRUE;
1358                                 if ((p_ptr->pclass == CLASS_BERSERKER) && p_ptr->energy_use)
1359                                 {
1360                                         if (p_ptr->migite && p_ptr->hidarite)
1361                                         {
1362                                                 if (hand) p_ptr->energy_use = p_ptr->energy_use * 3 / 5 + p_ptr->energy_use*num * 2 / (p_ptr->num_blow[hand] * 5);
1363                                                 else p_ptr->energy_use = p_ptr->energy_use*num * 3 / (p_ptr->num_blow[hand] * 5);
1364                                         }
1365                                         else
1366                                         {
1367                                                 p_ptr->energy_use = p_ptr->energy_use*num / p_ptr->num_blow[hand];
1368                                         }
1369                                 }
1370                                 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1371                                         msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1372                                 break;
1373                         }
1374
1375                         /* Anger the monster */
1376                         if (k > 0) anger_monster(m_ptr);
1377
1378                         touch_zap_player(m_ptr);
1379
1380                         /* Are we draining it?  A little note: If the monster is
1381                         dead, the drain does not work... */
1382
1383                         if (can_drain && (drain_result > 0))
1384                         {
1385                                 if (o_ptr->name1 == ART_MURAMASA)
1386                                 {
1387                                         if (is_human)
1388                                         {
1389                                                 HIT_PROB to_h = o_ptr->to_h;
1390                                                 HIT_POINT to_d = o_ptr->to_d;
1391                                                 int i, flag;
1392
1393                                                 flag = 1;
1394                                                 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1395                                                 if (flag) to_h++;
1396
1397                                                 flag = 1;
1398                                                 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1399                                                 if (flag) to_d++;
1400
1401                                                 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1402                                                 {
1403                                                         msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1404                                                         o_ptr->to_h = to_h;
1405                                                         o_ptr->to_d = to_d;
1406                                                 }
1407                                         }
1408                                 }
1409                                 else
1410                                 {
1411                                         if (drain_result > 5) /* Did we really hurt it? */
1412                                         {
1413                                                 drain_heal = damroll(2, drain_result / 6);
1414
1415                                                 /* Hex */
1416                                                 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1417
1418                                                 if (cheat_xtra)
1419                                                 {
1420                                                         msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1421                                                 }
1422
1423                                                 if (drain_left)
1424                                                 {
1425                                                         if (drain_heal < drain_left)
1426                                                         {
1427                                                                 drain_left -= drain_heal;
1428                                                         }
1429                                                         else
1430                                                         {
1431                                                                 drain_heal = drain_left;
1432                                                                 drain_left = 0;
1433                                                         }
1434
1435                                                         if (drain_msg)
1436                                                         {
1437                                                                 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1438                                                                 drain_msg = FALSE;
1439                                                         }
1440
1441                                                         drain_heal = (drain_heal * p_ptr->mutant_regenerate_mod) / 100;
1442
1443                                                         hp_player(drain_heal);
1444                                                         /* We get to keep some of it! */
1445                                                 }
1446                                         }
1447                                 }
1448                                 m_ptr->maxhp -= (k + 7) / 8;
1449                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1450                                 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1451                                 weak = TRUE;
1452                         }
1453                         can_drain = FALSE;
1454                         drain_result = 0;
1455
1456                         /* Confusion attack */
1457                         if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1458                         {
1459                                 /* Cancel glowing hands */
1460                                 if (p_ptr->special_attack & ATTACK_CONFUSE)
1461                                 {
1462                                         p_ptr->special_attack &= ~(ATTACK_CONFUSE);
1463                                         msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1464                                         p_ptr->redraw |= (PR_STATUS);
1465
1466                                 }
1467
1468                                 /* Confuse the monster */
1469                                 if (r_ptr->flags3 & RF3_NO_CONF)
1470                                 {
1471                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1472                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1473
1474                                 }
1475                                 else if (randint0(100) < r_ptr->level)
1476                                 {
1477                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1478                                 }
1479                                 else
1480                                 {
1481                                         msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1482                                         (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
1483                                 }
1484                         }
1485
1486                         else if (chaos_effect == 4)
1487                         {
1488                                 bool resists_tele = FALSE;
1489
1490                                 if (r_ptr->flagsr & RFR_RES_TELE)
1491                                 {
1492                                         if (r_ptr->flags1 & RF1_UNIQUE)
1493                                         {
1494                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1495                                                 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1496                                                 resists_tele = TRUE;
1497                                         }
1498                                         else if (r_ptr->level > randint1(100))
1499                                         {
1500                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1501                                                 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1502                                                 resists_tele = TRUE;
1503                                         }
1504                                 }
1505
1506                                 if (!resists_tele)
1507                                 {
1508                                         msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1509                                         teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1510                                         num = num_blow + 1; /* Can't hit it anymore! */
1511                                         *mdeath = TRUE;
1512                                 }
1513                         }
1514
1515                         else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1516                         {
1517                                 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1518                                         !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1519                                 {
1520                                         if (polymorph_monster(y, x))
1521                                         {
1522                                                 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1523                                                 *fear = FALSE;
1524                                                 weak = FALSE;
1525                                         }
1526                                         else
1527                                         {
1528                                                 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1529                                         }
1530
1531                                         /* Hack -- Get new monster */
1532                                         m_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
1533
1534                                         /* Oops, we need a different name... */
1535                                         monster_desc(m_name, m_ptr, 0);
1536
1537                                         /* Hack -- Get new race */
1538                                         r_ptr = &r_info[m_ptr->r_idx];
1539                                 }
1540                         }
1541                         else if (o_ptr->name1 == ART_G_HAMMER)
1542                         {
1543                                 monster_type *target_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
1544
1545                                 if (target_ptr->hold_o_idx)
1546                                 {
1547                                         object_type *q_ptr = &current_floor_ptr->o_list[target_ptr->hold_o_idx];
1548                                         GAME_TEXT o_name[MAX_NLEN];
1549
1550                                         object_desc(o_name, q_ptr, OD_NAME_ONLY);
1551                                         q_ptr->held_m_idx = 0;
1552                                         q_ptr->marked = OM_TOUCHED;
1553                                         target_ptr->hold_o_idx = q_ptr->next_o_idx;
1554                                         q_ptr->next_o_idx = 0;
1555                                         msg_format(_("%sを奪った。", "You snatched %s."), o_name);
1556                                         inven_carry(q_ptr);
1557                                 }
1558                         }
1559                 }
1560
1561                 /* Player misses */
1562                 else
1563                 {
1564                         backstab = FALSE; /* Clumsy! */
1565                         fuiuchi = FALSE; /* Clumsy! */
1566
1567                         if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
1568                         {
1569                                 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
1570
1571                                 sound(SOUND_HIT);
1572
1573                                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1574                                 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
1575                                 object_flags(o_ptr, flgs_aux);
1576
1577                                 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1578                                 {
1579                                         int mult;
1580                                         switch (p_ptr->mimic_form)
1581                                         {
1582                                         case MIMIC_NONE:
1583                                                 switch (p_ptr->prace)
1584                                                 {
1585                                                 case RACE_YEEK:
1586                                                 case RACE_KLACKON:
1587                                                 case RACE_HUMAN:
1588                                                 case RACE_AMBERITE:
1589                                                 case RACE_DUNADAN:
1590                                                 case RACE_BARBARIAN:
1591                                                 case RACE_BEASTMAN:
1592                                                         mult = 25; break;
1593                                                 case RACE_HALF_ORC:
1594                                                 case RACE_HALF_TROLL:
1595                                                 case RACE_HALF_OGRE:
1596                                                 case RACE_HALF_GIANT:
1597                                                 case RACE_HALF_TITAN:
1598                                                 case RACE_CYCLOPS:
1599                                                 case RACE_IMP:
1600                                                 case RACE_SKELETON:
1601                                                 case RACE_ZOMBIE:
1602                                                 case RACE_VAMPIRE:
1603                                                 case RACE_SPECTRE:
1604                                                 case RACE_DEMON:
1605                                                 case RACE_DRACONIAN:
1606                                                         mult = 30; break;
1607                                                 default:
1608                                                         mult = 10; break;
1609                                                 }
1610                                                 break;
1611                                         case MIMIC_DEMON:
1612                                         case MIMIC_DEMON_LORD:
1613                                         case MIMIC_VAMPIRE:
1614                                                 mult = 30; break;
1615                                         default:
1616                                                 mult = 10; break;
1617                                         }
1618
1619                                         if (p_ptr->align < 0 && mult < 20)
1620                                                 mult = 20;
1621                                         if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
1622                                                 mult = 25;
1623                                         if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
1624                                                 mult = 25;
1625                                         if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
1626                                                 mult = 25;
1627                                         if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
1628                                                 mult = 25;
1629                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
1630                                                 mult = 25;
1631
1632                                         if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (p_ptr->csp >(p_ptr->msp / 30)))
1633                                         {
1634                                                 p_ptr->csp -= (1 + (p_ptr->msp / 30));
1635                                                 p_ptr->redraw |= (PR_MANA);
1636                                                 mult = mult * 3 / 2 + 20;
1637                                         }
1638                                         k *= (HIT_POINT)mult;
1639                                         k /= 10;
1640                                 }
1641
1642                                 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1643                                 if (one_in_(6))
1644                                 {
1645                                         int mult = 2;
1646                                         msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
1647                                         /* Try to increase the damage */
1648                                         while (one_in_(4))
1649                                         {
1650                                                 mult++;
1651                                         }
1652
1653                                         k *= (HIT_POINT)mult;
1654                                 }
1655                                 k += (p_ptr->to_d[hand] + o_ptr->to_d);
1656                                 if (k < 0) k = 0;
1657
1658                                 take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
1659                                 handle_stuff();
1660                         }
1661                         else
1662                         {
1663                                 sound(SOUND_MISS);
1664                                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1665                         }
1666                 }
1667                 backstab = FALSE;
1668                 fuiuchi = FALSE;
1669         }
1670
1671
1672         if (weak && !(*mdeath))
1673         {
1674                 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
1675         }
1676         if (drain_left != MAX_VAMPIRIC_DRAIN)
1677         {
1678                 if (one_in_(4))
1679                 {
1680                         chg_virtue(V_UNLIFE, 1);
1681                 }
1682         }
1683         /* Mega-Hack -- apply earthquake brand */
1684         if (do_quake)
1685         {
1686                 earthquake(p_ptr->y, p_ptr->x, 10);
1687                 if (!current_floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
1688         }
1689 }
1690
1691 /*!
1692 * @brief プレイヤーの打撃処理メインルーチン
1693 * @param y 攻撃目標のY座標
1694 * @param x 攻撃目標のX座標
1695 * @param mode 発動中の剣術ID
1696 * @return 実際に攻撃処理が行われた場合TRUEを返す。
1697 * @details
1698 * If no "weapon" is available, then "punch" the monster one time.
1699 */
1700 bool py_attack(POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
1701 {
1702         bool            fear = FALSE;
1703         bool            mdeath = FALSE;
1704         bool            stormbringer = FALSE;
1705
1706         grid_type       *g_ptr = &current_floor_ptr->grid_array[y][x];
1707         monster_type    *m_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
1708         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
1709         GAME_TEXT m_name[MAX_NLEN];
1710
1711         disturb(FALSE, TRUE);
1712
1713         take_turn(p_ptr, 100);
1714
1715         if (!p_ptr->migite && !p_ptr->hidarite &&
1716                 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
1717         {
1718                 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
1719                         (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
1720                 return FALSE;
1721         }
1722
1723         /* Extract monster name (or "it") */
1724         monster_desc(m_name, m_ptr, 0);
1725
1726         if (m_ptr->ml)
1727         {
1728                 /* Auto-Recall if possible and visible */
1729                 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
1730
1731                 /* Track a new monster */
1732                 health_track(g_ptr->m_idx);
1733         }
1734
1735         if ((r_ptr->flags1 & RF1_FEMALE) &&
1736                 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
1737         {
1738                 if ((inventory[INVEN_RARM].name1 == ART_ZANTETSU) || (inventory[INVEN_LARM].name1 == ART_ZANTETSU))
1739                 {
1740                         msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
1741                         return FALSE;
1742                 }
1743         }
1744
1745         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
1746         {
1747                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
1748                 return FALSE;
1749         }
1750
1751         /* Stop if friendly */
1752         if (!is_hostile(m_ptr) &&
1753                 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
1754                         p_ptr->shero || !m_ptr->ml))
1755         {
1756                 if (inventory[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
1757                 if (inventory[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
1758                 if (stormbringer)
1759                 {
1760                         msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
1761                         chg_virtue(V_INDIVIDUALISM, 1);
1762                         chg_virtue(V_HONOUR, -1);
1763                         chg_virtue(V_JUSTICE, -1);
1764                         chg_virtue(V_COMPASSION, -1);
1765                 }
1766                 else if (p_ptr->pclass != CLASS_BERSERKER)
1767                 {
1768                         if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
1769                         {
1770                                 chg_virtue(V_INDIVIDUALISM, 1);
1771                                 chg_virtue(V_HONOUR, -1);
1772                                 chg_virtue(V_JUSTICE, -1);
1773                                 chg_virtue(V_COMPASSION, -1);
1774                         }
1775                         else
1776                         {
1777                                 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
1778                                 return FALSE;
1779                         }
1780                 }
1781         }
1782
1783
1784         /* Handle player fear */
1785         if (p_ptr->afraid)
1786         {
1787                 if (m_ptr->ml)
1788                         msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
1789                 else
1790                         msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
1791
1792                 /* Disturb the monster */
1793                 (void)set_monster_csleep(g_ptr->m_idx, 0);
1794
1795                 return FALSE;
1796         }
1797
1798         if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
1799         {
1800                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
1801                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
1802         }
1803
1804         if (p_ptr->migite && p_ptr->hidarite)
1805         {
1806                 if ((p_ptr->skill_exp[GINOU_NITOURYU] < s_info[p_ptr->pclass].s_max[GINOU_NITOURYU]) && ((p_ptr->skill_exp[GINOU_NITOURYU] - 1000) / 200 < r_ptr->level))
1807                 {
1808                         if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
1809                                 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
1810                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
1811                                 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
1812                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
1813                                 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
1814                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
1815                                 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
1816                         p_ptr->update |= (PU_BONUS);
1817                 }
1818         }
1819
1820         /* Gain riding experience */
1821         if (p_ptr->riding)
1822         {
1823                 int cur = p_ptr->skill_exp[GINOU_RIDING];
1824                 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
1825
1826                 if (cur < max)
1827                 {
1828                         DEPTH ridinglevel = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level;
1829                         DEPTH targetlevel = r_ptr->level;
1830                         int inc = 0;
1831
1832                         if ((cur / 200 - 5) < targetlevel)
1833                                 inc += 1;
1834
1835                         /* Extra experience */
1836                         if ((cur / 100) < ridinglevel)
1837                         {
1838                                 if ((cur / 100 + 15) < ridinglevel)
1839                                         inc += 1 + (ridinglevel - (cur / 100 + 15));
1840                                 else
1841                                         inc += 1;
1842                         }
1843
1844                         p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
1845                         p_ptr->update |= (PU_BONUS);
1846                 }
1847         }
1848
1849         riding_t_m_idx = g_ptr->m_idx;
1850         if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
1851         if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
1852
1853         /* Mutations which yield extra 'natural' attacks */
1854         if (!mdeath)
1855         {
1856                 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
1857                         natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
1858                 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
1859                         natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
1860                 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
1861                         natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
1862                 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
1863                         natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
1864                 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
1865                         natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
1866         }
1867
1868         /* Hack -- delay fear messages */
1869         if (fear && m_ptr->ml && !mdeath)
1870         {
1871                 sound(SOUND_FLEE);
1872
1873                 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
1874         }
1875
1876         if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
1877         {
1878                 set_action(ACTION_NONE);
1879         }
1880
1881         return mdeath;
1882 }
1883
1884 /*!
1885  * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
1886  * @param m_idx 打撃を行うモンスターのID
1887  * @return 実際に攻撃処理を行った場合TRUEを返す
1888  */
1889 bool make_attack_normal(MONSTER_IDX m_idx)
1890 {
1891         monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
1892         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1893
1894         int ap_cnt;
1895
1896         INVENTORY_IDX i;
1897         int k, tmp;
1898         ARMOUR_CLASS ac;
1899         DEPTH rlev;
1900         int do_cut, do_stun;
1901
1902         PRICE gold;
1903         object_type *o_ptr;
1904         GAME_TEXT o_name[MAX_NLEN];
1905         GAME_TEXT m_name[MAX_NLEN];
1906         GAME_TEXT ddesc[80];
1907
1908         bool blinked;
1909         bool touched = FALSE, fear = FALSE, alive = TRUE;
1910         bool explode = FALSE;
1911         bool do_silly_attack = (one_in_(2) && p_ptr->image);
1912         HIT_POINT get_damage = 0;
1913         int abbreviate = 0;     // 2回目以降の省略表現フラグ
1914
1915         /* Not allowed to attack */
1916         if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
1917
1918         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
1919
1920         /* ...nor if friendly */
1921         if (!is_hostile(m_ptr)) return FALSE;
1922
1923         /* Extract the effective monster level */
1924         rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
1925
1926         /* Get the monster name (or "it") */
1927         monster_desc(m_name, m_ptr, 0);
1928
1929         monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
1930
1931         if (p_ptr->special_defense & KATA_IAI)
1932         {
1933                 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
1934                 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
1935         }
1936
1937         if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
1938         {
1939                 if (kawarimi(TRUE)) return TRUE;
1940         }
1941
1942         /* Assume no blink */
1943         blinked = FALSE;
1944
1945         /* Scan through all four blows */
1946         for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
1947         {
1948                 bool obvious = FALSE;
1949
1950                 HIT_POINT power = 0;
1951                 HIT_POINT damage = 0;
1952
1953                 concptr act = NULL;
1954
1955                 /* Extract the attack infomation */
1956                 int effect = r_ptr->blow[ap_cnt].effect;
1957                 int method = r_ptr->blow[ap_cnt].method;
1958                 int d_dice = r_ptr->blow[ap_cnt].d_dice;
1959                 int d_side = r_ptr->blow[ap_cnt].d_side;
1960
1961                 if (!monster_is_valid(m_ptr)) break;
1962
1963                 /* Hack -- no more attacks */
1964                 if (!method) break;
1965
1966                 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
1967                 {
1968                         method = RBM_HIT;
1969                         d_dice /= 10;
1970                 }
1971
1972                 /* Stop if player is dead or gone */
1973                 if (!p_ptr->playing || p_ptr->is_dead) break;
1974                 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
1975
1976                 /* Handle "leaving" */
1977                 if (p_ptr->leaving) break;
1978
1979                 if (method == RBM_SHOOT) continue;
1980
1981                 /* Extract the attack "power" */
1982                 power = mbe_info[effect].power;
1983
1984                 /* Total armor */
1985                 ac = p_ptr->ac + p_ptr->to_a;
1986
1987                 /* Monster hits player */
1988                 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
1989                 {
1990                         /* Always disturbing */
1991                         disturb(TRUE, TRUE);
1992
1993
1994                         /* Hack -- Apply "protection from evil" */
1995                         if ((p_ptr->protevil > 0) &&
1996                             (r_ptr->flags3 & RF3_EVIL) &&
1997                             (p_ptr->lev >= rlev) &&
1998                             ((randint0(100) + p_ptr->lev) > 50))
1999                         {
2000                                 /* Remember the Evil-ness */
2001                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2002
2003 #ifdef JP
2004                                 if (abbreviate) msg_format("撃退した。");
2005                                 else msg_format("%^sは撃退された。", m_name);
2006                                 abbreviate = 1; /*2回目以降は省略 */
2007 #else
2008                                 msg_format("%^s is repelled.", m_name);
2009 #endif
2010
2011
2012                                 /* Hack -- Next attack */
2013                                 continue;
2014                         }
2015
2016
2017                         /* Assume no cut or stun */
2018                         do_cut = do_stun = 0;
2019
2020                         /* Describe the attack method */
2021                         switch (method)
2022                         {
2023                                 case RBM_HIT:
2024                                 {
2025                                         act = _("殴られた。", "hits you.");
2026                                         do_cut = do_stun = 1;
2027                                         touched = TRUE;
2028                                         sound(SOUND_HIT);
2029                                         break;
2030                                 }
2031
2032                                 case RBM_TOUCH:
2033                                 {
2034                                         act = _("触られた。", "touches you.");
2035                                         touched = TRUE;
2036                                         sound(SOUND_TOUCH);
2037                                         break;
2038                                 }
2039
2040                                 case RBM_PUNCH:
2041                                 {
2042                                         act = _("パンチされた。", "punches you.");
2043                                         touched = TRUE;
2044                                         do_stun = 1;
2045                                         sound(SOUND_HIT);
2046                                         break;
2047                                 }
2048
2049                                 case RBM_KICK:
2050                                 {
2051                                         act = _("蹴られた。", "kicks you.");
2052                                         touched = TRUE;
2053                                         do_stun = 1;
2054                                         sound(SOUND_HIT);
2055                                         break;
2056                                 }
2057
2058                                 case RBM_CLAW:
2059                                 {
2060                                         act = _("ひっかかれた。", "claws you.");
2061                                         touched = TRUE;
2062                                         do_cut = 1;
2063                                         sound(SOUND_CLAW);
2064                                         break;
2065                                 }
2066
2067                                 case RBM_BITE:
2068                                 {
2069                                         act = _("噛まれた。", "bites you.");
2070                                         do_cut = 1;
2071                                         touched = TRUE;
2072                                         sound(SOUND_BITE);
2073                                         break;
2074                                 }
2075
2076                                 case RBM_STING:
2077                                 {
2078                                         act = _("刺された。", "stings you.");
2079                                         touched = TRUE;
2080                                         sound(SOUND_STING);
2081                                         break;
2082                                 }
2083
2084                                 case RBM_SLASH:
2085                                 {
2086                                         act = _("斬られた。", "slashes you.");
2087                                         touched = TRUE;
2088                                         do_cut = 1;
2089                                         sound(SOUND_CLAW);
2090                                         break;
2091                                 }
2092
2093                                 case RBM_BUTT:
2094                                 {
2095                                         act = _("角で突かれた。", "butts you.");
2096                                         do_stun = 1;
2097                                         touched = TRUE;
2098                                         sound(SOUND_HIT);
2099                                         break;
2100                                 }
2101
2102                                 case RBM_CRUSH:
2103                                 {
2104                                         act = _("体当たりされた。", "crushes you.");
2105                                         do_stun = 1;
2106                                         touched = TRUE;
2107                                         sound(SOUND_CRUSH);
2108                                         break;
2109                                 }
2110
2111                                 case RBM_ENGULF:
2112                                 {
2113                                         act = _("飲み込まれた。", "engulfs you.");
2114                                         touched = TRUE;
2115                                         sound(SOUND_CRUSH);
2116                                         break;
2117                                 }
2118
2119                                 case RBM_CHARGE:
2120                                 {
2121                                         abbreviate = -1;
2122                                         act = _("は請求書をよこした。", "charges you.");
2123                                         touched = TRUE;
2124                                         sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2125                                         break;
2126                                 }
2127
2128                                 case RBM_CRAWL:
2129                                 {
2130                                         abbreviate = -1;
2131                                         act = _("が体の上を這い回った。", "crawls on you.");
2132                                         touched = TRUE;
2133                                         sound(SOUND_SLIME);
2134                                         break;
2135                                 }
2136
2137                                 case RBM_DROOL:
2138                                 {
2139                                         act = _("よだれをたらされた。", "drools on you.");
2140                                         sound(SOUND_SLIME);
2141                                         break;
2142                                 }
2143
2144                                 case RBM_SPIT:
2145                                 {
2146                                         act = _("唾を吐かれた。", "spits on you.");
2147                                         sound(SOUND_SLIME);
2148                                         break;
2149                                 }
2150
2151                                 case RBM_EXPLODE:
2152                                 {
2153                                         abbreviate = -1;
2154                                         act = _("は爆発した。", "explodes.");
2155                                         explode = TRUE;
2156                                         break;
2157                                 }
2158
2159                                 case RBM_GAZE:
2160                                 {
2161                                         act = _("にらまれた。", "gazes at you.");
2162                                         break;
2163                                 }
2164
2165                                 case RBM_WAIL:
2166                                 {
2167                                         act = _("泣き叫ばれた。", "wails at you.");
2168                                         sound(SOUND_WAIL);
2169                                         break;
2170                                 }
2171
2172                                 case RBM_SPORE:
2173                                 {
2174                                         act = _("胞子を飛ばされた。", "releases spores at you.");
2175                                         sound(SOUND_SLIME);
2176                                         break;
2177                                 }
2178
2179                                 case RBM_XXX4:
2180                                 {
2181                                         abbreviate = -1;
2182                                         act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2183                                         break;
2184                                 }
2185
2186                                 case RBM_BEG:
2187                                 {
2188                                         act = _("金をせがまれた。", "begs you for money.");
2189                                         sound(SOUND_MOAN);
2190                                         break;
2191                                 }
2192
2193                                 case RBM_INSULT:
2194                                 {
2195 #ifdef JP
2196                                         abbreviate = -1;
2197 #endif
2198                                         act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2199                                         sound(SOUND_MOAN);
2200                                         break;
2201                                 }
2202
2203                                 case RBM_MOAN:
2204                                 {
2205 #ifdef JP
2206                                         abbreviate = -1;
2207 #endif
2208                                         act = desc_moan[randint0(4)];
2209                                         sound(SOUND_MOAN);
2210                                         break;
2211                                 }
2212
2213                                 case RBM_SHOW:
2214                                 {
2215 #ifdef JP
2216                                         abbreviate = -1;
2217 #endif
2218                                         if (m_ptr->r_idx == MON_JAIAN)
2219                                         {
2220 #ifdef JP
2221                                                 switch(randint1(15))
2222                                                 {
2223                                                   case 1:
2224                                                   case 6:
2225                                                   case 11:
2226                                                         act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2227                                                         break;
2228                                                   case 2:
2229                                                         act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2230                                                         break;
2231                                                   case 3:
2232                                                         act = "「♪の~び太スネ夫はメじゃないよ~~」";
2233                                                         break;
2234                                                   case 4:
2235                                                         act = "「♪け~んかスポ~ツ~どんとこい~」";
2236                                                         break;
2237                                                   case 5:
2238                                                         act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2239                                                         break;
2240                                                   case 7:
2241                                                         act = "「♪ま~ちいちば~んのに~んきもの~~」";
2242                                                         break;
2243                                                   case 8:
2244                                                         act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2245                                                         break;
2246                                                   case 9:
2247                                                         act = "「♪きはやさし~くて~ち~からもち~」";
2248                                                         break;
2249                                                   case 10:
2250                                                         act = "「♪かお~も~~スタイルも~バツグンさ~」";
2251                                                         break;
2252                                                   case 12:
2253                                                         act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2254                                                         break;
2255                                                   case 13:
2256                                                         act = "「♪ド~ラもドラミもメじゃないよ~~」";
2257                                                         break;
2258                                                   case 14:
2259                                                         act = "「♪よじげんぽけっと~な~くたって~」";
2260                                                         break;
2261                                                   case 15:
2262                                                         act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2263                                                         break;
2264                                                 }
2265 #else
2266                                                 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2267 #endif
2268                                         }
2269                                         else
2270                                         {
2271                                                 if (one_in_(3))
2272                                                         act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2273                                                 else
2274                                                         act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2275                                         }
2276
2277                                         sound(SOUND_SHOW);
2278                                         break;
2279                                 }
2280                         }
2281
2282                         if (act)
2283                         {
2284                                 if (do_silly_attack)
2285                                 {
2286 #ifdef JP
2287                                         abbreviate = -1;
2288 #endif
2289                                         act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2290                                 }
2291 #ifdef JP
2292                                 if (abbreviate == 0)
2293                                         msg_format("%^sに%s", m_name, act);
2294                                 else if (abbreviate == 1)
2295                                         msg_format("%s", act);
2296                                 else /* if (abbreviate == -1) */
2297                                         msg_format("%^s%s", m_name, act);
2298                                 abbreviate = 1;/*2回目以降は省略 */
2299 #else
2300                                 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2301 #endif
2302                         }
2303
2304                         /* Hack -- assume all attacks are obvious */
2305                         obvious = TRUE;
2306
2307                         /* Roll out the damage */
2308                         damage = damroll(d_dice, d_side);
2309
2310                         /*
2311                          * Skip the effect when exploding, since the explosion
2312                          * already causes the effect.
2313                          */
2314                         if(explode) damage = 0;
2315                         /* Apply appropriate damage */
2316                         switch (effect)
2317                         {
2318                                 case 0:
2319                                 {
2320                                         obvious = TRUE;
2321                                         damage = 0;
2322                                         break;
2323                                 }
2324
2325                                 case RBE_SUPERHURT:     /* AC軽減あり / Player armor reduces total damage */
2326                                 {
2327                                         if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
2328                                         {
2329                                                 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2330                                                 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2331                                                 tmp_damage = MAX(damage, tmp_damage*2);
2332
2333                                                 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2334                                                 break;
2335                                         }
2336                                 }
2337                                 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2338                                 {
2339                                         obvious = TRUE;
2340                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2341                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2342                                         break;
2343                                 }
2344
2345                                 case RBE_POISON:
2346                                 {
2347                                         if (explode) break;
2348
2349                                         /* Take "poison" effect */
2350                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
2351                                         {
2352                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2353                                                 {
2354                                                         obvious = TRUE;
2355                                                 }
2356                                         }
2357
2358                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2359
2360                                         /* Learn about the player */
2361                                         update_smart_learn(m_idx, DRS_POIS);
2362
2363                                         break;
2364                                 }
2365
2366                                 case RBE_UN_BONUS:
2367                                 {
2368                                         if (explode) break;
2369
2370                                         /* Allow complete resist */
2371                                         if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2372                                         {
2373                                                 /* Apply disenchantment */
2374                                                 if (apply_disenchant(0))
2375                                                 {
2376                                                         /* Hack -- Update AC */
2377                                                         update_creature(p_ptr);
2378                                                         obvious = TRUE;
2379                                                 }
2380                                         }
2381
2382                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2383
2384                                         /* Learn about the player */
2385                                         update_smart_learn(m_idx, DRS_DISEN);
2386
2387                                         break;
2388                                 }
2389
2390                                 case RBE_UN_POWER:
2391                                 {
2392                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2393
2394                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2395
2396                                         /* Find an item */
2397                                         for (k = 0; k < 10; k++)
2398                                         {
2399                                                 /* Pick an item */
2400                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2401
2402                                                 /* Obtain the item */
2403                                                 o_ptr = &inventory[i];
2404
2405                                                 /* Skip non-objects */
2406                                                 if (!o_ptr->k_idx) continue;
2407
2408                                                 /* Drain charged wands/staffs */
2409                                                 if (((o_ptr->tval == TV_STAFF) ||
2410                                                      (o_ptr->tval == TV_WAND)) &&
2411                                                     (o_ptr->pval))
2412                                                 {
2413                                                         /* Calculate healed hitpoints */
2414                                                         int heal=rlev * o_ptr->pval;
2415                                                         if( o_ptr->tval == TV_STAFF)
2416                                                             heal *=  o_ptr->number;
2417
2418                                                         /* Don't heal more than max hp */
2419                                                         heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2420
2421                                                         msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2422
2423                                                         obvious = TRUE;
2424
2425                                                         /* Heal the monster */
2426                                                         m_ptr->hp += (HIT_POINT)heal;
2427
2428                                                         /* Redraw (later) if needed */
2429                                                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2430                                                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2431
2432                                                         /* Uncharge */
2433                                                         o_ptr->pval = 0;
2434
2435                                                         /* Combine / Reorder the pack */
2436                                                         p_ptr->update |= (PU_COMBINE | PU_REORDER);
2437                                                         p_ptr->window |= (PW_INVEN);
2438
2439                                                         break;
2440                                                 }
2441                                         }
2442
2443                                         break;
2444                                 }
2445
2446                                 case RBE_EAT_GOLD:
2447                                 {
2448                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2449
2450                                         /* Confused monsters cannot steal successfully. -LM-*/
2451                                         if (MON_CONFUSED(m_ptr)) break;
2452
2453                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2454
2455                                         obvious = TRUE;
2456
2457                                         /* Saving throw (unless paralyzed) based on dex and level */
2458                                         if (!p_ptr->paralyzed &&
2459                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2460                                                               p_ptr->lev)))
2461                                         {
2462                                                 /* Saving throw message */
2463                                                 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2464
2465                                                 /* Occasional blink anyway */
2466                                                 if (randint0(3)) blinked = TRUE;
2467                                         }
2468
2469                                         /* Eat gold */
2470                                         else
2471                                         {
2472                                                 gold = (p_ptr->au / 10) + randint1(25);
2473                                                 if (gold < 2) gold = 2;
2474                                                 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2475                                                 if (gold > p_ptr->au) gold = p_ptr->au;
2476                                                 p_ptr->au -= gold;
2477                                                 if (gold <= 0)
2478                                                 {
2479                                                         msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2480                                                 }
2481                                                 else if (p_ptr->au)
2482                                                 {
2483                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2484                                                         msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2485                                                         chg_virtue(V_SACRIFICE, 1);
2486                                                 }
2487                                                 else
2488                                                 {
2489                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2490                                                         msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2491                                                         chg_virtue(V_SACRIFICE, 2);
2492                                                 }
2493
2494                                                 /* Redraw gold */
2495                                                 p_ptr->redraw |= (PR_GOLD);
2496
2497                                                 p_ptr->window |= (PW_PLAYER);
2498
2499                                                 /* Blink away */
2500                                                 blinked = TRUE;
2501                                         }
2502
2503                                         break;
2504                                 }
2505
2506                                 case RBE_EAT_ITEM:
2507                                 {
2508                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2509
2510                                         /* Confused monsters cannot steal successfully. -LM-*/
2511                                         if (MON_CONFUSED(m_ptr)) break;
2512
2513                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2514
2515                                         /* Saving throw (unless paralyzed) based on dex and level */
2516                                         if (!p_ptr->paralyzed &&
2517                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2518                                                               p_ptr->lev)))
2519                                         {
2520                                                 /* Saving throw message */
2521                                                 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2522
2523                                                 /* Occasional "blink" anyway */
2524                                                 blinked = TRUE;
2525                                                 obvious = TRUE;
2526                                                 break;
2527                                         }
2528
2529                                         /* Find an item */
2530                                         for (k = 0; k < 10; k++)
2531                                         {
2532                                                 OBJECT_IDX o_idx;
2533
2534                                                 /* Pick an item */
2535                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2536
2537                                                 /* Obtain the item */
2538                                                 o_ptr = &inventory[i];
2539
2540                                                 /* Skip non-objects */
2541                                                 if (!o_ptr->k_idx) continue;
2542
2543                                                 /* Skip artifacts */
2544                                                 if (object_is_artifact(o_ptr)) continue;
2545
2546                                                 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
2547
2548 #ifdef JP
2549                                                 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
2550 #else
2551                                                 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
2552 #endif
2553
2554                                                 chg_virtue(V_SACRIFICE, 1);
2555
2556
2557                                                 /* Make an object */
2558                                                 o_idx = o_pop();
2559
2560                                                 /* Success */
2561                                                 if (o_idx)
2562                                                 {
2563                                                         object_type *j_ptr;
2564                                                         j_ptr = &current_floor_ptr->o_list[o_idx];
2565                                                         object_copy(j_ptr, o_ptr);
2566
2567                                                         /* Modify number */
2568                                                         j_ptr->number = 1;
2569
2570                                                         /* Hack -- If a rod or wand, allocate total
2571                                                          * maximum timeouts or charges between those
2572                                                          * stolen and those missed. -LM-
2573                                                          */
2574                                                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
2575                                                         {
2576                                                                 j_ptr->pval = o_ptr->pval / o_ptr->number;
2577                                                                 o_ptr->pval -= j_ptr->pval;
2578                                                         }
2579
2580                                                         /* Forget mark */
2581                                                         j_ptr->marked = OM_TOUCHED;
2582
2583                                                         /* Memorize monster */
2584                                                         j_ptr->held_m_idx = m_idx;
2585
2586                                                         /* Build stack */
2587                                                         j_ptr->next_o_idx = m_ptr->hold_o_idx;
2588
2589                                                         /* Build stack */
2590                                                         m_ptr->hold_o_idx = o_idx;
2591                                                 }
2592
2593                                                 /* Steal the items */
2594                                                 inven_item_increase(i, -1);
2595                                                 inven_item_optimize(i);
2596
2597                                                 obvious = TRUE;
2598
2599                                                 /* Blink away */
2600                                                 blinked = TRUE;
2601
2602                                                 break;
2603                                         }
2604
2605                                         break;
2606                                 }
2607
2608                                 case RBE_EAT_FOOD:
2609                                 {
2610                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2611
2612                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2613
2614                                         /* Steal some food */
2615                                         for (k = 0; k < 10; k++)
2616                                         {
2617                                                 /* Pick an item from the pack */
2618                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2619
2620                                                 o_ptr = &inventory[i];
2621
2622                                                 /* Skip non-objects */
2623                                                 if (!o_ptr->k_idx) continue;
2624
2625                                                 /* Skip non-food objects */
2626                                                 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
2627
2628                                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2629
2630 #ifdef JP
2631                                                 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
2632 #else
2633                                                 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
2634 #endif
2635
2636                                                 /* Steal the items */
2637                                                 inven_item_increase(i, -1);
2638                                                 inven_item_optimize(i);
2639
2640                                                 obvious = TRUE;
2641
2642                                                 break;
2643                                         }
2644
2645                                         break;
2646                                 }
2647
2648                                 case RBE_EAT_LITE:
2649                                 {
2650                                         /* Access the lite */
2651                                         o_ptr = &inventory[INVEN_LITE];
2652                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2653
2654                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2655
2656                                         /* Drain fuel */
2657                                         if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
2658                                         {
2659                                                 /* Reduce fuel */
2660                                                 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
2661                                                 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
2662
2663                                                 if (!p_ptr->blind)
2664                                                 {
2665                                                         msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
2666                                                         obvious = TRUE;
2667                                                 }
2668
2669                                                 p_ptr->window |= (PW_EQUIP);
2670                                         }
2671
2672                                         break;
2673                                 }
2674
2675                                 case RBE_ACID:
2676                                 {
2677                                         if (explode) break;
2678                                         obvious = TRUE;
2679                                         msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
2680                                         get_damage += acid_dam(damage, ddesc, -1, FALSE);
2681                                         update_creature(p_ptr);
2682                                         update_smart_learn(m_idx, DRS_ACID);
2683                                         break;
2684                                 }
2685
2686                                 case RBE_ELEC:
2687                                 {
2688                                         if (explode) break;
2689                                         obvious = TRUE;
2690                                         msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
2691                                         get_damage += elec_dam(damage, ddesc, -1, FALSE);
2692                                         update_smart_learn(m_idx, DRS_ELEC);
2693                                         break;
2694                                 }
2695
2696                                 case RBE_FIRE:
2697                                 {
2698                                         if (explode) break;
2699                                         obvious = TRUE;
2700                                         msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
2701                                         get_damage += fire_dam(damage, ddesc, -1, FALSE);
2702                                         update_smart_learn(m_idx, DRS_FIRE);
2703                                         break;
2704                                 }
2705
2706                                 case RBE_COLD:
2707                                 {
2708                                         if (explode) break;
2709                                         obvious = TRUE;
2710                                         msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
2711                                         get_damage += cold_dam(damage, ddesc, -1, FALSE);
2712                                         update_smart_learn(m_idx, DRS_COLD);
2713                                         break;
2714                                 }
2715
2716                                 case RBE_BLIND:
2717                                 {
2718                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2719                                         if (p_ptr->is_dead) break;
2720
2721                                         /* Increase "blind" */
2722                                         if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
2723                                         {
2724                                                 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
2725                                                 {
2726 #ifdef JP
2727                                                         if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
2728 #else
2729                                                         /* nanka */
2730 #endif
2731                                                         obvious = TRUE;
2732                                                 }
2733                                         }
2734
2735                                         /* Learn about the player */
2736                                         update_smart_learn(m_idx, DRS_BLIND);
2737
2738                                         break;
2739                                 }
2740
2741                                 case RBE_CONFUSE:
2742                                 {
2743                                         if (explode) break;
2744                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2745
2746                                         if (p_ptr->is_dead) break;
2747
2748                                         /* Increase "confused" */
2749                                         if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
2750                                         {
2751                                                 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
2752                                                 {
2753                                                         obvious = TRUE;
2754                                                 }
2755                                         }
2756
2757                                         /* Learn about the player */
2758                                         update_smart_learn(m_idx, DRS_CONF);
2759
2760                                         break;
2761                                 }
2762
2763                                 case RBE_TERRIFY:
2764                                 {
2765                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2766
2767                                         if (p_ptr->is_dead) break;
2768
2769                                         /* Increase "afraid" */
2770                                         if (CHECK_MULTISHADOW())
2771                                         {
2772                                                 /* Do nothing */
2773                                         }
2774                                         else if (p_ptr->resist_fear)
2775                                         {
2776                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
2777                                                 obvious = TRUE;
2778                                         }
2779                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
2780                                         {
2781                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
2782                                                 obvious = TRUE;
2783                                         }
2784                                         else
2785                                         {
2786                                                 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
2787                                                 {
2788                                                         obvious = TRUE;
2789                                                 }
2790                                         }
2791
2792                                         /* Learn about the player */
2793                                         update_smart_learn(m_idx, DRS_FEAR);
2794
2795                                         break;
2796                                 }
2797
2798                                 case RBE_PARALYZE:
2799                                 {
2800                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2801
2802                                         if (p_ptr->is_dead) break;
2803
2804                                         /* Increase "paralyzed" */
2805                                         if (CHECK_MULTISHADOW())
2806                                         {
2807                                                 /* Do nothing */
2808                                         }
2809                                         else if (p_ptr->free_act)
2810                                         {
2811                                                 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
2812                                                 obvious = TRUE;
2813                                         }
2814                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
2815                                         {
2816                                                 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
2817                                                 obvious = TRUE;
2818                                         }
2819                                         else
2820                                         {
2821                                                 if (!p_ptr->paralyzed)
2822                                                 {
2823                                                         if (set_paralyzed(3 + randint1(rlev)))
2824                                                         {
2825                                                                 obvious = TRUE;
2826                                                         }
2827                                                 }
2828                                         }
2829
2830                                         /* Learn about the player */
2831                                         update_smart_learn(m_idx, DRS_FREE);
2832
2833                                         break;
2834                                 }
2835
2836                                 case RBE_LOSE_STR:
2837                                 {
2838                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2839
2840                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2841                                         if (do_dec_stat(A_STR)) obvious = TRUE;
2842
2843                                         break;
2844                                 }
2845
2846                                 case RBE_LOSE_INT:
2847                                 {
2848                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2849
2850                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2851                                         if (do_dec_stat(A_INT)) obvious = TRUE;
2852
2853                                         break;
2854                                 }
2855
2856                                 case RBE_LOSE_WIS:
2857                                 {
2858                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2859
2860                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2861                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
2862
2863                                         break;
2864                                 }
2865
2866                                 case RBE_LOSE_DEX:
2867                                 {
2868                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2869
2870                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2871                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
2872
2873                                         break;
2874                                 }
2875
2876                                 case RBE_LOSE_CON:
2877                                 {
2878                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2879
2880                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2881                                         if (do_dec_stat(A_CON)) obvious = TRUE;
2882
2883                                         break;
2884                                 }
2885
2886                                 case RBE_LOSE_CHR:
2887                                 {
2888                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2889
2890                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2891                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
2892
2893                                         break;
2894                                 }
2895
2896                                 case RBE_LOSE_ALL:
2897                                 {
2898                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2899
2900                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2901
2902                                         /* Damage (stats) */
2903                                         if (do_dec_stat(A_STR)) obvious = TRUE;
2904                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
2905                                         if (do_dec_stat(A_CON)) obvious = TRUE;
2906                                         if (do_dec_stat(A_INT)) obvious = TRUE;
2907                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
2908                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
2909
2910                                         break;
2911                                 }
2912
2913                                 case RBE_SHATTER:
2914                                 {
2915                                         obvious = TRUE;
2916
2917                                         /* Hack -- Reduce damage based on the player armor class */
2918                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2919
2920                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2921
2922                                         /* Radius 8 earthquake centered at the monster */
2923                                         if (damage > 23 || explode)
2924                                         {
2925                                                 earthquake_aux(m_ptr->fy, m_ptr->fx, 8, m_idx);
2926                                         }
2927
2928                                         break;
2929                                 }
2930
2931                                 case RBE_EXP_10:
2932                                 {
2933                                         s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2934
2935                                         obvious = TRUE;
2936
2937                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2938
2939                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2940
2941                                         (void)drain_exp(d, d / 10, 95);
2942                                         break;
2943                                 }
2944
2945                                 case RBE_EXP_20:
2946                                 {
2947                                         s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2948
2949                                         obvious = TRUE;
2950
2951                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2952
2953                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2954
2955                                         (void)drain_exp(d, d / 10, 90);
2956                                         break;
2957                                 }
2958
2959                                 case RBE_EXP_40:
2960                                 {
2961                                         s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2962
2963                                         obvious = TRUE;
2964
2965                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2966
2967                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2968
2969                                         (void)drain_exp(d, d / 10, 75);
2970                                         break;
2971                                 }
2972
2973                                 case RBE_EXP_80:
2974                                 {
2975                                         s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2976
2977                                         obvious = TRUE;
2978
2979                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2980
2981                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2982
2983                                         (void)drain_exp(d, d / 10, 50);
2984                                         break;
2985                                 }
2986
2987                                 case RBE_DISEASE:
2988                                 {
2989                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2990
2991                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2992
2993                                         /* Take "poison" effect */
2994                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
2995                                         {
2996                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2997                                                 {
2998                                                         obvious = TRUE;
2999                                                 }
3000                                         }
3001
3002                                         /* Damage CON (10% chance)*/
3003                                         if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
3004                                         {
3005                                                 /* 1% chance for perm. damage */
3006                                                 bool perm = one_in_(10);
3007                                                 if (dec_stat(A_CON, randint1(10), perm))
3008                                                 {
3009                                                         msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3010                                                         obvious = TRUE;
3011                                                 }
3012                                         }
3013
3014                                         break;
3015                                 }
3016                                 case RBE_TIME:
3017                                 {
3018                                         if (explode) break;
3019                                         if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
3020                                         {
3021                                                 switch (randint1(10))
3022                                                 {
3023                                                         case 1: case 2: case 3: case 4: case 5:
3024                                                         {
3025                                                                 if (p_ptr->prace == RACE_ANDROID) break;
3026                                                                 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3027                                                                 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
3028                                                                 break;
3029                                                         }
3030
3031                                                         case 6: case 7: case 8: case 9:
3032                                                         {
3033                                                                 int stat = randint0(6);
3034
3035                                                                 switch (stat)
3036                                                                 {
3037 #ifdef JP
3038                                                                         case A_STR: act = "強く"; break;
3039                                                                         case A_INT: act = "聡明で"; break;
3040                                                                         case A_WIS: act = "賢明で"; break;
3041                                                                         case A_DEX: act = "器用で"; break;
3042                                                                         case A_CON: act = "健康で"; break;
3043                                                                         case A_CHR: act = "美しく"; break;
3044 #else
3045                                                                         case A_STR: act = "strong"; break;
3046                                                                         case A_INT: act = "bright"; break;
3047                                                                         case A_WIS: act = "wise"; break;
3048                                                                         case A_DEX: act = "agile"; break;
3049                                                                         case A_CON: act = "hale"; break;
3050                                                                         case A_CHR: act = "beautiful"; break;
3051 #endif
3052
3053                                                                 }
3054
3055                                                                 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3056                                                                 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
3057                                                                 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
3058                                                                 p_ptr->update |= (PU_BONUS);
3059                                                                 break;
3060                                                         }
3061
3062                                                         case 10:
3063                                                         {
3064                                                                 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3065
3066                                                                 for (k = 0; k < A_MAX; k++)
3067                                                                 {
3068                                                                         p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
3069                                                                         if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
3070                                                                 }
3071                                                                 p_ptr->update |= (PU_BONUS);
3072                                                                 break;
3073                                                         }
3074                                                 }
3075                                         }
3076                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3077
3078                                         break;
3079                                 }
3080                                 case RBE_DR_LIFE:
3081                                 {
3082                                         s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3083                                         bool resist_drain;
3084
3085                                         obvious = TRUE;
3086
3087                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3088
3089                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3090
3091                                         resist_drain = !drain_exp(d, d / 10, 50);
3092
3093                                         /* Heal the attacker? */
3094                                         if (p_ptr->mimic_form)
3095                                         {
3096                                                 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3097                                                         resist_drain = TRUE;
3098                                         }
3099                                         else
3100                                         {
3101                                                 switch (p_ptr->prace)
3102                                                 {
3103                                                 case RACE_ZOMBIE:
3104                                                 case RACE_VAMPIRE:
3105                                                 case RACE_SPECTRE:
3106                                                 case RACE_SKELETON:
3107                                                 case RACE_DEMON:
3108                                                 case RACE_GOLEM:
3109                                                 case RACE_ANDROID:
3110                                                         resist_drain = TRUE;
3111                                                         break;
3112                                                 }
3113                                         }
3114
3115                                         if ((damage > 5) && !resist_drain)
3116                                         {
3117                                                 bool did_heal = FALSE;
3118
3119                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3120
3121                                                 /* Heal */
3122                                                 m_ptr->hp += damroll(4, damage / 6);
3123                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3124
3125                                                 /* Redraw (later) if needed */
3126                                                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
3127                                                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
3128
3129                                                 /* Special message */
3130                                                 if (m_ptr->ml && did_heal)
3131                                                 {
3132                                                         msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3133                                                 }
3134                                         }
3135
3136                                         break;
3137                                 }
3138                                 case RBE_DR_MANA:
3139                                 {
3140                                         obvious = TRUE;
3141
3142                                         if (CHECK_MULTISHADOW())
3143                                         {
3144                                                 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3145                                         }
3146                                         else
3147                                         {
3148                                                 do_cut = 0;
3149
3150                                                 p_ptr->csp -= damage;
3151                                                 if (p_ptr->csp < 0)
3152                                                 {
3153                                                         p_ptr->csp = 0;
3154                                                         p_ptr->csp_frac = 0;
3155                                                 }
3156
3157                                                 p_ptr->redraw |= (PR_MANA);
3158                                         }
3159
3160                                         /* Learn about the player */
3161                                         update_smart_learn(m_idx, DRS_MANA);
3162
3163                                         break;
3164                                 }
3165                                 case RBE_INERTIA:
3166                                 {
3167                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3168
3169                                         if (p_ptr->is_dead) break;
3170
3171                                         /* Decrease speed */
3172                                         if (CHECK_MULTISHADOW())
3173                                         {
3174                                                 /* Do nothing */
3175                                         }
3176                                         else
3177                                         {
3178                                                 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3179                                                 {
3180                                                         obvious = TRUE;
3181                                                 }
3182                                         }
3183
3184                                         break;
3185                                 }
3186                                 case RBE_STUN:
3187                                 {
3188                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3189
3190                                         if (p_ptr->is_dead) break;
3191
3192                                         /* Decrease speed */
3193                                         if (p_ptr->resist_sound || CHECK_MULTISHADOW())
3194                                         {
3195                                                 /* Do nothing */
3196                                         }
3197                                         else
3198                                         {
3199                                                 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3200                                                 {
3201                                                         obvious = TRUE;
3202                                                 }
3203                                         }
3204
3205                                         break;
3206                                 }
3207                         }
3208
3209                         /* Hack -- only one of cut or stun */
3210                         if (do_cut && do_stun)
3211                         {
3212                                 /* Cancel cut */
3213                                 if (randint0(100) < 50)
3214                                 {
3215                                         do_cut = 0;
3216                                 }
3217
3218                                 /* Cancel stun */
3219                                 else
3220                                 {
3221                                         do_stun = 0;
3222                                 }
3223                         }
3224
3225                         /* Handle cut */
3226                         if (do_cut)
3227                         {
3228                                 int cut_plus = 0;
3229
3230                                 /* Critical hit (zero if non-critical) */
3231                                 tmp = monster_critical(d_dice, d_side, damage);
3232
3233                                 /* Roll for damage */
3234                                 switch (tmp)
3235                                 {
3236                                         case 0: cut_plus = 0; break;
3237                                         case 1: cut_plus = randint1(5); break;
3238                                         case 2: cut_plus = randint1(5) + 5; break;
3239                                         case 3: cut_plus = randint1(20) + 20; break;
3240                                         case 4: cut_plus = randint1(50) + 50; break;
3241                                         case 5: cut_plus = randint1(100) + 100; break;
3242                                         case 6: cut_plus = 300; break;
3243                                         default: cut_plus = 500; break;
3244                                 }
3245
3246                                 /* Apply the cut */
3247                                 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
3248                         }
3249
3250                         /* Handle stun */
3251                         if (do_stun)
3252                         {
3253                                 int stun_plus = 0;
3254
3255                                 /* Critical hit (zero if non-critical) */
3256                                 tmp = monster_critical(d_dice, d_side, damage);
3257
3258                                 /* Roll for damage */
3259                                 switch (tmp)
3260                                 {
3261                                         case 0: stun_plus = 0; break;
3262                                         case 1: stun_plus = randint1(5); break;
3263                                         case 2: stun_plus = randint1(5) + 10; break;
3264                                         case 3: stun_plus = randint1(10) + 20; break;
3265                                         case 4: stun_plus = randint1(15) + 30; break;
3266                                         case 5: stun_plus = randint1(20) + 40; break;
3267                                         case 6: stun_plus = 80; break;
3268                                         default: stun_plus = 150; break;
3269                                 }
3270
3271                                 /* Apply the stun */
3272                                 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
3273                         }
3274
3275                         if (explode)
3276                         {
3277                                 sound(SOUND_EXPLODE);
3278
3279                                 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3280                                 {
3281                                         blinked = FALSE;
3282                                         alive = FALSE;
3283                                 }
3284                         }
3285
3286                         if (touched)
3287                         {
3288                                 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
3289                                 {
3290                                         if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3291                                         {
3292                                                 HIT_POINT dam = damroll(2, 6);
3293
3294                                                 /* Modify the damage */
3295                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3296
3297                                                 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3298
3299                                                 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3300                                                 {
3301                                                         blinked = FALSE;
3302                                                         alive = FALSE;
3303                                                 }
3304                                         }
3305                                         else
3306                                         {
3307                                                 if (is_original_ap_and_seen(m_ptr))
3308                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3309                                         }
3310                                 }
3311
3312                                 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
3313                                 {
3314                                         if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3315                                         {
3316                                                 HIT_POINT dam = damroll(2, 6);
3317
3318                                                 /* Modify the damage */
3319                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3320
3321                                                 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3322                                                 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3323                                                 {
3324                                                         blinked = FALSE;
3325                                                         alive = FALSE;
3326                                                 }
3327                                         }
3328                                         else
3329                                         {
3330                                                 if (is_original_ap_and_seen(m_ptr))
3331                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3332                                         }
3333                                 }
3334
3335                                 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
3336                                 {
3337                                         if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3338                                         {
3339                                                 HIT_POINT dam = damroll(2, 6);
3340
3341                                                 /* Modify the damage */
3342                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3343
3344                                                 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3345                                                 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3346                                                 {
3347                                                         blinked = FALSE;
3348                                                         alive = FALSE;
3349                                                 }
3350                                         }
3351                                         else
3352                                         {
3353                                                 if (is_original_ap_and_seen(m_ptr))
3354                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3355                                         }
3356                                 }
3357
3358                                 /* by henkma */
3359                                 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3360                                 {
3361                                         if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3362                                         {
3363                                                 HIT_POINT dam = damroll(2, 6);
3364
3365                                                 /* Modify the damage */
3366                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3367
3368                                                 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3369                                                 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3370                                                 {
3371                                                         blinked = FALSE;
3372                                                         alive = FALSE;
3373                                                 }
3374                                         }
3375                                         else
3376                                         {
3377                                                 if (is_original_ap_and_seen(m_ptr))
3378                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3379                                         }
3380
3381                                         if (is_mirror_grid(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x]))
3382                                         {
3383                                                 teleport_player(10, 0L);
3384                                         }
3385                                 }
3386
3387                                 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3388                                 {
3389                                         if (r_ptr->flags3 & RF3_EVIL)
3390                                         {
3391                                                 if (!(r_ptr->flagsr & RFR_RES_ALL))
3392                                                 {
3393                                                         HIT_POINT dam = damroll(2, 6);
3394
3395                                                         /* Modify the damage */
3396                                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
3397
3398                                                         msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3399                                                         if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3400                                                         {
3401                                                                 blinked = FALSE;
3402                                                                 alive = FALSE;
3403                                                         }
3404                                                         if (is_original_ap_and_seen(m_ptr))
3405                                                                 r_ptr->r_flags3 |= RF3_EVIL;
3406                                                 }
3407                                                 else
3408                                                 {
3409                                                         if (is_original_ap_and_seen(m_ptr))
3410                                                                 r_ptr->r_flagsr |= RFR_RES_ALL;
3411                                                 }
3412                                         }
3413                                 }
3414
3415                                 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3416                                 {
3417                                         if (!(r_ptr->flagsr & RFR_RES_ALL))
3418                                         {
3419                                                 HIT_POINT dam = damroll(2, 6);
3420
3421                                                 /* Modify the damage */
3422                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3423
3424                                                 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3425                                                 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3426                                                 {
3427                                                         blinked = FALSE;
3428                                                         alive = FALSE;
3429                                                 }
3430                                         }
3431                                         else
3432                                         {
3433                                                 if (is_original_ap_and_seen(m_ptr))
3434                                                         r_ptr->r_flagsr |= RFR_RES_ALL;
3435                                         }
3436                                 }
3437
3438                                 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3439                                 {
3440                                         HIT_POINT dam = 1;
3441                                         object_type *o_armed_ptr = &inventory[INVEN_RARM];
3442
3443                                         if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3444                                         {
3445                                                 if (o_armed_ptr->k_idx)
3446                                                 {
3447                                                         int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3448                                                         dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3449                                                 }
3450
3451                                                 /* Cursed armor makes damages doubled */
3452                                                 o_armed_ptr = &inventory[INVEN_BODY];
3453                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3454
3455                                                 /* Modify the damage */
3456                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3457
3458                                                 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3459                                                 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3460                                                 {
3461                                                         blinked = FALSE;
3462                                                         alive = FALSE;
3463                                                 }
3464                                                 else /* monster does not dead */
3465                                                 {
3466                                                         int j;
3467                                                         BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3468                                                         EFFECT_ID typ[4][2] = {
3469                                                                 { INVEN_HEAD, GF_OLD_CONF },
3470                                                                 { INVEN_LARM,  GF_OLD_SLEEP },
3471                                                                 { INVEN_HANDS, GF_TURN_ALL },
3472                                                                 { INVEN_FEET, GF_OLD_SLOW }
3473                                                         };
3474
3475                                                         /* Some cursed armours gives an extra effect */
3476                                                         for (j = 0; j < 4; j++)
3477                                                         {
3478                                                                 o_armed_ptr = &inventory[typ[j][0]];
3479                                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3480                                                                         project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3481                                                         }
3482                                                 }
3483                                         }
3484                                         else
3485                                         {
3486                                                 if (is_original_ap_and_seen(m_ptr))
3487                                                         r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3488                                         }
3489                                 }
3490                         }
3491                 }
3492
3493                 /* Monster missed player */
3494                 else
3495                 {
3496                         /* Analyze failed attacks */
3497                         switch (method)
3498                         {
3499                                 case RBM_HIT:
3500                                 case RBM_TOUCH:
3501                                 case RBM_PUNCH:
3502                                 case RBM_KICK:
3503                                 case RBM_CLAW:
3504                                 case RBM_BITE:
3505                                 case RBM_STING:
3506                                 case RBM_SLASH:
3507                                 case RBM_BUTT:
3508                                 case RBM_CRUSH:
3509                                 case RBM_ENGULF:
3510                                 case RBM_CHARGE:
3511
3512                                 /* Visible monsters */
3513                                 if (m_ptr->ml)
3514                                 {
3515                                         disturb(TRUE, TRUE);
3516
3517 #ifdef JP
3518                                         if (abbreviate)
3519                                             msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3520                                         else
3521                                             msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3522                                         abbreviate = 1;/*2回目以降は省略 */
3523 #else
3524                                         msg_format("%^s misses you.", m_name);
3525 #endif
3526
3527                                 }
3528
3529                                 /* Gain shield experience */
3530                                 if (object_is_armour(&inventory[INVEN_RARM]) || object_is_armour(&inventory[INVEN_LARM]))
3531                                 {
3532                                         int cur = p_ptr->skill_exp[GINOU_SHIELD];
3533                                         int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
3534
3535                                         if (cur < max)
3536                                         {
3537                                                 DEPTH targetlevel = r_ptr->level;
3538                                                 int inc = 0;
3539
3540
3541                                                 /* Extra experience */
3542                                                 if ((cur / 100) < targetlevel)
3543                                                 {
3544                                                         if ((cur / 100 + 15) < targetlevel)
3545                                                                 inc += 1 + (targetlevel - (cur / 100 + 15));
3546                                                         else
3547                                                                 inc += 1;
3548                                                 }
3549
3550                                                 p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
3551                                                 p_ptr->update |= (PU_BONUS);
3552                                         }
3553                                 }
3554
3555                                 damage = 0;
3556
3557                                 break;
3558                         }
3559                 }
3560
3561
3562                 /* Analyze "visible" monsters only */
3563                 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
3564                 {
3565                         /* Count "obvious" attacks (and ones that cause damage) */
3566                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
3567                         {
3568                                 /* Count attacks of this type */
3569                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
3570                                 {
3571                                         r_ptr->r_blows[ap_cnt]++;
3572                                 }
3573                         }
3574                 }
3575
3576                 if (p_ptr->riding && damage)
3577                 {
3578                         char m_steed_name[MAX_NLEN];
3579                         monster_desc(m_steed_name, &current_floor_ptr->m_list[p_ptr->riding], 0);
3580                         if (rakuba((damage > 200) ? 200 : damage, FALSE))
3581                         {
3582                                 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
3583                         }
3584                 }
3585
3586                 if (p_ptr->special_defense & NINJA_KAWARIMI)
3587                 {
3588                         if (kawarimi(FALSE)) return TRUE;
3589                 }
3590         }
3591
3592         /* Hex - revenge damage stored */
3593         revenge_store(get_damage);
3594
3595         if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
3596                 && get_damage > 0 && !p_ptr->is_dead)
3597         {
3598 #ifdef JP
3599                 msg_format("攻撃が%s自身を傷つけた!", m_name);
3600 #else
3601                 GAME_TEXT m_name_self[80];
3602
3603                 /* hisself */
3604                 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
3605
3606                 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
3607 #endif
3608                 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
3609                 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
3610         }
3611
3612         if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
3613         {
3614                 char m_target_name[MAX_NLEN];
3615                 monster_desc(m_target_name, m_ptr, 0);
3616
3617                 p_ptr->csp -= 7;
3618                 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
3619                 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
3620                 fear = FALSE;
3621                 p_ptr->redraw |= (PR_MANA);
3622         }
3623
3624         /* Blink away */
3625         if (blinked && alive && !p_ptr->is_dead)
3626         {
3627                 if (teleport_barrier(m_idx))
3628                 {
3629                         msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
3630                 }
3631                 else
3632                 {
3633                         msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
3634                         teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
3635                 }
3636         }
3637
3638
3639         /* Always notice cause of death */
3640         if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
3641         {
3642                 r_ptr->r_deaths++;
3643         }
3644
3645         if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
3646         {
3647                 sound(SOUND_FLEE);
3648                 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
3649         }
3650
3651         if (p_ptr->special_defense & KATA_IAI)
3652         {
3653                 set_action(ACTION_NONE);
3654         }
3655
3656         /* Assume we attacked */
3657         return (TRUE);
3658 }