OSDN Git Service

[Refactor] #39963 Separated process_spell_result_riding() from affect_monster()
[hengband/hengband.git] / src / effect / effect-monster.c
1 /*!
2  * todo 単体で2400行近い。要分割
3  * @brief 魔法によるモンスターへの効果まとめ
4  * @date 2020/04/29
5  * @author Hourier
6  */
7
8 #include "angband.h"
9 #include "effect/effect-monster.h"
10 #include "spells-effect-util.h"
11 #include "player-damage.h"
12 #include "world.h"
13 #include "avatar.h"
14 #include "monster-spell.h"
15 #include "quest.h"
16 #include "io/write-diary.h"
17 #include "main/sound-definitions-table.h"
18 #include "player-move.h"
19 #include "monster-status.h"
20 #include "player-effects.h"
21 #include "spells-diceroll.h"
22 #include "monsterrace-hook.h"
23 #include "cmd/cmd-pet.h" // 暫定、後で消すかも.
24 #include "combat/melee.h"
25 #include "core.h" // 暫定、後で消す.
26 #include "effect/effect-monster-util.h"
27
28 typedef enum
29 {
30         GF_SWITCH_FALSE = 0,
31         GF_SWITCH_TRUE = 1,
32         GF_SWITCH_CONTINUE = 2,
33 } gf_switch_result;
34
35 /*!
36  * @brief ビーム/ボルト/ボール系魔法によるモンスターへの効果があるかないかを判定する
37  * @param caster_ptr プレーヤーへの参照ポインタ
38  * @param em_ptr モンスター効果構造体への参照ポインタ
39  * @return 効果が何もないならFALSE、何かあるならTRUE
40  */
41 static bool is_never_effect(player_type *caster_ptr, effect_monster_type *em_ptr)
42 {
43         if (!em_ptr->g_ptr->m_idx) return FALSE;
44         if (em_ptr->who && (em_ptr->g_ptr->m_idx == em_ptr->who)) return FALSE;
45         if ((em_ptr->g_ptr->m_idx == caster_ptr->riding) &&
46                 !em_ptr->who &&
47                 !(em_ptr->effect_type == GF_OLD_HEAL) &&
48                 !(em_ptr->effect_type == GF_OLD_SPEED) &&
49                 !(em_ptr->effect_type == GF_STAR_HEAL))
50                 return FALSE;
51         if (sukekaku && ((em_ptr->m_ptr->r_idx == MON_SUKE) || (em_ptr->m_ptr->r_idx == MON_KAKU))) return FALSE;
52         if (em_ptr->m_ptr->hp < 0) return FALSE;
53
54         return TRUE;
55 }
56
57
58 /*!
59  * todo いずれ分離するが、時期尚早
60  * @brief 魔法の効果によって様々なメッセーを出力したり与えるダメージの増減を行ったりする
61  * @param em_ptr モンスター効果構造体への参照ポインタ
62  * @return ここのスイッチングで終るならTRUEかFALSE、後続処理を実行するならCONTINUE
63  */
64 static gf_switch_result switch_effects_monster(player_type *caster_ptr, effect_monster_type *em_ptr)
65 {
66         floor_type *floor_ptr = caster_ptr->current_floor_ptr;
67         switch (em_ptr->effect_type)
68         {
69         case GF_MISSILE:
70         {
71                 if (em_ptr->seen) em_ptr->obvious = TRUE;
72                 break;
73         }
74         case GF_ACID:
75         {
76                 if (em_ptr->seen) em_ptr->obvious = TRUE;
77                 if (em_ptr->r_ptr->flagsr & RFR_IM_ACID)
78                 {
79                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
80                         em_ptr->dam /= 9;
81                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_ACID);
82                 }
83                 break;
84         }
85         case GF_ELEC:
86         {
87                 if (em_ptr->seen) em_ptr->obvious = TRUE;
88                 if (em_ptr->r_ptr->flagsr & RFR_IM_ELEC)
89                 {
90                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
91                         em_ptr->dam /= 9;
92                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_ELEC);
93                 }
94                 break;
95         }
96         case GF_FIRE:
97         {
98                 if (em_ptr->seen) em_ptr->obvious = TRUE;
99                 if (em_ptr->r_ptr->flagsr & RFR_IM_FIRE)
100                 {
101                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
102                         em_ptr->dam /= 9;
103                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_FIRE);
104                 }
105                 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_FIRE))
106                 {
107                         em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
108                         em_ptr->dam *= 2;
109                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_FIRE);
110                 }
111                 break;
112         }
113         case GF_COLD:
114         {
115                 if (em_ptr->seen) em_ptr->obvious = TRUE;
116                 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
117                 {
118                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
119                         em_ptr->dam /= 9;
120                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
121                 }
122                 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_COLD))
123                 {
124                         em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
125                         em_ptr->dam *= 2;
126                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
127                 }
128                 break;
129         }
130         case GF_POIS:
131         {
132                 if (em_ptr->seen) em_ptr->obvious = TRUE;
133                 if (em_ptr->r_ptr->flagsr & RFR_IM_POIS)
134                 {
135                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
136                         em_ptr->dam /= 9;
137                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
138                 }
139                 break;
140         }
141         case GF_NUKE:
142         {
143                 if (em_ptr->seen) em_ptr->obvious = TRUE;
144                 if (em_ptr->r_ptr->flagsr & RFR_IM_POIS)
145                 {
146                         em_ptr->note = _("には耐性がある。", " resists.");
147                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
148                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
149                 }
150                 else if (one_in_(3)) em_ptr->do_polymorph = TRUE;
151                 break;
152         }
153         case GF_HELL_FIRE:
154         {
155                 if (em_ptr->seen) em_ptr->obvious = TRUE;
156                 if (em_ptr->r_ptr->flags3 & RF3_GOOD)
157                 {
158                         em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
159                         em_ptr->dam *= 2;
160                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
161                 }
162                 break;
163         }
164         case GF_HOLY_FIRE:
165         {
166                 if (em_ptr->seen) em_ptr->obvious = TRUE;
167                 if (em_ptr->r_ptr->flags3 & RF3_EVIL)
168                 {
169                         em_ptr->dam *= 2;
170                         em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
171                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= RF3_EVIL;
172                 }
173                 else
174                 {
175                         em_ptr->note = _("には耐性がある。", " resists.");
176                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
177                 }
178                 break;
179         }
180         case GF_ARROW:
181         {
182                 if (em_ptr->seen) em_ptr->obvious = TRUE;
183                 break;
184         }
185         case GF_PLASMA:
186         {
187                 if (em_ptr->seen) em_ptr->obvious = TRUE;
188                 if (em_ptr->r_ptr->flagsr & RFR_RES_PLAS)
189                 {
190                         em_ptr->note = _("には耐性がある。", " resists.");
191                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
192                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_PLAS);
193                 }
194
195                 break;
196         }
197         case GF_NETHER:
198         {
199                 if (em_ptr->seen) em_ptr->obvious = TRUE;
200                 if (em_ptr->r_ptr->flagsr & RFR_RES_NETH)
201                 {
202                         if (em_ptr->r_ptr->flags3 & RF3_UNDEAD)
203                         {
204                                 em_ptr->note = _("には完全な耐性がある!", " is immune.");
205                                 em_ptr->dam = 0;
206                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
207                         }
208                         else
209                         {
210                                 em_ptr->note = _("には耐性がある。", " resists.");
211                                 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
212                         }
213                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_NETH);
214                 }
215                 else if (em_ptr->r_ptr->flags3 & RF3_EVIL)
216                 {
217                         em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
218                         em_ptr->dam /= 2;
219                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
220                 }
221
222                 break;
223         }
224         case GF_WATER:
225         {
226                 if (em_ptr->seen) em_ptr->obvious = TRUE;
227                 if (em_ptr->r_ptr->flagsr & RFR_RES_WATE)
228                 {
229                         if ((em_ptr->m_ptr->r_idx == MON_WATER_ELEM) || (em_ptr->m_ptr->r_idx == MON_UNMAKER))
230                         {
231                                 em_ptr->note = _("には完全な耐性がある!", " is immune.");
232                                 em_ptr->dam = 0;
233                         }
234                         else
235                         {
236                                 em_ptr->note = _("には耐性がある。", " resists.");
237                                 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
238                         }
239                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_WATE);
240                 }
241
242                 break;
243         }
244         case GF_CHAOS:
245         {
246                 if (em_ptr->seen) em_ptr->obvious = TRUE;
247                 if (em_ptr->r_ptr->flagsr & RFR_RES_CHAO)
248                 {
249                         em_ptr->note = _("には耐性がある。", " resists.");
250                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
251                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_CHAO);
252                 }
253                 else if ((em_ptr->r_ptr->flags3 & RF3_DEMON) && one_in_(3))
254                 {
255                         em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
256                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
257                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
258                 }
259                 else
260                 {
261                         em_ptr->do_polymorph = TRUE;
262                         em_ptr->do_conf = (5 + randint1(11) + em_ptr->r) / (em_ptr->r + 1);
263                 }
264
265                 break;
266         }
267         case GF_SHARDS:
268         {
269                 if (em_ptr->seen) em_ptr->obvious = TRUE;
270                 if (em_ptr->r_ptr->flagsr & RFR_RES_SHAR)
271                 {
272                         em_ptr->note = _("には耐性がある。", " resists.");
273                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
274                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
275                 }
276
277                 break;
278         }
279         case GF_ROCKET:
280         {
281                 if (em_ptr->seen) em_ptr->obvious = TRUE;
282                 if (em_ptr->r_ptr->flagsr & RFR_RES_SHAR)
283                 {
284                         em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
285                         em_ptr->dam /= 2;
286                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
287                 }
288
289                 break;
290         }
291         case GF_SOUND:
292         {
293                 if (em_ptr->seen) em_ptr->obvious = TRUE;
294                 if (em_ptr->r_ptr->flagsr & RFR_RES_SOUN)
295                 {
296                         em_ptr->note = _("には耐性がある。", " resists.");
297                         em_ptr->dam *= 2; em_ptr->dam /= randint1(6) + 6;
298                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_SOUN);
299                 }
300                 else
301                         em_ptr->do_stun = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
302
303                 break;
304         }
305         case GF_CONFUSION:
306         {
307                 if (em_ptr->seen) em_ptr->obvious = TRUE;
308                 if (em_ptr->r_ptr->flags3 & RF3_NO_CONF)
309                 {
310                         em_ptr->note = _("には耐性がある。", " resists.");
311                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
312                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
313                 }
314                 else
315                         em_ptr->do_conf = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
316
317                 break;
318         }
319         case GF_DISENCHANT:
320         {
321                 if (em_ptr->seen) em_ptr->obvious = TRUE;
322                 if (em_ptr->r_ptr->flagsr & RFR_RES_DISE)
323                 {
324                         em_ptr->note = _("には耐性がある。", " resists.");
325                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
326                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_DISE);
327                 }
328
329                 break;
330         }
331         case GF_NEXUS:
332         {
333                 if (em_ptr->seen) em_ptr->obvious = TRUE;
334                 if (em_ptr->r_ptr->flagsr & RFR_RES_NEXU)
335                 {
336                         em_ptr->note = _("には耐性がある。", " resists.");
337                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
338                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_NEXU);
339                 }
340
341                 break;
342         }
343         case GF_FORCE:
344         {
345                 if (em_ptr->seen) em_ptr->obvious = TRUE;
346                 if (em_ptr->r_ptr->flagsr & RFR_RES_WALL)
347                 {
348                         em_ptr->note = _("には耐性がある。", " resists.");
349                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
350                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_WALL);
351                 }
352                 else
353                         em_ptr->do_stun = (randint1(15) + em_ptr->r) / (em_ptr->r + 1);
354
355                 break;
356         }
357         case GF_INERTIAL:
358         {
359                 if (em_ptr->seen) em_ptr->obvious = TRUE;
360                 if (em_ptr->r_ptr->flagsr & RFR_RES_INER)
361                 {
362                         em_ptr->note = _("には耐性がある。", " resists.");
363                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
364                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_INER);
365                 }
366                 else
367                 {
368                         /* Powerful monsters can resist */
369                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
370                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
371                         {
372                                 em_ptr->obvious = FALSE;
373                         }
374                         /* Normal monsters slow down */
375                         else
376                         {
377                                 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
378                                 {
379                                         em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
380                                 }
381                         }
382                 }
383
384                 break;
385         }
386         case GF_TIME:
387         {
388                 if (em_ptr->seen) em_ptr->obvious = TRUE;
389                 if (em_ptr->r_ptr->flagsr & RFR_RES_TIME)
390                 {
391                         em_ptr->note = _("には耐性がある。", " resists.");
392                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
393                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_TIME);
394                 }
395                 else
396                         em_ptr->do_time = (em_ptr->dam + 1) / 2;
397
398                 break;
399         }
400         case GF_GRAVITY:
401         {
402                 bool resist_tele = FALSE;
403
404                 if (em_ptr->seen) em_ptr->obvious = TRUE;
405                 if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
406                 {
407                         if (em_ptr->r_ptr->flags1 & (RF1_UNIQUE))
408                         {
409                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
410                                 em_ptr->note = _("には効果がなかった。", " is unaffected!");
411                                 resist_tele = TRUE;
412                         }
413                         else if (em_ptr->r_ptr->level > randint1(100))
414                         {
415                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
416                                 em_ptr->note = _("には耐性がある!", " resists!");
417                                 resist_tele = TRUE;
418                         }
419                 }
420
421                 if (!resist_tele) em_ptr->do_dist = 10;
422                 else em_ptr->do_dist = 0;
423
424                 if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)) em_ptr->do_dist = 0;
425
426                 if (em_ptr->r_ptr->flagsr & RFR_RES_GRAV)
427                 {
428                         em_ptr->note = _("には耐性がある!", " resists!");
429                         em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
430                         em_ptr->do_dist = 0;
431                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_GRAV);
432                 }
433                 else
434                 {
435                         /* 1. slowness */
436                         /* Powerful monsters can resist */
437                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
438                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
439                         {
440                                 em_ptr->obvious = FALSE;
441                         }
442                         /* Normal monsters slow down */
443                         else
444                         {
445                                 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
446                                 {
447                                         em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
448                                 }
449                         }
450
451                         /* 2. stun */
452                         em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
453
454                         /* Attempt a saving throw */
455                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
456                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
457                         {
458                                 /* Resist */
459                                 em_ptr->do_stun = 0;
460                                 /* No em_ptr->obvious effect */
461                                 em_ptr->note = _("には効果がなかった。", " is unaffected!");
462                                 em_ptr->obvious = FALSE;
463                         }
464                 }
465
466                 break;
467         }
468         case GF_MANA:
469         case GF_SEEKER:
470         case GF_SUPER_RAY:
471         {
472                 if (em_ptr->seen) em_ptr->obvious = TRUE;
473                 break;
474         }
475         case GF_DISINTEGRATE:
476         {
477                 if (em_ptr->seen) em_ptr->obvious = TRUE;
478                 if (em_ptr->r_ptr->flags3 & RF3_HURT_ROCK)
479                 {
480                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
481                         em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
482                         em_ptr->note_dies = _("は蒸発した!", " evaporates!");
483                         em_ptr->dam *= 2;
484                 }
485
486                 break;
487         }
488         case GF_PSI:
489         {
490                 if (em_ptr->seen) em_ptr->obvious = TRUE;
491                 if (!(los(caster_ptr, em_ptr->m_ptr->fy, em_ptr->m_ptr->fx, caster_ptr->y, caster_ptr->x)))
492                 {
493                         if (em_ptr->seen_msg)
494                                 msg_format(_("%sはあなたが見えないので影響されない!", "%^s can't see you, and isn't affected!"), em_ptr->m_name);
495                         em_ptr->skipped = TRUE;
496                         break;
497                 }
498
499                 if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
500                 {
501                         em_ptr->dam = 0;
502                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
503                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
504
505                 }
506                 else if ((em_ptr->r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) ||
507                         (em_ptr->r_ptr->flags3 & RF3_ANIMAL) ||
508                         (em_ptr->r_ptr->level > randint1(3 * em_ptr->dam)))
509                 {
510                         em_ptr->note = _("には耐性がある!", " resists!");
511                         em_ptr->dam /= 3;
512
513                         /*
514                          * Powerful demons & undead can turn a mindcrafter's
515                          * attacks back on them
516                          */
517                         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) &&
518                                 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
519                                 one_in_(2))
520                         {
521                                 em_ptr->note = NULL;
522                                 msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
523                                         (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
524                                                 "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
525
526                                 if ((randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav) && !CHECK_MULTISHADOW(caster_ptr))
527                                 {
528                                         msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
529                                 }
530                                 else
531                                 {
532                                         /* Injure +/- confusion */
533                                         monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_ptr, MD_WRONGDOER_NAME);
534                                         take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);  /* has already been /3 */
535                                         if (one_in_(4) && !CHECK_MULTISHADOW(caster_ptr))
536                                         {
537                                                 switch (randint1(4))
538                                                 {
539                                                 case 1:
540                                                         set_confused(caster_ptr, caster_ptr->confused + 3 + randint1(em_ptr->dam));
541                                                         break;
542                                                 case 2:
543                                                         set_stun(caster_ptr, caster_ptr->stun + randint1(em_ptr->dam));
544                                                         break;
545                                                 case 3:
546                                                 {
547                                                         if (em_ptr->r_ptr->flags3 & RF3_NO_FEAR)
548                                                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
549                                                         else
550                                                                 set_afraid(caster_ptr, caster_ptr->afraid + 3 + randint1(em_ptr->dam));
551                                                         break;
552                                                 }
553                                                 default:
554                                                         if (!caster_ptr->free_act)
555                                                                 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(em_ptr->dam));
556                                                         break;
557                                                 }
558                                         }
559                                 }
560
561                                 em_ptr->dam = 0;
562                         }
563                 }
564
565                 if ((em_ptr->dam > 0) && one_in_(4))
566                 {
567                         switch (randint1(4))
568                         {
569                         case 1:
570                                 em_ptr->do_conf = 3 + randint1(em_ptr->dam);
571                                 break;
572                         case 2:
573                                 em_ptr->do_stun = 3 + randint1(em_ptr->dam);
574                                 break;
575                         case 3:
576                                 em_ptr->do_fear = 3 + randint1(em_ptr->dam);
577                                 break;
578                         default:
579                                 em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
580                                 em_ptr->do_sleep = 3 + randint1(em_ptr->dam);
581                                 break;
582                         }
583                 }
584
585                 em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
586                 break;
587         }
588         case GF_PSI_DRAIN:
589         {
590                 if (em_ptr->seen) em_ptr->obvious = TRUE;
591                 if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
592                 {
593                         em_ptr->dam = 0;
594                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
595                 }
596                 else if ((em_ptr->r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) ||
597                         (em_ptr->r_ptr->flags3 & RF3_ANIMAL) ||
598                         (em_ptr->r_ptr->level > randint1(3 * em_ptr->dam)))
599                 {
600                         em_ptr->note = _("には耐性がある!", " resists!");
601                         em_ptr->dam /= 3;
602
603                         /*
604                          * Powerful demons & undead can turn a mindcrafter's
605                          * attacks back on them
606                          */
607                         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) &&
608                                 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
609                                 (one_in_(2)))
610                         {
611                                 em_ptr->note = NULL;
612                                 msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
613                                         (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
614                                                 "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
615                                 if ((randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav) && !CHECK_MULTISHADOW(caster_ptr))
616                                 {
617                                         msg_print(_("あなたは効力を跳ね返した!", "You resist the effects!"));
618                                 }
619                                 else
620                                 {
621                                         monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_ptr, MD_WRONGDOER_NAME);
622                                         if (!CHECK_MULTISHADOW(caster_ptr))
623                                         {
624                                                 msg_print(_("超能力パワーを吸いとられた!", "Your psychic energy is drained!"));
625                                                 caster_ptr->csp -= damroll(5, em_ptr->dam) / 2;
626                                                 if (caster_ptr->csp < 0) caster_ptr->csp = 0;
627                                                 caster_ptr->redraw |= PR_MANA;
628                                                 caster_ptr->window |= (PW_SPELL);
629                                         }
630                                         take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);  /* has already been /3 */
631                                 }
632
633                                 em_ptr->dam = 0;
634                         }
635                 }
636                 else if (em_ptr->dam > 0)
637                 {
638                         int b = damroll(5, em_ptr->dam) / 4;
639                         concptr str = (caster_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana");
640                         concptr msg = _("あなたは%sの苦痛を%sに変換した!",
641                                 (em_ptr->seen ? "You convert %s's pain into %s!" :
642                                         "You convert %ss pain into %s!"));
643                         msg_format(msg, em_ptr->m_name, str);
644
645                         b = MIN(caster_ptr->msp, caster_ptr->csp + b);
646                         caster_ptr->csp = b;
647                         caster_ptr->redraw |= PR_MANA;
648                         caster_ptr->window |= (PW_SPELL);
649                 }
650
651                 em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
652                 break;
653         }
654         case GF_TELEKINESIS:
655         {
656                 if (em_ptr->seen) em_ptr->obvious = TRUE;
657                 if (one_in_(4))
658                 {
659                         if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)) em_ptr->do_dist = 0;
660                         else em_ptr->do_dist = 7;
661                 }
662
663                 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, em_ptr->dam) + 1;
664                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
665                         (em_ptr->r_ptr->level > 5 + randint1(em_ptr->dam)))
666                 {
667                         em_ptr->do_stun = 0;
668                         em_ptr->obvious = FALSE;
669                 }
670
671                 break;
672         }
673         case GF_PSY_SPEAR:
674         {
675                 if (em_ptr->seen) em_ptr->obvious = TRUE;
676                 break;
677         }
678         case GF_METEOR:
679         {
680                 if (em_ptr->seen) em_ptr->obvious = TRUE;
681                 break;
682         }
683         case GF_DOMINATION:
684         {
685                 if (!is_hostile(em_ptr->m_ptr)) break;
686                 if (em_ptr->seen) em_ptr->obvious = TRUE;
687                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
688                         (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
689                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
690                 {
691                         if (em_ptr->r_ptr->flags3 & RF3_NO_CONF)
692                         {
693                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
694                         }
695
696                         em_ptr->do_conf = 0;
697
698                         /*
699                          * Powerful demons & undead can turn a mindcrafter's
700                          * attacks back on them
701                          */
702                         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) &&
703                                 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
704                                 (one_in_(2)))
705                         {
706                                 em_ptr->note = NULL;
707                                 msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
708                                         (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
709                                                 "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
710
711                                 /* Saving throw */
712                                 if (randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav)
713                                 {
714                                         msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
715                                 }
716                                 else
717                                 {
718                                         /* Confuse, stun, terrify */
719                                         switch (randint1(4))
720                                         {
721                                         case 1:
722                                                 set_stun(caster_ptr, caster_ptr->stun + em_ptr->dam / 2);
723                                                 break;
724                                         case 2:
725                                                 set_confused(caster_ptr, caster_ptr->confused + em_ptr->dam / 2);
726                                                 break;
727                                         default:
728                                         {
729                                                 if (em_ptr->r_ptr->flags3 & RF3_NO_FEAR)
730                                                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
731                                                 else
732                                                         set_afraid(caster_ptr, caster_ptr->afraid + em_ptr->dam);
733                                         }
734                                         }
735                                 }
736                         }
737                         else
738                         {
739                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
740                                 em_ptr->obvious = FALSE;
741                         }
742                 }
743                 else
744                 {
745                         if (!common_saving_throw_charm(caster_ptr, em_ptr->dam, em_ptr->m_ptr))
746                         {
747                                 em_ptr->note = _("があなたに隷属した。", " is in your thrall!");
748                                 set_pet(caster_ptr, em_ptr->m_ptr);
749                         }
750                         else
751                         {
752                                 switch (randint1(4))
753                                 {
754                                 case 1:
755                                         em_ptr->do_stun = em_ptr->dam / 2;
756                                         break;
757                                 case 2:
758                                         em_ptr->do_conf = em_ptr->dam / 2;
759                                         break;
760                                 default:
761                                         em_ptr->do_fear = em_ptr->dam;
762                                 }
763                         }
764                 }
765
766                 em_ptr->dam = 0;
767                 break;
768         }
769         case GF_ICE:
770         {
771                 if (em_ptr->seen) em_ptr->obvious = TRUE;
772                 em_ptr->do_stun = (randint1(15) + 1) / (em_ptr->r + 1);
773                 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
774                 {
775                         em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
776                         em_ptr->dam /= 9;
777                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
778                 }
779                 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_COLD))
780                 {
781                         em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
782                         em_ptr->dam *= 2;
783                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
784                 }
785
786                 break;
787         }
788         case GF_HYPODYNAMIA:
789         {
790                 if (em_ptr->seen) em_ptr->obvious = TRUE;
791                 if (!monster_living(em_ptr->m_ptr->r_idx))
792                 {
793                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
794                         {
795                                 if (em_ptr->r_ptr->flags3 & RF3_DEMON) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
796                                 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
797                                 if (em_ptr->r_ptr->flags3 & RF3_NONLIVING) em_ptr->r_ptr->r_flags3 |= (RF3_NONLIVING);
798                         }
799                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
800                         em_ptr->obvious = FALSE;
801                         em_ptr->dam = 0;
802                 }
803                 else
804                         em_ptr->do_time = (em_ptr->dam + 7) / 8;
805
806                 break;
807         }
808         case GF_DEATH_RAY:
809         {
810                 if (em_ptr->seen) em_ptr->obvious = TRUE;
811                 if (!monster_living(em_ptr->m_ptr->r_idx))
812                 {
813                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
814                         {
815                                 if (em_ptr->r_ptr->flags3 & RF3_DEMON) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
816                                 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
817                                 if (em_ptr->r_ptr->flags3 & RF3_NONLIVING) em_ptr->r_ptr->r_flags3 |= (RF3_NONLIVING);
818                         }
819                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
820                         em_ptr->obvious = FALSE;
821                         em_ptr->dam = 0;
822                 }
823                 else if (((em_ptr->r_ptr->flags1 & RF1_UNIQUE) &&
824                         (randint1(888) != 666)) ||
825                         (((em_ptr->r_ptr->level + randint1(20)) > randint1((em_ptr->caster_lev / 2) + randint1(10))) &&
826                                 randint1(100) != 66))
827                 {
828                         em_ptr->note = _("には耐性がある!", " resists!");
829                         em_ptr->obvious = FALSE;
830                         em_ptr->dam = 0;
831                 }
832
833                 break;
834         }
835         case GF_OLD_POLY:
836         {
837                 if (em_ptr->seen) em_ptr->obvious = TRUE;
838                 em_ptr->do_polymorph = TRUE;
839
840                 /* Powerful monsters can resist */
841                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
842                         (em_ptr->r_ptr->flags1 & RF1_QUESTOR) ||
843                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
844                 {
845                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
846                         em_ptr->do_polymorph = FALSE;
847                         em_ptr->obvious = FALSE;
848                 }
849
850                 em_ptr->dam = 0;
851                 break;
852         }
853         case GF_OLD_CLONE:
854         {
855                 if (em_ptr->seen) em_ptr->obvious = TRUE;
856
857                 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)))
858                 {
859                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
860                 }
861                 else
862                 {
863                         em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
864                         if (multiply_monster(caster_ptr, em_ptr->g_ptr->m_idx, TRUE, 0L))
865                         {
866                                 em_ptr->note = _("が分裂した!", " spawns!");
867                         }
868                 }
869
870                 em_ptr->dam = 0;
871                 break;
872         }
873         case GF_STAR_HEAL:
874         {
875                 if (em_ptr->seen) em_ptr->obvious = TRUE;
876
877                 (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
878
879                 if (em_ptr->m_ptr->maxhp < em_ptr->m_ptr->max_maxhp)
880                 {
881                         if (em_ptr->seen_msg) msg_format(_("%^sの強さが戻った。", "%^s recovers %s vitality."), em_ptr->m_name, em_ptr->m_poss);
882                         em_ptr->m_ptr->maxhp = em_ptr->m_ptr->max_maxhp;
883                 }
884
885                 if (!em_ptr->dam)
886                 {
887                         if (caster_ptr->health_who == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH);
888                         if (caster_ptr->riding == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH);
889                         break;
890                 }
891         }
892         /* Fall through */
893         case GF_OLD_HEAL:
894         {
895                 if (em_ptr->seen) em_ptr->obvious = TRUE;
896
897                 /* Wake up */
898                 (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
899                 if (MON_STUNNED(em_ptr->m_ptr))
900                 {
901                         if (em_ptr->seen_msg) msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), em_ptr->m_name);
902                         (void)set_monster_stunned(caster_ptr, em_ptr->g_ptr->m_idx, 0);
903                 }
904                 if (MON_CONFUSED(em_ptr->m_ptr))
905                 {
906                         if (em_ptr->seen_msg) msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), em_ptr->m_name);
907                         (void)set_monster_confused(caster_ptr, em_ptr->g_ptr->m_idx, 0);
908                 }
909                 if (MON_MONFEAR(em_ptr->m_ptr))
910                 {
911                         if (em_ptr->seen_msg) msg_format(_("%^sは勇気を取り戻した。", "%^s recovers %s courage."), em_ptr->m_name, em_ptr->m_poss);
912                         (void)set_monster_monfear(caster_ptr, em_ptr->g_ptr->m_idx, 0);
913                 }
914
915                 if (em_ptr->m_ptr->hp < 30000) em_ptr->m_ptr->hp += em_ptr->dam;
916                 if (em_ptr->m_ptr->hp > em_ptr->m_ptr->maxhp) em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
917
918                 if (!em_ptr->who)
919                 {
920                         chg_virtue(caster_ptr, V_VITALITY, 1);
921
922                         if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
923                                 chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
924
925                         if (is_friendly(em_ptr->m_ptr))
926                                 chg_virtue(caster_ptr, V_HONOUR, 1);
927                         else if (!(em_ptr->r_ptr->flags3 & RF3_EVIL))
928                         {
929                                 if (em_ptr->r_ptr->flags3 & RF3_GOOD)
930                                         chg_virtue(caster_ptr, V_COMPASSION, 2);
931                                 else
932                                         chg_virtue(caster_ptr, V_COMPASSION, 1);
933                         }
934
935                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
936                                 chg_virtue(caster_ptr, V_NATURE, 1);
937                 }
938
939                 if (em_ptr->m_ptr->r_idx == MON_LEPER)
940                 {
941                         em_ptr->heal_leper = TRUE;
942                         if (!em_ptr->who) chg_virtue(caster_ptr, V_COMPASSION, 5);
943                 }
944
945                 if (caster_ptr->health_who == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH);
946                 if (caster_ptr->riding == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH);
947
948                 em_ptr->note = _("は体力を回復したようだ。", " looks healthier.");
949
950                 em_ptr->dam = 0;
951                 break;
952         }
953         case GF_OLD_SPEED:
954         {
955                 if (em_ptr->seen) em_ptr->obvious = TRUE;
956
957                 if (set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100))
958                 {
959                         em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
960                 }
961
962                 if (!em_ptr->who)
963                 {
964                         if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
965                                 chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
966                         if (is_friendly(em_ptr->m_ptr))
967                                 chg_virtue(caster_ptr, V_HONOUR, 1);
968                 }
969
970                 em_ptr->dam = 0;
971                 break;
972         }
973         case GF_OLD_SLOW:
974         {
975                 if (em_ptr->seen) em_ptr->obvious = TRUE;
976
977                 /* Powerful monsters can resist */
978                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
979                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
980                 {
981                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
982                         em_ptr->obvious = FALSE;
983                 }
984                 else
985                 {
986                         if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
987                         {
988                                 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
989                         }
990                 }
991
992                 em_ptr->dam = 0;
993                 break;
994         }
995         case GF_OLD_SLEEP:
996         {
997                 if (em_ptr->seen) em_ptr->obvious = TRUE;
998
999                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1000                         (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) ||
1001                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1002                 {
1003                         if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
1004                         {
1005                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
1006                         }
1007
1008                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1009                         em_ptr->obvious = FALSE;
1010                 }
1011                 else
1012                 {
1013                         em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
1014                         em_ptr->do_sleep = 500;
1015                 }
1016
1017                 em_ptr->dam = 0;
1018                 break;
1019         }
1020         case GF_STASIS_EVIL:
1021         {
1022                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1023
1024                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1025                         !(em_ptr->r_ptr->flags3 & RF3_EVIL) ||
1026                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1027                 {
1028                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1029                         em_ptr->obvious = FALSE;
1030                 }
1031                 else
1032                 {
1033                         em_ptr->note = _("は動けなくなった!", " is suspended!");
1034                         em_ptr->do_sleep = 500;
1035                 }
1036
1037                 em_ptr->dam = 0;
1038                 break;
1039         }
1040         case GF_STASIS:
1041         {
1042                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1043
1044                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1045                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1046                 {
1047                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1048                         em_ptr->obvious = FALSE;
1049                 }
1050                 else
1051                 {
1052                         em_ptr->note = _("は動けなくなった!", " is suspended!");
1053                         em_ptr->do_sleep = 500;
1054                 }
1055
1056                 em_ptr->dam = 0;
1057                 break;
1058         }
1059         case GF_CHARM:
1060         {
1061                 int vir;
1062                 vir = virtue_number(caster_ptr, V_HARMONY);
1063                 if (vir)
1064                 {
1065                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
1066                 }
1067
1068                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
1069                 if (vir)
1070                 {
1071                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
1072                 }
1073
1074                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1075
1076                 if (common_saving_throw_charm(caster_ptr, em_ptr->dam, em_ptr->m_ptr))
1077                 {
1078                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1079                         em_ptr->obvious = FALSE;
1080
1081                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1082                 }
1083                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
1084                 {
1085                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
1086                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1087                 }
1088                 else
1089                 {
1090                         em_ptr->note = _("は突然友好的になったようだ!", " suddenly seems friendly!");
1091                         set_pet(caster_ptr, em_ptr->m_ptr);
1092
1093                         chg_virtue(caster_ptr, V_INDIVIDUALISM, -1);
1094                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
1095                                 chg_virtue(caster_ptr, V_NATURE, 1);
1096                 }
1097
1098                 em_ptr->dam = 0;
1099                 break;
1100         }
1101         case GF_CONTROL_UNDEAD:
1102         {
1103                 int vir;
1104                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1105
1106                 vir = virtue_number(caster_ptr, V_UNLIFE);
1107                 if (vir)
1108                 {
1109                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
1110                 }
1111
1112                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
1113                 if (vir)
1114                 {
1115                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
1116                 }
1117
1118                 if (common_saving_throw_control(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
1119                         !(em_ptr->r_ptr->flags3 & RF3_UNDEAD))
1120                 {
1121                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1122                         em_ptr->obvious = FALSE;
1123                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1124                 }
1125                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
1126                 {
1127                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
1128                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1129                 }
1130                 else
1131                 {
1132                         em_ptr->note = _("は既にあなたの奴隷だ!", " is in your thrall!");
1133                         set_pet(caster_ptr, em_ptr->m_ptr);
1134                 }
1135
1136                 em_ptr->dam = 0;
1137                 break;
1138         }
1139         case GF_CONTROL_DEMON:
1140         {
1141                 int vir;
1142                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1143
1144                 vir = virtue_number(caster_ptr, V_UNLIFE);
1145                 if (vir)
1146                 {
1147                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
1148                 }
1149
1150                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
1151                 if (vir)
1152                 {
1153                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
1154                 }
1155
1156                 if (common_saving_throw_control(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
1157                         !(em_ptr->r_ptr->flags3 & RF3_DEMON))
1158                 {
1159                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1160                         em_ptr->obvious = FALSE;
1161                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1162                 }
1163                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
1164                 {
1165                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
1166                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1167                 }
1168                 else
1169                 {
1170                         em_ptr->note = _("は既にあなたの奴隷だ!", " is in your thrall!");
1171                         set_pet(caster_ptr, em_ptr->m_ptr);
1172                 }
1173
1174                 em_ptr->dam = 0;
1175                 break;
1176         }
1177         case GF_CONTROL_ANIMAL:
1178         {
1179                 int vir;
1180                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1181
1182                 vir = virtue_number(caster_ptr, V_NATURE);
1183                 if (vir)
1184                 {
1185                         em_ptr->dam += caster_ptr->virtues[vir - 1] / 10;
1186                 }
1187
1188                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
1189                 if (vir)
1190                 {
1191                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
1192                 }
1193
1194                 if (common_saving_throw_control(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
1195                         !(em_ptr->r_ptr->flags3 & RF3_ANIMAL))
1196                 {
1197                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1198                         em_ptr->obvious = FALSE;
1199                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1200                 }
1201                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
1202                 {
1203                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
1204                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1205                 }
1206                 else
1207                 {
1208                         em_ptr->note = _("はなついた。", " is tamed!");
1209                         set_pet(caster_ptr, em_ptr->m_ptr);
1210                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
1211                                 chg_virtue(caster_ptr, V_NATURE, 1);
1212                 }
1213
1214                 em_ptr->dam = 0;
1215                 break;
1216         }
1217         case GF_CHARM_LIVING:
1218         {
1219                 int vir;
1220
1221                 vir = virtue_number(caster_ptr, V_UNLIFE);
1222                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1223
1224                 vir = virtue_number(caster_ptr, V_UNLIFE);
1225                 if (vir)
1226                 {
1227                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 10;
1228                 }
1229
1230                 vir = virtue_number(caster_ptr, V_INDIVIDUALISM);
1231                 if (vir)
1232                 {
1233                         em_ptr->dam -= caster_ptr->virtues[vir - 1] / 20;
1234                 }
1235
1236                 msg_format(_("%sを見つめた。", "You stare into %s."), em_ptr->m_name);
1237
1238                 if (common_saving_throw_charm(caster_ptr, em_ptr->dam, em_ptr->m_ptr) ||
1239                         !monster_living(em_ptr->m_ptr->r_idx))
1240                 {
1241                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1242                         em_ptr->obvious = FALSE;
1243                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1244                 }
1245                 else if (caster_ptr->cursed & TRC_AGGRAVATE)
1246                 {
1247                         em_ptr->note = _("はあなたに敵意を抱いている!", " hates you too much!");
1248                         if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
1249                 }
1250                 else
1251                 {
1252                         em_ptr->note = _("を支配した。", " is tamed!");
1253                         set_pet(caster_ptr, em_ptr->m_ptr);
1254                         if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
1255                                 chg_virtue(caster_ptr, V_NATURE, 1);
1256                 }
1257
1258                 em_ptr->dam = 0;
1259                 break;
1260         }
1261         case GF_OLD_CONF:
1262         {
1263                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1264
1265                 em_ptr->do_conf = damroll(3, (em_ptr->dam / 2)) + 1;
1266                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1267                         (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) ||
1268                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1269                 {
1270                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
1271                         {
1272                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
1273                         }
1274
1275                         em_ptr->do_conf = 0;
1276                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1277                         em_ptr->obvious = FALSE;
1278                 }
1279
1280                 em_ptr->dam = 0;
1281                 break;
1282         }
1283         case GF_STUN:
1284         {
1285                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1286
1287                 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
1288                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1289                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1290                 {
1291                         em_ptr->do_stun = 0;
1292                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1293                         em_ptr->obvious = FALSE;
1294                 }
1295
1296                 em_ptr->dam = 0;
1297                 break;
1298         }
1299         case GF_LITE_WEAK:
1300         {
1301                 if (!em_ptr->dam)
1302                 {
1303                         em_ptr->skipped = TRUE;
1304                         break;
1305                 }
1306
1307                 if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
1308                 {
1309                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1310
1311                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
1312
1313                         em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
1314                         em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
1315                 }
1316                 else
1317                 {
1318                         em_ptr->dam = 0;
1319                 }
1320
1321                 break;
1322         }
1323         case GF_LITE:
1324         {
1325                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1326
1327                 if (em_ptr->r_ptr->flagsr & RFR_RES_LITE)
1328                 {
1329                         em_ptr->note = _("には耐性がある!", " resists!");
1330                         em_ptr->dam *= 2; em_ptr->dam /= (randint1(6) + 6);
1331                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_LITE);
1332                 }
1333                 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
1334                 {
1335                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
1336                         em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
1337                         em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
1338                         em_ptr->dam *= 2;
1339                 }
1340                 break;
1341         }
1342         case GF_DARK:
1343         {
1344                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1345
1346                 if (em_ptr->r_ptr->flagsr & RFR_RES_DARK)
1347                 {
1348                         em_ptr->note = _("には耐性がある!", " resists!");
1349                         em_ptr->dam *= 2; em_ptr->dam /= (randint1(6) + 6);
1350                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= (RFR_RES_DARK);
1351                 }
1352
1353                 break;
1354         }
1355         case GF_KILL_WALL:
1356         {
1357                 if (em_ptr->r_ptr->flags3 & (RF3_HURT_ROCK))
1358                 {
1359                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1360
1361                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
1362
1363                         em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
1364                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1365                 }
1366                 else
1367                 {
1368                         em_ptr->dam = 0;
1369                 }
1370
1371                 break;
1372         }
1373         case GF_AWAY_UNDEAD:
1374         {
1375                 if (em_ptr->r_ptr->flags3 & (RF3_UNDEAD))
1376                 {
1377                         bool resists_tele = FALSE;
1378
1379                         if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
1380                         {
1381                                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
1382                                 {
1383                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1384                                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1385                                         resists_tele = TRUE;
1386                                 }
1387                                 else if (em_ptr->r_ptr->level > randint1(100))
1388                                 {
1389                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1390                                         em_ptr->note = _("には耐性がある!", " resists!");
1391                                         resists_tele = TRUE;
1392                                 }
1393                         }
1394
1395                         if (!resists_tele)
1396                         {
1397                                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1398                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
1399                                 em_ptr->do_dist = em_ptr->dam;
1400                         }
1401                 }
1402                 else
1403                 {
1404                         em_ptr->skipped = TRUE;
1405                 }
1406
1407                 em_ptr->dam = 0;
1408                 break;
1409         }
1410         case GF_AWAY_EVIL:
1411         {
1412                 if (em_ptr->r_ptr->flags3 & (RF3_EVIL))
1413                 {
1414                         bool resists_tele = FALSE;
1415
1416                         if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
1417                         {
1418                                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
1419                                 {
1420                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1421                                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1422                                         resists_tele = TRUE;
1423                                 }
1424                                 else if (em_ptr->r_ptr->level > randint1(100))
1425                                 {
1426                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1427                                         em_ptr->note = _("には耐性がある!", " resists!");
1428                                         resists_tele = TRUE;
1429                                 }
1430                         }
1431
1432                         if (!resists_tele)
1433                         {
1434                                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1435                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
1436                                 em_ptr->do_dist = em_ptr->dam;
1437                         }
1438                 }
1439                 else
1440                 {
1441                         em_ptr->skipped = TRUE;
1442                 }
1443
1444                 em_ptr->dam = 0;
1445                 break;
1446         }
1447         case GF_AWAY_ALL:
1448         {
1449                 bool resists_tele = FALSE;
1450                 if (em_ptr->r_ptr->flagsr & RFR_RES_TELE)
1451                 {
1452                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
1453                         {
1454                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1455                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1456                                 resists_tele = TRUE;
1457                         }
1458                         else if (em_ptr->r_ptr->level > randint1(100))
1459                         {
1460                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
1461                                 em_ptr->note = _("には耐性がある!", " resists!");
1462                                 resists_tele = TRUE;
1463                         }
1464                 }
1465
1466                 if (!resists_tele)
1467                 {
1468                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1469
1470                         em_ptr->do_dist = em_ptr->dam;
1471                 }
1472
1473                 em_ptr->dam = 0;
1474                 break;
1475         }
1476         case GF_TURN_UNDEAD:
1477         {
1478                 if (em_ptr->r_ptr->flags3 & (RF3_UNDEAD))
1479                 {
1480                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1481
1482                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
1483
1484                         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
1485                         if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
1486                         {
1487                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1488                                 em_ptr->obvious = FALSE;
1489                                 em_ptr->do_fear = 0;
1490                         }
1491                 }
1492                 else
1493                 {
1494                         em_ptr->skipped = TRUE;
1495                 }
1496
1497                 em_ptr->dam = 0;
1498                 break;
1499         }
1500         case GF_TURN_EVIL:
1501         {
1502                 if (em_ptr->r_ptr->flags3 & (RF3_EVIL))
1503                 {
1504                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1505
1506                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
1507
1508                         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
1509                         if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
1510                         {
1511                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1512                                 em_ptr->obvious = FALSE;
1513                                 em_ptr->do_fear = 0;
1514                         }
1515                 }
1516                 else
1517                 {
1518                         em_ptr->skipped = TRUE;
1519                 }
1520
1521                 em_ptr->dam = 0;
1522                 break;
1523         }
1524         case GF_TURN_ALL:
1525         {
1526                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1527
1528                 em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
1529                 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1530                         (em_ptr->r_ptr->flags3 & (RF3_NO_FEAR)) ||
1531                         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1532                 {
1533                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1534                         em_ptr->obvious = FALSE;
1535                         em_ptr->do_fear = 0;
1536                 }
1537
1538                 em_ptr->dam = 0;
1539                 break;
1540         }
1541         case GF_DISP_UNDEAD:
1542         {
1543                 if (em_ptr->r_ptr->flags3 & (RF3_UNDEAD))
1544                 {
1545                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1546
1547                         /* Learn about em_ptr->effect_type */
1548                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
1549
1550                         em_ptr->note = _("は身震いした。", " shudders.");
1551                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1552                 }
1553                 else
1554                 {
1555                         em_ptr->skipped = TRUE;
1556                         em_ptr->dam = 0;
1557                 }
1558
1559                 break;
1560         }
1561         case GF_DISP_EVIL:
1562         {
1563                 if (em_ptr->r_ptr->flags3 & (RF3_EVIL))
1564                 {
1565                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1566
1567                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
1568
1569                         em_ptr->note = _("は身震いした。", " shudders.");
1570                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1571                 }
1572                 else
1573                 {
1574                         em_ptr->skipped = TRUE;
1575                         em_ptr->dam = 0;
1576                 }
1577
1578                 break;
1579         }
1580         case GF_DISP_GOOD:
1581         {
1582                 if (em_ptr->r_ptr->flags3 & (RF3_GOOD))
1583                 {
1584                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1585
1586                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
1587
1588                         em_ptr->note = _("は身震いした。", " shudders.");
1589                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1590                 }
1591                 else
1592                 {
1593                         em_ptr->skipped = TRUE;
1594                         em_ptr->dam = 0;
1595                 }
1596
1597                 break;
1598         }
1599         case GF_DISP_LIVING:
1600         {
1601                 if (monster_living(em_ptr->m_ptr->r_idx))
1602                 {
1603                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1604
1605                         em_ptr->note = _("は身震いした。", " shudders.");
1606                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1607                 }
1608                 else
1609                 {
1610                         em_ptr->skipped = TRUE;
1611                         em_ptr->dam = 0;
1612                 }
1613
1614                 break;
1615         }
1616         case GF_DISP_DEMON:
1617         {
1618                 if (em_ptr->r_ptr->flags3 & (RF3_DEMON))
1619                 {
1620                         if (em_ptr->seen) em_ptr->obvious = TRUE;
1621
1622                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
1623
1624                         em_ptr->note = _("は身震いした。", " shudders.");
1625                         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1626                 }
1627                 else
1628                 {
1629                         em_ptr->skipped = TRUE;
1630                         em_ptr->dam = 0;
1631                 }
1632
1633                 break;
1634         }
1635         case GF_DISP_ALL:
1636         {
1637                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1638                 em_ptr->note = _("は身震いした。", " shudders.");
1639                 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
1640                 break;
1641         }
1642         case GF_DRAIN_MANA:
1643         {
1644                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1645                 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)))
1646                 {
1647                         if (em_ptr->who > 0)
1648                         {
1649                                 if (em_ptr->m_caster_ptr->hp < em_ptr->m_caster_ptr->maxhp)
1650                                 {
1651                                         em_ptr->m_caster_ptr->hp += em_ptr->dam;
1652                                         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;
1653                                         if (caster_ptr->health_who == em_ptr->who) caster_ptr->redraw |= (PR_HEALTH);
1654                                         if (caster_ptr->riding == em_ptr->who) caster_ptr->redraw |= (PR_UHEALTH);
1655
1656                                         if (em_ptr->see_s_msg)
1657                                         {
1658                                                 monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_caster_ptr, 0);
1659                                                 msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), em_ptr->killer);
1660                                         }
1661                                 }
1662                         }
1663                         else
1664                         {
1665                                 msg_format(_("%sから精神エネルギーを吸いとった。", "You draw psychic energy from %s."), em_ptr->m_name);
1666                                 (void)hp_player(caster_ptr, em_ptr->dam);
1667                         }
1668                 }
1669                 else
1670                 {
1671                         if (em_ptr->see_s_msg) msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
1672                 }
1673
1674                 em_ptr->dam = 0;
1675                 break;
1676         }
1677         case GF_MIND_BLAST:
1678         {
1679                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1680                 if (!em_ptr->who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), em_ptr->m_name);
1681
1682                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1683                         (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
1684                         (em_ptr->r_ptr->level > randint1((em_ptr->caster_lev - 10) < 1 ? 1 : (em_ptr->caster_lev - 10)) + 10))
1685                 {
1686                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
1687                         {
1688                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
1689                         }
1690
1691                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1692                         em_ptr->dam = 0;
1693                 }
1694                 else if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
1695                 {
1696                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
1697                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
1698                         em_ptr->dam = 0;
1699                 }
1700                 else if (em_ptr->r_ptr->flags2 & RF2_WEIRD_MIND)
1701                 {
1702                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
1703                         em_ptr->note = _("には耐性がある。", " resists.");
1704                         em_ptr->dam /= 3;
1705                 }
1706                 else
1707                 {
1708                         em_ptr->note = _("は精神攻撃を食らった。", " is blasted by psionic energy.");
1709                         em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
1710
1711                         if (em_ptr->who > 0) em_ptr->do_conf = randint0(4) + 4;
1712                         else em_ptr->do_conf = randint0(8) + 8;
1713                 }
1714
1715                 break;
1716         }
1717         case GF_BRAIN_SMASH:
1718         {
1719                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1720                 if (!em_ptr->who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), em_ptr->m_name);
1721
1722                 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1723                         (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
1724                         (em_ptr->r_ptr->level > randint1((em_ptr->caster_lev - 10) < 1 ? 1 : (em_ptr->caster_lev - 10)) + 10))
1725                 {
1726                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
1727                         {
1728                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
1729                         }
1730
1731                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1732                         em_ptr->dam = 0;
1733                 }
1734                 else if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
1735                 {
1736                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
1737                         em_ptr->note = _("には完全な耐性がある!", " is immune.");
1738                         em_ptr->dam = 0;
1739                 }
1740                 else if (em_ptr->r_ptr->flags2 & RF2_WEIRD_MIND)
1741                 {
1742                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
1743                         em_ptr->note = _("には耐性がある!", " resists!");
1744                         em_ptr->dam /= 3;
1745                 }
1746                 else
1747                 {
1748                         em_ptr->note = _("は精神攻撃を食らった。", " is blasted by psionic energy.");
1749                         em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
1750                         if (em_ptr->who > 0)
1751                         {
1752                                 em_ptr->do_conf = randint0(4) + 4;
1753                                 em_ptr->do_stun = randint0(4) + 4;
1754                         }
1755                         else
1756                         {
1757                                 em_ptr->do_conf = randint0(8) + 8;
1758                                 em_ptr->do_stun = randint0(8) + 8;
1759                         }
1760                         (void)set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 10);
1761                 }
1762
1763                 break;
1764         }
1765         case GF_CAUSE_1:
1766         {
1767                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1768                 if (!em_ptr->who) msg_format(_("%sを指差して呪いをかけた。", "You point at %s and curse."), em_ptr->m_name);
1769                 if (randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35))
1770                 {
1771                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1772                         em_ptr->dam = 0;
1773                 }
1774
1775                 break;
1776         }
1777         case GF_CAUSE_2:
1778         {
1779                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1780                 if (!em_ptr->who) msg_format(_("%sを指差して恐ろしげに呪いをかけた。", "You point at %s and curse horribly."), em_ptr->m_name);
1781
1782                 if (randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35))
1783                 {
1784                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1785                         em_ptr->dam = 0;
1786                 }
1787
1788                 break;
1789         }
1790         case GF_CAUSE_3:
1791         {
1792                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1793                 if (!em_ptr->who) msg_format(_("%sを指差し、恐ろしげに呪文を唱えた!", "You point at %s, incanting terribly!"), em_ptr->m_name);
1794
1795                 if (randint0(100 + (em_ptr->caster_lev / 2)) < (em_ptr->r_ptr->level + 35))
1796                 {
1797                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1798                         em_ptr->dam = 0;
1799                 }
1800
1801                 break;
1802         }
1803         case GF_CAUSE_4:
1804         {
1805                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1806                 if (!em_ptr->who)
1807                         msg_format(_("%sの秘孔を突いて、「お前は既に死んでいる」と叫んだ。",
1808                                 "You point at %s, screaming the word, 'DIE!'."), em_ptr->m_name);
1809
1810                 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)))
1811                 {
1812                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1813                         em_ptr->dam = 0;
1814                 }
1815                 break;
1816         }
1817         case GF_HAND_DOOM:
1818         {
1819                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1820                 if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
1821                 {
1822                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1823                         em_ptr->dam = 0;
1824                 }
1825                 else
1826                 {
1827                         if ((em_ptr->who > 0) ? ((em_ptr->caster_lev + randint1(em_ptr->dam)) > (em_ptr->r_ptr->level + 10 + randint1(20))) :
1828                                 (((em_ptr->caster_lev / 2) + randint1(em_ptr->dam)) > (em_ptr->r_ptr->level + randint1(200))))
1829                         {
1830                                 em_ptr->dam = ((40 + randint1(20)) * em_ptr->m_ptr->hp) / 100;
1831
1832                                 if (em_ptr->m_ptr->hp < em_ptr->dam) em_ptr->dam = em_ptr->m_ptr->hp - 1;
1833                         }
1834                         else
1835                         {
1836                                 /* todo 乱数で破滅のを弾いた結果が「耐性を持っている」ことになるのはおかしい */
1837                                 em_ptr->note = _("は耐性を持っている!", "resists!");
1838                                 em_ptr->dam = 0;
1839                         }
1840                 }
1841
1842                 break;
1843         }
1844         case GF_CAPTURE:
1845         {
1846                 int nokori_hp;
1847                 if ((floor_ptr->inside_quest && (quest[floor_ptr->inside_quest].type == QUEST_TYPE_KILL_ALL) && !is_pet(em_ptr->m_ptr)) ||
1848                         (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)
1849                 {
1850                         msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
1851                         em_ptr->skipped = TRUE;
1852                         break;
1853                 }
1854
1855                 if (is_pet(em_ptr->m_ptr)) nokori_hp = em_ptr->m_ptr->maxhp * 4L;
1856                 else if ((caster_ptr->pclass == CLASS_BEASTMASTER) && monster_living(em_ptr->m_ptr->r_idx))
1857                         nokori_hp = em_ptr->m_ptr->maxhp * 3 / 10;
1858                 else
1859                         nokori_hp = em_ptr->m_ptr->maxhp * 3 / 20;
1860
1861                 if (em_ptr->m_ptr->hp >= nokori_hp)
1862                 {
1863                         msg_format(_("もっと弱らせないと。", "You need to weaken %s more."), em_ptr->m_name);
1864                         em_ptr->skipped = TRUE;
1865                 }
1866                 else if (em_ptr->m_ptr->hp < randint0(nokori_hp))
1867                 {
1868                         if (em_ptr->m_ptr->mflag2 & MFLAG2_CHAMELEON) choose_new_monster(caster_ptr, em_ptr->g_ptr->m_idx, FALSE, MON_CHAMELEON);
1869                         msg_format(_("%sを捕えた!", "You capture %^s!"), em_ptr->m_name);
1870                         cap_mon = em_ptr->m_ptr->r_idx;
1871                         cap_mspeed = em_ptr->m_ptr->mspeed;
1872                         cap_hp = em_ptr->m_ptr->hp;
1873                         cap_maxhp = em_ptr->m_ptr->max_maxhp;
1874                         cap_nickname = em_ptr->m_ptr->nickname;
1875                         if (em_ptr->g_ptr->m_idx == caster_ptr->riding)
1876                         {
1877                                 if (rakuba(caster_ptr, -1, FALSE))
1878                                 {
1879                                         msg_format(_("地面に落とされた。", "You have fallen from %s."), em_ptr->m_name);
1880                                 }
1881                         }
1882
1883                         delete_monster_idx(caster_ptr, em_ptr->g_ptr->m_idx);
1884
1885                         return GF_SWITCH_TRUE;
1886                 }
1887                 else
1888                 {
1889                         msg_format(_("うまく捕まえられなかった。", "You failed to capture %s."), em_ptr->m_name);
1890                         em_ptr->skipped = TRUE;
1891                 }
1892
1893                 break;
1894         }
1895         case GF_ATTACK:
1896         {
1897                 return (gf_switch_result)py_attack(caster_ptr, em_ptr->y, em_ptr->x, em_ptr->dam);
1898         }
1899         case GF_ENGETSU:
1900         {
1901                 int effect = 0;
1902                 bool done = TRUE;
1903
1904                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1905                 if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
1906                 {
1907                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1908                         em_ptr->dam = 0;
1909                         em_ptr->skipped = TRUE;
1910                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
1911                         break;
1912                 }
1913                 if (MON_CSLEEP(em_ptr->m_ptr))
1914                 {
1915                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1916                         em_ptr->dam = 0;
1917                         em_ptr->skipped = TRUE;
1918                         break;
1919                 }
1920
1921                 if (one_in_(5)) effect = 1;
1922                 else if (one_in_(4)) effect = 2;
1923                 else if (one_in_(3)) effect = 3;
1924                 else done = FALSE;
1925
1926                 if (effect == 1)
1927                 {
1928                         if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1929                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1930                         {
1931                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1932                                 em_ptr->obvious = FALSE;
1933                         }
1934                         else
1935                         {
1936                                 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
1937                                 {
1938                                         em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
1939                                 }
1940                         }
1941                 }
1942                 else if (effect == 2)
1943                 {
1944                         em_ptr->do_stun = damroll((caster_ptr->lev / 10) + 3, (em_ptr->dam)) + 1;
1945                         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
1946                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1947                         {
1948                                 em_ptr->do_stun = 0;
1949                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1950                                 em_ptr->obvious = FALSE;
1951                         }
1952                 }
1953                 else if (effect == 3)
1954                 {
1955                         if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
1956                                 (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) ||
1957                                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
1958                         {
1959                                 if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
1960                                 {
1961                                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
1962                                 }
1963
1964                                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
1965                                 em_ptr->obvious = FALSE;
1966                         }
1967                         else
1968                         {
1969                                 /* Go to sleep (much) later */
1970                                 em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
1971                                 em_ptr->do_sleep = 500;
1972                         }
1973                 }
1974
1975                 if (!done)
1976                 {
1977                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
1978                 }
1979
1980                 em_ptr->dam = 0;
1981                 break;
1982         }
1983         case GF_GENOCIDE:
1984         {
1985                 if (em_ptr->seen) em_ptr->obvious = TRUE;
1986                 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")))
1987                 {
1988                         if (em_ptr->seen_msg) msg_format(_("%sは消滅した!", "%^s disappeared!"), em_ptr->m_name);
1989                         chg_virtue(caster_ptr, V_VITALITY, -1);
1990                         return GF_SWITCH_TRUE;
1991                 }
1992
1993                 em_ptr->skipped = TRUE;
1994                 break;
1995         }
1996         case GF_PHOTO:
1997         {
1998                 if (!em_ptr->who)
1999                         msg_format(_("%sを写真に撮った。", "You take a photograph of %s."), em_ptr->m_name);
2000
2001                 if (em_ptr->r_ptr->flags3 & (RF3_HURT_LITE))
2002                 {
2003                         if (em_ptr->seen) em_ptr->obvious = TRUE;
2004
2005                         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_HURT_LITE);
2006
2007                         em_ptr->note = _("は光に身をすくめた!", " cringes from the light!");
2008                         em_ptr->note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!");
2009                 }
2010                 else
2011                 {
2012                         em_ptr->dam = 0;
2013                 }
2014
2015                 em_ptr->photo = em_ptr->m_ptr->r_idx;
2016                 break;
2017         }
2018         case GF_BLOOD_CURSE:
2019         {
2020                 if (em_ptr->seen) em_ptr->obvious = TRUE;
2021                 break;
2022         }
2023         case GF_CRUSADE:
2024         {
2025                 bool success = FALSE;
2026                 if (em_ptr->seen) em_ptr->obvious = TRUE;
2027
2028                 if ((em_ptr->r_ptr->flags3 & (RF3_GOOD)) && !floor_ptr->inside_arena)
2029                 {
2030                         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) em_ptr->dam -= 50;
2031                         if (em_ptr->dam < 1) em_ptr->dam = 1;
2032
2033                         if (is_pet(em_ptr->m_ptr))
2034                         {
2035                                 em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
2036                                 (void)set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100);
2037                                 success = TRUE;
2038                         }
2039                         else if ((em_ptr->r_ptr->flags1 & (RF1_QUESTOR)) ||
2040                                 (em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
2041                                 (em_ptr->m_ptr->mflag2 & MFLAG2_NOPET) ||
2042                                 (caster_ptr->cursed & TRC_AGGRAVATE) ||
2043                                 ((em_ptr->r_ptr->level + 10) > randint1(em_ptr->dam)))
2044                         {
2045                                 if (one_in_(4)) em_ptr->m_ptr->mflag2 |= MFLAG2_NOPET;
2046                         }
2047                         else
2048                         {
2049                                 em_ptr->note = _("を支配した。", " is tamed!");
2050                                 set_pet(caster_ptr, em_ptr->m_ptr);
2051                                 (void)set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100);
2052
2053                                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
2054                                 success = TRUE;
2055                         }
2056                 }
2057
2058                 if (!success)
2059                 {
2060                         if (!(em_ptr->r_ptr->flags3 & RF3_NO_FEAR))
2061                         {
2062                                 em_ptr->do_fear = randint1(90) + 10;
2063                         }
2064                         else if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
2065                                 em_ptr->r_ptr->r_flags3 |= (RF3_NO_FEAR);
2066                 }
2067
2068                 em_ptr->dam = 0;
2069                 break;
2070         }
2071         case GF_WOUNDS:
2072         {
2073                 if (em_ptr->seen) em_ptr->obvious = TRUE;
2074
2075                 if (randint0(100 + em_ptr->dam) < (em_ptr->r_ptr->level + 50))
2076                 {
2077                         em_ptr->note = _("には効果がなかった。", " is unaffected.");
2078                         em_ptr->dam = 0;
2079                 }
2080                 break;
2081         }
2082         default:
2083         {
2084                 em_ptr->skipped = TRUE;
2085                 em_ptr->dam = 0;
2086                 break;
2087         }
2088         }
2089
2090         return GF_SWITCH_CONTINUE;
2091 }
2092
2093
2094 /*!
2095  * @brief 完全な耐性を持っていたら、モンスターへの効果処理をスキップする
2096  * @param caster_ptr プレーヤーへの参照ポインタ
2097  * @param em_ptr モンスター効果構造体への参照ポインタ
2098  * @return 完全耐性ならCONTINUE、そうでないなら効果処理の結果
2099  */
2100 static gf_switch_result process_monster_perfect_resistance(player_type *caster_ptr, effect_monster_type *em_ptr)
2101 {
2102         if (((em_ptr->r_ptr->flagsr & RFR_RES_ALL) == 0) ||
2103                 em_ptr->effect_type == GF_OLD_CLONE ||
2104                 em_ptr->effect_type == GF_STAR_HEAL ||
2105                 em_ptr->effect_type == GF_OLD_HEAL ||
2106                 em_ptr->effect_type == GF_OLD_SPEED ||
2107                 em_ptr->effect_type == GF_CAPTURE ||
2108                 em_ptr->effect_type == GF_PHOTO)
2109                 return switch_effects_monster(caster_ptr, em_ptr);
2110
2111         em_ptr->note = _("には完全な耐性がある!", " is immune.");
2112         em_ptr->dam = 0;
2113         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
2114                 em_ptr->r_ptr->r_flagsr |= (RFR_RES_ALL);
2115
2116         if (em_ptr->effect_type == GF_LITE_WEAK || em_ptr->effect_type == GF_KILL_WALL)
2117                 em_ptr->skipped = TRUE;
2118
2119         return GF_SWITCH_CONTINUE;
2120 }
2121
2122
2123 /*!
2124  * @brief ペットの死亡を処理する
2125  * @param caster_ptr プレーヤーへの参照ポインタ
2126  * @param em_ptr モンスター効果構造体への参照ポインタ
2127  * @return なし
2128  */
2129 static void process_pet_death(player_type *caster_ptr, effect_monster_type *em_ptr)
2130 {
2131         bool sad = is_pet(em_ptr->m_ptr) && !(em_ptr->m_ptr->ml);
2132         if (em_ptr->known && em_ptr->note)
2133         {
2134                 monster_desc(caster_ptr, em_ptr->m_name, em_ptr->m_ptr, MD_TRUE_NAME);
2135                 if (em_ptr->see_s_msg) msg_format("%^s%s", em_ptr->m_name, em_ptr->note);
2136                 else caster_ptr->current_floor_ptr->monster_noise = TRUE;
2137         }
2138
2139         if (em_ptr->who > 0) monster_gain_exp(caster_ptr, em_ptr->who, em_ptr->m_ptr->r_idx);
2140
2141         monster_death(caster_ptr, em_ptr->g_ptr->m_idx, FALSE);
2142         delete_monster_idx(caster_ptr, em_ptr->g_ptr->m_idx);
2143         if (sad) msg_print(_("少し悲しい気分がした。", "You feel sad for a moment."));
2144 }
2145
2146
2147 /*!
2148  * @brief モンスターの睡眠を処理する
2149  * @param caster_ptr プレーヤーへの参照ポインタ
2150  * @param em_ptr モンスター効果構造体への参照ポインタ
2151  * @return なし
2152  */
2153 static void process_monster_sleep(player_type *caster_ptr, effect_monster_type *em_ptr)
2154 {
2155         if (em_ptr->note && em_ptr->seen_msg)
2156                 msg_format("%^s%s", em_ptr->m_name, em_ptr->note);
2157         else if (em_ptr->see_s_msg)
2158                 message_pain(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam);
2159         else
2160                 caster_ptr->current_floor_ptr->monster_noise = TRUE;
2161
2162         if (em_ptr->do_sleep) (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->do_sleep);
2163 }
2164
2165
2166 /*!
2167  * @brief モンスターの被ダメージを処理する / If another monster did the damage, hurt the monster by hand
2168  * @param caster_ptr プレーヤーへの参照ポインタ
2169  * @param em_ptr モンスター効果構造体への参照ポインタ
2170  * @return モンスターIDがプレーヤー自身だった場合FALSE、モンスターだった場合TRUE
2171  */
2172 static bool process_monster_damage(player_type *caster_ptr, effect_monster_type *em_ptr)
2173 {
2174         if (em_ptr->who <= 0) return FALSE;
2175
2176         if (caster_ptr->health_who == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH);
2177         if (caster_ptr->riding == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH);
2178
2179         (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
2180         em_ptr->m_ptr->hp -= em_ptr->dam;
2181         if (em_ptr->m_ptr->hp < 0) process_pet_death(caster_ptr, em_ptr);
2182         else process_monster_sleep(caster_ptr, em_ptr);
2183
2184         return TRUE;
2185 }
2186
2187
2188 /*!
2189  * @brief 不潔な病人の治療処理
2190  * @param caster_ptr プレーヤーへの参照ポインタ
2191  * @param em_ptr モンスター効果構造体への参照ポインタ
2192  * @return 大賞モンスターが不潔な病人だった場合はTRUE、それ以外はFALSE
2193  */
2194 static bool heal_leaper(player_type *caster_ptr, effect_monster_type *em_ptr)
2195 {
2196         if (!em_ptr->heal_leper) return FALSE;
2197
2198         if (em_ptr->seen_msg)
2199                 msg_print(_("不潔な病人は病気が治った!", "The Mangy looking leper is healed!"));
2200
2201         if (record_named_pet && is_pet(em_ptr->m_ptr) && em_ptr->m_ptr->nickname)
2202         {
2203                 char m2_name[MAX_NLEN];
2204                 monster_desc(caster_ptr, m2_name, em_ptr->m_ptr, MD_INDEF_VISIBLE);
2205                 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name);
2206         }
2207
2208         delete_monster_idx(caster_ptr, em_ptr->g_ptr->m_idx);
2209         return TRUE;
2210 }
2211
2212
2213 /*!
2214  * @brief モンスターの恐慌処理 / If the player did it, give him experience, check fear
2215  * @param caster_ptr プレーヤーへの参照ポインタ
2216  * @param em_ptr モンスター効果構造体への参照ポインタ
2217  * @return モンスターが死んだらTRUE、生きていたらFALSE
2218  */
2219 static bool process_monster_fear(player_type *caster_ptr, effect_monster_type *em_ptr)
2220 {
2221         bool fear = FALSE;
2222         if (mon_take_hit(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam, &fear, em_ptr->note_dies))
2223                 return TRUE;
2224
2225         if (em_ptr->do_sleep)
2226                 anger_monster(caster_ptr, em_ptr->m_ptr);
2227
2228         if (em_ptr->note && em_ptr->seen_msg)
2229                 msg_format(_("%s%s", "%^s%s"), em_ptr->m_name, em_ptr->note);
2230         else if (em_ptr->known && (em_ptr->dam || !em_ptr->do_fear))
2231                 message_pain(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam);
2232
2233         if (((em_ptr->dam > 0) || em_ptr->get_angry) && !em_ptr->do_sleep)
2234                 anger_monster(caster_ptr, em_ptr->m_ptr);
2235
2236         if ((fear || em_ptr->do_fear) && em_ptr->seen)
2237         {
2238                 sound(SOUND_FLEE);
2239                 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), em_ptr->m_name);
2240         }
2241
2242         return FALSE;
2243 }
2244
2245
2246 /*!
2247  * todo 睡眠処理があるので、死に際とは言えない。適切な関数名に要修正
2248  * @brief モンスターの死に際処理 (魔力吸収を除く)
2249  * @param caster_ptr プレーヤーへの参照ポインタ
2250  * @param em_ptr モンスター効果構造体への参照ポインタ
2251  * @return なし
2252  */
2253 static void process_monster_last_moment(player_type *caster_ptr, effect_monster_type *em_ptr)
2254 {
2255         if (em_ptr->effect_type == GF_DRAIN_MANA) return;
2256
2257         if (process_monster_damage(caster_ptr, em_ptr)) return;
2258         if (heal_leaper(caster_ptr, em_ptr)) return;
2259         if (process_monster_fear(caster_ptr, em_ptr)) return;
2260
2261         if (em_ptr->do_sleep) (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->do_sleep);
2262 }
2263
2264
2265 /*!
2266  * @brief 魔法の効果による汎用処理 (変身の有無、現在HPの減算、徳の変化)
2267  * @param caster_ptr プレーヤーへの参照ポインタ
2268  * @param em_ptr モンスター効果構造体への参照ポインタ
2269  * @return なし
2270  */
2271 static void process_spell_result(player_type *caster_ptr, effect_monster_type *em_ptr)
2272 {
2273         if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
2274                 (em_ptr->r_ptr->flags1 & RF1_QUESTOR) ||
2275                 (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)))
2276                 em_ptr->do_polymorph = FALSE;
2277
2278         if (((em_ptr->r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (em_ptr->r_ptr->flags7 & RF7_NAZGUL)) &&
2279                 !caster_ptr->phase_out &&
2280                 (em_ptr->who > 0) &&
2281                 (em_ptr->dam > em_ptr->m_ptr->hp))
2282                 em_ptr->dam = em_ptr->m_ptr->hp;
2283
2284         if ((em_ptr->who > 0) || !em_ptr->slept) return;
2285
2286         if (!(em_ptr->r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(caster_ptr, V_COMPASSION, -1);
2287         if (!(em_ptr->r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(caster_ptr, V_HONOUR, -1);
2288 }
2289
2290
2291 /*!
2292  * @brief モンスターの朦朧値を蓄積させる
2293  * @param caster_ptr プレーヤーへの参照ポインタ
2294  * @param em_ptr モンスター効果構造体への参照ポインタ
2295  * @param stun_damage 朦朧値
2296  * @return なし
2297  */
2298 static void pile_monster_stun(player_type *caster_ptr, effect_monster_type *em_ptr, int *stun_damage)
2299 {
2300         if ((em_ptr->do_stun == 0) ||
2301                 (em_ptr->r_ptr->flagsr & (RFR_RES_SOUN | RFR_RES_WALL)) ||
2302                 (em_ptr->r_ptr->flags3 & RF3_NO_STUN))
2303                 return;
2304
2305         if (em_ptr->seen) em_ptr->obvious = TRUE;
2306
2307         if (MON_STUNNED(em_ptr->m_ptr))
2308         {
2309                 em_ptr->note = _("はひどくもうろうとした。", " is more dazed.");
2310                 *stun_damage = MON_STUNNED(em_ptr->m_ptr) + (em_ptr->do_stun / 2);
2311         }
2312         else
2313         {
2314                 em_ptr->note = _("はもうろうとした。", " is dazed.");
2315                 *stun_damage = em_ptr->do_stun;
2316         }
2317
2318         (void)set_monster_stunned(caster_ptr, em_ptr->g_ptr->m_idx, *stun_damage);
2319         em_ptr->get_angry = TRUE;
2320 }
2321
2322
2323 /*!
2324  * @brief モンスターの混乱値を蓄積させる
2325  * @param caster_ptr プレーヤーへの参照ポインタ
2326  * @param em_ptr モンスター効果構造体への参照ポインタ
2327  * @param stun_damage 混乱値
2328  * @return なし
2329  */
2330 static void pile_monster_conf(player_type *caster_ptr, effect_monster_type *em_ptr, int *conf_damage)
2331 {
2332         if ((em_ptr->do_conf == 0) ||
2333                 (em_ptr->r_ptr->flags3 & RF3_NO_CONF) ||
2334                 (em_ptr->r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
2335                 return;
2336
2337         if (em_ptr->seen) em_ptr->obvious = TRUE;
2338
2339         if (MON_CONFUSED(em_ptr->m_ptr))
2340         {
2341                 em_ptr->note = _("はさらに混乱したようだ。", " looks more confused.");
2342                 *conf_damage = MON_CONFUSED(em_ptr->m_ptr) + (em_ptr->do_conf / 2);
2343         }
2344         else
2345         {
2346                 em_ptr->note = _("は混乱したようだ。", " looks confused.");
2347                 *conf_damage = em_ptr->do_conf;
2348         }
2349
2350         (void)set_monster_confused(caster_ptr, em_ptr->g_ptr->m_idx, *conf_damage);
2351         em_ptr->get_angry = TRUE;
2352 }
2353
2354
2355 /*!
2356  * @brief モンスターを衰弱させる
2357  * @param em_ptr モンスター効果構造体への参照ポインタ
2358  * @return なし
2359  */
2360 static void process_monster_weakening(effect_monster_type *em_ptr)
2361 {
2362         if (em_ptr->do_time == 0) return;
2363
2364         if (em_ptr->seen) em_ptr->obvious = TRUE;
2365
2366         if (em_ptr->do_time >= em_ptr->m_ptr->maxhp) em_ptr->do_time = em_ptr->m_ptr->maxhp - 1;
2367
2368         if (em_ptr->do_time)
2369         {
2370                 em_ptr->note = _("は弱くなったようだ。", " seems weakened.");
2371                 em_ptr->m_ptr->maxhp -= em_ptr->do_time;
2372                 if ((em_ptr->m_ptr->hp - em_ptr->dam) > em_ptr->m_ptr->maxhp) em_ptr->dam = em_ptr->m_ptr->hp - em_ptr->m_ptr->maxhp;
2373         }
2374
2375         em_ptr->get_angry = TRUE;
2376 }
2377
2378
2379 /*!
2380  * @brief モンスターを変身させる
2381  * @param caster_ptr プレーヤーへの参照ポインタ
2382  * @param em_ptr モンスター効果構造体への参照ポインタ
2383  * @return なし
2384  */
2385 static void process_monster_polymorph(player_type *caster_ptr, effect_monster_type *em_ptr)
2386 {
2387         if (!em_ptr->do_polymorph || (randint1(90) <= em_ptr->r_ptr->level))
2388                 return;
2389
2390         if (polymorph_monster(caster_ptr, em_ptr->y, em_ptr->x))
2391         {
2392                 if (em_ptr->seen) em_ptr->obvious = TRUE;
2393
2394                 em_ptr->note = _("が変身した!", " changes!");
2395                 em_ptr->dam = 0;
2396         }
2397
2398         em_ptr->m_ptr = &caster_ptr->current_floor_ptr->m_list[em_ptr->g_ptr->m_idx];
2399         em_ptr->r_ptr = &r_info[em_ptr->m_ptr->r_idx];
2400 }
2401
2402
2403 /*!
2404  * @brief モンスターをテレポートさせる
2405  * @param caster_ptr プレーヤーへの参照ポインタ
2406  * @param em_ptr モンスター効果構造体への参照ポインタ
2407  * @return なし
2408  */
2409 static void process_monster_teleport(player_type *caster_ptr, effect_monster_type *em_ptr)
2410 {
2411         if (em_ptr->do_dist == 0) return;
2412
2413         if (em_ptr->seen) em_ptr->obvious = TRUE;
2414
2415         em_ptr->note = _("が消え去った!", " disappears!");
2416
2417         if (!em_ptr->who) chg_virtue(caster_ptr, V_VALOUR, -1);
2418
2419         teleport_away(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->do_dist,
2420                 (!em_ptr->who ? TELEPORT_DEC_VALOUR : 0L) | TELEPORT_PASSIVE);
2421
2422         em_ptr->y = em_ptr->m_ptr->fy;
2423         em_ptr->x = em_ptr->m_ptr->fx;
2424         em_ptr->g_ptr = &caster_ptr->current_floor_ptr->grid_array[em_ptr->y][em_ptr->x];
2425 }
2426
2427
2428 /*!
2429  * @brief モンスターの異常状態を処理する
2430  * @param caster_ptr プレーヤーへの参照ポインタ
2431  * @param em_ptr モンスター効果構造体への参照ポインタ
2432  * @parama tmp_damage 朦朧/混乱値
2433  * @return なし
2434  */
2435 static void process_monster_bad_status(player_type *caster_ptr, effect_monster_type *em_ptr, int *tmp_damage)
2436 {
2437         pile_monster_stun(caster_ptr, em_ptr, tmp_damage);
2438         pile_monster_conf(caster_ptr, em_ptr, tmp_damage);
2439         process_monster_weakening(em_ptr);
2440         process_monster_polymorph(caster_ptr, em_ptr);
2441         process_monster_teleport(caster_ptr, em_ptr);
2442         if (em_ptr->do_fear == 0) return;
2443
2444         (void)set_monster_monfear(caster_ptr, em_ptr->g_ptr->m_idx, MON_MONFEAR(em_ptr->m_ptr) + em_ptr->do_fear);
2445         em_ptr->get_angry = TRUE;
2446 }
2447
2448
2449 /*!
2450  * @brief モンスター闘技場にいる場合の画面更新処理
2451  * @param caster_ptr プレーヤーへの参照ポインタ
2452  * @param em_ptr モンスター効果構造体への参照ポインタ
2453  * @return なし
2454  */
2455 static void update_phase_out_stat(player_type *caster_ptr, effect_monster_type *em_ptr)
2456 {
2457         if (!caster_ptr->phase_out) return;
2458
2459         caster_ptr->health_who = em_ptr->g_ptr->m_idx;
2460         caster_ptr->redraw |= (PR_HEALTH);
2461         handle_stuff(caster_ptr);
2462 }
2463
2464
2465 /*!
2466  * @brief 魔法効果がペットに及んだ時の処理
2467  * @param caster_ptr プレーヤーへの参照ポインタ
2468  * @param em_ptr モンスター効果構造体への参照ポインタ
2469  * @return なし
2470  */
2471 static void process_spell_result_pet(player_type *caster_ptr, effect_monster_type *em_ptr)
2472 {
2473         if ((em_ptr->dam <= 0) || is_pet(em_ptr->m_ptr) || is_friendly(em_ptr->m_ptr))
2474                 return;
2475
2476         if (em_ptr->who == 0)
2477         {
2478                 if (!(em_ptr->flag & PROJECT_NO_HANGEKI))
2479                         set_target(em_ptr->m_ptr, monster_target_y, monster_target_x);
2480
2481                 return;
2482         }
2483
2484         if ((em_ptr->who > 0) && 
2485                 is_pet(em_ptr->m_caster_ptr) && 
2486                 !player_bold(caster_ptr, em_ptr->m_ptr->target_y, em_ptr->m_ptr->target_x))
2487                 set_target(em_ptr->m_ptr, em_ptr->m_caster_ptr->fy, em_ptr->m_caster_ptr->fx);
2488 }
2489
2490
2491 /*!
2492  * @brief 魔法効果が騎乗モンスターに及んだ時の処理
2493  * @param caster_ptr プレーヤーへの参照ポインタ
2494  * @param em_ptr モンスター効果構造体への参照ポインタ
2495  * @return なし
2496  */
2497 static void process_spell_result_riding(player_type *caster_ptr, effect_monster_type *em_ptr)
2498 {
2499         if (!caster_ptr->riding || (caster_ptr->riding != em_ptr->g_ptr->m_idx) || (em_ptr->dam <= 0))
2500                 return;
2501
2502         if (em_ptr->m_ptr->hp > (em_ptr->m_ptr->maxhp / 3))
2503                 em_ptr->dam = (em_ptr->dam + 1) / 2;
2504
2505         rakubadam_m = (em_ptr->dam > 200) ? 200 : em_ptr->dam;
2506 }
2507
2508
2509 /*!
2510  * @brief 汎用的なビーム/ボルト/ボール系によるモンスターへの効果処理 / Handle a beam/bolt/ball causing damage to a monster.
2511  * @param caster_ptr プレーヤーへの参照ポインタ
2512  * @param who 魔法を発動したモンスター(0ならばプレイヤー) / Index of "source" monster (zero for "player")
2513  * @param r 効果半径(ビーム/ボルト = 0 / ボール = 1以上) / Radius of explosion (0 = beam/bolt, 1 to 9 = ball)
2514  * @param y 目標y座標 / Target y location (or location to travel "towards")
2515  * @param x 目標x座標 / Target x location (or location to travel "towards")
2516  * @param dam 基本威力 / Base damage roll to apply to affected monsters (or player)
2517  * @param effect_type 効果属性 / Type of damage to apply to monsters (and objects)
2518  * @param flag 効果フラグ
2519  * @param see_s_msg TRUEならばメッセージを表示する
2520  * @return 何か一つでも効力があればTRUEを返す / TRUE if any "effects" of the projection were observed, else FALSE
2521  */
2522 bool affect_monster(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID effect_type, BIT_FLAGS flag, bool see_s_msg)
2523 {
2524         effect_monster_type tmp_effect;
2525         effect_monster_type *em_ptr = &tmp_effect;
2526         initialize_effect_monster(caster_ptr, em_ptr, who, r, y, x, dam, effect_type, flag, see_s_msg);
2527         if (!is_never_effect(caster_ptr, em_ptr)) return FALSE;
2528
2529         em_ptr->dam = (em_ptr->dam + em_ptr->r) / (em_ptr->r + 1);
2530         monster_desc(caster_ptr, em_ptr->m_name, em_ptr->m_ptr, 0);
2531         monster_desc(caster_ptr, em_ptr->m_poss, em_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
2532         if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding))
2533                 disturb(caster_ptr, TRUE, TRUE);
2534
2535         gf_switch_result result = process_monster_perfect_resistance(caster_ptr, em_ptr);
2536         if (result != GF_SWITCH_CONTINUE) return (bool)result;
2537
2538         if (em_ptr->skipped) return FALSE;
2539
2540         process_spell_result(caster_ptr, em_ptr);
2541         int tmp_damage = em_ptr->dam;
2542         em_ptr->dam = mon_damage_mod(caster_ptr, em_ptr->m_ptr, em_ptr->dam, (bool)(em_ptr->effect_type == GF_PSY_SPEAR));
2543         if ((tmp_damage > 0) && (em_ptr->dam == 0)) em_ptr->note = _("はダメージを受けていない。", " is unharmed.");
2544
2545         if (em_ptr->dam > em_ptr->m_ptr->hp)
2546                 em_ptr->note = em_ptr->note_dies;
2547         else
2548                 process_monster_bad_status(caster_ptr, em_ptr, &tmp_damage);
2549
2550         process_monster_last_moment(caster_ptr, em_ptr);
2551         if ((em_ptr->effect_type == GF_BLOOD_CURSE) && one_in_(4))
2552                 blood_curse_to_enemy(caster_ptr, em_ptr->who);
2553
2554         update_phase_out_stat(caster_ptr, em_ptr);
2555         if (em_ptr->m_ptr->r_idx) update_monster(caster_ptr, em_ptr->g_ptr->m_idx, FALSE);
2556
2557         lite_spot(caster_ptr, em_ptr->y, em_ptr->x);
2558         if ((caster_ptr->monster_race_idx == em_ptr->m_ptr->r_idx) && (em_ptr->seen || !em_ptr->m_ptr->r_idx))
2559                 caster_ptr->window |= (PW_MONSTER);
2560
2561         process_spell_result_pet(caster_ptr, em_ptr);
2562         process_spell_result_riding(caster_ptr, em_ptr);
2563         if (em_ptr->photo)
2564         {
2565                 object_type *q_ptr;
2566                 object_type forge;
2567                 q_ptr = &forge;
2568                 object_prep(q_ptr, lookup_kind(TV_STATUE, SV_PHOTO));
2569                 q_ptr->pval = em_ptr->photo;
2570                 q_ptr->ident |= (IDENT_FULL_KNOWN);
2571                 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
2572         }
2573
2574         project_m_n++;
2575         project_m_x = em_ptr->x;
2576         project_m_y = em_ptr->y;
2577         return (em_ptr->obvious);
2578 }