OSDN Git Service

[Refactor] #39963 Separated effecr-monster-curse.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 "avatar.h"
12 #include "quest.h"
13 #include "monster-status.h"
14 #include "effect/spells-effect-util.h"
15 #include "player-effects.h"
16 #include "monsterrace-hook.h"
17 #include "combat/melee.h"
18 #include "cmd/cmd-pet.h" // 暫定、後で消すかも.
19 #include "spell/spells-type.h"
20 #include "effect/effect-monster-resist-hurt.h"
21 #include "effect/effect-monster-psi.h"
22 #include "effect/effect-monster-domination.h"
23 #include "effect/effect-monster-oldies.h"
24 #include "effect/effect-monster-charm.h"
25 #include "effect/effect-monster-lite-dark.h"
26 #include "effect/effect-monster-evil.h"
27 #include "effect/effect-monster-spirit.h"
28 #include "effect/effect-monster-curse.h"
29
30 gf_switch_result effect_monster_hypodynamia(player_type *caster_ptr, effect_monster_type *em_ptr)
31 {
32         if (em_ptr->seen) em_ptr->obvious = TRUE;
33         if (monster_living(em_ptr->m_ptr->r_idx))
34         {
35                 em_ptr->do_time = (em_ptr->dam + 7) / 8;
36                 return GF_SWITCH_CONTINUE;
37         }
38
39         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
40         {
41                 if (em_ptr->r_ptr->flags3 & RF3_DEMON) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
42                 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
43                 if (em_ptr->r_ptr->flags3 & RF3_NONLIVING) em_ptr->r_ptr->r_flags3 |= (RF3_NONLIVING);
44         }
45
46         em_ptr->note = _("には効果がなかった。", " is unaffected.");
47         em_ptr->obvious = FALSE;
48         em_ptr->dam = 0;
49         return GF_SWITCH_CONTINUE;
50 }
51
52
53 // todo リファクタリング前のコード時点で、単に耐性があるだけでもダメージ0だった.
54 gf_switch_result effect_monster_death_ray(player_type *caster_ptr, effect_monster_type *em_ptr)
55 {
56         if (em_ptr->seen) em_ptr->obvious = TRUE;
57
58         if (!monster_living(em_ptr->m_ptr->r_idx))
59         {
60                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
61                 {
62                         if (em_ptr->r_ptr->flags3 & RF3_DEMON) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
63                         if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
64                         if (em_ptr->r_ptr->flags3 & RF3_NONLIVING) em_ptr->r_ptr->r_flags3 |= (RF3_NONLIVING);
65                 }
66
67                 em_ptr->note = _("には完全な耐性がある!", " is immune.");
68                 em_ptr->obvious = FALSE;
69                 em_ptr->dam = 0;
70                 return GF_SWITCH_CONTINUE;
71         }
72
73         if (((em_ptr->r_ptr->flags1 & RF1_UNIQUE) &&
74                 (randint1(888) != 666)) ||
75                 (((em_ptr->r_ptr->level + randint1(20)) > randint1((em_ptr->caster_lev / 2) + randint1(10))) &&
76                         randint1(100) != 66))
77         {
78                 em_ptr->note = _("には耐性がある!", " resists!");
79                 em_ptr->obvious = FALSE;
80                 em_ptr->dam = 0;
81         }
82
83         return GF_SWITCH_CONTINUE;
84 }
85
86
87 gf_switch_result effect_monster_stasis(effect_monster_type *em_ptr, bool to_evil)
88 {
89         if (em_ptr->seen) em_ptr->obvious = TRUE;
90
91         int stasis_damage = (em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10);
92         bool has_resistance = (em_ptr->r_ptr->flags1 & RF1_UNIQUE) != 0;
93         has_resistance |= em_ptr->r_ptr->level > randint1(stasis_damage) + 10;
94         if (to_evil) has_resistance |= (em_ptr->r_ptr->flags3 & RF3_EVIL) == 0;
95
96         if (has_resistance)
97         {
98                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
99                 em_ptr->obvious = FALSE;
100         }
101         else
102         {
103                 em_ptr->note = _("は動けなくなった!", " is suspended!");
104                 em_ptr->do_sleep = 500;
105         }
106
107         em_ptr->dam = 0;
108         return GF_SWITCH_CONTINUE;
109 }
110
111
112 gf_switch_result effect_monster_stun(effect_monster_type *em_ptr)
113 {
114         if (em_ptr->seen) em_ptr->obvious = TRUE;
115
116         em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
117         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
118                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
119         {
120                 em_ptr->do_stun = 0;
121                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
122                 em_ptr->obvious = FALSE;
123         }
124
125         em_ptr->dam = 0;
126         return GF_SWITCH_CONTINUE;
127 }
128
129
130 gf_switch_result effect_monster_kill_wall(player_type *caster_ptr, effect_monster_type *em_ptr)
131 {
132         if ((em_ptr->r_ptr->flags3 & (RF3_HURT_ROCK)) == 0)
133         {
134                 em_ptr->dam = 0;
135                 return GF_SWITCH_CONTINUE;
136         }
137
138         if (em_ptr->seen) em_ptr->obvious = TRUE;
139
140         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
141
142         em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
143         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
144         return GF_SWITCH_CONTINUE;
145 }
146
147
148 gf_switch_result effect_monster_hand_doom(effect_monster_type *em_ptr)
149 {
150         if (em_ptr->seen) em_ptr->obvious = TRUE;
151
152         if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
153         {
154                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
155                 em_ptr->dam = 0;
156                 return GF_SWITCH_CONTINUE;
157         }
158
159         if ((em_ptr->who > 0) ? ((em_ptr->caster_lev + randint1(em_ptr->dam)) > (em_ptr->r_ptr->level + 10 + randint1(20))) :
160                 (((em_ptr->caster_lev / 2) + randint1(em_ptr->dam)) > (em_ptr->r_ptr->level + randint1(200))))
161         {
162                 em_ptr->dam = ((40 + randint1(20)) * em_ptr->m_ptr->hp) / 100;
163                 if (em_ptr->m_ptr->hp < em_ptr->dam)
164                         em_ptr->dam = em_ptr->m_ptr->hp - 1;
165         }
166         else
167         {
168                 em_ptr->note = _("は破滅の手に耐え切った!", "resists!");
169                 em_ptr->dam = 0;
170         }
171
172         return GF_SWITCH_CONTINUE;
173 }
174
175
176 static bool effect_monster_check_capturability(player_type *caster_ptr, effect_monster_type *em_ptr, int capturable_hp)
177 {
178         if (em_ptr->m_ptr->hp >= randint0(capturable_hp)) return FALSE;
179
180         if (em_ptr->m_ptr->mflag2 & MFLAG2_CHAMELEON)
181                 choose_new_monster(caster_ptr, em_ptr->g_ptr->m_idx, FALSE, MON_CHAMELEON);
182
183         msg_format(_("%sを捕えた!", "You capture %^s!"), em_ptr->m_name);
184         cap_mon = em_ptr->m_ptr->r_idx;
185         cap_mspeed = em_ptr->m_ptr->mspeed;
186         cap_hp = em_ptr->m_ptr->hp;
187         cap_maxhp = em_ptr->m_ptr->max_maxhp;
188         cap_nickname = em_ptr->m_ptr->nickname;
189         if ((em_ptr->g_ptr->m_idx == caster_ptr->riding) && rakuba(caster_ptr, -1, FALSE))
190                 msg_format(_("地面に落とされた。", "You have fallen from %s."), em_ptr->m_name);
191
192         delete_monster_idx(caster_ptr, em_ptr->g_ptr->m_idx);
193         return TRUE;
194 }
195
196
197 gf_switch_result effect_monster_capture(player_type *caster_ptr, effect_monster_type *em_ptr)
198 {
199         floor_type *floor_ptr = caster_ptr->current_floor_ptr;
200         int capturable_hp;
201         if ((floor_ptr->inside_quest && (quest[floor_ptr->inside_quest].type == QUEST_TYPE_KILL_ALL) && !is_pet(em_ptr->m_ptr)) ||
202                 (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)
203         {
204                 msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
205                 em_ptr->skipped = TRUE;
206                 return GF_SWITCH_CONTINUE;
207         }
208
209         if (is_pet(em_ptr->m_ptr)) capturable_hp = em_ptr->m_ptr->maxhp * 4L;
210         else if ((caster_ptr->pclass == CLASS_BEASTMASTER) && monster_living(em_ptr->m_ptr->r_idx))
211                 capturable_hp = em_ptr->m_ptr->maxhp * 3 / 10;
212         else
213                 capturable_hp = em_ptr->m_ptr->maxhp * 3 / 20;
214
215         if (em_ptr->m_ptr->hp >= capturable_hp)
216         {
217                 msg_format(_("もっと弱らせないと。", "You need to weaken %s more."), em_ptr->m_name);
218                 em_ptr->skipped = TRUE;
219                 return GF_SWITCH_CONTINUE;
220         }
221         
222         if (effect_monster_check_capturability(caster_ptr, em_ptr, capturable_hp))
223                 return GF_SWITCH_TRUE;
224
225         msg_format(_("うまく捕まえられなかった。", "You failed to capture %s."), em_ptr->m_name);
226         em_ptr->skipped = TRUE;
227         return GF_SWITCH_CONTINUE;
228 }
229
230
231 gf_switch_result effect_monster_engetsu(player_type *caster_ptr, effect_monster_type *em_ptr)
232 {
233         int effect = 0;
234         bool done = TRUE;
235
236         if (em_ptr->seen) em_ptr->obvious = TRUE;
237         if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
238         {
239                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
240                 em_ptr->dam = 0;
241                 em_ptr->skipped = TRUE;
242                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
243                 return GF_SWITCH_CONTINUE;
244         }
245
246         if (MON_CSLEEP(em_ptr->m_ptr))
247         {
248                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
249                 em_ptr->dam = 0;
250                 em_ptr->skipped = TRUE;
251                 return GF_SWITCH_CONTINUE;
252         }
253
254         if (one_in_(5)) effect = 1;
255         else if (one_in_(4)) effect = 2;
256         else if (one_in_(3)) effect = 3;
257         else done = FALSE;
258
259         if (effect == 1)
260         {
261                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
262                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
263                 {
264                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
265                         em_ptr->obvious = FALSE;
266                 }
267                 else
268                 {
269                         if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
270                         {
271                                 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
272                         }
273                 }
274         }
275         else if (effect == 2)
276         {
277                 em_ptr->do_stun = damroll((caster_ptr->lev / 10) + 3, (em_ptr->dam)) + 1;
278                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
279                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
280                 {
281                         em_ptr->do_stun = 0;
282                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
283                         em_ptr->obvious = FALSE;
284                 }
285         }
286         else if (effect == 3)
287         {
288                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
289                         (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) ||
290                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
291                 {
292                         if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
293                         {
294                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
295                         }
296
297                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
298                         em_ptr->obvious = FALSE;
299                 }
300                 else
301                 {
302                         /* Go to sleep (much) later */
303                         em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
304                         em_ptr->do_sleep = 500;
305                 }
306         }
307
308         if (!done)
309         {
310                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
311         }
312
313         em_ptr->dam = 0;
314         return GF_SWITCH_CONTINUE;
315 }
316
317
318 gf_switch_result effect_monster_genocide(player_type *caster_ptr, effect_monster_type *em_ptr)
319 {
320         if (em_ptr->seen) em_ptr->obvious = TRUE;
321         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")))
322         {
323                 if (em_ptr->seen_msg) msg_format(_("%sは消滅した!", "%^s disappeared!"), em_ptr->m_name);
324                 chg_virtue(caster_ptr, V_VITALITY, -1);
325                 return GF_SWITCH_TRUE;
326         }
327
328         em_ptr->skipped = TRUE;
329         return GF_SWITCH_CONTINUE;
330 }
331
332
333 gf_switch_result effect_monster_photo(player_type *caster_ptr, effect_monster_type *em_ptr)
334 {
335         if (!em_ptr->who)
336                 msg_format(_("%sを写真に撮った。", "You take a photograph of %s."), em_ptr->m_name);
337
338         if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
339         {
340                 if (em_ptr->seen) em_ptr->obvious = TRUE;
341
342                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
343
344                 em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
345                 em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
346         }
347         else
348         {
349                 em_ptr->dam = 0;
350         }
351
352         em_ptr->photo = em_ptr->m_ptr->r_idx;
353         return GF_SWITCH_CONTINUE;
354 }
355
356
357 gf_switch_result effect_monster_crusade(player_type *caster_ptr, effect_monster_type *em_ptr)
358 {
359         bool success = FALSE;
360         if (em_ptr->seen) em_ptr->obvious = TRUE;
361
362         if ((em_ptr->r_ptr->flags3 & (RF3_GOOD)) && !caster_ptr->current_floor_ptr->inside_arena)
363         {
364                 if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) em_ptr->dam -= 50;
365                 if (em_ptr->dam < 1) em_ptr->dam = 1;
366
367                 if (is_pet(em_ptr->m_ptr))
368                 {
369                         em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
370                         (void)set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100);
371                         success = TRUE;
372                 }
373                 else if ((em_ptr->r_ptr->flags1 & (RF1_QUESTOR)) ||
374                         (em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
375                         (em_ptr->m_ptr->mflag2 & MFLAG2_NOPET) ||
376                         (caster_ptr->cursed & TRC_AGGRAVATE) ||
377                         ((em_ptr->r_ptr->level + 10) > randint1(em_ptr->dam)))
378                 {
379                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
380                 }
381                 else
382                 {
383                         em_ptr->note = _("を支配した。", " is tamed!");
384                         set_pet(caster_ptr, em_ptr->m_ptr);
385                         (void)set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100);
386
387                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
388                         success = TRUE;
389                 }
390         }
391
392         if (!success)
393         {
394                 if (!(em_ptr->r_ptr->flags3 & RF3_NO_FEAR))
395                 {
396                         em_ptr->do_fear = randint1(90) + 10;
397                 }
398                 else if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
399                         em_ptr->r_ptr->r_flags3 |= (RF3_NO_FEAR);
400         }
401
402         em_ptr->dam = 0;
403         return GF_SWITCH_CONTINUE;
404 }
405
406
407 gf_switch_result effect_monster_wounds(effect_monster_type *em_ptr)
408 {
409         if (em_ptr->seen) em_ptr->obvious = TRUE;
410
411         if (randint0(100 + em_ptr->dam) < (em_ptr->r_ptr->level + 50))
412         {
413                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
414                 em_ptr->dam = 0;
415         }
416
417         return GF_SWITCH_CONTINUE;
418 }
419
420
421 /*!
422  * @brief 魔法の効果によって様々なメッセーを出力したり与えるダメージの増減を行ったりする
423  * @param em_ptr モンスター効果構造体への参照ポインタ
424  * @return ここのスイッチングで終るならTRUEかFALSE、後続処理を実行するならCONTINUE
425  */
426 gf_switch_result switch_effects_monster(player_type *caster_ptr, effect_monster_type *em_ptr)
427 {
428         switch (em_ptr->effect_type)
429         {
430         case GF_PSY_SPEAR:
431         case GF_MISSILE:
432         case GF_ARROW:
433         case GF_MANA:
434         case GF_METEOR:
435         case GF_BLOOD_CURSE:
436         case GF_SEEKER:
437         case GF_SUPER_RAY:
438                 return effect_monster_void(em_ptr);
439         case GF_ACID:
440                 return effect_monster_acid(caster_ptr, em_ptr);
441         case GF_ELEC:
442                 return effect_monster_elec(caster_ptr, em_ptr);
443         case GF_FIRE:
444                 return effect_monster_fire(caster_ptr, em_ptr);
445         case GF_COLD:
446                 return effect_monster_cold(caster_ptr, em_ptr);
447         case GF_POIS:
448                 return effect_monster_pois(caster_ptr, em_ptr);
449         case GF_NUKE:
450                 return effect_monster_nuke(caster_ptr, em_ptr);
451         case GF_HELL_FIRE:
452                 return effect_monster_hell_fire(caster_ptr, em_ptr);
453         case GF_HOLY_FIRE:
454                 return effect_monster_holy_fire(caster_ptr, em_ptr);
455         case GF_PLASMA:
456                 return effect_monster_plasma(caster_ptr, em_ptr);
457         case GF_NETHER:
458                 return effect_monster_nether(caster_ptr, em_ptr);
459         case GF_WATER:
460                 return effect_monster_water(caster_ptr, em_ptr);
461         case GF_CHAOS:
462                 return effect_monster_chaos(caster_ptr, em_ptr);
463         case GF_SHARDS:
464                 return effect_monster_shards(caster_ptr, em_ptr);
465         case GF_ROCKET:
466                 return effect_monster_rocket(caster_ptr, em_ptr);
467         case GF_SOUND:
468                 return effect_monster_sound(caster_ptr, em_ptr);
469         case GF_CONFUSION:
470                 return effect_monster_confusion(caster_ptr, em_ptr);
471         case GF_DISENCHANT:
472                 return effect_monster_disenchant(caster_ptr, em_ptr);
473         case GF_NEXUS:
474                 return effect_monster_nexus(caster_ptr, em_ptr);
475         case GF_FORCE:
476                 return effect_monster_force(caster_ptr, em_ptr);
477         case GF_INERTIAL:
478                 return effect_monster_inertial(caster_ptr, em_ptr);
479         case GF_TIME:
480                 return effect_monster_time(caster_ptr, em_ptr);
481         case GF_GRAVITY:
482                 return effect_monster_gravity(caster_ptr, em_ptr);
483         case GF_DISINTEGRATE:
484                 return effect_monster_disintegration(caster_ptr, em_ptr);
485         case GF_PSI:
486                 return effect_monster_psi(caster_ptr, em_ptr);
487         case GF_PSI_DRAIN:
488                 return effect_monster_psi_drain(caster_ptr, em_ptr);
489         case GF_TELEKINESIS:
490                 return effect_monster_telekinesis(caster_ptr, em_ptr);
491         case GF_DOMINATION:
492                 return effect_monster_domination(caster_ptr, em_ptr);
493         case GF_ICE:
494                 return effect_monster_icee_bolt(caster_ptr, em_ptr);
495         case GF_HYPODYNAMIA:
496                 return effect_monster_hypodynamia(caster_ptr, em_ptr);
497         case GF_DEATH_RAY:
498                 return effect_monster_death_ray(caster_ptr, em_ptr);
499         case GF_OLD_POLY:
500                 return effect_monster_old_poly(em_ptr);
501         case GF_OLD_CLONE:
502                 return effect_monster_old_clone(caster_ptr, em_ptr);
503         case GF_STAR_HEAL:
504                 if (effect_monster_old_clone(caster_ptr, em_ptr) == GF_SWITCH_TRUE)
505                         return GF_SWITCH_CONTINUE;
506         /* Fall through */
507         case GF_OLD_HEAL:
508                 return effect_monster_old_heal(caster_ptr, em_ptr);
509         case GF_OLD_SPEED:
510                 return effect_monster_old_speed(caster_ptr, em_ptr);
511         case GF_OLD_SLOW:
512                 return effect_monster_old_slow(caster_ptr, em_ptr);
513         case GF_OLD_SLEEP:
514                 return effect_monster_old_sleep(caster_ptr, em_ptr);
515         case GF_STASIS_EVIL:
516                 return effect_monster_stasis(em_ptr, TRUE);
517         case GF_STASIS:
518                 return effect_monster_stasis(em_ptr, FALSE);
519         case GF_CHARM:
520                 return effect_monster_charm(caster_ptr, em_ptr);
521         case GF_CONTROL_UNDEAD:
522                 return effect_monster_control_undead(caster_ptr, em_ptr);
523         case GF_CONTROL_DEMON:
524                 return effect_monster_control_demon(caster_ptr, em_ptr);
525         case GF_CONTROL_ANIMAL:
526                 return effect_monster_control_animal(caster_ptr, em_ptr);
527         case GF_CHARM_LIVING:
528                 return effect_monster_charm_living(caster_ptr, em_ptr);
529         case GF_OLD_CONF:
530                 return effect_monster_old_conf(caster_ptr, em_ptr);
531         case GF_STUN:
532                 return effect_monster_stun(em_ptr);
533         case GF_LITE_WEAK:
534                 return effect_monster_lite_weak(caster_ptr, em_ptr);
535         case GF_LITE:
536                 return effect_monster_lite(caster_ptr, em_ptr);
537         case GF_DARK:
538                 return effect_monster_dark(caster_ptr, em_ptr);
539         case GF_KILL_WALL:
540                 return effect_monster_kill_wall(caster_ptr, em_ptr);
541         case GF_AWAY_UNDEAD:
542                 return effect_monster_away_undead(caster_ptr, em_ptr);
543         case GF_AWAY_EVIL:
544                 return effect_monster_away_evil(caster_ptr, em_ptr);
545         case GF_AWAY_ALL:
546                 return effect_monster_away_all(caster_ptr, em_ptr);
547         case GF_TURN_UNDEAD:
548                 return effect_monster_turn_undead(caster_ptr, em_ptr);
549         case GF_TURN_EVIL:
550                 return effect_monster_turn_evil(caster_ptr, em_ptr);
551         case GF_TURN_ALL:
552                 return effect_monster_turn_all(em_ptr);
553         case GF_DISP_UNDEAD:
554                 return effect_monster_disp_undead(caster_ptr, em_ptr);
555         case GF_DISP_EVIL:
556                 return effect_monster_disp_evil(caster_ptr, em_ptr);
557         case GF_DISP_GOOD:
558                 return effect_monster_disp_good(caster_ptr, em_ptr);
559         case GF_DISP_LIVING:
560                 return effect_monster_disp_living(em_ptr);
561         case GF_DISP_DEMON:
562                 return effect_monster_disp_demon(caster_ptr, em_ptr);
563         case GF_DISP_ALL:
564                 return effect_monster_disp_all(em_ptr);
565         case GF_DRAIN_MANA:
566                 return effect_monster_drain_mana(caster_ptr, em_ptr);
567         case GF_MIND_BLAST:
568                 return effect_monster_mind_blast(caster_ptr, em_ptr);
569         case GF_BRAIN_SMASH:
570                 return effect_monster_brain_smash(caster_ptr, em_ptr);
571         case GF_CAUSE_1:
572                 return effect_monster_curse_1(em_ptr);
573         case GF_CAUSE_2:
574                 return effect_monster_curse_2(em_ptr);
575         case GF_CAUSE_3:
576                 return effect_monster_curse_3(em_ptr);
577         case GF_CAUSE_4:
578                 return effect_monster_curse_4(em_ptr);
579         case GF_HAND_DOOM:
580                 return effect_monster_hand_doom(em_ptr);
581         case GF_CAPTURE:
582                 return effect_monster_capture(caster_ptr, em_ptr);
583         case GF_ATTACK:
584                 return (gf_switch_result)py_attack(caster_ptr, em_ptr->y, em_ptr->x, em_ptr->dam);
585         case GF_ENGETSU:
586                 return effect_monster_engetsu(caster_ptr, em_ptr);
587         case GF_GENOCIDE:
588                 return effect_monster_genocide(caster_ptr, em_ptr);
589         case GF_PHOTO:
590                 return effect_monster_photo(caster_ptr, em_ptr);
591         case GF_CRUSADE:
592                 return effect_monster_crusade(caster_ptr, em_ptr);
593         case GF_WOUNDS:
594                 return effect_monster_wounds(em_ptr);
595         default:
596         {
597                 em_ptr->skipped = TRUE;
598                 em_ptr->dam = 0;
599                 return GF_SWITCH_CONTINUE;
600         }
601         }
602 }