OSDN Git Service

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