OSDN Git Service

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