OSDN Git Service

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