OSDN Git Service

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