OSDN Git Service

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