OSDN Git Service

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