OSDN Git Service

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