OSDN Git Service

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