OSDN Git Service

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