OSDN Git Service

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