OSDN Git Service

[Refactor] #37353 型の置換。 / Type replacement.
[hengband/hengband.git] / src / melee1.c
1 /*!
2  * @file melee1.c
3  * @brief モンスターの打撃処理 / Monster attacks
4  * @date 2014/01/17
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  * This software may be copied and distributed for educational, research,\n
8  * and not for profit purposes provided that this copyright and statement\n
9  * are included in all such copies.  Other copyrights may also apply.\n
10  * 2014 Deskull rearranged comment for Doxygen.\n
11  * @details
12  */
13
14 #include "angband.h"
15 #include "cmd-pet.h"
16 #include "player-damage.h"
17
18
19
20  /*!
21  * @brief プレイヤーからモンスターへの打撃命中判定 /
22  * Determine if the player "hits" a monster (normal combat).
23  * @param chance 基本命中値
24  * @param ac モンスターのAC
25  * @param vis 目標を視界に捕らえているならばTRUEを指定
26  * @return 命中と判定された場合TRUEを返す
27  * @note Always miss 5%, always hit 5%, otherwise random.
28  */
29 bool test_hit_norm(int chance, ARMOUR_CLASS ac, int vis)
30 {
31         int k;
32
33         /* Percentile dice */
34         k = randint0(100);
35
36         /* Hack -- Instant miss or hit */
37         if (k < 10) return (k < 5);
38
39         if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
40                 if (one_in_(20)) return (FALSE);
41
42         /* Wimpy attack never hits */
43         if (chance <= 0) return (FALSE);
44
45         /* Penalize invisible targets */
46         if (!vis) chance = (chance + 1) / 2;
47
48         /* Power must defeat armor */
49         if (randint0(chance) < (ac * 3 / 4)) return (FALSE);
50
51         /* Assume hit */
52         return (TRUE);
53 }
54
55
56 /*!
57 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
58 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
59 * @param weight 矢弾の重量
60 * @param plus 武器の命中修正
61 * @param dam 現在算出中のダメージ値
62 * @param meichuu 打撃の基本命中力
63 * @param mode オプションフラグ
64 * @return クリティカル修正が入ったダメージ値
65 */
66 HIT_POINT critical_norm(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
67 {
68         int i, k;
69
70         /* Extract "blow" power */
71         i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
72
73         /* Chance */
74         if ((randint1((p_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
75         {
76                 k = weight + randint1(650);
77                 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
78
79                 if (k < 400)
80                 {
81                         msg_print(_("手ごたえがあった!", "It was a good hit!"));
82
83                         dam = 2 * dam + 5;
84                 }
85                 else if (k < 700)
86                 {
87                         msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
88                         dam = 2 * dam + 10;
89                 }
90                 else if (k < 900)
91                 {
92                         msg_print(_("会心の一撃だ!", "It was a superb hit!"));
93                         dam = 3 * dam + 15;
94                 }
95                 else if (k < 1300)
96                 {
97                         msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
98                         dam = 3 * dam + 20;
99                 }
100                 else
101                 {
102                         msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
103                         dam = ((7 * dam) / 2) + 25;
104                 }
105         }
106
107         return (dam);
108 }
109
110 /*!
111  * @brief モンスター打撃のクリティカルランクを返す /
112  * Critical blow. All hits that do 95% of total possible damage,
113  * @param dice モンスター打撃のダイス数
114  * @param sides モンスター打撃の最大ダイス目
115  * @param dam プレイヤーに与えたダメージ
116  * @details
117  * and which also do at least 20 damage, or, sometimes, N damage.
118  * This is used only to determine "cuts" and "stuns".
119  */
120 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
121 {
122         int max = 0;
123         int total = dice * sides;
124
125         /* Must do at least 95% of perfect */
126         if (dam < total * 19 / 20) return (0);
127
128         /* Weak blows rarely work */
129         if ((dam < 20) && (randint0(100) >= dam)) return (0);
130
131         /* Perfect damage */
132         if ((dam >= total) && (dam >= 40)) max++;
133
134         /* Super-charge */
135         if (dam >= 20)
136         {
137                 while (randint0(100) < 2) max++;
138         }
139
140         /* Critical damage */
141         if (dam > 45) return (6 + max);
142         if (dam > 33) return (5 + max);
143         if (dam > 25) return (4 + max);
144         if (dam > 18) return (3 + max);
145         if (dam > 11) return (2 + max);
146         return (1 + max);
147 }
148
149 /*!
150  * @brief モンスター打撃の命中を判定する /
151  * Determine if a monster attack against the player succeeds.
152  * @param power 打撃属性毎の基本命中値
153  * @param level モンスターのレベル
154  * @param stun モンスターの朦朧値
155  * @return TRUEならば命中判定
156  * @details
157  * Always miss 5% of the time, Always hit 5% of the time.
158  * Otherwise, match monster power against player armor.
159  */
160 static int check_hit(int power, DEPTH level, int stun)
161 {
162         int i, k, ac;
163
164         /* Percentile dice */
165         k = randint0(100);
166
167         if (stun && one_in_(2)) return FALSE;
168
169         /* Hack -- Always miss or hit */
170         if (k < 10) return (k < 5);
171
172         /* Calculate the "attack quality" */
173         i = (power + (level * 3));
174
175         /* Total armor */
176         ac = p_ptr->ac + p_ptr->to_a;
177         if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
178
179         /* Power and Level compete against Armor */
180         if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
181
182         /* Assume miss */
183         return (FALSE);
184 }
185
186
187
188 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
189 static cptr desc_insult[] =
190 {
191 #ifdef JP
192         "があなたを侮辱した!",
193         "があなたの母を侮辱した!",
194         "があなたを軽蔑した!",
195         "があなたを辱めた!",
196         "があなたを汚した!",
197         "があなたの回りで踊った!",
198         "が猥褻な身ぶりをした!",
199         "があなたをぼんやりと見た!!!",
200         "があなたをパラサイト呼ばわりした!",
201         "があなたをサイボーグ扱いした!"
202 #else
203         "insults you!",
204         "insults your mother!",
205         "gives you the finger!",
206         "humiliates you!",
207         "defiles you!",
208         "dances around you!",
209         "makes obscene gestures!",
210         "moons you!!!"
211         "calls you a parasite!",
212         "calls you a cyborg!"
213 #endif
214
215 };
216
217
218 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
219 static cptr desc_moan[] =
220 {
221 #ifdef JP
222         "は何かを悲しんでいるようだ。",
223         "が彼の飼い犬を見なかったかと尋ねている。",
224         "が縄張りから出て行けと言っている。",
225         "はキノコがどうとか呟いている。"
226 #else
227         "seems sad about something.",
228         "asks if you have seen his dogs.",
229         "tells you to get off his land.",
230         "mumbles something about mushrooms."
231 #endif
232
233 };
234
235
236 /*!
237 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
238 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
239 * @param immune ダメージを回避できる免疫フラグ
240 * @param flags_offset オーラフラグ配列の参照オフセット
241 * @param r_flags_offset モンスターの耐性配列の参照オフセット
242 * @param aura_flag オーラフラグ配列
243 * @param dam_func ダメージ処理を行う関数の参照ポインタ
244 * @param message オーラダメージを受けた際のメッセージ
245 * @return なし
246 */
247 static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
248         HIT_POINT(*dam_func)(HIT_POINT dam, cptr kb_str, int monspell, bool aura), cptr message)
249 {
250         monster_race *r_ptr = &r_info[m_ptr->r_idx];
251
252         if ((atoffset(u32b, r_ptr, flags_offset) & aura_flag) && !immune)
253         {
254                 char mon_name[80];
255                 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
256
257                 /* Hack -- Get the "died from" name */
258                 monster_desc(mon_name, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
259
260                 msg_print(message);
261
262                 dam_func(aura_damage, mon_name, -1, TRUE);
263
264                 if (is_original_ap_and_seen(m_ptr))
265                 {
266                         atoffset(u32b, r_ptr, r_flags_offset) |= aura_flag;
267                 }
268
269                 handle_stuff();
270         }
271 }
272
273
274
275
276 /*!
277 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
278 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
279 * @return なし
280 */
281 static void touch_zap_player(monster_type *m_ptr)
282 {
283         touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
284                 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
285         touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
286                 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
287         touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
288                 elec_dam, _("電撃をくらった!", "You get zapped!"));
289 }
290
291 /*!
292 * @brief プレイヤーの変異要素による打撃処理
293 * @param m_idx 攻撃目標となったモンスターの参照ID
294 * @param attack 変異要素による攻撃要素の種類
295 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
296 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
297 * @return なし
298 */
299 static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath)
300 {
301         HIT_POINT k;
302         int bonus, chance;
303         int             n_weight = 0;
304         monster_type    *m_ptr = &m_list[m_idx];
305         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
306         char            m_name[80];
307
308         int             dice_num, dice_side;
309
310         cptr            atk_desc;
311
312         switch (attack)
313         {
314         case MUT2_SCOR_TAIL:
315                 dice_num = 3;
316                 dice_side = 7;
317                 n_weight = 5;
318                 atk_desc = _("尻尾", "tail");
319
320                 break;
321         case MUT2_HORNS:
322                 dice_num = 2;
323                 dice_side = 6;
324                 n_weight = 15;
325                 atk_desc = _("角", "horns");
326
327                 break;
328         case MUT2_BEAK:
329                 dice_num = 2;
330                 dice_side = 4;
331                 n_weight = 5;
332                 atk_desc = _("クチバシ", "beak");
333
334                 break;
335         case MUT2_TRUNK:
336                 dice_num = 1;
337                 dice_side = 4;
338                 n_weight = 35;
339                 atk_desc = _("象の鼻", "trunk");
340
341                 break;
342         case MUT2_TENTACLES:
343                 dice_num = 2;
344                 dice_side = 5;
345                 n_weight = 5;
346                 atk_desc = _("触手", "tentacles");
347
348                 break;
349         default:
350                 dice_num = dice_side = n_weight = 1;
351                 atk_desc = _("未定義の部位", "undefined body part");
352
353         }
354
355         /* Extract monster name (or "it") */
356         monster_desc(m_name, m_ptr, 0);
357
358
359         /* Calculate the "attack quality" */
360         bonus = p_ptr->to_h_m;
361         bonus += (p_ptr->lev * 6 / 5);
362         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
363
364         /* Test for hit */
365         if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
366         {
367                 sound(SOUND_HIT);
368                 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
369
370                 k = damroll(dice_num, dice_side);
371                 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
372
373                 /* Apply the player damage bonuses */
374                 k += p_ptr->to_d_m;
375
376                 /* No negative damage */
377                 if (k < 0) k = 0;
378
379                 /* Modify the damage */
380                 k = mon_damage_mod(m_ptr, k, FALSE);
381
382                 /* Complex message */
383                 msg_format_wizard(CHEAT_MONSTER,
384                         _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
385                         k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
386
387                 /* Anger the monster */
388                 if (k > 0) anger_monster(m_ptr);
389
390                 /* Damage, check for fear and mdeath */
391                 switch (attack)
392                 {
393                 case MUT2_SCOR_TAIL:
394                         project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
395                         *mdeath = (m_ptr->r_idx == 0);
396                         break;
397                 case MUT2_HORNS:
398                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
399                         break;
400                 case MUT2_BEAK:
401                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
402                         break;
403                 case MUT2_TRUNK:
404                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
405                         break;
406                 case MUT2_TENTACLES:
407                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
408                         break;
409                 default:
410                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
411                 }
412
413                 touch_zap_player(m_ptr);
414         }
415         /* Player misses */
416         else
417         {
418                 sound(SOUND_MISS);
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(FALSE, TRUE);
1342
1343         p_ptr->energy_use = 100;
1344
1345         if (!p_ptr->migite && !p_ptr->hidarite &&
1346                 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
1347         {
1348                 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
1349                         (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
1350                 return FALSE;
1351         }
1352
1353         /* Extract monster name (or "it") */
1354         monster_desc(m_name, m_ptr, 0);
1355
1356         if (m_ptr->ml)
1357         {
1358                 /* Auto-Recall if possible and visible */
1359                 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
1360
1361                 /* Track a new monster */
1362                 health_track(c_ptr->m_idx);
1363         }
1364
1365         if ((r_ptr->flags1 & RF1_FEMALE) &&
1366                 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
1367         {
1368                 if ((inventory[INVEN_RARM].name1 == ART_ZANTETSU) || (inventory[INVEN_LARM].name1 == ART_ZANTETSU))
1369                 {
1370                         msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
1371                         return FALSE;
1372                 }
1373         }
1374
1375         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
1376         {
1377                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
1378                 return FALSE;
1379         }
1380
1381         /* Stop if friendly */
1382         if (!is_hostile(m_ptr) &&
1383                 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
1384                         p_ptr->shero || !m_ptr->ml))
1385         {
1386                 if (inventory[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
1387                 if (inventory[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
1388                 if (stormbringer)
1389                 {
1390                         msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
1391                         chg_virtue(V_INDIVIDUALISM, 1);
1392                         chg_virtue(V_HONOUR, -1);
1393                         chg_virtue(V_JUSTICE, -1);
1394                         chg_virtue(V_COMPASSION, -1);
1395                 }
1396                 else if (p_ptr->pclass != CLASS_BERSERKER)
1397                 {
1398                         if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
1399                         {
1400                                 chg_virtue(V_INDIVIDUALISM, 1);
1401                                 chg_virtue(V_HONOUR, -1);
1402                                 chg_virtue(V_JUSTICE, -1);
1403                                 chg_virtue(V_COMPASSION, -1);
1404                         }
1405                         else
1406                         {
1407                                 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
1408                                 return FALSE;
1409                         }
1410                 }
1411         }
1412
1413
1414         /* Handle player fear */
1415         if (p_ptr->afraid)
1416         {
1417                 if (m_ptr->ml)
1418                         msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
1419                 else
1420                         msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
1421
1422                 /* Disturb the monster */
1423                 (void)set_monster_csleep(c_ptr->m_idx, 0);
1424
1425                 return FALSE;
1426         }
1427
1428         if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
1429         {
1430                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
1431                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
1432         }
1433
1434         if (p_ptr->migite && p_ptr->hidarite)
1435         {
1436                 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))
1437                 {
1438                         if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
1439                                 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
1440                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
1441                                 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
1442                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
1443                                 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
1444                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
1445                                 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
1446                         p_ptr->update |= (PU_BONUS);
1447                 }
1448         }
1449
1450         /* Gain riding experience */
1451         if (p_ptr->riding)
1452         {
1453                 int cur = p_ptr->skill_exp[GINOU_RIDING];
1454                 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
1455
1456                 if (cur < max)
1457                 {
1458                         int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
1459                         int targetlevel = r_ptr->level;
1460                         int inc = 0;
1461
1462                         if ((cur / 200 - 5) < targetlevel)
1463                                 inc += 1;
1464
1465                         /* Extra experience */
1466                         if ((cur / 100) < ridinglevel)
1467                         {
1468                                 if ((cur / 100 + 15) < ridinglevel)
1469                                         inc += 1 + (ridinglevel - (cur / 100 + 15));
1470                                 else
1471                                         inc += 1;
1472                         }
1473
1474                         p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
1475
1476                         p_ptr->update |= (PU_BONUS);
1477                 }
1478         }
1479
1480         riding_t_m_idx = c_ptr->m_idx;
1481         if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
1482         if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
1483
1484         /* Mutations which yield extra 'natural' attacks */
1485         if (!mdeath)
1486         {
1487                 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
1488                         natural_attack(c_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
1489                 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
1490                         natural_attack(c_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
1491                 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
1492                         natural_attack(c_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
1493                 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
1494                         natural_attack(c_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
1495                 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
1496                         natural_attack(c_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
1497         }
1498
1499         /* Hack -- delay fear messages */
1500         if (fear && m_ptr->ml && !mdeath)
1501         {
1502                 sound(SOUND_FLEE);
1503
1504                 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
1505         }
1506
1507         if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
1508         {
1509                 set_action(ACTION_NONE);
1510         }
1511
1512         return mdeath;
1513 }
1514
1515
1516 /*!
1517  * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
1518  * @param m_idx 打撃を行うモンスターのID
1519  * @return 実際に攻撃処理を行った場合TRUEを返す
1520  */
1521 bool make_attack_normal(MONSTER_IDX m_idx)
1522 {
1523         monster_type *m_ptr = &m_list[m_idx];
1524         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1525
1526         int ap_cnt;
1527
1528         INVENTORY_IDX i;
1529         int k, tmp, ac, rlev;
1530         int do_cut, do_stun;
1531
1532         s32b gold;
1533
1534         object_type *o_ptr;
1535
1536         char o_name[MAX_NLEN];
1537
1538         char m_name[80];
1539
1540         char ddesc[80];
1541
1542         bool blinked;
1543         bool touched = FALSE, fear = FALSE, alive = TRUE;
1544         bool explode = FALSE;
1545         bool do_silly_attack = (one_in_(2) && p_ptr->image);
1546         HIT_POINT get_damage = 0;
1547         int abbreviate = 0;     // 2回目以降の省略表現フラグ
1548
1549         /* Not allowed to attack */
1550         if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
1551
1552         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE) return (FALSE);
1553
1554         /* ...nor if friendly */
1555         if (!is_hostile(m_ptr)) return FALSE;
1556
1557         /* Extract the effective monster level */
1558         rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
1559
1560
1561         /* Get the monster name (or "it") */
1562         monster_desc(m_name, m_ptr, 0);
1563
1564         /* Get the "died from" information (i.e. "a kobold") */
1565         monster_desc(ddesc, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
1566
1567         if (p_ptr->special_defense & KATA_IAI)
1568         {
1569                 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
1570                 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
1571         }
1572
1573         if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
1574         {
1575                 if (kawarimi(TRUE)) return TRUE;
1576         }
1577
1578         /* Assume no blink */
1579         blinked = FALSE;
1580
1581         /* Scan through all four blows */
1582         for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
1583         {
1584                 bool obvious = FALSE;
1585
1586                 HIT_POINT power = 0;
1587                 HIT_POINT damage = 0;
1588
1589                 cptr act = NULL;
1590
1591                 /* Extract the attack infomation */
1592                 int effect = r_ptr->blow[ap_cnt].effect;
1593                 int method = r_ptr->blow[ap_cnt].method;
1594                 int d_dice = r_ptr->blow[ap_cnt].d_dice;
1595                 int d_side = r_ptr->blow[ap_cnt].d_side;
1596
1597
1598                 if (!m_ptr->r_idx) break;
1599
1600                 /* Hack -- no more attacks */
1601                 if (!method) break;
1602
1603                 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
1604                 {
1605                         method = RBM_HIT;
1606                         d_dice /= 10;
1607                 }
1608
1609                 /* Stop if player is dead or gone */
1610                 if (!p_ptr->playing || p_ptr->is_dead) break;
1611                 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
1612
1613                 /* Handle "leaving" */
1614                 if (p_ptr->leaving) break;
1615
1616                 if (method == RBM_SHOOT) continue;
1617
1618                 /* Extract the attack "power" */
1619                 power = mbe_info[effect].power;
1620
1621                 /* Total armor */
1622                 ac = p_ptr->ac + p_ptr->to_a;
1623
1624                 /* Monster hits player */
1625                 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
1626                 {
1627                         /* Always disturbing */
1628                         disturb(TRUE, TRUE);
1629
1630
1631                         /* Hack -- Apply "protection from evil" */
1632                         if ((p_ptr->protevil > 0) &&
1633                             (r_ptr->flags3 & RF3_EVIL) &&
1634                             (p_ptr->lev >= rlev) &&
1635                             ((randint0(100) + p_ptr->lev) > 50))
1636                         {
1637                                 /* Remember the Evil-ness */
1638                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
1639
1640 #ifdef JP
1641                                 if (abbreviate) msg_format("撃退した。");
1642                                 else msg_format("%^sは撃退された。", m_name);
1643                                 abbreviate = 1; /*2回目以降は省略 */
1644 #else
1645                                 msg_format("%^s is repelled.", m_name);
1646 #endif
1647
1648
1649                                 /* Hack -- Next attack */
1650                                 continue;
1651                         }
1652
1653
1654                         /* Assume no cut or stun */
1655                         do_cut = do_stun = 0;
1656
1657                         /* Describe the attack method */
1658                         switch (method)
1659                         {
1660                                 case RBM_HIT:
1661                                 {
1662                                         act = _("殴られた。", "hits you.");
1663                                         do_cut = do_stun = 1;
1664                                         touched = TRUE;
1665                                         sound(SOUND_HIT);
1666                                         break;
1667                                 }
1668
1669                                 case RBM_TOUCH:
1670                                 {
1671                                         act = _("触られた。", "touches you.");
1672                                         touched = TRUE;
1673                                         sound(SOUND_TOUCH);
1674                                         break;
1675                                 }
1676
1677                                 case RBM_PUNCH:
1678                                 {
1679                                         act = _("パンチされた。", "punches you.");
1680                                         touched = TRUE;
1681                                         do_stun = 1;
1682                                         sound(SOUND_HIT);
1683                                         break;
1684                                 }
1685
1686                                 case RBM_KICK:
1687                                 {
1688                                         act = _("蹴られた。", "kicks you.");
1689                                         touched = TRUE;
1690                                         do_stun = 1;
1691                                         sound(SOUND_HIT);
1692                                         break;
1693                                 }
1694
1695                                 case RBM_CLAW:
1696                                 {
1697                                         act = _("ひっかかれた。", "claws you.");
1698                                         touched = TRUE;
1699                                         do_cut = 1;
1700                                         sound(SOUND_CLAW);
1701                                         break;
1702                                 }
1703
1704                                 case RBM_BITE:
1705                                 {
1706                                         act = _("噛まれた。", "bites you.");
1707                                         do_cut = 1;
1708                                         touched = TRUE;
1709                                         sound(SOUND_BITE);
1710                                         break;
1711                                 }
1712
1713                                 case RBM_STING:
1714                                 {
1715                                         act = _("刺された。", "stings you.");
1716                                         touched = TRUE;
1717                                         sound(SOUND_STING);
1718                                         break;
1719                                 }
1720
1721                                 case RBM_SLASH:
1722                                 {
1723                                         act = _("斬られた。", "slashes you.");
1724                                         touched = TRUE;
1725                                         do_cut = 1;
1726                                         sound(SOUND_CLAW);
1727                                         break;
1728                                 }
1729
1730                                 case RBM_BUTT:
1731                                 {
1732                                         act = _("角で突かれた。", "butts you.");
1733                                         do_stun = 1;
1734                                         touched = TRUE;
1735                                         sound(SOUND_HIT);
1736                                         break;
1737                                 }
1738
1739                                 case RBM_CRUSH:
1740                                 {
1741                                         act = _("体当たりされた。", "crushes you.");
1742                                         do_stun = 1;
1743                                         touched = TRUE;
1744                                         sound(SOUND_CRUSH);
1745                                         break;
1746                                 }
1747
1748                                 case RBM_ENGULF:
1749                                 {
1750                                         act = _("飲み込まれた。", "engulfs you.");
1751                                         touched = TRUE;
1752                                         sound(SOUND_CRUSH);
1753                                         break;
1754                                 }
1755
1756                                 case RBM_CHARGE:
1757                                 {
1758                                         abbreviate = -1;
1759                                         act = _("は請求書をよこした。", "charges you.");
1760                                         touched = TRUE;
1761                                         sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
1762                                         break;
1763                                 }
1764
1765                                 case RBM_CRAWL:
1766                                 {
1767                                         abbreviate = -1;
1768                                         act = _("が体の上を這い回った。", "crawls on you.");
1769                                         touched = TRUE;
1770                                         sound(SOUND_SLIME);
1771                                         break;
1772                                 }
1773
1774                                 case RBM_DROOL:
1775                                 {
1776                                         act = _("よだれをたらされた。", "drools on you.");
1777                                         sound(SOUND_SLIME);
1778                                         break;
1779                                 }
1780
1781                                 case RBM_SPIT:
1782                                 {
1783                                         act = _("唾を吐かれた。", "spits on you.");
1784                                         sound(SOUND_SLIME);
1785                                         break;
1786                                 }
1787
1788                                 case RBM_EXPLODE:
1789                                 {
1790                                         abbreviate = -1;
1791                                         act = _("は爆発した。", "explodes.");
1792                                         explode = TRUE;
1793                                         break;
1794                                 }
1795
1796                                 case RBM_GAZE:
1797                                 {
1798                                         act = _("にらまれた。", "gazes at you.");
1799                                         break;
1800                                 }
1801
1802                                 case RBM_WAIL:
1803                                 {
1804                                         act = _("泣き叫ばれた。", "wails at you.");
1805                                         sound(SOUND_WAIL);
1806                                         break;
1807                                 }
1808
1809                                 case RBM_SPORE:
1810                                 {
1811                                         act = _("胞子を飛ばされた。", "releases spores at you.");
1812                                         sound(SOUND_SLIME);
1813                                         break;
1814                                 }
1815
1816                                 case RBM_XXX4:
1817                                 {
1818                                         abbreviate = -1;
1819                                         act = _("が XXX4 を発射した。", "projects XXX4's at you.");
1820                                         break;
1821                                 }
1822
1823                                 case RBM_BEG:
1824                                 {
1825                                         act = _("金をせがまれた。", "begs you for money.");
1826                                         sound(SOUND_MOAN);
1827                                         break;
1828                                 }
1829
1830                                 case RBM_INSULT:
1831                                 {
1832 #ifdef JP
1833                                         abbreviate = -1;
1834 #endif
1835                                         act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
1836                                         sound(SOUND_MOAN);
1837                                         break;
1838                                 }
1839
1840                                 case RBM_MOAN:
1841                                 {
1842 #ifdef JP
1843                                         abbreviate = -1;
1844 #endif
1845                                         act = desc_moan[randint0(4)];
1846                                         sound(SOUND_MOAN);
1847                                         break;
1848                                 }
1849
1850                                 case RBM_SHOW:
1851                                 {
1852 #ifdef JP
1853                                         abbreviate = -1;
1854 #endif
1855                                         if (m_ptr->r_idx == MON_JAIAN)
1856                                         {
1857 #ifdef JP
1858                                                 switch(randint1(15))
1859                                                 {
1860                                                   case 1:
1861                                                   case 6:
1862                                                   case 11:
1863                                                         act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
1864                                                         break;
1865                                                   case 2:
1866                                                         act = "「♪て~んかむ~てきのお~とこだぜ~~」";
1867                                                         break;
1868                                                   case 3:
1869                                                         act = "「♪の~び太スネ夫はメじゃないよ~~」";
1870                                                         break;
1871                                                   case 4:
1872                                                         act = "「♪け~んかスポ~ツ~どんとこい~」";
1873                                                         break;
1874                                                   case 5:
1875                                                         act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
1876                                                         break;
1877                                                   case 7:
1878                                                         act = "「♪ま~ちいちば~んのに~んきもの~~」";
1879                                                         break;
1880                                                   case 8:
1881                                                         act = "「♪べんきょうしゅくだいメじゃないよ~~」";
1882                                                         break;
1883                                                   case 9:
1884                                                         act = "「♪きはやさし~くて~ち~からもち~」";
1885                                                         break;
1886                                                   case 10:
1887                                                         act = "「♪かお~も~~スタイルも~バツグンさ~」";
1888                                                         break;
1889                                                   case 12:
1890                                                         act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
1891                                                         break;
1892                                                   case 13:
1893                                                         act = "「♪ド~ラもドラミもメじゃないよ~~」";
1894                                                         break;
1895                                                   case 14:
1896                                                         act = "「♪よじげんぽけっと~な~くたって~」";
1897                                                         break;
1898                                                   case 15:
1899                                                         act = "「♪あし~の~~ながさ~は~まけないぜ~」";
1900                                                         break;
1901                                                 }
1902 #else
1903                                                 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
1904 #endif
1905                                         }
1906                                         else
1907                                         {
1908                                                 if (one_in_(3))
1909                                                         act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
1910                                                 else
1911                                                         act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
1912                                         }
1913
1914                                         sound(SOUND_SHOW);
1915                                         break;
1916                                 }
1917                         }
1918
1919                         if (act)
1920                         {
1921                                 if (do_silly_attack)
1922                                 {
1923 #ifdef JP
1924                                         abbreviate = -1;
1925 #endif
1926                                         act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
1927                                 }
1928 #ifdef JP
1929                                 if (abbreviate == 0)
1930                                         msg_format("%^sに%s", m_name, act);
1931                                 else if (abbreviate == 1)
1932                                         msg_format("%s", act);
1933                                 else /* if (abbreviate == -1) */
1934                                         msg_format("%^s%s", m_name, act);
1935                                 abbreviate = 1;/*2回目以降は省略 */
1936 #else
1937                                 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
1938 #endif
1939                         }
1940
1941                         /* Hack -- assume all attacks are obvious */
1942                         obvious = TRUE;
1943
1944                         /* Roll out the damage */
1945                         damage = damroll(d_dice, d_side);
1946
1947                         /*
1948                          * Skip the effect when exploding, since the explosion
1949                          * already causes the effect.
1950                          */
1951                         if(explode) damage = 0;
1952                         /* Apply appropriate damage */
1953                         switch (effect)
1954                         {
1955                                 case 0:
1956                                 {
1957                                         obvious = TRUE;
1958                                         damage = 0;
1959                                         break;
1960                                 }
1961
1962                                 case RBE_SUPERHURT:     /* AC軽減あり / Player armor reduces total damage */
1963                                 {
1964                                         if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
1965                                         {
1966                                                 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
1967                                                 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
1968                                                 tmp_damage = MAX(damage, tmp_damage*2);
1969
1970                                                 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
1971                                                 break;
1972                                         }
1973                                 }
1974                                 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
1975                                 {
1976                                         obvious = TRUE;
1977                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
1978                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1979                                         break;
1980                                 }
1981
1982                                 case RBE_POISON:
1983                                 {
1984                                         if (explode) break;
1985
1986                                         /* Take "poison" effect */
1987                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
1988                                         {
1989                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
1990                                                 {
1991                                                         obvious = TRUE;
1992                                                 }
1993                                         }
1994
1995                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
1996
1997                                         /* Learn about the player */
1998                                         update_smart_learn(m_idx, DRS_POIS);
1999
2000                                         break;
2001                                 }
2002
2003                                 case RBE_UN_BONUS:
2004                                 {
2005                                         if (explode) break;
2006
2007                                         /* Allow complete resist */
2008                                         if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2009                                         {
2010                                                 /* Apply disenchantment */
2011                                                 if (apply_disenchant(0))
2012                                                 {
2013                                                         /* Hack -- Update AC */
2014                                                         update_stuff();
2015                                                         obvious = TRUE;
2016                                                 }
2017                                         }
2018
2019                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2020
2021                                         /* Learn about the player */
2022                                         update_smart_learn(m_idx, DRS_DISEN);
2023
2024                                         break;
2025                                 }
2026
2027                                 case RBE_UN_POWER:
2028                                 {
2029                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2030
2031                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2032
2033                                         /* Find an item */
2034                                         for (k = 0; k < 10; k++)
2035                                         {
2036                                                 /* Pick an item */
2037                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2038
2039                                                 /* Obtain the item */
2040                                                 o_ptr = &inventory[i];
2041
2042                                                 /* Skip non-objects */
2043                                                 if (!o_ptr->k_idx) continue;
2044
2045                                                 /* Drain charged wands/staffs */
2046                                                 if (((o_ptr->tval == TV_STAFF) ||
2047                                                      (o_ptr->tval == TV_WAND)) &&
2048                                                     (o_ptr->pval))
2049                                                 {
2050                                                         /* Calculate healed hitpoints */
2051                                                         int heal=rlev * o_ptr->pval;
2052                                                         if( o_ptr->tval == TV_STAFF)
2053                                                             heal *=  o_ptr->number;
2054
2055                                                         /* Don't heal more than max hp */
2056                                                         heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2057
2058                                                         msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2059
2060                                                         obvious = TRUE;
2061
2062                                                         /* Heal the monster */
2063                                                         m_ptr->hp += (HIT_POINT)heal;
2064
2065                                                         /* Redraw (later) if needed */
2066                                                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2067                                                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2068
2069                                                         /* Uncharge */
2070                                                         o_ptr->pval = 0;
2071
2072                                                         /* Combine / Reorder the pack */
2073                                                         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
2074                                                         p_ptr->window |= (PW_INVEN);
2075
2076                                                         break;
2077                                                 }
2078                                         }
2079
2080                                         break;
2081                                 }
2082
2083                                 case RBE_EAT_GOLD:
2084                                 {
2085                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2086
2087                                         /* Confused monsters cannot steal successfully. -LM-*/
2088                                         if (MON_CONFUSED(m_ptr)) break;
2089
2090                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2091
2092                                         obvious = TRUE;
2093
2094                                         /* Saving throw (unless paralyzed) based on dex and level */
2095                                         if (!p_ptr->paralyzed &&
2096                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2097                                                               p_ptr->lev)))
2098                                         {
2099                                                 /* Saving throw message */
2100                                                 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2101
2102                                                 /* Occasional blink anyway */
2103                                                 if (randint0(3)) blinked = TRUE;
2104                                         }
2105
2106                                         /* Eat gold */
2107                                         else
2108                                         {
2109                                                 gold = (p_ptr->au / 10) + randint1(25);
2110                                                 if (gold < 2) gold = 2;
2111                                                 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2112                                                 if (gold > p_ptr->au) gold = p_ptr->au;
2113                                                 p_ptr->au -= gold;
2114                                                 if (gold <= 0)
2115                                                 {
2116                                                         msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2117                                                 }
2118                                                 else if (p_ptr->au)
2119                                                 {
2120                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2121                                                         msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2122                                                         chg_virtue(V_SACRIFICE, 1);
2123                                                 }
2124                                                 else
2125                                                 {
2126                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2127                                                         msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2128                                                         chg_virtue(V_SACRIFICE, 2);
2129                                                 }
2130
2131                                                 /* Redraw gold */
2132                                                 p_ptr->redraw |= (PR_GOLD);
2133
2134                                                 p_ptr->window |= (PW_PLAYER);
2135
2136                                                 /* Blink away */
2137                                                 blinked = TRUE;
2138                                         }
2139
2140                                         break;
2141                                 }
2142
2143                                 case RBE_EAT_ITEM:
2144                                 {
2145                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2146
2147                                         /* Confused monsters cannot steal successfully. -LM-*/
2148                                         if (MON_CONFUSED(m_ptr)) break;
2149
2150                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2151
2152                                         /* Saving throw (unless paralyzed) based on dex and level */
2153                                         if (!p_ptr->paralyzed &&
2154                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2155                                                               p_ptr->lev)))
2156                                         {
2157                                                 /* Saving throw message */
2158                                                 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2159
2160                                                 /* Occasional "blink" anyway */
2161                                                 blinked = TRUE;
2162                                                 obvious = TRUE;
2163                                                 break;
2164                                         }
2165
2166                                         /* Find an item */
2167                                         for (k = 0; k < 10; k++)
2168                                         {
2169                                                 s16b o_idx;
2170
2171                                                 /* Pick an item */
2172                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2173
2174                                                 /* Obtain the item */
2175                                                 o_ptr = &inventory[i];
2176
2177                                                 /* Skip non-objects */
2178                                                 if (!o_ptr->k_idx) continue;
2179
2180                                                 /* Skip artifacts */
2181                                                 if (object_is_artifact(o_ptr)) continue;
2182
2183                                                 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
2184
2185 #ifdef JP
2186                                                 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
2187 #else
2188                                                 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
2189 #endif
2190
2191                                                 chg_virtue(V_SACRIFICE, 1);
2192
2193
2194                                                 /* Make an object */
2195                                                 o_idx = o_pop();
2196
2197                                                 /* Success */
2198                                                 if (o_idx)
2199                                                 {
2200                                                         object_type *j_ptr;
2201
2202                                                         /* Get new object */
2203                                                         j_ptr = &o_list[o_idx];
2204
2205                                                         /* Copy object */
2206                                                         object_copy(j_ptr, o_ptr);
2207
2208                                                         /* Modify number */
2209                                                         j_ptr->number = 1;
2210
2211                                                         /* Hack -- If a rod or wand, allocate total
2212                                                          * maximum timeouts or charges between those
2213                                                          * stolen and those missed. -LM-
2214                                                          */
2215                                                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
2216                                                         {
2217                                                                 j_ptr->pval = o_ptr->pval / o_ptr->number;
2218                                                                 o_ptr->pval -= j_ptr->pval;
2219                                                         }
2220
2221                                                         /* Forget mark */
2222                                                         j_ptr->marked = OM_TOUCHED;
2223
2224                                                         /* Memorize monster */
2225                                                         j_ptr->held_m_idx = m_idx;
2226
2227                                                         /* Build stack */
2228                                                         j_ptr->next_o_idx = m_ptr->hold_o_idx;
2229
2230                                                         /* Build stack */
2231                                                         m_ptr->hold_o_idx = o_idx;
2232                                                 }
2233
2234                                                 /* Steal the items */
2235                                                 inven_item_increase(i, -1);
2236                                                 inven_item_optimize(i);
2237
2238                                                 obvious = TRUE;
2239
2240                                                 /* Blink away */
2241                                                 blinked = TRUE;
2242
2243                                                 break;
2244                                         }
2245
2246                                         break;
2247                                 }
2248
2249                                 case RBE_EAT_FOOD:
2250                                 {
2251                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2252
2253                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2254
2255                                         /* Steal some food */
2256                                         for (k = 0; k < 10; k++)
2257                                         {
2258                                                 /* Pick an item from the pack */
2259                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2260
2261                                                 o_ptr = &inventory[i];
2262
2263                                                 /* Skip non-objects */
2264                                                 if (!o_ptr->k_idx) continue;
2265
2266                                                 /* Skip non-food objects */
2267                                                 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
2268
2269                                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2270
2271 #ifdef JP
2272                                                 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
2273 #else
2274                                                 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
2275 #endif
2276
2277                                                 /* Steal the items */
2278                                                 inven_item_increase(i, -1);
2279                                                 inven_item_optimize(i);
2280
2281                                                 obvious = TRUE;
2282
2283                                                 break;
2284                                         }
2285
2286                                         break;
2287                                 }
2288
2289                                 case RBE_EAT_LITE:
2290                                 {
2291                                         /* Access the lite */
2292                                         o_ptr = &inventory[INVEN_LITE];
2293                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2294
2295                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2296
2297                                         /* Drain fuel */
2298                                         if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
2299                                         {
2300                                                 /* Reduce fuel */
2301                                                 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
2302                                                 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
2303
2304                                                 if (!p_ptr->blind)
2305                                                 {
2306                                                         msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
2307                                                         obvious = TRUE;
2308                                                 }
2309
2310                                                 p_ptr->window |= (PW_EQUIP);
2311                                         }
2312
2313                                         break;
2314                                 }
2315
2316                                 case RBE_ACID:
2317                                 {
2318                                         if (explode) break;
2319                                         obvious = TRUE;
2320                                         msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
2321                                         get_damage += acid_dam(damage, ddesc, -1, FALSE);
2322                                         update_stuff();
2323                                         update_smart_learn(m_idx, DRS_ACID);
2324                                         break;
2325                                 }
2326
2327                                 case RBE_ELEC:
2328                                 {
2329                                         if (explode) break;
2330                                         obvious = TRUE;
2331                                         msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
2332                                         get_damage += elec_dam(damage, ddesc, -1, FALSE);
2333                                         update_smart_learn(m_idx, DRS_ELEC);
2334                                         break;
2335                                 }
2336
2337                                 case RBE_FIRE:
2338                                 {
2339                                         if (explode) break;
2340                                         obvious = TRUE;
2341                                         msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
2342                                         get_damage += fire_dam(damage, ddesc, -1, FALSE);
2343                                         update_smart_learn(m_idx, DRS_FIRE);
2344                                         break;
2345                                 }
2346
2347                                 case RBE_COLD:
2348                                 {
2349                                         if (explode) break;
2350                                         obvious = TRUE;
2351                                         msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
2352                                         get_damage += cold_dam(damage, ddesc, -1, FALSE);
2353                                         update_smart_learn(m_idx, DRS_COLD);
2354                                         break;
2355                                 }
2356
2357                                 case RBE_BLIND:
2358                                 {
2359                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2360                                         if (p_ptr->is_dead) break;
2361
2362                                         /* Increase "blind" */
2363                                         if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
2364                                         {
2365                                                 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
2366                                                 {
2367 #ifdef JP
2368                                                         if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
2369 #else
2370                                                         /* nanka */
2371 #endif
2372                                                         obvious = TRUE;
2373                                                 }
2374                                         }
2375
2376                                         /* Learn about the player */
2377                                         update_smart_learn(m_idx, DRS_BLIND);
2378
2379                                         break;
2380                                 }
2381
2382                                 case RBE_CONFUSE:
2383                                 {
2384                                         if (explode) break;
2385                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2386
2387                                         if (p_ptr->is_dead) break;
2388
2389                                         /* Increase "confused" */
2390                                         if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
2391                                         {
2392                                                 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
2393                                                 {
2394                                                         obvious = TRUE;
2395                                                 }
2396                                         }
2397
2398                                         /* Learn about the player */
2399                                         update_smart_learn(m_idx, DRS_CONF);
2400
2401                                         break;
2402                                 }
2403
2404                                 case RBE_TERRIFY:
2405                                 {
2406                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2407
2408                                         if (p_ptr->is_dead) break;
2409
2410                                         /* Increase "afraid" */
2411                                         if (CHECK_MULTISHADOW())
2412                                         {
2413                                                 /* Do nothing */
2414                                         }
2415                                         else if (p_ptr->resist_fear)
2416                                         {
2417                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
2418                                                 obvious = TRUE;
2419                                         }
2420                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
2421                                         {
2422                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
2423                                                 obvious = TRUE;
2424                                         }
2425                                         else
2426                                         {
2427                                                 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
2428                                                 {
2429                                                         obvious = TRUE;
2430                                                 }
2431                                         }
2432
2433                                         /* Learn about the player */
2434                                         update_smart_learn(m_idx, DRS_FEAR);
2435
2436                                         break;
2437                                 }
2438
2439                                 case RBE_PARALYZE:
2440                                 {
2441                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2442
2443                                         if (p_ptr->is_dead) break;
2444
2445                                         /* Increase "paralyzed" */
2446                                         if (CHECK_MULTISHADOW())
2447                                         {
2448                                                 /* Do nothing */
2449                                         }
2450                                         else if (p_ptr->free_act)
2451                                         {
2452                                                 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
2453                                                 obvious = TRUE;
2454                                         }
2455                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
2456                                         {
2457                                                 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
2458                                                 obvious = TRUE;
2459                                         }
2460                                         else
2461                                         {
2462                                                 if (!p_ptr->paralyzed)
2463                                                 {
2464                                                         if (set_paralyzed(3 + randint1(rlev)))
2465                                                         {
2466                                                                 obvious = TRUE;
2467                                                         }
2468                                                 }
2469                                         }
2470
2471                                         /* Learn about the player */
2472                                         update_smart_learn(m_idx, DRS_FREE);
2473
2474                                         break;
2475                                 }
2476
2477                                 case RBE_LOSE_STR:
2478                                 {
2479                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2480
2481                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2482                                         if (do_dec_stat(A_STR)) obvious = TRUE;
2483
2484                                         break;
2485                                 }
2486
2487                                 case RBE_LOSE_INT:
2488                                 {
2489                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2490
2491                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2492                                         if (do_dec_stat(A_INT)) obvious = TRUE;
2493
2494                                         break;
2495                                 }
2496
2497                                 case RBE_LOSE_WIS:
2498                                 {
2499                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2500
2501                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2502                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
2503
2504                                         break;
2505                                 }
2506
2507                                 case RBE_LOSE_DEX:
2508                                 {
2509                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2510
2511                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2512                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
2513
2514                                         break;
2515                                 }
2516
2517                                 case RBE_LOSE_CON:
2518                                 {
2519                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2520
2521                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2522                                         if (do_dec_stat(A_CON)) obvious = TRUE;
2523
2524                                         break;
2525                                 }
2526
2527                                 case RBE_LOSE_CHR:
2528                                 {
2529                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2530
2531                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2532                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
2533
2534                                         break;
2535                                 }
2536
2537                                 case RBE_LOSE_ALL:
2538                                 {
2539                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2540
2541                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2542
2543                                         /* Damage (stats) */
2544                                         if (do_dec_stat(A_STR)) obvious = TRUE;
2545                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
2546                                         if (do_dec_stat(A_CON)) obvious = TRUE;
2547                                         if (do_dec_stat(A_INT)) obvious = TRUE;
2548                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
2549                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
2550
2551                                         break;
2552                                 }
2553
2554                                 case RBE_SHATTER:
2555                                 {
2556                                         obvious = TRUE;
2557
2558                                         /* Hack -- Reduce damage based on the player armor class */
2559                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2560
2561                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2562
2563                                         /* Radius 8 earthquake centered at the monster */
2564                                         if (damage > 23 || explode)
2565                                         {
2566                                                 earthquake_aux(m_ptr->fy, m_ptr->fx, 8, m_idx);
2567                                         }
2568
2569                                         break;
2570                                 }
2571
2572                                 case RBE_EXP_10:
2573                                 {
2574                                         s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2575
2576                                         obvious = TRUE;
2577
2578                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2579
2580                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2581
2582                                         (void)drain_exp(d, d / 10, 95);
2583                                         break;
2584                                 }
2585
2586                                 case RBE_EXP_20:
2587                                 {
2588                                         s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2589
2590                                         obvious = TRUE;
2591
2592                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2593
2594                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2595
2596                                         (void)drain_exp(d, d / 10, 90);
2597                                         break;
2598                                 }
2599
2600                                 case RBE_EXP_40:
2601                                 {
2602                                         s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2603
2604                                         obvious = TRUE;
2605
2606                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2607
2608                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2609
2610                                         (void)drain_exp(d, d / 10, 75);
2611                                         break;
2612                                 }
2613
2614                                 case RBE_EXP_80:
2615                                 {
2616                                         s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2617
2618                                         obvious = TRUE;
2619
2620                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2621
2622                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2623
2624                                         (void)drain_exp(d, d / 10, 50);
2625                                         break;
2626                                 }
2627
2628                                 case RBE_DISEASE:
2629                                 {
2630                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2631
2632                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2633
2634                                         /* Take "poison" effect */
2635                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
2636                                         {
2637                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2638                                                 {
2639                                                         obvious = TRUE;
2640                                                 }
2641                                         }
2642
2643                                         /* Damage CON (10% chance)*/
2644                                         if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
2645                                         {
2646                                                 /* 1% chance for perm. damage */
2647                                                 bool perm = one_in_(10);
2648                                                 if (dec_stat(A_CON, randint1(10), perm))
2649                                                 {
2650                                                         msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
2651                                                         obvious = TRUE;
2652                                                 }
2653                                         }
2654
2655                                         break;
2656                                 }
2657                                 case RBE_TIME:
2658                                 {
2659                                         if (explode) break;
2660                                         if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
2661                                         {
2662                                                 switch (randint1(10))
2663                                                 {
2664                                                         case 1: case 2: case 3: case 4: case 5:
2665                                                         {
2666                                                                 if (p_ptr->prace == RACE_ANDROID) break;
2667                                                                 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
2668                                                                 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
2669                                                                 break;
2670                                                         }
2671
2672                                                         case 6: case 7: case 8: case 9:
2673                                                         {
2674                                                                 int stat = randint0(6);
2675
2676                                                                 switch (stat)
2677                                                                 {
2678 #ifdef JP
2679                                                                         case A_STR: act = "強く"; break;
2680                                                                         case A_INT: act = "聡明で"; break;
2681                                                                         case A_WIS: act = "賢明で"; break;
2682                                                                         case A_DEX: act = "器用で"; break;
2683                                                                         case A_CON: act = "健康で"; break;
2684                                                                         case A_CHR: act = "美しく"; break;
2685 #else
2686                                                                         case A_STR: act = "strong"; break;
2687                                                                         case A_INT: act = "bright"; break;
2688                                                                         case A_WIS: act = "wise"; break;
2689                                                                         case A_DEX: act = "agile"; break;
2690                                                                         case A_CON: act = "hale"; break;
2691                                                                         case A_CHR: act = "beautiful"; break;
2692 #endif
2693
2694                                                                 }
2695
2696                                                                 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
2697                                                                 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
2698                                                                 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
2699                                                                 p_ptr->update |= (PU_BONUS);
2700                                                                 break;
2701                                                         }
2702
2703                                                         case 10:
2704                                                         {
2705                                                                 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
2706
2707                                                                 for (k = 0; k < 6; k++)
2708                                                                 {
2709                                                                         p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
2710                                                                         if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
2711                                                                 }
2712                                                                 p_ptr->update |= (PU_BONUS);
2713                                                                 break;
2714                                                         }
2715                                                 }
2716                                         }
2717                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2718
2719                                         break;
2720                                 }
2721                                 case RBE_DR_LIFE:
2722                                 {
2723                                         s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
2724                                         bool resist_drain;
2725
2726                                         obvious = TRUE;
2727
2728                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2729
2730                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2731
2732                                         resist_drain = !drain_exp(d, d / 10, 50);
2733
2734                                         /* Heal the attacker? */
2735                                         if (p_ptr->mimic_form)
2736                                         {
2737                                                 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
2738                                                         resist_drain = TRUE;
2739                                         }
2740                                         else
2741                                         {
2742                                                 switch (p_ptr->prace)
2743                                                 {
2744                                                 case RACE_ZOMBIE:
2745                                                 case RACE_VAMPIRE:
2746                                                 case RACE_SPECTRE:
2747                                                 case RACE_SKELETON:
2748                                                 case RACE_DEMON:
2749                                                 case RACE_GOLEM:
2750                                                 case RACE_ANDROID:
2751                                                         resist_drain = TRUE;
2752                                                         break;
2753                                                 }
2754                                         }
2755
2756                                         if ((damage > 5) && !resist_drain)
2757                                         {
2758                                                 bool did_heal = FALSE;
2759
2760                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
2761
2762                                                 /* Heal */
2763                                                 m_ptr->hp += damroll(4, damage / 6);
2764                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
2765
2766                                                 /* Redraw (later) if needed */
2767                                                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2768                                                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2769
2770                                                 /* Special message */
2771                                                 if (m_ptr->ml && did_heal)
2772                                                 {
2773                                                         msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
2774                                                 }
2775                                         }
2776
2777                                         break;
2778                                 }
2779                                 case RBE_DR_MANA:
2780                                 {
2781                                         obvious = TRUE;
2782
2783                                         if (CHECK_MULTISHADOW())
2784                                         {
2785                                                 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
2786                                         }
2787                                         else
2788                                         {
2789                                                 do_cut = 0;
2790
2791                                                 p_ptr->csp -= damage;
2792                                                 if (p_ptr->csp < 0)
2793                                                 {
2794                                                         p_ptr->csp = 0;
2795                                                         p_ptr->csp_frac = 0;
2796                                                 }
2797
2798                                                 p_ptr->redraw |= (PR_MANA);
2799                                         }
2800
2801                                         /* Learn about the player */
2802                                         update_smart_learn(m_idx, DRS_MANA);
2803
2804                                         break;
2805                                 }
2806                                 case RBE_INERTIA:
2807                                 {
2808                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2809
2810                                         if (p_ptr->is_dead) break;
2811
2812                                         /* Decrease speed */
2813                                         if (CHECK_MULTISHADOW())
2814                                         {
2815                                                 /* Do nothing */
2816                                         }
2817                                         else
2818                                         {
2819                                                 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
2820                                                 {
2821                                                         obvious = TRUE;
2822                                                 }
2823                                         }
2824
2825                                         break;
2826                                 }
2827                                 case RBE_STUN:
2828                                 {
2829                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2830
2831                                         if (p_ptr->is_dead) break;
2832
2833                                         /* Decrease speed */
2834                                         if (p_ptr->resist_sound || CHECK_MULTISHADOW())
2835                                         {
2836                                                 /* Do nothing */
2837                                         }
2838                                         else
2839                                         {
2840                                                 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
2841                                                 {
2842                                                         obvious = TRUE;
2843                                                 }
2844                                         }
2845
2846                                         break;
2847                                 }
2848                         }
2849
2850                         /* Hack -- only one of cut or stun */
2851                         if (do_cut && do_stun)
2852                         {
2853                                 /* Cancel cut */
2854                                 if (randint0(100) < 50)
2855                                 {
2856                                         do_cut = 0;
2857                                 }
2858
2859                                 /* Cancel stun */
2860                                 else
2861                                 {
2862                                         do_stun = 0;
2863                                 }
2864                         }
2865
2866                         /* Handle cut */
2867                         if (do_cut)
2868                         {
2869                                 int cut_plus = 0;
2870
2871                                 /* Critical hit (zero if non-critical) */
2872                                 tmp = monster_critical(d_dice, d_side, damage);
2873
2874                                 /* Roll for damage */
2875                                 switch (tmp)
2876                                 {
2877                                         case 0: cut_plus = 0; break;
2878                                         case 1: cut_plus = randint1(5); break;
2879                                         case 2: cut_plus = randint1(5) + 5; break;
2880                                         case 3: cut_plus = randint1(20) + 20; break;
2881                                         case 4: cut_plus = randint1(50) + 50; break;
2882                                         case 5: cut_plus = randint1(100) + 100; break;
2883                                         case 6: cut_plus = 300; break;
2884                                         default: cut_plus = 500; break;
2885                                 }
2886
2887                                 /* Apply the cut */
2888                                 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
2889                         }
2890
2891                         /* Handle stun */
2892                         if (do_stun)
2893                         {
2894                                 int stun_plus = 0;
2895
2896                                 /* Critical hit (zero if non-critical) */
2897                                 tmp = monster_critical(d_dice, d_side, damage);
2898
2899                                 /* Roll for damage */
2900                                 switch (tmp)
2901                                 {
2902                                         case 0: stun_plus = 0; break;
2903                                         case 1: stun_plus = randint1(5); break;
2904                                         case 2: stun_plus = randint1(5) + 10; break;
2905                                         case 3: stun_plus = randint1(10) + 20; break;
2906                                         case 4: stun_plus = randint1(15) + 30; break;
2907                                         case 5: stun_plus = randint1(20) + 40; break;
2908                                         case 6: stun_plus = 80; break;
2909                                         default: stun_plus = 150; break;
2910                                 }
2911
2912                                 /* Apply the stun */
2913                                 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
2914                         }
2915
2916                         if (explode)
2917                         {
2918                                 sound(SOUND_EXPLODE);
2919
2920                                 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
2921                                 {
2922                                         blinked = FALSE;
2923                                         alive = FALSE;
2924                                 }
2925                         }
2926
2927                         if (touched)
2928                         {
2929                                 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
2930                                 {
2931                                         if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
2932                                         {
2933                                                 HIT_POINT dam = damroll(2, 6);
2934
2935                                                 /* Modify the damage */
2936                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2937
2938 #ifdef JP
2939                                                 msg_format("%^sは突然熱くなった!", m_name);
2940                                                 if (mon_take_hit(m_idx, dam, &fear,
2941                                                     "は灰の山になった。"))
2942 #else
2943                                                 msg_format("%^s is suddenly very hot!", m_name);
2944
2945                                                 if (mon_take_hit(m_idx, dam, &fear,
2946                                                     " turns into a pile of ash."))
2947 #endif
2948
2949                                                 {
2950                                                         blinked = FALSE;
2951                                                         alive = FALSE;
2952                                                 }
2953                                         }
2954                                         else
2955                                         {
2956                                                 if (is_original_ap_and_seen(m_ptr))
2957                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
2958                                         }
2959                                 }
2960
2961                                 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
2962                                 {
2963                                         if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
2964                                         {
2965                                                 HIT_POINT dam = damroll(2, 6);
2966
2967                                                 /* Modify the damage */
2968                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
2969
2970 #ifdef JP
2971                                                 msg_format("%^sは電撃をくらった!", m_name);
2972                                                 if (mon_take_hit(m_idx, dam, &fear,
2973                                                     "は燃え殻の山になった。"))
2974 #else
2975                                                 msg_format("%^s gets zapped!", m_name);
2976
2977                                                 if (mon_take_hit(m_idx, dam, &fear,
2978                                                     " turns into a pile of cinder."))
2979 #endif
2980
2981                                                 {
2982                                                         blinked = FALSE;
2983                                                         alive = FALSE;
2984                                                 }
2985                                         }
2986                                         else
2987                                         {
2988                                                 if (is_original_ap_and_seen(m_ptr))
2989                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
2990                                         }
2991                                 }
2992
2993                                 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
2994                                 {
2995                                         if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
2996                                         {
2997                                                 HIT_POINT dam = damroll(2, 6);
2998
2999                                                 /* Modify the damage */
3000                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3001
3002 #ifdef JP
3003                                                 msg_format("%^sは冷気をくらった!", m_name);
3004                                                 if (mon_take_hit(m_idx, dam, &fear,
3005                                                     "は凍りついた。"))
3006 #else
3007                                                 msg_format("%^s is very cold!", m_name);
3008
3009                                                 if (mon_take_hit(m_idx, dam, &fear,
3010                                                     " was frozen."))
3011 #endif
3012
3013                                                 {
3014                                                         blinked = FALSE;
3015                                                         alive = FALSE;
3016                                                 }
3017                                         }
3018                                         else
3019                                         {
3020                                                 if (is_original_ap_and_seen(m_ptr))
3021                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3022                                         }
3023                                 }
3024
3025                                 /* by henkma */
3026                                 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3027                                 {
3028                                         if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3029                                         {
3030                                                 HIT_POINT dam = damroll(2, 6);
3031
3032                                                 /* Modify the damage */
3033                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3034
3035 #ifdef JP
3036                                                 msg_format("%^sは鏡の破片をくらった!", m_name);
3037                                                 if (mon_take_hit(m_idx, dam, &fear,
3038                                                     "はズタズタになった。"))
3039 #else
3040                                                 msg_format("%^s gets zapped!", m_name);
3041
3042                                                 if (mon_take_hit(m_idx, dam, &fear,
3043                                                     " had torn to pieces."))
3044 #endif
3045                                                 {
3046                                                         blinked = FALSE;
3047                                                         alive = FALSE;
3048                                                 }
3049                                         }
3050                                         else
3051                                         {
3052                                                 if (is_original_ap_and_seen(m_ptr))
3053                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3054                                         }
3055
3056                                         if (is_mirror_grid(&cave[p_ptr->y][p_ptr->x]))
3057                                         {
3058                                                 teleport_player(10, 0L);
3059                                         }
3060                                 }
3061
3062                                 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3063                                 {
3064                                         if (r_ptr->flags3 & RF3_EVIL)
3065                                         {
3066                                                 if (!(r_ptr->flagsr & RFR_RES_ALL))
3067                                                 {
3068                                                         HIT_POINT dam = damroll(2, 6);
3069
3070                                                         /* Modify the damage */
3071                                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
3072
3073 #ifdef JP
3074                                                         msg_format("%^sは聖なるオーラで傷ついた!", m_name);
3075                                                         if (mon_take_hit(m_idx, dam, &fear,
3076                                                             "は倒れた。"))
3077 #else
3078                                                         msg_format("%^s is injured by holy power!", m_name);
3079
3080                                                         if (mon_take_hit(m_idx, dam, &fear,
3081                                                             " is destroyed."))
3082 #endif
3083                                                         {
3084                                                                 blinked = FALSE;
3085                                                                 alive = FALSE;
3086                                                         }
3087                                                         if (is_original_ap_and_seen(m_ptr))
3088                                                                 r_ptr->r_flags3 |= RF3_EVIL;
3089                                                 }
3090                                                 else
3091                                                 {
3092                                                         if (is_original_ap_and_seen(m_ptr))
3093                                                                 r_ptr->r_flagsr |= RFR_RES_ALL;
3094                                                 }
3095                                         }
3096                                 }
3097
3098                                 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3099                                 {
3100                                         if (!(r_ptr->flagsr & RFR_RES_ALL))
3101                                         {
3102                                                 HIT_POINT dam = damroll(2, 6);
3103
3104                                                 /* Modify the damage */
3105                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3106
3107 #ifdef JP
3108                                                 msg_format("%^sが鋭い闘気のオーラで傷ついた!", m_name);
3109                                                 if (mon_take_hit(m_idx, dam, &fear,
3110                                                     "は倒れた。"))
3111 #else
3112                                                 msg_format("%^s is injured by the Force", m_name);
3113
3114                                                 if (mon_take_hit(m_idx, dam, &fear,
3115                                                     " is destroyed."))
3116 #endif
3117
3118                                                 {
3119                                                         blinked = FALSE;
3120                                                         alive = FALSE;
3121                                                 }
3122                                         }
3123                                         else
3124                                         {
3125                                                 if (is_original_ap_and_seen(m_ptr))
3126                                                         r_ptr->r_flagsr |= RFR_RES_ALL;
3127                                         }
3128                                 }
3129
3130                                 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3131                                 {
3132                                         HIT_POINT dam = 1;
3133                                         object_type *o_armed_ptr = &inventory[INVEN_RARM];
3134
3135                                         if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3136                                         {
3137                                                 if (o_armed_ptr->k_idx)
3138                                                 {
3139                                                         int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3140                                                         dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3141                                                 }
3142
3143                                                 /* Cursed armor makes damages doubled */
3144                                                 o_armed_ptr = &inventory[INVEN_BODY];
3145                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3146
3147                                                 /* Modify the damage */
3148                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3149
3150 #ifdef JP
3151                                                 msg_format("影のオーラが%^sに反撃した!", m_name);
3152                                                 if (mon_take_hit(m_idx, dam, &fear, "は倒れた。"))
3153 #else
3154                                                 msg_format("Enveloped shadows attack %^s.", m_name);
3155
3156                                                 if (mon_take_hit(m_idx, dam, &fear, " is destroyed."))
3157 #endif
3158                                                 {
3159                                                         blinked = FALSE;
3160                                                         alive = FALSE;
3161                                                 }
3162                                                 else /* monster does not dead */
3163                                                 {
3164                                                         int j;
3165                                                         BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3166                                                         EFFECT_ID typ[4][2] = {
3167                                                                 { INVEN_HEAD, GF_OLD_CONF },
3168                                                                 { INVEN_LARM,  GF_OLD_SLEEP },
3169                                                                 { INVEN_HANDS, GF_TURN_ALL },
3170                                                                 { INVEN_FEET, GF_OLD_SLOW }
3171                                                         };
3172
3173                                                         /* Some cursed armours gives an extra effect */
3174                                                         for (j = 0; j < 4; j++)
3175                                                         {
3176                                                                 o_armed_ptr = &inventory[typ[j][0]];
3177                                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3178                                                                         project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3179                                                         }
3180                                                 }
3181                                         }
3182                                         else
3183                                         {
3184                                                 if (is_original_ap_and_seen(m_ptr))
3185                                                         r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3186                                         }
3187                                 }
3188                         }
3189                 }
3190
3191                 /* Monster missed player */
3192                 else
3193                 {
3194                         /* Analyze failed attacks */
3195                         switch (method)
3196                         {
3197                                 case RBM_HIT:
3198                                 case RBM_TOUCH:
3199                                 case RBM_PUNCH:
3200                                 case RBM_KICK:
3201                                 case RBM_CLAW:
3202                                 case RBM_BITE:
3203                                 case RBM_STING:
3204                                 case RBM_SLASH:
3205                                 case RBM_BUTT:
3206                                 case RBM_CRUSH:
3207                                 case RBM_ENGULF:
3208                                 case RBM_CHARGE:
3209
3210                                 /* Visible monsters */
3211                                 if (m_ptr->ml)
3212                                 {
3213                                         /* Disturbing */
3214                                         disturb(TRUE, TRUE);
3215
3216 #ifdef JP
3217                                         if (abbreviate)
3218                                             msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3219                                         else
3220                                             msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3221                                         abbreviate = 1;/*2回目以降は省略 */
3222 #else
3223                                         msg_format("%^s misses you.", m_name);
3224 #endif
3225
3226                                 }
3227                                 damage = 0;
3228
3229                                 break;
3230                         }
3231                 }
3232
3233
3234                 /* Analyze "visible" monsters only */
3235                 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
3236                 {
3237                         /* Count "obvious" attacks (and ones that cause damage) */
3238                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
3239                         {
3240                                 /* Count attacks of this type */
3241                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
3242                                 {
3243                                         r_ptr->r_blows[ap_cnt]++;
3244                                 }
3245                         }
3246                 }
3247
3248                 if (p_ptr->riding && damage)
3249                 {
3250                         char m_steed_name[80];
3251                         monster_desc(m_steed_name, &m_list[p_ptr->riding], 0);
3252                         if (rakuba((damage > 200) ? 200 : damage, FALSE))
3253                         {
3254                                 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
3255                         }
3256                 }
3257
3258                 if (p_ptr->special_defense & NINJA_KAWARIMI)
3259                 {
3260                         if (kawarimi(FALSE)) return TRUE;
3261                 }
3262         }
3263
3264         /* Hex - revenge damage stored */
3265         revenge_store(get_damage);
3266
3267         if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
3268                 && get_damage > 0 && !p_ptr->is_dead)
3269         {
3270 #ifdef JP
3271                 msg_format("攻撃が%s自身を傷つけた!", m_name);
3272 #else
3273                 char m_name_self[80];
3274
3275                 /* hisself */
3276                 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
3277
3278                 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
3279 #endif
3280                 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
3281                 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
3282         }
3283
3284         if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
3285         {
3286                 char m_target_name[80];
3287                 monster_desc(m_target_name, m_ptr, 0);
3288
3289                 p_ptr->csp -= 7;
3290                 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
3291                 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
3292                 fear = FALSE;
3293
3294                 /* Redraw mana */
3295                 p_ptr->redraw |= (PR_MANA);
3296         }
3297
3298         /* Blink away */
3299         if (blinked && alive && !p_ptr->is_dead)
3300         {
3301                 if (teleport_barrier(m_idx))
3302                 {
3303                         msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
3304                 }
3305                 else
3306                 {
3307                         msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
3308                         teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
3309                 }
3310         }
3311
3312
3313         /* Always notice cause of death */
3314         if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
3315         {
3316                 r_ptr->r_deaths++;
3317         }
3318
3319         if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
3320         {
3321                 sound(SOUND_FLEE);
3322                 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
3323         }
3324
3325         if (p_ptr->special_defense & KATA_IAI)
3326         {
3327                 set_action(ACTION_NONE);
3328         }
3329
3330         /* Assume we attacked */
3331         return (TRUE);
3332 }