OSDN Git Service

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