OSDN Git Service

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