OSDN Git Service

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