OSDN Git Service

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