OSDN Git Service

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