OSDN Git Service

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