OSDN Git Service

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