OSDN Git Service

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