OSDN Git Service

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