OSDN Git Service

[Refactor] #38997 melee1.c、grid.c、load.c、save.c 内変数参照修正 / Fixed variable references...
[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(touched_ptr);
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 attacker_ptr プレーヤーへの参照ポインタ
1143 * @param m_idx 攻撃目標となったモンスターの参照ID
1144 * @param attack 変異要素による攻撃要素の種類
1145 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1146 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1147 * @return なし
1148 */
1149 static void natural_attack(player_type *attacker_ptr, MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1150 {
1151         HIT_POINT k;
1152         int bonus, chance;
1153         WEIGHT n_weight = 0;
1154         monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[m_idx];
1155         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1156         GAME_TEXT m_name[MAX_NLEN];
1157
1158         int dice_num, dice_side;
1159
1160         concptr atk_desc;
1161
1162         switch (attack)
1163         {
1164         case MUT2_SCOR_TAIL:
1165                 dice_num = 3;
1166                 dice_side = 7;
1167                 n_weight = 5;
1168                 atk_desc = _("尻尾", "tail");
1169
1170                 break;
1171         case MUT2_HORNS:
1172                 dice_num = 2;
1173                 dice_side = 6;
1174                 n_weight = 15;
1175                 atk_desc = _("角", "horns");
1176
1177                 break;
1178         case MUT2_BEAK:
1179                 dice_num = 2;
1180                 dice_side = 4;
1181                 n_weight = 5;
1182                 atk_desc = _("クチバシ", "beak");
1183
1184                 break;
1185         case MUT2_TRUNK:
1186                 dice_num = 1;
1187                 dice_side = 4;
1188                 n_weight = 35;
1189                 atk_desc = _("象の鼻", "trunk");
1190
1191                 break;
1192         case MUT2_TENTACLES:
1193                 dice_num = 2;
1194                 dice_side = 5;
1195                 n_weight = 5;
1196                 atk_desc = _("触手", "tentacles");
1197
1198                 break;
1199         default:
1200                 dice_num = dice_side = n_weight = 1;
1201                 atk_desc = _("未定義の部位", "undefined body part");
1202
1203         }
1204
1205         monster_desc(m_name, m_ptr, 0);
1206
1207         /* Calculate the "attack quality" */
1208         bonus = attacker_ptr->to_h_m + (attacker_ptr->lev * 6 / 5);
1209         chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1210
1211         /* Test for hit */
1212         if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1213         {
1214                 sound(SOUND_HIT);
1215                 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1216
1217                 k = damroll(dice_num, dice_side);
1218                 k = critical_norm(attacker_ptr, n_weight, bonus, k, (s16b)bonus, 0);
1219
1220                 /* Apply the player damage bonuses */
1221                 k += attacker_ptr->to_d_m;
1222
1223                 /* No negative damage */
1224                 if (k < 0) k = 0;
1225
1226                 /* Modify the damage */
1227                 k = mon_damage_mod(m_ptr, k, FALSE);
1228
1229                 /* Complex message */
1230                 msg_format_wizard(CHEAT_MONSTER,
1231                         _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1232                         k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1233
1234                 /* Anger the monster */
1235                 if (k > 0) anger_monster(m_ptr);
1236
1237                 /* Damage, check for fear and mdeath */
1238                 switch (attack)
1239                 {
1240                 case MUT2_SCOR_TAIL:
1241                         project(attacker_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1242                         *mdeath = (m_ptr->r_idx == 0);
1243                         break;
1244                 case MUT2_HORNS:
1245                         *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1246                         break;
1247                 case MUT2_BEAK:
1248                         *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1249                         break;
1250                 case MUT2_TRUNK:
1251                         *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1252                         break;
1253                 case MUT2_TENTACLES:
1254                         *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1255                         break;
1256                 default:
1257                         *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1258                 }
1259
1260                 touch_zap_player(m_ptr, attacker_ptr);
1261         }
1262         /* Player misses */
1263         else
1264         {
1265                 sound(SOUND_MISS);
1266                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1267         }
1268 }
1269
1270 /*!
1271 * @brief プレイヤーの打撃処理サブルーチン /
1272 * Player attacks a (poor, defenseless) creature        -RAK-
1273 * @param y 攻撃目標のY座標
1274 * @param x 攻撃目標のX座標
1275 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1276 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1277 * @param hand 攻撃を行うための武器を持つ手
1278 * @param mode 発動中の剣術ID
1279 * @return なし
1280 * @details
1281 * If no "weapon" is available, then "punch" the monster one time.
1282 */
1283 static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1284 {
1285         int num = 0, bonus, chance, vir;
1286         HIT_POINT k;
1287
1288         floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
1289         grid_type       *g_ptr = &floor_ptr->grid_array[y][x];
1290
1291         monster_type    *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
1292         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
1293
1294         /* Access the weapon */
1295         object_type     *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + hand];
1296
1297         GAME_TEXT m_name[MAX_NLEN];
1298
1299         bool            success_hit = FALSE;
1300         bool            backstab = FALSE;
1301         bool            vorpal_cut = FALSE;
1302         int             chaos_effect = 0;
1303         bool            stab_fleeing = FALSE;
1304         bool            fuiuchi = FALSE;
1305         bool            monk_attack = FALSE;
1306         bool            do_quake = FALSE;
1307         bool            weak = FALSE;
1308         bool            drain_msg = TRUE;
1309         int             drain_result = 0, drain_heal = 0;
1310         bool            can_drain = FALSE;
1311         int             num_blow;
1312         int             drain_left = MAX_VAMPIRIC_DRAIN;
1313         BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1314         bool            is_human = (r_ptr->d_char == 'p');
1315         bool            is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
1316         bool            zantetsu_mukou, e_j_mukou;
1317
1318         switch (attacker_ptr->pclass)
1319         {
1320         case CLASS_ROGUE:
1321         case CLASS_NINJA:
1322                 if (has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand])
1323                 {
1324                         int tmp = attacker_ptr->lev * 6 + (attacker_ptr->skill_stl + 10) * 4;
1325                         if (attacker_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1326                         if (attacker_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1327                         if (r_ptr->level > (attacker_ptr->lev * attacker_ptr->lev / 20 + 10)) tmp /= 3;
1328                         if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1329                         {
1330                                 /* Can't backstab creatures that we can't see, right? */
1331                                 backstab = TRUE;
1332                         }
1333                         else if ((attacker_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1334                         {
1335                                 fuiuchi = TRUE;
1336                         }
1337                         else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1338                         {
1339                                 stab_fleeing = TRUE;
1340                         }
1341                 }
1342                 break;
1343
1344         case CLASS_MONK:
1345         case CLASS_FORCETRAINER:
1346         case CLASS_BERSERKER:
1347                 if ((empty_hands(attacker_ptr, TRUE) & EMPTY_HAND_RARM) && !attacker_ptr->riding) monk_attack = TRUE;
1348                 break;
1349         }
1350
1351         if (!o_ptr->k_idx) /* Empty hand */
1352         {
1353                 if ((r_ptr->level + 10) > attacker_ptr->lev)
1354                 {
1355                         if (attacker_ptr->skill_exp[GINOU_SUDE] < s_info[attacker_ptr->pclass].s_max[GINOU_SUDE])
1356                         {
1357                                 if (attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1358                                         attacker_ptr->skill_exp[GINOU_SUDE] += 40;
1359                                 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1360                                         attacker_ptr->skill_exp[GINOU_SUDE] += 5;
1361                                 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19))
1362                                         attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1363                                 else if ((attacker_ptr->lev > 34))
1364                                         if (one_in_(3)) attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1365                                 attacker_ptr->update |= (PU_BONUS);
1366                         }
1367                 }
1368         }
1369         else if (object_is_melee_weapon(o_ptr))
1370         {
1371                 if ((r_ptr->level + 10) > attacker_ptr->lev)
1372                 {
1373                         OBJECT_TYPE_VALUE tval = attacker_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1374                         OBJECT_SUBTYPE_VALUE sval = attacker_ptr->inventory_list[INVEN_RARM + hand].sval;
1375                         int now_exp = attacker_ptr->weapon_exp[tval][sval];
1376                         if (now_exp < s_info[attacker_ptr->pclass].w_max[tval][sval])
1377                         {
1378                                 SUB_EXP amount = 0;
1379                                 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1380                                 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1381                                 else if ((now_exp < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19)) amount = 1;
1382                                 else if ((attacker_ptr->lev > 34) && one_in_(2)) amount = 1;
1383                                 attacker_ptr->weapon_exp[tval][sval] += amount;
1384                                 attacker_ptr->update |= (PU_BONUS);
1385                         }
1386                 }
1387         }
1388
1389         /* Disturb the monster */
1390         (void)set_monster_csleep(g_ptr->m_idx, 0);
1391
1392         monster_desc(m_name, m_ptr, 0);
1393
1394         /* Calculate the "attack quality" */
1395         bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
1396         chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1397         if (mode == HISSATSU_IAI) chance += 60;
1398         if (attacker_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1399         if (attacker_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1400
1401         vir = virtue_number(attacker_ptr, V_VALOUR);
1402         if (vir)
1403         {
1404                 chance += (attacker_ptr->virtues[vir - 1] / 10);
1405         }
1406
1407         zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1408         e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1409
1410         if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1411         else if (mode == HISSATSU_COLD) num_blow = attacker_ptr->num_blow[hand] + 2;
1412         else num_blow = attacker_ptr->num_blow[hand];
1413
1414         /* Hack -- DOKUBARI always hit once */
1415         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) num_blow = 1;
1416
1417         /* Attack once for each legal blow */
1418         while ((num++ < num_blow) && !attacker_ptr->is_dead)
1419         {
1420                 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1421                 {
1422                         int n = 1;
1423
1424                         if (attacker_ptr->migite && attacker_ptr->hidarite)
1425                         {
1426                                 n *= 2;
1427                         }
1428                         if (mode == HISSATSU_3DAN)
1429                         {
1430                                 n *= 2;
1431                         }
1432
1433                         success_hit = one_in_(n);
1434                 }
1435                 else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1436                 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1437
1438                 if (mode == HISSATSU_MAJIN)
1439                 {
1440                         if (one_in_(2))
1441                                 success_hit = FALSE;
1442                 }
1443
1444                 /* Test for hit */
1445                 if (success_hit)
1446                 {
1447                         int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1448
1449                         sound(SOUND_HIT);
1450
1451                         if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1452                         else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1453                         else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1454                         else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1455
1456                         /* Hack -- bare hands do one damage */
1457                         k = 1;
1458
1459                         object_flags(o_ptr, flgs);
1460
1461                         /* Select a chaotic effect (50% chance) */
1462                         if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1463                         {
1464                                 if (one_in_(10))
1465                                         chg_virtue(attacker_ptr, V_CHANCE, 1);
1466
1467                                 if (randint1(5) < 3)
1468                                 {
1469                                         /* Vampiric (20%) */
1470                                         chaos_effect = 1;
1471                                 }
1472                                 else if (one_in_(250))
1473                                 {
1474                                         /* Quake (0.12%) */
1475                                         chaos_effect = 2;
1476                                 }
1477                                 else if (!one_in_(10))
1478                                 {
1479                                         /* Confusion (26.892%) */
1480                                         chaos_effect = 3;
1481                                 }
1482                                 else if (one_in_(2))
1483                                 {
1484                                         /* Teleport away (1.494%) */
1485                                         chaos_effect = 4;
1486                                 }
1487                                 else
1488                                 {
1489                                         /* Polymorph (1.494%) */
1490                                         chaos_effect = 5;
1491                                 }
1492                         }
1493
1494                         /* Vampiric drain */
1495                         if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1496                         {
1497                                 /* Only drain "living" monsters */
1498                                 if (monster_living(m_ptr->r_idx))
1499                                         can_drain = TRUE;
1500                                 else
1501                                         can_drain = FALSE;
1502                         }
1503
1504                         if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1505                                 vorpal_cut = TRUE;
1506                         else vorpal_cut = FALSE;
1507
1508                         if (monk_attack)
1509                         {
1510                                 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1511                                 int min_level = 1;
1512                                 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1513                                 int resist_stun = 0;
1514                                 WEIGHT weight = 8;
1515
1516                                 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1517                                 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1518                                 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1519                                 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1520                                 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1521                                         resist_stun += 66;
1522
1523                                 if (attacker_ptr->special_defense & KAMAE_BYAKKO)
1524                                         max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
1525                                 else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
1526                                         max_times = 1;
1527                                 else if (attacker_ptr->special_defense & KAMAE_GENBU)
1528                                         max_times = 1;
1529                                 else
1530                                         max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
1531                                 /* Attempt 'times' */
1532                                 for (times = 0; times < max_times; times++)
1533                                 {
1534                                         do
1535                                         {
1536                                                 ma_ptr = &ma_blows[randint0(MAX_MA)];
1537                                                 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1538                                                 else min_level = ma_ptr->min_level;
1539                                         } while ((min_level > attacker_ptr->lev) ||
1540                                                 (randint1(attacker_ptr->lev) < ma_ptr->chance));
1541
1542                                         /* keep the highest level attack available we found */
1543                                         if ((ma_ptr->min_level > old_ptr->min_level) &&
1544                                                 !attacker_ptr->stun && !attacker_ptr->confused)
1545                                         {
1546                                                 old_ptr = ma_ptr;
1547
1548                                                 if (current_world_ptr->wizard && cheat_xtra)
1549                                                 {
1550                                                         msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1551                                                 }
1552                                         }
1553                                         else
1554                                         {
1555                                                 ma_ptr = old_ptr;
1556                                         }
1557                                 }
1558
1559                                 if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1560                                 else min_level = ma_ptr->min_level;
1561                                 k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
1562                                 if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1563
1564                                 if (ma_ptr->effect == MA_KNEE)
1565                                 {
1566                                         if (r_ptr->flags1 & RF1_MALE)
1567                                         {
1568                                                 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1569                                                 sound(SOUND_PAIN);
1570                                                 special_effect = MA_KNEE;
1571                                         }
1572                                         else
1573                                                 msg_format(ma_ptr->desc, m_name);
1574                                 }
1575
1576                                 else if (ma_ptr->effect == MA_SLOW)
1577                                 {
1578                                         if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1579                                                 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1580                                         {
1581                                                 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1582                                                 special_effect = MA_SLOW;
1583                                         }
1584                                         else msg_format(ma_ptr->desc, m_name);
1585                                 }
1586                                 else
1587                                 {
1588                                         if (ma_ptr->effect)
1589                                         {
1590                                                 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1591                                         }
1592
1593                                         msg_format(ma_ptr->desc, m_name);
1594                                 }
1595
1596                                 if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1597                                 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1598                                 {
1599                                         weight += (P_PTR_KI / 30);
1600                                         if (weight > 20) weight = 20;
1601                                 }
1602
1603                                 k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
1604
1605                                 if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1606                                 {
1607                                         msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1608                                         stun_effect = 7 + randint1(13);
1609                                         resist_stun /= 3;
1610                                 }
1611
1612                                 else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1613                                 {
1614                                         if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1615                                                 (randint1(attacker_ptr->lev) > r_ptr->level) &&
1616                                                 m_ptr->mspeed > 60)
1617                                         {
1618                                                 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1619                                                 m_ptr->mspeed -= 10;
1620                                         }
1621                                 }
1622
1623                                 if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1624                                 {
1625                                         if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1626                                         {
1627                                                 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1628                                                 {
1629                                                         msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1630                                                 }
1631                                                 else
1632                                                 {
1633                                                         msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1634                                                 }
1635                                         }
1636                                 }
1637                         }
1638
1639                         /* Handle normal weapon */
1640                         else if (o_ptr->k_idx)
1641                         {
1642                                 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1643                                 k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
1644
1645                                 if (backstab)
1646                                 {
1647                                         k *= (3 + (attacker_ptr->lev / 20));
1648                                 }
1649                                 else if (fuiuchi)
1650                                 {
1651                                         k = k*(5 + (attacker_ptr->lev * 2 / 25)) / 2;
1652                                 }
1653                                 else if (stab_fleeing)
1654                                 {
1655                                         k = (3 * k) / 2;
1656                                 }
1657
1658                                 if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1659                                         (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1660                                 {
1661                                         do_quake = TRUE;
1662                                 }
1663
1664                                 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(mode == HISSATSU_KYUSHO))
1665                                         k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1666
1667                                 drain_result = k;
1668
1669                                 if (vorpal_cut)
1670                                 {
1671                                         int mult = 2;
1672
1673                                         if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1674                                         {
1675                                                 char chainsword_noise[1024];
1676                                                 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1677                                                 {
1678                                                         msg_print(chainsword_noise);
1679                                                 }
1680                                         }
1681
1682                                         if (o_ptr->name1 == ART_VORPAL_BLADE)
1683                                         {
1684                                                 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1685                                         }
1686                                         else
1687                                         {
1688                                                 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1689                                         }
1690
1691                                         /* Try to increase the damage */
1692                                         while (one_in_(vorpal_chance))
1693                                         {
1694                                                 mult++;
1695                                         }
1696
1697                                         k *= (HIT_POINT)mult;
1698
1699                                         /* Ouch! */
1700                                         if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1701                                         {
1702                                                 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1703                                         }
1704                                         else
1705                                         {
1706                                                 switch (mult)
1707                                                 {
1708                                                 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1709                                                 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1710                                                 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1711                                                 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1712                                                 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1713                                                 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1714                                                 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1715                                                 }
1716                                         }
1717                                         drain_result = drain_result * 3 / 2;
1718                                 }
1719
1720                                 k += o_ptr->to_d;
1721                                 drain_result += o_ptr->to_d;
1722                         }
1723
1724                         /* Apply the player damage bonuses */
1725                         k += attacker_ptr->to_d[hand];
1726                         drain_result += attacker_ptr->to_d[hand];
1727
1728                         if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1729                         if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1730                         if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
1731
1732                         /* No negative damage */
1733                         if (k < 0) k = 0;
1734
1735                         if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1736                         {
1737                                 k = 0;
1738                         }
1739
1740                         if (zantetsu_mukou)
1741                         {
1742                                 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1743                                 k = 0;
1744                         }
1745
1746                         if (e_j_mukou)
1747                         {
1748                                 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1749                                 k /= 2;
1750                         }
1751
1752                         if (mode == HISSATSU_MINEUCHI)
1753                         {
1754                                 int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
1755
1756                                 k = 0;
1757                                 anger_monster(m_ptr);
1758
1759                                 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1760                                 {
1761                                         /* Get stunned */
1762                                         if (MON_STUNNED(m_ptr))
1763                                         {
1764                                                 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1765                                                 tmp /= 2;
1766                                         }
1767                                         else
1768                                         {
1769                                                 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1770                                         }
1771
1772                                         /* Apply stun */
1773                                         (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1774                                 }
1775                                 else
1776                                 {
1777                                         msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1778                                 }
1779                         }
1780
1781                         /* Modify the damage */
1782                         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))));
1783                         if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1784                         {
1785                                 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1786                                 {
1787                                         k = m_ptr->hp + 1;
1788                                         msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1789                                 }
1790                                 else k = 1;
1791                         }
1792                         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)))
1793                         {
1794                                 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1795                                 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1796                                 {
1797                                         k *= 5;
1798                                         drain_result *= 2;
1799                                         msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1800                                 }
1801                                 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)))
1802                                 {
1803                                         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1804                                         {
1805                                                 k = MAX(k * 5, m_ptr->hp / 2);
1806                                                 drain_result *= 2;
1807                                                 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1808                                         }
1809                                         else
1810                                         {
1811                                                 k = m_ptr->hp + 1;
1812                                                 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1813                                         }
1814                                 }
1815                         }
1816
1817                         msg_format_wizard(CHEAT_MONSTER,
1818                                 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1819                                 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1820
1821                         if (k <= 0) can_drain = FALSE;
1822
1823                         if (drain_result > m_ptr->hp)
1824                                 drain_result = m_ptr->hp;
1825
1826                         /* Damage, check for fear and death */
1827                         if (mon_take_hit(attacker_ptr, g_ptr->m_idx, k, fear, NULL))
1828                         {
1829                                 *mdeath = TRUE;
1830                                 if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
1831                                 {
1832                                         if (attacker_ptr->migite && attacker_ptr->hidarite)
1833                                         {
1834                                                 if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
1835                                                 else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
1836                                         }
1837                                         else
1838                                         {
1839                                                 attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
1840                                         }
1841                                 }
1842                                 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1843                                         msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1844                                 break;
1845                         }
1846
1847                         /* Anger the monster */
1848                         if (k > 0) anger_monster(m_ptr);
1849
1850                         touch_zap_player(m_ptr, attacker_ptr);
1851
1852                         /* Are we draining it?  A little note: If the monster is
1853                         dead, the drain does not work... */
1854
1855                         if (can_drain && (drain_result > 0))
1856                         {
1857                                 if (o_ptr->name1 == ART_MURAMASA)
1858                                 {
1859                                         if (is_human)
1860                                         {
1861                                                 HIT_PROB to_h = o_ptr->to_h;
1862                                                 HIT_POINT to_d = o_ptr->to_d;
1863                                                 int i, flag;
1864
1865                                                 flag = 1;
1866                                                 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1867                                                 if (flag) to_h++;
1868
1869                                                 flag = 1;
1870                                                 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1871                                                 if (flag) to_d++;
1872
1873                                                 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1874                                                 {
1875                                                         msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1876                                                         o_ptr->to_h = to_h;
1877                                                         o_ptr->to_d = to_d;
1878                                                 }
1879                                         }
1880                                 }
1881                                 else
1882                                 {
1883                                         if (drain_result > 5) /* Did we really hurt it? */
1884                                         {
1885                                                 drain_heal = damroll(2, drain_result / 6);
1886
1887                                                 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1888
1889                                                 if (cheat_xtra)
1890                                                 {
1891                                                         msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1892                                                 }
1893
1894                                                 if (drain_left)
1895                                                 {
1896                                                         if (drain_heal < drain_left)
1897                                                         {
1898                                                                 drain_left -= drain_heal;
1899                                                         }
1900                                                         else
1901                                                         {
1902                                                                 drain_heal = drain_left;
1903                                                                 drain_left = 0;
1904                                                         }
1905
1906                                                         if (drain_msg)
1907                                                         {
1908                                                                 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1909                                                                 drain_msg = FALSE;
1910                                                         }
1911
1912                                                         drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
1913
1914                                                         hp_player(attacker_ptr, drain_heal);
1915                                                         /* We get to keep some of it! */
1916                                                 }
1917                                         }
1918                                 }
1919                                 m_ptr->maxhp -= (k + 7) / 8;
1920                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1921                                 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1922                                 weak = TRUE;
1923                         }
1924                         can_drain = FALSE;
1925                         drain_result = 0;
1926
1927                         /* Confusion attack */
1928                         if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1929                         {
1930                                 /* Cancel glowing hands */
1931                                 if (attacker_ptr->special_attack & ATTACK_CONFUSE)
1932                                 {
1933                                         attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
1934                                         msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1935                                         attacker_ptr->redraw |= (PR_STATUS);
1936
1937                                 }
1938
1939                                 /* Confuse the monster */
1940                                 if (r_ptr->flags3 & RF3_NO_CONF)
1941                                 {
1942                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1943                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1944
1945                                 }
1946                                 else if (randint0(100) < r_ptr->level)
1947                                 {
1948                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1949                                 }
1950                                 else
1951                                 {
1952                                         msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1953                                         (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
1954                                 }
1955                         }
1956
1957                         else if (chaos_effect == 4)
1958                         {
1959                                 bool resists_tele = FALSE;
1960
1961                                 if (r_ptr->flagsr & RFR_RES_TELE)
1962                                 {
1963                                         if (r_ptr->flags1 & RF1_UNIQUE)
1964                                         {
1965                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1966                                                 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1967                                                 resists_tele = TRUE;
1968                                         }
1969                                         else if (r_ptr->level > randint1(100))
1970                                         {
1971                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1972                                                 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1973                                                 resists_tele = TRUE;
1974                                         }
1975                                 }
1976
1977                                 if (!resists_tele)
1978                                 {
1979                                         msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1980                                         teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1981                                         num = num_blow + 1; /* Can't hit it anymore! */
1982                                         *mdeath = TRUE;
1983                                 }
1984                         }
1985
1986                         else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1987                         {
1988                                 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1989                                         !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1990                                 {
1991                                         if (polymorph_monster(attacker_ptr, y, x))
1992                                         {
1993                                                 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1994                                                 *fear = FALSE;
1995                                                 weak = FALSE;
1996                                         }
1997                                         else
1998                                         {
1999                                                 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2000                                         }
2001
2002                                         /* Hack -- Get new monster */
2003                                         m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2004
2005                                         /* Oops, we need a different name... */
2006                                         monster_desc(m_name, m_ptr, 0);
2007
2008                                         /* Hack -- Get new race */
2009                                         r_ptr = &r_info[m_ptr->r_idx];
2010                                 }
2011                         }
2012                         else if (o_ptr->name1 == ART_G_HAMMER)
2013                         {
2014                                 monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2015
2016                                 if (target_ptr->hold_o_idx)
2017                                 {
2018                                         object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
2019                                         GAME_TEXT o_name[MAX_NLEN];
2020
2021                                         object_desc(o_name, q_ptr, OD_NAME_ONLY);
2022                                         q_ptr->held_m_idx = 0;
2023                                         q_ptr->marked = OM_TOUCHED;
2024                                         target_ptr->hold_o_idx = q_ptr->next_o_idx;
2025                                         q_ptr->next_o_idx = 0;
2026                                         msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2027                                         inven_carry(attacker_ptr, q_ptr);
2028                                 }
2029                         }
2030                 }
2031
2032                 /* Player misses */
2033                 else
2034                 {
2035                         backstab = FALSE; /* Clumsy! */
2036                         fuiuchi = FALSE; /* Clumsy! */
2037
2038                         if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2039                         {
2040                                 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2041
2042                                 sound(SOUND_HIT);
2043
2044                                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2045                                 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2046                                 object_flags(o_ptr, flgs_aux);
2047
2048                                 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
2049                                 {
2050                                         int mult;
2051                                         switch (attacker_ptr->mimic_form)
2052                                         {
2053                                         case MIMIC_NONE:
2054                                                 switch (attacker_ptr->prace)
2055                                                 {
2056                                                 case RACE_YEEK:
2057                                                 case RACE_KLACKON:
2058                                                 case RACE_HUMAN:
2059                                                 case RACE_AMBERITE:
2060                                                 case RACE_DUNADAN:
2061                                                 case RACE_BARBARIAN:
2062                                                 case RACE_BEASTMAN:
2063                                                         mult = 25; break;
2064                                                 case RACE_HALF_ORC:
2065                                                 case RACE_HALF_TROLL:
2066                                                 case RACE_HALF_OGRE:
2067                                                 case RACE_HALF_GIANT:
2068                                                 case RACE_HALF_TITAN:
2069                                                 case RACE_CYCLOPS:
2070                                                 case RACE_IMP:
2071                                                 case RACE_SKELETON:
2072                                                 case RACE_ZOMBIE:
2073                                                 case RACE_VAMPIRE:
2074                                                 case RACE_SPECTRE:
2075                                                 case RACE_DEMON:
2076                                                 case RACE_DRACONIAN:
2077                                                         mult = 30; break;
2078                                                 default:
2079                                                         mult = 10; break;
2080                                                 }
2081                                                 break;
2082                                         case MIMIC_DEMON:
2083                                         case MIMIC_DEMON_LORD:
2084                                         case MIMIC_VAMPIRE:
2085                                                 mult = 30; break;
2086                                         default:
2087                                                 mult = 10; break;
2088                                         }
2089
2090                                         if (attacker_ptr->align < 0 && mult < 20)
2091                                                 mult = 20;
2092                                         if (!(attacker_ptr->resist_acid || is_oppose_acid(attacker_ptr) || attacker_ptr->immune_acid) && (mult < 25))
2093                                                 mult = 25;
2094                                         if (!(attacker_ptr->resist_elec || is_oppose_elec(attacker_ptr) || attacker_ptr->immune_elec) && (mult < 25))
2095                                                 mult = 25;
2096                                         if (!(attacker_ptr->resist_fire || is_oppose_fire(attacker_ptr) || attacker_ptr->immune_fire) && (mult < 25))
2097                                                 mult = 25;
2098                                         if (!(attacker_ptr->resist_cold || is_oppose_cold(attacker_ptr) || attacker_ptr->immune_cold) && (mult < 25))
2099                                                 mult = 25;
2100                                         if (!(attacker_ptr->resist_pois || is_oppose_pois(attacker_ptr)) && (mult < 25))
2101                                                 mult = 25;
2102
2103                                         if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp >(attacker_ptr->msp / 30)))
2104                                         {
2105                                                 attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
2106                                                 attacker_ptr->redraw |= (PR_MANA);
2107                                                 mult = mult * 3 / 2 + 20;
2108                                         }
2109                                         k *= (HIT_POINT)mult;
2110                                         k /= 10;
2111                                 }
2112
2113                                 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
2114                                 if (one_in_(6))
2115                                 {
2116                                         int mult = 2;
2117                                         msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2118                                         /* Try to increase the damage */
2119                                         while (one_in_(4))
2120                                         {
2121                                                 mult++;
2122                                         }
2123
2124                                         k *= (HIT_POINT)mult;
2125                                 }
2126                                 k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
2127                                 if (k < 0) k = 0;
2128
2129                                 take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2130                                 handle_stuff(attacker_ptr);
2131                         }
2132                         else
2133                         {
2134                                 sound(SOUND_MISS);
2135                                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2136                         }
2137                 }
2138
2139                 backstab = FALSE;
2140                 fuiuchi = FALSE;
2141         }
2142
2143
2144         if (weak && !(*mdeath))
2145         {
2146                 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2147         }
2148         if (drain_left != MAX_VAMPIRIC_DRAIN)
2149         {
2150                 if (one_in_(4))
2151                 {
2152                         chg_virtue(attacker_ptr, V_UNLIFE, 1);
2153                 }
2154         }
2155         /* Mega-Hack -- apply earthquake brand */
2156         if (do_quake)
2157         {
2158                 earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
2159                 if (!floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2160         }
2161 }
2162
2163 /*!
2164 * @brief プレイヤーの打撃処理メインルーチン
2165 * @param y 攻撃目標のY座標
2166 * @param x 攻撃目標のX座標
2167 * @param mode 発動中の剣術ID
2168 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2169 * @details
2170 * If no "weapon" is available, then "punch" the monster one time.
2171 */
2172 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2173 {
2174         bool            fear = FALSE;
2175         bool            mdeath = FALSE;
2176         bool            stormbringer = FALSE;
2177
2178         grid_type       *g_ptr = &attacker_ptr->current_floor_ptr->grid_array[y][x];
2179         monster_type    *m_ptr = &attacker_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
2180         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
2181         GAME_TEXT m_name[MAX_NLEN];
2182
2183         disturb(attacker_ptr, FALSE, TRUE);
2184
2185         take_turn(attacker_ptr, 100);
2186
2187         if (!attacker_ptr->migite && !attacker_ptr->hidarite &&
2188                 !(attacker_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2189         {
2190                 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2191                         (empty_hands(attacker_ptr, FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2192                 return FALSE;
2193         }
2194
2195         monster_desc(m_name, m_ptr, 0);
2196
2197         if (m_ptr->ml)
2198         {
2199                 /* Auto-Recall if possible and visible */
2200                 if (!attacker_ptr->image) monster_race_track(attacker_ptr, m_ptr->ap_r_idx);
2201
2202                 health_track(attacker_ptr, g_ptr->m_idx);
2203         }
2204
2205         if ((r_ptr->flags1 & RF1_FEMALE) &&
2206                 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image || !m_ptr->ml))
2207         {
2208                 if ((attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2209                 {
2210                         msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2211                         return FALSE;
2212                 }
2213         }
2214
2215         if (d_info[attacker_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2216         {
2217                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2218                 return FALSE;
2219         }
2220
2221         /* Stop if friendly */
2222         if (!is_hostile(m_ptr) &&
2223                 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
2224                         attacker_ptr->shero || !m_ptr->ml))
2225         {
2226                 if (attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2227                 if (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2228                 if (stormbringer)
2229                 {
2230                         msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2231                         chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2232                         chg_virtue(attacker_ptr, V_HONOUR, -1);
2233                         chg_virtue(attacker_ptr, V_JUSTICE, -1);
2234                         chg_virtue(attacker_ptr, V_COMPASSION, -1);
2235                 }
2236                 else if (attacker_ptr->pclass != CLASS_BERSERKER)
2237                 {
2238                         if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2239                         {
2240                                 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2241                                 chg_virtue(attacker_ptr, V_HONOUR, -1);
2242                                 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2243                                 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2244                         }
2245                         else
2246                         {
2247                                 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2248                                 return FALSE;
2249                         }
2250                 }
2251         }
2252
2253
2254         /* Handle player fear */
2255         if (attacker_ptr->afraid)
2256         {
2257                 if (m_ptr->ml)
2258                         msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2259                 else
2260                         msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2261
2262                 /* Disturb the monster */
2263                 (void)set_monster_csleep(g_ptr->m_idx, 0);
2264
2265                 return FALSE;
2266         }
2267
2268         if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2269         {
2270                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_COMPASSION, -1);
2271                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_HONOUR, -1);
2272         }
2273
2274         if (attacker_ptr->migite && attacker_ptr->hidarite)
2275         {
2276                 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))
2277                 {
2278                         if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2279                                 attacker_ptr->skill_exp[GINOU_NITOURYU] += 80;
2280                         else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2281                                 attacker_ptr->skill_exp[GINOU_NITOURYU] += 4;
2282                         else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2283                                 attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2284                         else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2285                                 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2286                         attacker_ptr->update |= (PU_BONUS);
2287                 }
2288         }
2289
2290         /* Gain riding experience */
2291         if (attacker_ptr->riding)
2292         {
2293                 int cur = attacker_ptr->skill_exp[GINOU_RIDING];
2294                 int max = s_info[attacker_ptr->pclass].s_max[GINOU_RIDING];
2295
2296                 if (cur < max)
2297                 {
2298                         DEPTH ridinglevel = r_info[attacker_ptr->current_floor_ptr->m_list[attacker_ptr->riding].r_idx].level;
2299                         DEPTH targetlevel = r_ptr->level;
2300                         int inc = 0;
2301
2302                         if ((cur / 200 - 5) < targetlevel)
2303                                 inc += 1;
2304
2305                         /* Extra experience */
2306                         if ((cur / 100) < ridinglevel)
2307                         {
2308                                 if ((cur / 100 + 15) < ridinglevel)
2309                                         inc += 1 + (ridinglevel - (cur / 100 + 15));
2310                                 else
2311                                         inc += 1;
2312                         }
2313
2314                         attacker_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2315                         attacker_ptr->update |= (PU_BONUS);
2316                 }
2317         }
2318
2319         attacker_ptr->riding_t_m_idx = g_ptr->m_idx;
2320         if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
2321         if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
2322
2323         /* Mutations which yield extra 'natural' attacks */
2324         if (!mdeath)
2325         {
2326                 if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
2327                         natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2328                 if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
2329                         natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2330                 if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2331                         natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2332                 if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2333                         natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2334                 if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2335                         natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2336         }
2337
2338         /* Hack -- delay fear messages */
2339         if (fear && m_ptr->ml && !mdeath)
2340         {
2341                 sound(SOUND_FLEE);
2342
2343                 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2344         }
2345
2346         if ((attacker_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2347         {
2348                 set_action(attacker_ptr, ACTION_NONE);
2349         }
2350
2351         return mdeath;
2352 }
2353
2354 /*!
2355  * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2356  * @param m_idx 打撃を行うモンスターのID
2357  * @return 実際に攻撃処理を行った場合TRUEを返す
2358  */
2359 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
2360 {
2361         floor_type *floor_ptr = target_ptr->current_floor_ptr;
2362         monster_type *m_ptr = &floor_ptr->m_list[m_idx];
2363         monster_race *r_ptr = &r_info[m_ptr->r_idx];
2364
2365         int ap_cnt;
2366
2367         INVENTORY_IDX i;
2368         int k, tmp;
2369         ARMOUR_CLASS ac;
2370         DEPTH rlev;
2371         int do_cut, do_stun;
2372
2373         PRICE gold;
2374         object_type *o_ptr;
2375         GAME_TEXT o_name[MAX_NLEN];
2376         GAME_TEXT m_name[MAX_NLEN];
2377         GAME_TEXT ddesc[80];
2378
2379         bool blinked;
2380         bool touched = FALSE, fear = FALSE, alive = TRUE;
2381         bool explode = FALSE;
2382         bool do_silly_attack = (one_in_(2) && target_ptr->image);
2383         HIT_POINT get_damage = 0;
2384         int abbreviate = 0;     // 2回目以降の省略表現フラグ
2385
2386         /* Not allowed to attack */
2387         if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return FALSE;
2388
2389         if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
2390
2391         /* ...nor if friendly */
2392         if (!is_hostile(m_ptr)) return FALSE;
2393
2394         /* Extract the effective monster level */
2395         rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2396
2397         /* Get the monster name (or "it") */
2398         monster_desc(m_name, m_ptr, 0);
2399
2400         monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2401
2402         if (target_ptr->special_defense & KATA_IAI)
2403         {
2404                 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s moved."), m_name);
2405                 if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2406         }
2407
2408         if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
2409         {
2410                 if (kawarimi(target_ptr, TRUE)) return TRUE;
2411         }
2412
2413         /* Assume no blink */
2414         blinked = FALSE;
2415
2416         /* Scan through all four blows */
2417         for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2418         {
2419                 bool obvious = FALSE;
2420
2421                 HIT_POINT power = 0;
2422                 HIT_POINT damage = 0;
2423
2424                 concptr act = NULL;
2425
2426                 /* Extract the attack infomation */
2427                 int effect = r_ptr->blow[ap_cnt].effect;
2428                 int method = r_ptr->blow[ap_cnt].method;
2429                 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2430                 int d_side = r_ptr->blow[ap_cnt].d_side;
2431
2432                 if (!monster_is_valid(m_ptr)) break;
2433
2434                 /* Hack -- no more attacks */
2435                 if (!method) break;
2436
2437                 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2438                 {
2439                         method = RBM_HIT;
2440                         d_dice /= 10;
2441                 }
2442
2443                 /* Stop if player is dead or gone */
2444                 if (!target_ptr->playing || target_ptr->is_dead) break;
2445                 if (distance(target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2446
2447                 /* Handle "leaving" */
2448                 if (target_ptr->leaving) break;
2449
2450                 if (method == RBM_SHOOT) continue;
2451
2452                 /* Extract the attack "power" */
2453                 power = mbe_info[effect].power;
2454
2455                 /* Total armor */
2456                 ac = target_ptr->ac + target_ptr->to_a;
2457
2458                 /* Monster hits player */
2459                 if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
2460                 {
2461                         /* Always disturbing */
2462                         disturb(target_ptr, TRUE, TRUE);
2463
2464
2465                         /* Hack -- Apply "protection from evil" */
2466                         if ((target_ptr->protevil > 0) &&
2467                             (r_ptr->flags3 & RF3_EVIL) &&
2468                             (target_ptr->lev >= rlev) &&
2469                             ((randint0(100) + target_ptr->lev) > 50))
2470                         {
2471                                 /* Remember the Evil-ness */
2472                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2473
2474 #ifdef JP
2475                                 if (abbreviate) msg_format("撃退した。");
2476                                 else msg_format("%^sは撃退された。", m_name);
2477                                 abbreviate = 1; /*2回目以降は省略 */
2478 #else
2479                                 msg_format("%^s is repelled.", m_name);
2480 #endif
2481
2482
2483                                 /* Hack -- Next attack */
2484                                 continue;
2485                         }
2486
2487
2488                         /* Assume no cut or stun */
2489                         do_cut = do_stun = 0;
2490
2491                         /* Describe the attack method */
2492                         switch (method)
2493                         {
2494                                 case RBM_HIT:
2495                                 {
2496                                         act = _("殴られた。", "hits you.");
2497                                         do_cut = do_stun = 1;
2498                                         touched = TRUE;
2499                                         sound(SOUND_HIT);
2500                                         break;
2501                                 }
2502
2503                                 case RBM_TOUCH:
2504                                 {
2505                                         act = _("触られた。", "touches you.");
2506                                         touched = TRUE;
2507                                         sound(SOUND_TOUCH);
2508                                         break;
2509                                 }
2510
2511                                 case RBM_PUNCH:
2512                                 {
2513                                         act = _("パンチされた。", "punches you.");
2514                                         touched = TRUE;
2515                                         do_stun = 1;
2516                                         sound(SOUND_HIT);
2517                                         break;
2518                                 }
2519
2520                                 case RBM_KICK:
2521                                 {
2522                                         act = _("蹴られた。", "kicks you.");
2523                                         touched = TRUE;
2524                                         do_stun = 1;
2525                                         sound(SOUND_HIT);
2526                                         break;
2527                                 }
2528
2529                                 case RBM_CLAW:
2530                                 {
2531                                         act = _("ひっかかれた。", "claws you.");
2532                                         touched = TRUE;
2533                                         do_cut = 1;
2534                                         sound(SOUND_CLAW);
2535                                         break;
2536                                 }
2537
2538                                 case RBM_BITE:
2539                                 {
2540                                         act = _("噛まれた。", "bites you.");
2541                                         do_cut = 1;
2542                                         touched = TRUE;
2543                                         sound(SOUND_BITE);
2544                                         break;
2545                                 }
2546
2547                                 case RBM_STING:
2548                                 {
2549                                         act = _("刺された。", "stings you.");
2550                                         touched = TRUE;
2551                                         sound(SOUND_STING);
2552                                         break;
2553                                 }
2554
2555                                 case RBM_SLASH:
2556                                 {
2557                                         act = _("斬られた。", "slashes you.");
2558                                         touched = TRUE;
2559                                         do_cut = 1;
2560                                         sound(SOUND_CLAW);
2561                                         break;
2562                                 }
2563
2564                                 case RBM_BUTT:
2565                                 {
2566                                         act = _("角で突かれた。", "butts you.");
2567                                         do_stun = 1;
2568                                         touched = TRUE;
2569                                         sound(SOUND_HIT);
2570                                         break;
2571                                 }
2572
2573                                 case RBM_CRUSH:
2574                                 {
2575                                         act = _("体当たりされた。", "crushes you.");
2576                                         do_stun = 1;
2577                                         touched = TRUE;
2578                                         sound(SOUND_CRUSH);
2579                                         break;
2580                                 }
2581
2582                                 case RBM_ENGULF:
2583                                 {
2584                                         act = _("飲み込まれた。", "engulfs you.");
2585                                         touched = TRUE;
2586                                         sound(SOUND_CRUSH);
2587                                         break;
2588                                 }
2589
2590                                 case RBM_CHARGE:
2591                                 {
2592                                         abbreviate = -1;
2593                                         act = _("は請求書をよこした。", "charges you.");
2594                                         touched = TRUE;
2595                                         sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2596                                         break;
2597                                 }
2598
2599                                 case RBM_CRAWL:
2600                                 {
2601                                         abbreviate = -1;
2602                                         act = _("が体の上を這い回った。", "crawls on you.");
2603                                         touched = TRUE;
2604                                         sound(SOUND_SLIME);
2605                                         break;
2606                                 }
2607
2608                                 case RBM_DROOL:
2609                                 {
2610                                         act = _("よだれをたらされた。", "drools on you.");
2611                                         sound(SOUND_SLIME);
2612                                         break;
2613                                 }
2614
2615                                 case RBM_SPIT:
2616                                 {
2617                                         act = _("唾を吐かれた。", "spits on you.");
2618                                         sound(SOUND_SLIME);
2619                                         break;
2620                                 }
2621
2622                                 case RBM_EXPLODE:
2623                                 {
2624                                         abbreviate = -1;
2625                                         act = _("は爆発した。", "explodes.");
2626                                         explode = TRUE;
2627                                         break;
2628                                 }
2629
2630                                 case RBM_GAZE:
2631                                 {
2632                                         act = _("にらまれた。", "gazes at you.");
2633                                         break;
2634                                 }
2635
2636                                 case RBM_WAIL:
2637                                 {
2638                                         act = _("泣き叫ばれた。", "wails at you.");
2639                                         sound(SOUND_WAIL);
2640                                         break;
2641                                 }
2642
2643                                 case RBM_SPORE:
2644                                 {
2645                                         act = _("胞子を飛ばされた。", "releases spores at you.");
2646                                         sound(SOUND_SLIME);
2647                                         break;
2648                                 }
2649
2650                                 case RBM_XXX4:
2651                                 {
2652                                         abbreviate = -1;
2653                                         act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2654                                         break;
2655                                 }
2656
2657                                 case RBM_BEG:
2658                                 {
2659                                         act = _("金をせがまれた。", "begs you for money.");
2660                                         sound(SOUND_MOAN);
2661                                         break;
2662                                 }
2663
2664                                 case RBM_INSULT:
2665                                 {
2666 #ifdef JP
2667                                         abbreviate = -1;
2668 #endif
2669                                         act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2670                                         sound(SOUND_MOAN);
2671                                         break;
2672                                 }
2673
2674                                 case RBM_MOAN:
2675                                 {
2676 #ifdef JP
2677                                         abbreviate = -1;
2678 #endif
2679                                         act = desc_moan[randint0(4)];
2680                                         sound(SOUND_MOAN);
2681                                         break;
2682                                 }
2683
2684                                 case RBM_SHOW:
2685                                 {
2686 #ifdef JP
2687                                         abbreviate = -1;
2688 #endif
2689                                         if (m_ptr->r_idx == MON_JAIAN)
2690                                         {
2691 #ifdef JP
2692                                                 switch(randint1(15))
2693                                                 {
2694                                                   case 1:
2695                                                   case 6:
2696                                                   case 11:
2697                                                         act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2698                                                         break;
2699                                                   case 2:
2700                                                         act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2701                                                         break;
2702                                                   case 3:
2703                                                         act = "「♪の~び太スネ夫はメじゃないよ~~」";
2704                                                         break;
2705                                                   case 4:
2706                                                         act = "「♪け~んかスポ~ツ~どんとこい~」";
2707                                                         break;
2708                                                   case 5:
2709                                                         act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2710                                                         break;
2711                                                   case 7:
2712                                                         act = "「♪ま~ちいちば~んのに~んきもの~~」";
2713                                                         break;
2714                                                   case 8:
2715                                                         act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2716                                                         break;
2717                                                   case 9:
2718                                                         act = "「♪きはやさし~くて~ち~からもち~」";
2719                                                         break;
2720                                                   case 10:
2721                                                         act = "「♪かお~も~~スタイルも~バツグンさ~」";
2722                                                         break;
2723                                                   case 12:
2724                                                         act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2725                                                         break;
2726                                                   case 13:
2727                                                         act = "「♪ド~ラもドラミもメじゃないよ~~」";
2728                                                         break;
2729                                                   case 14:
2730                                                         act = "「♪よじげんぽけっと~な~くたって~」";
2731                                                         break;
2732                                                   case 15:
2733                                                         act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2734                                                         break;
2735                                                 }
2736 #else
2737                                                 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2738 #endif
2739                                         }
2740                                         else
2741                                         {
2742                                                 if (one_in_(3))
2743                                                         act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2744                                                 else
2745                                                         act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2746                                         }
2747
2748                                         sound(SOUND_SHOW);
2749                                         break;
2750                                 }
2751                         }
2752
2753                         if (act)
2754                         {
2755                                 if (do_silly_attack)
2756                                 {
2757 #ifdef JP
2758                                         abbreviate = -1;
2759 #endif
2760                                         act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2761                                 }
2762 #ifdef JP
2763                                 if (abbreviate == 0)
2764                                         msg_format("%^sに%s", m_name, act);
2765                                 else if (abbreviate == 1)
2766                                         msg_format("%s", act);
2767                                 else /* if (abbreviate == -1) */
2768                                         msg_format("%^s%s", m_name, act);
2769                                 abbreviate = 1;/*2回目以降は省略 */
2770 #else
2771                                 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2772 #endif
2773                         }
2774
2775                         /* Hack -- assume all attacks are obvious */
2776                         obvious = TRUE;
2777
2778                         /* Roll out the damage */
2779                         damage = damroll(d_dice, d_side);
2780
2781                         /*
2782                          * Skip the effect when exploding, since the explosion
2783                          * already causes the effect.
2784                          */
2785                         if(explode) damage = 0;
2786                         /* Apply appropriate damage */
2787                         switch (effect)
2788                         {
2789                                 case 0:
2790                                 {
2791                                         obvious = TRUE;
2792                                         damage = 0;
2793                                         break;
2794                                 }
2795
2796                                 case RBE_SUPERHURT:     /* AC軽減あり / Player armor reduces total damage */
2797                                 {
2798                                         if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW(target_ptr))
2799                                         {
2800                                                 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2801                                                 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2802                                                 tmp_damage = MAX(damage, tmp_damage*2);
2803
2804                                                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2805                                                 break;
2806                                         }
2807                                 }
2808                                 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2809                                 {
2810                                         obvious = TRUE;
2811                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2812                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2813                                         break;
2814                                 }
2815
2816                                 case RBE_POISON:
2817                                 {
2818                                         if (explode) break;
2819
2820                                         /* Take "poison" effect */
2821                                         if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !CHECK_MULTISHADOW(target_ptr))
2822                                         {
2823                                                 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
2824                                                 {
2825                                                         obvious = TRUE;
2826                                                 }
2827                                         }
2828
2829                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2830
2831                                         /* Learn about the player */
2832                                         update_smart_learn(m_idx, DRS_POIS);
2833
2834                                         break;
2835                                 }
2836
2837                                 case RBE_UN_BONUS:
2838                                 {
2839                                         if (explode) break;
2840
2841                                         /* Allow complete resist */
2842                                         if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
2843                                         {
2844                                                 /* Apply disenchantment */
2845                                                 if (apply_disenchant(target_ptr, 0))
2846                                                 {
2847                                                         /* Hack -- Update AC */
2848                                                         update_creature(target_ptr);
2849                                                         obvious = TRUE;
2850                                                 }
2851                                         }
2852
2853                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2854
2855                                         /* Learn about the player */
2856                                         update_smart_learn(m_idx, DRS_DISEN);
2857
2858                                         break;
2859                                 }
2860
2861                                 case RBE_UN_POWER:
2862                                 {
2863                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2864
2865                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2866
2867                                         /* Find an item */
2868                                         for (k = 0; k < 10; k++)
2869                                         {
2870                                                 /* Pick an item */
2871                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2872
2873                                                 /* Obtain the item */
2874                                                 o_ptr = &target_ptr->inventory_list[i];
2875                                                 if (!o_ptr->k_idx) continue;
2876
2877                                                 /* Drain charged wands/staffs */
2878                                                 if (((o_ptr->tval == TV_STAFF) ||
2879                                                      (o_ptr->tval == TV_WAND)) &&
2880                                                     (o_ptr->pval))
2881                                                 {
2882                                                         /* Calculate healed hitpoints */
2883                                                         int heal=rlev * o_ptr->pval;
2884                                                         if( o_ptr->tval == TV_STAFF)
2885                                                             heal *=  o_ptr->number;
2886
2887                                                         /* Don't heal more than max hp */
2888                                                         heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2889
2890                                                         msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2891
2892                                                         obvious = TRUE;
2893
2894                                                         /* Heal the monster */
2895                                                         m_ptr->hp += (HIT_POINT)heal;
2896
2897                                                         /* Redraw (later) if needed */
2898                                                         if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
2899                                                         if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
2900
2901                                                         /* Uncharge */
2902                                                         o_ptr->pval = 0;
2903
2904                                                         /* Combine / Reorder the pack */
2905                                                         target_ptr->update |= (PU_COMBINE | PU_REORDER);
2906                                                         target_ptr->window |= (PW_INVEN);
2907
2908                                                         break;
2909                                                 }
2910                                         }
2911
2912                                         break;
2913                                 }
2914
2915                                 case RBE_EAT_GOLD:
2916                                 {
2917                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2918
2919                                         /* Confused monsters cannot steal successfully. -LM-*/
2920                                         if (MON_CONFUSED(m_ptr)) break;
2921
2922                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2923
2924                                         obvious = TRUE;
2925
2926                                         /* Saving throw (unless paralyzed) based on dex and level */
2927                                         if (!target_ptr->paralyzed &&
2928                                             (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] +
2929                                                               target_ptr->lev)))
2930                                         {
2931                                                 /* Saving throw message */
2932                                                 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2933
2934                                                 /* Occasional blink anyway */
2935                                                 if (randint0(3)) blinked = TRUE;
2936                                         }
2937
2938                                         /* Eat gold */
2939                                         else
2940                                         {
2941                                                 gold = (target_ptr->au / 10) + randint1(25);
2942                                                 if (gold < 2) gold = 2;
2943                                                 if (gold > 5000) gold = (target_ptr->au / 20) + randint1(3000);
2944                                                 if (gold > target_ptr->au) gold = target_ptr->au;
2945                                                 target_ptr->au -= gold;
2946                                                 if (gold <= 0)
2947                                                 {
2948                                                         msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2949                                                 }
2950                                                 else if (target_ptr->au)
2951                                                 {
2952                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2953                                                         msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2954                                                         chg_virtue(target_ptr, V_SACRIFICE, 1);
2955                                                 }
2956                                                 else
2957                                                 {
2958                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2959                                                         msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2960                                                         chg_virtue(target_ptr, V_SACRIFICE, 2);
2961                                                 }
2962
2963                                                 /* Redraw gold */
2964                                                 target_ptr->redraw |= (PR_GOLD);
2965
2966                                                 target_ptr->window |= (PW_PLAYER);
2967
2968                                                 /* Blink away */
2969                                                 blinked = TRUE;
2970                                         }
2971
2972                                         break;
2973                                 }
2974
2975                                 case RBE_EAT_ITEM:
2976                                 {
2977                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2978
2979                                         /* Confused monsters cannot steal successfully. -LM-*/
2980                                         if (MON_CONFUSED(m_ptr)) break;
2981
2982                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2983
2984                                         /* Saving throw (unless paralyzed) based on dex and level */
2985                                         if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev)))
2986                                         {
2987                                                 /* Saving throw message */
2988                                                 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2989
2990                                                 /* Occasional "blink" anyway */
2991                                                 blinked = TRUE;
2992                                                 obvious = TRUE;
2993                                                 break;
2994                                         }
2995
2996                                         /* Find an item */
2997                                         for (k = 0; k < 10; k++)
2998                                         {
2999                                                 OBJECT_IDX o_idx;
3000
3001                                                 /* Pick an item */
3002                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3003
3004                                                 /* Obtain the item */
3005                                                 o_ptr = &target_ptr->inventory_list[i];
3006                                                 if (!o_ptr->k_idx) continue;
3007
3008                                                 /* Skip artifacts */
3009                                                 if (object_is_artifact(o_ptr)) continue;
3010
3011                                                 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3012
3013 #ifdef JP
3014                                                 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3015 #else
3016                                                 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3017 #endif
3018                                                 chg_virtue(target_ptr, V_SACRIFICE, 1);
3019                                                 o_idx = o_pop(floor_ptr);
3020
3021                                                 /* Success */
3022                                                 if (o_idx)
3023                                                 {
3024                                                         object_type *j_ptr;
3025                                                         j_ptr = &floor_ptr->o_list[o_idx];
3026                                                         object_copy(j_ptr, o_ptr);
3027
3028                                                         /* Modify number */
3029                                                         j_ptr->number = 1;
3030
3031                                                         /* Hack -- If a rod or wand, allocate total
3032                                                          * maximum timeouts or charges between those
3033                                                          * stolen and those missed. -LM-
3034                                                          */
3035                                                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3036                                                         {
3037                                                                 j_ptr->pval = o_ptr->pval / o_ptr->number;
3038                                                                 o_ptr->pval -= j_ptr->pval;
3039                                                         }
3040
3041                                                         /* Forget mark */
3042                                                         j_ptr->marked = OM_TOUCHED;
3043
3044                                                         /* Memorize monster */
3045                                                         j_ptr->held_m_idx = m_idx;
3046
3047                                                         /* Build stack */
3048                                                         j_ptr->next_o_idx = m_ptr->hold_o_idx;
3049
3050                                                         /* Build stack */
3051                                                         m_ptr->hold_o_idx = o_idx;
3052                                                 }
3053
3054                                                 /* Steal the items */
3055                                                 inven_item_increase(target_ptr, i, -1);
3056                                                 inven_item_optimize(target_ptr, i);
3057
3058                                                 obvious = TRUE;
3059
3060                                                 /* Blink away */
3061                                                 blinked = TRUE;
3062
3063                                                 break;
3064                                         }
3065
3066                                         break;
3067                                 }
3068
3069                                 case RBE_EAT_FOOD:
3070                                 {
3071                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3072
3073                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3074
3075                                         /* Steal some food */
3076                                         for (k = 0; k < 10; k++)
3077                                         {
3078                                                 /* Pick an item from the pack */
3079                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3080
3081                                                 o_ptr = &target_ptr->inventory_list[i];
3082                                                 if (!o_ptr->k_idx) continue;
3083
3084                                                 /* Skip non-food objects */
3085                                                 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3086
3087                                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3088
3089 #ifdef JP
3090                                                 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3091 #else
3092                                                 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3093 #endif
3094
3095                                                 /* Steal the items */
3096                                                 inven_item_increase(target_ptr, i, -1);
3097                                                 inven_item_optimize(target_ptr, i);
3098
3099                                                 obvious = TRUE;
3100
3101                                                 break;
3102                                         }
3103
3104                                         break;
3105                                 }
3106
3107                                 case RBE_EAT_LITE:
3108                                 {
3109                                         /* Access the lite */
3110                                         o_ptr = &target_ptr->inventory_list[INVEN_LITE];
3111                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3112
3113                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3114
3115                                         /* Drain fuel */
3116                                         if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3117                                         {
3118                                                 /* Reduce fuel */
3119                                                 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3120                                                 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3121
3122                                                 if (!target_ptr->blind)
3123                                                 {
3124                                                         msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3125                                                         obvious = TRUE;
3126                                                 }
3127
3128                                                 target_ptr->window |= (PW_EQUIP);
3129                                         }
3130
3131                                         break;
3132                                 }
3133
3134                                 case RBE_ACID:
3135                                 {
3136                                         if (explode) break;
3137                                         obvious = TRUE;
3138                                         msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3139                                         get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
3140                                         update_creature(target_ptr);
3141                                         update_smart_learn(m_idx, DRS_ACID);
3142                                         break;
3143                                 }
3144
3145                                 case RBE_ELEC:
3146                                 {
3147                                         if (explode) break;
3148                                         obvious = TRUE;
3149                                         msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3150                                         get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
3151                                         update_smart_learn(m_idx, DRS_ELEC);
3152                                         break;
3153                                 }
3154
3155                                 case RBE_FIRE:
3156                                 {
3157                                         if (explode) break;
3158                                         obvious = TRUE;
3159                                         msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3160                                         get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
3161                                         update_smart_learn(m_idx, DRS_FIRE);
3162                                         break;
3163                                 }
3164
3165                                 case RBE_COLD:
3166                                 {
3167                                         if (explode) break;
3168                                         obvious = TRUE;
3169                                         msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3170                                         get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
3171                                         update_smart_learn(m_idx, DRS_COLD);
3172                                         break;
3173                                 }
3174
3175                                 case RBE_BLIND:
3176                                 {
3177                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3178                                         if (target_ptr->is_dead) break;
3179
3180                                         /* Increase "blind" */
3181                                         if (!target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr))
3182                                         {
3183                                                 if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev)))
3184                                                 {
3185 #ifdef JP
3186                                                         if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3187 #else
3188                                                         /* nanka */
3189 #endif
3190                                                         obvious = TRUE;
3191                                                 }
3192                                         }
3193
3194                                         /* Learn about the player */
3195                                         update_smart_learn(m_idx, DRS_BLIND);
3196
3197                                         break;
3198                                 }
3199
3200                                 case RBE_CONFUSE:
3201                                 {
3202                                         if (explode) break;
3203                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3204
3205                                         if (target_ptr->is_dead) break;
3206
3207                                         /* Increase "confused" */
3208                                         if (!target_ptr->resist_conf && !CHECK_MULTISHADOW(target_ptr))
3209                                         {
3210                                                 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev)))
3211                                                 {
3212                                                         obvious = TRUE;
3213                                                 }
3214                                         }
3215
3216                                         /* Learn about the player */
3217                                         update_smart_learn(m_idx, DRS_CONF);
3218
3219                                         break;
3220                                 }
3221
3222                                 case RBE_TERRIFY:
3223                                 {
3224                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3225
3226                                         if (target_ptr->is_dead) break;
3227
3228                                         /* Increase "afraid" */
3229                                         if (CHECK_MULTISHADOW(target_ptr))
3230                                         {
3231                                                 /* Do nothing */
3232                                         }
3233                                         else if (target_ptr->resist_fear)
3234                                         {
3235                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3236                                                 obvious = TRUE;
3237                                         }
3238                                         else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3239                                         {
3240                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3241                                                 obvious = TRUE;
3242                                         }
3243                                         else
3244                                         {
3245                                                 if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev)))
3246                                                 {
3247                                                         obvious = TRUE;
3248                                                 }
3249                                         }
3250
3251                                         /* Learn about the player */
3252                                         update_smart_learn(m_idx, DRS_FEAR);
3253
3254                                         break;
3255                                 }
3256
3257                                 case RBE_PARALYZE:
3258                                 {
3259                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3260
3261                                         if (target_ptr->is_dead) break;
3262
3263                                         /* Increase "paralyzed" */
3264                                         if (CHECK_MULTISHADOW(target_ptr))
3265                                         {
3266                                                 /* Do nothing */
3267                                         }
3268                                         else if (target_ptr->free_act)
3269                                         {
3270                                                 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3271                                                 obvious = TRUE;
3272                                         }
3273                                         else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3274                                         {
3275                                                 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3276                                                 obvious = TRUE;
3277                                         }
3278                                         else
3279                                         {
3280                                                 if (!target_ptr->paralyzed)
3281                                                 {
3282                                                         if (set_paralyzed(target_ptr, 3 + randint1(rlev)))
3283                                                         {
3284                                                                 obvious = TRUE;
3285                                                         }
3286                                                 }
3287                                         }
3288
3289                                         /* Learn about the player */
3290                                         update_smart_learn(m_idx, DRS_FREE);
3291
3292                                         break;
3293                                 }
3294
3295                                 case RBE_LOSE_STR:
3296                                 {
3297                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3298
3299                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3300                                         if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3301
3302                                         break;
3303                                 }
3304
3305                                 case RBE_LOSE_INT:
3306                                 {
3307                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3308
3309                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3310                                         if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3311
3312                                         break;
3313                                 }
3314
3315                                 case RBE_LOSE_WIS:
3316                                 {
3317                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3318
3319                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3320                                         if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3321
3322                                         break;
3323                                 }
3324
3325                                 case RBE_LOSE_DEX:
3326                                 {
3327                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3328
3329                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3330                                         if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3331
3332                                         break;
3333                                 }
3334
3335                                 case RBE_LOSE_CON:
3336                                 {
3337                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3338
3339                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3340                                         if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3341
3342                                         break;
3343                                 }
3344
3345                                 case RBE_LOSE_CHR:
3346                                 {
3347                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3348
3349                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3350                                         if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3351
3352                                         break;
3353                                 }
3354
3355                                 case RBE_LOSE_ALL:
3356                                 {
3357                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3358
3359                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3360
3361                                         /* Damage (stats) */
3362                                         if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3363                                         if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3364                                         if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3365                                         if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3366                                         if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3367                                         if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3368
3369                                         break;
3370                                 }
3371
3372                                 case RBE_SHATTER:
3373                                 {
3374                                         obvious = TRUE;
3375
3376                                         /* Hack -- Reduce damage based on the player armor class */
3377                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3378
3379                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3380
3381                                         /* Radius 8 earthquake centered at the monster */
3382                                         if (damage > 23 || explode)
3383                                         {
3384                                                 earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
3385                                         }
3386
3387                                         break;
3388                                 }
3389
3390                                 case RBE_EXP_10:
3391                                 {
3392                                         s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3393
3394                                         obvious = TRUE;
3395
3396                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3397
3398                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3399
3400                                         (void)drain_exp(target_ptr, d, d / 10, 95);
3401                                         break;
3402                                 }
3403
3404                                 case RBE_EXP_20:
3405                                 {
3406                                         s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3407
3408                                         obvious = TRUE;
3409
3410                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3411
3412                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3413
3414                                         (void)drain_exp(target_ptr, d, d / 10, 90);
3415                                         break;
3416                                 }
3417
3418                                 case RBE_EXP_40:
3419                                 {
3420                                         s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3421
3422                                         obvious = TRUE;
3423
3424                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3425
3426                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3427
3428                                         (void)drain_exp(target_ptr, d, d / 10, 75);
3429                                         break;
3430                                 }
3431
3432                                 case RBE_EXP_80:
3433                                 {
3434                                         s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3435
3436                                         obvious = TRUE;
3437
3438                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3439
3440                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3441
3442                                         (void)drain_exp(target_ptr, d, d / 10, 50);
3443                                         break;
3444                                 }
3445
3446                                 case RBE_DISEASE:
3447                                 {
3448                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3449
3450                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3451
3452                                         /* Take "poison" effect */
3453                                         if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
3454                                         {
3455                                                 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
3456                                                 {
3457                                                         obvious = TRUE;
3458                                                 }
3459                                         }
3460
3461                                         /* Damage CON (10% chance)*/
3462                                         if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID))
3463                                         {
3464                                                 /* 1% chance for perm. damage */
3465                                                 bool perm = one_in_(10);
3466                                                 if (dec_stat(target_ptr, A_CON, randint1(10), perm))
3467                                                 {
3468                                                         msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3469                                                         obvious = TRUE;
3470                                                 }
3471                                         }
3472
3473                                         break;
3474                                 }
3475                                 case RBE_TIME:
3476                                 {
3477                                         if (explode) break;
3478                                         if (!target_ptr->resist_time && !CHECK_MULTISHADOW(target_ptr))
3479                                         {
3480                                                 switch (randint1(10))
3481                                                 {
3482                                                         case 1: case 2: case 3: case 4: case 5:
3483                                                         {
3484                                                                 if (target_ptr->prace == RACE_ANDROID) break;
3485                                                                 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3486                                                                 lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
3487                                                                 break;
3488                                                         }
3489
3490                                                         case 6: case 7: case 8: case 9:
3491                                                         {
3492                                                                 int stat = randint0(6);
3493
3494                                                                 switch (stat)
3495                                                                 {
3496 #ifdef JP
3497                                                                         case A_STR: act = "強く"; break;
3498                                                                         case A_INT: act = "聡明で"; break;
3499                                                                         case A_WIS: act = "賢明で"; break;
3500                                                                         case A_DEX: act = "器用で"; break;
3501                                                                         case A_CON: act = "健康で"; break;
3502                                                                         case A_CHR: act = "美しく"; break;
3503 #else
3504                                                                         case A_STR: act = "strong"; break;
3505                                                                         case A_INT: act = "bright"; break;
3506                                                                         case A_WIS: act = "wise"; break;
3507                                                                         case A_DEX: act = "agile"; break;
3508                                                                         case A_CON: act = "hale"; break;
3509                                                                         case A_CHR: act = "beautiful"; break;
3510 #endif
3511
3512                                                                 }
3513
3514                                                                 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3515                                                                 target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
3516                                                                 if (target_ptr->stat_cur[stat] < 3) target_ptr->stat_cur[stat] = 3;
3517                                                                 target_ptr->update |= (PU_BONUS);
3518                                                                 break;
3519                                                         }
3520
3521                                                         case 10:
3522                                                         {
3523                                                                 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3524
3525                                                                 for (k = 0; k < A_MAX; k++)
3526                                                                 {
3527                                                                         target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
3528                                                                         if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3;
3529                                                                 }
3530                                                                 target_ptr->update |= (PU_BONUS);
3531                                                                 break;
3532                                                         }
3533                                                 }
3534                                         }
3535                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3536
3537                                         break;
3538                                 }
3539                                 case RBE_DR_LIFE:
3540                                 {
3541                                         s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3542                                         bool resist_drain;
3543
3544                                         obvious = TRUE;
3545
3546                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3547
3548                                         if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3549
3550                                         resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
3551
3552                                         /* Heal the attacker? */
3553                                         if (target_ptr->mimic_form)
3554                                         {
3555                                                 if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3556                                                         resist_drain = TRUE;
3557                                         }
3558                                         else
3559                                         {
3560                                                 switch (target_ptr->prace)
3561                                                 {
3562                                                 case RACE_ZOMBIE:
3563                                                 case RACE_VAMPIRE:
3564                                                 case RACE_SPECTRE:
3565                                                 case RACE_SKELETON:
3566                                                 case RACE_DEMON:
3567                                                 case RACE_GOLEM:
3568                                                 case RACE_ANDROID:
3569                                                         resist_drain = TRUE;
3570                                                         break;
3571                                                 }
3572                                         }
3573
3574                                         if ((damage > 5) && !resist_drain)
3575                                         {
3576                                                 bool did_heal = FALSE;
3577
3578                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3579
3580                                                 /* Heal */
3581                                                 m_ptr->hp += damroll(4, damage / 6);
3582                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3583
3584                                                 /* Redraw (later) if needed */
3585                                                 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
3586                                                 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
3587
3588                                                 /* Special message */
3589                                                 if (m_ptr->ml && did_heal)
3590                                                 {
3591                                                         msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3592                                                 }
3593                                         }
3594
3595                                         break;
3596                                 }
3597                                 case RBE_DR_MANA:
3598                                 {
3599                                         obvious = TRUE;
3600
3601                                         if (CHECK_MULTISHADOW(target_ptr))
3602                                         {
3603                                                 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3604                                         }
3605                                         else
3606                                         {
3607                                                 do_cut = 0;
3608
3609                                                 target_ptr->csp -= damage;
3610                                                 if (target_ptr->csp < 0)
3611                                                 {
3612                                                         target_ptr->csp = 0;
3613                                                         target_ptr->csp_frac = 0;
3614                                                 }
3615
3616                                                 target_ptr->redraw |= (PR_MANA);
3617                                         }
3618
3619                                         /* Learn about the player */
3620                                         update_smart_learn(m_idx, DRS_MANA);
3621
3622                                         break;
3623                                 }
3624                                 case RBE_INERTIA:
3625                                 {
3626                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3627
3628                                         if (target_ptr->is_dead) break;
3629
3630                                         /* Decrease speed */
3631                                         if (CHECK_MULTISHADOW(target_ptr))
3632                                         {
3633                                                 /* Do nothing */
3634                                         }
3635                                         else
3636                                         {
3637                                                 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3638                                                 {
3639                                                         obvious = TRUE;
3640                                                 }
3641                                         }
3642
3643                                         break;
3644                                 }
3645                                 case RBE_STUN:
3646                                 {
3647                                         get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3648
3649                                         if (target_ptr->is_dead) break;
3650
3651                                         /* Decrease speed */
3652                                         if (target_ptr->resist_sound || CHECK_MULTISHADOW(target_ptr))
3653                                         {
3654                                                 /* Do nothing */
3655                                         }
3656                                         else
3657                                         {
3658                                                 if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3659                                                 {
3660                                                         obvious = TRUE;
3661                                                 }
3662                                         }
3663
3664                                         break;
3665                                 }
3666                         }
3667
3668                         /* Hack -- only one of cut or stun */
3669                         if (do_cut && do_stun)
3670                         {
3671                                 /* Cancel cut */
3672                                 if (randint0(100) < 50)
3673                                 {
3674                                         do_cut = 0;
3675                                 }
3676
3677                                 /* Cancel stun */
3678                                 else
3679                                 {
3680                                         do_stun = 0;
3681                                 }
3682                         }
3683
3684                         /* Handle cut */
3685                         if (do_cut)
3686                         {
3687                                 int cut_plus = 0;
3688
3689                                 /* Critical hit (zero if non-critical) */
3690                                 tmp = monster_critical(d_dice, d_side, damage);
3691
3692                                 /* Roll for damage */
3693                                 switch (tmp)
3694                                 {
3695                                         case 0: cut_plus = 0; break;
3696                                         case 1: cut_plus = randint1(5); break;
3697                                         case 2: cut_plus = randint1(5) + 5; break;
3698                                         case 3: cut_plus = randint1(20) + 20; break;
3699                                         case 4: cut_plus = randint1(50) + 50; break;
3700                                         case 5: cut_plus = randint1(100) + 100; break;
3701                                         case 6: cut_plus = 300; break;
3702                                         default: cut_plus = 500; break;
3703                                 }
3704
3705                                 /* Apply the cut */
3706                                 if (cut_plus) (void)set_cut(target_ptr,target_ptr->cut + cut_plus);
3707                         }
3708
3709                         /* Handle stun */
3710                         if (do_stun)
3711                         {
3712                                 int stun_plus = 0;
3713
3714                                 /* Critical hit (zero if non-critical) */
3715                                 tmp = monster_critical(d_dice, d_side, damage);
3716
3717                                 /* Roll for damage */
3718                                 switch (tmp)
3719                                 {
3720                                         case 0: stun_plus = 0; break;
3721                                         case 1: stun_plus = randint1(5); break;
3722                                         case 2: stun_plus = randint1(5) + 10; break;
3723                                         case 3: stun_plus = randint1(10) + 20; break;
3724                                         case 4: stun_plus = randint1(15) + 30; break;
3725                                         case 5: stun_plus = randint1(20) + 40; break;
3726                                         case 6: stun_plus = 80; break;
3727                                         default: stun_plus = 150; break;
3728                                 }
3729
3730                                 /* Apply the stun */
3731                                 if (stun_plus) (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
3732                         }
3733
3734                         if (explode)
3735                         {
3736                                 sound(SOUND_EXPLODE);
3737
3738                                 if (mon_take_hit(target_ptr, m_idx, m_ptr->hp + 1, &fear, NULL))
3739                                 {
3740                                         blinked = FALSE;
3741                                         alive = FALSE;
3742                                 }
3743                         }
3744
3745                         if (touched)
3746                         {
3747                                 if (target_ptr->sh_fire && alive && !target_ptr->is_dead)
3748                                 {
3749                                         if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3750                                         {
3751                                                 HIT_POINT dam = damroll(2, 6);
3752
3753                                                 /* Modify the damage */
3754                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3755
3756                                                 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3757
3758                                                 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3759                                                 {
3760                                                         blinked = FALSE;
3761                                                         alive = FALSE;
3762                                                 }
3763                                         }
3764                                         else
3765                                         {
3766                                                 if (is_original_ap_and_seen(m_ptr))
3767                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3768                                         }
3769                                 }
3770
3771                                 if (target_ptr->sh_elec && alive && !target_ptr->is_dead)
3772                                 {
3773                                         if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3774                                         {
3775                                                 HIT_POINT dam = damroll(2, 6);
3776
3777                                                 /* Modify the damage */
3778                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3779
3780                                                 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3781                                                 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3782                                                 {
3783                                                         blinked = FALSE;
3784                                                         alive = FALSE;
3785                                                 }
3786                                         }
3787                                         else
3788                                         {
3789                                                 if (is_original_ap_and_seen(m_ptr))
3790                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3791                                         }
3792                                 }
3793
3794                                 if (target_ptr->sh_cold && alive && !target_ptr->is_dead)
3795                                 {
3796                                         if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3797                                         {
3798                                                 HIT_POINT dam = damroll(2, 6);
3799
3800                                                 /* Modify the damage */
3801                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3802
3803                                                 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3804                                                 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3805                                                 {
3806                                                         blinked = FALSE;
3807                                                         alive = FALSE;
3808                                                 }
3809                                         }
3810                                         else
3811                                         {
3812                                                 if (is_original_ap_and_seen(m_ptr))
3813                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3814                                         }
3815                                 }
3816
3817                                 /* by henkma */
3818                                 if (target_ptr->dustrobe && alive && !target_ptr->is_dead)
3819                                 {
3820                                         if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3821                                         {
3822                                                 HIT_POINT dam = damroll(2, 6);
3823
3824                                                 /* Modify the damage */
3825                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3826
3827                                                 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3828                                                 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3829                                                 {
3830                                                         blinked = FALSE;
3831                                                         alive = FALSE;
3832                                                 }
3833                                         }
3834                                         else
3835                                         {
3836                                                 if (is_original_ap_and_seen(m_ptr))
3837                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3838                                         }
3839
3840                                         if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
3841                                         {
3842                                                 teleport_player(target_ptr, 10, 0L);
3843                                         }
3844                                 }
3845
3846                                 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead)
3847                                 {
3848                                         if (r_ptr->flags3 & RF3_EVIL)
3849                                         {
3850                                                 if (!(r_ptr->flagsr & RFR_RES_ALL))
3851                                                 {
3852                                                         HIT_POINT dam = damroll(2, 6);
3853
3854                                                         /* Modify the damage */
3855                                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
3856
3857                                                         msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3858                                                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3859                                                         {
3860                                                                 blinked = FALSE;
3861                                                                 alive = FALSE;
3862                                                         }
3863                                                         if (is_original_ap_and_seen(m_ptr))
3864                                                                 r_ptr->r_flags3 |= RF3_EVIL;
3865                                                 }
3866                                                 else
3867                                                 {
3868                                                         if (is_original_ap_and_seen(m_ptr))
3869                                                                 r_ptr->r_flagsr |= RFR_RES_ALL;
3870                                                 }
3871                                         }
3872                                 }
3873
3874                                 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead)
3875                                 {
3876                                         if (!(r_ptr->flagsr & RFR_RES_ALL))
3877                                         {
3878                                                 HIT_POINT dam = damroll(2, 6);
3879
3880                                                 /* Modify the damage */
3881                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3882
3883                                                 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3884                                                 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3885                                                 {
3886                                                         blinked = FALSE;
3887                                                         alive = FALSE;
3888                                                 }
3889                                         }
3890                                         else
3891                                         {
3892                                                 if (is_original_ap_and_seen(m_ptr))
3893                                                         r_ptr->r_flagsr |= RFR_RES_ALL;
3894                                         }
3895                                 }
3896
3897                                 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
3898                                 {
3899                                         HIT_POINT dam = 1;
3900                                         object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
3901
3902                                         if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3903                                         {
3904                                                 if (o_armed_ptr->k_idx)
3905                                                 {
3906                                                         int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
3907                                                         dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
3908                                                 }
3909
3910                                                 /* Cursed armor makes damages doubled */
3911                                                 o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
3912                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3913
3914                                                 /* Modify the damage */
3915                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3916
3917                                                 msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
3918                                                 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3919                                                 {
3920                                                         blinked = FALSE;
3921                                                         alive = FALSE;
3922                                                 }
3923                                                 else /* monster does not dead */
3924                                                 {
3925                                                         int j;
3926                                                         BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3927                                                         EFFECT_ID typ[4][2] = {
3928                                                                 { INVEN_HEAD, GF_OLD_CONF },
3929                                                                 { INVEN_LARM,  GF_OLD_SLEEP },
3930                                                                 { INVEN_HANDS, GF_TURN_ALL },
3931                                                                 { INVEN_FEET, GF_OLD_SLOW }
3932                                                         };
3933
3934                                                         /* Some cursed armours gives an extra effect */
3935                                                         for (j = 0; j < 4; j++)
3936                                                         {
3937                                                                 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
3938                                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3939                                                                         project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
3940                                                         }
3941                                                 }
3942                                         }
3943                                         else
3944                                         {
3945                                                 if (is_original_ap_and_seen(m_ptr))
3946                                                         r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3947                                         }
3948                                 }
3949                         }
3950                 }
3951
3952                 /* Monster missed player */
3953                 else
3954                 {
3955                         /* Analyze failed attacks */
3956                         switch (method)
3957                         {
3958                                 case RBM_HIT:
3959                                 case RBM_TOUCH:
3960                                 case RBM_PUNCH:
3961                                 case RBM_KICK:
3962                                 case RBM_CLAW:
3963                                 case RBM_BITE:
3964                                 case RBM_STING:
3965                                 case RBM_SLASH:
3966                                 case RBM_BUTT:
3967                                 case RBM_CRUSH:
3968                                 case RBM_ENGULF:
3969                                 case RBM_CHARGE:
3970
3971                                 /* Visible monsters */
3972                                 if (m_ptr->ml)
3973                                 {
3974                                         disturb(target_ptr, TRUE, TRUE);
3975
3976 #ifdef JP
3977                                         if (abbreviate)
3978                                             msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3979                                         else
3980                                             msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3981                                         abbreviate = 1;/*2回目以降は省略 */
3982 #else
3983                                         msg_format("%^s misses you.", m_name);
3984 #endif
3985
3986                                 }
3987
3988                                 /* Gain shield experience */
3989                                 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM]))
3990                                 {
3991                                         int cur = target_ptr->skill_exp[GINOU_SHIELD];
3992                                         int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
3993
3994                                         if (cur < max)
3995                                         {
3996                                                 DEPTH targetlevel = r_ptr->level;
3997                                                 int inc = 0;
3998
3999
4000                                                 /* Extra experience */
4001                                                 if ((cur / 100) < targetlevel)
4002                                                 {
4003                                                         if ((cur / 100 + 15) < targetlevel)
4004                                                                 inc += 1 + (targetlevel - (cur / 100 + 15));
4005                                                         else
4006                                                                 inc += 1;
4007                                                 }
4008
4009                                                 target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4010                                                 target_ptr->update |= (PU_BONUS);
4011                                         }
4012                                 }
4013
4014                                 damage = 0;
4015
4016                                 break;
4017                         }
4018                 }
4019
4020                 /* Analyze "visible" monsters only */
4021                 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4022                 {
4023                         /* Count "obvious" attacks (and ones that cause damage) */
4024                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4025                         {
4026                                 /* Count attacks of this type */
4027                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4028                                 {
4029                                         r_ptr->r_blows[ap_cnt]++;
4030                                 }
4031                         }
4032                 }
4033
4034                 if (target_ptr->riding && damage)
4035                 {
4036                         char m_steed_name[MAX_NLEN];
4037                         monster_desc(m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
4038                         if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
4039                         {
4040                                 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4041                         }
4042                 }
4043
4044                 if (target_ptr->special_defense & NINJA_KAWARIMI)
4045                 {
4046                         if (kawarimi(target_ptr, FALSE)) return TRUE;
4047                 }
4048         }
4049
4050         /* Hex - revenge damage stored */
4051         revenge_store(target_ptr, get_damage);
4052
4053         if ((target_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4054                 && get_damage > 0 && !target_ptr->is_dead)
4055         {
4056 #ifdef JP
4057                 msg_format("攻撃が%s自身を傷つけた!", m_name);
4058 #else
4059                 GAME_TEXT m_name_self[80];
4060
4061                 /* hisself */
4062                 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4063
4064                 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4065 #endif
4066                 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4067                 if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
4068         }
4069
4070         if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
4071         {
4072                 char m_target_name[MAX_NLEN];
4073                 monster_desc(m_target_name, m_ptr, 0);
4074
4075                 target_ptr->csp -= 7;
4076                 msg_format(_("%^sに反撃した!", "Your counterattacked to %s!"), m_target_name);
4077                 py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4078                 fear = FALSE;
4079                 target_ptr->redraw |= (PR_MANA);
4080         }
4081
4082         /* Blink away */
4083         if (blinked && alive && !target_ptr->is_dead)
4084         {
4085                 if (teleport_barrier(target_ptr, m_idx))
4086                 {
4087                         msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4088                 }
4089                 else
4090                 {
4091                         msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4092                         teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4093                 }
4094         }
4095
4096         /* Always notice cause of death */
4097         if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
4098         {
4099                 r_ptr->r_deaths++;
4100         }
4101
4102         if (m_ptr->ml && fear && alive && !target_ptr->is_dead)
4103         {
4104                 sound(SOUND_FLEE);
4105                 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4106         }
4107
4108         if (target_ptr->special_defense & KATA_IAI)
4109         {
4110                 set_action(target_ptr, ACTION_NONE);
4111         }
4112
4113         /* Assume we attacked */
4114         return TRUE;
4115 }
4116
4117
4118 #define BLOW_EFFECT_TYPE_NONE  0
4119 #define BLOW_EFFECT_TYPE_FEAR  1
4120 #define BLOW_EFFECT_TYPE_SLEEP 2
4121 #define BLOW_EFFECT_TYPE_HEAL  3
4122
4123 /*!
4124  * @brief モンスターから敵モンスターへの打撃攻撃処理
4125  * @param m_idx 攻撃側モンスターの参照ID
4126  * @param t_idx 目標側モンスターの参照ID
4127  * @return 実際に打撃処理が行われた場合TRUEを返す
4128  */
4129 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
4130 {
4131         monster_type    *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
4132         monster_type    *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
4133
4134         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
4135         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
4136
4137         ARMOUR_CLASS ap_cnt;
4138         ARMOUR_CLASS ac;
4139         DEPTH rlev;
4140         int pt;
4141         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
4142         char            temp[MAX_NLEN];
4143         bool            blinked;
4144         bool            explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE;
4145         POSITION y_saver = t_ptr->fy;
4146         POSITION x_saver = t_ptr->fx;
4147         int             effect_type;
4148
4149         bool see_m = is_seen(m_ptr);
4150         bool see_t = is_seen(t_ptr);
4151         bool see_either = see_m || see_t;
4152
4153         /* Can the player be aware of this attack? */
4154         bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
4155         bool do_silly_attack = (one_in_(2) && subject_ptr->image);
4156
4157         /* Cannot attack self */
4158         if (m_idx == t_idx) return FALSE;
4159
4160         /* Not allowed to attack */
4161         if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
4162
4163         if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
4164
4165         /* Total armor */
4166         ac = tr_ptr->ac;
4167
4168         /* Extract the effective monster level */
4169         rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4170
4171         monster_desc(m_name, m_ptr, 0);
4172         monster_desc(t_name, t_ptr, 0);
4173
4174         /* Assume no blink */
4175         blinked = FALSE;
4176
4177         if (!see_either && known)
4178         {
4179                 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4180         }
4181
4182         if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
4183
4184         /* Scan through all four blows */
4185         for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
4186         {
4187                 bool obvious = FALSE;
4188
4189                 HIT_POINT power = 0;
4190                 HIT_POINT damage = 0;
4191
4192                 concptr act = NULL;
4193
4194                 /* Extract the attack infomation */
4195                 int effect = r_ptr->blow[ap_cnt].effect;
4196                 int method = r_ptr->blow[ap_cnt].method;
4197                 int d_dice = r_ptr->blow[ap_cnt].d_dice;
4198                 int d_side = r_ptr->blow[ap_cnt].d_side;
4199
4200                 if (!monster_is_valid(m_ptr)) break;
4201
4202                 /* Stop attacking if the target dies! */
4203                 if (t_ptr->fx != x_saver || t_ptr->fy != y_saver)
4204                         break;
4205
4206                 /* Hack -- no more attacks */
4207                 if (!method) break;
4208
4209                 if (method == RBM_SHOOT) continue;
4210
4211                 /* Extract the attack "power" */
4212                 power = mbe_info[effect].power;
4213
4214                 /* Monster hits */
4215                 if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
4216                 {
4217                         (void)set_monster_csleep(t_idx, 0);
4218
4219                         if (t_ptr->ml)
4220                         {
4221                                 /* Redraw the health bar */
4222                                 if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
4223                                 if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
4224                         }
4225
4226                         /* Describe the attack method */
4227                         switch (method)
4228                         {
4229                         case RBM_HIT:
4230                         {
4231                                 act = _("%sを殴った。", "hits %s.");
4232                                 touched = TRUE;
4233                                 break;
4234                         }
4235
4236                         case RBM_TOUCH:
4237                         {
4238                                 act = _("%sを触った。", "touches %s.");
4239                                 touched = TRUE;
4240                                 break;
4241                         }
4242
4243                         case RBM_PUNCH:
4244                         {
4245                                 act = _("%sをパンチした。", "punches %s.");
4246                                 touched = TRUE;
4247                                 break;
4248                         }
4249
4250                         case RBM_KICK:
4251                         {
4252                                 act = _("%sを蹴った。", "kicks %s.");
4253                                 touched = TRUE;
4254                                 break;
4255                         }
4256
4257                         case RBM_CLAW:
4258                         {
4259                                 act = _("%sをひっかいた。", "claws %s.");
4260                                 touched = TRUE;
4261                                 break;
4262                         }
4263
4264                         case RBM_BITE:
4265                         {
4266                                 act = _("%sを噛んだ。", "bites %s.");
4267                                 touched = TRUE;
4268                                 break;
4269                         }
4270
4271                         case RBM_STING:
4272                         {
4273                                 act = _("%sを刺した。", "stings %s.");
4274                                 touched = TRUE;
4275                                 break;
4276                         }
4277
4278                         case RBM_SLASH:
4279                         {
4280                                 act = _("%sを斬った。", "slashes %s.");
4281                                 break;
4282                         }
4283
4284                         case RBM_BUTT:
4285                         {
4286                                 act = _("%sを角で突いた。", "butts %s.");
4287                                 touched = TRUE;
4288                                 break;
4289                         }
4290
4291                         case RBM_CRUSH:
4292                         {
4293                                 act = _("%sに体当りした。", "crushes %s.");
4294                                 touched = TRUE;
4295                                 break;
4296                         }
4297
4298                         case RBM_ENGULF:
4299                         {
4300                                 act = _("%sを飲み込んだ。", "engulfs %s.");
4301                                 touched = TRUE;
4302                                 break;
4303                         }
4304
4305                         case RBM_CHARGE:
4306                         {
4307                                 act = _("%sに請求書をよこした。", "charges %s.");
4308                                 touched = TRUE;
4309                                 break;
4310                         }
4311
4312                         case RBM_CRAWL:
4313                         {
4314                                 act = _("%sの体の上を這い回った。", "crawls on %s.");
4315                                 touched = TRUE;
4316                                 break;
4317                         }
4318
4319                         case RBM_DROOL:
4320                         {
4321                                 act = _("%sによだれをたらした。", "drools on %s.");
4322                                 touched = FALSE;
4323                                 break;
4324                         }
4325
4326                         case RBM_SPIT:
4327                         {
4328                                 act = _("%sに唾を吐いた。", "spits on %s.");
4329                                 touched = FALSE;
4330                                 break;
4331                         }
4332
4333                         case RBM_EXPLODE:
4334                         {
4335                                 if (see_either) disturb(subject_ptr, TRUE, TRUE);
4336                                 act = _("爆発した。", "explodes.");
4337                                 explode = TRUE;
4338                                 touched = FALSE;
4339                                 break;
4340                         }
4341
4342                         case RBM_GAZE:
4343                         {
4344                                 act = _("%sをにらんだ。", "gazes at %s.");
4345                                 touched = FALSE;
4346                                 break;
4347                         }
4348
4349                         case RBM_WAIL:
4350                         {
4351                                 act = _("%sに泣きついた。", "wails at %s.");
4352                                 touched = FALSE;
4353                                 break;
4354                         }
4355
4356                         case RBM_SPORE:
4357                         {
4358                                 act = _("%sに胞子を飛ばした。", "releases spores at %s.");
4359                                 touched = FALSE;
4360                                 break;
4361                         }
4362
4363                         case RBM_XXX4:
4364                         {
4365                                 act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
4366                                 touched = FALSE;
4367                                 break;
4368                         }
4369
4370                         case RBM_BEG:
4371                         {
4372                                 act = _("%sに金をせがんだ。", "begs %s for money.");
4373                                 touched = FALSE;
4374                                 break;
4375                         }
4376
4377                         case RBM_INSULT:
4378                         {
4379                                 act = _("%sを侮辱した。", "insults %s.");
4380                                 touched = FALSE;
4381                                 break;
4382                         }
4383
4384                         case RBM_MOAN:
4385                         {
4386                                 act = _("%sにむかってうめいた。", "moans at %s.");
4387                                 touched = FALSE;
4388                                 break;
4389                         }
4390
4391                         case RBM_SHOW:
4392                         {
4393                                 act = _("%sにむかって歌った。", "sings to %s.");
4394                                 touched = FALSE;
4395                                 break;
4396                         }
4397                         }
4398
4399                         if (act && see_either)
4400                         {
4401 #ifdef JP
4402                                 if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
4403                                 strfmt(temp, act, t_name);
4404                                 msg_format("%^sは%s", m_name, temp);
4405 #else
4406                                 if (do_silly_attack)
4407                                 {
4408                                         act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
4409                                         strfmt(temp, "%s %s.", act, t_name);
4410                                 }
4411                                 else strfmt(temp, act, t_name);
4412                                 msg_format("%^s %s", m_name, temp);
4413 #endif
4414                         }
4415
4416                         /* Hack -- assume all attacks are obvious */
4417                         obvious = TRUE;
4418
4419                         /* Roll out the damage */
4420                         damage = damroll(d_dice, d_side);
4421
4422                         /* Assume no effect */
4423                         effect_type = BLOW_EFFECT_TYPE_NONE;
4424
4425                         pt = GF_MISSILE;
4426
4427                         /* Apply appropriate damage */
4428                         switch (effect)
4429                         {
4430                         case 0:
4431                         case RBE_DR_MANA:
4432                                 damage = pt = 0;
4433                                 break;
4434
4435                         case RBE_SUPERHURT:
4436                                 if ((randint1(rlev * 2 + 250) > (ac + 200)) || one_in_(13))
4437                                 {
4438                                         int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
4439                                         damage = MAX(damage, tmp_damage * 2);
4440                                         break;
4441                                 }
4442
4443                                 /* Fall through */
4444
4445                         case RBE_HURT:
4446                                 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4447                                 break;
4448
4449                         case RBE_POISON:
4450                         case RBE_DISEASE:
4451                                 pt = GF_POIS;
4452                                 break;
4453
4454                         case RBE_UN_BONUS:
4455                         case RBE_UN_POWER:
4456                                 pt = GF_DISENCHANT;
4457                                 break;
4458
4459                         case RBE_EAT_ITEM:
4460                         case RBE_EAT_GOLD:
4461                                 if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
4462                                 break;
4463
4464                         case RBE_EAT_FOOD:
4465                         case RBE_EAT_LITE:
4466                         case RBE_BLIND:
4467                         case RBE_LOSE_STR:
4468                         case RBE_LOSE_INT:
4469                         case RBE_LOSE_WIS:
4470                         case RBE_LOSE_DEX:
4471                         case RBE_LOSE_CON:
4472                         case RBE_LOSE_CHR:
4473                         case RBE_LOSE_ALL:
4474                                 break;
4475
4476                         case RBE_ACID:
4477                                 pt = GF_ACID;
4478                                 break;
4479
4480                         case RBE_ELEC:
4481                                 pt = GF_ELEC;
4482                                 break;
4483
4484                         case RBE_FIRE:
4485                                 pt = GF_FIRE;
4486                                 break;
4487
4488                         case RBE_COLD:
4489                                 pt = GF_COLD;
4490                                 break;
4491
4492                         case RBE_CONFUSE:
4493                                 pt = GF_CONFUSION;
4494                                 break;
4495
4496                         case RBE_TERRIFY:
4497                                 effect_type = BLOW_EFFECT_TYPE_FEAR;
4498                                 break;
4499
4500                         case RBE_PARALYZE:
4501                                 effect_type = BLOW_EFFECT_TYPE_SLEEP;
4502                                 break;
4503
4504                         case RBE_SHATTER:
4505                                 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4506                                 if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
4507                                 break;
4508
4509                         case RBE_EXP_10:
4510                         case RBE_EXP_20:
4511                         case RBE_EXP_40:
4512                         case RBE_EXP_80:
4513                                 pt = GF_NETHER;
4514                                 break;
4515
4516                         case RBE_TIME:
4517                                 pt = GF_TIME;
4518                                 break;
4519
4520                         case RBE_DR_LIFE:
4521                                 pt = GF_HYPODYNAMIA;
4522                                 effect_type = BLOW_EFFECT_TYPE_HEAL;
4523                                 break;
4524
4525                         case RBE_INERTIA:
4526                                 pt = GF_INERTIAL;
4527                                 break;
4528
4529                         case RBE_STUN:
4530                                 pt = GF_SOUND;
4531                                 break;
4532
4533                         default:
4534                                 pt = 0;
4535                                 break;
4536                         }
4537
4538                         if (pt)
4539                         {
4540                                 /* Do damage if not exploding */
4541                                 if (!explode)
4542                                 {
4543                                         project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4544                                                 damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4545                                 }
4546
4547                                 switch (effect_type)
4548                                 {
4549                                 case BLOW_EFFECT_TYPE_FEAR:
4550                                         project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4551                                                 damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4552                                         break;
4553
4554                                 case BLOW_EFFECT_TYPE_SLEEP:
4555                                         project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4556                                                 r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4557                                         break;
4558
4559                                 case BLOW_EFFECT_TYPE_HEAL:
4560                                         if ((monster_living(m_idx)) && (damage > 2))
4561                                         {
4562                                                 bool did_heal = FALSE;
4563
4564                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
4565
4566                                                 /* Heal */
4567                                                 m_ptr->hp += damroll(4, damage / 6);
4568                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
4569
4570                                                 /* Redraw (later) if needed */
4571                                                 if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
4572                                                 if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
4573
4574                                                 /* Special message */
4575                                                 if (see_m && did_heal)
4576                                                 {
4577                                                         msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
4578                                                 }
4579                                         }
4580                                         break;
4581                                 }
4582
4583                                 if (touched)
4584                                 {
4585                                         /* Aura fire */
4586                                         if ((tr_ptr->flags2 & RF2_AURA_FIRE) && m_ptr->r_idx)
4587                                         {
4588                                                 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4589                                                 {
4590                                                         if (see_either)
4591                                                         {
4592                                                                 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
4593                                                         }
4594                                                         if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
4595                                                         project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4596                                                                 damroll(1 + ((tr_ptr->level) / 26),
4597                                                                         1 + ((tr_ptr->level) / 17)),
4598                                                                 GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4599                                                 }
4600                                                 else
4601                                                 {
4602                                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
4603                                                 }
4604                                         }
4605
4606                                         /* Aura cold */
4607                                         if ((tr_ptr->flags3 & RF3_AURA_COLD) && m_ptr->r_idx)
4608                                         {
4609                                                 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
4610                                                 {
4611                                                         if (see_either)
4612                                                         {
4613                                                                 msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
4614                                                         }
4615                                                         if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
4616                                                         project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4617                                                                 damroll(1 + ((tr_ptr->level) / 26),
4618                                                                         1 + ((tr_ptr->level) / 17)),
4619                                                                 GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4620                                                 }
4621                                                 else
4622                                                 {
4623                                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
4624                                                 }
4625                                         }
4626
4627                                         /* Aura elec */
4628                                         if ((tr_ptr->flags2 & RF2_AURA_ELEC) && m_ptr->r_idx)
4629                                         {
4630                                                 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
4631                                                 {
4632                                                         if (see_either)
4633                                                         {
4634                                                                 msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
4635                                                         }
4636                                                         if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
4637                                                         project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4638                                                                 damroll(1 + ((tr_ptr->level) / 26),
4639                                                                         1 + ((tr_ptr->level) / 17)),
4640                                                                 GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4641                                                 }
4642                                                 else
4643                                                 {
4644                                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
4645                                                 }
4646                                         }
4647                                 }
4648                         }
4649                 }
4650
4651                 /* Monster missed player */
4652                 else
4653                 {
4654                         /* Analyze failed attacks */
4655                         switch (method)
4656                         {
4657                         case RBM_HIT:
4658                         case RBM_TOUCH:
4659                         case RBM_PUNCH:
4660                         case RBM_KICK:
4661                         case RBM_CLAW:
4662                         case RBM_BITE:
4663                         case RBM_STING:
4664                         case RBM_SLASH:
4665                         case RBM_BUTT:
4666                         case RBM_CRUSH:
4667                         case RBM_ENGULF:
4668                         case RBM_CHARGE:
4669                         {
4670                                 (void)set_monster_csleep(t_idx, 0);
4671
4672                                 /* Visible monsters */
4673                                 if (see_m)
4674                                 {
4675 #ifdef JP
4676                                         msg_format("%sは%^sの攻撃をかわした。", t_name, m_name);
4677 #else
4678                                         msg_format("%^s misses %s.", m_name, t_name);
4679 #endif
4680                                 }
4681
4682                                 break;
4683                         }
4684                         }
4685                 }
4686
4687
4688                 /* Analyze "visible" monsters only */
4689                 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4690                 {
4691                         /* Count "obvious" attacks (and ones that cause damage) */
4692                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4693                         {
4694                                 /* Count attacks of this type */
4695                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4696                                 {
4697                                         r_ptr->r_blows[ap_cnt]++;
4698                                 }
4699                         }
4700                 }
4701         }
4702
4703         if (explode)
4704         {
4705                 sound(SOUND_EXPLODE);
4706
4707                 /* Cancel Invulnerability */
4708                 (void)set_monster_invulner(m_idx, 0, FALSE);
4709                 mon_take_hit_mon(m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
4710                 blinked = FALSE;
4711         }
4712
4713         /* Blink away */
4714         if (blinked && m_ptr->r_idx)
4715         {
4716                 if (teleport_barrier(subject_ptr, m_idx))
4717                 {
4718                         if (see_m)
4719                         {
4720                                 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4721                         }
4722                         else if (known)
4723                         {
4724                                 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4725                         }
4726                 }
4727                 else
4728                 {
4729                         if (see_m)
4730                         {
4731                                 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4732                         }
4733                         else if (known)
4734                         {
4735                                 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4736                         }
4737
4738                         teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4739                 }
4740         }
4741
4742         return TRUE;
4743 }
4744
4745
4746
4747 /*!
4748  * @brief モンスターが敵モンスターに行う打撃処理 /
4749  * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4750  * @param m_idx 目標となるモンスターの参照ID
4751  * @param dam ダメージ量
4752  * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4753  * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4754  * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4755  * @param who 打撃を行ったモンスターの参照ID
4756  * @return なし
4757  */
4758 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4759 {
4760         monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
4761         monster_race *r_ptr = &r_info[m_ptr->r_idx];
4762         GAME_TEXT m_name[160];
4763         bool seen = is_seen(m_ptr);
4764
4765         /* Can the player be aware of this attack? */
4766         bool known = (m_ptr->cdis <= MAX_SIGHT);
4767
4768         monster_desc(m_name, m_ptr, 0);
4769
4770         /* Redraw (later) if needed */
4771         if (m_ptr->ml)
4772         {
4773                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4774                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4775         }
4776
4777         (void)set_monster_csleep(m_idx, 0);
4778
4779         if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(p_ptr, TRUE, TRUE);
4780
4781         if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4782         {
4783                 if (seen)
4784                 {
4785                         msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4786                 }
4787                 return;
4788         }
4789
4790         if (r_ptr->flagsr & RFR_RES_ALL)
4791         {
4792                 if (dam > 0)
4793                 {
4794                         dam /= 100;
4795                         if ((dam == 0) && one_in_(3)) dam = 1;
4796                 }
4797                 if (dam == 0)
4798                 {
4799                         if (seen)
4800                         {
4801                                 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4802                         }
4803                         return;
4804                 }
4805         }
4806
4807         /* Hurt it */
4808         m_ptr->hp -= dam;
4809
4810         /* It is dead now... or is it? */
4811         if (m_ptr->hp < 0)
4812         {
4813                 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4814                         (r_ptr->flags7 & RF7_NAZGUL)) &&
4815                         !p_ptr->phase_out)
4816                 {
4817                         m_ptr->hp = 1;
4818                 }
4819                 else
4820                 {
4821                         /* Make a sound */
4822                         if (!monster_living(m_ptr->r_idx))
4823                         {
4824                                 sound(SOUND_N_KILL);
4825                         }
4826                         else
4827                         {
4828                                 sound(SOUND_KILL);
4829                         }
4830
4831                         *dead = TRUE;
4832
4833                         if (known)
4834                         {
4835                                 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4836                                 /* Unseen death by normal attack */
4837                                 if (!seen)
4838                                 {
4839                                         p_ptr->current_floor_ptr->monster_noise = TRUE;
4840                                 }
4841                                 /* Death by special attack */
4842                                 else if (note)
4843                                 {
4844                                         msg_format(_("%^s%s", "%^s%s"), m_name, note);
4845                                 }
4846                                 /* Death by normal attack -- nonliving monster */
4847                                 else if (!monster_living(m_ptr->r_idx))
4848                                 {
4849                                         msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4850                                 }
4851                                 /* Death by normal attack -- living monster */
4852                                 else
4853                                 {
4854                                         msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4855                                 }
4856                         }
4857
4858                         monster_gain_exp(who, m_ptr->r_idx);
4859                         monster_death(m_idx, FALSE);
4860                         delete_monster_idx(m_idx);
4861
4862                         /* Not afraid */
4863                         (*fear) = FALSE;
4864
4865                         /* Monster is dead */
4866                         return;
4867                 }
4868         }
4869
4870         *dead = FALSE;
4871
4872 #ifdef ALLOW_FEAR
4873
4874         /* Mega-Hack -- Pain cancels fear */
4875         if (MON_MONFEAR(m_ptr) && (dam > 0))
4876         {
4877                 /* Cure fear */
4878                 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4879                 {
4880                         /* No more fear */
4881                         (*fear) = FALSE;
4882                 }
4883         }
4884
4885         /* Sometimes a monster gets scared by damage */
4886         if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4887         {
4888                 /* Percentage of fully healthy */
4889                 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4890
4891                 /*
4892                 * Run (sometimes) if at 10% or less of max hit points,
4893                 * or (usually) when hit for half its current hit points
4894                  */
4895                 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4896                         ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4897                 {
4898                         /* Hack -- note fear */
4899                         (*fear) = TRUE;
4900
4901                         /* Hack -- Add some timed fear */
4902                         (void)set_monster_monfear(m_idx, (randint1(10) +
4903                                 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4904                                         20 : ((11 - percentage) * 5))));
4905                 }
4906         }
4907
4908 #endif /* ALLOW_FEAR */
4909
4910         if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4911         {
4912                 if (is_pet(&p_ptr->current_floor_ptr->m_list[who]) && !player_bold(p_ptr, m_ptr->target_y, m_ptr->target_x))
4913                 {
4914                         set_target(m_ptr, p_ptr->current_floor_ptr->m_list[who].fy, p_ptr->current_floor_ptr->m_list[who].fx);
4915                 }
4916         }
4917
4918         if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4919         {
4920                 monster_desc(m_name, m_ptr, 0);
4921
4922                 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4923                 if (rakuba(p_ptr, (dam > 200) ? 200 : dam, FALSE))
4924                 {
4925                         msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);
4926                 }
4927         }
4928
4929         /* Not dead yet */
4930         return;
4931 }