OSDN Git Service

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