OSDN Git Service

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