OSDN Git Service

[Refactor] #37353 *破壊*と地震の処理を spells-floor.c/h へ移動.
[hengband/hengband.git] / src / 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         /* Percentile dice */
1013         k = randint0(100);
1014
1015         if (stun && one_in_(2)) return FALSE;
1016
1017         /* Hack -- Always miss or hit */
1018         if (k < 10) return (k < 5);
1019
1020         /* Calculate the "attack quality" */
1021         i = (power + (level * 3));
1022
1023         /* Total armor */
1024         ac = p_ptr->ac + p_ptr->to_a;
1025         if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
1026
1027         /* Power and Level compete against Armor */
1028         if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
1029
1030         /* Assume miss */
1031         return (FALSE);
1032 }
1033
1034 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1035 static concptr desc_insult[] =
1036 {
1037 #ifdef JP
1038         "があなたを侮辱した!",
1039         "があなたの母を侮辱した!",
1040         "があなたを軽蔑した!",
1041         "があなたを辱めた!",
1042         "があなたを汚した!",
1043         "があなたの回りで踊った!",
1044         "が猥褻な身ぶりをした!",
1045         "があなたをぼんやりと見た!!!",
1046         "があなたをパラサイト呼ばわりした!",
1047         "があなたをサイボーグ扱いした!"
1048 #else
1049         "insults you!",
1050         "insults your mother!",
1051         "gives you the finger!",
1052         "humiliates you!",
1053         "defiles you!",
1054         "dances around you!",
1055         "makes obscene gestures!",
1056         "moons you!!!"
1057         "calls you a parasite!",
1058         "calls you a cyborg!"
1059 #endif
1060
1061 };
1062
1063 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1064 static concptr desc_moan[] =
1065 {
1066 #ifdef JP
1067         "は何かを悲しんでいるようだ。",
1068         "が彼の飼い犬を見なかったかと尋ねている。",
1069         "が縄張りから出て行けと言っている。",
1070         "はキノコがどうとか呟いている。"
1071 #else
1072         "seems sad about something.",
1073         "asks if you have seen his dogs.",
1074         "tells you to get off his land.",
1075         "mumbles something about mushrooms."
1076 #endif
1077
1078 };
1079
1080 /*!
1081 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1082 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1083 * @param immune ダメージを回避できる免疫フラグ
1084 * @param flags_offset オーラフラグ配列の参照オフセット
1085 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1086 * @param aura_flag オーラフラグ配列
1087 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1088 * @param message オーラダメージを受けた際のメッセージ
1089 * @return なし
1090 */
1091 static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
1092         HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1093 {
1094         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1095
1096         if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
1097         {
1098                 GAME_TEXT mon_name[MAX_NLEN];
1099                 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1100
1101                 monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
1102                 msg_print(message);
1103                 dam_func(aura_damage, mon_name, -1, TRUE);
1104
1105                 if (is_original_ap_and_seen(m_ptr))
1106                 {
1107                         atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1108                 }
1109
1110                 handle_stuff();
1111         }
1112 }
1113
1114 /*!
1115 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1116 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1117 * @return なし
1118 */
1119 static void touch_zap_player(monster_type *m_ptr)
1120 {
1121         touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1122                 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1123         touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1124                 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1125         touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1126                 elec_dam, _("電撃をくらった!", "You get zapped!"));
1127 }
1128
1129 /*!
1130 * @brief プレイヤーの変異要素による打撃処理
1131 * @param m_idx 攻撃目標となったモンスターの参照ID
1132 * @param attack 変異要素による攻撃要素の種類
1133 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1134 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1135 * @return なし
1136 */
1137 static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1138 {
1139         HIT_POINT k;
1140         int bonus, chance;
1141         WEIGHT n_weight = 0;
1142         monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
1143         monster_race *r_ptr = &r_info[m_ptr->r_idx];
1144         GAME_TEXT m_name[MAX_NLEN];
1145
1146         int dice_num, dice_side;
1147
1148         concptr atk_desc;
1149
1150         switch (attack)
1151         {
1152         case MUT2_SCOR_TAIL:
1153                 dice_num = 3;
1154                 dice_side = 7;
1155                 n_weight = 5;
1156                 atk_desc = _("尻尾", "tail");
1157
1158                 break;
1159         case MUT2_HORNS:
1160                 dice_num = 2;
1161                 dice_side = 6;
1162                 n_weight = 15;
1163                 atk_desc = _("角", "horns");
1164
1165                 break;
1166         case MUT2_BEAK:
1167                 dice_num = 2;
1168                 dice_side = 4;
1169                 n_weight = 5;
1170                 atk_desc = _("クチバシ", "beak");
1171
1172                 break;
1173         case MUT2_TRUNK:
1174                 dice_num = 1;
1175                 dice_side = 4;
1176                 n_weight = 35;
1177                 atk_desc = _("象の鼻", "trunk");
1178
1179                 break;
1180         case MUT2_TENTACLES:
1181                 dice_num = 2;
1182                 dice_side = 5;
1183                 n_weight = 5;
1184                 atk_desc = _("触手", "tentacles");
1185
1186                 break;
1187         default:
1188                 dice_num = dice_side = n_weight = 1;
1189                 atk_desc = _("未定義の部位", "undefined body part");
1190
1191         }
1192
1193         monster_desc(m_name, m_ptr, 0);
1194
1195         /* Calculate the "attack quality" */
1196         bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
1197         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1198
1199         /* Test for hit */
1200         if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1201         {
1202                 sound(SOUND_HIT);
1203                 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1204
1205                 k = damroll(dice_num, dice_side);
1206                 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
1207
1208                 /* Apply the player damage bonuses */
1209                 k += p_ptr->to_d_m;
1210
1211                 /* No negative damage */
1212                 if (k < 0) k = 0;
1213
1214                 /* Modify the damage */
1215                 k = mon_damage_mod(m_ptr, k, FALSE);
1216
1217                 /* Complex message */
1218                 msg_format_wizard(CHEAT_MONSTER,
1219                         _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1220                         k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1221
1222                 /* Anger the monster */
1223                 if (k > 0) anger_monster(m_ptr);
1224
1225                 /* Damage, check for fear and mdeath */
1226                 switch (attack)
1227                 {
1228                 case MUT2_SCOR_TAIL:
1229                         project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1230                         *mdeath = (m_ptr->r_idx == 0);
1231                         break;
1232                 case MUT2_HORNS:
1233                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1234                         break;
1235                 case MUT2_BEAK:
1236                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1237                         break;
1238                 case MUT2_TRUNK:
1239                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1240                         break;
1241                 case MUT2_TENTACLES:
1242                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1243                         break;
1244                 default:
1245                         *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1246                 }
1247
1248                 touch_zap_player(m_ptr);
1249         }
1250         /* Player misses */
1251         else
1252         {
1253                 sound(SOUND_MISS);
1254                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1255         }
1256 }
1257
1258 /*!
1259 * @brief プレイヤーの打撃処理サブルーチン /
1260 * Player attacks a (poor, defenseless) creature        -RAK-
1261 * @param y 攻撃目標のY座標
1262 * @param x 攻撃目標のX座標
1263 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1264 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1265 * @param hand 攻撃を行うための武器を持つ手
1266 * @param mode 発動中の剣術ID
1267 * @return なし
1268 * @details
1269 * If no "weapon" is available, then "punch" the monster one time.
1270 */
1271 static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1272 {
1273         int num = 0, bonus, chance, vir;
1274         HIT_POINT k;
1275
1276         grid_type       *g_ptr = &current_floor_ptr->grid_array[y][x];
1277
1278         monster_type    *m_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
1279         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
1280
1281         /* Access the weapon */
1282         object_type     *o_ptr = &p_ptr->inventory_list[INVEN_RARM + hand];
1283
1284         GAME_TEXT m_name[MAX_NLEN];
1285
1286         bool            success_hit = FALSE;
1287         bool            backstab = FALSE;
1288         bool            vorpal_cut = FALSE;
1289         int             chaos_effect = 0;
1290         bool            stab_fleeing = FALSE;
1291         bool            fuiuchi = FALSE;
1292         bool            monk_attack = FALSE;
1293         bool            do_quake = FALSE;
1294         bool            weak = FALSE;
1295         bool            drain_msg = TRUE;
1296         int             drain_result = 0, drain_heal = 0;
1297         bool            can_drain = FALSE;
1298         int             num_blow;
1299         int             drain_left = MAX_VAMPIRIC_DRAIN;
1300         BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1301         bool            is_human = (r_ptr->d_char == 'p');
1302         bool            is_lowlevel = (r_ptr->level < (p_ptr->lev - 15));
1303         bool            zantetsu_mukou, e_j_mukou;
1304
1305         switch (p_ptr->pclass)
1306         {
1307         case CLASS_ROGUE:
1308         case CLASS_NINJA:
1309                 if (has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
1310                 {
1311                         int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
1312                         if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1313                         if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1314                         if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
1315                         if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1316                         {
1317                                 /* Can't backstab creatures that we can't see, right? */
1318                                 backstab = TRUE;
1319                         }
1320                         else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1321                         {
1322                                 fuiuchi = TRUE;
1323                         }
1324                         else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1325                         {
1326                                 stab_fleeing = TRUE;
1327                         }
1328                 }
1329                 break;
1330
1331         case CLASS_MONK:
1332         case CLASS_FORCETRAINER:
1333         case CLASS_BERSERKER:
1334                 if ((empty_hands(TRUE) & EMPTY_HAND_RARM) && !p_ptr->riding) monk_attack = TRUE;
1335                 break;
1336         }
1337
1338         if (!o_ptr->k_idx) /* Empty hand */
1339         {
1340                 if ((r_ptr->level + 10) > p_ptr->lev)
1341                 {
1342                         if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
1343                         {
1344                                 if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1345                                         p_ptr->skill_exp[GINOU_SUDE] += 40;
1346                                 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1347                                         p_ptr->skill_exp[GINOU_SUDE] += 5;
1348                                 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
1349                                         p_ptr->skill_exp[GINOU_SUDE] += 1;
1350                                 else if ((p_ptr->lev > 34))
1351                                         if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
1352                                 p_ptr->update |= (PU_BONUS);
1353                         }
1354                 }
1355         }
1356         else if (object_is_melee_weapon(o_ptr))
1357         {
1358                 if ((r_ptr->level + 10) > p_ptr->lev)
1359                 {
1360                         OBJECT_TYPE_VALUE tval = p_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1361                         OBJECT_SUBTYPE_VALUE sval = p_ptr->inventory_list[INVEN_RARM + hand].sval;
1362                         int now_exp = p_ptr->weapon_exp[tval][sval];
1363                         if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
1364                         {
1365                                 SUB_EXP amount = 0;
1366                                 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1367                                 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1368                                 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
1369                                 else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
1370                                 p_ptr->weapon_exp[tval][sval] += amount;
1371                                 p_ptr->update |= (PU_BONUS);
1372                         }
1373                 }
1374         }
1375
1376         /* Disturb the monster */
1377         (void)set_monster_csleep(g_ptr->m_idx, 0);
1378
1379         monster_desc(m_name, m_ptr, 0);
1380
1381         /* Calculate the "attack quality" */
1382         bonus = p_ptr->to_h[hand] + o_ptr->to_h;
1383         chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1384         if (mode == HISSATSU_IAI) chance += 60;
1385         if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1386         if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1387
1388         vir = virtue_number(V_VALOUR);
1389         if (vir)
1390         {
1391                 chance += (p_ptr->virtues[vir - 1] / 10);
1392         }
1393
1394         zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1395         e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1396
1397         if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1398         else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand] + 2;
1399         else num_blow = p_ptr->num_blow[hand];
1400
1401         /* Hack -- DOKUBARI always hit once */
1402         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
1403
1404         /* Attack once for each legal blow */
1405         while ((num++ < num_blow) && !p_ptr->is_dead)
1406         {
1407                 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1408                 {
1409                         int n = 1;
1410
1411                         if (p_ptr->migite && p_ptr->hidarite)
1412                         {
1413                                 n *= 2;
1414                         }
1415                         if (mode == HISSATSU_3DAN)
1416                         {
1417                                 n *= 2;
1418                         }
1419
1420                         success_hit = one_in_(n);
1421                 }
1422                 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1423                 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1424
1425                 if (mode == HISSATSU_MAJIN)
1426                 {
1427                         if (one_in_(2))
1428                                 success_hit = FALSE;
1429                 }
1430
1431                 /* Test for hit */
1432                 if (success_hit)
1433                 {
1434                         int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1435
1436                         sound(SOUND_HIT);
1437
1438                         if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1439                         else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1440                         else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1441                         else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1442
1443                         /* Hack -- bare hands do one damage */
1444                         k = 1;
1445
1446                         object_flags(o_ptr, flgs);
1447
1448                         /* Select a chaotic effect (50% chance) */
1449                         if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1450                         {
1451                                 if (one_in_(10))
1452                                         chg_virtue(V_CHANCE, 1);
1453
1454                                 if (randint1(5) < 3)
1455                                 {
1456                                         /* Vampiric (20%) */
1457                                         chaos_effect = 1;
1458                                 }
1459                                 else if (one_in_(250))
1460                                 {
1461                                         /* Quake (0.12%) */
1462                                         chaos_effect = 2;
1463                                 }
1464                                 else if (!one_in_(10))
1465                                 {
1466                                         /* Confusion (26.892%) */
1467                                         chaos_effect = 3;
1468                                 }
1469                                 else if (one_in_(2))
1470                                 {
1471                                         /* Teleport away (1.494%) */
1472                                         chaos_effect = 4;
1473                                 }
1474                                 else
1475                                 {
1476                                         /* Polymorph (1.494%) */
1477                                         chaos_effect = 5;
1478                                 }
1479                         }
1480
1481                         /* Vampiric drain */
1482                         if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1483                         {
1484                                 /* Only drain "living" monsters */
1485                                 if (monster_living(m_ptr->r_idx))
1486                                         can_drain = TRUE;
1487                                 else
1488                                         can_drain = FALSE;
1489                         }
1490
1491                         if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1492                                 vorpal_cut = TRUE;
1493                         else vorpal_cut = FALSE;
1494
1495                         if (monk_attack)
1496                         {
1497                                 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1498                                 int min_level = 1;
1499                                 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1500                                 int resist_stun = 0;
1501                                 WEIGHT weight = 8;
1502
1503                                 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1504                                 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1505                                 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1506                                 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1507                                 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1508                                         resist_stun += 66;
1509
1510                                 if (p_ptr->special_defense & KAMAE_BYAKKO)
1511                                         max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
1512                                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1513                                         max_times = 1;
1514                                 else if (p_ptr->special_defense & KAMAE_GENBU)
1515                                         max_times = 1;
1516                                 else
1517                                         max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
1518                                 /* Attempt 'times' */
1519                                 for (times = 0; times < max_times; times++)
1520                                 {
1521                                         do
1522                                         {
1523                                                 ma_ptr = &ma_blows[randint0(MAX_MA)];
1524                                                 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1525                                                 else min_level = ma_ptr->min_level;
1526                                         } while ((min_level > p_ptr->lev) ||
1527                                                 (randint1(p_ptr->lev) < ma_ptr->chance));
1528
1529                                         /* keep the highest level attack available we found */
1530                                         if ((ma_ptr->min_level > old_ptr->min_level) &&
1531                                                 !p_ptr->stun && !p_ptr->confused)
1532                                         {
1533                                                 old_ptr = ma_ptr;
1534
1535                                                 if (p_ptr->wizard && cheat_xtra)
1536                                                 {
1537                                                         msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1538                                                 }
1539                                         }
1540                                         else
1541                                         {
1542                                                 ma_ptr = old_ptr;
1543                                         }
1544                                 }
1545
1546                                 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1547                                 else min_level = ma_ptr->min_level;
1548                                 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
1549                                 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1550
1551                                 if (ma_ptr->effect == MA_KNEE)
1552                                 {
1553                                         if (r_ptr->flags1 & RF1_MALE)
1554                                         {
1555                                                 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1556                                                 sound(SOUND_PAIN);
1557                                                 special_effect = MA_KNEE;
1558                                         }
1559                                         else
1560                                                 msg_format(ma_ptr->desc, m_name);
1561                                 }
1562
1563                                 else if (ma_ptr->effect == MA_SLOW)
1564                                 {
1565                                         if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1566                                                 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1567                                         {
1568                                                 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1569                                                 special_effect = MA_SLOW;
1570                                         }
1571                                         else msg_format(ma_ptr->desc, m_name);
1572                                 }
1573                                 else
1574                                 {
1575                                         if (ma_ptr->effect)
1576                                         {
1577                                                 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1578                                         }
1579
1580                                         msg_format(ma_ptr->desc, m_name);
1581                                 }
1582
1583                                 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1584                                 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1585                                 {
1586                                         weight += (P_PTR_KI / 30);
1587                                         if (weight > 20) weight = 20;
1588                                 }
1589
1590                                 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
1591
1592                                 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1593                                 {
1594                                         msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1595                                         stun_effect = 7 + randint1(13);
1596                                         resist_stun /= 3;
1597                                 }
1598
1599                                 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1600                                 {
1601                                         if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1602                                                 (randint1(p_ptr->lev) > r_ptr->level) &&
1603                                                 m_ptr->mspeed > 60)
1604                                         {
1605                                                 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1606                                                 m_ptr->mspeed -= 10;
1607                                         }
1608                                 }
1609
1610                                 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1611                                 {
1612                                         if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1613                                         {
1614                                                 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1615                                                 {
1616                                                         msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1617                                                 }
1618                                                 else
1619                                                 {
1620                                                         msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1621                                                 }
1622                                         }
1623                                 }
1624                         }
1625
1626                         /* Handle normal weapon */
1627                         else if (o_ptr->k_idx)
1628                         {
1629                                 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1630                                 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
1631
1632                                 if (backstab)
1633                                 {
1634                                         k *= (3 + (p_ptr->lev / 20));
1635                                 }
1636                                 else if (fuiuchi)
1637                                 {
1638                                         k = k*(5 + (p_ptr->lev * 2 / 25)) / 2;
1639                                 }
1640                                 else if (stab_fleeing)
1641                                 {
1642                                         k = (3 * k) / 2;
1643                                 }
1644
1645                                 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1646                                         (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1647                                 {
1648                                         do_quake = TRUE;
1649                                 }
1650
1651                                 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1652                                         k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1653
1654                                 drain_result = k;
1655
1656                                 if (vorpal_cut)
1657                                 {
1658                                         int mult = 2;
1659
1660                                         if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1661                                         {
1662                                                 char chainsword_noise[1024];
1663                                                 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1664                                                 {
1665                                                         msg_print(chainsword_noise);
1666                                                 }
1667                                         }
1668
1669                                         if (o_ptr->name1 == ART_VORPAL_BLADE)
1670                                         {
1671                                                 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1672                                         }
1673                                         else
1674                                         {
1675                                                 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1676                                         }
1677
1678                                         /* Try to increase the damage */
1679                                         while (one_in_(vorpal_chance))
1680                                         {
1681                                                 mult++;
1682                                         }
1683
1684                                         k *= (HIT_POINT)mult;
1685
1686                                         /* Ouch! */
1687                                         if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1688                                         {
1689                                                 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1690                                         }
1691                                         else
1692                                         {
1693                                                 switch (mult)
1694                                                 {
1695                                                 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1696                                                 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1697                                                 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1698                                                 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1699                                                 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1700                                                 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1701                                                 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1702                                                 }
1703                                         }
1704                                         drain_result = drain_result * 3 / 2;
1705                                 }
1706
1707                                 k += o_ptr->to_d;
1708                                 drain_result += o_ptr->to_d;
1709                         }
1710
1711                         /* Apply the player damage bonuses */
1712                         k += p_ptr->to_d[hand];
1713                         drain_result += p_ptr->to_d[hand];
1714
1715                         if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1716                         if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1717                         if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
1718
1719                         /* No negative damage */
1720                         if (k < 0) k = 0;
1721
1722                         if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1723                         {
1724                                 k = 0;
1725                         }
1726
1727                         if (zantetsu_mukou)
1728                         {
1729                                 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1730                                 k = 0;
1731                         }
1732
1733                         if (e_j_mukou)
1734                         {
1735                                 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1736                                 k /= 2;
1737                         }
1738
1739                         if (mode == HISSATSU_MINEUCHI)
1740                         {
1741                                 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
1742
1743                                 k = 0;
1744                                 anger_monster(m_ptr);
1745
1746                                 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1747                                 {
1748                                         /* Get stunned */
1749                                         if (MON_STUNNED(m_ptr))
1750                                         {
1751                                                 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1752                                                 tmp /= 2;
1753                                         }
1754                                         else
1755                                         {
1756                                                 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1757                                         }
1758
1759                                         /* Apply stun */
1760                                         (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1761                                 }
1762                                 else
1763                                 {
1764                                         msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1765                                 }
1766                         }
1767
1768                         /* Modify the damage */
1769                         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))));
1770                         if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1771                         {
1772                                 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1773                                 {
1774                                         k = m_ptr->hp + 1;
1775                                         msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1776                                 }
1777                                 else k = 1;
1778                         }
1779                         else if ((p_ptr->pclass == CLASS_NINJA) && has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand] && ((p_ptr->cur_lite <= 0) || one_in_(7)))
1780                         {
1781                                 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1782                                 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1783                                 {
1784                                         k *= 5;
1785                                         drain_result *= 2;
1786                                         msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1787                                 }
1788                                 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)))
1789                                 {
1790                                         if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1791                                         {
1792                                                 k = MAX(k * 5, m_ptr->hp / 2);
1793                                                 drain_result *= 2;
1794                                                 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1795                                         }
1796                                         else
1797                                         {
1798                                                 k = m_ptr->hp + 1;
1799                                                 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1800                                         }
1801                                 }
1802                         }
1803
1804                         msg_format_wizard(CHEAT_MONSTER,
1805                                 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1806                                 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1807
1808                         if (k <= 0) can_drain = FALSE;
1809
1810                         if (drain_result > m_ptr->hp)
1811                                 drain_result = m_ptr->hp;
1812
1813                         /* Damage, check for fear and death */
1814                         if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1815                         {
1816                                 *mdeath = TRUE;
1817                                 if ((p_ptr->pclass == CLASS_BERSERKER) && p_ptr->energy_use)
1818                                 {
1819                                         if (p_ptr->migite && p_ptr->hidarite)
1820                                         {
1821                                                 if (hand) p_ptr->energy_use = p_ptr->energy_use * 3 / 5 + p_ptr->energy_use*num * 2 / (p_ptr->num_blow[hand] * 5);
1822                                                 else p_ptr->energy_use = p_ptr->energy_use*num * 3 / (p_ptr->num_blow[hand] * 5);
1823                                         }
1824                                         else
1825                                         {
1826                                                 p_ptr->energy_use = p_ptr->energy_use*num / p_ptr->num_blow[hand];
1827                                         }
1828                                 }
1829                                 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1830                                         msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1831                                 break;
1832                         }
1833
1834                         /* Anger the monster */
1835                         if (k > 0) anger_monster(m_ptr);
1836
1837                         touch_zap_player(m_ptr);
1838
1839                         /* Are we draining it?  A little note: If the monster is
1840                         dead, the drain does not work... */
1841
1842                         if (can_drain && (drain_result > 0))
1843                         {
1844                                 if (o_ptr->name1 == ART_MURAMASA)
1845                                 {
1846                                         if (is_human)
1847                                         {
1848                                                 HIT_PROB to_h = o_ptr->to_h;
1849                                                 HIT_POINT to_d = o_ptr->to_d;
1850                                                 int i, flag;
1851
1852                                                 flag = 1;
1853                                                 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1854                                                 if (flag) to_h++;
1855
1856                                                 flag = 1;
1857                                                 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1858                                                 if (flag) to_d++;
1859
1860                                                 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1861                                                 {
1862                                                         msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1863                                                         o_ptr->to_h = to_h;
1864                                                         o_ptr->to_d = to_d;
1865                                                 }
1866                                         }
1867                                 }
1868                                 else
1869                                 {
1870                                         if (drain_result > 5) /* Did we really hurt it? */
1871                                         {
1872                                                 drain_heal = damroll(2, drain_result / 6);
1873
1874                                                 /* Hex */
1875                                                 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1876
1877                                                 if (cheat_xtra)
1878                                                 {
1879                                                         msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1880                                                 }
1881
1882                                                 if (drain_left)
1883                                                 {
1884                                                         if (drain_heal < drain_left)
1885                                                         {
1886                                                                 drain_left -= drain_heal;
1887                                                         }
1888                                                         else
1889                                                         {
1890                                                                 drain_heal = drain_left;
1891                                                                 drain_left = 0;
1892                                                         }
1893
1894                                                         if (drain_msg)
1895                                                         {
1896                                                                 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1897                                                                 drain_msg = FALSE;
1898                                                         }
1899
1900                                                         drain_heal = (drain_heal * p_ptr->mutant_regenerate_mod) / 100;
1901
1902                                                         hp_player(drain_heal);
1903                                                         /* We get to keep some of it! */
1904                                                 }
1905                                         }
1906                                 }
1907                                 m_ptr->maxhp -= (k + 7) / 8;
1908                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1909                                 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1910                                 weak = TRUE;
1911                         }
1912                         can_drain = FALSE;
1913                         drain_result = 0;
1914
1915                         /* Confusion attack */
1916                         if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1917                         {
1918                                 /* Cancel glowing hands */
1919                                 if (p_ptr->special_attack & ATTACK_CONFUSE)
1920                                 {
1921                                         p_ptr->special_attack &= ~(ATTACK_CONFUSE);
1922                                         msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1923                                         p_ptr->redraw |= (PR_STATUS);
1924
1925                                 }
1926
1927                                 /* Confuse the monster */
1928                                 if (r_ptr->flags3 & RF3_NO_CONF)
1929                                 {
1930                                         if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1931                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1932
1933                                 }
1934                                 else if (randint0(100) < r_ptr->level)
1935                                 {
1936                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1937                                 }
1938                                 else
1939                                 {
1940                                         msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1941                                         (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
1942                                 }
1943                         }
1944
1945                         else if (chaos_effect == 4)
1946                         {
1947                                 bool resists_tele = FALSE;
1948
1949                                 if (r_ptr->flagsr & RFR_RES_TELE)
1950                                 {
1951                                         if (r_ptr->flags1 & RF1_UNIQUE)
1952                                         {
1953                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1954                                                 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1955                                                 resists_tele = TRUE;
1956                                         }
1957                                         else if (r_ptr->level > randint1(100))
1958                                         {
1959                                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1960                                                 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1961                                                 resists_tele = TRUE;
1962                                         }
1963                                 }
1964
1965                                 if (!resists_tele)
1966                                 {
1967                                         msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1968                                         teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1969                                         num = num_blow + 1; /* Can't hit it anymore! */
1970                                         *mdeath = TRUE;
1971                                 }
1972                         }
1973
1974                         else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1975                         {
1976                                 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1977                                         !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1978                                 {
1979                                         if (polymorph_monster(y, x))
1980                                         {
1981                                                 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1982                                                 *fear = FALSE;
1983                                                 weak = FALSE;
1984                                         }
1985                                         else
1986                                         {
1987                                                 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1988                                         }
1989
1990                                         /* Hack -- Get new monster */
1991                                         m_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
1992
1993                                         /* Oops, we need a different name... */
1994                                         monster_desc(m_name, m_ptr, 0);
1995
1996                                         /* Hack -- Get new race */
1997                                         r_ptr = &r_info[m_ptr->r_idx];
1998                                 }
1999                         }
2000                         else if (o_ptr->name1 == ART_G_HAMMER)
2001                         {
2002                                 monster_type *target_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
2003
2004                                 if (target_ptr->hold_o_idx)
2005                                 {
2006                                         object_type *q_ptr = &current_floor_ptr->o_list[target_ptr->hold_o_idx];
2007                                         GAME_TEXT o_name[MAX_NLEN];
2008
2009                                         object_desc(o_name, q_ptr, OD_NAME_ONLY);
2010                                         q_ptr->held_m_idx = 0;
2011                                         q_ptr->marked = OM_TOUCHED;
2012                                         target_ptr->hold_o_idx = q_ptr->next_o_idx;
2013                                         q_ptr->next_o_idx = 0;
2014                                         msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2015                                         inven_carry(q_ptr);
2016                                 }
2017                         }
2018                 }
2019
2020                 /* Player misses */
2021                 else
2022                 {
2023                         backstab = FALSE; /* Clumsy! */
2024                         fuiuchi = FALSE; /* Clumsy! */
2025
2026                         if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2027                         {
2028                                 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2029
2030                                 sound(SOUND_HIT);
2031
2032                                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2033                                 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2034                                 object_flags(o_ptr, flgs_aux);
2035
2036                                 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2037                                 {
2038                                         int mult;
2039                                         switch (p_ptr->mimic_form)
2040                                         {
2041                                         case MIMIC_NONE:
2042                                                 switch (p_ptr->prace)
2043                                                 {
2044                                                 case RACE_YEEK:
2045                                                 case RACE_KLACKON:
2046                                                 case RACE_HUMAN:
2047                                                 case RACE_AMBERITE:
2048                                                 case RACE_DUNADAN:
2049                                                 case RACE_BARBARIAN:
2050                                                 case RACE_BEASTMAN:
2051                                                         mult = 25; break;
2052                                                 case RACE_HALF_ORC:
2053                                                 case RACE_HALF_TROLL:
2054                                                 case RACE_HALF_OGRE:
2055                                                 case RACE_HALF_GIANT:
2056                                                 case RACE_HALF_TITAN:
2057                                                 case RACE_CYCLOPS:
2058                                                 case RACE_IMP:
2059                                                 case RACE_SKELETON:
2060                                                 case RACE_ZOMBIE:
2061                                                 case RACE_VAMPIRE:
2062                                                 case RACE_SPECTRE:
2063                                                 case RACE_DEMON:
2064                                                 case RACE_DRACONIAN:
2065                                                         mult = 30; break;
2066                                                 default:
2067                                                         mult = 10; break;
2068                                                 }
2069                                                 break;
2070                                         case MIMIC_DEMON:
2071                                         case MIMIC_DEMON_LORD:
2072                                         case MIMIC_VAMPIRE:
2073                                                 mult = 30; break;
2074                                         default:
2075                                                 mult = 10; break;
2076                                         }
2077
2078                                         if (p_ptr->align < 0 && mult < 20)
2079                                                 mult = 20;
2080                                         if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
2081                                                 mult = 25;
2082                                         if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
2083                                                 mult = 25;
2084                                         if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
2085                                                 mult = 25;
2086                                         if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
2087                                                 mult = 25;
2088                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2089                                                 mult = 25;
2090
2091                                         if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (p_ptr->csp >(p_ptr->msp / 30)))
2092                                         {
2093                                                 p_ptr->csp -= (1 + (p_ptr->msp / 30));
2094                                                 p_ptr->redraw |= (PR_MANA);
2095                                                 mult = mult * 3 / 2 + 20;
2096                                         }
2097                                         k *= (HIT_POINT)mult;
2098                                         k /= 10;
2099                                 }
2100
2101                                 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
2102                                 if (one_in_(6))
2103                                 {
2104                                         int mult = 2;
2105                                         msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2106                                         /* Try to increase the damage */
2107                                         while (one_in_(4))
2108                                         {
2109                                                 mult++;
2110                                         }
2111
2112                                         k *= (HIT_POINT)mult;
2113                                 }
2114                                 k += (p_ptr->to_d[hand] + o_ptr->to_d);
2115                                 if (k < 0) k = 0;
2116
2117                                 take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2118                                 handle_stuff();
2119                         }
2120                         else
2121                         {
2122                                 sound(SOUND_MISS);
2123                                 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2124                         }
2125                 }
2126                 backstab = FALSE;
2127                 fuiuchi = FALSE;
2128         }
2129
2130
2131         if (weak && !(*mdeath))
2132         {
2133                 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2134         }
2135         if (drain_left != MAX_VAMPIRIC_DRAIN)
2136         {
2137                 if (one_in_(4))
2138                 {
2139                         chg_virtue(V_UNLIFE, 1);
2140                 }
2141         }
2142         /* Mega-Hack -- apply earthquake brand */
2143         if (do_quake)
2144         {
2145                 earthquake(p_ptr->y, p_ptr->x, 10, 0);
2146                 if (!current_floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2147         }
2148 }
2149
2150 /*!
2151 * @brief プレイヤーの打撃処理メインルーチン
2152 * @param y 攻撃目標のY座標
2153 * @param x 攻撃目標のX座標
2154 * @param mode 発動中の剣術ID
2155 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2156 * @details
2157 * If no "weapon" is available, then "punch" the monster one time.
2158 */
2159 bool py_attack(POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2160 {
2161         bool            fear = FALSE;
2162         bool            mdeath = FALSE;
2163         bool            stormbringer = FALSE;
2164
2165         grid_type       *g_ptr = &current_floor_ptr->grid_array[y][x];
2166         monster_type    *m_ptr = &current_floor_ptr->m_list[g_ptr->m_idx];
2167         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
2168         GAME_TEXT m_name[MAX_NLEN];
2169
2170         disturb(FALSE, TRUE);
2171
2172         take_turn(p_ptr, 100);
2173
2174         if (!p_ptr->migite && !p_ptr->hidarite &&
2175                 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2176         {
2177                 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2178                         (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2179                 return FALSE;
2180         }
2181
2182         monster_desc(m_name, m_ptr, 0);
2183
2184         if (m_ptr->ml)
2185         {
2186                 /* Auto-Recall if possible and visible */
2187                 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
2188
2189                 health_track(g_ptr->m_idx);
2190         }
2191
2192         if ((r_ptr->flags1 & RF1_FEMALE) &&
2193                 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
2194         {
2195                 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2196                 {
2197                         msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2198                         return FALSE;
2199                 }
2200         }
2201
2202         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2203         {
2204                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2205                 return FALSE;
2206         }
2207
2208         /* Stop if friendly */
2209         if (!is_hostile(m_ptr) &&
2210                 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
2211                         p_ptr->shero || !m_ptr->ml))
2212         {
2213                 if (p_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2214                 if (p_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2215                 if (stormbringer)
2216                 {
2217                         msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2218                         chg_virtue(V_INDIVIDUALISM, 1);
2219                         chg_virtue(V_HONOUR, -1);
2220                         chg_virtue(V_JUSTICE, -1);
2221                         chg_virtue(V_COMPASSION, -1);
2222                 }
2223                 else if (p_ptr->pclass != CLASS_BERSERKER)
2224                 {
2225                         if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2226                         {
2227                                 chg_virtue(V_INDIVIDUALISM, 1);
2228                                 chg_virtue(V_HONOUR, -1);
2229                                 chg_virtue(V_JUSTICE, -1);
2230                                 chg_virtue(V_COMPASSION, -1);
2231                         }
2232                         else
2233                         {
2234                                 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2235                                 return FALSE;
2236                         }
2237                 }
2238         }
2239
2240
2241         /* Handle player fear */
2242         if (p_ptr->afraid)
2243         {
2244                 if (m_ptr->ml)
2245                         msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2246                 else
2247                         msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2248
2249                 /* Disturb the monster */
2250                 (void)set_monster_csleep(g_ptr->m_idx, 0);
2251
2252                 return FALSE;
2253         }
2254
2255         if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2256         {
2257                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
2258                 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
2259         }
2260
2261         if (p_ptr->migite && p_ptr->hidarite)
2262         {
2263                 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))
2264                 {
2265                         if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2266                                 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
2267                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2268                                 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
2269                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2270                                 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2271                         else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2272                                 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2273                         p_ptr->update |= (PU_BONUS);
2274                 }
2275         }
2276
2277         /* Gain riding experience */
2278         if (p_ptr->riding)
2279         {
2280                 int cur = p_ptr->skill_exp[GINOU_RIDING];
2281                 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
2282
2283                 if (cur < max)
2284                 {
2285                         DEPTH ridinglevel = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level;
2286                         DEPTH targetlevel = r_ptr->level;
2287                         int inc = 0;
2288
2289                         if ((cur / 200 - 5) < targetlevel)
2290                                 inc += 1;
2291
2292                         /* Extra experience */
2293                         if ((cur / 100) < ridinglevel)
2294                         {
2295                                 if ((cur / 100 + 15) < ridinglevel)
2296                                         inc += 1 + (ridinglevel - (cur / 100 + 15));
2297                                 else
2298                                         inc += 1;
2299                         }
2300
2301                         p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2302                         p_ptr->update |= (PU_BONUS);
2303                 }
2304         }
2305
2306         p_ptr->riding_t_m_idx = g_ptr->m_idx;
2307         if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
2308         if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
2309
2310         /* Mutations which yield extra 'natural' attacks */
2311         if (!mdeath)
2312         {
2313                 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
2314                         natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2315                 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
2316                         natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2317                 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2318                         natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2319                 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2320                         natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2321                 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2322                         natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2323         }
2324
2325         /* Hack -- delay fear messages */
2326         if (fear && m_ptr->ml && !mdeath)
2327         {
2328                 sound(SOUND_FLEE);
2329
2330                 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2331         }
2332
2333         if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2334         {
2335                 set_action(ACTION_NONE);
2336         }
2337
2338         return mdeath;
2339 }
2340
2341 /*!
2342  * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2343  * @param m_idx 打撃を行うモンスターのID
2344  * @return 実際に攻撃処理を行った場合TRUEを返す
2345  */
2346 bool make_attack_normal(MONSTER_IDX m_idx)
2347 {
2348         monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
2349         monster_race *r_ptr = &r_info[m_ptr->r_idx];
2350
2351         int ap_cnt;
2352
2353         INVENTORY_IDX i;
2354         int k, tmp;
2355         ARMOUR_CLASS ac;
2356         DEPTH rlev;
2357         int do_cut, do_stun;
2358
2359         PRICE gold;
2360         object_type *o_ptr;
2361         GAME_TEXT o_name[MAX_NLEN];
2362         GAME_TEXT m_name[MAX_NLEN];
2363         GAME_TEXT ddesc[80];
2364
2365         bool blinked;
2366         bool touched = FALSE, fear = FALSE, alive = TRUE;
2367         bool explode = FALSE;
2368         bool do_silly_attack = (one_in_(2) && p_ptr->image);
2369         HIT_POINT get_damage = 0;
2370         int abbreviate = 0;     // 2回目以降の省略表現フラグ
2371
2372         /* Not allowed to attack */
2373         if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
2374
2375         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
2376
2377         /* ...nor if friendly */
2378         if (!is_hostile(m_ptr)) return FALSE;
2379
2380         /* Extract the effective monster level */
2381         rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2382
2383         /* Get the monster name (or "it") */
2384         monster_desc(m_name, m_ptr, 0);
2385
2386         monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2387
2388         if (p_ptr->special_defense & KATA_IAI)
2389         {
2390                 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
2391                 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2392         }
2393
2394         if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
2395         {
2396                 if (kawarimi(TRUE)) return TRUE;
2397         }
2398
2399         /* Assume no blink */
2400         blinked = FALSE;
2401
2402         /* Scan through all four blows */
2403         for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2404         {
2405                 bool obvious = FALSE;
2406
2407                 HIT_POINT power = 0;
2408                 HIT_POINT damage = 0;
2409
2410                 concptr act = NULL;
2411
2412                 /* Extract the attack infomation */
2413                 int effect = r_ptr->blow[ap_cnt].effect;
2414                 int method = r_ptr->blow[ap_cnt].method;
2415                 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2416                 int d_side = r_ptr->blow[ap_cnt].d_side;
2417
2418                 if (!monster_is_valid(m_ptr)) break;
2419
2420                 /* Hack -- no more attacks */
2421                 if (!method) break;
2422
2423                 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2424                 {
2425                         method = RBM_HIT;
2426                         d_dice /= 10;
2427                 }
2428
2429                 /* Stop if player is dead or gone */
2430                 if (!p_ptr->playing || p_ptr->is_dead) break;
2431                 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2432
2433                 /* Handle "leaving" */
2434                 if (p_ptr->leaving) break;
2435
2436                 if (method == RBM_SHOOT) continue;
2437
2438                 /* Extract the attack "power" */
2439                 power = mbe_info[effect].power;
2440
2441                 /* Total armor */
2442                 ac = p_ptr->ac + p_ptr->to_a;
2443
2444                 /* Monster hits player */
2445                 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
2446                 {
2447                         /* Always disturbing */
2448                         disturb(TRUE, TRUE);
2449
2450
2451                         /* Hack -- Apply "protection from evil" */
2452                         if ((p_ptr->protevil > 0) &&
2453                             (r_ptr->flags3 & RF3_EVIL) &&
2454                             (p_ptr->lev >= rlev) &&
2455                             ((randint0(100) + p_ptr->lev) > 50))
2456                         {
2457                                 /* Remember the Evil-ness */
2458                                 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2459
2460 #ifdef JP
2461                                 if (abbreviate) msg_format("撃退した。");
2462                                 else msg_format("%^sは撃退された。", m_name);
2463                                 abbreviate = 1; /*2回目以降は省略 */
2464 #else
2465                                 msg_format("%^s is repelled.", m_name);
2466 #endif
2467
2468
2469                                 /* Hack -- Next attack */
2470                                 continue;
2471                         }
2472
2473
2474                         /* Assume no cut or stun */
2475                         do_cut = do_stun = 0;
2476
2477                         /* Describe the attack method */
2478                         switch (method)
2479                         {
2480                                 case RBM_HIT:
2481                                 {
2482                                         act = _("殴られた。", "hits you.");
2483                                         do_cut = do_stun = 1;
2484                                         touched = TRUE;
2485                                         sound(SOUND_HIT);
2486                                         break;
2487                                 }
2488
2489                                 case RBM_TOUCH:
2490                                 {
2491                                         act = _("触られた。", "touches you.");
2492                                         touched = TRUE;
2493                                         sound(SOUND_TOUCH);
2494                                         break;
2495                                 }
2496
2497                                 case RBM_PUNCH:
2498                                 {
2499                                         act = _("パンチされた。", "punches you.");
2500                                         touched = TRUE;
2501                                         do_stun = 1;
2502                                         sound(SOUND_HIT);
2503                                         break;
2504                                 }
2505
2506                                 case RBM_KICK:
2507                                 {
2508                                         act = _("蹴られた。", "kicks you.");
2509                                         touched = TRUE;
2510                                         do_stun = 1;
2511                                         sound(SOUND_HIT);
2512                                         break;
2513                                 }
2514
2515                                 case RBM_CLAW:
2516                                 {
2517                                         act = _("ひっかかれた。", "claws you.");
2518                                         touched = TRUE;
2519                                         do_cut = 1;
2520                                         sound(SOUND_CLAW);
2521                                         break;
2522                                 }
2523
2524                                 case RBM_BITE:
2525                                 {
2526                                         act = _("噛まれた。", "bites you.");
2527                                         do_cut = 1;
2528                                         touched = TRUE;
2529                                         sound(SOUND_BITE);
2530                                         break;
2531                                 }
2532
2533                                 case RBM_STING:
2534                                 {
2535                                         act = _("刺された。", "stings you.");
2536                                         touched = TRUE;
2537                                         sound(SOUND_STING);
2538                                         break;
2539                                 }
2540
2541                                 case RBM_SLASH:
2542                                 {
2543                                         act = _("斬られた。", "slashes you.");
2544                                         touched = TRUE;
2545                                         do_cut = 1;
2546                                         sound(SOUND_CLAW);
2547                                         break;
2548                                 }
2549
2550                                 case RBM_BUTT:
2551                                 {
2552                                         act = _("角で突かれた。", "butts you.");
2553                                         do_stun = 1;
2554                                         touched = TRUE;
2555                                         sound(SOUND_HIT);
2556                                         break;
2557                                 }
2558
2559                                 case RBM_CRUSH:
2560                                 {
2561                                         act = _("体当たりされた。", "crushes you.");
2562                                         do_stun = 1;
2563                                         touched = TRUE;
2564                                         sound(SOUND_CRUSH);
2565                                         break;
2566                                 }
2567
2568                                 case RBM_ENGULF:
2569                                 {
2570                                         act = _("飲み込まれた。", "engulfs you.");
2571                                         touched = TRUE;
2572                                         sound(SOUND_CRUSH);
2573                                         break;
2574                                 }
2575
2576                                 case RBM_CHARGE:
2577                                 {
2578                                         abbreviate = -1;
2579                                         act = _("は請求書をよこした。", "charges you.");
2580                                         touched = TRUE;
2581                                         sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2582                                         break;
2583                                 }
2584
2585                                 case RBM_CRAWL:
2586                                 {
2587                                         abbreviate = -1;
2588                                         act = _("が体の上を這い回った。", "crawls on you.");
2589                                         touched = TRUE;
2590                                         sound(SOUND_SLIME);
2591                                         break;
2592                                 }
2593
2594                                 case RBM_DROOL:
2595                                 {
2596                                         act = _("よだれをたらされた。", "drools on you.");
2597                                         sound(SOUND_SLIME);
2598                                         break;
2599                                 }
2600
2601                                 case RBM_SPIT:
2602                                 {
2603                                         act = _("唾を吐かれた。", "spits on you.");
2604                                         sound(SOUND_SLIME);
2605                                         break;
2606                                 }
2607
2608                                 case RBM_EXPLODE:
2609                                 {
2610                                         abbreviate = -1;
2611                                         act = _("は爆発した。", "explodes.");
2612                                         explode = TRUE;
2613                                         break;
2614                                 }
2615
2616                                 case RBM_GAZE:
2617                                 {
2618                                         act = _("にらまれた。", "gazes at you.");
2619                                         break;
2620                                 }
2621
2622                                 case RBM_WAIL:
2623                                 {
2624                                         act = _("泣き叫ばれた。", "wails at you.");
2625                                         sound(SOUND_WAIL);
2626                                         break;
2627                                 }
2628
2629                                 case RBM_SPORE:
2630                                 {
2631                                         act = _("胞子を飛ばされた。", "releases spores at you.");
2632                                         sound(SOUND_SLIME);
2633                                         break;
2634                                 }
2635
2636                                 case RBM_XXX4:
2637                                 {
2638                                         abbreviate = -1;
2639                                         act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2640                                         break;
2641                                 }
2642
2643                                 case RBM_BEG:
2644                                 {
2645                                         act = _("金をせがまれた。", "begs you for money.");
2646                                         sound(SOUND_MOAN);
2647                                         break;
2648                                 }
2649
2650                                 case RBM_INSULT:
2651                                 {
2652 #ifdef JP
2653                                         abbreviate = -1;
2654 #endif
2655                                         act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2656                                         sound(SOUND_MOAN);
2657                                         break;
2658                                 }
2659
2660                                 case RBM_MOAN:
2661                                 {
2662 #ifdef JP
2663                                         abbreviate = -1;
2664 #endif
2665                                         act = desc_moan[randint0(4)];
2666                                         sound(SOUND_MOAN);
2667                                         break;
2668                                 }
2669
2670                                 case RBM_SHOW:
2671                                 {
2672 #ifdef JP
2673                                         abbreviate = -1;
2674 #endif
2675                                         if (m_ptr->r_idx == MON_JAIAN)
2676                                         {
2677 #ifdef JP
2678                                                 switch(randint1(15))
2679                                                 {
2680                                                   case 1:
2681                                                   case 6:
2682                                                   case 11:
2683                                                         act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2684                                                         break;
2685                                                   case 2:
2686                                                         act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2687                                                         break;
2688                                                   case 3:
2689                                                         act = "「♪の~び太スネ夫はメじゃないよ~~」";
2690                                                         break;
2691                                                   case 4:
2692                                                         act = "「♪け~んかスポ~ツ~どんとこい~」";
2693                                                         break;
2694                                                   case 5:
2695                                                         act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2696                                                         break;
2697                                                   case 7:
2698                                                         act = "「♪ま~ちいちば~んのに~んきもの~~」";
2699                                                         break;
2700                                                   case 8:
2701                                                         act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2702                                                         break;
2703                                                   case 9:
2704                                                         act = "「♪きはやさし~くて~ち~からもち~」";
2705                                                         break;
2706                                                   case 10:
2707                                                         act = "「♪かお~も~~スタイルも~バツグンさ~」";
2708                                                         break;
2709                                                   case 12:
2710                                                         act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2711                                                         break;
2712                                                   case 13:
2713                                                         act = "「♪ド~ラもドラミもメじゃないよ~~」";
2714                                                         break;
2715                                                   case 14:
2716                                                         act = "「♪よじげんぽけっと~な~くたって~」";
2717                                                         break;
2718                                                   case 15:
2719                                                         act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2720                                                         break;
2721                                                 }
2722 #else
2723                                                 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2724 #endif
2725                                         }
2726                                         else
2727                                         {
2728                                                 if (one_in_(3))
2729                                                         act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2730                                                 else
2731                                                         act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2732                                         }
2733
2734                                         sound(SOUND_SHOW);
2735                                         break;
2736                                 }
2737                         }
2738
2739                         if (act)
2740                         {
2741                                 if (do_silly_attack)
2742                                 {
2743 #ifdef JP
2744                                         abbreviate = -1;
2745 #endif
2746                                         act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2747                                 }
2748 #ifdef JP
2749                                 if (abbreviate == 0)
2750                                         msg_format("%^sに%s", m_name, act);
2751                                 else if (abbreviate == 1)
2752                                         msg_format("%s", act);
2753                                 else /* if (abbreviate == -1) */
2754                                         msg_format("%^s%s", m_name, act);
2755                                 abbreviate = 1;/*2回目以降は省略 */
2756 #else
2757                                 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2758 #endif
2759                         }
2760
2761                         /* Hack -- assume all attacks are obvious */
2762                         obvious = TRUE;
2763
2764                         /* Roll out the damage */
2765                         damage = damroll(d_dice, d_side);
2766
2767                         /*
2768                          * Skip the effect when exploding, since the explosion
2769                          * already causes the effect.
2770                          */
2771                         if(explode) damage = 0;
2772                         /* Apply appropriate damage */
2773                         switch (effect)
2774                         {
2775                                 case 0:
2776                                 {
2777                                         obvious = TRUE;
2778                                         damage = 0;
2779                                         break;
2780                                 }
2781
2782                                 case RBE_SUPERHURT:     /* AC軽減あり / Player armor reduces total damage */
2783                                 {
2784                                         if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
2785                                         {
2786                                                 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2787                                                 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2788                                                 tmp_damage = MAX(damage, tmp_damage*2);
2789
2790                                                 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2791                                                 break;
2792                                         }
2793                                 }
2794                                 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2795                                 {
2796                                         obvious = TRUE;
2797                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2798                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2799                                         break;
2800                                 }
2801
2802                                 case RBE_POISON:
2803                                 {
2804                                         if (explode) break;
2805
2806                                         /* Take "poison" effect */
2807                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
2808                                         {
2809                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2810                                                 {
2811                                                         obvious = TRUE;
2812                                                 }
2813                                         }
2814
2815                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2816
2817                                         /* Learn about the player */
2818                                         update_smart_learn(m_idx, DRS_POIS);
2819
2820                                         break;
2821                                 }
2822
2823                                 case RBE_UN_BONUS:
2824                                 {
2825                                         if (explode) break;
2826
2827                                         /* Allow complete resist */
2828                                         if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2829                                         {
2830                                                 /* Apply disenchantment */
2831                                                 if (apply_disenchant(0))
2832                                                 {
2833                                                         /* Hack -- Update AC */
2834                                                         update_creature(p_ptr);
2835                                                         obvious = TRUE;
2836                                                 }
2837                                         }
2838
2839                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2840
2841                                         /* Learn about the player */
2842                                         update_smart_learn(m_idx, DRS_DISEN);
2843
2844                                         break;
2845                                 }
2846
2847                                 case RBE_UN_POWER:
2848                                 {
2849                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2850
2851                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2852
2853                                         /* Find an item */
2854                                         for (k = 0; k < 10; k++)
2855                                         {
2856                                                 /* Pick an item */
2857                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2858
2859                                                 /* Obtain the item */
2860                                                 o_ptr = &p_ptr->inventory_list[i];
2861                                                 if (!o_ptr->k_idx) continue;
2862
2863                                                 /* Drain charged wands/staffs */
2864                                                 if (((o_ptr->tval == TV_STAFF) ||
2865                                                      (o_ptr->tval == TV_WAND)) &&
2866                                                     (o_ptr->pval))
2867                                                 {
2868                                                         /* Calculate healed hitpoints */
2869                                                         int heal=rlev * o_ptr->pval;
2870                                                         if( o_ptr->tval == TV_STAFF)
2871                                                             heal *=  o_ptr->number;
2872
2873                                                         /* Don't heal more than max hp */
2874                                                         heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2875
2876                                                         msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2877
2878                                                         obvious = TRUE;
2879
2880                                                         /* Heal the monster */
2881                                                         m_ptr->hp += (HIT_POINT)heal;
2882
2883                                                         /* Redraw (later) if needed */
2884                                                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2885                                                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2886
2887                                                         /* Uncharge */
2888                                                         o_ptr->pval = 0;
2889
2890                                                         /* Combine / Reorder the pack */
2891                                                         p_ptr->update |= (PU_COMBINE | PU_REORDER);
2892                                                         p_ptr->window |= (PW_INVEN);
2893
2894                                                         break;
2895                                                 }
2896                                         }
2897
2898                                         break;
2899                                 }
2900
2901                                 case RBE_EAT_GOLD:
2902                                 {
2903                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2904
2905                                         /* Confused monsters cannot steal successfully. -LM-*/
2906                                         if (MON_CONFUSED(m_ptr)) break;
2907
2908                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2909
2910                                         obvious = TRUE;
2911
2912                                         /* Saving throw (unless paralyzed) based on dex and level */
2913                                         if (!p_ptr->paralyzed &&
2914                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2915                                                               p_ptr->lev)))
2916                                         {
2917                                                 /* Saving throw message */
2918                                                 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2919
2920                                                 /* Occasional blink anyway */
2921                                                 if (randint0(3)) blinked = TRUE;
2922                                         }
2923
2924                                         /* Eat gold */
2925                                         else
2926                                         {
2927                                                 gold = (p_ptr->au / 10) + randint1(25);
2928                                                 if (gold < 2) gold = 2;
2929                                                 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2930                                                 if (gold > p_ptr->au) gold = p_ptr->au;
2931                                                 p_ptr->au -= gold;
2932                                                 if (gold <= 0)
2933                                                 {
2934                                                         msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2935                                                 }
2936                                                 else if (p_ptr->au)
2937                                                 {
2938                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2939                                                         msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2940                                                         chg_virtue(V_SACRIFICE, 1);
2941                                                 }
2942                                                 else
2943                                                 {
2944                                                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2945                                                         msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2946                                                         chg_virtue(V_SACRIFICE, 2);
2947                                                 }
2948
2949                                                 /* Redraw gold */
2950                                                 p_ptr->redraw |= (PR_GOLD);
2951
2952                                                 p_ptr->window |= (PW_PLAYER);
2953
2954                                                 /* Blink away */
2955                                                 blinked = TRUE;
2956                                         }
2957
2958                                         break;
2959                                 }
2960
2961                                 case RBE_EAT_ITEM:
2962                                 {
2963                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2964
2965                                         /* Confused monsters cannot steal successfully. -LM-*/
2966                                         if (MON_CONFUSED(m_ptr)) break;
2967
2968                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2969
2970                                         /* Saving throw (unless paralyzed) based on dex and level */
2971                                         if (!p_ptr->paralyzed &&
2972                                             (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2973                                                               p_ptr->lev)))
2974                                         {
2975                                                 /* Saving throw message */
2976                                                 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2977
2978                                                 /* Occasional "blink" anyway */
2979                                                 blinked = TRUE;
2980                                                 obvious = TRUE;
2981                                                 break;
2982                                         }
2983
2984                                         /* Find an item */
2985                                         for (k = 0; k < 10; k++)
2986                                         {
2987                                                 OBJECT_IDX o_idx;
2988
2989                                                 /* Pick an item */
2990                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2991
2992                                                 /* Obtain the item */
2993                                                 o_ptr = &p_ptr->inventory_list[i];
2994                                                 if (!o_ptr->k_idx) continue;
2995
2996                                                 /* Skip artifacts */
2997                                                 if (object_is_artifact(o_ptr)) continue;
2998
2999                                                 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3000
3001 #ifdef JP
3002                                                 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3003 #else
3004                                                 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3005 #endif
3006                                                 chg_virtue(V_SACRIFICE, 1);
3007                                                 o_idx = o_pop();
3008
3009                                                 /* Success */
3010                                                 if (o_idx)
3011                                                 {
3012                                                         object_type *j_ptr;
3013                                                         j_ptr = &current_floor_ptr->o_list[o_idx];
3014                                                         object_copy(j_ptr, o_ptr);
3015
3016                                                         /* Modify number */
3017                                                         j_ptr->number = 1;
3018
3019                                                         /* Hack -- If a rod or wand, allocate total
3020                                                          * maximum timeouts or charges between those
3021                                                          * stolen and those missed. -LM-
3022                                                          */
3023                                                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3024                                                         {
3025                                                                 j_ptr->pval = o_ptr->pval / o_ptr->number;
3026                                                                 o_ptr->pval -= j_ptr->pval;
3027                                                         }
3028
3029                                                         /* Forget mark */
3030                                                         j_ptr->marked = OM_TOUCHED;
3031
3032                                                         /* Memorize monster */
3033                                                         j_ptr->held_m_idx = m_idx;
3034
3035                                                         /* Build stack */
3036                                                         j_ptr->next_o_idx = m_ptr->hold_o_idx;
3037
3038                                                         /* Build stack */
3039                                                         m_ptr->hold_o_idx = o_idx;
3040                                                 }
3041
3042                                                 /* Steal the items */
3043                                                 inven_item_increase(i, -1);
3044                                                 inven_item_optimize(i);
3045
3046                                                 obvious = TRUE;
3047
3048                                                 /* Blink away */
3049                                                 blinked = TRUE;
3050
3051                                                 break;
3052                                         }
3053
3054                                         break;
3055                                 }
3056
3057                                 case RBE_EAT_FOOD:
3058                                 {
3059                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3060
3061                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3062
3063                                         /* Steal some food */
3064                                         for (k = 0; k < 10; k++)
3065                                         {
3066                                                 /* Pick an item from the pack */
3067                                                 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3068
3069                                                 o_ptr = &p_ptr->inventory_list[i];
3070                                                 if (!o_ptr->k_idx) continue;
3071
3072                                                 /* Skip non-food objects */
3073                                                 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3074
3075                                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3076
3077 #ifdef JP
3078                                                 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3079 #else
3080                                                 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3081 #endif
3082
3083                                                 /* Steal the items */
3084                                                 inven_item_increase(i, -1);
3085                                                 inven_item_optimize(i);
3086
3087                                                 obvious = TRUE;
3088
3089                                                 break;
3090                                         }
3091
3092                                         break;
3093                                 }
3094
3095                                 case RBE_EAT_LITE:
3096                                 {
3097                                         /* Access the lite */
3098                                         o_ptr = &p_ptr->inventory_list[INVEN_LITE];
3099                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3100
3101                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3102
3103                                         /* Drain fuel */
3104                                         if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3105                                         {
3106                                                 /* Reduce fuel */
3107                                                 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3108                                                 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3109
3110                                                 if (!p_ptr->blind)
3111                                                 {
3112                                                         msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3113                                                         obvious = TRUE;
3114                                                 }
3115
3116                                                 p_ptr->window |= (PW_EQUIP);
3117                                         }
3118
3119                                         break;
3120                                 }
3121
3122                                 case RBE_ACID:
3123                                 {
3124                                         if (explode) break;
3125                                         obvious = TRUE;
3126                                         msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3127                                         get_damage += acid_dam(damage, ddesc, -1, FALSE);
3128                                         update_creature(p_ptr);
3129                                         update_smart_learn(m_idx, DRS_ACID);
3130                                         break;
3131                                 }
3132
3133                                 case RBE_ELEC:
3134                                 {
3135                                         if (explode) break;
3136                                         obvious = TRUE;
3137                                         msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3138                                         get_damage += elec_dam(damage, ddesc, -1, FALSE);
3139                                         update_smart_learn(m_idx, DRS_ELEC);
3140                                         break;
3141                                 }
3142
3143                                 case RBE_FIRE:
3144                                 {
3145                                         if (explode) break;
3146                                         obvious = TRUE;
3147                                         msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3148                                         get_damage += fire_dam(damage, ddesc, -1, FALSE);
3149                                         update_smart_learn(m_idx, DRS_FIRE);
3150                                         break;
3151                                 }
3152
3153                                 case RBE_COLD:
3154                                 {
3155                                         if (explode) break;
3156                                         obvious = TRUE;
3157                                         msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3158                                         get_damage += cold_dam(damage, ddesc, -1, FALSE);
3159                                         update_smart_learn(m_idx, DRS_COLD);
3160                                         break;
3161                                 }
3162
3163                                 case RBE_BLIND:
3164                                 {
3165                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3166                                         if (p_ptr->is_dead) break;
3167
3168                                         /* Increase "blind" */
3169                                         if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
3170                                         {
3171                                                 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
3172                                                 {
3173 #ifdef JP
3174                                                         if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3175 #else
3176                                                         /* nanka */
3177 #endif
3178                                                         obvious = TRUE;
3179                                                 }
3180                                         }
3181
3182                                         /* Learn about the player */
3183                                         update_smart_learn(m_idx, DRS_BLIND);
3184
3185                                         break;
3186                                 }
3187
3188                                 case RBE_CONFUSE:
3189                                 {
3190                                         if (explode) break;
3191                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3192
3193                                         if (p_ptr->is_dead) break;
3194
3195                                         /* Increase "confused" */
3196                                         if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
3197                                         {
3198                                                 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
3199                                                 {
3200                                                         obvious = TRUE;
3201                                                 }
3202                                         }
3203
3204                                         /* Learn about the player */
3205                                         update_smart_learn(m_idx, DRS_CONF);
3206
3207                                         break;
3208                                 }
3209
3210                                 case RBE_TERRIFY:
3211                                 {
3212                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3213
3214                                         if (p_ptr->is_dead) break;
3215
3216                                         /* Increase "afraid" */
3217                                         if (CHECK_MULTISHADOW())
3218                                         {
3219                                                 /* Do nothing */
3220                                         }
3221                                         else if (p_ptr->resist_fear)
3222                                         {
3223                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3224                                                 obvious = TRUE;
3225                                         }
3226                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3227                                         {
3228                                                 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3229                                                 obvious = TRUE;
3230                                         }
3231                                         else
3232                                         {
3233                                                 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
3234                                                 {
3235                                                         obvious = TRUE;
3236                                                 }
3237                                         }
3238
3239                                         /* Learn about the player */
3240                                         update_smart_learn(m_idx, DRS_FEAR);
3241
3242                                         break;
3243                                 }
3244
3245                                 case RBE_PARALYZE:
3246                                 {
3247                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3248
3249                                         if (p_ptr->is_dead) break;
3250
3251                                         /* Increase "paralyzed" */
3252                                         if (CHECK_MULTISHADOW())
3253                                         {
3254                                                 /* Do nothing */
3255                                         }
3256                                         else if (p_ptr->free_act)
3257                                         {
3258                                                 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3259                                                 obvious = TRUE;
3260                                         }
3261                                         else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3262                                         {
3263                                                 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3264                                                 obvious = TRUE;
3265                                         }
3266                                         else
3267                                         {
3268                                                 if (!p_ptr->paralyzed)
3269                                                 {
3270                                                         if (set_paralyzed(3 + randint1(rlev)))
3271                                                         {
3272                                                                 obvious = TRUE;
3273                                                         }
3274                                                 }
3275                                         }
3276
3277                                         /* Learn about the player */
3278                                         update_smart_learn(m_idx, DRS_FREE);
3279
3280                                         break;
3281                                 }
3282
3283                                 case RBE_LOSE_STR:
3284                                 {
3285                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3286
3287                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3288                                         if (do_dec_stat(A_STR)) obvious = TRUE;
3289
3290                                         break;
3291                                 }
3292
3293                                 case RBE_LOSE_INT:
3294                                 {
3295                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3296
3297                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3298                                         if (do_dec_stat(A_INT)) obvious = TRUE;
3299
3300                                         break;
3301                                 }
3302
3303                                 case RBE_LOSE_WIS:
3304                                 {
3305                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3306
3307                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3308                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
3309
3310                                         break;
3311                                 }
3312
3313                                 case RBE_LOSE_DEX:
3314                                 {
3315                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3316
3317                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3318                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
3319
3320                                         break;
3321                                 }
3322
3323                                 case RBE_LOSE_CON:
3324                                 {
3325                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3326
3327                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3328                                         if (do_dec_stat(A_CON)) obvious = TRUE;
3329
3330                                         break;
3331                                 }
3332
3333                                 case RBE_LOSE_CHR:
3334                                 {
3335                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3336
3337                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3338                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
3339
3340                                         break;
3341                                 }
3342
3343                                 case RBE_LOSE_ALL:
3344                                 {
3345                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3346
3347                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3348
3349                                         /* Damage (stats) */
3350                                         if (do_dec_stat(A_STR)) obvious = TRUE;
3351                                         if (do_dec_stat(A_DEX)) obvious = TRUE;
3352                                         if (do_dec_stat(A_CON)) obvious = TRUE;
3353                                         if (do_dec_stat(A_INT)) obvious = TRUE;
3354                                         if (do_dec_stat(A_WIS)) obvious = TRUE;
3355                                         if (do_dec_stat(A_CHR)) obvious = TRUE;
3356
3357                                         break;
3358                                 }
3359
3360                                 case RBE_SHATTER:
3361                                 {
3362                                         obvious = TRUE;
3363
3364                                         /* Hack -- Reduce damage based on the player armor class */
3365                                         damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3366
3367                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3368
3369                                         /* Radius 8 earthquake centered at the monster */
3370                                         if (damage > 23 || explode)
3371                                         {
3372                                                 earthquake(m_ptr->fy, m_ptr->fx, 8, m_idx);
3373                                         }
3374
3375                                         break;
3376                                 }
3377
3378                                 case RBE_EXP_10:
3379                                 {
3380                                         s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3381
3382                                         obvious = TRUE;
3383
3384                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3385
3386                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3387
3388                                         (void)drain_exp(d, d / 10, 95);
3389                                         break;
3390                                 }
3391
3392                                 case RBE_EXP_20:
3393                                 {
3394                                         s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3395
3396                                         obvious = TRUE;
3397
3398                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3399
3400                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3401
3402                                         (void)drain_exp(d, d / 10, 90);
3403                                         break;
3404                                 }
3405
3406                                 case RBE_EXP_40:
3407                                 {
3408                                         s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3409
3410                                         obvious = TRUE;
3411
3412                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3413
3414                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3415
3416                                         (void)drain_exp(d, d / 10, 75);
3417                                         break;
3418                                 }
3419
3420                                 case RBE_EXP_80:
3421                                 {
3422                                         s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3423
3424                                         obvious = TRUE;
3425
3426                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3427
3428                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3429
3430                                         (void)drain_exp(d, d / 10, 50);
3431                                         break;
3432                                 }
3433
3434                                 case RBE_DISEASE:
3435                                 {
3436                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3437
3438                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3439
3440                                         /* Take "poison" effect */
3441                                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
3442                                         {
3443                                                 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
3444                                                 {
3445                                                         obvious = TRUE;
3446                                                 }
3447                                         }
3448
3449                                         /* Damage CON (10% chance)*/
3450                                         if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
3451                                         {
3452                                                 /* 1% chance for perm. damage */
3453                                                 bool perm = one_in_(10);
3454                                                 if (dec_stat(A_CON, randint1(10), perm))
3455                                                 {
3456                                                         msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3457                                                         obvious = TRUE;
3458                                                 }
3459                                         }
3460
3461                                         break;
3462                                 }
3463                                 case RBE_TIME:
3464                                 {
3465                                         if (explode) break;
3466                                         if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
3467                                         {
3468                                                 switch (randint1(10))
3469                                                 {
3470                                                         case 1: case 2: case 3: case 4: case 5:
3471                                                         {
3472                                                                 if (p_ptr->prace == RACE_ANDROID) break;
3473                                                                 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3474                                                                 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
3475                                                                 break;
3476                                                         }
3477
3478                                                         case 6: case 7: case 8: case 9:
3479                                                         {
3480                                                                 int stat = randint0(6);
3481
3482                                                                 switch (stat)
3483                                                                 {
3484 #ifdef JP
3485                                                                         case A_STR: act = "強く"; break;
3486                                                                         case A_INT: act = "聡明で"; break;
3487                                                                         case A_WIS: act = "賢明で"; break;
3488                                                                         case A_DEX: act = "器用で"; break;
3489                                                                         case A_CON: act = "健康で"; break;
3490                                                                         case A_CHR: act = "美しく"; break;
3491 #else
3492                                                                         case A_STR: act = "strong"; break;
3493                                                                         case A_INT: act = "bright"; break;
3494                                                                         case A_WIS: act = "wise"; break;
3495                                                                         case A_DEX: act = "agile"; break;
3496                                                                         case A_CON: act = "hale"; break;
3497                                                                         case A_CHR: act = "beautiful"; break;
3498 #endif
3499
3500                                                                 }
3501
3502                                                                 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3503                                                                 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
3504                                                                 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
3505                                                                 p_ptr->update |= (PU_BONUS);
3506                                                                 break;
3507                                                         }
3508
3509                                                         case 10:
3510                                                         {
3511                                                                 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3512
3513                                                                 for (k = 0; k < A_MAX; k++)
3514                                                                 {
3515                                                                         p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
3516                                                                         if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
3517                                                                 }
3518                                                                 p_ptr->update |= (PU_BONUS);
3519                                                                 break;
3520                                                         }
3521                                                 }
3522                                         }
3523                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3524
3525                                         break;
3526                                 }
3527                                 case RBE_DR_LIFE:
3528                                 {
3529                                         s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3530                                         bool resist_drain;
3531
3532                                         obvious = TRUE;
3533
3534                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3535
3536                                         if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3537
3538                                         resist_drain = !drain_exp(d, d / 10, 50);
3539
3540                                         /* Heal the attacker? */
3541                                         if (p_ptr->mimic_form)
3542                                         {
3543                                                 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3544                                                         resist_drain = TRUE;
3545                                         }
3546                                         else
3547                                         {
3548                                                 switch (p_ptr->prace)
3549                                                 {
3550                                                 case RACE_ZOMBIE:
3551                                                 case RACE_VAMPIRE:
3552                                                 case RACE_SPECTRE:
3553                                                 case RACE_SKELETON:
3554                                                 case RACE_DEMON:
3555                                                 case RACE_GOLEM:
3556                                                 case RACE_ANDROID:
3557                                                         resist_drain = TRUE;
3558                                                         break;
3559                                                 }
3560                                         }
3561
3562                                         if ((damage > 5) && !resist_drain)
3563                                         {
3564                                                 bool did_heal = FALSE;
3565
3566                                                 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3567
3568                                                 /* Heal */
3569                                                 m_ptr->hp += damroll(4, damage / 6);
3570                                                 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3571
3572                                                 /* Redraw (later) if needed */
3573                                                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
3574                                                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
3575
3576                                                 /* Special message */
3577                                                 if (m_ptr->ml && did_heal)
3578                                                 {
3579                                                         msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3580                                                 }
3581                                         }
3582
3583                                         break;
3584                                 }
3585                                 case RBE_DR_MANA:
3586                                 {
3587                                         obvious = TRUE;
3588
3589                                         if (CHECK_MULTISHADOW())
3590                                         {
3591                                                 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3592                                         }
3593                                         else
3594                                         {
3595                                                 do_cut = 0;
3596
3597                                                 p_ptr->csp -= damage;
3598                                                 if (p_ptr->csp < 0)
3599                                                 {
3600                                                         p_ptr->csp = 0;
3601                                                         p_ptr->csp_frac = 0;
3602                                                 }
3603
3604                                                 p_ptr->redraw |= (PR_MANA);
3605                                         }
3606
3607                                         /* Learn about the player */
3608                                         update_smart_learn(m_idx, DRS_MANA);
3609
3610                                         break;
3611                                 }
3612                                 case RBE_INERTIA:
3613                                 {
3614                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3615
3616                                         if (p_ptr->is_dead) break;
3617
3618                                         /* Decrease speed */
3619                                         if (CHECK_MULTISHADOW())
3620                                         {
3621                                                 /* Do nothing */
3622                                         }
3623                                         else
3624                                         {
3625                                                 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3626                                                 {
3627                                                         obvious = TRUE;
3628                                                 }
3629                                         }
3630
3631                                         break;
3632                                 }
3633                                 case RBE_STUN:
3634                                 {
3635                                         get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3636
3637                                         if (p_ptr->is_dead) break;
3638
3639                                         /* Decrease speed */
3640                                         if (p_ptr->resist_sound || CHECK_MULTISHADOW())
3641                                         {
3642                                                 /* Do nothing */
3643                                         }
3644                                         else
3645                                         {
3646                                                 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3647                                                 {
3648                                                         obvious = TRUE;
3649                                                 }
3650                                         }
3651
3652                                         break;
3653                                 }
3654                         }
3655
3656                         /* Hack -- only one of cut or stun */
3657                         if (do_cut && do_stun)
3658                         {
3659                                 /* Cancel cut */
3660                                 if (randint0(100) < 50)
3661                                 {
3662                                         do_cut = 0;
3663                                 }
3664
3665                                 /* Cancel stun */
3666                                 else
3667                                 {
3668                                         do_stun = 0;
3669                                 }
3670                         }
3671
3672                         /* Handle cut */
3673                         if (do_cut)
3674                         {
3675                                 int cut_plus = 0;
3676
3677                                 /* Critical hit (zero if non-critical) */
3678                                 tmp = monster_critical(d_dice, d_side, damage);
3679
3680                                 /* Roll for damage */
3681                                 switch (tmp)
3682                                 {
3683                                         case 0: cut_plus = 0; break;
3684                                         case 1: cut_plus = randint1(5); break;
3685                                         case 2: cut_plus = randint1(5) + 5; break;
3686                                         case 3: cut_plus = randint1(20) + 20; break;
3687                                         case 4: cut_plus = randint1(50) + 50; break;
3688                                         case 5: cut_plus = randint1(100) + 100; break;
3689                                         case 6: cut_plus = 300; break;
3690                                         default: cut_plus = 500; break;
3691                                 }
3692
3693                                 /* Apply the cut */
3694                                 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
3695                         }
3696
3697                         /* Handle stun */
3698                         if (do_stun)
3699                         {
3700                                 int stun_plus = 0;
3701
3702                                 /* Critical hit (zero if non-critical) */
3703                                 tmp = monster_critical(d_dice, d_side, damage);
3704
3705                                 /* Roll for damage */
3706                                 switch (tmp)
3707                                 {
3708                                         case 0: stun_plus = 0; break;
3709                                         case 1: stun_plus = randint1(5); break;
3710                                         case 2: stun_plus = randint1(5) + 10; break;
3711                                         case 3: stun_plus = randint1(10) + 20; break;
3712                                         case 4: stun_plus = randint1(15) + 30; break;
3713                                         case 5: stun_plus = randint1(20) + 40; break;
3714                                         case 6: stun_plus = 80; break;
3715                                         default: stun_plus = 150; break;
3716                                 }
3717
3718                                 /* Apply the stun */
3719                                 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
3720                         }
3721
3722                         if (explode)
3723                         {
3724                                 sound(SOUND_EXPLODE);
3725
3726                                 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3727                                 {
3728                                         blinked = FALSE;
3729                                         alive = FALSE;
3730                                 }
3731                         }
3732
3733                         if (touched)
3734                         {
3735                                 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
3736                                 {
3737                                         if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3738                                         {
3739                                                 HIT_POINT dam = damroll(2, 6);
3740
3741                                                 /* Modify the damage */
3742                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3743
3744                                                 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3745
3746                                                 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3747                                                 {
3748                                                         blinked = FALSE;
3749                                                         alive = FALSE;
3750                                                 }
3751                                         }
3752                                         else
3753                                         {
3754                                                 if (is_original_ap_and_seen(m_ptr))
3755                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3756                                         }
3757                                 }
3758
3759                                 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
3760                                 {
3761                                         if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3762                                         {
3763                                                 HIT_POINT dam = damroll(2, 6);
3764
3765                                                 /* Modify the damage */
3766                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3767
3768                                                 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3769                                                 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3770                                                 {
3771                                                         blinked = FALSE;
3772                                                         alive = FALSE;
3773                                                 }
3774                                         }
3775                                         else
3776                                         {
3777                                                 if (is_original_ap_and_seen(m_ptr))
3778                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3779                                         }
3780                                 }
3781
3782                                 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
3783                                 {
3784                                         if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3785                                         {
3786                                                 HIT_POINT dam = damroll(2, 6);
3787
3788                                                 /* Modify the damage */
3789                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3790
3791                                                 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3792                                                 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3793                                                 {
3794                                                         blinked = FALSE;
3795                                                         alive = FALSE;
3796                                                 }
3797                                         }
3798                                         else
3799                                         {
3800                                                 if (is_original_ap_and_seen(m_ptr))
3801                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3802                                         }
3803                                 }
3804
3805                                 /* by henkma */
3806                                 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3807                                 {
3808                                         if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3809                                         {
3810                                                 HIT_POINT dam = damroll(2, 6);
3811
3812                                                 /* Modify the damage */
3813                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3814
3815                                                 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3816                                                 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3817                                                 {
3818                                                         blinked = FALSE;
3819                                                         alive = FALSE;
3820                                                 }
3821                                         }
3822                                         else
3823                                         {
3824                                                 if (is_original_ap_and_seen(m_ptr))
3825                                                         r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3826                                         }
3827
3828                                         if (is_mirror_grid(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x]))
3829                                         {
3830                                                 teleport_player(10, 0L);
3831                                         }
3832                                 }
3833
3834                                 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3835                                 {
3836                                         if (r_ptr->flags3 & RF3_EVIL)
3837                                         {
3838                                                 if (!(r_ptr->flagsr & RFR_RES_ALL))
3839                                                 {
3840                                                         HIT_POINT dam = damroll(2, 6);
3841
3842                                                         /* Modify the damage */
3843                                                         dam = mon_damage_mod(m_ptr, dam, FALSE);
3844
3845                                                         msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3846                                                         if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3847                                                         {
3848                                                                 blinked = FALSE;
3849                                                                 alive = FALSE;
3850                                                         }
3851                                                         if (is_original_ap_and_seen(m_ptr))
3852                                                                 r_ptr->r_flags3 |= RF3_EVIL;
3853                                                 }
3854                                                 else
3855                                                 {
3856                                                         if (is_original_ap_and_seen(m_ptr))
3857                                                                 r_ptr->r_flagsr |= RFR_RES_ALL;
3858                                                 }
3859                                         }
3860                                 }
3861
3862                                 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3863                                 {
3864                                         if (!(r_ptr->flagsr & RFR_RES_ALL))
3865                                         {
3866                                                 HIT_POINT dam = damroll(2, 6);
3867
3868                                                 /* Modify the damage */
3869                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3870
3871                                                 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3872                                                 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3873                                                 {
3874                                                         blinked = FALSE;
3875                                                         alive = FALSE;
3876                                                 }
3877                                         }
3878                                         else
3879                                         {
3880                                                 if (is_original_ap_and_seen(m_ptr))
3881                                                         r_ptr->r_flagsr |= RFR_RES_ALL;
3882                                         }
3883                                 }
3884
3885                                 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3886                                 {
3887                                         HIT_POINT dam = 1;
3888                                         object_type *o_armed_ptr = &p_ptr->inventory_list[INVEN_RARM];
3889
3890                                         if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3891                                         {
3892                                                 if (o_armed_ptr->k_idx)
3893                                                 {
3894                                                         int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3895                                                         dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3896                                                 }
3897
3898                                                 /* Cursed armor makes damages doubled */
3899                                                 o_armed_ptr = &p_ptr->inventory_list[INVEN_BODY];
3900                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3901
3902                                                 /* Modify the damage */
3903                                                 dam = mon_damage_mod(m_ptr, dam, FALSE);
3904
3905                                                 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3906                                                 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3907                                                 {
3908                                                         blinked = FALSE;
3909                                                         alive = FALSE;
3910                                                 }
3911                                                 else /* monster does not dead */
3912                                                 {
3913                                                         int j;
3914                                                         BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3915                                                         EFFECT_ID typ[4][2] = {
3916                                                                 { INVEN_HEAD, GF_OLD_CONF },
3917                                                                 { INVEN_LARM,  GF_OLD_SLEEP },
3918                                                                 { INVEN_HANDS, GF_TURN_ALL },
3919                                                                 { INVEN_FEET, GF_OLD_SLOW }
3920                                                         };
3921
3922                                                         /* Some cursed armours gives an extra effect */
3923                                                         for (j = 0; j < 4; j++)
3924                                                         {
3925                                                                 o_armed_ptr = &p_ptr->inventory_list[typ[j][0]];
3926                                                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3927                                                                         project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3928                                                         }
3929                                                 }
3930                                         }
3931                                         else
3932                                         {
3933                                                 if (is_original_ap_and_seen(m_ptr))
3934                                                         r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3935                                         }
3936                                 }
3937                         }
3938                 }
3939
3940                 /* Monster missed player */
3941                 else
3942                 {
3943                         /* Analyze failed attacks */
3944                         switch (method)
3945                         {
3946                                 case RBM_HIT:
3947                                 case RBM_TOUCH:
3948                                 case RBM_PUNCH:
3949                                 case RBM_KICK:
3950                                 case RBM_CLAW:
3951                                 case RBM_BITE:
3952                                 case RBM_STING:
3953                                 case RBM_SLASH:
3954                                 case RBM_BUTT:
3955                                 case RBM_CRUSH:
3956                                 case RBM_ENGULF:
3957                                 case RBM_CHARGE:
3958
3959                                 /* Visible monsters */
3960                                 if (m_ptr->ml)
3961                                 {
3962                                         disturb(TRUE, TRUE);
3963
3964 #ifdef JP
3965                                         if (abbreviate)
3966                                             msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3967                                         else
3968                                             msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3969                                         abbreviate = 1;/*2回目以降は省略 */
3970 #else
3971                                         msg_format("%^s misses you.", m_name);
3972 #endif
3973
3974                                 }
3975
3976                                 /* Gain shield experience */
3977                                 if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
3978                                 {
3979                                         int cur = p_ptr->skill_exp[GINOU_SHIELD];
3980                                         int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
3981
3982                                         if (cur < max)
3983                                         {
3984                                                 DEPTH targetlevel = r_ptr->level;
3985                                                 int inc = 0;
3986
3987
3988                                                 /* Extra experience */
3989                                                 if ((cur / 100) < targetlevel)
3990                                                 {
3991                                                         if ((cur / 100 + 15) < targetlevel)
3992                                                                 inc += 1 + (targetlevel - (cur / 100 + 15));
3993                                                         else
3994                                                                 inc += 1;
3995                                                 }
3996
3997                                                 p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
3998                                                 p_ptr->update |= (PU_BONUS);
3999                                         }
4000                                 }
4001
4002                                 damage = 0;
4003
4004                                 break;
4005                         }
4006                 }
4007
4008
4009                 /* Analyze "visible" monsters only */
4010                 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4011                 {
4012                         /* Count "obvious" attacks (and ones that cause damage) */
4013                         if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4014                         {
4015                                 /* Count attacks of this type */
4016                                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4017                                 {
4018                                         r_ptr->r_blows[ap_cnt]++;
4019                                 }
4020                         }
4021                 }
4022
4023                 if (p_ptr->riding && damage)
4024                 {
4025                         char m_steed_name[MAX_NLEN];
4026                         monster_desc(m_steed_name, &current_floor_ptr->m_list[p_ptr->riding], 0);
4027                         if (rakuba((damage > 200) ? 200 : damage, FALSE))
4028                         {
4029                                 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4030                         }
4031                 }
4032
4033                 if (p_ptr->special_defense & NINJA_KAWARIMI)
4034                 {
4035                         if (kawarimi(FALSE)) return TRUE;
4036                 }
4037         }
4038
4039         /* Hex - revenge damage stored */
4040         revenge_store(get_damage);
4041
4042         if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4043                 && get_damage > 0 && !p_ptr->is_dead)
4044         {
4045 #ifdef JP
4046                 msg_format("攻撃が%s自身を傷つけた!", m_name);
4047 #else
4048                 GAME_TEXT m_name_self[80];
4049
4050                 /* hisself */
4051                 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4052
4053                 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4054 #endif
4055                 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4056                 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
4057         }
4058
4059         if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
4060         {
4061                 char m_target_name[MAX_NLEN];
4062                 monster_desc(m_target_name, m_ptr, 0);
4063
4064                 p_ptr->csp -= 7;
4065                 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
4066                 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4067                 fear = FALSE;
4068                 p_ptr->redraw |= (PR_MANA);
4069         }
4070
4071         /* Blink away */
4072         if (blinked && alive && !p_ptr->is_dead)
4073         {
4074                 if (teleport_barrier(m_idx))
4075                 {
4076                         msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4077                 }
4078                 else
4079                 {
4080                         msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4081                         teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
4082                 }
4083         }
4084
4085
4086         /* Always notice cause of death */
4087         if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
4088         {
4089                 r_ptr->r_deaths++;
4090         }
4091
4092         if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
4093         {
4094                 sound(SOUND_FLEE);
4095                 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4096         }
4097
4098         if (p_ptr->special_defense & KATA_IAI)
4099         {
4100                 set_action(ACTION_NONE);
4101         }
4102
4103         /* Assume we attacked */
4104         return (TRUE);
4105 }
4106
4107
4108 /*!
4109  * @brief モンスターが敵モンスターに行う打撃処理 /
4110  * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4111  * @param m_idx 目標となるモンスターの参照ID
4112  * @param dam ダメージ量
4113  * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4114  * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4115  * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4116  * @param who 打撃を行ったモンスターの参照ID
4117  * @return なし
4118  */
4119 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4120 {
4121         monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
4122         monster_race *r_ptr = &r_info[m_ptr->r_idx];
4123         GAME_TEXT m_name[160];
4124         bool seen = is_seen(m_ptr);
4125
4126         /* Can the player be aware of this attack? */
4127         bool known = (m_ptr->cdis <= MAX_SIGHT);
4128
4129         monster_desc(m_name, m_ptr, 0);
4130
4131         /* Redraw (later) if needed */
4132         if (m_ptr->ml)
4133         {
4134                 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4135                 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4136         }
4137
4138         (void)set_monster_csleep(m_idx, 0);
4139
4140         if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE);
4141
4142         if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4143         {
4144                 if (seen)
4145                 {
4146                         msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4147                 }
4148                 return;
4149         }
4150
4151         if (r_ptr->flagsr & RFR_RES_ALL)
4152         {
4153                 if (dam > 0)
4154                 {
4155                         dam /= 100;
4156                         if ((dam == 0) && one_in_(3)) dam = 1;
4157                 }
4158                 if (dam == 0)
4159                 {
4160                         if (seen)
4161                         {
4162                                 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4163                         }
4164                         return;
4165                 }
4166         }
4167
4168         /* Hurt it */
4169         m_ptr->hp -= dam;
4170
4171         /* It is dead now... or is it? */
4172         if (m_ptr->hp < 0)
4173         {
4174                 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4175                         (r_ptr->flags7 & RF7_NAZGUL)) &&
4176                         !p_ptr->inside_battle)
4177                 {
4178                         m_ptr->hp = 1;
4179                 }
4180                 else
4181                 {
4182                         /* Make a sound */
4183                         if (!monster_living(m_ptr->r_idx))
4184                         {
4185                                 sound(SOUND_N_KILL);
4186                         }
4187                         else
4188                         {
4189                                 sound(SOUND_KILL);
4190                         }
4191
4192                         *dead = TRUE;
4193
4194                         if (known)
4195                         {
4196                                 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4197                                 /* Unseen death by normal attack */
4198                                 if (!seen)
4199                                 {
4200                                         current_floor_ptr->monster_noise = TRUE;
4201                                 }
4202                                 /* Death by special attack */
4203                                 else if (note)
4204                                 {
4205                                         msg_format(_("%^s%s", "%^s%s"), m_name, note);
4206                                 }
4207                                 /* Death by normal attack -- nonliving monster */
4208                                 else if (!monster_living(m_ptr->r_idx))
4209                                 {
4210                                         msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4211                                 }
4212                                 /* Death by normal attack -- living monster */
4213                                 else
4214                                 {
4215                                         msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4216                                 }
4217                         }
4218
4219                         monster_gain_exp(who, m_ptr->r_idx);
4220                         monster_death(m_idx, FALSE);
4221                         delete_monster_idx(m_idx);
4222
4223                         /* Not afraid */
4224                         (*fear) = FALSE;
4225
4226                         /* Monster is dead */
4227                         return;
4228                 }
4229         }
4230
4231         *dead = FALSE;
4232
4233 #ifdef ALLOW_FEAR
4234
4235         /* Mega-Hack -- Pain cancels fear */
4236         if (MON_MONFEAR(m_ptr) && (dam > 0))
4237         {
4238                 /* Cure fear */
4239                 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4240                 {
4241                         /* No more fear */
4242                         (*fear) = FALSE;
4243                 }
4244         }
4245
4246         /* Sometimes a monster gets scared by damage */
4247         if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4248         {
4249                 /* Percentage of fully healthy */
4250                 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4251
4252                 /*
4253                 * Run (sometimes) if at 10% or less of max hit points,
4254                 * or (usually) when hit for half its current hit points
4255                  */
4256                 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4257                         ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4258                 {
4259                         /* Hack -- note fear */
4260                         (*fear) = TRUE;
4261
4262                         /* Hack -- Add some timed fear */
4263                         (void)set_monster_monfear(m_idx, (randint1(10) +
4264                                 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4265                                         20 : ((11 - percentage) * 5))));
4266                 }
4267         }
4268
4269 #endif /* ALLOW_FEAR */
4270
4271         if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4272         {
4273                 if (is_pet(&current_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
4274                 {
4275                         set_target(m_ptr, current_floor_ptr->m_list[who].fy, current_floor_ptr->m_list[who].fx);
4276                 }
4277         }
4278
4279         if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4280         {
4281                 monster_desc(m_name, m_ptr, 0);
4282
4283                 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4284                 if (rakuba((dam > 200) ? 200 : dam, FALSE))
4285                 {
4286                         msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);
4287                 }
4288         }
4289
4290         /* Not dead yet */
4291         return;
4292 }