OSDN Git Service

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