OSDN Git Service

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