OSDN Git Service

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