OSDN Git Service

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