OSDN Git Service

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