OSDN Git Service

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