OSDN Git Service

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