OSDN Git Service

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