OSDN Git Service

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