OSDN Git Service

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