OSDN Git Service

b6aeb7c5468ff489807c3e8e9d5c887c1d52ad47
[hengband/hengband.git] / src / effect / effect-monster-switcher.c
1 /*!
2  * @brief 魔法種別による各種処理切り替え
3  * @date 2020/04/29
4  * @author Hourier
5  */
6
7 #include "angband.h"
8 #include "effect-monster-util.h"
9 #include "effect/effect-monster-switcher.h"
10 #include "player-damage.h"
11 #include "world.h"
12 #include "avatar.h"
13 #include "monster-spell.h"
14 #include "quest.h"
15 #include "monster-status.h"
16 #include "effect/spells-effect-util.h"
17 #include "player-effects.h"
18 #include "spells-diceroll.h"
19 #include "monsterrace-hook.h"
20 #include "combat/melee.h"
21 #include "cmd/cmd-pet.h" // 暫定、後で消すかも.
22 #include "spell/spells-type.h"
23 #include "effect/effect-monster-resist-hurt.h"
24
25 static bool effect_monster_psi_empty_mind(player_type *caster_ptr, effect_monster_type *em_ptr)
26 {
27         if ((em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND) == 0) return FALSE;
28
29         em_ptr->dam = 0;
30         em_ptr->note = _("には完全な耐性がある!", " is immune.");
31         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
32                 em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
33
34         return TRUE;
35 }
36
37
38 static bool effect_monster_psi_weird_mind(effect_monster_type *em_ptr)
39 {
40         bool has_resistance = ((em_ptr->r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) != 0) ||
41                 ((em_ptr->r_ptr->flags3 & RF3_ANIMAL) != 0) ||
42                 (em_ptr->r_ptr->level > randint1(3 * em_ptr->dam));
43         if (!has_resistance) return FALSE;
44
45         em_ptr->note = _("には耐性がある!", " resists!");
46         em_ptr->dam /= 3;
47         return TRUE;
48 }
49
50
51 static bool effect_monster_psi_corrupted(player_type *caster_ptr, effect_monster_type *em_ptr)
52 {
53         bool is_powerful = ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) != 0) &&
54                 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
55                 one_in_(2);
56         if (!is_powerful) return FALSE;
57
58         em_ptr->note = NULL;
59         msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
60                 (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
61                         "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
62         return TRUE;
63 }
64
65
66 static void effect_monster_psi_resist_addition(player_type *caster_ptr, effect_monster_type *em_ptr)
67 {
68         switch (randint1(4))
69         {
70         case 1:
71                 set_confused(caster_ptr, caster_ptr->confused + 3 + randint1(em_ptr->dam));
72                 break;
73         case 2:
74                 set_stun(caster_ptr, caster_ptr->stun + randint1(em_ptr->dam));
75                 break;
76         case 3:
77         {
78                 if (em_ptr->r_ptr->flags3 & RF3_NO_FEAR)
79                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
80                 else
81                         set_afraid(caster_ptr, caster_ptr->afraid + 3 + randint1(em_ptr->dam));
82
83                 break;
84         }
85         default:
86                 if (!caster_ptr->free_act)
87                         (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(em_ptr->dam));
88
89                 break;
90         }
91 }
92
93
94 // Powerful demons & undead can turn a mindcrafter's attacks back on them.
95 static void effect_monster_psi_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
96 {
97         if (effect_monster_psi_empty_mind(caster_ptr, em_ptr)) return;
98         if (effect_monster_psi_weird_mind(em_ptr)) return;
99         if (!effect_monster_psi_corrupted(caster_ptr, em_ptr)) return;
100
101         if ((randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav) && !CHECK_MULTISHADOW(caster_ptr))
102         {
103                 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
104                 em_ptr->dam = 0;
105                 return;
106         }
107
108         /* Injure +/- confusion */
109         monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_ptr, MD_WRONGDOER_NAME);
110         take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);
111         if (!one_in_(4) || CHECK_MULTISHADOW(caster_ptr))
112         {
113                 em_ptr->dam = 0;
114                 return;
115         }
116
117         effect_monster_psi_resist_addition(caster_ptr, em_ptr);
118         em_ptr->dam = 0;
119 }
120
121
122 static void effect_monster_psi_addition(effect_monster_type *em_ptr)
123 {
124         if ((em_ptr->dam <= 0) || !one_in_(4)) return;
125
126         switch (randint1(4))
127         {
128         case 1:
129                 em_ptr->do_conf = 3 + randint1(em_ptr->dam);
130                 break;
131         case 2:
132                 em_ptr->do_stun = 3 + randint1(em_ptr->dam);
133                 break;
134         case 3:
135                 em_ptr->do_fear = 3 + randint1(em_ptr->dam);
136                 break;
137         default:
138                 em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
139                 em_ptr->do_sleep = 3 + randint1(em_ptr->dam);
140                 break;
141         }
142 }
143
144
145 gf_switch_result effect_monster_psi(player_type *caster_ptr, effect_monster_type *em_ptr)
146 {
147         if (em_ptr->seen) em_ptr->obvious = TRUE;
148         if (!(los(caster_ptr, em_ptr->m_ptr->fy, em_ptr->m_ptr->fx, caster_ptr->y, caster_ptr->x)))
149         {
150                 if (em_ptr->seen_msg)
151                         msg_format(_("%sはあなたが見えないので影響されない!", "%^s can't see you, and isn't affected!"), em_ptr->m_name);
152
153                 em_ptr->skipped = TRUE;
154                 return GF_SWITCH_CONTINUE;
155         }
156
157         effect_monster_psi_resist(caster_ptr, em_ptr);
158         effect_monster_psi_addition(em_ptr);
159         em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
160         return GF_SWITCH_CONTINUE;
161 }
162
163
164 static bool effect_monster_psi_drain_corrupted(player_type *caster_ptr, effect_monster_type *em_ptr)
165 {
166         bool is_corrupted = ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) != 0) &&
167                 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
168                 (one_in_(2));
169         if (!is_corrupted) return FALSE;
170
171         em_ptr->note = NULL;
172         msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
173                 (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
174                         "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
175         return TRUE;
176 }
177
178
179 // Powerful demons & undead can turn a mindcrafter's attacks back on them.
180 static void effect_monster_psi_drain_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
181 {
182         em_ptr->note = _("には耐性がある!", " resists!");
183         em_ptr->dam /= 3;
184         if (effect_monster_psi_drain_corrupted(caster_ptr, em_ptr)) return;
185
186         if ((randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav) && !CHECK_MULTISHADOW(caster_ptr))
187         {
188                 msg_print(_("あなたは効力を跳ね返した!", "You resist the effects!"));
189                 em_ptr->dam = 0;
190                 return;
191         }
192
193         monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_ptr, MD_WRONGDOER_NAME);
194         if (CHECK_MULTISHADOW(caster_ptr))
195         {
196                 take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);
197                 em_ptr->dam = 0;
198                 return;
199         }
200
201         msg_print(_("超能力パワーを吸いとられた!", "Your psychic energy is drained!"));
202         caster_ptr->csp -= damroll(5, em_ptr->dam) / 2;
203         if (caster_ptr->csp < 0) caster_ptr->csp = 0;
204
205         caster_ptr->redraw |= PR_MANA;
206         caster_ptr->window |= (PW_SPELL);
207         take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);
208         em_ptr->dam = 0;
209 }
210
211
212 static void effect_monster_psi_drain_change_power(player_type *caster_ptr, effect_monster_type *em_ptr)
213 {
214         int b = damroll(5, em_ptr->dam) / 4;
215         concptr str = (caster_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana");
216         concptr msg = _("あなたは%sの苦痛を%sに変換した!",
217                 (em_ptr->seen ? "You convert %s's pain into %s!" : "You convert %ss pain into %s!"));
218         msg_format(msg, em_ptr->m_name, str);
219
220         b = MIN(caster_ptr->msp, caster_ptr->csp + b);
221         caster_ptr->csp = b;
222         caster_ptr->redraw |= PR_MANA;
223         caster_ptr->window |= (PW_SPELL);
224 }
225
226
227 gf_switch_result effect_monster_psi_drain(player_type *caster_ptr, effect_monster_type *em_ptr)
228 {
229         if (em_ptr->seen) em_ptr->obvious = TRUE;
230
231         if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
232         {
233                 em_ptr->dam = 0;
234                 em_ptr->note = _("には完全な耐性がある!", " is immune.");
235         }
236         else if ((em_ptr->r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) ||
237                 (em_ptr->r_ptr->flags3 & RF3_ANIMAL) ||
238                 (em_ptr->r_ptr->level > randint1(3 * em_ptr->dam)))
239         {
240                 effect_monster_psi_drain_resist(caster_ptr, em_ptr);
241         }
242         else if (em_ptr->dam > 0)
243         {
244                 effect_monster_psi_drain_change_power(caster_ptr, em_ptr);
245         }
246
247         em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
248         return GF_SWITCH_CONTINUE;
249 }
250
251
252 /*!
253  * @brief 魔法の効果によって様々なメッセーを出力したり与えるダメージの増減を行ったりする
254  * @param em_ptr モンスター効果構造体への参照ポインタ
255  * @return ここのスイッチングで終るならTRUEかFALSE、後続処理を実行するならCONTINUE
256  */
257 gf_switch_result switch_effects_monster(player_type *caster_ptr, effect_monster_type *em_ptr)
258 {
259         floor_type *floor_ptr = caster_ptr->current_floor_ptr;
260         switch (em_ptr->effect_type)
261         {
262         case GF_PSY_SPEAR:
263         case GF_MISSILE:
264         case GF_ARROW:
265         case GF_MANA:
266         case GF_METEOR:
267         case GF_BLOOD_CURSE:
268         case GF_SEEKER:
269         case GF_SUPER_RAY:
270                 return effect_monster_void(em_ptr);
271         case GF_ACID:
272                 return effect_monster_acid(caster_ptr, em_ptr);
273         case GF_ELEC:
274                 return effect_monster_elec(caster_ptr, em_ptr);
275         case GF_FIRE:
276                 return effect_monster_fire(caster_ptr, em_ptr);
277         case GF_COLD:
278                 return effect_monster_cold(caster_ptr, em_ptr);
279         case GF_POIS:
280                 return effect_monster_pois(caster_ptr, em_ptr);
281         case GF_NUKE:
282                 return effect_monster_nuke(caster_ptr, em_ptr);
283         case GF_HELL_FIRE:
284                 return effect_monster_hell_fire(caster_ptr, em_ptr);
285         case GF_HOLY_FIRE:
286                 return effect_monster_holy_fire(caster_ptr, em_ptr);
287         case GF_PLASMA:
288                 return effect_monster_plasma(caster_ptr, em_ptr);
289         case GF_NETHER:
290                 return effect_monster_nether(caster_ptr, em_ptr);
291         case GF_WATER:
292                 return effect_monster_water(caster_ptr, em_ptr);
293         case GF_CHAOS:
294                 return effect_monster_chaos(caster_ptr, em_ptr);
295         case GF_SHARDS:
296                 return effect_monster_shards(caster_ptr, em_ptr);
297         case GF_ROCKET:
298                 return effect_monster_rocket(caster_ptr, em_ptr);
299         case GF_SOUND:
300                 return effect_monster_sound(caster_ptr, em_ptr);
301         case GF_CONFUSION:
302                 return effect_monster_confusion(caster_ptr, em_ptr);
303         case GF_DISENCHANT:
304                 return effect_monster_disenchant(caster_ptr, em_ptr);
305         case GF_NEXUS:
306                 return effect_monster_nexus(caster_ptr, em_ptr);
307         case GF_FORCE:
308                 return effect_monster_force(caster_ptr, em_ptr);
309         case GF_INERTIAL:
310                 return effect_monster_inertial(caster_ptr, em_ptr);
311         case GF_TIME:
312                 return effect_monster_time(caster_ptr, em_ptr);
313         case GF_GRAVITY:
314                 return effect_monster_gravity(caster_ptr, em_ptr);
315         case GF_DISINTEGRATE:
316                 return effect_monster_disintegration(caster_ptr, em_ptr);
317         case GF_PSI:
318                 return effect_monster_psi(caster_ptr, em_ptr);
319         case GF_PSI_DRAIN:
320                 return effect_monster_psi_drain(caster_ptr, em_ptr);
321         case GF_TELEKINESIS:
322         {
323                 if (em_ptr->seen) em_ptr->obvious = TRUE;
324                 if (one_in_(4))
325                 {
326                         if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)) em_ptr->do_dist = 0;
327                         else em_ptr->do_dist = 7;
328                 }
329
330                 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, em_ptr->dam) + 1;
331                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
332                         (em_ptr->r_ptr->level > 5 + randint1(em_ptr->dam)))
333                 {
334                         em_ptr->do_stun = 0;
335                         em_ptr->obvious = FALSE;
336                 }
337
338                 break;
339         }
340         case GF_DOMINATION:
341         {
342                 if (!is_hostile(em_ptr->m_ptr)) break;
343                 if (em_ptr->seen) em_ptr->obvious = TRUE;
344                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
345                         (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
346                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
347                 {
348                         if (em_ptr->r_ptr->flags3 & RF3_NO_CONF)
349                         {
350                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
351                         }
352
353                         em_ptr->do_conf = 0;
354
355                         /*
356                          * Powerful demons & undead can turn a mindcrafter's
357                          * attacks back on them
358                          */
359                         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) &&
360                                 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
361                                 (one_in_(2)))
362                         {
363                                 em_ptr->note = NULL;
364                                 msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
365                                         (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
366                                                 "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
367
368                                 /* Saving throw */
369                                 if (randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav)
370                                 {
371                                         msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
372                                 }
373                                 else
374                                 {
375                                         /* Confuse, stun, terrify */
376                                         switch (randint1(4))
377                                         {
378                                         case 1:
379                                                 set_stun(caster_ptr, caster_ptr->stun + em_ptr->dam / 2);
380                                                 break;
381                                         case 2:
382                                                 set_confused(caster_ptr, caster_ptr->confused + em_ptr->dam / 2);
383                                                 break;
384                                         default:
385                                         {
386                                                 if (em_ptr->r_ptr->flags3 & RF3_NO_FEAR)
387                                                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
388                                                 else
389                                                         set_afraid(caster_ptr, caster_ptr->afraid + em_ptr->dam);
390                                         }
391                                         }
392                                 }
393                         }
394                         else
395                         {
396                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
397                                 em_ptr->obvious = FALSE;
398                         }
399                 }
400                 else
401                 {
402                         if (!common_saving_throw_charm(caster_ptr, em_ptr->dam, em_ptr->m_ptr))
403                         {
404                                 em_ptr->note = _("があなたに隷属した。", " is in your thrall!");
405                                 set_pet(caster_ptr, em_ptr->m_ptr);
406                         }
407                         else
408                         {
409                                 switch (randint1(4))
410                                 {
411                                 case 1:
412                                         em_ptr->do_stun = em_ptr->dam / 2;
413                                         break;
414                                 case 2:
415                                         em_ptr->do_conf = em_ptr->dam / 2;
416                                         break;
417                                 default:
418                                         em_ptr->do_fear = em_ptr->dam;
419                                 }
420                         }
421                 }
422
423                 em_ptr->dam = 0;
424                 break;
425         }
426         case GF_ICE:
427         {
428                 if (em_ptr->seen) em_ptr->obvious = TRUE;
429                 em_ptr->do_stun = (randint1(15) + 1) / (em_ptr->r + 1);
430                 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
431                 {
432                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
433                         em_ptr->dam /= 9;
434                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
435                 }
436                 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_COLD))
437                 {
438                         em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
439                         em_ptr->dam *= 2;
440                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
441                 }
442
443                 break;
444         }
445         case GF_HYPODYNAMIA:
446         {
447                 if (em_ptr->seen) em_ptr->obvious = TRUE;
448                 if (!monster_living(em_ptr->m_ptr->r_idx))
449                 {
450                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
451                         {
452                                 if (em_ptr->r_ptr->flags3 & RF3_DEMON) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
453                                 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
454                                 if (em_ptr->r_ptr->flags3 & RF3_NONLIVING) em_ptr->r_ptr->r_flags3 |= (RF3_NONLIVING);
455                         }
456                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
457                         em_ptr->obvious = FALSE;
458                         em_ptr->dam = 0;
459                 }
460                 else
461                         em_ptr->do_time = (em_ptr->dam + 7) / 8;
462
463                 break;
464         }
465         case GF_DEATH_RAY:
466         {
467                 if (em_ptr->seen) em_ptr->obvious = TRUE;
468                 if (!monster_living(em_ptr->m_ptr->r_idx))
469                 {
470                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
471                         {
472                                 if (em_ptr->r_ptr->flags3 & RF3_DEMON) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
473                                 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
474                                 if (em_ptr->r_ptr->flags3 & RF3_NONLIVING) em_ptr->r_ptr->r_flags3 |= (RF3_NONLIVING);
475                         }
476                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
477                         em_ptr->obvious = FALSE;
478                         em_ptr->dam = 0;
479                 }
480                 else if (((em_ptr->r_ptr->flags1 & RF1_UNIQUE) &&
481                         (randint1(888) != 666)) ||
482                         (((em_ptr->r_ptr->level + randint1(20)) > randint1((em_ptr->caster_lev / 2) + randint1(10))) &&
483                                 randint1(100) != 66))
484                 {
485                         em_ptr->note = _("には耐性がある!", " resists!");
486                         em_ptr->obvious = FALSE;
487                         em_ptr->dam = 0;
488                 }
489
490                 break;
491         }
492         case GF_OLD_POLY:
493         {
494                 if (em_ptr->seen) em_ptr->obvious = TRUE;
495                 em_ptr->do_polymorph = TRUE;
496
497                 /* Powerful monsters can resist */
498                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
499                         (em_ptr->r_ptr->flags1 & RF1_QUESTOR) ||
500                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
501                 {
502                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
503                         em_ptr->do_polymorph = FALSE;
504                         em_ptr->obvious = FALSE;
505                 }
506
507                 em_ptr->dam = 0;
508                 break;
509         }
510         case GF_OLD_CLONE:
511         {
512                 if (em_ptr->seen) em_ptr->obvious = TRUE;
513
514                 if ((floor_ptr->inside_arena) || is_pet(em_ptr->m_ptr) || (em_ptr->r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (em_ptr->r_ptr->flags7 & (RF7_NAZGUL | RF7_UNIQUE2)))
515                 {
516                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
517                 }
518                 else
519                 {
520                         em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
521                         if (multiply_monster(caster_ptr, em_ptr->g_ptr->m_idx, TRUE, 0L))
522                         {
523                                 em_ptr->note = _("が分裂した!", " spawns!");
524                         }
525                 }
526
527                 em_ptr->dam = 0;
528                 break;
529         }
530         case GF_STAR_HEAL:
531         {
532                 if (em_ptr->seen) em_ptr->obvious = TRUE;
533
534                 (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
535
536                 if (em_ptr->m_ptr->maxhp < em_ptr->m_ptr->max_maxhp)
537                 {
538                         if (em_ptr->seen_msg) msg_format(_("%^sの強さが戻った。", "%^s recovers %s vitality."), em_ptr->m_name, em_ptr->m_poss);
539                         em_ptr->m_ptr->maxhp = em_ptr->m_ptr->max_maxhp;
540                 }
541
542                 if (!em_ptr->dam)
543                 {
544                         if (caster_ptr->health_who == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH);
545                         if (caster_ptr->riding == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH);
546                         break;
547                 }
548         }
549         /* Fall through */
550         case GF_OLD_HEAL:
551         {
552                 if (em_ptr->seen) em_ptr->obvious = TRUE;
553
554                 /* Wake up */
555                 (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
556                 if (MON_STUNNED(em_ptr->m_ptr))
557                 {
558                         if (em_ptr->seen_msg) msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), em_ptr->m_name);
559                         (void)set_monster_stunned(caster_ptr, em_ptr->g_ptr->m_idx, 0);
560                 }
561                 if (MON_CONFUSED(em_ptr->m_ptr))
562                 {
563                         if (em_ptr->seen_msg) msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), em_ptr->m_name);
564                         (void)set_monster_confused(caster_ptr, em_ptr->g_ptr->m_idx, 0);
565                 }
566                 if (MON_MONFEAR(em_ptr->m_ptr))
567                 {
568                         if (em_ptr->seen_msg) msg_format(_("%^sは勇気を取り戻した。", "%^s recovers %s courage."), em_ptr->m_name, em_ptr->m_poss);
569                         (void)set_monster_monfear(caster_ptr, em_ptr->g_ptr->m_idx, 0);
570                 }
571
572                 if (em_ptr->m_ptr->hp < 30000) em_ptr->m_ptr->hp += em_ptr->dam;
573                 if (em_ptr->m_ptr->hp > em_ptr->m_ptr->maxhp) em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
574
575                 if (!em_ptr->who)
576                 {
577                         chg_virtue(caster_ptr, V_VITALITY, 1);
578
579                         if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
580                                 chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
581
582                         if (is_friendly(em_ptr->m_ptr))
583                                 chg_virtue(caster_ptr, V_HONOUR, 1);
584                         else if (!(em_ptr->r_ptr->flags3 & RF3_EVIL))
585                         {
586                                 if (em_ptr->r_ptr->flags3 & RF3_GOOD)
587                                         chg_virtue(caster_ptr, V_COMPASSION, 2);
588                                 else
589                                         chg_virtue(caster_ptr, V_COMPASSION, 1);
590                         }
591
592                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
593                                 chg_virtue(caster_ptr, V_NATURE, 1);
594                 }
595
596                 if (em_ptr->m_ptr->r_idx == MON_LEPER)
597                 {
598                         em_ptr->heal_leper = TRUE;
599                         if (!em_ptr->who) chg_virtue(caster_ptr, V_COMPASSION, 5);
600                 }
601
602                 if (caster_ptr->health_who == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH);
603                 if (caster_ptr->riding == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH);
604
605                 em_ptr->note = _("は体力を回復したようだ。", " looks healthier.");
606
607                 em_ptr->dam = 0;
608                 break;
609         }
610         case GF_OLD_SPEED:
611         {
612                 if (em_ptr->seen) em_ptr->obvious = TRUE;
613
614                 if (set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100))
615                 {
616                         em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
617                 }
618
619                 if (!em_ptr->who)
620                 {
621                         if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
622                                 chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
623                         if (is_friendly(em_ptr->m_ptr))
624                                 chg_virtue(caster_ptr, V_HONOUR, 1);
625                 }
626
627                 em_ptr->dam = 0;
628                 break;
629         }
630         case GF_OLD_SLOW:
631         {
632                 if (em_ptr->seen) em_ptr->obvious = TRUE;
633
634                 /* Powerful monsters can resist */
635                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
636                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
637                 {
638                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
639                         em_ptr->obvious = FALSE;
640                 }
641                 else
642                 {
643                         if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
644                         {
645                                 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
646                         }
647                 }
648
649                 em_ptr->dam = 0;
650                 break;
651         }
652         case GF_OLD_SLEEP:
653         {
654                 if (em_ptr->seen) em_ptr->obvious = TRUE;
655
656                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
657                         (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) ||
658                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
659                 {
660                         if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
661                         {
662                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
663                         }
664
665                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
666                         em_ptr->obvious = FALSE;
667                 }
668                 else
669                 {
670                         em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
671                         em_ptr->do_sleep = 500;
672                 }
673
674                 em_ptr->dam = 0;
675                 break;
676         }
677         case GF_STASIS_EVIL:
678         {
679                 if (em_ptr->seen) em_ptr->obvious = TRUE;
680
681                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
682                         !(em_ptr->r_ptr->flags3 & RF3_EVIL) ||
683                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
684                 {
685                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
686                         em_ptr->obvious = FALSE;
687                 }
688                 else
689                 {
690                         em_ptr->note = _("は動けなくなった!", " is suspended!");
691                         em_ptr->do_sleep = 500;
692                 }
693
694                 em_ptr->dam = 0;
695                 break;
696         }
697         case GF_STASIS:
698         {
699                 if (em_ptr->seen) em_ptr->obvious = TRUE;
700
701                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
702                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
703                 {
704                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
705                         em_ptr->obvious = FALSE;
706                 }
707                 else
708                 {
709                         em_ptr->note = _("は動けなくなった!", " is suspended!");
710                         em_ptr->do_sleep = 500;
711                 }
712
713                 em_ptr->dam = 0;
714                 break;
715         }
716         case GF_CHARM:
717         {
718                 int vir = virtue_number(caster_ptr, V_HARMONY);
719                 if (vir)
720                 {
721                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
722                 }
723
724                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
725                 if (vir)
726                 {
727                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
728                 }
729
730                 if (em_ptr->seen) em_ptr->obvious = TRUE;
731
732                 if (common_saving_throw_charm(caster_ptr, em_ptr->dam, em_ptr->m_ptr))
733                 {
734                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
735                         em_ptr->obvious = FALSE;
736
737                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
738                 }
739                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
740                 {
741                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
742                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
743                 }
744                 else
745                 {
746                         em_ptr->note = _("は突然友好的になったようだ!", " suddenly seems friendly!");
747                         set_pet(caster_ptr, em_ptr->m_ptr);
748
749                         chg_virtue(caster_ptr, V_INDIVIDUALISM, -1);
750                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
751                                 chg_virtue(caster_ptr, V_NATURE, 1);
752                 }
753
754                 em_ptr->dam = 0;
755                 break;
756         }
757         case GF_CONTROL_UNDEAD:
758         {
759                 if (em_ptr->seen) em_ptr->obvious = TRUE;
760
761                 int vir = virtue_number(caster_ptr, V_UNLIFE);
762                 if (vir)
763                 {
764                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
765                 }
766
767                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
768                 if (vir)
769                 {
770                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
771                 }
772
773                 if (common_saving_throw_control(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
774                         !(em_ptr->r_ptr->flags3 & RF3_UNDEAD))
775                 {
776                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
777                         em_ptr->obvious = FALSE;
778                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
779                 }
780                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
781                 {
782                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
783                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
784                 }
785                 else
786                 {
787                         em_ptr->note = _("は既にあなたの奴隷だ!", " is in your thrall!");
788                         set_pet(caster_ptr, em_ptr->m_ptr);
789                 }
790
791                 em_ptr->dam = 0;
792                 break;
793         }
794         case GF_CONTROL_DEMON:
795         {
796                 int vir;
797                 if (em_ptr->seen) em_ptr->obvious = TRUE;
798
799                 vir = virtue_number(caster_ptr, V_UNLIFE);
800                 if (vir)
801                 {
802                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
803                 }
804
805                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
806                 if (vir)
807                 {
808                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
809                 }
810
811                 if (common_saving_throw_control(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
812                         !(em_ptr->r_ptr->flags3 & RF3_DEMON))
813                 {
814                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
815                         em_ptr->obvious = FALSE;
816                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
817                 }
818                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
819                 {
820                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
821                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
822                 }
823                 else
824                 {
825                         em_ptr->note = _("は既にあなたの奴隷だ!", " is in your thrall!");
826                         set_pet(caster_ptr, em_ptr->m_ptr);
827                 }
828
829                 em_ptr->dam = 0;
830                 break;
831         }
832         case GF_CONTROL_ANIMAL:
833         {
834                 if (em_ptr->seen) em_ptr->obvious = TRUE;
835
836                 int vir = virtue_number(caster_ptr, V_NATURE);
837                 if (vir)
838                 {
839                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
840                 }
841
842                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
843                 if (vir)
844                 {
845                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
846                 }
847
848                 if (common_saving_throw_control(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
849                         !(em_ptr->r_ptr->flags3 & RF3_ANIMAL))
850                 {
851                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
852                         em_ptr->obvious = FALSE;
853                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
854                 }
855                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
856                 {
857                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
858                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
859                 }
860                 else
861                 {
862                         em_ptr->note = _("はなついた。", " is tamed!");
863                         set_pet(caster_ptr, em_ptr->m_ptr);
864                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
865                                 chg_virtue(caster_ptr, V_NATURE, 1);
866                 }
867
868                 em_ptr->dam = 0;
869                 break;
870         }
871         case GF_CHARM_LIVING:
872         {
873                 int vir = virtue_number(caster_ptr, V_UNLIFE);
874                 if (em_ptr->seen) em_ptr->obvious = TRUE;
875
876                 vir = virtue_number(caster_ptr, V_UNLIFE);
877                 if (vir)
878                 {
879                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 10;
880                 }
881
882                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
883                 if (vir)
884                 {
885                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
886                 }
887
888                 msg_format(_("%sを見つめた。", "You stare into %s."), em_ptr->m_name);
889
890                 if (common_saving_throw_charm(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
891                         !monster_living(em_ptr->m_ptr->r_idx))
892                 {
893                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
894                         em_ptr->obvious = FALSE;
895                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
896                 }
897                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
898                 {
899                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
900                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
901                 }
902                 else
903                 {
904                         em_ptr->note = _("を支配した。", " is tamed!");
905                         set_pet(caster_ptr, em_ptr->m_ptr);
906                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
907                                 chg_virtue(caster_ptr, V_NATURE, 1);
908                 }
909
910                 em_ptr->dam = 0;
911                 break;
912         }
913         case GF_OLD_CONF:
914         {
915                 if (em_ptr->seen) em_ptr->obvious = TRUE;
916
917                 em_ptr->do_conf = damroll(3, (em_ptr->dam / 2)) + 1;
918                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
919                         (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) ||
920                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
921                 {
922                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
923                         {
924                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
925                         }
926
927                         em_ptr->do_conf = 0;
928                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
929                         em_ptr->obvious = FALSE;
930                 }
931
932                 em_ptr->dam = 0;
933                 break;
934         }
935         case GF_STUN:
936         {
937                 if (em_ptr->seen) em_ptr->obvious = TRUE;
938
939                 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
940                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
941                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
942                 {
943                         em_ptr->do_stun = 0;
944                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
945                         em_ptr->obvious = FALSE;
946                 }
947
948                 em_ptr->dam = 0;
949                 break;
950         }
951         case GF_LITE_WEAK:
952         {
953                 if (!em_ptr->dam)
954                 {
955                         em_ptr->skipped = TRUE;
956                         break;
957                 }
958
959                 if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
960                 {
961                         if (em_ptr->seen) em_ptr->obvious = TRUE;
962
963                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
964
965                         em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
966                         em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
967                 }
968                 else
969                 {
970                         em_ptr->dam = 0;
971                 }
972
973                 break;
974         }
975         case GF_LITE:
976         {
977                 if (em_ptr->seen) em_ptr->obvious = TRUE;
978
979                 if (em_ptr->r_ptr->flagsr & RFR_RES_LITE)
980                 {
981                         em_ptr->note = _("には耐性がある!", " resists!");
982                         em_ptr->dam *= 2; em_ptr->dam /= (randint1(6) + 6);
983                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_LITE);
984                 }
985                 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
986                 {
987                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
988                         em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
989                         em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
990                         em_ptr->dam *= 2;
991                 }
992                 break;
993         }
994         case GF_DARK:
995         {
996                 if (em_ptr->seen) em_ptr->obvious = TRUE;
997
998                 if (em_ptr->r_ptr->flagsr & RFR_RES_DARK)
999                 {
1000                         em_ptr->note = _("には耐性がある!", " resists!");
1001                         em_ptr->dam *= 2; em_ptr->dam /= (randint1(6) + 6);
1002                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_DARK);
1003                 }
1004
1005                 break;
1006         }
1007         case GF_KILL_WALL:
1008         {
1009                 if (em_ptr->r_ptr->flags3 & (RF3_HURT_ROCK))
1010                 {
1011                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1012
1013                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
1014
1015                         em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
1016                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1017                 }
1018                 else
1019                 {
1020                         em_ptr->dam = 0;
1021                 }
1022
1023                 break;
1024         }
1025         case GF_AWAY_UNDEAD:
1026         {
1027                 if (em_ptr->r_ptr->flags3 & (RF3_UNDEAD))
1028                 {
1029                         bool resists_tele = FALSE;
1030
1031                         if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
1032                         {
1033                                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
1034                                 {
1035                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1036                                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1037                                         resists_tele = TRUE;
1038                                 }
1039                                 else if (em_ptr->r_ptr->level > randint1(100))
1040                                 {
1041                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1042                                         em_ptr->note = _("には耐性がある!", " resists!");
1043                                         resists_tele = TRUE;
1044                                 }
1045                         }
1046
1047                         if (!resists_tele)
1048                         {
1049                                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1050                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
1051                                 em_ptr->do_dist = em_ptr->dam;
1052                         }
1053                 }
1054                 else
1055                 {
1056                         em_ptr->skipped = TRUE;
1057                 }
1058
1059                 em_ptr->dam = 0;
1060                 break;
1061         }
1062         case GF_AWAY_EVIL:
1063         {
1064                 if (em_ptr->r_ptr->flags3 & (RF3_EVIL))
1065                 {
1066                         bool resists_tele = FALSE;
1067
1068                         if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
1069                         {
1070                                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
1071                                 {
1072                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1073                                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1074                                         resists_tele = TRUE;
1075                                 }
1076                                 else if (em_ptr->r_ptr->level > randint1(100))
1077                                 {
1078                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1079                                         em_ptr->note = _("には耐性がある!", " resists!");
1080                                         resists_tele = TRUE;
1081                                 }
1082                         }
1083
1084                         if (!resists_tele)
1085                         {
1086                                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1087                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
1088                                 em_ptr->do_dist = em_ptr->dam;
1089                         }
1090                 }
1091                 else
1092                 {
1093                         em_ptr->skipped = TRUE;
1094                 }
1095
1096                 em_ptr->dam = 0;
1097                 break;
1098         }
1099         case GF_AWAY_ALL:
1100         {
1101                 bool resists_tele = FALSE;
1102                 if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
1103                 {
1104                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
1105                         {
1106                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1107                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1108                                 resists_tele = TRUE;
1109                         }
1110                         else if (em_ptr->r_ptr->level > randint1(100))
1111                         {
1112                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1113                                 em_ptr->note = _("には耐性がある!", " resists!");
1114                                 resists_tele = TRUE;
1115                         }
1116                 }
1117
1118                 if (!resists_tele)
1119                 {
1120                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1121
1122                         em_ptr->do_dist = em_ptr->dam;
1123                 }
1124
1125                 em_ptr->dam = 0;
1126                 break;
1127         }
1128         case GF_TURN_UNDEAD:
1129         {
1130                 if (em_ptr->r_ptr->flags3 & (RF3_UNDEAD))
1131                 {
1132                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1133
1134                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
1135
1136                         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
1137                         if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
1138                         {
1139                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1140                                 em_ptr->obvious = FALSE;
1141                                 em_ptr->do_fear = 0;
1142                         }
1143                 }
1144                 else
1145                 {
1146                         em_ptr->skipped = TRUE;
1147                 }
1148
1149                 em_ptr->dam = 0;
1150                 break;
1151         }
1152         case GF_TURN_EVIL:
1153         {
1154                 if (em_ptr->r_ptr->flags3 & (RF3_EVIL))
1155                 {
1156                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1157
1158                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
1159
1160                         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
1161                         if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
1162                         {
1163                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1164                                 em_ptr->obvious = FALSE;
1165                                 em_ptr->do_fear = 0;
1166                         }
1167                 }
1168                 else
1169                 {
1170                         em_ptr->skipped = TRUE;
1171                 }
1172
1173                 em_ptr->dam = 0;
1174                 break;
1175         }
1176         case GF_TURN_ALL:
1177         {
1178                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1179
1180                 em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
1181                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1182                         (em_ptr->r_ptr->flags3 & (RF3_NO_FEAR)) ||
1183                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1184                 {
1185                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1186                         em_ptr->obvious = FALSE;
1187                         em_ptr->do_fear = 0;
1188                 }
1189
1190                 em_ptr->dam = 0;
1191                 break;
1192         }
1193         case GF_DISP_UNDEAD:
1194         {
1195                 if (em_ptr->r_ptr->flags3 & (RF3_UNDEAD))
1196                 {
1197                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1198
1199                         /* Learn about em_ptr->effect_type */
1200                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
1201
1202                         em_ptr->note = _("は身震いした。", " shudders.");
1203                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1204                 }
1205                 else
1206                 {
1207                         em_ptr->skipped = TRUE;
1208                         em_ptr->dam = 0;
1209                 }
1210
1211                 break;
1212         }
1213         case GF_DISP_EVIL:
1214         {
1215                 if (em_ptr->r_ptr->flags3 & (RF3_EVIL))
1216                 {
1217                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1218
1219                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
1220
1221                         em_ptr->note = _("は身震いした。", " shudders.");
1222                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1223                 }
1224                 else
1225                 {
1226                         em_ptr->skipped = TRUE;
1227                         em_ptr->dam = 0;
1228                 }
1229
1230                 break;
1231         }
1232         case GF_DISP_GOOD:
1233         {
1234                 if (em_ptr->r_ptr->flags3 & (RF3_GOOD))
1235                 {
1236                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1237
1238                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
1239
1240                         em_ptr->note = _("は身震いした。", " shudders.");
1241                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1242                 }
1243                 else
1244                 {
1245                         em_ptr->skipped = TRUE;
1246                         em_ptr->dam = 0;
1247                 }
1248
1249                 break;
1250         }
1251         case GF_DISP_LIVING:
1252         {
1253                 if (monster_living(em_ptr->m_ptr->r_idx))
1254                 {
1255                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1256
1257                         em_ptr->note = _("は身震いした。", " shudders.");
1258                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1259                 }
1260                 else
1261                 {
1262                         em_ptr->skipped = TRUE;
1263                         em_ptr->dam = 0;
1264                 }
1265
1266                 break;
1267         }
1268         case GF_DISP_DEMON:
1269         {
1270                 if (em_ptr->r_ptr->flags3 & (RF3_DEMON))
1271                 {
1272                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1273
1274                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
1275
1276                         em_ptr->note = _("は身震いした。", " shudders.");
1277                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1278                 }
1279                 else
1280                 {
1281                         em_ptr->skipped = TRUE;
1282                         em_ptr->dam = 0;
1283                 }
1284
1285                 break;
1286         }
1287         case GF_DISP_ALL:
1288         {
1289                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1290                 em_ptr->note = _("は身震いした。", " shudders.");
1291                 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1292                 break;
1293         }
1294         case GF_DRAIN_MANA:
1295         {
1296                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1297                 if ((em_ptr->r_ptr->flags4 & ~(RF4_NOMAGIC_MASK)) || (em_ptr->r_ptr->a_ability_flags1 & ~(RF5_NOMAGIC_MASK)) || (em_ptr->r_ptr->a_ability_flags2 & ~(RF6_NOMAGIC_MASK)))
1298                 {
1299                         if (em_ptr->who > 0)
1300                         {
1301                                 if (em_ptr->m_caster_ptr->hp < em_ptr->m_caster_ptr->maxhp)
1302                                 {
1303                                         em_ptr->m_caster_ptr->hp += em_ptr->dam;
1304                                         if (em_ptr->m_caster_ptr->hp > em_ptr->m_caster_ptr->maxhp) em_ptr->m_caster_ptr->hp = em_ptr->m_caster_ptr->maxhp;
1305                                         if (caster_ptr->health_who == em_ptr->who) caster_ptr->redraw |= (PR_HEALTH);
1306                                         if (caster_ptr->riding == em_ptr->who) caster_ptr->redraw |= (PR_UHEALTH);
1307
1308                                         if (em_ptr->see_s_msg)
1309                                         {
1310                                                 monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_caster_ptr, 0);
1311                                                 msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), em_ptr->killer);
1312                                         }
1313                                 }
1314                         }
1315                         else
1316                         {
1317                                 msg_format(_("%sから精神エネルギーを吸いとった。", "You draw psychic energy from %s."), em_ptr->m_name);
1318                                 (void)hp_player(caster_ptr, em_ptr->dam);
1319                         }
1320                 }
1321                 else
1322                 {
1323                         if (em_ptr->see_s_msg) msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
1324                 }
1325
1326                 em_ptr->dam = 0;
1327                 break;
1328         }
1329         case GF_MIND_BLAST:
1330         {
1331                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1332                 if (!em_ptr->who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), em_ptr->m_name);
1333
1334                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1335                         (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
1336                         (em_ptr->r_ptr->level > randint1((em_ptr->caster_lev - 10) < 1 ? 1 : (em_ptr->caster_lev - 10)) + 10))
1337                 {
1338                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
1339                         {
1340                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
1341                         }
1342
1343                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1344                         em_ptr->dam = 0;
1345                 }
1346                 else if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
1347                 {
1348                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
1349                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
1350                         em_ptr->dam = 0;
1351                 }
1352                 else if (em_ptr->r_ptr->flags2 & RF2_WEIRD_MIND)
1353                 {
1354                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
1355                         em_ptr->note = _("には耐性がある。", " resists.");
1356                         em_ptr->dam /= 3;
1357                 }
1358                 else
1359                 {
1360                         em_ptr->note = _("は精神攻撃を食らった。", " is blasted by psionic energy.");
1361                         em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
1362
1363                         if (em_ptr->who > 0) em_ptr->do_conf = randint0(4) + 4;
1364                         else em_ptr->do_conf = randint0(8) + 8;
1365                 }
1366
1367                 break;
1368         }
1369         case GF_BRAIN_SMASH:
1370         {
1371                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1372                 if (!em_ptr->who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), em_ptr->m_name);
1373
1374                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1375                         (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
1376                         (em_ptr->r_ptr->level > randint1((em_ptr->caster_lev - 10) < 1 ? 1 : (em_ptr->caster_lev - 10)) + 10))
1377                 {
1378                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
1379                         {
1380                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
1381                         }
1382
1383                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1384                         em_ptr->dam = 0;
1385                 }
1386                 else if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
1387                 {
1388                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
1389                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
1390                         em_ptr->dam = 0;
1391                 }
1392                 else if (em_ptr->r_ptr->flags2 & RF2_WEIRD_MIND)
1393                 {
1394                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
1395                         em_ptr->note = _("には耐性がある!", " resists!");
1396                         em_ptr->dam /= 3;
1397                 }
1398                 else
1399                 {
1400                         em_ptr->note = _("は精神攻撃を食らった。", " is blasted by psionic energy.");
1401                         em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
1402                         if (em_ptr->who > 0)
1403                         {
1404                                 em_ptr->do_conf = randint0(4) + 4;
1405                                 em_ptr->do_stun = randint0(4) + 4;
1406                         }
1407                         else
1408                         {
1409                                 em_ptr->do_conf = randint0(8) + 8;
1410                                 em_ptr->do_stun = randint0(8) + 8;
1411                         }
1412                         (void)set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 10);
1413                 }
1414
1415                 break;
1416         }
1417         case GF_CAUSE_1:
1418         {
1419                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1420                 if (!em_ptr->who) msg_format(_("%sを指差して呪いをかけた。", "You point at %s and curse."), em_ptr->m_name);
1421                 if (randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35))
1422                 {
1423                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1424                         em_ptr->dam = 0;
1425                 }
1426
1427                 break;
1428         }
1429         case GF_CAUSE_2:
1430         {
1431                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1432                 if (!em_ptr->who) msg_format(_("%sを指差して恐ろしげに呪いをかけた。", "You point at %s and curse horribly."), em_ptr->m_name);
1433
1434                 if (randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35))
1435                 {
1436                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1437                         em_ptr->dam = 0;
1438                 }
1439
1440                 break;
1441         }
1442         case GF_CAUSE_3:
1443         {
1444                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1445                 if (!em_ptr->who) msg_format(_("%sを指差し、恐ろしげに呪文を唱えた!", "You point at %s, incanting terribly!"), em_ptr->m_name);
1446
1447                 if (randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35))
1448                 {
1449                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1450                         em_ptr->dam = 0;
1451                 }
1452
1453                 break;
1454         }
1455         case GF_CAUSE_4:
1456         {
1457                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1458                 if (!em_ptr->who)
1459                         msg_format(_("%sの秘孔を突いて、「お前は既に死んでいる」と叫んだ。",
1460                                 "You point at %s, screaming the word, 'DIE!'."), em_ptr->m_name);
1461
1462                 if ((randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35)) && ((em_ptr->who <= 0) || (em_ptr->m_caster_ptr->r_idx != MON_KENSHIROU)))
1463                 {
1464                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1465                         em_ptr->dam = 0;
1466                 }
1467                 break;
1468         }
1469         case GF_HAND_DOOM:
1470         {
1471                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1472                 if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
1473                 {
1474                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1475                         em_ptr->dam = 0;
1476                 }
1477                 else
1478                 {
1479                         if ((em_ptr->who > 0) ? ((em_ptr->caster_lev + randint1(em_ptr->dam)) > (em_ptr->r_ptr->level + 10 + randint1(20))) :
1480                                 (((em_ptr->caster_lev / 2) + randint1(em_ptr->dam)) > (em_ptr->r_ptr->level + randint1(200))))
1481                         {
1482                                 em_ptr->dam = ((40 + randint1(20)) * em_ptr->m_ptr->hp) / 100;
1483
1484                                 if (em_ptr->m_ptr->hp < em_ptr->dam) em_ptr->dam = em_ptr->m_ptr->hp - 1;
1485                         }
1486                         else
1487                         {
1488                                 em_ptr->note = _("は破滅の手に耐え切った!", "resists!");
1489                                 em_ptr->dam = 0;
1490                         }
1491                 }
1492
1493                 break;
1494         }
1495         case GF_CAPTURE:
1496         {
1497                 int nokori_hp;
1498                 if ((floor_ptr->inside_quest && (quest[floor_ptr->inside_quest].type == QUEST_TYPE_KILL_ALL) && !is_pet(em_ptr->m_ptr)) ||
1499                         (em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flags7 & (RF7_NAZGUL)) || (em_ptr->r_ptr->flags7 & (RF7_UNIQUE2)) || (em_ptr->r_ptr->flags1 & RF1_QUESTOR) || em_ptr->m_ptr->parent_m_idx)
1500                 {
1501                         msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
1502                         em_ptr->skipped = TRUE;
1503                         break;
1504                 }
1505
1506                 if (is_pet(em_ptr->m_ptr)) nokori_hp = em_ptr->m_ptr->maxhp * 4L;
1507                 else if ((caster_ptr->pclass == CLASS_BEASTMASTER) && monster_living(em_ptr->m_ptr->r_idx))
1508                         nokori_hp = em_ptr->m_ptr->maxhp * 3 / 10;
1509                 else
1510                         nokori_hp = em_ptr->m_ptr->maxhp * 3 / 20;
1511
1512                 if (em_ptr->m_ptr->hp >= nokori_hp)
1513                 {
1514                         msg_format(_("もっと弱らせないと。", "You need to weaken %s more."), em_ptr->m_name);
1515                         em_ptr->skipped = TRUE;
1516                 }
1517                 else if (em_ptr->m_ptr->hp < randint0(nokori_hp))
1518                 {
1519                         if (em_ptr->m_ptr->mflag2 & MFLAG2_CHAMELEON) choose_new_monster(caster_ptr, em_ptr->g_ptr->m_idx, FALSE, MON_CHAMELEON);
1520                         msg_format(_("%sを捕えた!", "You capture %^s!"), em_ptr->m_name);
1521                         cap_mon = em_ptr->m_ptr->r_idx;
1522                         cap_mspeed = em_ptr->m_ptr->mspeed;
1523                         cap_hp = em_ptr->m_ptr->hp;
1524                         cap_maxhp = em_ptr->m_ptr->max_maxhp;
1525                         cap_nickname = em_ptr->m_ptr->nickname;
1526                         if (em_ptr->g_ptr->m_idx == caster_ptr->riding)
1527                         {
1528                                 if (rakuba(caster_ptr, -1, FALSE))
1529                                 {
1530                                         msg_format(_("地面に落とされた。", "You have fallen from %s."), em_ptr->m_name);
1531                                 }
1532                         }
1533
1534                         delete_monster_idx(caster_ptr, em_ptr->g_ptr->m_idx);
1535
1536                         return GF_SWITCH_TRUE;
1537                 }
1538                 else
1539                 {
1540                         msg_format(_("うまく捕まえられなかった。", "You failed to capture %s."), em_ptr->m_name);
1541                         em_ptr->skipped = TRUE;
1542                 }
1543
1544                 break;
1545         }
1546         case GF_ATTACK:
1547         {
1548                 return (gf_switch_result)py_attack(caster_ptr, em_ptr->y, em_ptr->x, em_ptr->dam);
1549         }
1550         case GF_ENGETSU:
1551         {
1552                 int effect = 0;
1553                 bool done = TRUE;
1554
1555                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1556                 if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
1557                 {
1558                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1559                         em_ptr->dam = 0;
1560                         em_ptr->skipped = TRUE;
1561                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
1562                         break;
1563                 }
1564                 if (MON_CSLEEP(em_ptr->m_ptr))
1565                 {
1566                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1567                         em_ptr->dam = 0;
1568                         em_ptr->skipped = TRUE;
1569                         break;
1570                 }
1571
1572                 if (one_in_(5)) effect = 1;
1573                 else if (one_in_(4)) effect = 2;
1574                 else if (one_in_(3)) effect = 3;
1575                 else done = FALSE;
1576
1577                 if (effect == 1)
1578                 {
1579                         if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1580                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1581                         {
1582                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1583                                 em_ptr->obvious = FALSE;
1584                         }
1585                         else
1586                         {
1587                                 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
1588                                 {
1589                                         em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
1590                                 }
1591                         }
1592                 }
1593                 else if (effect == 2)
1594                 {
1595                         em_ptr->do_stun = damroll((caster_ptr->lev / 10) + 3, (em_ptr->dam)) + 1;
1596                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1597                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1598                         {
1599                                 em_ptr->do_stun = 0;
1600                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1601                                 em_ptr->obvious = FALSE;
1602                         }
1603                 }
1604                 else if (effect == 3)
1605                 {
1606                         if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1607                                 (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) ||
1608                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1609                         {
1610                                 if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
1611                                 {
1612                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
1613                                 }
1614
1615                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1616                                 em_ptr->obvious = FALSE;
1617                         }
1618                         else
1619                         {
1620                                 /* Go to sleep (much) later */
1621                                 em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
1622                                 em_ptr->do_sleep = 500;
1623                         }
1624                 }
1625
1626                 if (!done)
1627                 {
1628                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1629                 }
1630
1631                 em_ptr->dam = 0;
1632                 break;
1633         }
1634         case GF_GENOCIDE:
1635         {
1636                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1637                 if (genocide_aux(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam, !em_ptr->who, (em_ptr->r_ptr->level + 1) / 2, _("モンスター消滅", "Genocide One")))
1638                 {
1639                         if (em_ptr->seen_msg) msg_format(_("%sは消滅した!", "%^s disappeared!"), em_ptr->m_name);
1640                         chg_virtue(caster_ptr, V_VITALITY, -1);
1641                         return GF_SWITCH_TRUE;
1642                 }
1643
1644                 em_ptr->skipped = TRUE;
1645                 break;
1646         }
1647         case GF_PHOTO:
1648         {
1649                 if (!em_ptr->who)
1650                         msg_format(_("%sを写真に撮った。", "You take a photograph of %s."), em_ptr->m_name);
1651
1652                 if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
1653                 {
1654                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1655
1656                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
1657
1658                         em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
1659                         em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
1660                 }
1661                 else
1662                 {
1663                         em_ptr->dam = 0;
1664                 }
1665
1666                 em_ptr->photo = em_ptr->m_ptr->r_idx;
1667                 break;
1668         }
1669         case GF_CRUSADE:
1670         {
1671                 bool success = FALSE;
1672                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1673
1674                 if ((em_ptr->r_ptr->flags3 & (RF3_GOOD)) && !floor_ptr->inside_arena)
1675                 {
1676                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) em_ptr->dam -= 50;
1677                         if (em_ptr->dam < 1) em_ptr->dam = 1;
1678
1679                         if (is_pet(em_ptr->m_ptr))
1680                         {
1681                                 em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
1682                                 (void)set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100);
1683                                 success = TRUE;
1684                         }
1685                         else if ((em_ptr->r_ptr->flags1 & (RF1_QUESTOR)) ||
1686                                 (em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1687                                 (em_ptr->m_ptr->mflag2 & MFLAG2_NOPET) ||
1688                                 (caster_ptr->cursed & TRC_AGGRAVATE) ||
1689                                 ((em_ptr->r_ptr->level + 10) > randint1(em_ptr->dam)))
1690                         {
1691                                 if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1692                         }
1693                         else
1694                         {
1695                                 em_ptr->note = _("を支配した。", " is tamed!");
1696                                 set_pet(caster_ptr, em_ptr->m_ptr);
1697                                 (void)set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100);
1698
1699                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
1700                                 success = TRUE;
1701                         }
1702                 }
1703
1704                 if (!success)
1705                 {
1706                         if (!(em_ptr->r_ptr->flags3 & RF3_NO_FEAR))
1707                         {
1708                                 em_ptr->do_fear = randint1(90) + 10;
1709                         }
1710                         else if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
1711                                 em_ptr->r_ptr->r_flags3 |= (RF3_NO_FEAR);
1712                 }
1713
1714                 em_ptr->dam = 0;
1715                 break;
1716         }
1717         case GF_WOUNDS:
1718         {
1719                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1720
1721                 if (randint0(100 + em_ptr->dam) < (em_ptr->r_ptr->level + 50))
1722                 {
1723                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1724                         em_ptr->dam = 0;
1725                 }
1726                 break;
1727         }
1728         default:
1729         {
1730                 em_ptr->skipped = TRUE;
1731                 em_ptr->dam = 0;
1732                 break;
1733         }
1734         }
1735
1736         return GF_SWITCH_CONTINUE;
1737 }