OSDN Git Service

[Refactor] #39963 Moved effect_monster_crusade() from effect-monster-switcher.c to...
[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 "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_wounds(effect_monster_type *em_ptr)
358 {
359         if (em_ptr->seen) em_ptr->obvious = TRUE;
360
361         if (randint0(100 + em_ptr->dam) < (em_ptr->r_ptr->level + 50))
362         {
363                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
364                 em_ptr->dam = 0;
365         }
366
367         return GF_SWITCH_CONTINUE;
368 }
369
370
371 /*!
372  * @brief 魔法の効果によって様々なメッセーを出力したり与えるダメージの増減を行ったりする
373  * @param em_ptr モンスター効果構造体への参照ポインタ
374  * @return ここのスイッチングで終るならTRUEかFALSE、後続処理を実行するならCONTINUE
375  */
376 gf_switch_result switch_effects_monster(player_type *caster_ptr, effect_monster_type *em_ptr)
377 {
378         switch (em_ptr->effect_type)
379         {
380         case GF_PSY_SPEAR:
381         case GF_MISSILE:
382         case GF_ARROW:
383         case GF_MANA:
384         case GF_METEOR:
385         case GF_BLOOD_CURSE:
386         case GF_SEEKER:
387         case GF_SUPER_RAY:
388                 return effect_monster_void(em_ptr);
389         case GF_ACID:
390                 return effect_monster_acid(caster_ptr, em_ptr);
391         case GF_ELEC:
392                 return effect_monster_elec(caster_ptr, em_ptr);
393         case GF_FIRE:
394                 return effect_monster_fire(caster_ptr, em_ptr);
395         case GF_COLD:
396                 return effect_monster_cold(caster_ptr, em_ptr);
397         case GF_POIS:
398                 return effect_monster_pois(caster_ptr, em_ptr);
399         case GF_NUKE:
400                 return effect_monster_nuke(caster_ptr, em_ptr);
401         case GF_HELL_FIRE:
402                 return effect_monster_hell_fire(caster_ptr, em_ptr);
403         case GF_HOLY_FIRE:
404                 return effect_monster_holy_fire(caster_ptr, em_ptr);
405         case GF_PLASMA:
406                 return effect_monster_plasma(caster_ptr, em_ptr);
407         case GF_NETHER:
408                 return effect_monster_nether(caster_ptr, em_ptr);
409         case GF_WATER:
410                 return effect_monster_water(caster_ptr, em_ptr);
411         case GF_CHAOS:
412                 return effect_monster_chaos(caster_ptr, em_ptr);
413         case GF_SHARDS:
414                 return effect_monster_shards(caster_ptr, em_ptr);
415         case GF_ROCKET:
416                 return effect_monster_rocket(caster_ptr, em_ptr);
417         case GF_SOUND:
418                 return effect_monster_sound(caster_ptr, em_ptr);
419         case GF_CONFUSION:
420                 return effect_monster_confusion(caster_ptr, em_ptr);
421         case GF_DISENCHANT:
422                 return effect_monster_disenchant(caster_ptr, em_ptr);
423         case GF_NEXUS:
424                 return effect_monster_nexus(caster_ptr, em_ptr);
425         case GF_FORCE:
426                 return effect_monster_force(caster_ptr, em_ptr);
427         case GF_INERTIAL:
428                 return effect_monster_inertial(caster_ptr, em_ptr);
429         case GF_TIME:
430                 return effect_monster_time(caster_ptr, em_ptr);
431         case GF_GRAVITY:
432                 return effect_monster_gravity(caster_ptr, em_ptr);
433         case GF_DISINTEGRATE:
434                 return effect_monster_disintegration(caster_ptr, em_ptr);
435         case GF_PSI:
436                 return effect_monster_psi(caster_ptr, em_ptr);
437         case GF_PSI_DRAIN:
438                 return effect_monster_psi_drain(caster_ptr, em_ptr);
439         case GF_TELEKINESIS:
440                 return effect_monster_telekinesis(caster_ptr, em_ptr);
441         case GF_DOMINATION:
442                 return effect_monster_domination(caster_ptr, em_ptr);
443         case GF_ICE:
444                 return effect_monster_icee_bolt(caster_ptr, em_ptr);
445         case GF_HYPODYNAMIA:
446                 return effect_monster_hypodynamia(caster_ptr, em_ptr);
447         case GF_DEATH_RAY:
448                 return effect_monster_death_ray(caster_ptr, em_ptr);
449         case GF_OLD_POLY:
450                 return effect_monster_old_poly(em_ptr);
451         case GF_OLD_CLONE:
452                 return effect_monster_old_clone(caster_ptr, em_ptr);
453         case GF_STAR_HEAL:
454                 if (effect_monster_old_clone(caster_ptr, em_ptr) == GF_SWITCH_TRUE)
455                         return GF_SWITCH_CONTINUE;
456         /* Fall through */
457         case GF_OLD_HEAL:
458                 return effect_monster_old_heal(caster_ptr, em_ptr);
459         case GF_OLD_SPEED:
460                 return effect_monster_old_speed(caster_ptr, em_ptr);
461         case GF_OLD_SLOW:
462                 return effect_monster_old_slow(caster_ptr, em_ptr);
463         case GF_OLD_SLEEP:
464                 return effect_monster_old_sleep(caster_ptr, em_ptr);
465         case GF_STASIS_EVIL:
466                 return effect_monster_stasis(em_ptr, TRUE);
467         case GF_STASIS:
468                 return effect_monster_stasis(em_ptr, FALSE);
469         case GF_CHARM:
470                 return effect_monster_charm(caster_ptr, em_ptr);
471         case GF_CONTROL_UNDEAD:
472                 return effect_monster_control_undead(caster_ptr, em_ptr);
473         case GF_CONTROL_DEMON:
474                 return effect_monster_control_demon(caster_ptr, em_ptr);
475         case GF_CONTROL_ANIMAL:
476                 return effect_monster_control_animal(caster_ptr, em_ptr);
477         case GF_CHARM_LIVING:
478                 return effect_monster_charm_living(caster_ptr, em_ptr);
479         case GF_OLD_CONF:
480                 return effect_monster_old_conf(caster_ptr, em_ptr);
481         case GF_STUN:
482                 return effect_monster_stun(em_ptr);
483         case GF_LITE_WEAK:
484                 return effect_monster_lite_weak(caster_ptr, em_ptr);
485         case GF_LITE:
486                 return effect_monster_lite(caster_ptr, em_ptr);
487         case GF_DARK:
488                 return effect_monster_dark(caster_ptr, em_ptr);
489         case GF_KILL_WALL:
490                 return effect_monster_kill_wall(caster_ptr, em_ptr);
491         case GF_AWAY_UNDEAD:
492                 return effect_monster_away_undead(caster_ptr, em_ptr);
493         case GF_AWAY_EVIL:
494                 return effect_monster_away_evil(caster_ptr, em_ptr);
495         case GF_AWAY_ALL:
496                 return effect_monster_away_all(caster_ptr, em_ptr);
497         case GF_TURN_UNDEAD:
498                 return effect_monster_turn_undead(caster_ptr, em_ptr);
499         case GF_TURN_EVIL:
500                 return effect_monster_turn_evil(caster_ptr, em_ptr);
501         case GF_TURN_ALL:
502                 return effect_monster_turn_all(em_ptr);
503         case GF_DISP_UNDEAD:
504                 return effect_monster_disp_undead(caster_ptr, em_ptr);
505         case GF_DISP_EVIL:
506                 return effect_monster_disp_evil(caster_ptr, em_ptr);
507         case GF_DISP_GOOD:
508                 return effect_monster_disp_good(caster_ptr, em_ptr);
509         case GF_DISP_LIVING:
510                 return effect_monster_disp_living(em_ptr);
511         case GF_DISP_DEMON:
512                 return effect_monster_disp_demon(caster_ptr, em_ptr);
513         case GF_DISP_ALL:
514                 return effect_monster_disp_all(em_ptr);
515         case GF_DRAIN_MANA:
516                 return effect_monster_drain_mana(caster_ptr, em_ptr);
517         case GF_MIND_BLAST:
518                 return effect_monster_mind_blast(caster_ptr, em_ptr);
519         case GF_BRAIN_SMASH:
520                 return effect_monster_brain_smash(caster_ptr, em_ptr);
521         case GF_CAUSE_1:
522                 return effect_monster_curse_1(em_ptr);
523         case GF_CAUSE_2:
524                 return effect_monster_curse_2(em_ptr);
525         case GF_CAUSE_3:
526                 return effect_monster_curse_3(em_ptr);
527         case GF_CAUSE_4:
528                 return effect_monster_curse_4(em_ptr);
529         case GF_HAND_DOOM:
530                 return effect_monster_hand_doom(em_ptr);
531         case GF_CAPTURE:
532                 return effect_monster_capture(caster_ptr, em_ptr);
533         case GF_ATTACK:
534                 return (gf_switch_result)py_attack(caster_ptr, em_ptr->y, em_ptr->x, em_ptr->dam);
535         case GF_ENGETSU:
536                 return effect_monster_engetsu(caster_ptr, em_ptr);
537         case GF_GENOCIDE:
538                 return effect_monster_genocide(caster_ptr, em_ptr);
539         case GF_PHOTO:
540                 return effect_monster_photo(caster_ptr, em_ptr);
541         case GF_CRUSADE:
542                 return effect_monster_crusade(caster_ptr, em_ptr);
543         case GF_WOUNDS:
544                 return effect_monster_wounds(em_ptr);
545         default:
546         {
547                 em_ptr->skipped = TRUE;
548                 em_ptr->dam = 0;
549                 return GF_SWITCH_CONTINUE;
550         }
551         }
552 }