OSDN Git Service

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