OSDN Git Service

1a64d6e562db1091a41dfe345170d89ef1ea3d85
[hengband/hengband.git] / src / combat / monster-attack-player.c
1 /*!
2  * @brief モンスターからプレーヤーへの直接攻撃処理
3  * @date 2020/05/23
4  * @author Hourier
5  */
6
7 #include "combat/monster-attack-player.h"
8 #include "cmd/cmd-attack.h"
9 #include "cmd/cmd-pet.h"
10 #include "combat/attack-accuracy.h"
11 #include "combat/attack-criticality.h"
12 #include "combat/combat-options-type.h"
13 #include "combat/hallucination-attacks-table.h"
14 #include "combat/insults-moans.h"
15 #include "combat/monster-attack-effect.h"
16 #include "combat/monster-attack-util.h"
17 #include "dungeon/dungeon.h"
18 #include "effect/effect-characteristics.h"
19 #include "main/sound-definitions-table.h"
20 #include "mind/racial-mirror-master.h"
21 #include "monster/monster-status.h"
22 #include "object/object2.h"
23 #include "object/object-flavor.h"
24 #include "object/object-hook.h"
25 #include "object/object-mark-types.h"
26 #include "player/avatar.h"
27 #include "player/mimic-info-table.h"
28 #include "player/player-damage.h"
29 #include "player/player-effects.h"
30 #include "player/player-move.h"
31 #include "player/player-skill.h"
32 #include "realm/realm-hex.h"
33 #include "spell/process-effect.h"
34 #include "spell/spells-floor.h"
35 #include "spell/spells-type.h"
36 #include "spell/spells2.h"
37 #include "spell/spells3.h"
38
39 static void show_jaian_song(monap_type *monap_ptr)
40 {
41 #ifdef JP
42     switch (randint1(15)) {
43     case 1:
44     case 6:
45     case 11:
46         monap_ptr->act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
47         break;
48     case 2:
49         monap_ptr->act = "「♪て~んかむ~てきのお~とこだぜ~~」";
50         break;
51     case 3:
52         monap_ptr->act = "「♪の~び太スネ夫はメじゃないよ~~」";
53         break;
54     case 4:
55         monap_ptr->act = "「♪け~んかスポ~ツ~どんとこい~」";
56         break;
57     case 5:
58         monap_ptr->act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
59         break;
60     case 7:
61         monap_ptr->act = "「♪ま~ちいちば~んのに~んきもの~~」";
62         break;
63     case 8:
64         monap_ptr->act = "「♪べんきょうしゅくだいメじゃないよ~~」";
65         break;
66     case 9:
67         monap_ptr->act = "「♪きはやさし~くて~ち~からもち~」";
68         break;
69     case 10:
70         monap_ptr->act = "「♪かお~も~~スタイルも~バツグンさ~」";
71         break;
72     case 12:
73         monap_ptr->act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
74         break;
75     case 13:
76         monap_ptr->act = "「♪ド~ラもドラミもメじゃないよ~~」";
77         break;
78     case 14:
79         monap_ptr->act = "「♪よじげんぽけっと~な~くたって~」";
80         break;
81     case 15:
82         monap_ptr->act = "「♪あし~の~~ながさ~は~まけないぜ~」";
83         break;
84     }
85 #else
86     monap_ptr->act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
87 #endif
88 }
89
90 static void monster_attack_show(monap_type *monap_ptr)
91 {
92 #ifdef JP
93     monap_ptr->abbreviate = -1;
94 #endif
95     if (monap_ptr->m_ptr->r_idx == MON_JAIAN) {
96         show_jaian_song(monap_ptr);
97     } else {
98         if (one_in_(3))
99             monap_ptr->act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
100         else
101             monap_ptr->act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
102     }
103
104     sound(SOUND_SHOW);
105 }
106
107 static void describe_monster_attack_method(monap_type *monap_ptr)
108 {
109     switch (monap_ptr->method) {
110     case RBM_HIT: {
111         monap_ptr->act = _("殴られた。", "hits you.");
112         monap_ptr->do_cut = monap_ptr->do_stun = 1;
113         monap_ptr->touched = TRUE;
114         sound(SOUND_HIT);
115         break;
116     }
117     case RBM_TOUCH: {
118         monap_ptr->act = _("触られた。", "touches you.");
119         monap_ptr->touched = TRUE;
120         sound(SOUND_TOUCH);
121         break;
122     }
123     case RBM_PUNCH: {
124         monap_ptr->act = _("パンチされた。", "punches you.");
125         monap_ptr->touched = TRUE;
126         monap_ptr->do_stun = 1;
127         sound(SOUND_HIT);
128         break;
129     }
130     case RBM_KICK: {
131         monap_ptr->act = _("蹴られた。", "kicks you.");
132         monap_ptr->touched = TRUE;
133         monap_ptr->do_stun = 1;
134         sound(SOUND_HIT);
135         break;
136     }
137     case RBM_CLAW: {
138         monap_ptr->act = _("ひっかかれた。", "claws you.");
139         monap_ptr->touched = TRUE;
140         monap_ptr->do_cut = 1;
141         sound(SOUND_CLAW);
142         break;
143     }
144     case RBM_BITE: {
145         monap_ptr->act = _("噛まれた。", "bites you.");
146         monap_ptr->do_cut = 1;
147         monap_ptr->touched = TRUE;
148         sound(SOUND_BITE);
149         break;
150     }
151     case RBM_STING: {
152         monap_ptr->act = _("刺された。", "stings you.");
153         monap_ptr->touched = TRUE;
154         sound(SOUND_STING);
155         break;
156     }
157     case RBM_SLASH: {
158         monap_ptr->act = _("斬られた。", "slashes you.");
159         monap_ptr->touched = TRUE;
160         monap_ptr->do_cut = 1;
161         sound(SOUND_CLAW);
162         break;
163     }
164     case RBM_BUTT: {
165         monap_ptr->act = _("角で突かれた。", "butts you.");
166         monap_ptr->do_stun = 1;
167         monap_ptr->touched = TRUE;
168         sound(SOUND_HIT);
169         break;
170     }
171     case RBM_CRUSH: {
172         monap_ptr->act = _("体当たりされた。", "crushes you.");
173         monap_ptr->do_stun = 1;
174         monap_ptr->touched = TRUE;
175         sound(SOUND_CRUSH);
176         break;
177     }
178     case RBM_ENGULF: {
179         monap_ptr->act = _("飲み込まれた。", "engulfs you.");
180         monap_ptr->touched = TRUE;
181         sound(SOUND_CRUSH);
182         break;
183     }
184     case RBM_CHARGE: {
185         monap_ptr->abbreviate = -1;
186         monap_ptr->act = _("は請求書をよこした。", "charges you.");
187         monap_ptr->touched = TRUE;
188
189         /* このコメントはジョークが効いているので残しておく / Note! This is "charges", not "charges at". */
190         sound(SOUND_BUY);
191         break;
192     }
193     case RBM_CRAWL: {
194         monap_ptr->abbreviate = -1;
195         monap_ptr->act = _("が体の上を這い回った。", "crawls on you.");
196         monap_ptr->touched = TRUE;
197         sound(SOUND_SLIME);
198         break;
199     }
200     case RBM_DROOL: {
201         monap_ptr->act = _("よだれをたらされた。", "drools on you.");
202         sound(SOUND_SLIME);
203         break;
204     }
205     case RBM_SPIT: {
206         monap_ptr->act = _("唾を吐かれた。", "spits on you.");
207         sound(SOUND_SLIME);
208         break;
209     }
210     case RBM_EXPLODE: {
211         monap_ptr->abbreviate = -1;
212         monap_ptr->act = _("は爆発した。", "explodes.");
213         monap_ptr->explode = TRUE;
214         break;
215     }
216     case RBM_GAZE: {
217         monap_ptr->act = _("にらまれた。", "gazes at you.");
218         break;
219     }
220     case RBM_WAIL: {
221         monap_ptr->act = _("泣き叫ばれた。", "wails at you.");
222         sound(SOUND_WAIL);
223         break;
224     }
225     case RBM_SPORE: {
226         monap_ptr->act = _("胞子を飛ばされた。", "releases spores at you.");
227         sound(SOUND_SLIME);
228         break;
229     }
230     case RBM_XXX4: {
231         monap_ptr->abbreviate = -1;
232         monap_ptr->act = _("が XXX4 を発射した。", "projects XXX4's at you.");
233         break;
234     }
235     case RBM_BEG: {
236         monap_ptr->act = _("金をせがまれた。", "begs you for money.");
237         sound(SOUND_MOAN);
238         break;
239     }
240     case RBM_INSULT: {
241 #ifdef JP
242         monap_ptr->abbreviate = -1;
243 #endif
244         monap_ptr->act = desc_insult[randint0(monap_ptr->m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
245         sound(SOUND_MOAN);
246         break;
247     }
248     case RBM_MOAN: {
249 #ifdef JP
250         monap_ptr->abbreviate = -1;
251 #endif
252         monap_ptr->act = desc_moan[randint0(4)];
253         sound(SOUND_MOAN);
254         break;
255     }
256     case RBM_SHOW: {
257         monster_attack_show(monap_ptr);
258         break;
259     }
260     }
261 }
262
263 /*!
264  * @brief 時間逆転攻撃による能力低下
265  * @param target_ptr プレーヤーへの参照ポインタ
266  * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ
267  * @return なし
268  */
269 static void describe_disability(player_type *target_ptr, monap_type *monap_ptr)
270 {
271     int stat = randint0(6);
272     switch (stat) {
273     case A_STR:
274         monap_ptr->act = _("強く", "strong");
275         break;
276     case A_INT:
277         monap_ptr->act = _("聡明で", "bright");
278         break;
279     case A_WIS:
280         monap_ptr->act = _("賢明で", "wise");
281         break;
282     case A_DEX:
283         monap_ptr->act = _("器用で", "agile");
284         break;
285     case A_CON:
286         monap_ptr->act = _("健康で", "hale");
287         break;
288     case A_CHR:
289         monap_ptr->act = _("美しく", "beautiful");
290         break;
291     }
292
293     msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), monap_ptr->act);
294     target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
295     if (target_ptr->stat_cur[stat] < 3)
296         target_ptr->stat_cur[stat] = 3;
297 }
298
299 static void process_monster_attack_time(player_type *target_ptr, monap_type *monap_ptr)
300 {
301     if (target_ptr->resist_time || check_multishadow(target_ptr))
302         return;
303
304     switch (randint1(10)) {
305     case 1:
306     case 2:
307     case 3:
308     case 4:
309     case 5: {
310         if (target_ptr->prace == RACE_ANDROID)
311             break;
312         msg_print(_("人生が逆戻りした気がする。", "You feel like a chunk of the past has been ripped away."));
313         lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
314         break;
315     }
316     case 6:
317     case 7:
318     case 8:
319     case 9: {
320         describe_disability(target_ptr, monap_ptr);
321         target_ptr->update |= (PU_BONUS);
322         break;
323     }
324     case 10: {
325         msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
326         for (int i = 0; i < A_MAX; i++) {
327             target_ptr->stat_cur[i] = (target_ptr->stat_cur[i] * 7) / 8;
328             if (target_ptr->stat_cur[i] < 3)
329                 target_ptr->stat_cur[i] = 3;
330         }
331
332         target_ptr->update |= (PU_BONUS);
333         break;
334     }
335     }
336 }
337
338 /*!
339  * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
340  * @param m_idx 打撃を行うモンスターのID
341  * @return 実際に攻撃処理を行った場合TRUEを返す
342  */
343 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
344 {
345     monap_type tmp_monap;
346     monap_type *monap_ptr = initialize_monap_type(target_ptr, &tmp_monap, m_idx);
347
348     int k, tmp;
349     ARMOUR_CLASS ac;
350     DEPTH rlev;
351
352     PRICE gold;
353     object_type *o_ptr;
354     GAME_TEXT o_name[MAX_NLEN];
355     GAME_TEXT m_name[MAX_NLEN];
356     GAME_TEXT ddesc[80];
357
358     bool blinked;
359     bool fear = FALSE;
360     bool alive = TRUE;
361     bool do_silly_attack = (one_in_(2) && target_ptr->image);
362     HIT_POINT get_damage = 0;
363     monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx];
364     if (r_ptr->flags1 & (RF1_NEVER_BLOW))
365         return FALSE;
366
367     if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
368         return FALSE;
369
370     if (!is_hostile(monap_ptr->m_ptr))
371         return FALSE;
372
373     rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
374     monster_desc(target_ptr, m_name, monap_ptr->m_ptr, 0);
375     monster_desc(target_ptr, ddesc, monap_ptr->m_ptr, MD_WRONGDOER_NAME);
376     if (target_ptr->special_defense & KATA_IAI) {
377         msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, drew and cut in one motion before %s moved."), m_name);
378         if (do_cmd_attack(target_ptr, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, HISSATSU_IAI))
379             return TRUE;
380     }
381
382     if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev * 3 / 5 + 20))) {
383         if (kawarimi(target_ptr, TRUE))
384             return TRUE;
385     }
386
387     blinked = FALSE;
388     floor_type *floor_ptr = target_ptr->current_floor_ptr;
389     for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++) {
390         bool obvious = FALSE;
391         HIT_POINT power = 0;
392         HIT_POINT damage = 0;
393         int effect = r_ptr->blow[ap_cnt].effect;
394         monap_ptr->method = r_ptr->blow[ap_cnt].method;
395         int d_dice = r_ptr->blow[ap_cnt].d_dice;
396         int d_side = r_ptr->blow[ap_cnt].d_side;
397
398         if (!monster_is_valid(monap_ptr->m_ptr))
399             break;
400
401         if (!monap_ptr->method)
402             break;
403
404         if (is_pet(monap_ptr->m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (monap_ptr->method == RBM_EXPLODE)) {
405             monap_ptr->method = RBM_HIT;
406             d_dice /= 10;
407         }
408
409         if (!target_ptr->playing || target_ptr->is_dead || (distance(target_ptr->y, target_ptr->x, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx) > 1)
410             || target_ptr->leaving)
411             break;
412
413         if (monap_ptr->method == RBM_SHOOT)
414             continue;
415
416         power = mbe_info[effect].power;
417         ac = target_ptr->ac + target_ptr->to_a;
418         if (!effect || check_hit_from_monster_to_player(target_ptr, power, rlev, MON_STUNNED(monap_ptr->m_ptr))) {
419             disturb(target_ptr, TRUE, TRUE);
420             if ((target_ptr->protevil > 0) && (r_ptr->flags3 & RF3_EVIL) && (target_ptr->lev >= rlev) && ((randint0(100) + target_ptr->lev) > 50)) {
421                 if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
422                     r_ptr->r_flags3 |= RF3_EVIL;
423
424 #ifdef JP
425                 if (monap_ptr->abbreviate)
426                     msg_format("撃退した。");
427                 else
428                     msg_format("%^sは撃退された。", m_name);
429
430                 monap_ptr->abbreviate = 1; /*2回目以降は省略 */
431 #else
432                 msg_format("%^s is repelled.", m_name);
433 #endif
434
435                 continue;
436             }
437
438             monap_ptr->do_cut = 0;
439             monap_ptr->do_stun = 0;
440             describe_monster_attack_method(monap_ptr);
441             if (monap_ptr->act) {
442                 if (do_silly_attack) {
443 #ifdef JP
444                     monap_ptr->abbreviate = -1;
445 #endif
446                     monap_ptr->act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
447                 }
448 #ifdef JP
449                 if (monap_ptr->abbreviate == 0)
450                     msg_format("%^sに%s", m_name, monap_ptr->act);
451                 else if (monap_ptr->abbreviate == 1)
452                     msg_format("%s", monap_ptr->act);
453                 else /* if (monap_ptr->abbreviate == -1) */
454                     msg_format("%^s%s", m_name, monap_ptr->act);
455                 monap_ptr->abbreviate = 1; /*2回目以降は省略 */
456 #else
457                 msg_format("%^s %s%s", m_name, monap_ptr->act, do_silly_attack ? " you." : "");
458 #endif
459             }
460
461             obvious = TRUE;
462             damage = damroll(d_dice, d_side);
463             if (monap_ptr->explode)
464                 damage = 0;
465
466             switch (effect) {
467             case 0: {
468                 obvious = TRUE;
469                 damage = 0;
470                 break;
471             }
472             case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
473             {
474                 if (((randint1(rlev * 2 + 300) > (ac + 200)) || one_in_(13)) && !check_multishadow(target_ptr)) {
475                     int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
476                     msg_print(_("痛恨の一撃!", "It was a critical hit!"));
477                     tmp_damage = MAX(damage, tmp_damage * 2);
478                     get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
479                     break;
480                 }
481             }
482                 /* Fall through */
483             case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
484             {
485                 obvious = TRUE;
486                 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
487                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
488                 break;
489             }
490             case RBE_POISON: {
491                 if (monap_ptr->explode)
492                     break;
493
494                 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)) {
495                     if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5)) {
496                         obvious = TRUE;
497                     }
498                 }
499
500                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
501                 update_smart_learn(target_ptr, m_idx, DRS_POIS);
502                 break;
503             }
504             case RBE_UN_BONUS: {
505                 if (monap_ptr->explode)
506                     break;
507
508                 if (!target_ptr->resist_disen && !check_multishadow(target_ptr)) {
509                     if (apply_disenchant(target_ptr, 0)) {
510                         update_creature(target_ptr);
511                         obvious = TRUE;
512                     }
513                 }
514
515                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
516                 update_smart_learn(target_ptr, m_idx, DRS_DISEN);
517                 break;
518             }
519             case RBE_UN_POWER: {
520                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
521                 if (target_ptr->is_dead || check_multishadow(target_ptr))
522                     break;
523
524                 for (k = 0; k < 10; k++) {
525                     INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
526                     o_ptr = &target_ptr->inventory_list[i];
527                     if (!o_ptr->k_idx)
528                         continue;
529
530                     if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND)) && (o_ptr->pval)) {
531                         int heal = rlev * o_ptr->pval;
532                         if (o_ptr->tval == TV_STAFF)
533                             heal *= o_ptr->number;
534
535                         heal = MIN(heal, monap_ptr->m_ptr->maxhp - monap_ptr->m_ptr->hp);
536                         msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
537                         obvious = TRUE;
538                         monap_ptr->m_ptr->hp += (HIT_POINT)heal;
539                         if (target_ptr->health_who == m_idx)
540                             target_ptr->redraw |= (PR_HEALTH);
541
542                         if (target_ptr->riding == m_idx)
543                             target_ptr->redraw |= (PR_UHEALTH);
544
545                         o_ptr->pval = 0;
546                         target_ptr->update |= (PU_COMBINE | PU_REORDER);
547                         target_ptr->window |= (PW_INVEN);
548                         break;
549                     }
550                 }
551
552                 break;
553             }
554             case RBE_EAT_GOLD: {
555                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
556                 if (MON_CONFUSED(monap_ptr->m_ptr))
557                     break;
558
559                 if (target_ptr->is_dead || check_multishadow(target_ptr))
560                     break;
561
562                 obvious = TRUE;
563                 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev))) {
564                     msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
565                     if (randint0(3))
566                         blinked = TRUE;
567                 }
568                 else {
569                     gold = (target_ptr->au / 10) + randint1(25);
570                     if (gold < 2)
571                         gold = 2;
572                     if (gold > 5000)
573                         gold = (target_ptr->au / 20) + randint1(3000);
574                     if (gold > target_ptr->au)
575                         gold = target_ptr->au;
576                     target_ptr->au -= gold;
577                     if (gold <= 0) {
578                         msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
579                     } else if (target_ptr->au) {
580                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
581                         msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
582                         chg_virtue(target_ptr, V_SACRIFICE, 1);
583                     } else {
584                         msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
585                         msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
586                         chg_virtue(target_ptr, V_SACRIFICE, 2);
587                     }
588
589                     target_ptr->redraw |= (PR_GOLD);
590                     target_ptr->window |= (PW_PLAYER);
591                     blinked = TRUE;
592                 }
593
594                 break;
595             }
596             case RBE_EAT_ITEM: {
597                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
598                 if (MON_CONFUSED(monap_ptr->m_ptr))
599                     break;
600
601                 if (target_ptr->is_dead || check_multishadow(target_ptr))
602                     break;
603
604                 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev))) {
605                     msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
606                     blinked = TRUE;
607                     obvious = TRUE;
608                     break;
609                 }
610
611                 for (k = 0; k < 10; k++) {
612                     OBJECT_IDX o_idx;
613                     INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
614                     o_ptr = &target_ptr->inventory_list[i];
615                     if (!o_ptr->k_idx)
616                         continue;
617
618                     if (object_is_artifact(o_ptr))
619                         continue;
620
621                     object_desc(target_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
622 #ifdef JP
623                     msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
624 #else
625                     msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
626 #endif
627                     chg_virtue(target_ptr, V_SACRIFICE, 1);
628                     o_idx = o_pop(floor_ptr);
629                     if (o_idx) {
630                         object_type *j_ptr;
631                         j_ptr = &floor_ptr->o_list[o_idx];
632                         object_copy(j_ptr, o_ptr);
633                         j_ptr->number = 1;
634                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND)) {
635                             j_ptr->pval = o_ptr->pval / o_ptr->number;
636                             o_ptr->pval -= j_ptr->pval;
637                         }
638
639                         j_ptr->marked = OM_TOUCHED;
640                         j_ptr->held_m_idx = m_idx;
641                         j_ptr->next_o_idx = monap_ptr->m_ptr->hold_o_idx;
642                         monap_ptr->m_ptr->hold_o_idx = o_idx;
643                     }
644
645                     inven_item_increase(target_ptr, i, -1);
646                     inven_item_optimize(target_ptr, i);
647                     obvious = TRUE;
648                     blinked = TRUE;
649                     break;
650                 }
651
652                 break;
653             }
654
655             case RBE_EAT_FOOD: {
656                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
657                 if (target_ptr->is_dead || check_multishadow(target_ptr))
658                     break;
659
660                 for (k = 0; k < 10; k++) {
661                     INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
662                     o_ptr = &target_ptr->inventory_list[i];
663                     if (!o_ptr->k_idx)
664                         continue;
665
666                     if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval)))
667                         continue;
668
669                     object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
670 #ifdef JP
671                     msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
672 #else
673                     msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
674 #endif
675                     inven_item_increase(target_ptr, i, -1);
676                     inven_item_optimize(target_ptr, i);
677                     obvious = TRUE;
678                     break;
679                 }
680
681                 break;
682             }
683             case RBE_EAT_LITE: {
684                 o_ptr = &target_ptr->inventory_list[INVEN_LITE];
685                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
686                 if (target_ptr->is_dead || check_multishadow(target_ptr))
687                     break;
688
689                 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr))) {
690                     o_ptr->xtra4 -= (s16b)(250 + randint1(250));
691                     if (o_ptr->xtra4 < 1)
692                         o_ptr->xtra4 = 1;
693
694                     if (!target_ptr->blind) {
695                         msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
696                         obvious = TRUE;
697                     }
698
699                     target_ptr->window |= (PW_EQUIP);
700                 }
701
702                 break;
703             }
704             case RBE_ACID: {
705                 if (monap_ptr->explode)
706                     break;
707
708                 obvious = TRUE;
709                 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
710                 get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
711                 update_creature(target_ptr);
712                 update_smart_learn(target_ptr, m_idx, DRS_ACID);
713                 break;
714             }
715             case RBE_ELEC: {
716                 if (monap_ptr->explode)
717                     break;
718                 obvious = TRUE;
719                 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
720                 get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
721                 update_smart_learn(target_ptr, m_idx, DRS_ELEC);
722                 break;
723             }
724             case RBE_FIRE: {
725                 if (monap_ptr->explode)
726                     break;
727                 obvious = TRUE;
728                 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
729                 get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
730                 update_smart_learn(target_ptr, m_idx, DRS_FIRE);
731                 break;
732             }
733             case RBE_COLD: {
734                 if (monap_ptr->explode)
735                     break;
736                 obvious = TRUE;
737                 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
738                 get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
739                 update_smart_learn(target_ptr, m_idx, DRS_COLD);
740                 break;
741             }
742             case RBE_BLIND: {
743                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
744                 if (target_ptr->is_dead)
745                     break;
746
747                 if (!target_ptr->resist_blind && !check_multishadow(target_ptr)) {
748                     if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev))) {
749 #ifdef JP
750                         if (monap_ptr->m_ptr->r_idx == MON_DIO)
751                             msg_print("どうだッ!この血の目潰しはッ!");
752 #else
753                         /* nanka */
754 #endif
755                         obvious = TRUE;
756                     }
757                 }
758
759                 update_smart_learn(target_ptr, m_idx, DRS_BLIND);
760                 break;
761             }
762             case RBE_CONFUSE: {
763                 if (monap_ptr->explode)
764                     break;
765
766                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
767                 if (target_ptr->is_dead)
768                     break;
769
770                 if (!target_ptr->resist_conf && !check_multishadow(target_ptr)) {
771                     if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev))) {
772                         obvious = TRUE;
773                     }
774                 }
775
776                 update_smart_learn(target_ptr, m_idx, DRS_CONF);
777                 break;
778             }
779             case RBE_TERRIFY: {
780                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
781                 if (target_ptr->is_dead)
782                     break;
783
784                 if (check_multishadow(target_ptr)) {
785                     /* Do nothing */
786                 } else if (target_ptr->resist_fear) {
787                     msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
788                     obvious = TRUE;
789                 } else if (randint0(100 + r_ptr->level / 2) < target_ptr->skill_sav) {
790                     msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
791                     obvious = TRUE;
792                 } else {
793                     if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev))) {
794                         obvious = TRUE;
795                     }
796                 }
797
798                 update_smart_learn(target_ptr, m_idx, DRS_FEAR);
799                 break;
800             }
801             case RBE_PARALYZE: {
802                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
803
804                 if (target_ptr->is_dead)
805                     break;
806
807                 if (check_multishadow(target_ptr)) {
808                     /* Do nothing */
809                 } else if (target_ptr->free_act) {
810                     msg_print(_("しかし効果がなかった!", "You are unaffected!"));
811                     obvious = TRUE;
812                 } else if (randint0(100 + r_ptr->level / 2) < target_ptr->skill_sav) {
813                     msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
814                     obvious = TRUE;
815                 } else {
816                     if (!target_ptr->paralyzed) {
817                         if (set_paralyzed(target_ptr, 3 + randint1(rlev))) {
818                             obvious = TRUE;
819                         }
820                     }
821                 }
822
823                 update_smart_learn(target_ptr, m_idx, DRS_FREE);
824                 break;
825             }
826             case RBE_LOSE_STR: {
827                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
828                 if (target_ptr->is_dead || check_multishadow(target_ptr))
829                     break;
830
831                 if (do_dec_stat(target_ptr, A_STR))
832                     obvious = TRUE;
833
834                 break;
835             }
836             case RBE_LOSE_INT: {
837                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
838                 if (target_ptr->is_dead || check_multishadow(target_ptr))
839                     break;
840
841                 if (do_dec_stat(target_ptr, A_INT))
842                     obvious = TRUE;
843
844                 break;
845             }
846             case RBE_LOSE_WIS: {
847                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
848                 if (target_ptr->is_dead || check_multishadow(target_ptr))
849                     break;
850
851                 if (do_dec_stat(target_ptr, A_WIS))
852                     obvious = TRUE;
853
854                 break;
855             }
856             case RBE_LOSE_DEX: {
857                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
858                 if (target_ptr->is_dead || check_multishadow(target_ptr))
859                     break;
860
861                 if (do_dec_stat(target_ptr, A_DEX))
862                     obvious = TRUE;
863
864                 break;
865             }
866             case RBE_LOSE_CON: {
867                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
868                 if (target_ptr->is_dead || check_multishadow(target_ptr))
869                     break;
870
871                 if (do_dec_stat(target_ptr, A_CON))
872                     obvious = TRUE;
873
874                 break;
875             }
876             case RBE_LOSE_CHR: {
877                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
878                 if (target_ptr->is_dead || check_multishadow(target_ptr))
879                     break;
880
881                 if (do_dec_stat(target_ptr, A_CHR))
882                     obvious = TRUE;
883
884                 break;
885             }
886             case RBE_LOSE_ALL: {
887                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
888                 if (target_ptr->is_dead || check_multishadow(target_ptr))
889                     break;
890
891                 if (do_dec_stat(target_ptr, A_STR))
892                     obvious = TRUE;
893
894                 if (do_dec_stat(target_ptr, A_DEX))
895                     obvious = TRUE;
896
897                 if (do_dec_stat(target_ptr, A_CON))
898                     obvious = TRUE;
899
900                 if (do_dec_stat(target_ptr, A_INT))
901                     obvious = TRUE;
902
903                 if (do_dec_stat(target_ptr, A_WIS))
904                     obvious = TRUE;
905
906                 if (do_dec_stat(target_ptr, A_CHR))
907                     obvious = TRUE;
908
909                 break;
910             }
911             case RBE_SHATTER: {
912                 obvious = TRUE;
913                 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
914                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
915                 if (damage > 23 || monap_ptr->explode)
916                     earthquake(target_ptr, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, 8, m_idx);
917
918                 break;
919             }
920             case RBE_EXP_10: {
921                 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
922                 obvious = TRUE;
923                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
924                 if (target_ptr->is_dead || check_multishadow(target_ptr))
925                     break;
926
927                 (void)drain_exp(target_ptr, d, d / 10, 95);
928                 break;
929             }
930             case RBE_EXP_20: {
931                 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
932                 obvious = TRUE;
933                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
934                 if (target_ptr->is_dead || check_multishadow(target_ptr))
935                     break;
936
937                 (void)drain_exp(target_ptr, d, d / 10, 90);
938                 break;
939             }
940             case RBE_EXP_40: {
941                 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
942                 obvious = TRUE;
943                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
944                 if (target_ptr->is_dead || check_multishadow(target_ptr))
945                     break;
946
947                 (void)drain_exp(target_ptr, d, d / 10, 75);
948                 break;
949             }
950             case RBE_EXP_80: {
951                 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
952                 obvious = TRUE;
953                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
954                 if (target_ptr->is_dead || check_multishadow(target_ptr))
955                     break;
956
957                 (void)drain_exp(target_ptr, d, d / 10, 50);
958                 break;
959             }
960             case RBE_DISEASE: {
961                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
962                 if (target_ptr->is_dead || check_multishadow(target_ptr))
963                     break;
964
965                 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr))) {
966                     if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5)) {
967                         obvious = TRUE;
968                     }
969                 }
970
971                 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID)) {
972                     bool perm = one_in_(10);
973                     if (dec_stat(target_ptr, A_CON, randint1(10), perm)) {
974                         msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
975                         obvious = TRUE;
976                     }
977                 }
978
979                 break;
980             }
981             case RBE_TIME: {
982                 if (monap_ptr->explode)
983                     break;
984
985                 process_monster_attack_time(target_ptr, monap_ptr);
986                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
987                 break;
988             }
989             case RBE_DR_LIFE: {
990                 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
991                 bool resist_drain;
992                 obvious = TRUE;
993                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
994                 if (target_ptr->is_dead || check_multishadow(target_ptr))
995                     break;
996
997                 resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
998                 if (target_ptr->mimic_form) {
999                     if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
1000                         resist_drain = TRUE;
1001                 } else {
1002                     switch (target_ptr->prace) {
1003                     case RACE_ZOMBIE:
1004                     case RACE_VAMPIRE:
1005                     case RACE_SPECTRE:
1006                     case RACE_SKELETON:
1007                     case RACE_BALROG:
1008                     case RACE_GOLEM:
1009                     case RACE_ANDROID:
1010                         resist_drain = TRUE;
1011                         break;
1012                     }
1013                 }
1014
1015                 if ((damage > 5) && !resist_drain) {
1016                     bool did_heal = FALSE;
1017                     if (monap_ptr->m_ptr->hp < monap_ptr->m_ptr->maxhp)
1018                         did_heal = TRUE;
1019
1020                     monap_ptr->m_ptr->hp += damroll(4, damage / 6);
1021                     if (monap_ptr->m_ptr->hp > monap_ptr->m_ptr->maxhp)
1022                         monap_ptr->m_ptr->hp = monap_ptr->m_ptr->maxhp;
1023
1024                     if (target_ptr->health_who == m_idx)
1025                         target_ptr->redraw |= (PR_HEALTH);
1026
1027                     if (target_ptr->riding == m_idx)
1028                         target_ptr->redraw |= (PR_UHEALTH);
1029
1030                     if (monap_ptr->m_ptr->ml && did_heal) {
1031                         msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
1032                     }
1033                 }
1034
1035                 break;
1036             }
1037             case RBE_DR_MANA: {
1038                 obvious = TRUE;
1039                 if (check_multishadow(target_ptr)) {
1040                     msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
1041                 } else {
1042                     monap_ptr->do_cut = 0;
1043                     target_ptr->csp -= damage;
1044                     if (target_ptr->csp < 0) {
1045                         target_ptr->csp = 0;
1046                         target_ptr->csp_frac = 0;
1047                     }
1048
1049                     target_ptr->redraw |= (PR_MANA);
1050                 }
1051
1052                 update_smart_learn(target_ptr, m_idx, DRS_MANA);
1053                 break;
1054             }
1055             case RBE_INERTIA: {
1056                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
1057                 if (target_ptr->is_dead)
1058                     break;
1059
1060                 if (check_multishadow(target_ptr)) {
1061                     /* Do nothing */
1062                 } else {
1063                     if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE)) {
1064                         obvious = TRUE;
1065                     }
1066                 }
1067
1068                 break;
1069             }
1070             case RBE_STUN: {
1071                 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
1072                 if (target_ptr->is_dead)
1073                     break;
1074
1075                 if (target_ptr->resist_sound || check_multishadow(target_ptr)) {
1076                     /* Do nothing */
1077                 } else {
1078                     if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4))) {
1079                         obvious = TRUE;
1080                     }
1081                 }
1082
1083                 break;
1084             }
1085             }
1086
1087             // TODO 三項演算子に差し替え.
1088             if (monap_ptr->do_cut && monap_ptr->do_stun) {
1089                 if (randint0(100) < 50) {
1090                     monap_ptr->do_cut = 0;
1091                 }
1092                 else {
1093                     monap_ptr->do_stun = 0;
1094                 }
1095             }
1096
1097             if (monap_ptr->do_cut) {
1098                 int cut_plus = 0;
1099                 tmp = calc_monster_critical(d_dice, d_side, damage);
1100                 switch (tmp) {
1101                 case 0:
1102                     cut_plus = 0;
1103                     break;
1104                 case 1:
1105                     cut_plus = randint1(5);
1106                     break;
1107                 case 2:
1108                     cut_plus = randint1(5) + 5;
1109                     break;
1110                 case 3:
1111                     cut_plus = randint1(20) + 20;
1112                     break;
1113                 case 4:
1114                     cut_plus = randint1(50) + 50;
1115                     break;
1116                 case 5:
1117                     cut_plus = randint1(100) + 100;
1118                     break;
1119                 case 6:
1120                     cut_plus = 300;
1121                     break;
1122                 default:
1123                     cut_plus = 500;
1124                     break;
1125                 }
1126
1127                 if (cut_plus)
1128                     (void)set_cut(target_ptr, target_ptr->cut + cut_plus);
1129             }
1130
1131             if (monap_ptr->do_stun) {
1132                 int stun_plus = 0;
1133                 tmp = calc_monster_critical(d_dice, d_side, damage);
1134                 switch (tmp) {
1135                 case 0:
1136                     stun_plus = 0;
1137                     break;
1138                 case 1:
1139                     stun_plus = randint1(5);
1140                     break;
1141                 case 2:
1142                     stun_plus = randint1(5) + 10;
1143                     break;
1144                 case 3:
1145                     stun_plus = randint1(10) + 20;
1146                     break;
1147                 case 4:
1148                     stun_plus = randint1(15) + 30;
1149                     break;
1150                 case 5:
1151                     stun_plus = randint1(20) + 40;
1152                     break;
1153                 case 6:
1154                     stun_plus = 80;
1155                     break;
1156                 default:
1157                     stun_plus = 150;
1158                     break;
1159                 }
1160
1161                 if (stun_plus)
1162                     (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
1163             }
1164
1165             if (monap_ptr->explode) {
1166                 sound(SOUND_EXPLODE);
1167
1168                 if (mon_take_hit(target_ptr, m_idx, monap_ptr->m_ptr->hp + 1, &fear, NULL)) {
1169                     blinked = FALSE;
1170                     alive = FALSE;
1171                 }
1172             }
1173
1174             if (monap_ptr->touched) {
1175                 if (target_ptr->sh_fire && alive && !target_ptr->is_dead) {
1176                     if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) {
1177                         HIT_POINT dam = damroll(2, 6);
1178                         dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1179                         msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
1180                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash."))) {
1181                             blinked = FALSE;
1182                             alive = FALSE;
1183                         }
1184
1185                     } else {
1186                         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1187                             r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
1188                     }
1189                 }
1190
1191                 if (target_ptr->sh_elec && alive && !target_ptr->is_dead) {
1192                     if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)) {
1193                         HIT_POINT dam = damroll(2, 6);
1194                         dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1195                         msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
1196                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder."))) {
1197                             blinked = FALSE;
1198                             alive = FALSE;
1199                         }
1200                     } else {
1201                         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1202                             r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
1203                     }
1204                 }
1205
1206                 if (target_ptr->sh_cold && alive && !target_ptr->is_dead) {
1207                     if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)) {
1208                         HIT_POINT dam = damroll(2, 6);
1209                         dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1210                         msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
1211                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen."))) {
1212                             blinked = FALSE;
1213                             alive = FALSE;
1214                         }
1215                     } else {
1216                         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1217                             r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
1218                     }
1219                 }
1220
1221                 if (target_ptr->dustrobe && alive && !target_ptr->is_dead) {
1222                     if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK)) {
1223                         HIT_POINT dam = damroll(2, 6);
1224                         dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1225                         msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
1226                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces."))) {
1227                             blinked = FALSE;
1228                             alive = FALSE;
1229                         }
1230                     } else {
1231                         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1232                             r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
1233                     }
1234
1235                     if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x])) {
1236                         teleport_player(target_ptr, 10, TELEPORT_SPONTANEOUS);
1237                     }
1238                 }
1239
1240                 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead) {
1241                     if (r_ptr->flags3 & RF3_EVIL) {
1242                         if (!(r_ptr->flagsr & RFR_RES_ALL)) {
1243                             HIT_POINT dam = damroll(2, 6);
1244                             dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1245                             msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
1246                             if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) {
1247                                 blinked = FALSE;
1248                                 alive = FALSE;
1249                             }
1250                             if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1251                                 r_ptr->r_flags3 |= RF3_EVIL;
1252                         } else {
1253                             if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1254                                 r_ptr->r_flagsr |= RFR_RES_ALL;
1255                         }
1256                     }
1257                 }
1258
1259                 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead) {
1260                     if (!(r_ptr->flagsr & RFR_RES_ALL)) {
1261                         HIT_POINT dam = damroll(2, 6);
1262                         dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1263                         msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
1264                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) {
1265                             blinked = FALSE;
1266                             alive = FALSE;
1267                         }
1268                     } else {
1269                         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1270                             r_ptr->r_flagsr |= RFR_RES_ALL;
1271                     }
1272                 }
1273
1274                 if (hex_spelling(target_ptr, HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead) {
1275                     HIT_POINT dam = 1;
1276                     object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
1277                     if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK)) {
1278                         if (o_armed_ptr->k_idx) {
1279                             int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
1280                             dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
1281                         }
1282
1283                         o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
1284                         if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr))
1285                             dam *= 2;
1286
1287                         dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE);
1288                         msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
1289                         if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) {
1290                             blinked = FALSE;
1291                             alive = FALSE;
1292                         } else /* monster does not dead */
1293                         {
1294                             int j;
1295                             BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
1296                             EFFECT_ID typ[4][2]
1297                                 = { { INVEN_HEAD, GF_OLD_CONF }, { INVEN_LARM, GF_OLD_SLEEP }, { INVEN_HANDS, GF_TURN_ALL }, { INVEN_FEET, GF_OLD_SLOW } };
1298
1299                             /* Some cursed armours gives an extra effect */
1300                             for (j = 0; j < 4; j++) {
1301                                 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
1302                                 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
1303                                     project(target_ptr, 0, 0, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
1304                             }
1305                         }
1306                     } else {
1307                         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr))
1308                             r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
1309                     }
1310                 }
1311             }
1312         }
1313         else {
1314             switch (monap_ptr->method) {
1315             case RBM_HIT:
1316             case RBM_TOUCH:
1317             case RBM_PUNCH:
1318             case RBM_KICK:
1319             case RBM_CLAW:
1320             case RBM_BITE:
1321             case RBM_STING:
1322             case RBM_SLASH:
1323             case RBM_BUTT:
1324             case RBM_CRUSH:
1325             case RBM_ENGULF:
1326             case RBM_CHARGE:
1327                 if (monap_ptr->m_ptr->ml) {
1328                     disturb(target_ptr, TRUE, TRUE);
1329 #ifdef JP
1330                     if (monap_ptr->abbreviate)
1331                         msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
1332                     else
1333                         msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
1334
1335                     monap_ptr->abbreviate = 1; /*2回目以降は省略 */
1336 #else
1337                     msg_format("%^s misses you.", m_name);
1338 #endif
1339                 }
1340
1341                 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM])) {
1342                     int cur = target_ptr->skill_exp[GINOU_SHIELD];
1343                     int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
1344                     if (cur < max) {
1345                         DEPTH targetlevel = r_ptr->level;
1346                         int inc = 0;
1347                         if ((cur / 100) < targetlevel) {
1348                             if ((cur / 100 + 15) < targetlevel)
1349                                 inc += 1 + (targetlevel - (cur / 100 + 15));
1350                             else
1351                                 inc += 1;
1352                         }
1353
1354                         target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
1355                         target_ptr->update |= (PU_BONUS);
1356                     }
1357                 }
1358
1359                 damage = 0;
1360                 break;
1361             }
1362         }
1363
1364         if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr) && !do_silly_attack) {
1365             if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) {
1366                 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) {
1367                     r_ptr->r_blows[ap_cnt]++;
1368                 }
1369             }
1370         }
1371
1372         if (target_ptr->riding && damage) {
1373             char m_steed_name[MAX_NLEN];
1374             monster_desc(target_ptr, m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
1375             if (process_fall_off_horse(target_ptr, (damage > 200) ? 200 : damage, FALSE)) {
1376                 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
1377             }
1378         }
1379
1380         if (target_ptr->special_defense & NINJA_KAWARIMI) {
1381             if (kawarimi(target_ptr, FALSE))
1382                 return TRUE;
1383         }
1384     }
1385
1386     revenge_store(target_ptr, get_damage);
1387     if ((target_ptr->tim_eyeeye || hex_spelling(target_ptr, HEX_EYE_FOR_EYE)) && get_damage > 0 && !target_ptr->is_dead) {
1388 #ifdef JP
1389         msg_format("攻撃が%s自身を傷つけた!", m_name);
1390 #else
1391         GAME_TEXT m_name_self[80];
1392         monster_desc(target_ptr, m_name_self, monap_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
1393         msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
1394 #endif
1395         project(target_ptr, 0, 0, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
1396         if (target_ptr->tim_eyeeye)
1397             set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye - 5, TRUE);
1398     }
1399
1400     if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && monap_ptr->m_ptr->ml && (target_ptr->csp > 7)) {
1401         char m_target_name[MAX_NLEN];
1402         monster_desc(target_ptr, m_target_name, monap_ptr->m_ptr, 0);
1403         target_ptr->csp -= 7;
1404         msg_format(_("%^sに反撃した!", "You counterattacked %s!"), m_target_name);
1405         do_cmd_attack(target_ptr, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, HISSATSU_COUNTER);
1406         fear = FALSE;
1407         target_ptr->redraw |= (PR_MANA);
1408     }
1409
1410     if (blinked && alive && !target_ptr->is_dead) {
1411         if (teleport_barrier(target_ptr, m_idx)) {
1412             msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
1413         } else {
1414             msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
1415             teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, TELEPORT_SPONTANEOUS);
1416         }
1417     }
1418
1419     if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
1420         r_ptr->r_deaths++;
1421
1422     if (monap_ptr->m_ptr->ml && fear && alive && !target_ptr->is_dead) {
1423         sound(SOUND_FLEE);
1424         msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
1425     }
1426
1427     if (target_ptr->special_defense & KATA_IAI) {
1428         set_action(target_ptr, ACTION_NONE);
1429     }
1430
1431     return TRUE;
1432 }