OSDN Git Service

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