OSDN Git Service

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