OSDN Git Service

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