OSDN Git Service

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