OSDN Git Service

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