OSDN Git Service

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