OSDN Git Service

[Refactor] #37353 PROJECT_* 定義を新規ファイル projection.h へ移動。 / Move PROJECT_* definition...
[hengband/hengband.git] / src / mspells4.c
1 /*!
2  * @file mspells4.c
3  * @brief スペル実行処理 / Spell launch
4  * @date 2014/07/14
5  * @author Habu
6  */
7
8
9 #include "angband.h"
10 #include "projection.h"
11
12 /*!
13 * @brief モンスターIDを取り、モンスター名をm_nameに代入する /
14 * @param m_idx モンスターID
15 * @param m_name モンスター名を入力する配列
16 */
17 void monster_name(MONSTER_IDX m_idx, char* m_name)
18 {
19         monster_type    *m_ptr = &m_list[m_idx];
20         monster_desc(m_name, m_ptr, 0x00);
21 }
22
23 /*!
24 * @brief モンスター2体がプレイヤーの近くに居るかの判定 /
25 * @param m_idx モンスターID一体目
26 * @param t_idx モンスターID二体目
27 * @return モンスター2体のどちらかがプレイヤーの近くに居ればTRUE、どちらも遠ければFALSEを返す。
28 */
29 bool monster_near_player(MONSTER_IDX m_idx, MONSTER_IDX t_idx)
30 {
31         monster_type    *m_ptr = &m_list[m_idx];
32         monster_type    *t_ptr = &m_list[t_idx];
33         return (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
34 }
35
36 /*!
37 * @brief プレイヤーがモンスターを見ることができるかの判定 /
38 * @param m_idx モンスターID
39 * @return プレイヤーがモンスターを見ることができるならTRUE、そうでなければFALSEを返す。
40 */
41 bool see_monster(MONSTER_IDX m_idx)
42 {
43         monster_type *m_ptr = &m_list[m_idx];
44         return is_seen(m_ptr);
45 }
46
47 /*!
48 * @brief モンスターの唱えた呪文を青魔法で学習できるか判定する /
49 * @param m_idx モンスターID
50 * @return プレイヤーが青魔法で学習できるならTRUE、そうでなければFALSEを返す。
51 */
52 bool spell_learnable(MONSTER_IDX m_idx)
53 {
54         monster_type *m_ptr = &m_list[m_idx];
55         /* Extract the "see-able-ness" */
56         bool seen = (!p_ptr->blind && m_ptr->ml);
57
58         bool maneable = player_has_los_bold(m_ptr->fy, m_ptr->fx);
59         return (seen && maneable && !world_monster);
60 }
61
62 /*!
63 * @brief モンスターIDからモンスターのレベルを取得する /
64 * @param m_idx モンスターID
65 * @return モンスターのレベル
66 */
67 int monster_level_idx(MONSTER_IDX m_idx)
68 {
69         monster_type    *m_ptr = &m_list[m_idx];
70         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
71         int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
72         return rlev;
73 }
74
75 /*!
76 * @brief モンスターIDからPOWERFULフラグの有無を取得する /
77 * @param m_idx モンスターID
78 * @return POWERFULフラグがあればTRUE、なければFALSEを返す。
79 */
80 bool monster_is_powerful(MONSTER_IDX m_idx)
81 {
82         monster_type    *m_ptr = &m_list[m_idx];
83         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
84         bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
85         return powerful;
86 }
87
88 /*!
89 * @brief モンスターがユニーク召喚可能であるかを判定する /
90 * @param m_idx モンスターID
91 * @return 召喚可能であればPM_ALLOW_UNIQUEを返す。
92 */
93 u32b monster_u_mode(MONSTER_IDX m_idx)
94 {
95         u32b u_mode = 0L;
96         monster_type    *m_ptr = &m_list[m_idx];
97         bool pet = is_pet(m_ptr);
98         if (!pet) u_mode |= PM_ALLOW_UNIQUE;
99         return u_mode;
100 }
101
102 /*!
103 * @brief モンスターを起こす /
104 * @param t_idx モンスターID
105 */
106 void monster_wakeup(MONSTER_IDX t_idx)
107 {
108         (void)set_monster_csleep(t_idx, 0);
109 }
110
111 /*!
112  * @brief モンスターが呪文行使する際のメッセージを処理する汎用関数 /
113  * @param m_idx 呪文を唱えるモンスターID
114  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
115  * @param msg1 msg_flagがTRUEで、プレイヤーを対象とする場合のメッセージ
116  * @param msg2 msg_flagがTRUEで、モンスターを対象とする場合のメッセージ
117  * @param msg3 msg_flagがFALSEで、プレイヤーを対象とする場合のメッセージ
118  * @param msg4 msg_flagがFALSEで、モンスターを対象とする場合のメッセージ
119  * @param msg_flag_aux メッセージを分岐するためのフラグ
120  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
121  */
122 static void monspell_message_base(MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, concptr msg3, concptr msg4, bool msg_flag_aux, int TARGET_TYPE)
123 {
124         bool known = monster_near_player(m_idx, t_idx);
125         bool see_either = see_monster(m_idx) || see_monster(t_idx);
126         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
127         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
128         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
129         monster_name(m_idx, m_name);
130         monster_name(t_idx, t_name);
131
132         if (mon_to_player || (mon_to_mon && known && see_either))
133                 disturb(TRUE, TRUE);
134
135         if (msg_flag_aux)
136         {
137                 if (mon_to_player)
138                         msg_format(msg1, m_name);
139                 else if (mon_to_mon && known && see_either)
140                         msg_format(msg2, m_name);
141         }
142         else
143         {
144                 if (mon_to_player)
145                 {
146                         msg_format(msg3, m_name);
147                 }
148                 else if (mon_to_mon && known && see_either)
149                 {
150                         msg_format(msg4, m_name, t_name);
151                 }
152         }
153
154         if (mon_to_mon && known && !see_either)
155                 mon_fight = TRUE;
156 }
157
158 /*!
159 * @brief モンスターが呪文行使する際のメッセージを処理する汎用関数。盲目時と通常時のメッセージを切り替える。 /
160 * @param m_idx 呪文を唱えるモンスターID
161 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
162 * @param msg1 プレイヤーが盲目状態のメッセージ
163 * @param msg2 プレイヤーが盲目でなく、プレイヤーを対象とする場合のメッセージ
164 * @param msg3 プレイヤーが盲目でなく、モンスター対象とする場合のメッセージ
165 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
166 */
167 void monspell_message(MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, concptr msg3, int TARGET_TYPE)
168 {
169         monspell_message_base(m_idx, t_idx, msg1, msg1, msg2, msg3, p_ptr->blind > 0, TARGET_TYPE);
170 }
171
172 /*!
173 * @brief モンスターが呪文行使する際のメッセージを処理する汎用関数。対モンスターと対プレイヤーのメッセージを切り替える。 /
174 * @param m_idx 呪文を唱えるモンスターID
175 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
176 * @param msg1 プレイヤーを対象とする場合のメッセージ
177 * @param msg2 モンスター対象とする場合のメッセージ
178 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
179 */
180 void simple_monspell_message(MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, int TARGET_TYPE)
181 {
182         monspell_message_base(m_idx, t_idx, msg1, msg2, msg1, msg2, p_ptr->blind > 0, TARGET_TYPE);
183 }
184
185 /*!
186  * @brief RF4_SHRIEKの処理。叫び。 /
187  * @param m_idx 呪文を唱えるモンスターID
188  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
189  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
190  */
191 void spell_RF4_SHRIEK(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
192 {
193         simple_monspell_message(m_idx, t_idx,
194                 _("%^sがかん高い金切り声をあげた。", "%^s makes a high pitched shriek."),
195                 _("%^sが%sに向かって叫んだ。", "%^s shrieks at %s."),
196                 TARGET_TYPE);
197
198         if (TARGET_TYPE == MONSTER_TO_PLAYER)
199         {
200                 aggravate_monsters(m_idx);
201         }
202         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
203         {
204                 monster_wakeup(t_idx);
205         }
206 }
207
208 /*!
209  * @brief RF4_DISPELの処理。魔力消去。 /
210  * @param m_idx 呪文を唱えるモンスターID
211  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
212  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
213  */
214 void spell_RF4_DISPEL(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
215 {
216         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
217         monster_name(m_idx, m_name);
218         monster_name(t_idx, t_name);
219
220         monspell_message(m_idx, t_idx,
221                 _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
222                 _("%^sが魔力消去の呪文を念じた。", "%^s invokes a dispel magic."),
223                 _("%^sが%sに対して魔力消去の呪文を念じた。", "%^s invokes a dispel magic at %s."),
224                 TARGET_TYPE);
225
226         if (TARGET_TYPE == MONSTER_TO_PLAYER)
227         {
228                 dispel_player();
229                 if (p_ptr->riding) dispel_monster_status(p_ptr->riding);
230
231                 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
232                         msg_print(_("やりやがったな!", ""));
233                 else if ((p_ptr->pseikaku == SEIKAKU_CHARGEMAN))
234                 {
235                         if (randint0(2) == 0) msg_print(_("ジュラル星人め!", ""));
236                         else msg_print(_("弱い者いじめは止めるんだ!", ""));
237                 }
238
239                 learn_spell(MS_DISPEL);
240         }
241         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
242         {
243                 if (t_idx == p_ptr->riding) dispel_player();
244                 dispel_monster_status(t_idx);
245         }
246 }
247
248 /*!
249 * @brief RF4_ROCKETの処理。ロケット。 /
250 * @param y 対象の地点のy座標
251 * @param x 対象の地点のx座標
252 * @param m_idx 呪文を唱えるモンスターID
253 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
254 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
255 * @return ダメージ量を返す。
256 */
257 HIT_POINT spell_RF4_ROCKET(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
258 {
259         HIT_POINT dam;
260
261         monspell_message(m_idx, t_idx,
262                 _("%^sが何かを射った。", "%^s shoots something."),
263                 _("%^sがロケットを発射した。", "%^s fires a rocket."),
264                 _("%^sが%sにロケットを発射した。", "%^s fires a rocket at %s."),
265                 TARGET_TYPE);
266
267         dam = monspell_damage((MS_ROCKET), m_idx, DAM_ROLL);
268         breath(y, x, m_idx, GF_ROCKET, dam, 2, FALSE, MS_ROCKET, TARGET_TYPE);
269         if (TARGET_TYPE == MONSTER_TO_PLAYER)
270                 update_smart_learn(m_idx, DRS_SHARD);
271         return dam;
272 }
273
274 /*!
275 * @brief RF4_SHOOTの処理。射撃。 /
276 * @param y 対象の地点のy座標
277 * @param x 対象の地点のx座標
278 * @param m_idx 呪文を唱えるモンスターID
279 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
280 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
281 * @return ダメージ量を返す。
282 */
283 HIT_POINT spell_RF4_SHOOT(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx,int TARGET_TYPE)
284 {
285         HIT_POINT dam;
286
287         monspell_message(m_idx, t_idx,
288                 _("%^sが奇妙な音を発した。", "%^s makes a strange noise."),
289                 _("%^sが矢を放った。", "%^s fires an arrow."),
290                 _("%^sが%sに矢を放った。", "%^s fires an arrow at %s."),
291                 TARGET_TYPE);
292
293         dam = monspell_damage((MS_SHOOT), m_idx, DAM_ROLL);
294         bolt(m_idx, y, x, GF_ARROW, dam, MS_SHOOT, TARGET_TYPE);
295         sound(SOUND_SHOOT);
296
297         return dam;
298 }
299
300 /*!
301 * @brief RF4_BR_*の処理。各種ブレス。 /
302 * @param GF_TYPE ブレスの属性
303 * @param y 対象の地点のy座標
304 * @param x 対象の地点のx座標
305 * @param m_idx 呪文を唱えるモンスターID
306 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
307 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
308 * @return ダメージ量を返す。
309 */
310 HIT_POINT spell_RF4_BREATH(int GF_TYPE, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
311 {
312         HIT_POINT dam, ms_type, drs_type = 0;
313         concptr type_s;
314         bool smart_learn_aux = TRUE;
315         monster_type    *m_ptr = &m_list[m_idx];
316         bool known = monster_near_player(m_idx, t_idx);
317         bool see_either = see_monster(m_idx) || see_monster(t_idx);
318         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
319         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
320         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
321         monster_name(m_idx, m_name);
322         monster_name(t_idx, t_name);
323
324         switch (GF_TYPE)
325         {
326         case GF_ACID:
327                 dam = monspell_damage((MS_BR_ACID), m_idx, DAM_ROLL);
328                 type_s = _("酸", "acid");
329                 ms_type = MS_BR_ACID;
330                 drs_type = DRS_ACID;
331                 break;
332         case GF_ELEC:
333                 dam = monspell_damage((MS_BR_ELEC), m_idx, DAM_ROLL);
334                 type_s = _("稲妻", "lightning");
335                 ms_type = MS_BR_ELEC;
336                 drs_type = DRS_ELEC;
337                 break;
338         case GF_FIRE:
339                 dam = monspell_damage((MS_BR_FIRE), m_idx, DAM_ROLL);
340                 type_s = _("火炎", "fire");
341                 ms_type = MS_BR_FIRE;
342                 drs_type = DRS_FIRE;
343                 break;
344         case GF_COLD:
345                 dam = monspell_damage((MS_BR_COLD), m_idx, DAM_ROLL);
346                 type_s = _("冷気", "frost");
347                 ms_type = MS_BR_COLD;
348                 drs_type = DRS_COLD;
349                 break;
350         case GF_POIS:
351                 dam = monspell_damage((MS_BR_POIS), m_idx, DAM_ROLL);
352                 type_s = _("ガス", "gas");
353                 ms_type = MS_BR_POIS;
354                 drs_type = DRS_POIS;
355                 break;
356         case GF_NETHER:
357                 dam = monspell_damage((MS_BR_NETHER), m_idx, DAM_ROLL);
358                 type_s = _("地獄", "nether");
359                 ms_type = MS_BR_NETHER;
360                 drs_type = DRS_NETH;
361                 break;
362         case GF_LITE:
363                 dam = monspell_damage((MS_BR_LITE), m_idx, DAM_ROLL);
364                 type_s = _("閃光", "light");
365                 ms_type = MS_BR_LITE;
366                 drs_type = DRS_LITE;
367                 break;
368         case GF_DARK:
369                 dam = monspell_damage((MS_BR_DARK), m_idx, DAM_ROLL);
370                 type_s = _("暗黒", "darkness");
371                 ms_type = MS_BR_DARK;
372                 drs_type = DRS_DARK;
373                 break;
374         case GF_CONFUSION:
375                 dam = monspell_damage((MS_BR_CONF), m_idx, DAM_ROLL);
376                 type_s = _("混乱", "confusion");
377                 ms_type = MS_BR_CONF;
378                 drs_type = DRS_CONF;
379                 break;
380         case GF_SOUND:
381                 dam = monspell_damage((MS_BR_SOUND), m_idx, DAM_ROLL);
382                 type_s = _("轟音", "sound");
383                 ms_type = MS_BR_SOUND;
384                 drs_type = DRS_SOUND;
385                 break;
386         case GF_CHAOS:
387                 dam = monspell_damage((MS_BR_CHAOS), m_idx, DAM_ROLL);
388                 type_s = _("カオス", "chaos");
389                 ms_type = MS_BR_CHAOS;
390                 drs_type = DRS_CHAOS;
391                 break;
392         case GF_DISENCHANT:
393                 dam = monspell_damage((MS_BR_DISEN), m_idx, DAM_ROLL);
394                 type_s = _("劣化", "disenchantment");
395                 ms_type = MS_BR_DISEN;
396                 drs_type = DRS_DISEN;
397                 break;
398         case GF_NEXUS:
399                 dam = monspell_damage((MS_BR_NEXUS), m_idx, DAM_ROLL);
400                 type_s = _("因果混乱", "nexus");
401                 ms_type = MS_BR_NEXUS;
402                 drs_type = DRS_NEXUS;
403                 break;
404         case GF_TIME:
405                 dam = monspell_damage((MS_BR_TIME), m_idx, DAM_ROLL);
406                 type_s = _("時間逆転", "time");
407                 ms_type = MS_BR_TIME;
408                 smart_learn_aux = FALSE;
409                 break;
410         case GF_INERTIAL:
411                 dam = monspell_damage((MS_BR_INERTIA), m_idx, DAM_ROLL);
412                 type_s = _("遅鈍", "inertia");
413                 ms_type = MS_BR_INERTIA;
414                 smart_learn_aux = FALSE;
415                 break;
416         case GF_GRAVITY:
417                 dam = monspell_damage((MS_BR_GRAVITY), m_idx, DAM_ROLL);
418                 type_s = _("重力", "gravity");
419                 ms_type = MS_BR_GRAVITY;
420                 smart_learn_aux = FALSE;
421                 break;
422         case GF_SHARDS:
423                 dam = monspell_damage((MS_BR_SHARDS), m_idx, DAM_ROLL);
424                 type_s = _("破片", "shards");
425                 ms_type = MS_BR_SHARDS;
426                 drs_type = DRS_SHARD;
427                 break;
428         case GF_PLASMA:
429                 dam = monspell_damage((MS_BR_PLASMA), m_idx, DAM_ROLL);
430                 type_s = _("プラズマ", "plasma");
431                 ms_type = MS_BR_PLASMA;
432                 smart_learn_aux = FALSE;
433                 break;
434         case GF_FORCE:
435                 dam = monspell_damage((MS_BR_FORCE), m_idx, DAM_ROLL);
436                 type_s = _("フォース", "force");
437                 ms_type = MS_BR_FORCE;
438                 smart_learn_aux = FALSE;
439                 break;
440         case GF_MANA:
441                 dam = monspell_damage((MS_BR_MANA), m_idx, DAM_ROLL);
442                 type_s = _("魔力", "mana");
443                 ms_type = MS_BR_MANA;
444                 smart_learn_aux = FALSE;
445                 break;
446         case GF_NUKE:
447                 dam = monspell_damage((MS_BR_NUKE), m_idx, DAM_ROLL);
448                 type_s = _("放射性廃棄物", "toxic waste");
449                 ms_type = MS_BR_NUKE;
450                 drs_type = DRS_POIS;
451                 break;
452         case GF_DISINTEGRATE:
453                 dam = monspell_damage((MS_BR_DISI), m_idx, DAM_ROLL);
454                 type_s = _("分解", "disintegration");
455                 ms_type = MS_BR_DISI;
456                 smart_learn_aux = FALSE;
457                 break;
458         default:
459                 /* Do not reach here */
460                 dam = 0;
461                 type_s = _("不明", "Unknown");
462                 ms_type = MS_BR_ACID;
463                 smart_learn_aux = FALSE;
464                 break;
465         }
466
467         if (mon_to_player || (mon_to_mon && known && see_either))
468                 disturb(TRUE, TRUE);
469
470         if (m_ptr->r_idx == MON_JAIAN && GF_TYPE == GF_SOUND)
471         {
472                 msg_format(_("「ボォエ~~~~~~」", "'Booooeeeeee'"));
473         }
474         else if (m_ptr->r_idx == MON_BOTEI && GF_TYPE == GF_SHARDS)
475         {
476                 msg_format(_("「ボ帝ビルカッター!!!」", "'Boty-Build cutter!!!'"));
477         }
478         else if (p_ptr->blind)
479         {
480                 if (mon_to_player || (mon_to_mon && known && see_either))
481                         msg_format(_("%^sが何かのブレスを吐いた。", "%^s breathes."), m_name);
482         }
483         else
484         {
485                 if (mon_to_player)
486                 {
487                         msg_format(_("%^sが%^sのブレスを吐いた。", "%^s breathes %^s."), m_name, type_s);
488                 }
489                 else if (mon_to_mon && known && see_either)
490                 {
491                         _(msg_format("%^sが%^sに%^sのブレスを吐いた。", m_name, t_name, type_s),
492                           msg_format("%^s breathes %^s at %^s.", m_name, type_s, t_name));
493                 }
494         }
495
496         if (mon_to_mon && known && !see_either)
497                 mon_fight = TRUE;
498
499         sound(SOUND_BREATH);
500         breath(y, x, m_idx, GF_TYPE, dam, 0, TRUE, ms_type, TARGET_TYPE);
501         if (smart_learn_aux && mon_to_player)
502                 update_smart_learn(m_idx, drs_type);
503
504         return dam;
505 }
506
507 /*!
508 * @brief RF4_BA_NUKEの処理。放射能球。 /
509 * @param y 対象の地点のy座標
510 * @param x 対象の地点のx座標
511 * @param m_idx 呪文を唱えるモンスターID
512 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
513 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
514 * @return ダメージ量を返す。
515 */
516 HIT_POINT spell_RF4_BA_NUKE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
517 {
518         HIT_POINT dam;
519
520         monspell_message(m_idx, t_idx,
521                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
522                 _("%^sが放射能球を放った。", "%^s casts a ball of radiation."),
523                 _("%^sが%sに放射能球を放った。", "%^s casts a ball of radiation at %s."),
524                 TARGET_TYPE);
525
526         dam = monspell_damage((MS_BALL_NUKE), m_idx, DAM_ROLL);
527         breath(y, x, m_idx, GF_NUKE, dam, 2, FALSE, MS_BALL_NUKE, TARGET_TYPE);
528         if (TARGET_TYPE == MONSTER_TO_PLAYER)
529                 update_smart_learn(m_idx, DRS_POIS);
530
531         return dam;
532 }
533
534 /*!
535 * @brief RF4_BA_CHAOの処理。純ログルス。 /
536 * @param y 対象の地点のy座標
537 * @param x 対象の地点のx座標
538 * @param m_idx 呪文を唱えるモンスターID
539 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
540 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
541 * @return ダメージ量を返す。
542 */
543 HIT_POINT spell_RF4_BA_CHAO(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
544 {
545         HIT_POINT dam;
546
547         monspell_message(m_idx, t_idx,
548                 _("%^sが恐ろしげにつぶやいた。", "%^s mumbles frighteningly."),
549                 _("%^sが純ログルスを放った。", "%^s invokes a raw Logrus."),
550                 _("%^sが%sに純ログルスを放った。", "%^s invokes raw Logrus upon %s."),
551                 TARGET_TYPE);
552
553         dam = monspell_damage((MS_BALL_CHAOS), m_idx, DAM_ROLL);
554         breath(y, x, m_idx, GF_CHAOS, dam, 4, FALSE, MS_BALL_CHAOS, TARGET_TYPE);
555         if (TARGET_TYPE == MONSTER_TO_PLAYER)
556                 update_smart_learn(m_idx, DRS_CHAOS);
557
558         return dam;
559 }
560
561 /*!
562 * @brief RF5_BA_ACIDの処理。アシッド・ボール。 /
563 * @param y 対象の地点のy座標
564 * @param x 対象の地点のx座標
565 * @param m_idx 呪文を唱えるモンスターID
566 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
567 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
568 * @return ダメージ量を返す。
569 */
570 HIT_POINT spell_RF5_BA_ACID(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
571 {
572         HIT_POINT dam, rad;
573
574         monspell_message(m_idx, t_idx,
575                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
576                 _("%^sがアシッド・ボールの呪文を唱えた。", "%^s casts an acid ball."),
577                 _("%^sが%sに向かってアシッド・ボールの呪文を唱えた。",
578                   "%^s casts an acid ball at %s."),
579                 TARGET_TYPE);
580
581         rad = monster_is_powerful(m_idx) ? 4 : 2;
582         dam = monspell_damage((MS_BALL_ACID), m_idx, DAM_ROLL);
583         breath(y, x, m_idx, GF_ACID, dam, rad, FALSE, MS_BALL_ACID, TARGET_TYPE);
584         if (TARGET_TYPE == MONSTER_TO_PLAYER)
585                 update_smart_learn(m_idx, DRS_ACID);
586
587         return dam;
588 }
589
590 /*!
591 * @brief RF5_BA_ELECの処理。サンダー・ボール。 /
592 * @param y 対象の地点のy座標
593 * @param x 対象の地点のx座標
594 * @param m_idx 呪文を唱えるモンスターID
595 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
596 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
597 * @return ダメージ量を返す。
598 */
599 HIT_POINT spell_RF5_BA_ELEC(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
600 {
601         HIT_POINT dam, rad;
602
603         monspell_message(m_idx, t_idx,
604                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
605                 _("%^sがサンダー・・ボールの呪文を唱えた。", "%^s casts a lightning ball."),
606                 _("%^sが%sに向かってサンダー・ボールの呪文を唱えた。", 
607                   "%^s casts a lightning ball at %s."),
608                 TARGET_TYPE);
609
610         rad = monster_is_powerful(m_idx) ? 4 : 2;
611         dam = monspell_damage((MS_BALL_ELEC), m_idx, DAM_ROLL);
612         breath(y, x, m_idx, GF_ELEC, dam, rad, FALSE, MS_BALL_ELEC, TARGET_TYPE);
613         if (TARGET_TYPE == MONSTER_TO_PLAYER)
614                 update_smart_learn(m_idx, DRS_ELEC);
615
616         return dam;
617 }
618
619 /*!
620 * @brief RF5_BA_FIREの処理。ファイア・ボール。 /
621 * @param y 対象の地点のy座標
622 * @param x 対象の地点のx座標
623 * @param m_idx 呪文を唱えるモンスターID
624 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
625 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
626 * @return ダメージ量を返す。
627 */
628 HIT_POINT spell_RF5_BA_FIRE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
629 {
630         HIT_POINT dam, rad;
631         monster_type    *m_ptr = &m_list[m_idx];
632
633         if (m_ptr->r_idx == MON_ROLENTO)
634         {
635                 monspell_message(m_idx, t_idx,
636                         _("%sが何かを投げた。", "%^s throws something."),
637                         _("%sは手榴弾を投げた。", "%^s throws a hand grenade."),
638                         _("%^sが%^sに向かって手榴弾を投げた。", "%^s throws a hand grenade."),
639                         TARGET_TYPE);
640         }
641         else
642         {
643                 monspell_message(m_idx, t_idx,
644                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
645                         _("%^sがファイア・ボールの呪文を唱えた。", "%^s casts a fire ball."),
646                         _("%^sが%sに向かってファイア・ボールの呪文を唱えた。",
647                         "%^s casts a fire ball at %s."),
648                         TARGET_TYPE);
649         }
650         rad = monster_is_powerful(m_idx) ? 4 : 2;
651         dam = monspell_damage((MS_BALL_FIRE), m_idx, DAM_ROLL);
652         breath(y, x, m_idx, GF_FIRE, dam, rad, FALSE, MS_BALL_FIRE, TARGET_TYPE);
653         if (TARGET_TYPE == MONSTER_TO_PLAYER)
654                 update_smart_learn(m_idx, DRS_FIRE);
655
656         return dam;
657 }
658
659 /*!
660 * @brief RF5_BA_COLDの処理。アイス・ボール。 /
661 * @param y 対象の地点のy座標
662 * @param x 対象の地点のx座標
663 * @param m_idx 呪文を唱えるモンスターID
664 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
665 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
666 * @return ダメージ量を返す。
667 */
668 HIT_POINT spell_RF5_BA_COLD(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
669 {
670         HIT_POINT dam, rad;
671
672         monspell_message(m_idx, t_idx,
673                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
674                 _("%^sがアイス・ボールの呪文を唱えた。", "%^s casts a frost ball."),
675                 _("%^sが%sに向かってアイス・ボールの呪文を唱えた。",
676                 "%^s casts a frost ball at %s."),
677                 TARGET_TYPE);
678
679         rad = monster_is_powerful(m_idx) ? 4 : 2;
680         dam = monspell_damage((MS_BALL_COLD), m_idx, DAM_ROLL);
681         breath(y, x, m_idx, GF_COLD, dam, rad, FALSE, MS_BALL_COLD, TARGET_TYPE);
682         if (TARGET_TYPE == MONSTER_TO_PLAYER)
683                 update_smart_learn(m_idx, DRS_COLD);
684
685         return dam;
686 }
687
688 /*!
689 * @brief RF5_BA_POISの処理。悪臭雲。 /
690 * @param y 対象の地点のy座標
691 * @param x 対象の地点のx座標
692 * @param m_idx 呪文を唱えるモンスターID
693 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
694 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
695 * @return ダメージ量を返す。
696 */
697 HIT_POINT spell_RF5_BA_POIS(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
698 {
699         HIT_POINT dam;
700
701         monspell_message(m_idx, t_idx,
702                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
703                 _("%^sが悪臭雲の呪文を唱えた。", "%^s casts a stinking cloud."),
704                 _("%^sが%sに向かって悪臭雲の呪文を唱えた。", "%^s casts a stinking cloud at %s."),
705                 TARGET_TYPE);
706
707         dam = monspell_damage((MS_BALL_POIS), m_idx, DAM_ROLL);
708         breath(y, x, m_idx, GF_POIS, dam, 2, FALSE, MS_BALL_POIS, TARGET_TYPE);
709         if (TARGET_TYPE == MONSTER_TO_PLAYER)
710                 update_smart_learn(m_idx, DRS_POIS);
711
712         return dam;
713 }
714
715 /*!
716 * @brief RF5_BA_NETHの処理。地獄球。 /
717 * @param y 対象の地点のy座標
718 * @param x 対象の地点のx座標
719 * @param m_idx 呪文を唱えるモンスターID
720 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
721 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
722 * @return ダメージ量を返す。
723 */
724 HIT_POINT spell_RF5_BA_NETH(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
725 {
726         HIT_POINT dam;
727
728         monspell_message(m_idx, t_idx,
729                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
730                 _("%^sが地獄球の呪文を唱えた。", "%^s casts a nether ball."),
731                 _("%^sが%sに向かって地獄球の呪文を唱えた。", "%^s casts a nether ball at %s."),
732                 TARGET_TYPE);
733
734         dam = monspell_damage((MS_BALL_NETHER), m_idx, DAM_ROLL);
735         breath(y, x, m_idx, GF_NETHER, dam, 2, FALSE, MS_BALL_NETHER, TARGET_TYPE);
736         if (TARGET_TYPE == MONSTER_TO_PLAYER)
737                 update_smart_learn(m_idx, DRS_NETH);
738
739         return dam;
740 }
741
742 /*!
743 * @brief RF5_BA_WATEの処理。ウォーター・ボール。 /
744 * @param y 対象の地点のy座標
745 * @param x 対象の地点のx座標
746 * @param m_idx 呪文を唱えるモンスターID
747 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
748 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
749 * @return ダメージ量を返す。
750 */
751 HIT_POINT spell_RF5_BA_WATE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
752 {
753         HIT_POINT dam;
754         bool known = monster_near_player(m_idx, t_idx);
755         bool see_either = see_monster(m_idx) || see_monster(t_idx);
756         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
757         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
758         GAME_TEXT t_name[MAX_NLEN];
759         monster_name(t_idx, t_name);
760
761
762         monspell_message(m_idx, t_idx,
763                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
764                 _("%^sが流れるような身振りをした。", "%^s gestures fluidly."),
765                 _("%^sが%sに対して流れるような身振りをした。", "%^s gestures fluidly at %s."),
766                 TARGET_TYPE);
767
768         if (mon_to_player)
769         {
770                 msg_format(_("あなたは渦巻きに飲み込まれた。", "You are engulfed in a whirlpool."));
771         }
772         else if (mon_to_mon && known && see_either && !p_ptr->blind)
773         {
774                 msg_format(_("%^sは渦巻に飲み込まれた。", "%^s is engulfed in a whirlpool."), t_name);
775         }
776
777         dam = monspell_damage((MS_BALL_WATER), m_idx, DAM_ROLL);
778         breath(y, x, m_idx, GF_WATER, dam, 4, FALSE, MS_BALL_WATER, TARGET_TYPE);
779         return dam;
780 }
781
782 /*!
783 * @brief RF5_BA_MANAの処理。魔力の嵐。 /
784 * @param y 対象の地点のy座標
785 * @param x 対象の地点のx座標
786 * @param m_idx 呪文を唱えるモンスターID
787 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
788 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
789 * @return ダメージ量を返す。
790 */
791 HIT_POINT spell_RF5_BA_MANA(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
792 {
793         HIT_POINT dam;
794
795         monspell_message(m_idx, t_idx,
796                 _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
797                 _("%^sが魔力の嵐の呪文を念じた。", "%^s invokes a mana storm."),
798                 _("%^sが%sに対して魔力の嵐の呪文を念じた。", "%^s invokes a mana storm upon %s."),
799                 TARGET_TYPE);
800
801         dam = monspell_damage((MS_BALL_MANA), m_idx, DAM_ROLL);
802         breath(y, x, m_idx, GF_MANA, dam, 4, FALSE, MS_BALL_MANA, TARGET_TYPE);
803         return dam;
804 }
805
806 /*!
807 * @brief RF5_BA_DARKの処理。暗黒の嵐。 /
808 * @param y 対象の地点のy座標
809 * @param x 対象の地点のx座標
810 * @param m_idx 呪文を唱えるモンスターID
811 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
812 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
813 * @return ダメージ量を返す。
814 */
815 HIT_POINT spell_RF5_BA_DARK(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
816 {
817         HIT_POINT dam;
818
819         monspell_message(m_idx, t_idx,
820                 _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
821                 _("%^sが暗黒の嵐の呪文を念じた。", "%^s invokes a darkness storm."),
822                 _("%^sが%sに対して暗黒の嵐の呪文を念じた。", "%^s invokes a darkness storm upon %s."),
823                 TARGET_TYPE);
824
825         dam = monspell_damage((MS_BALL_DARK), m_idx, DAM_ROLL);
826         breath(y, x, m_idx, GF_DARK, dam, 4, FALSE, MS_BALL_DARK, TARGET_TYPE);
827         if (TARGET_TYPE == MONSTER_TO_PLAYER)
828                 update_smart_learn(m_idx, DRS_DARK);
829
830         return dam;
831 }
832
833 /*!
834 * @brief RF5_DRAIN_MANAの処理。魔力吸収。 /
835 * @param y 対象の地点のy座標
836 * @param x 対象の地点のx座標
837 * @param m_idx 呪文を唱えるモンスターID
838 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
839 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
840 * @return ダメージ量を返す。
841 */
842 HIT_POINT spell_RF5_DRAIN_MANA(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
843 {
844         HIT_POINT dam;
845         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
846         monster_name(m_idx, m_name);
847         monster_name(t_idx, t_name);
848
849
850         if (TARGET_TYPE == MONSTER_TO_PLAYER)
851         {
852                 disturb(TRUE, TRUE);
853         }
854         else if (TARGET_TYPE == MONSTER_TO_MONSTER && see_monster(m_idx))
855         { 
856                 /* Basic message */
857                 msg_format(_("%^sは精神エネルギーを%sから吸いとった。", "%^s draws psychic energy from %s."), m_name, t_name);
858         }
859
860         dam = monspell_damage((MS_DRAIN_MANA), m_idx, DAM_ROLL);
861         breath(y, x, m_idx, GF_DRAIN_MANA, dam, 0, FALSE, MS_DRAIN_MANA, TARGET_TYPE);
862         if (TARGET_TYPE == MONSTER_TO_PLAYER)
863                 update_smart_learn(m_idx, DRS_MANA);
864         
865         return dam;
866 }
867
868 /*!
869 * @brief RF5_MIND_BLASTの処理。精神攻撃。 /
870 * @param y 対象の地点のy座標
871 * @param x 対象の地点のx座標
872 * @param m_idx 呪文を唱えるモンスターID
873 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
874 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
875 * @return ダメージ量を返す。
876 */
877 HIT_POINT spell_RF5_MIND_BLAST(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
878 {
879         monster_type    *m_ptr = &m_list[m_idx];
880         bool seen = (!p_ptr->blind && m_ptr->ml);
881         HIT_POINT dam;
882         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
883         monster_name(m_idx, m_name);
884         monster_name(t_idx, t_name);
885
886
887         if (TARGET_TYPE == MONSTER_TO_PLAYER)
888         {
889                 disturb(TRUE, TRUE);
890                 if (!seen)
891                         msg_print(_("何かがあなたの精神に念を放っているようだ。", "You feel something focusing on your mind."));
892                 else
893                         msg_format(_("%^sがあなたの瞳をじっとにらんでいる。", "%^s gazes deep into your eyes."), m_name);
894         }
895         else if (TARGET_TYPE == MONSTER_TO_MONSTER && see_monster(m_idx))
896         {
897                 msg_format(_("%^sは%sをじっと睨んだ。", "%^s gazes intently at %s."), m_name, t_name);
898         }
899
900         dam = monspell_damage((MS_MIND_BLAST), m_idx, DAM_ROLL);
901         breath(y, x, m_idx, GF_MIND_BLAST, dam, 0, FALSE, MS_MIND_BLAST, TARGET_TYPE);
902         return dam;
903 }
904
905 /*!
906 * @brief RF5_BRAIN_SMASHの処理。脳攻撃。 /
907 * @param y 対象の地点のy座標
908 * @param x 対象の地点のx座標
909 * @param m_idx 呪文を唱えるモンスターID
910 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
911 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
912 * @return ダメージ量を返す。
913 */
914 HIT_POINT spell_RF5_BRAIN_SMASH(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
915 {
916         monster_type *m_ptr = &m_list[m_idx];
917         bool seen = (!p_ptr->blind && m_ptr->ml);
918         HIT_POINT dam;
919         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
920         monster_name(m_idx, m_name);
921         monster_name(t_idx, t_name);
922
923
924         if (TARGET_TYPE == MONSTER_TO_PLAYER)
925         {
926                 disturb(TRUE, TRUE);
927                 if (!seen)
928                         msg_print(_("何かがあなたの精神に念を放っているようだ。", "You feel something focusing on your mind."));
929                 else
930                         msg_format(_("%^sがあなたの瞳をじっとにらんでいる。", "%^s gazes deep into your eyes."), m_name);
931         }
932         else if (TARGET_TYPE == MONSTER_TO_MONSTER && see_monster(m_idx))
933         {
934                 msg_format(_("%^sは%sをじっと睨んだ。", "%^s gazes intently at %s."), m_name, t_name);
935         }
936
937         dam = monspell_damage((MS_BRAIN_SMASH), m_idx, DAM_ROLL);
938         breath(y, x, m_idx, GF_BRAIN_SMASH, dam, 0, FALSE, MS_BRAIN_SMASH, TARGET_TYPE);
939         return dam;
940 }
941
942 /*!
943 * @brief RF5_CAUSE_*のメッセージ処理関数 /
944 * @param GF_TYPE 攻撃に使用する属性
945 * @param dam 攻撃に使用するダメージ量
946 * @param y 対象の地点のy座標
947 * @param x 対象の地点のx座標
948 * @param m_idx 呪文を唱えるモンスターID
949 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
950 * @param msg1 対プレイヤー、盲目時メッセージ
951 * @param msg2 対プレイヤー、非盲目時メッセージ
952 * @param msg3 対モンスターのメッセージ
953 * @param MS_TYPE 呪文の番号
954 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
955 * @return ダメージ量を返す。
956 */
957 void spell_RF5_CAUSE(int GF_TYPE, HIT_POINT dam, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, concptr msg3, int MS_TYPE, int TARGET_TYPE)
958 {
959         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
960         monster_name(m_idx, m_name);
961         monster_name(t_idx, t_name);
962
963         if (TARGET_TYPE == MONSTER_TO_PLAYER)
964         {
965                 disturb(TRUE, TRUE);
966                 if (p_ptr->blind)
967                         msg_format(msg1, m_name);
968                 else
969                         msg_format(msg2, m_name);
970         }
971         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
972         {
973                 if (see_monster(m_idx))
974                 {
975                         msg_format(msg3, m_name, t_name);
976                 }
977                 else
978                 {
979                         mon_fight = TRUE;
980                 }
981         }
982         breath(y, x, m_idx, GF_TYPE, dam, 0, FALSE, MS_TYPE, TARGET_TYPE);
983 }
984
985 /*!
986 * @brief RF5_CAUSE_1の処理。軽傷の呪い。 /
987 * @param y 対象の地点のy座標
988 * @param x 対象の地点のx座標
989 * @param m_idx 呪文を唱えるモンスターID
990 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
991 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
992 * @return ダメージ量を返す。
993 */
994 HIT_POINT spell_RF5_CAUSE_1(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
995 {
996         concptr msg1, msg2, msg3;
997         HIT_POINT dam;
998         dam = monspell_damage((MS_CAUSE_1), m_idx, DAM_ROLL);
999
1000         msg1 = _("%^sが何かをつぶやいた。", "%^s mumbles.");
1001         msg2 = _("%^sがあなたを指さして呪った。", "%^s points at you and curses.");
1002         msg3 = _("%^sは%sを指さして呪いをかけた。", "%^s points at %s and curses.");
1003         
1004         spell_RF5_CAUSE(GF_CAUSE_1, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, MS_CAUSE_1, TARGET_TYPE);
1005         return dam;
1006 }
1007
1008 /*!
1009 * @brief RF5_CAUSE_2の処理。重傷の呪い。 /
1010 * @param y 対象の地点のy座標
1011 * @param x 対象の地点のx座標
1012 * @param m_idx 呪文を唱えるモンスターID
1013 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1014 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1015 * @return ダメージ量を返す。
1016 */
1017 HIT_POINT spell_RF5_CAUSE_2(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1018 {
1019         concptr msg1, msg2, msg3;
1020         HIT_POINT dam;
1021         dam = monspell_damage((MS_CAUSE_2), m_idx, DAM_ROLL);
1022
1023         msg1 = _("%^sが何かをつぶやいた。", "%^s mumbles.");
1024         msg2 = _("%^sがあなたを指さして恐ろしげに呪った。", "%^s points at you and curses horribly.");
1025         msg3 = _("%^sは%sを指さして恐ろしげに呪いをかけた。", "%^s points at %s and curses horribly.");
1026
1027         spell_RF5_CAUSE(GF_CAUSE_2, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, MS_CAUSE_2, TARGET_TYPE);
1028         return dam;
1029 }
1030
1031 /*!
1032 * @brief RF5_CAUSE_3の処理。致命傷の呪い。 /
1033 * @param y 対象の地点のy座標
1034 * @param x 対象の地点のx座標
1035 * @param m_idx 呪文を唱えるモンスターID
1036 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1037 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1038 * @return ダメージ量を返す。
1039 */
1040 HIT_POINT spell_RF5_CAUSE_3(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1041 {
1042         concptr msg1, msg2, msg3;
1043         HIT_POINT dam;
1044         dam = monspell_damage((MS_CAUSE_3), m_idx, DAM_ROLL);
1045
1046         msg1 = _("%^sが何かを大声で叫んだ。", "%^s mumbles loudly.");
1047         msg2 = _("%^sがあなたを指さして恐ろしげに呪文を唱えた!", "%^s points at you, incanting terribly!");
1048         msg3 = _("%^sは%sを指さし、恐ろしげに呪文を唱えた!", "%^s points at %s, incanting terribly!");
1049
1050         spell_RF5_CAUSE(GF_CAUSE_3, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, MS_CAUSE_3, TARGET_TYPE);
1051         return dam;
1052 }
1053
1054 /*!
1055 * @brief RF5_CAUSE_4の処理。秘孔を突く。 /
1056 * @param y 対象の地点のy座標
1057 * @param x 対象の地点のx座標
1058 * @param m_idx 呪文を唱えるモンスターID
1059 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1060 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1061 * @return ダメージ量を返す。
1062 */
1063 HIT_POINT spell_RF5_CAUSE_4(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1064 {
1065         concptr msg1, msg2, msg3;
1066         HIT_POINT dam;
1067         dam = monspell_damage((MS_CAUSE_4), m_idx, DAM_ROLL);
1068
1069         msg1 = _("%^sが「お前は既に死んでいる」と叫んだ。", "%^s screams the word 'DIE!'");
1070         msg2 = _("%^sがあなたの秘孔を突いて「お前は既に死んでいる」と叫んだ。", "%^s points at you, screaming the word DIE!");
1071         msg3 = _("%^sが%sの秘孔を突いて、「お前は既に死んでいる」と叫んだ。", "%^s points at %s, screaming the word, 'DIE!'");
1072
1073         spell_RF5_CAUSE(GF_CAUSE_4, dam, y, x, m_idx, t_idx, msg1, msg2, msg3, MS_CAUSE_4, TARGET_TYPE);
1074         return dam;
1075 }
1076
1077 /*!
1078 * @brief RF5_BO_ACIDの処理。アシッド・ボルト。 /
1079 * @param y 対象の地点のy座標
1080 * @param x 対象の地点のx座標
1081 * @param m_idx 呪文を唱えるモンスターID
1082 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1083 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1084 * @return ダメージ量を返す。
1085 */
1086 HIT_POINT spell_RF5_BO_ACID(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1087 {
1088         HIT_POINT dam;
1089
1090         monspell_message(m_idx, t_idx,
1091                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1092                 _("%^sがアシッド・ボルトの呪文を唱えた。", "%^s casts a acid bolt."),
1093                 _("%sが%sに向かってアシッド・ボルトの呪文を唱えた。", "%^s casts an acid bolt at %s."),
1094                 TARGET_TYPE);
1095
1096         dam = monspell_damage((MS_BOLT_ACID), m_idx, DAM_ROLL);
1097         bolt(m_idx, y, x, GF_ACID, dam, MS_BOLT_ACID, TARGET_TYPE);
1098         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1099         {
1100                 update_smart_learn(m_idx, DRS_ACID);
1101                 update_smart_learn(m_idx, DRS_REFLECT);
1102         }
1103         return dam;
1104 }
1105
1106 /*!
1107 * @brief RF5_BO_ELECの処理。サンダー・ボルト。 /
1108 * @param y 対象の地点のy座標
1109 * @param x 対象の地点のx座標
1110 * @param m_idx 呪文を唱えるモンスターID
1111 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1112 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1113 * @return ダメージ量を返す。
1114 */
1115 HIT_POINT spell_RF5_BO_ELEC(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1116 {
1117         HIT_POINT dam;
1118
1119         monspell_message(m_idx, t_idx,
1120                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1121                 _("%^sがサンダー・ボルトの呪文を唱えた。", "%^s casts a lightning bolt."),
1122                 _("%^sが%sに向かってサンダー・ボルトの呪文を唱えた。", "%^s casts a lightning bolt at %s."),
1123                 TARGET_TYPE);
1124
1125         dam = monspell_damage((MS_BOLT_ELEC), m_idx, DAM_ROLL);
1126         bolt(m_idx, y, x, GF_ELEC, dam, MS_BOLT_ELEC, TARGET_TYPE);
1127         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1128         {
1129                 update_smart_learn(m_idx, DRS_ELEC);
1130                 update_smart_learn(m_idx, DRS_REFLECT);
1131         }
1132         return dam;
1133 }
1134
1135 /*!
1136 * @brief RF5_BO_FIREの処理。ファイア・ボルト。 /
1137 * @param y 対象の地点のy座標
1138 * @param x 対象の地点のx座標
1139 * @param m_idx 呪文を唱えるモンスターID
1140 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1141 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1142 * @return ダメージ量を返す。
1143 */
1144 HIT_POINT spell_RF5_BO_FIRE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1145 {
1146         HIT_POINT dam;
1147
1148         monspell_message(m_idx, t_idx,
1149                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1150                 _("%^sがファイア・ボルトの呪文を唱えた。", "%^s casts a fire bolt."),
1151                 _("%^sが%sに向かってファイア・ボルトの呪文を唱えた。", "%^s casts a fire bolt at %s."),
1152                 TARGET_TYPE);
1153
1154         dam = monspell_damage((MS_BOLT_FIRE), m_idx, DAM_ROLL);
1155         bolt(m_idx, y, x, GF_FIRE, dam, MS_BOLT_FIRE, TARGET_TYPE);
1156         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1157         {
1158                 update_smart_learn(m_idx, DRS_FIRE);
1159                 update_smart_learn(m_idx, DRS_REFLECT);
1160         }
1161         return dam;
1162 }
1163
1164 /*!
1165 * @brief RF5_BO_COLDの処理。アイス・ボルト。 /
1166 * @param y 対象の地点のy座標
1167 * @param x 対象の地点のx座標
1168 * @param m_idx 呪文を唱えるモンスターID
1169 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1170 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1171 * @return ダメージ量を返す。
1172 */
1173 HIT_POINT spell_RF5_BO_COLD(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1174 {
1175         HIT_POINT dam;
1176
1177         monspell_message(m_idx, t_idx,
1178                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1179                 _("%^sがアイス・ボルトの呪文を唱えた。", "%^s casts a frost bolt."),
1180                 _("%^sが%sに向かってアイス・ボルトの呪文を唱えた。", "%^s casts a frost bolt at %s."),
1181                 TARGET_TYPE);
1182
1183         dam = monspell_damage((MS_BOLT_COLD), m_idx, DAM_ROLL);
1184         bolt(m_idx, y, x, GF_COLD, dam, MS_BOLT_COLD, TARGET_TYPE);
1185         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1186         {
1187                 update_smart_learn(m_idx, DRS_COLD);
1188                 update_smart_learn(m_idx, DRS_REFLECT);
1189         }
1190         return dam;
1191 }
1192
1193 /*!
1194 * @brief RF5_BA_LITEの処理。スターバースト。 /
1195 * @param y 対象の地点のy座標
1196 * @param x 対象の地点のx座標
1197 * @param m_idx 呪文を唱えるモンスターID
1198 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1199 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1200 * @return ダメージ量を返す。
1201 */
1202 HIT_POINT spell_RF5_BA_LITE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1203 {
1204         HIT_POINT dam;
1205
1206         monspell_message(m_idx, t_idx,
1207                 _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
1208                 _("%^sがスターバーストの呪文を念じた。", "%^s invokes a starburst."),
1209                 _("%^sが%sに対してスターバーストの呪文を念じた。", "%^s invokes a starburst upon %s."),
1210                 TARGET_TYPE);
1211
1212         dam = monspell_damage((MS_STARBURST), m_idx, DAM_ROLL);
1213         breath(y, x, m_idx, GF_LITE, dam, 4, FALSE, MS_STARBURST, TARGET_TYPE);
1214         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1215                 update_smart_learn(m_idx, DRS_LITE);
1216
1217         return dam;
1218 }
1219
1220 /*!
1221 * @brief RF5_BO_NETHの処理。地獄の矢。 /
1222 * @param y 対象の地点のy座標
1223 * @param x 対象の地点のx座標
1224 * @param m_idx 呪文を唱えるモンスターID
1225 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1226 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1227 * @return ダメージ量を返す。
1228 */
1229 HIT_POINT spell_RF5_BO_NETH(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1230 {
1231         HIT_POINT dam;
1232
1233         monspell_message(m_idx, t_idx,
1234                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1235                 _("%^sが地獄の矢の呪文を唱えた。", "%^s casts a nether bolt."),
1236                 _("%^sが%sに向かって地獄の矢の呪文を唱えた。", "%^s casts a nether bolt at %s."),
1237                 TARGET_TYPE);
1238
1239         dam = monspell_damage((MS_BOLT_NETHER), m_idx, DAM_ROLL);
1240         bolt(m_idx, y, x, GF_NETHER, dam, MS_BOLT_NETHER, TARGET_TYPE);
1241         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1242         {
1243                 update_smart_learn(m_idx, DRS_NETH);
1244                 update_smart_learn(m_idx, DRS_REFLECT);
1245         }
1246         return dam;
1247 }
1248
1249 /*!
1250 * @brief RF5_BO_WATEの処理。ウォーター・ボルト。 /
1251 * @param y 対象の地点のy座標
1252 * @param x 対象の地点のx座標
1253 * @param m_idx 呪文を唱えるモンスターID
1254 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1255 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1256 * @return ダメージ量を返す。
1257 */
1258 HIT_POINT spell_RF5_BO_WATE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1259 {
1260         HIT_POINT dam;
1261
1262         monspell_message(m_idx, t_idx,
1263                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1264                 _("%^sがウォーター・ボルトの呪文を唱えた。", "%^s casts a water bolt."),
1265                 _("%^sが%sに向かってウォーター・ボルトの呪文を唱えた。", "%^s casts a water bolt at %s."),
1266                 TARGET_TYPE);
1267
1268         dam = monspell_damage((MS_BOLT_WATER), m_idx, DAM_ROLL);
1269         bolt(m_idx, y, x, GF_WATER, dam, MS_BOLT_WATER, TARGET_TYPE);
1270         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1271         {
1272                 update_smart_learn(m_idx, DRS_REFLECT);
1273         }
1274         return dam;
1275 }
1276
1277 /*!
1278 * @brief RF5_BO_MANAの処理。魔力の矢。 /
1279 * @param y 対象の地点のy座標
1280 * @param x 対象の地点のx座標
1281 * @param m_idx 呪文を唱えるモンスターID
1282 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1283 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1284 * @return ダメージ量を返す。
1285 */
1286 HIT_POINT spell_RF5_BO_MANA(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1287 {
1288         HIT_POINT dam;
1289
1290         monspell_message(m_idx, t_idx,
1291                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1292                 _("%^sが魔力の矢の呪文を唱えた。", "%^s casts a mana bolt."),
1293                 _("%^sが%sに向かって魔力の矢の呪文を唱えた。", "%^s casts a mana bolt at %s."),
1294                 TARGET_TYPE);
1295
1296         dam = monspell_damage((MS_BOLT_MANA), m_idx, DAM_ROLL);
1297         bolt(m_idx, y, x, GF_MANA, dam, MS_BOLT_MANA, TARGET_TYPE);
1298         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1299         {
1300                 update_smart_learn(m_idx, DRS_REFLECT);
1301         }
1302         return dam;
1303 }
1304
1305 /*!
1306 * @brief RF5_BO_PLASの処理。プラズマ・ボルト。 /
1307 * @param y 対象の地点のy座標
1308 * @param x 対象の地点のx座標
1309 * @param m_idx 呪文を唱えるモンスターID
1310 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1311 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1312 * @return ダメージ量を返す。
1313 */
1314 HIT_POINT spell_RF5_BO_PLAS(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1315 {
1316         HIT_POINT dam;
1317
1318         monspell_message(m_idx, t_idx,
1319                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1320                 _("%^sがプラズマ・ボルトの呪文を唱えた。", "%^s casts a plasma bolt."),
1321                 _("%^sが%sに向かってプラズマ・ボルトの呪文を唱えた。", "%^s casts a plasma bolt at %s."),
1322                 TARGET_TYPE);
1323
1324         dam = monspell_damage((MS_BOLT_PLASMA), m_idx, DAM_ROLL);
1325         bolt(m_idx, y, x, GF_PLASMA, dam, MS_BOLT_PLASMA, TARGET_TYPE);
1326         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1327         {
1328                 update_smart_learn(m_idx, DRS_REFLECT);
1329         }
1330         return dam;
1331 }
1332
1333 /*!
1334 * @brief RF5_BO_ICEEの処理。極寒の矢。 /
1335 * @param y 対象の地点のy座標
1336 * @param x 対象の地点のx座標
1337 * @param m_idx 呪文を唱えるモンスターID
1338 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1339 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1340 * @return ダメージ量を返す。
1341 */
1342 HIT_POINT spell_RF5_BO_ICEE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1343 {
1344         HIT_POINT dam;
1345
1346         monspell_message(m_idx, t_idx,
1347                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1348                 _("%^sが極寒の矢の呪文を唱えた。", "%^s casts an ice bolt."),
1349                 _("%^sが%sに向かって極寒の矢の呪文を唱えた。", "%^s casts an ice bolt at %s."),
1350                 TARGET_TYPE);
1351
1352         dam = monspell_damage((MS_BOLT_ICE), m_idx, DAM_ROLL);
1353         bolt(m_idx, y, x, GF_ICE, dam, MS_BOLT_ICE, TARGET_TYPE);
1354         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1355         {
1356                 update_smart_learn(m_idx, DRS_COLD);
1357                 update_smart_learn(m_idx, DRS_REFLECT);
1358         }
1359         return dam;
1360 }
1361
1362 /*!
1363 * @brief RF5_MISSILEの処理。マジック・ミサイル。 /
1364 * @param y 対象の地点のy座標
1365 * @param x 対象の地点のx座標
1366 * @param m_idx 呪文を唱えるモンスターID
1367 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1368 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1369 * @return ダメージ量を返す。
1370 */
1371 HIT_POINT spell_RF5_MISSILE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1372 {
1373         HIT_POINT dam;
1374
1375         monspell_message(m_idx, t_idx,
1376                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1377                 _("%^sがマジック・ミサイルの呪文を唱えた。", "%^s casts a magic missile."),
1378                 _("%^sが%sに向かってマジック・ミサイルの呪文を唱えた。", "%^s casts a magic missile at %s."),
1379                 TARGET_TYPE);
1380
1381         dam = monspell_damage((MS_MAGIC_MISSILE), m_idx, DAM_ROLL);
1382         bolt(m_idx, y, x, GF_MISSILE, dam, MS_MAGIC_MISSILE, TARGET_TYPE);
1383         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1384         {
1385                 update_smart_learn(m_idx, DRS_REFLECT);
1386         }
1387         return dam;
1388 }
1389
1390 /*!
1391 * @brief 状態異常呪文のメッセージ処理関数。 /
1392 * @param m_idx 呪文を唱えるモンスターID
1393 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1394 * @param msg1 対プレイヤーなら盲目時メッセージ。対モンスターなら通常時メッセージ。
1395 * @param msg2 対プレイヤーなら非盲目時メッセージ。対モンスターなら耐性有メッセージ。
1396 * @param msg3 対プレイヤーなら耐性有メッセージ。対モンスターなら抵抗時メッセージ。
1397 * @param msg4 対プレイヤーなら抵抗時メッセージ。対モンスターなら成功時メッセージ。
1398 * @param resist 耐性の有無を判別するフラグ
1399 * @param saving_throw 抵抗に成功したか判別するフラグ
1400 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1401 */
1402 void spell_badstatus_message(MONSTER_IDX m_idx, MONSTER_IDX t_idx, concptr msg1, concptr msg2, concptr msg3, concptr msg4, bool resist, bool saving_throw, int TARGET_TYPE)
1403 {
1404         bool see_either = see_monster(m_idx) || see_monster(t_idx);
1405         bool see_t = see_monster(t_idx);
1406         bool known = monster_near_player(m_idx, t_idx);
1407         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
1408         monster_name(m_idx, m_name);
1409         monster_name(t_idx, t_name);
1410
1411         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1412         {
1413                 disturb(TRUE, TRUE);
1414                 if (p_ptr->blind)
1415                         msg_format(msg1, m_name);
1416                 else
1417                         msg_format(msg2, m_name);
1418
1419                 if (resist)
1420                 {
1421                         msg_print(msg3);
1422                 }
1423                 else if (saving_throw)
1424                 {
1425                         msg_print(msg4);
1426                 }
1427         }
1428         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1429         {
1430                 if (known)
1431                 {
1432                         if (see_either)
1433                         {
1434                                 msg_format(msg1, m_name, t_name);
1435                         }
1436                         else
1437                         {
1438                                 mon_fight = TRUE;
1439                         }
1440                 }
1441
1442                 if (resist)
1443                 {
1444                         if (see_t) msg_format(msg2, t_name);
1445                 }
1446                 else if (saving_throw)
1447                 {
1448                         if (see_t) msg_format(msg3, t_name);
1449                 }
1450                 else
1451                 {
1452                         if (see_t) msg_format(msg4, t_name);
1453                 }
1454                 monster_wakeup(t_idx);
1455         }
1456 }
1457
1458 /*!
1459  * @brief RF5_SCAREの処理。恐怖。 /
1460  * @param m_idx 呪文を唱えるモンスターID
1461  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1462  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1463  */
1464 void spell_RF5_SCARE(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1465 {
1466         monster_type    *t_ptr = &m_list[t_idx];
1467         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
1468         int rlev = monster_level_idx(m_idx);
1469         bool resist, saving_throw;
1470
1471         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1472         {
1473                 resist = p_ptr->resist_fear;
1474                 saving_throw = (randint0(100 + rlev / 2) < p_ptr->skill_sav);
1475                 spell_badstatus_message(m_idx, t_idx,
1476                         _("%^sが何かをつぶやくと、恐ろしげな音が聞こえた。", "%^s mumbles, and you hear scary noises."),
1477                         _("%^sが恐ろしげな幻覚を作り出した。", "%^s casts a fearful illusion."),
1478                         _("しかし恐怖に侵されなかった。", "You refuse to be frightened."),
1479                         _("しかし恐怖に侵されなかった。", "You refuse to be frightened."),
1480                         resist, saving_throw, TARGET_TYPE);
1481
1482                 if (!resist && !saving_throw)
1483                 {
1484                         (void)set_afraid(p_ptr->afraid + randint0(4) + 4);
1485                 }
1486                 learn_spell(MS_SCARE);
1487                 update_smart_learn(m_idx, DRS_FEAR);
1488         }
1489         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1490         {
1491                 resist = tr_ptr->flags3 & RF3_NO_FEAR;
1492                 saving_throw = (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
1493
1494                 spell_badstatus_message(m_idx, t_idx, 
1495                         _("%^sが恐ろしげな幻覚を作り出した。", "%^s casts a fearful illusion in front of %s."),
1496                         _("%^sは恐怖を感じない。", "%^s refuses to be frightened."),
1497                         _("%^sは恐怖を感じない。", "%^s refuses to be frightened."),
1498                         _("%^sは恐怖して逃げ出した!", "%^s flees in terror!"),
1499                         resist, saving_throw, TARGET_TYPE);
1500
1501                 if (!resist && !saving_throw)
1502                 {
1503                         set_monster_monfear(t_idx, MON_MONFEAR(t_ptr) + randint0(4) + 4);
1504                 }
1505         }
1506 }
1507
1508 /*!
1509  * @brief RF5_BLINDの処理。盲目。 /
1510  * @param m_idx 呪文を唱えるモンスターID
1511  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1512  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1513  */
1514 void spell_RF5_BLIND(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1515 {
1516         monster_type    *t_ptr = &m_list[t_idx];
1517         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
1518         int rlev = monster_level_idx(m_idx);
1519         bool resist, saving_throw;
1520
1521         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1522         {
1523                 resist = p_ptr->resist_blind;
1524                 saving_throw = (randint0(100 + rlev / 2) < p_ptr->skill_sav);
1525                 spell_badstatus_message(m_idx, t_idx,
1526                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
1527                         _("%^sが呪文を唱えてあなたの目をくらました!", "%^s casts a spell, burning your eyes!"),
1528                         _("しかし効果がなかった!", "You are unaffected!"),
1529                         _("しかし効力を跳ね返した!", "You resist the effects!"),
1530                         resist, saving_throw, TARGET_TYPE);
1531
1532                 if (!resist && !saving_throw)
1533                 {
1534                         (void)set_blind(12 + randint0(4));
1535                 }
1536                 learn_spell(MS_BLIND);
1537                 update_smart_learn(m_idx, DRS_BLIND);
1538         }
1539         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1540         {
1541                 concptr msg1;
1542                 GAME_TEXT t_name[MAX_NLEN];
1543                 monster_name(t_idx, t_name);
1544                 
1545                 if (streq(t_name, "it"))
1546                 {
1547                         msg1 = _("%sは呪文を唱えて%sの目を焼き付かせた。", "%^s casts a spell, burning %ss eyes.");
1548                 }
1549                 else
1550                 {
1551                         msg1 = _("%sは呪文を唱えて%sの目を焼き付かせた。", "%^s casts a spell, burning %s's eyes.");
1552                 }
1553
1554                 resist = tr_ptr->flags3 & RF3_NO_CONF;
1555                 saving_throw = (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
1556
1557                 spell_badstatus_message(m_idx, t_idx,
1558                         msg1,
1559                         _("%^sには効果がなかった。", "%^s is unaffected."),
1560                         _("%^sには効果がなかった。", "%^s is unaffected."),
1561                         _("%^sは目が見えなくなった! ", "%^s is blinded!"),
1562                         resist, saving_throw, TARGET_TYPE);
1563
1564                 if (!resist && !saving_throw)
1565                 {
1566                         (void)set_monster_confused(t_idx, MON_CONFUSED(t_ptr) + 12 + randint0(4));
1567                 }
1568         }
1569 }
1570
1571 /*!
1572  * @brief RF5_CONFの処理。混乱。/
1573  * @param m_idx 呪文を唱えるモンスターID
1574  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1575  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1576  */
1577 void spell_RF5_CONF(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1578 {
1579         monster_type    *t_ptr = &m_list[t_idx];
1580         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
1581         int rlev = monster_level_idx(m_idx);
1582         bool resist, saving_throw;
1583
1584         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1585         {
1586                 resist = p_ptr->resist_conf;
1587                 saving_throw = (randint0(100 + rlev / 2) < p_ptr->skill_sav);
1588                 spell_badstatus_message(m_idx, t_idx,
1589                         _("%^sが何かをつぶやくと、頭を悩ます音がした。", "%^s mumbles, and you hear puzzling noises."),
1590                         _("%^sが誘惑的な幻覚を作り出した。", "%^s creates a mesmerising illusion."),
1591                         _("しかし幻覚にはだまされなかった。", "You disbelieve the feeble spell."),
1592                         _("しかし幻覚にはだまされなかった。", "You disbelieve the feeble spell."),
1593                         resist, saving_throw, TARGET_TYPE);
1594
1595                 if (!resist && !saving_throw)
1596                 {
1597                         (void)set_confused(p_ptr->confused + randint0(4) + 4);
1598                 }
1599                 learn_spell(MS_CONF);
1600                 update_smart_learn(m_idx, DRS_CONF);
1601         }
1602         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1603         {
1604                 resist = tr_ptr->flags3 & RF3_NO_CONF;
1605                 saving_throw = (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
1606
1607                 spell_badstatus_message(m_idx, t_idx,
1608                         _("%^sが%sの前に幻惑的な幻をつくり出した。", "%^s casts a mesmerizing illusion in front of %s."),
1609                         _("%^sは惑わされなかった。", "%^s disbelieves the feeble spell."),
1610                         _("%^sは惑わされなかった。", "%^s disbelieves the feeble spell."),
1611                         _("%^sは混乱したようだ。", "%^s seems confused."),
1612                         resist, saving_throw, TARGET_TYPE);
1613
1614                 if (!resist && !saving_throw)
1615                 {
1616                         (void)set_monster_confused(t_idx, MON_CONFUSED(t_ptr) + 12 + randint0(4));
1617                 }
1618         }
1619 }
1620
1621 /*!
1622  * @brief RF5_SLOWの処理。減速。 /
1623  * @param m_idx 呪文を唱えるモンスターID
1624  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1625  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1626  */
1627 void spell_RF5_SLOW(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1628 {
1629         monster_type    *t_ptr = &m_list[t_idx];
1630         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
1631         int rlev = monster_level_idx(m_idx);
1632         bool resist, saving_throw;
1633
1634         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1635         {
1636                 resist = p_ptr->resist_conf;
1637                 saving_throw = (randint0(100 + rlev / 2) < p_ptr->skill_sav);
1638                 spell_badstatus_message(m_idx, t_idx,
1639                         _("%^sがあなたの筋力を吸い取ろうとした!", "%^s drains power from your muscles!"),
1640                         _("%^sがあなたの筋力を吸い取ろうとした!", "%^s drains power from your muscles!"),
1641                         _("しかし効果がなかった!", "You are unaffected!"),
1642                         _("しかし効力を跳ね返した!", "You resist the effects!"),
1643                         resist, saving_throw, TARGET_TYPE);
1644
1645                 if (!resist && !saving_throw)
1646                 {
1647                         (void)set_slow(p_ptr->slow + randint0(4) + 4, FALSE);
1648                 }
1649                 learn_spell(MS_SLOW);
1650                 update_smart_learn(m_idx, DRS_FREE);
1651         }
1652         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1653         {
1654                 concptr msg1;
1655                 GAME_TEXT t_name[MAX_NLEN];
1656                 monster_name(t_idx, t_name);
1657
1658                 if (streq(t_name, "it"))
1659                 {
1660                         msg1 = _("%sが%sの筋肉から力を吸いとった。", "%^s drains power from %ss muscles.");
1661                 }
1662                 else
1663                 {
1664                         msg1 = _("%sが%sの筋肉から力を吸いとった。", "%^s drains power from %s's muscles.");
1665                 }
1666
1667                 resist = tr_ptr->flags1 & RF1_UNIQUE;
1668                 saving_throw = (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
1669
1670                 spell_badstatus_message(m_idx, t_idx,
1671                         msg1,
1672                         _("%^sには効果がなかった。", "%^s is unaffected."),
1673                         _("%^sには効果がなかった。", "%^s is unaffected."),
1674                         _("%sの動きが遅くなった。", "%^s starts moving slower."),
1675                         resist, saving_throw, TARGET_TYPE);
1676
1677                 if (!resist && !saving_throw)
1678                 {
1679                         set_monster_slow(t_idx, MON_SLOW(t_ptr) + 50);
1680                 }
1681         }
1682 }
1683
1684 /*!
1685  * @brief RF5_HOLDの処理。麻痺。 /
1686  * @param m_idx 呪文を唱えるモンスターID
1687  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1688  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1689  */
1690 void spell_RF5_HOLD(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1691 {
1692         monster_type    *t_ptr = &m_list[t_idx];
1693         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
1694         int rlev = monster_level_idx(m_idx);
1695         bool resist, saving_throw;
1696
1697         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1698         {
1699                 resist = p_ptr->free_act;
1700                 saving_throw = (randint0(100 + rlev / 2) < p_ptr->skill_sav);
1701                 spell_badstatus_message(m_idx, t_idx,
1702                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
1703                         _("%^sがあなたの目をじっと見つめた!", "%^s stares deep into your eyes!"),
1704                         _("しかし効果がなかった!", "You are unaffected!"),
1705                         _("しかし効力を跳ね返した!", "You resist the effects!"),
1706                         resist, saving_throw, TARGET_TYPE);
1707
1708                 if (!resist && !saving_throw)
1709                 {
1710                         (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4);
1711                 }
1712                 learn_spell(MS_SLEEP);
1713                 update_smart_learn(m_idx, DRS_FREE);
1714         }
1715         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1716         {
1717                 resist = (tr_ptr->flags1 & RF1_UNIQUE) || (tr_ptr->flags3 & RF3_NO_STUN);
1718                 saving_throw = (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
1719
1720                 spell_badstatus_message(m_idx, t_idx,
1721                         _("%^sは%sをじっと見つめた。", "%^s stares intently at %s."),
1722                         _("%^sには効果がなかった。", "%^s is unaffected."),
1723                         _("%^sには効果がなかった。", "%^s is unaffected."), 
1724                         _("%^sは麻痺した!", "%^s is paralyzed!"),
1725                         resist, saving_throw, TARGET_TYPE);
1726
1727                 if (!resist && !saving_throw)
1728                 {
1729                         (void)set_monster_stunned(t_idx, MON_STUNNED(t_ptr) + randint1(4) + 4);
1730                 }
1731         }
1732 }
1733
1734 /*!
1735 * @brief RF6_HASTEの処理。加速。 /
1736 * @param m_idx 呪文を唱えるモンスターID
1737 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1738 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1739 */
1740 void spell_RF6_HASTE(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1741 {
1742         bool see_m = see_monster(m_idx);
1743         monster_type    *m_ptr = &m_list[m_idx];
1744         GAME_TEXT m_name[MAX_NLEN];
1745         monster_name(m_idx, m_name);
1746
1747         monspell_message_base(m_idx, t_idx,
1748                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1749                 _("%^sが自分の体に念を送った。", "%^s concentrates on %s body."),
1750                 _("%^sが自分の体に念を送った。", "%^s concentrates on %s body."),
1751                 _("%^sが自分の体に念を送った。", "%^s concentrates on %s body."),
1752                 p_ptr->blind > 0, TARGET_TYPE);
1753
1754         /* Allow quick speed increases to base+10 */
1755         if (set_monster_fast(m_idx, MON_FAST(m_ptr) + 100))
1756         {
1757                 if (TARGET_TYPE == MONSTER_TO_PLAYER ||
1758                         (TARGET_TYPE == MONSTER_TO_MONSTER && see_m))
1759                         msg_format(_("%^sの動きが速くなった。", "%^s starts moving faster."), m_name);
1760         }
1761 }
1762
1763 /*!
1764 * @brief RF6_HAND_DOOMの処理。破滅の手。 /
1765 * @param y 対象の地点のy座標
1766 * @param x 対象の地点のx座標
1767 * @param m_idx 呪文を唱えるモンスターID
1768 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1769 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1770 * @return ダメージ量を返す。
1771 */
1772 HIT_POINT spell_RF6_HAND_DOOM(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1773 {
1774         HIT_POINT dam = 0;
1775
1776         simple_monspell_message(m_idx, t_idx,
1777                 _("%^sが<破滅の手>を放った!", "%^s invokes the Hand of Doom!"),
1778                 _("%^sが%sに<破滅の手>を放った!", "%^s invokes the Hand of Doom upon %s!"),
1779                 TARGET_TYPE);
1780
1781         if (TARGET_TYPE == MONSTER_TO_PLAYER)
1782         {
1783                 dam = monspell_damage((MS_HAND_DOOM), m_idx, DAM_ROLL);
1784                 breath(y, x, m_idx, GF_HAND_DOOM, dam, 0, FALSE, MS_HAND_DOOM, MONSTER_TO_PLAYER);
1785         }
1786         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
1787         {
1788                 dam = 20; /* Dummy power */
1789                 breath(y, x, m_idx, GF_HAND_DOOM, dam, 0, FALSE, MS_HAND_DOOM, MONSTER_TO_MONSTER);
1790         }
1791         return dam;
1792 }
1793
1794 /*!
1795 * @brief RF6_HEALの処理。治癒。 /
1796 * @param m_idx 呪文を唱えるモンスターID
1797 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1798 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1799 */
1800 void spell_RF6_HEAL(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1801 {
1802         monster_type    *m_ptr = &m_list[m_idx];
1803         int rlev = monster_level_idx(m_idx);
1804         bool seen = (!p_ptr->blind && m_ptr->ml);
1805         GAME_TEXT m_name[MAX_NLEN];
1806         monster_name(m_idx, m_name);
1807
1808         disturb(TRUE, TRUE);
1809
1810         monspell_message_base(m_idx, t_idx,
1811                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
1812                 _("%^sは自分の傷に念を集中した。", "%^s concentrates on %s wounds."),
1813                 _("%^sが自分の傷に集中した。", "%^s concentrates on %s wounds."),
1814                 _("%^sは自分の傷に念を集中した。", "%^s concentrates on %s wounds."),
1815                 p_ptr->blind > 0, TARGET_TYPE);
1816
1817         /* Heal some */
1818         m_ptr->hp += (rlev * 6);
1819
1820         /* Fully healed */
1821         if (m_ptr->hp >= m_ptr->maxhp)
1822         {
1823                 /* Fully healed */
1824                 m_ptr->hp = m_ptr->maxhp;
1825
1826                 monspell_message_base(m_idx, t_idx,
1827                         _("%^sは完全に治ったようだ!", "%^s sounds completely healed!"),
1828                         _("%^sは完全に治ったようだ!", "%^s sounds completely healed!"),
1829                         _("%^sは完全に治った!", "%^s looks completely healed!"),
1830                         _("%^sは完全に治った!", "%^s looks completely healed!"),
1831                         !seen, TARGET_TYPE);
1832         }
1833
1834         /* Partially healed */
1835         else
1836         {
1837                 monspell_message_base(m_idx, t_idx,
1838                         _("%^sは体力を回復したようだ。", "%^s sounds healthier."),
1839                         _("%^sは体力を回復したようだ。", "%^s sounds healthier."),
1840                         _("%^sは体力を回復したようだ。", "%^s looks healthier."),
1841                         _("%^sは体力を回復したようだ。", "%^s looks healthier."),
1842                         !seen, TARGET_TYPE);
1843         }
1844
1845         /* Redraw (later) if needed */
1846         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
1847         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
1848
1849         /* Cancel fear */
1850         if (MON_MONFEAR(m_ptr))
1851         {
1852                 /* Cancel fear */
1853                 (void)set_monster_monfear(m_idx, 0);
1854
1855                 if (see_monster(m_idx))
1856                         msg_format(_("%^sは勇気を取り戻した。", "%^s recovers %s courage."), m_name);
1857         }
1858 }
1859
1860 /*!
1861 * @brief RF6_INVULNERの処理。無敵。 /
1862 * @param m_idx 呪文を唱えるモンスターID
1863 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
1864 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1865 */
1866 void spell_RF6_INVULNER(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
1867 {
1868         monster_type    *m_ptr = &m_list[m_idx];
1869         bool seen = (!p_ptr->blind && m_ptr->ml);
1870
1871         monspell_message_base(m_idx, t_idx,
1872                         _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
1873                         _("%^sが何かを力強くつぶやいた。", "%^s mumbles powerfully."),
1874                         _("%sは無傷の球の呪文を唱えた。", "%^s casts a Globe of Invulnerability."),
1875                         _("%sは無傷の球の呪文を唱えた。", "%^s casts a Globe of Invulnerability."),
1876                         !seen, TARGET_TYPE);
1877
1878         if (!MON_INVULNER(m_ptr)) (void)set_monster_invulner(m_idx, randint1(4) + 4, FALSE);
1879 }
1880
1881 /*!
1882 * @brief RF6_BLINKの処理。ショート・テレポート。 /
1883 * @param m_idx 呪文を唱えるモンスターID
1884 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1885 */
1886 void spell_RF6_BLINK(MONSTER_IDX m_idx, int TARGET_TYPE)
1887 {
1888         GAME_TEXT m_name[MAX_NLEN];
1889         monster_name(m_idx, m_name);
1890         
1891         if (TARGET_TYPE==MONSTER_TO_PLAYER)
1892                 disturb(TRUE, TRUE);
1893
1894         if (teleport_barrier(m_idx))
1895         {
1896                 if(see_monster(m_idx))
1897                         msg_format(_("魔法のバリアが%^sのテレポートを邪魔した。",
1898                                                  "Magic barrier obstructs teleporting of %^s."), m_name);
1899         }
1900         else
1901         {
1902                 if(see_monster(m_idx))
1903                         msg_format(_("%^sが瞬時に消えた。", "%^s blinks away."), m_name);
1904
1905                 teleport_away(m_idx, 10, 0L);
1906
1907                 if (TARGET_TYPE==MONSTER_TO_PLAYER)
1908                         p_ptr->update |= (PU_MONSTERS);
1909         }
1910 }
1911
1912 /*!
1913 * @brief RF6_TPORTの処理。テレポート。 /
1914 * @param m_idx 呪文を唱えるモンスターID
1915 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
1916 */
1917 void spell_RF6_TPORT(MONSTER_IDX m_idx, int TARGET_TYPE)
1918 {       
1919         GAME_TEXT m_name[MAX_NLEN];
1920         monster_name(m_idx, m_name);
1921         
1922         if (TARGET_TYPE==MONSTER_TO_PLAYER)
1923                 disturb(TRUE, TRUE);
1924         if (teleport_barrier(m_idx))
1925         {
1926                 if(see_monster(m_idx))
1927                         msg_format(_("魔法のバリアが%^sのテレポートを邪魔した。",
1928                                                  "Magic barrier obstructs teleporting of %^s."), m_name);
1929         }
1930         else
1931         {
1932                 if(see_monster(m_idx))
1933                         msg_format(_("%^sがテレポートした。", "%^s teleports away."), m_name);
1934
1935                 teleport_away_followable(m_idx);
1936         }
1937 }
1938
1939 /*!
1940 * @brief RF6_WORLDの処理。時を止める。 /
1941 * @param m_idx 呪文を唱えるモンスターID
1942 */
1943 HIT_POINT spell_RF6_WORLD(MONSTER_IDX m_idx)
1944 {
1945         monster_type    *m_ptr = &m_list[m_idx];
1946         MONSTER_IDX who = 0;
1947         GAME_TEXT m_name[MAX_NLEN];
1948         monster_name(m_idx, m_name);
1949
1950         disturb(TRUE, TRUE);
1951         if (m_ptr->r_idx == MON_DIO) who = 1;
1952         else if (m_ptr->r_idx == MON_WONG) who = 3;
1953         if (!process_the_world(randint1(2) + 2, who, TRUE)) return (FALSE);
1954         return who;
1955 }
1956
1957 /*!
1958 * @brief バーノール・ルパートのRF6_SPECIALの処理。分裂・合体。 /
1959 * @param m_idx 呪文を唱えるモンスターID
1960 */
1961 HIT_POINT spell_RF6_SPECIAL_BANORLUPART(MONSTER_IDX m_idx)
1962 {
1963         monster_type *m_ptr = &m_list[m_idx];
1964         HIT_POINT dummy_hp, dummy_maxhp;
1965         MONSTER_IDX k;
1966         POSITION dummy_y = m_ptr->fy;
1967         POSITION dummy_x = m_ptr->fx;
1968         BIT_FLAGS mode = 0L;
1969
1970         switch(m_ptr->r_idx)
1971         {
1972                 case MON_BANORLUPART:
1973                         dummy_hp = (m_ptr->hp + 1) / 2;
1974                         dummy_maxhp = m_ptr->maxhp / 2;
1975                         
1976                         if (p_ptr->inside_arena || p_ptr->inside_battle || !summon_possible(m_ptr->fy, m_ptr->fx)) 
1977                                 return -1;
1978
1979                         delete_monster_idx(cave[m_ptr->fy][m_ptr->fx].m_idx);
1980                         summon_named_creature(0, dummy_y, dummy_x, MON_BANOR, mode);
1981                         m_list[hack_m_idx_ii].hp = dummy_hp;
1982                         m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
1983                         summon_named_creature(0, dummy_y, dummy_x, MON_LUPART, mode);
1984                         m_list[hack_m_idx_ii].hp = dummy_hp;
1985                         m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
1986
1987                         msg_print(_("『バーノール・ルパート』が分裂した!","Banor=Rupart splits in two person!"));
1988                         break;
1989                 
1990                 case MON_BANOR:
1991                 case MON_LUPART:
1992                         dummy_hp = 0;
1993                         dummy_maxhp = 0;
1994
1995                         if (!r_info[MON_BANOR].cur_num || !r_info[MON_LUPART].cur_num) 
1996                                 return -1;
1997
1998                         for (k = 1; k < m_max; k++)
1999                         {
2000                                 if (m_list[k].r_idx == MON_BANOR || m_list[k].r_idx == MON_LUPART)
2001                                 {
2002                                         dummy_hp += m_list[k].hp;
2003                                         dummy_maxhp += m_list[k].maxhp;
2004                                         if (m_list[k].r_idx != m_ptr->r_idx)
2005                                         {
2006                                                 dummy_y = m_list[k].fy;
2007                                                 dummy_x = m_list[k].fx;
2008                                         }
2009                                         delete_monster_idx(k);
2010                                 }
2011                         }
2012                         summon_named_creature(0, dummy_y, dummy_x, MON_BANORLUPART, mode);
2013                         m_list[hack_m_idx_ii].hp = dummy_hp;
2014                         m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
2015
2016                         msg_print(_("『バーノール』と『ルパート』が合体した!", "Banor and Rupart combine into one!"));
2017                         break;
2018         }
2019         return 0;
2020 }
2021
2022 /*!
2023 * @brief ロレントのRF6_SPECIALの処理。手榴弾の召喚。 /
2024 * @param y 対象の地点のy座標
2025 * @param x 対象の地点のx座標
2026 * @param m_idx 呪文を唱えるモンスターID
2027 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2028 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2029 * @return ダメージ量を返す。
2030 */
2031 HIT_POINT spell_RF6_SPECIAL_ROLENTO(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2032 {
2033         int count = 0, k;
2034         int num = 1 + randint1(3);
2035         BIT_FLAGS mode = 0L;
2036         
2037         monspell_message(m_idx, t_idx,
2038                 _("%^sが何か大量に投げた。", "%^s spreads something."),
2039                 _("%^sは手榴弾をばらまいた。", "%^s throws some hand grenades."),
2040                 _("%^sは手榴弾をばらまいた。", "%^s throws some hand grenades."),
2041                 TARGET_TYPE);
2042
2043         for (k = 0; k < num; k++)
2044         {
2045                 count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, mode);
2046         }
2047         
2048         if (p_ptr->blind && count)
2049                 msg_print(_("多くのものが間近にばらまかれる音がする。", "You hear many things are scattered nearby."));
2050         
2051         return 0;
2052 }
2053
2054 /*!
2055 * @brief BシンボルのRF6_SPECIALの処理。投げ落とす攻撃。 /
2056 * @param y 対象の地点のy座標
2057 * @param x 対象の地点のx座標
2058 * @param m_idx 呪文を唱えるモンスターID
2059 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2060 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2061 * @return ダメージ量を返す。
2062 */
2063 HIT_POINT spell_RF6_SPECIAL_B(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2064 {
2065         HIT_POINT dam = -1;
2066         monster_type    *m_ptr = &m_list[m_idx];
2067         monster_type    *t_ptr = &m_list[t_idx];
2068         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
2069         bool monster_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2070         bool monster_to_monster = (TARGET_TYPE == MONSTER_TO_MONSTER);
2071         bool direct = player_bold(y, x);
2072         GAME_TEXT m_name[MAX_NLEN];
2073         monster_name(m_idx, m_name);
2074
2075         disturb(TRUE, TRUE);
2076         if (one_in_(3) || !direct)
2077         {               
2078                 simple_monspell_message(m_idx, t_idx,
2079                         _("%^sは突然視界から消えた!", "%^s suddenly go out of your sight!"),
2080                         _("%^sは突然急上昇して視界から消えた!", "%^s suddenly go out of your sight!"),
2081                         TARGET_TYPE);
2082                                 
2083                 teleport_away(m_idx, 10, TELEPORT_NONMAGICAL);
2084                 p_ptr->update |= (PU_MONSTERS);
2085         }
2086         else
2087         {
2088                 int get_damage = 0;
2089                 bool fear, dead; /* dummy */
2090         
2091                 simple_monspell_message(m_idx, t_idx,
2092                         _("%^sがあなたを掴んで空中から投げ落とした。", "%^s holds you, and drops from the sky."),
2093                         _("%^sが%sを掴んで空中から投げ落とした。", "%^s holds %s, and drops from the sky."),
2094                         TARGET_TYPE);
2095
2096                 dam = damroll(4, 8);
2097
2098                 if (monster_to_player || t_idx == p_ptr->riding)
2099                         teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2100                 else 
2101                         teleport_monster_to(t_idx, m_ptr->fy, m_ptr->fx, 100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2102
2103                 sound(SOUND_FALL);
2104
2105                 if ((monster_to_player && p_ptr->levitation) ||
2106                         (monster_to_monster && (tr_ptr->flags7 & RF7_CAN_FLY)))
2107                 {
2108                         simple_monspell_message(m_idx, t_idx,
2109                                 _("あなたは静かに着地した。", "You float gently down to the ground."),
2110                                 _("%^sは静かに着地した。", "%^s floats gently down to the ground."),
2111                                 TARGET_TYPE);
2112                 }
2113                 else
2114                 {
2115                         simple_monspell_message(m_idx, t_idx,
2116                                 _("あなたは地面に叩きつけられた。", "You crashed into the ground."),
2117                                 _("%^sは地面に叩きつけられた。", "%^s crashed into the ground."),
2118                                 TARGET_TYPE);
2119                         dam += damroll(6, 8);
2120                 }
2121
2122                 if(monster_to_player ||
2123                    (monster_to_monster && p_ptr->riding == t_idx))
2124                 {
2125                         /* Mega hack -- this special action deals damage to the player. Therefore the code of "eyeeye" is necessary.
2126                         -- henkma
2127                         */
2128                         get_damage = take_hit(DAMAGE_NOESCAPE, dam, m_name, -1);
2129                         if (p_ptr->tim_eyeeye && get_damage > 0 && !p_ptr->is_dead)
2130                         {
2131                                 GAME_TEXT m_name_self[80];
2132                                 /* hisself */
2133                                 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
2134
2135                                 msg_format(_("攻撃が%s自身を傷つけた!", "The attack of %s has wounded %s!"), m_name, m_name_self);
2136
2137                                 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
2138                                 set_tim_eyeeye(p_ptr->tim_eyeeye - 5, TRUE);
2139                         }
2140                 }
2141
2142                 if(monster_to_player && p_ptr->riding)
2143                         mon_take_hit_mon(p_ptr->riding, dam, &dead, &fear, extract_note_dies(real_r_idx(&m_list[p_ptr->riding])), m_idx);
2144
2145                 if(monster_to_monster)
2146                         mon_take_hit_mon(t_idx, dam, &dead, &fear, extract_note_dies(real_r_idx(t_ptr)), m_idx);
2147         }
2148         return dam;
2149 }
2150
2151 /*!
2152 * @brief RF6_SPECIALの処理。モンスターの種類によって実処理に振り分ける。 /
2153 * @param y 対象の地点のy座標
2154 * @param x 対象の地点のx座標
2155 * @param m_idx 呪文を唱えるモンスターID
2156 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2157 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2158 * @return ダメージ量を返す。
2159 */
2160 HIT_POINT spell_RF6_SPECIAL(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2161 {
2162         monster_type    *m_ptr = &m_list[m_idx];
2163         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
2164
2165         disturb(TRUE, TRUE);
2166         switch (m_ptr->r_idx)
2167         {
2168                 case MON_OHMU:
2169                         /* Moved to process_monster(), like multiplication */
2170                         return -1;
2171
2172                 case MON_BANORLUPART:
2173                 case MON_BANOR:
2174                 case MON_LUPART:
2175                         return spell_RF6_SPECIAL_BANORLUPART(m_idx);
2176
2177                 case MON_ROLENTO:
2178                         return spell_RF6_SPECIAL_ROLENTO(y, x, m_idx, t_idx, TARGET_TYPE);
2179                         break;
2180
2181                 default:
2182                 if (r_ptr->d_char == 'B')
2183                 {
2184                         return spell_RF6_SPECIAL_B(y, x, m_idx, t_idx, TARGET_TYPE);
2185                         break;
2186                 }
2187
2188                 /* Something is wrong */
2189                 else return -1;
2190         }
2191 }
2192
2193 /*!
2194 * @brief RF6_TELE_TOの処理。テレポート・バック。 /
2195 * @param m_idx 呪文を唱えるモンスターID
2196 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2197 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2198 * @return ダメージ量を返す。
2199 */
2200 void spell_RF6_TELE_TO(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2201 {
2202         monster_type    *m_ptr = &m_list[m_idx];
2203         monster_type    *t_ptr = &m_list[t_idx];
2204         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
2205
2206         simple_monspell_message(m_idx, t_idx,
2207                 _("%^sがあなたを引き戻した。", "%^s commands you to return."),
2208                 _("%^sが%sを引き戻した。", "%^s commands %s to return."),
2209                 TARGET_TYPE);
2210         
2211         if (TARGET_TYPE == MONSTER_TO_PLAYER)
2212         {
2213                 teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE);
2214                 learn_spell(MS_TELE_TO);
2215         }
2216         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
2217         {
2218                 bool resists_tele = FALSE;
2219                 GAME_TEXT t_name[MAX_NLEN];
2220                 monster_name(t_idx, t_name);
2221
2222                 if (tr_ptr->flagsr & RFR_RES_TELE)
2223                 {
2224                         if ((tr_ptr->flags1 & RF1_UNIQUE) || (tr_ptr->flagsr & RFR_RES_ALL))
2225                         {
2226                                 if (is_original_ap_and_seen(t_ptr)) tr_ptr->r_flagsr |= RFR_RES_TELE;
2227                                 if (see_monster(t_idx))
2228                                 {
2229                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), t_name);
2230                                 }
2231                                 resists_tele = TRUE;
2232                         }
2233                         else if (tr_ptr->level > randint1(100))
2234                         {
2235                                 if (is_original_ap_and_seen(t_ptr)) tr_ptr->r_flagsr |= RFR_RES_TELE;
2236                                 if (see_monster(t_idx))
2237                                 {
2238                                         msg_format(_("%^sは耐性を持っている!", "%^s resists!"), t_name);
2239                                 }
2240                                 resists_tele = TRUE;
2241                         }
2242                 }
2243
2244                 if (!resists_tele)
2245                 {
2246                         if (t_idx == p_ptr->riding) 
2247                                 teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE);
2248                         else 
2249                                 teleport_monster_to(t_idx, m_ptr->fy, m_ptr->fx, 100, TELEPORT_PASSIVE);
2250                 }
2251                 monster_wakeup(t_idx);
2252         }
2253 }
2254
2255 /*!
2256 * @brief RF6_TELE_AWAYの処理。テレポート・アウェイ。 /
2257 * @param m_idx 呪文を唱えるモンスターID
2258 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2259 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2260 * @return ダメージ量を返す。
2261 */
2262 void spell_RF6_TELE_AWAY(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2263 {
2264         monster_type    *t_ptr = &m_list[t_idx];
2265         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
2266
2267         simple_monspell_message(m_idx, t_idx,
2268                 _("%^sにテレポートさせられた。", "%^s teleports you away."),
2269                 _("%^sは%sをテレポートさせた。", "%^s teleports %s away."),
2270                 TARGET_TYPE);
2271         
2272         if (TARGET_TYPE == MONSTER_TO_PLAYER)
2273         {
2274                 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
2275                         msg_print(_("くっそ~", ""));
2276                 else if ((p_ptr->pseikaku == SEIKAKU_CHARGEMAN))
2277                 {
2278                         if (randint0(2) == 0) msg_print(_("ジュラル星人め!", ""));
2279                         else msg_print(_("弱い者いじめは止めるんだ!", ""));
2280                 }
2281
2282                 learn_spell(MS_TELE_AWAY);
2283                 teleport_player_away(m_idx, 100);
2284         }
2285         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
2286         {
2287                 bool resists_tele = FALSE;
2288                 GAME_TEXT t_name[MAX_NLEN];
2289                 monster_name(t_idx, t_name);
2290
2291                 if (tr_ptr->flagsr & RFR_RES_TELE)
2292                 {
2293                         if ((tr_ptr->flags1 & RF1_UNIQUE) || (tr_ptr->flagsr & RFR_RES_ALL))
2294                         {
2295                                 if (is_original_ap_and_seen(t_ptr)) tr_ptr->r_flagsr |= RFR_RES_TELE;
2296                                 if (see_monster(t_idx))
2297                                 {
2298                                         msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), t_name);
2299                                 }
2300                                 resists_tele = TRUE;
2301                         }
2302                         else if (tr_ptr->level > randint1(100))
2303                         {
2304                                 if (is_original_ap_and_seen(t_ptr)) tr_ptr->r_flagsr |= RFR_RES_TELE;
2305                                 if (see_monster(t_idx))
2306                                 {
2307                                         msg_format(_("%^sは耐性を持っている!", "%^s resists!"), t_name);
2308                                 }
2309                                 resists_tele = TRUE;
2310                         }
2311                 }
2312
2313                 if (!resists_tele)
2314                 {
2315                         if (t_idx == p_ptr->riding) 
2316                                 teleport_player_away(m_idx, MAX_SIGHT * 2 + 5);
2317                         else 
2318                                 teleport_away(t_idx, MAX_SIGHT * 2 + 5, TELEPORT_PASSIVE);
2319                 }
2320                 monster_wakeup(t_idx);
2321         }
2322 }
2323
2324 /*!
2325 * @brief RF6_TELE_LEVELの処理。テレポート・レベル。 /
2326 * @param m_idx 呪文を唱えるモンスターID
2327 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2328 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2329 * @return ダメージ量を返す。
2330 */
2331 void spell_RF6_TELE_LEVEL(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2332 {
2333         monster_type    *t_ptr = &m_list[t_idx];
2334         monster_race    *tr_ptr = &r_info[t_ptr->r_idx];
2335         int rlev = monster_level_idx(m_idx);
2336         bool resist, saving_throw;
2337
2338         if (TARGET_TYPE == MONSTER_TO_PLAYER)
2339         {
2340                 resist = p_ptr->resist_nexus;
2341                 saving_throw = (randint0(100 + rlev / 2) < p_ptr->skill_sav);
2342                 spell_badstatus_message(m_idx, t_idx,
2343                         _("%^sが何か奇妙な言葉をつぶやいた。", "%^s mumbles strangely."),
2344                         _("%^sがあなたの足を指さした。", "%^s gestures at your feet."),
2345                         _("しかし効果がなかった!", "You are unaffected!"),
2346                         _("しかし効力を跳ね返した!", "You resist the effects!"),
2347                         resist, saving_throw, TARGET_TYPE);
2348
2349                 if (!resist && !saving_throw)
2350                 {
2351                         teleport_level(0);
2352                 }
2353                 learn_spell(MS_TELE_LEVEL);
2354                 update_smart_learn(m_idx, DRS_NEXUS);
2355         }
2356         else if (TARGET_TYPE == MONSTER_TO_MONSTER)
2357         {
2358                 resist = tr_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE);
2359                 saving_throw = (tr_ptr->flags1 & RF1_QUESTOR) ||
2360                                            (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10);
2361
2362                 spell_badstatus_message(m_idx, t_idx, 
2363                         _("%^sが%sの足を指さした。", "%^s gestures at %s's feet."),
2364                         _("%^sには効果がなかった。", "%^s is unaffected!"),
2365                         _("%^sは効力を跳ね返した!", "%^s resist the effects!"),
2366                         "",
2367                         resist, saving_throw, TARGET_TYPE);
2368
2369                 if (!resist && !saving_throw)
2370                 {
2371                         teleport_level((t_idx == p_ptr->riding) ? 0 : t_idx);
2372                 }
2373         }
2374 }
2375
2376 /*!
2377 * @brief RF6_PSY_SPEARの処理。光の剣。 /
2378 * @param y 対象の地点のy座標
2379 * @param x 対象の地点のx座標
2380 * @param m_idx 呪文を唱えるモンスターID
2381 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2382 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2383 * @return ダメージ量を返す。
2384 */
2385 HIT_POINT spell_RF6_PSY_SPEAR(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2386 {
2387         HIT_POINT dam;
2388
2389         monspell_message(m_idx, t_idx,
2390                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2391                 _("%^sが光の剣を放った。", "%^s throw a Psycho-Spear."),
2392                 _("%^sが%sに向かって光の剣を放った。", "%^s throw a Psycho-spear at %s."),
2393                 TARGET_TYPE);
2394
2395         dam = monspell_damage((MS_PSY_SPEAR), m_idx, DAM_ROLL);
2396         beam(m_idx, y, x, GF_PSY_SPEAR, dam, MS_PSY_SPEAR, MONSTER_TO_PLAYER);
2397         return dam;
2398 }
2399
2400 /*!
2401 * @brief RF6_DARKNESSの処理。暗闇or閃光。 /
2402 * @param y 対象の地点のy座標
2403 * @param x 対象の地点のx座標
2404 * @param m_idx 呪文を唱えるモンスターID
2405 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2406 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2407 */
2408 void spell_RF6_DARKNESS(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2409 {
2410         monster_type    *m_ptr = &m_list[m_idx];
2411         monster_type    *t_ptr = &m_list[t_idx];
2412         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
2413         bool can_use_lite_area = FALSE;
2414         bool monster_to_monster = TARGET_TYPE == MONSTER_TO_MONSTER;
2415         bool monster_to_player = TARGET_TYPE == MONSTER_TO_PLAYER;
2416         GAME_TEXT t_name[MAX_NLEN];
2417         monster_name(t_idx, t_name);
2418
2419         if ((p_ptr->pclass == CLASS_NINJA) &&
2420                 !(r_ptr->flags3 & (RF3_UNDEAD | RF3_HURT_LITE)) &&
2421                 !(r_ptr->flags7 & RF7_DARK_MASK))
2422                 can_use_lite_area = TRUE;
2423
2424         if(monster_to_monster && !is_hostile(t_ptr))
2425                 can_use_lite_area = FALSE;
2426
2427         
2428         if (can_use_lite_area)
2429         {
2430                 monspell_message(m_idx, t_idx,
2431                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
2432                         _("%^sが辺りを明るく照らした。", "%^s cast a spell to light up."),
2433                         _("%^sが辺りを明るく照らした。", "%^s cast a spell to light up."),
2434                         TARGET_TYPE);
2435
2436                 if (see_monster(t_idx) && monster_to_monster)
2437                 {
2438                         msg_format(_("%^sは白い光に包まれた。", "%^s is surrounded by a white light."), t_name);
2439                 }
2440         }
2441         else
2442         {
2443                 monspell_message(m_idx, t_idx,
2444                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
2445                         _("%^sが暗闇の中で手を振った。", "%^s gestures in shadow."),
2446                         _("%^sが暗闇の中で手を振った。", "%^s gestures in shadow."),
2447                         TARGET_TYPE);
2448
2449                 if (see_monster(t_idx) && monster_to_monster)
2450                 {
2451                         msg_format(_("%^sは暗闇に包まれた。", "%^s is surrounded by darkness."), t_name);
2452                 }
2453         }
2454
2455         if(monster_to_player)
2456         {
2457                 if (can_use_lite_area)
2458                 {
2459                         (void)lite_area(0, 3);
2460                 }
2461                 else
2462                 {
2463                         learn_spell(MS_DARKNESS);
2464                         (void)unlite_area(0, 3);
2465                 }
2466         }
2467         else if(monster_to_monster)
2468         {
2469                 if (can_use_lite_area)
2470                 {
2471                         (void)project(m_idx, 3, y, x, 0, GF_LITE_WEAK, PROJECT_GRID | PROJECT_KILL, -1);
2472                         lite_room(y, x);
2473                 }
2474                 else
2475                 {
2476                         (void)project(m_idx, 3, y, x, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL, MS_DARKNESS);
2477                         unlite_room(y, x);
2478                 }
2479         }
2480 }
2481
2482 /*!
2483 * @brief RF6_TRAPSの処理。トラップ。 /
2484 * @param y 対象の地点のy座標
2485 * @param x 対象の地点のx座標
2486 * @param m_idx 呪文を唱えるモンスターID
2487 */
2488 void spell_RF6_TRAPS(POSITION y, POSITION x, MONSTER_IDX m_idx)
2489 {
2490         GAME_TEXT m_name[MAX_NLEN];
2491         monster_name(m_idx, m_name);
2492         disturb(TRUE, TRUE);
2493
2494         if (p_ptr->blind)
2495                 msg_format(_("%^sが何かをつぶやいて邪悪に微笑んだ。",
2496                 "%^s mumbles, and then cackles evilly."), m_name);
2497         else
2498                 msg_format(_("%^sが呪文を唱えて邪悪に微笑んだ。",
2499                 "%^s casts a spell and cackles evilly."), m_name);
2500
2501         learn_spell(MS_MAKE_TRAP);
2502         (void)trap_creation(y, x);
2503 }
2504
2505 /*!
2506 * @brief RF6_FORGETの処理。記憶消去。 /
2507 * @param m_idx 呪文を唱えるモンスターID
2508 */
2509 void spell_RF6_FORGET(MONSTER_IDX m_idx)
2510 {
2511         int rlev = monster_level_idx(m_idx);
2512         GAME_TEXT m_name[MAX_NLEN];
2513         monster_name(m_idx, m_name);
2514
2515         disturb(TRUE, TRUE);
2516
2517         msg_format(_("%^sがあなたの記憶を消去しようとしている。",
2518                 "%^s tries to blank your mind."), m_name);
2519
2520         if (randint0(100 + rlev / 2) < p_ptr->skill_sav)
2521         {
2522                 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
2523         }
2524         else if (lose_all_info())
2525         {
2526                 msg_print(_("記憶が薄れてしまった。", "Your memories fade away."));
2527         }
2528         learn_spell(MS_FORGET);
2529 }
2530
2531
2532 /*!
2533 * @brief RF6_RAISE_DEADの処理。死者復活。 /
2534 * @param m_idx 呪文を唱えるモンスターID
2535 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2536 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2537 */
2538 void spell_RF6_RAISE_DEAD(MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2539 {
2540         monster_type *m_ptr = &m_list[m_idx];
2541
2542         monspell_message(m_idx, t_idx,
2543                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2544                 _("%^sが死者復活の呪文を唱えた。", "%^s casts a spell to revive corpses."),
2545                 _("%^sが死者復活の呪文を唱えた。", "%^s casts a spell to revive corpses."),
2546                 TARGET_TYPE);
2547
2548         animate_dead(m_idx, m_ptr->fy, m_ptr->fx);
2549 }
2550
2551
2552 /*!
2553 * @brief 鷹召喚の処理。 /
2554 * @param y 対象の地点のy座標
2555 * @param x 対象の地点のx座標
2556 * @param rlev 呪文を唱えるモンスターのレベル
2557 * @param m_idx 呪文を唱えるモンスターID
2558 * @return 召喚したモンスターの数を返す。
2559 */
2560 MONSTER_NUMBER summon_EAGLE(POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
2561 {
2562         int k, count = 0;       
2563         int num = 4 + randint1(3);
2564         for (k = 0; k < num; k++)
2565         {
2566                 count += summon_specific(m_idx, y, x, rlev, SUMMON_EAGLES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
2567         }
2568         return count;
2569 }
2570
2571 /*!
2572  * @brief インターネット・エクスプローダー召喚の処理。 /
2573  * @param y 対象の地点のy座標
2574  * @param x 対象の地点のx座標
2575  * @param rlev 呪文を唱えるモンスターのレベル
2576  * @param m_idx 呪文を唱えるモンスターID
2577  * @return 召喚したモンスターの数を返す。
2578  */
2579 MONSTER_NUMBER summon_IE(POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
2580 {
2581         BIT_FLAGS mode = 0L;
2582         int k, count = 0;       
2583         int num = 2 + randint1(1 + rlev / 20);
2584         for (k = 0; k < num; k++)
2585         {
2586                 count += summon_named_creature(m_idx, y, x, MON_IE, mode);
2587         }
2588         return count;
2589 }
2590
2591 /*!
2592  * @brief ダンジョン・ガーディアン召喚の処理。 /
2593  * @param y 対象の地点のy座標
2594  * @param x 対象の地点のx座標
2595  * @param rlev 呪文を唱えるモンスターのレベル
2596  * @param m_idx 呪文を唱えるモンスターID
2597  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2598  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2599  * @return 召喚したモンスターの数を返す。
2600  */
2601 MONSTER_NUMBER summon_Guardian(POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2602 {
2603         int k, count = 0;       
2604         int num = 2 + randint1(3);
2605         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2606         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2607
2608         if (r_info[MON_JORMUNGAND].cur_num < r_info[MON_JORMUNGAND].max_num && one_in_(6))
2609         {
2610                 simple_monspell_message(m_idx, t_idx,
2611                         _("地面から水が吹き出した!", "Water blew off from the ground!"),
2612                         _("地面から水が吹き出した!", "Water blew off from the ground!"),
2613                         TARGET_TYPE);
2614
2615                 if(mon_to_player)
2616                         fire_ball_hide(GF_WATER_FLOW, 0, 3, 8);
2617                 else if(mon_to_mon)
2618                         project(t_idx, 8, y, x, 3, GF_WATER_FLOW, PROJECT_GRID | PROJECT_HIDE, -1);
2619         }
2620
2621         for (k = 0; k < num; k++)
2622         {
2623                 count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
2624         }
2625         return count;
2626 }
2627
2628 /*!
2629 * @brief ロックのクローン召喚の処理。 /
2630 * @param y 対象の地点のy座標
2631 * @param x 対象の地点のx座標
2632 * @param rlev 呪文を唱えるモンスターのレベル
2633 * @param m_idx 呪文を唱えるモンスターID
2634 * @return 召喚したモンスターの数を返す。
2635 */
2636 MONSTER_NUMBER summon_LOCK_CLONE(POSITION y, POSITION x, DEPTH rlev, MONSTER_IDX m_idx)
2637 {
2638         BIT_FLAGS mode = 0L;
2639         int k, count = 0;
2640         int num = randint1(3);
2641         rlev = rlev;
2642         for (k = 0; k < num; k++)
2643         {
2644                 count += summon_named_creature(m_idx, y, x, MON_LOCKE_CLONE, mode);
2645         }
2646         return count;
2647 }
2648
2649 /*!
2650 * @brief シラミ召喚の処理。 /
2651 * @param y 対象の地点のy座標
2652 * @param x 対象の地点のx座標
2653 * @param rlev 呪文を唱えるモンスターのレベル
2654 * @param m_idx 呪文を唱えるモンスターID
2655 * @return 召喚したモンスターの数を返す。
2656 */
2657 MONSTER_NUMBER summon_LOUSE(POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
2658 {
2659         int k, count = 0;       
2660         int num = 2 + randint1(3);
2661         for (k = 0; k < num; k++)
2662         {
2663                 count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP, '\0');
2664         }
2665         return count;
2666 }
2667
2668 /*!
2669 * @brief 救援召喚の通常処理。同シンボルのモンスターを召喚する。 /
2670 * @param y 対象の地点のy座標
2671 * @param x 対象の地点のx座標
2672 * @param rlev 呪文を唱えるモンスターのレベル
2673 * @param m_idx 呪文を唱えるモンスターID
2674 * @return 召喚したモンスターの数を返す。
2675 */
2676 MONSTER_NUMBER summon_Kin(POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
2677 {
2678         int k, count = 0;
2679         monster_type *m_ptr = &m_list[m_idx];
2680         monster_race *r_ptr = &r_info[m_ptr->r_idx];
2681
2682         for (k = 0; k < 4; k++)
2683         {
2684                 count += summon_specific(m_idx, y, x, rlev, SUMMON_KIN, PM_ALLOW_GROUP, r_ptr->d_char);
2685         }
2686         return count;
2687 }
2688
2689 /*!
2690 * @brief RF6_S_KINの処理。救援召喚。使用するモンスターの種類により、実処理に分岐させる。 /
2691 * @param y 対象の地点のy座標
2692 * @param x 対象の地点のx座標
2693 * @param m_idx 呪文を唱えるモンスターID
2694 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2695 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2696 * @return 召喚したモンスターの数を返す。
2697 */
2698 void spell_RF6_S_KIN(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2699 {
2700         bool known = monster_near_player(m_idx, t_idx);
2701         bool see_either = see_monster(m_idx) || see_monster(t_idx);
2702         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2703         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2704         monster_type    *m_ptr = &m_list[m_idx];
2705         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
2706         int rlev = monster_level_idx(m_idx);
2707         int count = 0;
2708         GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN], m_poss[80];
2709         monster_name(m_idx, m_name);
2710         monster_name(t_idx, t_name);
2711         monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
2712
2713         disturb(TRUE, TRUE);
2714         if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT)
2715         {
2716                 monspell_message(m_idx, t_idx,
2717                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
2718                         _("%^sがダンジョンの主を召喚した。", "%^s magically summons guardians of dungeons."),
2719                         _("%^sがダンジョンの主を召喚した。", "%^s magically summons guardians of dungeons."),
2720                         TARGET_TYPE);
2721         }
2722         else
2723         {
2724                 if (mon_to_player || (mon_to_mon && known && see_either))
2725                         disturb(TRUE, TRUE);
2726
2727                 if (p_ptr->blind)
2728                 {
2729                         if (mon_to_player)
2730                                 msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
2731                 }
2732                 else
2733                 {
2734                         if (mon_to_player || (mon_to_mon && known && see_either))
2735                         {
2736                                 _(msg_format("%sが魔法で%sを召喚した。", m_name, ((r_ptr->flags1 & RF1_UNIQUE) ? "手下" : "仲間")),
2737                                   msg_format("%^s magically summons %s %s.", m_name, m_poss, ((r_ptr->flags1 & RF1_UNIQUE) ? "minions" : "kin")));
2738                         }
2739                 }
2740
2741                 if (mon_to_mon && known && !see_either)
2742                         mon_fight = TRUE;
2743         }
2744
2745         switch (m_ptr->r_idx)
2746         {
2747                 case MON_MENELDOR:
2748                 case MON_GWAIHIR:
2749                 case MON_THORONDOR:
2750                         count += summon_EAGLE(y, x, rlev, m_idx);
2751                         break;
2752
2753                 case MON_BULLGATES:
2754                         count += summon_IE(y, x, rlev, m_idx);
2755                         break;
2756
2757                 case MON_SERPENT:
2758                 case MON_ZOMBI_SERPENT:
2759                         count += summon_Guardian(y, x, rlev, m_idx, t_idx, TARGET_TYPE);
2760                         break;
2761                         
2762                 case MON_CALDARM:
2763                         count += summon_LOCK_CLONE(y, x, rlev, m_idx);
2764                         break;
2765
2766                 case MON_LOUSY:
2767                         count += summon_LOUSE(y, x, rlev, m_idx);
2768                         break;
2769
2770                 default:
2771                         count += summon_Kin(y, x, rlev, m_idx);
2772                         break;
2773         }
2774         
2775         if (p_ptr->blind && count && mon_to_player)
2776                 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
2777
2778         if (known && !see_monster(t_idx) && count && mon_to_mon)
2779                 mon_fight = TRUE;
2780 }
2781
2782 /*!
2783 * @brief RF6_S_CYBERの処理。サイバー・デーモン召喚。 /
2784 * @param y 対象の地点のy座標
2785 * @param x 対象の地点のx座標
2786 * @param m_idx 呪文を唱えるモンスターID
2787 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2788 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2789 * @return 召喚したモンスターの数を返す。
2790 */
2791 void spell_RF6_S_CYBER(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2792 {
2793         int count = 0;
2794         monster_type    *m_ptr = &m_list[m_idx];
2795         int rlev = monster_level_idx(m_idx);
2796         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2797         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2798         
2799         monspell_message(m_idx, t_idx,
2800                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2801                 _("%^sがサイバーデーモンを召喚した!", "%^s magically summons Cyberdemons!"),
2802                 _("%^sがサイバーデーモンを召喚した!", "%^s magically summons Cyberdemons!"),
2803                 TARGET_TYPE);
2804
2805         if (is_friendly(m_ptr) && mon_to_mon)
2806         {
2807                 count += summon_specific(m_idx, y, x, rlev, SUMMON_CYBER, (PM_ALLOW_GROUP), '\0');
2808         }
2809         else
2810         {
2811                 count += summon_cyber(m_idx, y, x);
2812         }
2813
2814         if (p_ptr->blind && count && mon_to_player)
2815                 msg_print(_("重厚な足音が近くで聞こえる。", "You hear heavy steps nearby."));
2816         
2817         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
2818                 mon_fight = TRUE;
2819 }
2820
2821 /*!
2822 * @brief RF6_S_MONSTERの処理。モンスター一体召喚。 /
2823 * @param y 対象の地点のy座標
2824 * @param x 対象の地点のx座標
2825 * @param m_idx 呪文を唱えるモンスターID
2826 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2827 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2828 * @return 召喚したモンスターの数を返す。
2829 */
2830 void spell_RF6_S_MONSTER(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2831 {
2832         int count = 0, k;
2833         int rlev = monster_level_idx(m_idx);
2834         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2835         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2836         
2837         monspell_message(m_idx, t_idx,
2838                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2839                 _("%^sが魔法で仲間を召喚した!", "%^s magically summons help!"),
2840                 _("%^sが魔法で仲間を召喚した!", "%^s magically summons help!"),
2841                 TARGET_TYPE);
2842
2843         for (k = 0; k < 1; k++)
2844         {
2845                 if(mon_to_player)
2846                         count += summon_specific(m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
2847
2848                 if(mon_to_mon)
2849                         count += summon_specific(m_idx, y, x, rlev, 0, (monster_u_mode(m_idx)), '\0');
2850         }
2851
2852         if (p_ptr->blind && count && mon_to_player)
2853                 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
2854         
2855         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
2856                 mon_fight = TRUE;
2857 }
2858
2859 /*!
2860 * @brief RF6_S_MONSTERSの処理。モンスター複数召喚。 /
2861 * @param y 対象の地点のy座標
2862 * @param x 対象の地点のx座標
2863 * @param m_idx 呪文を唱えるモンスターID
2864 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2865 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2866 * @return 召喚したモンスターの数を返す。
2867 */
2868 void spell_RF6_S_MONSTERS(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2869 {
2870         int count = 0, k;
2871         int rlev = monster_level_idx(m_idx);
2872         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2873         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2874         
2875         monspell_message(m_idx, t_idx,
2876                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2877                 _("%^sが魔法でモンスターを召喚した!", "%^s magically summons monsters!"),
2878                 _("%^sが魔法でモンスターを召喚した!", "%^s magically summons monsters!"),
2879                 TARGET_TYPE);
2880         
2881         for (k = 0; k < S_NUM_6; k++)
2882         {
2883                 if(mon_to_player)
2884                         count += summon_specific(m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
2885
2886                 if(mon_to_mon)
2887                         count += summon_specific(m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | monster_u_mode(m_idx)), '\0');
2888         }
2889
2890         if (p_ptr->blind && count && mon_to_player)
2891                 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
2892         
2893         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
2894                 mon_fight = TRUE;
2895 }
2896
2897 /*!
2898 * @brief RF6_S_ANTの処理。アリ召喚。 /
2899 * @param y 対象の地点のy座標
2900 * @param x 対象の地点のx座標
2901 * @param m_idx 呪文を唱えるモンスターID
2902 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2903 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2904 * @return 召喚したモンスターの数を返す。
2905 */
2906 void spell_RF6_S_ANT(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2907 {
2908         int count = 0, k;
2909         int rlev = monster_level_idx(m_idx);
2910         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2911         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2912         
2913         monspell_message(m_idx, t_idx,
2914                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2915                 _("%^sが魔法でアリを召喚した。", "%^s magically summons ants."),
2916                 _("%^sが魔法でアリを召喚した。", "%^s magically summons ants."),
2917                 TARGET_TYPE);
2918         
2919         for (k = 0; k < S_NUM_6; k++)
2920         {
2921                 count += summon_specific(m_idx, y, x, rlev, SUMMON_ANT, PM_ALLOW_GROUP, '\0');
2922         }
2923
2924         if (p_ptr->blind && count && mon_to_player)
2925                 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
2926         
2927         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
2928                 mon_fight = TRUE;
2929 }
2930
2931 /*!
2932 * @brief RF6_S_SPIDERの処理。クモ召喚。 /
2933 * @param y 対象の地点のy座標
2934 * @param x 対象の地点のx座標
2935 * @param m_idx 呪文を唱えるモンスターID
2936 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2937 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2938 * @return 召喚したモンスターの数を返す。
2939 */
2940 void spell_RF6_S_SPIDER(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2941 {
2942         int count = 0, k;
2943         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2944         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2945         int rlev = monster_level_idx(m_idx);
2946         
2947         monspell_message(m_idx, t_idx,
2948                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2949                 _("%^sが魔法でクモを召喚した。", "%^s magically summons spiders."),
2950                 _("%^sが魔法でクモを召喚した。", "%^s magically summons spiders."),
2951                 TARGET_TYPE);
2952         
2953         for (k = 0; k < S_NUM_6; k++)
2954         {
2955                 count += summon_specific(m_idx, y, x, rlev, SUMMON_SPIDER, PM_ALLOW_GROUP, '\0');
2956         }
2957
2958         if (p_ptr->blind && count && mon_to_player)
2959                 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
2960         
2961         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
2962                 mon_fight = TRUE;
2963 }
2964
2965 /*!
2966 * @brief RF6_S_HOUNDの処理。ハウンド召喚。 /
2967 * @param y 対象の地点のy座標
2968 * @param x 対象の地点のx座標
2969 * @param m_idx 呪文を唱えるモンスターID
2970 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
2971 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
2972 * @return 召喚したモンスターの数を返す。
2973 */
2974 void spell_RF6_S_HOUND(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
2975 {
2976         int count = 0, k;
2977         int rlev = monster_level_idx(m_idx);
2978         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
2979         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
2980         
2981         monspell_message(m_idx, t_idx,
2982                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
2983                 _("%^sが魔法でハウンドを召喚した。", "%^s magically summons hounds."),
2984                 _("%^sが魔法でハウンドを召喚した。", "%^s magically summons hounds."),
2985                 TARGET_TYPE);
2986         
2987         for (k = 0; k < S_NUM_4; k++)
2988         {
2989                 count += summon_specific(m_idx, y, x, rlev, SUMMON_HOUND, PM_ALLOW_GROUP, '\0');
2990         }
2991
2992         if (p_ptr->blind && count && mon_to_player)
2993                 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
2994         
2995         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
2996                 mon_fight = TRUE;
2997 }
2998
2999 /*!
3000 * @brief RF6_S_HYDRAの処理。ヒドラ召喚。 /
3001 * @param y 対象の地点のy座標
3002 * @param x 対象の地点のx座標
3003 * @param m_idx 呪文を唱えるモンスターID
3004 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3005 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3006 * @return 召喚したモンスターの数を返す。
3007 */
3008 void spell_RF6_S_HYDRA(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3009 {
3010         int count = 0, k;
3011         int rlev = monster_level_idx(m_idx);
3012         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3013         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
3014         
3015         monspell_message(m_idx, t_idx,
3016                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3017                 _("%^sが魔法でヒドラを召喚した。", "%^s magically summons hydras."),
3018                 _("%^sが魔法でヒドラを召喚した。", "%^s magically summons hydras."),
3019                 TARGET_TYPE);
3020         
3021         for (k = 0; k < S_NUM_4; k++)
3022         {
3023                 count += summon_specific(m_idx, y, x, rlev, SUMMON_HYDRA, PM_ALLOW_GROUP, '\0');
3024         }
3025
3026         if (p_ptr->blind && count && mon_to_player)
3027                 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
3028         
3029         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3030                 mon_fight = TRUE;
3031 }
3032
3033 /*!
3034 * @brief RF6_S_ANGELの処理。天使一体召喚。 /
3035 * @param y 対象の地点のy座標
3036 * @param x 対象の地点のx座標
3037 * @param m_idx 呪文を唱えるモンスターID
3038 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3039 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3040 * @return 召喚したモンスターの数を返す。
3041 */
3042 void spell_RF6_S_ANGEL(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3043 {
3044         int count = 0, k;
3045         int num = 1;
3046         monster_type    *m_ptr = &m_list[m_idx];
3047         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
3048         int rlev = monster_level_idx(m_idx);
3049         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3050         
3051         monspell_message(m_idx, t_idx,
3052                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3053                 _("%^sが魔法で天使を召喚した!", "%^s magically summons an angel!"),
3054                 _("%^sが魔法で天使を召喚した!", "%^s magically summons an angel!"),
3055                 TARGET_TYPE);
3056         
3057         if ((r_ptr->flags1 & RF1_UNIQUE) && !easy_band)
3058         {
3059                 num += r_ptr->level / 40;
3060         }
3061         
3062         for (k = 0; k < num; k++)
3063         {
3064                 count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, PM_ALLOW_GROUP, '\0');
3065         }
3066         
3067         if (count < 2)
3068         {
3069                 if (p_ptr->blind && count)
3070                         msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
3071         }
3072         else
3073         {
3074                 if (p_ptr->blind)
3075                         msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
3076         }
3077         
3078         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3079                 mon_fight = TRUE;
3080 }
3081
3082 /*!
3083 * @brief RF6_S_DEMONの処理。デーモン一体召喚。 /
3084 * @param y 対象の地点のy座標
3085 * @param x 対象の地点のx座標
3086 * @param m_idx 呪文を唱えるモンスターID
3087 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3088 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3089 * @return 召喚したモンスターの数を返す。
3090 */
3091 void spell_RF6_S_DEMON(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3092 {
3093         int count = 0, k;
3094         int rlev = monster_level_idx(m_idx);
3095         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3096         
3097         monspell_message(m_idx, t_idx,
3098                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3099                 _("%^sは魔法で混沌の宮廷から悪魔を召喚した!", "%^s magically summons a demon from the Courts of Chaos!"),
3100                 _("%^sは魔法で混沌の宮廷から悪魔を召喚した!", "%^s magically summons a demon from the Courts of Chaos!"),
3101                 TARGET_TYPE);
3102         
3103         for (k = 0; k < 1; k++)
3104         {
3105                 count += summon_specific(m_idx, y, x, rlev, SUMMON_DEMON, PM_ALLOW_GROUP, '\0');
3106         }
3107         
3108         if (p_ptr->blind && count)
3109                 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
3110         
3111         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3112                 mon_fight = TRUE;
3113 }
3114
3115 /*!
3116 * @brief RF6_S_UNDEADの処理。アンデッド一体召喚。 /
3117 * @param y 対象の地点のy座標
3118 * @param x 対象の地点のx座標
3119 * @param m_idx 呪文を唱えるモンスターID
3120 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3121 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3122 * @return 召喚したモンスターの数を返す。
3123 */
3124 void spell_RF6_S_UNDEAD(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3125 {
3126         int count = 0, k;
3127         int rlev = monster_level_idx(m_idx);
3128         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3129         
3130         monspell_message(m_idx, t_idx,
3131                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3132                 _("%^sが魔法でアンデッドの強敵を召喚した!", "%^s magically summons an undead adversary!"),
3133                 _("%sが魔法でアンデッドを召喚した。", "%^s magically summons undead."),
3134                 TARGET_TYPE);
3135         
3136         for (k = 0; k < 1; k++)
3137         {
3138                 count += summon_specific(m_idx, y, x, rlev, SUMMON_UNDEAD, PM_ALLOW_GROUP, '\0');
3139         }
3140         
3141         if (p_ptr->blind && count)
3142                 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
3143         
3144         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3145                 mon_fight = TRUE;
3146 }
3147
3148 /*!
3149 * @brief RF6_S_DRAGONの処理。ドラゴン一体召喚。 /
3150 * @param y 対象の地点のy座標
3151 * @param x 対象の地点のx座標
3152 * @param m_idx 呪文を唱えるモンスターID
3153 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3154 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3155 * @return 召喚したモンスターの数を返す。
3156 */
3157 void spell_RF6_S_DRAGON(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3158 {
3159         int count = 0, k;
3160         int rlev = monster_level_idx(m_idx);
3161         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3162         
3163         monspell_message(m_idx, t_idx,
3164                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3165                 _("%^sが魔法でドラゴンを召喚した!", "%^s magically summons a dragon!"),
3166                 _("%^sが魔法でドラゴンを召喚した!", "%^s magically summons a dragon!"),
3167                 TARGET_TYPE);
3168         
3169         for (k = 0; k < 1; k++)
3170         {
3171                 count += summon_specific(m_idx, y, x, rlev, SUMMON_DRAGON, PM_ALLOW_GROUP, '\0');
3172         }
3173         
3174         if (p_ptr->blind && count)
3175                 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
3176         
3177         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3178                 mon_fight = TRUE;
3179 }
3180
3181 /*!
3182 * @brief ナズグル戦隊召喚の処理。 /
3183 * @param y 対象の地点のy座標
3184 * @param x 対象の地点のx座標
3185 * @param m_idx 呪文を唱えるモンスターID
3186 * @return 召喚したモンスターの数を返す。
3187 */
3188 MONSTER_NUMBER summon_NAZGUL(POSITION y, POSITION x, MONSTER_IDX m_idx)
3189 {
3190         BIT_FLAGS mode = 0L;
3191         int count = 0, k;
3192         POSITION cy = y;
3193         POSITION cx = x;
3194         GAME_TEXT m_name[MAX_NLEN];
3195         monster_name(m_idx, m_name);
3196
3197         if (p_ptr->blind)
3198                 msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
3199         else
3200                 msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
3201
3202         msg_print(NULL);
3203
3204         for (k = 0; k < 30; k++)
3205         {
3206                 if (!summon_possible(cy, cx) || !cave_empty_bold(cy, cx))
3207                 {
3208                         int j;
3209                         for (j = 100; j > 0; j--)
3210                         {
3211                                 scatter(&cy, &cx, y, x, 2, 0);
3212                                 if (cave_empty_bold(cy, cx)) break;
3213                         }
3214                         if (!j) break;
3215                 }
3216                 if (!cave_empty_bold(cy, cx)) continue;
3217
3218                 if (summon_named_creature(m_idx, cy, cx, MON_NAZGUL, mode))
3219                 {
3220                         y = cy;
3221                         x = cx;
3222                         count++;
3223                         if (count == 1)
3224                                 msg_format(_("「幽鬼戦隊%d号、ナズグル・ブラック!」",
3225                                 "A Nazgul says 'Nazgul-Rangers Number %d, Nazgul-Black!'"), count);
3226                         else
3227                                 msg_format(_("「同じく%d号、ナズグル・ブラック!」",
3228                                 "Another one says 'Number %d, Nazgul-Black!'"), count);
3229
3230                         msg_print(NULL);
3231                 }
3232         }
3233         msg_format(_("「%d人そろって、リングレンジャー!」",
3234                 "They say 'The %d meets! We are the Ring-Ranger!'."), count);
3235         msg_print(NULL);
3236         return count;
3237 }
3238
3239 /*!
3240 * @brief RF6_S_HI_UNDEADの処理。強力なアンデッド召喚。 /
3241 * @param y 対象の地点のy座標
3242 * @param x 対象の地点のx座標
3243 * @param m_idx 呪文を唱えるモンスターID
3244 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3245 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3246 * @return 召喚したモンスターの数を返す。
3247 */
3248 void spell_RF6_S_HI_UNDEAD(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3249 {
3250         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3251         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
3252         monster_type    *m_ptr = &m_list[m_idx];
3253         int rlev = monster_level_idx(m_idx);
3254         int k, count = 0;
3255         GAME_TEXT m_name[MAX_NLEN];
3256         monster_name(m_idx, m_name);
3257
3258         disturb(TRUE, TRUE);
3259
3260         if (((m_ptr->r_idx == MON_MORGOTH) || (m_ptr->r_idx == MON_SAURON) || (m_ptr->r_idx == MON_ANGMAR)) &&
3261                 ((r_info[MON_NAZGUL].cur_num + 2) < r_info[MON_NAZGUL].max_num) &&
3262                 mon_to_player)
3263         {
3264                 count +=  summon_NAZGUL(y, x, m_idx);
3265         }
3266         else
3267         {       
3268                 monspell_message(m_idx, t_idx,
3269                         _("%^sが何かをつぶやいた。", "%^s mumbles."),
3270                         _("%^sが魔法で強力なアンデッドを召喚した!", "%^s magically summons greater undead!"),
3271                         _("%sが魔法でアンデッドを召喚した。", "%^s magically summons undead."),
3272                         TARGET_TYPE);
3273
3274                 for (k = 0; k < S_NUM_6; k++)
3275                 {
3276                         if(mon_to_player)
3277                                 count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
3278
3279                         if(mon_to_mon)
3280                                 count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | monster_u_mode(m_idx)), '\0');
3281                 }
3282         }
3283         if (p_ptr->blind && count && mon_to_player)
3284         {
3285                 msg_print(_("間近で何か多くのものが這い回る音が聞こえる。", "You hear many creepy things appear nearby."));
3286         }
3287         
3288         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3289                 mon_fight = TRUE;
3290 }
3291
3292 /*!
3293 * @brief RF6_S_HI_DRAGONの処理。古代ドラゴン召喚。 /
3294 * @param y 対象の地点のy座標
3295 * @param x 対象の地点のx座標
3296 * @param m_idx 呪文を唱えるモンスターID
3297 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3298 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3299 * @return 召喚したモンスターの数を返す。
3300 */
3301 void spell_RF6_S_HI_DRAGON(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3302 {
3303         int count = 0, k;
3304         int rlev = monster_level_idx(m_idx);
3305         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3306         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
3307         
3308         monspell_message(m_idx, t_idx,
3309                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3310                 _("%^sが魔法で古代ドラゴンを召喚した!", "%^s magically summons ancient dragons!"),
3311                 _("%^sが魔法で古代ドラゴンを召喚した!", "%^s magically summons ancient dragons!"),
3312                 TARGET_TYPE);
3313         
3314         for (k = 0; k < S_NUM_4; k++)
3315         {       
3316                 if(mon_to_player)
3317                         count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
3318
3319                 if(mon_to_mon)
3320                         count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | monster_u_mode(m_idx)), '\0');
3321         }
3322         
3323         if (p_ptr->blind && count && mon_to_player)
3324         {
3325                 msg_print(_("多くの力強いものが間近に現れた音が聞こえる。", "You hear many powerful things appear nearby."));
3326         }
3327         
3328         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3329                 mon_fight = TRUE;
3330 }
3331
3332 /*!
3333 * @brief RF6_S_AMBERITESの処理。アンバーの王族召喚。 /
3334 * @param y 対象の地点のy座標
3335 * @param x 対象の地点のx座標
3336 * @param m_idx 呪文を唱えるモンスターID
3337 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3338 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3339 * @return 召喚したモンスターの数を返す。
3340 */
3341 void spell_RF6_S_AMBERITES(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3342 {
3343         int count = 0, k;
3344         int rlev = monster_level_idx(m_idx);
3345         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3346         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
3347         
3348         monspell_message(m_idx, t_idx,
3349                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3350                 _("%^sがアンバーの王族を召喚した!", "%^s magically summons Lords of Amber!"),
3351                 _("%^sがアンバーの王族を召喚した!", "%^s magically summons Lords of Amber!"),
3352                 TARGET_TYPE);
3353         
3354         for (k = 0; k < S_NUM_4; k++)
3355         {       
3356                 count += summon_specific(m_idx, y, x, rlev, SUMMON_AMBERITES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
3357         }
3358         
3359         if (p_ptr->blind && count && mon_to_player)
3360         {
3361                 msg_print(_("不死の者が近くに現れるのが聞こえた。", "You hear immortal beings appear nearby."));
3362         }
3363         
3364         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3365                 mon_fight = TRUE;
3366 }
3367
3368 /*!
3369 * @brief RF6_S_UNIQUEの処理。ユニーク・モンスター召喚。 /
3370 * @param y 対象の地点のy座標
3371 * @param x 対象の地点のx座標
3372 * @param m_idx 呪文を唱えるモンスターID
3373 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3374 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
3375 * @return 召喚したモンスターの数を返す。
3376 */
3377 void spell_RF6_S_UNIQUE(POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
3378 {
3379         int count = 0, k;
3380         monster_type    *m_ptr = &m_list[m_idx];
3381         int rlev = monster_level_idx(m_idx);
3382         bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
3383         bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
3384         bool uniques_are_summoned = FALSE;
3385         int non_unique_type = SUMMON_HI_UNDEAD;
3386         
3387         monspell_message(m_idx, t_idx,
3388                 _("%^sが何かをつぶやいた。", "%^s mumbles."),
3389                 _("%^sが魔法で特別な強敵を召喚した!", "%^s magically summons special opponents!"),
3390                 _("%^sが魔法で特別な強敵を召喚した!", "%^s magically summons special opponents!"),
3391                 TARGET_TYPE);
3392         
3393         for (k = 0; k < S_NUM_4; k++)
3394         {       
3395                 count += summon_specific(m_idx, y, x, rlev, SUMMON_UNIQUE, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
3396         }
3397         
3398         if (count) uniques_are_summoned = TRUE;
3399
3400         if ((m_ptr->sub_align & (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL)) == (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL))
3401                 non_unique_type = 0;
3402         else if (m_ptr->sub_align & SUB_ALIGN_GOOD)
3403                 non_unique_type = SUMMON_ANGEL;
3404
3405         for (k = count; k < S_NUM_4; k++)
3406         {
3407                 count += summon_specific(m_idx, y, x, rlev, non_unique_type, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE), '\0');
3408         }
3409
3410         if (p_ptr->blind && count && mon_to_player)
3411         {
3412                 msg_format(_("多くの%sが間近に現れた音が聞こえる。", "You hear many %s appear nearby."),
3413                         uniques_are_summoned ? _("力強いもの", "powerful things") : _("もの", "things"));
3414         }
3415         
3416         if (monster_near_player(m_idx, t_idx) && !see_monster(t_idx) && count && mon_to_mon)
3417                 mon_fight = TRUE;
3418 }
3419
3420
3421
3422 /*!
3423 * @brief モンスターからプレイヤーへの呪文の振り分け関数。 /
3424 * @param SPELL_NUM モンスター魔法ID
3425 * @param y 対象の地点のy座標
3426 * @param x 対象の地点のx座標
3427 * @param m_idx 呪文を唱えるモンスターID
3428 * @return 攻撃呪文のダメージ、または召喚したモンスターの数を返す。その他の場合0。以降の処理を中断するなら-1を返す。
3429 */
3430 HIT_POINT monspell_to_player(int SPELL_NUM, POSITION y, POSITION x, MONSTER_IDX m_idx)
3431 {
3432         switch (SPELL_NUM)
3433         {
3434         case RF4_SPELL_START + 0:   spell_RF4_SHRIEK(m_idx, 0, MONSTER_TO_PLAYER); break;       /* RF4_SHRIEK */
3435         case RF4_SPELL_START + 1:   break;   /* RF4_XXX1 */
3436         case RF4_SPELL_START + 2:   spell_RF4_DISPEL(m_idx, 0, MONSTER_TO_PLAYER); break;       /* RF4_DISPEL */
3437         case RF4_SPELL_START + 3:   return spell_RF4_ROCKET(y, x, m_idx, 0, MONSTER_TO_PLAYER);  /* RF4_ROCKET */
3438         case RF4_SPELL_START + 4:   return spell_RF4_SHOOT(y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF4_SHOOT */
3439         case RF4_SPELL_START + 5:   break;   /* RF4_XXX2 */
3440         case RF4_SPELL_START + 6:   break;   /* RF4_XXX3 */
3441         case RF4_SPELL_START + 7:   break;   /* RF4_XXX4 */
3442         case RF4_SPELL_START + 8:   return spell_RF4_BREATH(GF_ACID, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_ACID */
3443         case RF4_SPELL_START + 9:   return spell_RF4_BREATH(GF_ELEC, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_ELEC */
3444         case RF4_SPELL_START + 10:  return spell_RF4_BREATH(GF_FIRE, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_FIRE */
3445         case RF4_SPELL_START + 11:  return spell_RF4_BREATH(GF_COLD, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_COLD */
3446         case RF4_SPELL_START + 12:  return spell_RF4_BREATH(GF_POIS, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_POIS */
3447         case RF4_SPELL_START + 13:  return spell_RF4_BREATH(GF_NETHER, y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF4_BR_NETH */
3448         case RF4_SPELL_START + 14:  return spell_RF4_BREATH(GF_LITE, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_LITE */
3449         case RF4_SPELL_START + 15:  return spell_RF4_BREATH(GF_DARK, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_DARK */
3450         case RF4_SPELL_START + 16:  return spell_RF4_BREATH(GF_CONFUSION, y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF4_BR_CONF */
3451         case RF4_SPELL_START + 17:  return spell_RF4_BREATH(GF_SOUND, y, x, m_idx, 0, MONSTER_TO_PLAYER);       /* RF4_BR_SOUN */
3452         case RF4_SPELL_START + 18:  return spell_RF4_BREATH(GF_CHAOS, y, x, m_idx, 0, MONSTER_TO_PLAYER);       /* RF4_BR_CHAO */
3453         case RF4_SPELL_START + 19:  return spell_RF4_BREATH(GF_DISENCHANT, y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF4_BR_DISE */
3454         case RF4_SPELL_START + 20:  return spell_RF4_BREATH(GF_NEXUS, y, x, m_idx, 0, MONSTER_TO_PLAYER);       /* RF4_BR_NEXU */
3455         case RF4_SPELL_START + 21:  return spell_RF4_BREATH(GF_TIME, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_TIME */
3456         case RF4_SPELL_START + 22:  return spell_RF4_BREATH(GF_INERTIAL, y, x, m_idx, 0, MONSTER_TO_PLAYER);  /* RF4_BR_INER */
3457         case RF4_SPELL_START + 23:  return spell_RF4_BREATH(GF_GRAVITY, y, x, m_idx, 0, MONSTER_TO_PLAYER);  /* RF4_BR_GRAV */
3458         case RF4_SPELL_START + 24:  return spell_RF4_BREATH(GF_SHARDS, y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF4_BR_SHAR */
3459         case RF4_SPELL_START + 25:  return spell_RF4_BREATH(GF_PLASMA, y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF4_BR_PLAS */
3460         case RF4_SPELL_START + 26:  return spell_RF4_BREATH(GF_FORCE, y, x, m_idx, 0, MONSTER_TO_PLAYER);       /* RF4_BR_WALL */
3461         case RF4_SPELL_START + 27:  return spell_RF4_BREATH(GF_MANA, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_MANA */
3462         case RF4_SPELL_START + 28:  return spell_RF4_BA_NUKE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BA_NUKE */
3463         case RF4_SPELL_START + 29:  return spell_RF4_BREATH(GF_NUKE, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_NUKE */
3464         case RF4_SPELL_START + 30:  return spell_RF4_BA_CHAO(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BA_CHAO */
3465         case RF4_SPELL_START + 31:  return spell_RF4_BREATH(GF_DISINTEGRATE, y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF4_BR_DISI */
3466         case RF5_SPELL_START + 0:  return spell_RF5_BA_ACID(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_ACID */
3467         case RF5_SPELL_START + 1:  return spell_RF5_BA_ELEC(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_ELEC */
3468         case RF5_SPELL_START + 2:  return spell_RF5_BA_FIRE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_FIRE */
3469         case RF5_SPELL_START + 3:  return spell_RF5_BA_COLD(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_COLD */
3470         case RF5_SPELL_START + 4:  return spell_RF5_BA_POIS(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_POIS */
3471         case RF5_SPELL_START + 5:  return spell_RF5_BA_NETH(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_NETH */
3472         case RF5_SPELL_START + 6:  return spell_RF5_BA_WATE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_WATE */
3473         case RF5_SPELL_START + 7:  return spell_RF5_BA_MANA(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_MANA */
3474         case RF5_SPELL_START + 8:  return spell_RF5_BA_DARK(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_DARK */
3475         case RF5_SPELL_START + 9:  return spell_RF5_DRAIN_MANA(y, x, m_idx, 0, MONSTER_TO_PLAYER);  /* RF5_DRAIN_MANA */
3476         case RF5_SPELL_START + 10: return spell_RF5_MIND_BLAST(y, x, m_idx, 0, MONSTER_TO_PLAYER);  /* RF5_MIND_BLAST */
3477         case RF5_SPELL_START + 11: return spell_RF5_BRAIN_SMASH(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_MIND_BLAST */
3478         case RF5_SPELL_START + 12: return spell_RF5_CAUSE_1(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_CAUSE_1 */
3479         case RF5_SPELL_START + 13: return spell_RF5_CAUSE_2(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_CAUSE_2 */
3480         case RF5_SPELL_START + 14: return spell_RF5_CAUSE_3(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_CAUSE_3 */
3481         case RF5_SPELL_START + 15: return spell_RF5_CAUSE_4(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_CAUSE_4 */
3482         case RF5_SPELL_START + 16: return spell_RF5_BO_ACID(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_ACID */
3483         case RF5_SPELL_START + 17: return spell_RF5_BO_ELEC(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_ELEC */
3484         case RF5_SPELL_START + 18: return spell_RF5_BO_FIRE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_FIRE */
3485         case RF5_SPELL_START + 19: return spell_RF5_BO_COLD(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_COLD */
3486         case RF5_SPELL_START + 20: return spell_RF5_BA_LITE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BA_LITE */
3487         case RF5_SPELL_START + 21: return spell_RF5_BO_NETH(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_NETH */
3488         case RF5_SPELL_START + 22: return spell_RF5_BO_WATE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_WATE */
3489         case RF5_SPELL_START + 23: return spell_RF5_BO_MANA(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_MANA */
3490         case RF5_SPELL_START + 24: return spell_RF5_BO_PLAS(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_PLAS */
3491         case RF5_SPELL_START + 25: return spell_RF5_BO_ICEE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_BO_ICEE */
3492         case RF5_SPELL_START + 26: return spell_RF5_MISSILE(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF5_MISSILE */
3493         case RF5_SPELL_START + 27: spell_RF5_SCARE(m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF5_SCARE */
3494         case RF5_SPELL_START + 28: spell_RF5_BLIND(m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF5_BLIND */
3495         case RF5_SPELL_START + 29: spell_RF5_CONF(m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF5_CONF */
3496         case RF5_SPELL_START + 30: spell_RF5_SLOW(m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF5_SLOW */
3497         case RF5_SPELL_START + 31: spell_RF5_HOLD(m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF5_HOLD */
3498         case RF6_SPELL_START + 0:  spell_RF6_HASTE(m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_HASTE */
3499         case RF6_SPELL_START + 1:  return spell_RF6_HAND_DOOM(y, x, m_idx, 0, MONSTER_TO_PLAYER); /* RF6_HAND_DOOM */
3500         case RF6_SPELL_START + 2:  spell_RF6_HEAL(m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_HEAL */
3501         case RF6_SPELL_START + 3:  spell_RF6_INVULNER(m_idx, 0, MONSTER_TO_PLAYER); break;      /* RF6_INVULNER */
3502         case RF6_SPELL_START + 4:  spell_RF6_BLINK(m_idx, MONSTER_TO_PLAYER); break;   /* RF6_BLINK */
3503         case RF6_SPELL_START + 5:  spell_RF6_TPORT(m_idx, MONSTER_TO_PLAYER); break;   /* RF6_TPORT */
3504         case RF6_SPELL_START + 6:  return spell_RF6_WORLD(m_idx); break;        /* RF6_WORLD */
3505         case RF6_SPELL_START + 7:  return spell_RF6_SPECIAL(y, x, m_idx, 0, MONSTER_TO_PLAYER);   /* RF6_SPECIAL */
3506         case RF6_SPELL_START + 8:  spell_RF6_TELE_TO(m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_TELE_TO */
3507         case RF6_SPELL_START + 9:  spell_RF6_TELE_AWAY(m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_TELE_AWAY */
3508         case RF6_SPELL_START + 10: spell_RF6_TELE_LEVEL(m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_TELE_LEVEL */
3509         case RF6_SPELL_START + 11: spell_RF6_PSY_SPEAR(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_PSY_SPEAR */
3510         case RF6_SPELL_START + 12: spell_RF6_DARKNESS(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;        /* RF6_DARKNESS */
3511         case RF6_SPELL_START + 13: spell_RF6_TRAPS(y, x, m_idx); break; /* RF6_TRAPS */
3512         case RF6_SPELL_START + 14: spell_RF6_FORGET(m_idx); break;  /* RF6_FORGET */
3513         case RF6_SPELL_START + 15: spell_RF6_RAISE_DEAD(m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_RAISE_DEAD */
3514         case RF6_SPELL_START + 16: spell_RF6_S_KIN(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_KIN */
3515         case RF6_SPELL_START + 17: spell_RF6_S_CYBER(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_CYBER */
3516         case RF6_SPELL_START + 18: spell_RF6_S_MONSTER(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_MONSTER */
3517         case RF6_SPELL_START + 19: spell_RF6_S_MONSTERS(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;      /* RF6_S_MONSTER */
3518         case RF6_SPELL_START + 20: spell_RF6_S_ANT(y, x, m_idx, 0, MONSTER_TO_PLAYER); break; /* RF6_S_ANT */
3519         case RF6_SPELL_START + 21: spell_RF6_S_SPIDER(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_S_SPIDER */
3520         case RF6_SPELL_START + 22: spell_RF6_S_HOUND(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_HOUND */
3521         case RF6_SPELL_START + 23: spell_RF6_S_HYDRA(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_HYDRA */
3522         case RF6_SPELL_START + 24: spell_RF6_S_ANGEL(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_ANGEL */
3523         case RF6_SPELL_START + 25: spell_RF6_S_DEMON(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_DEMON */
3524         case RF6_SPELL_START + 26: spell_RF6_S_UNDEAD(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_S_UNDEAD */
3525         case RF6_SPELL_START + 27: spell_RF6_S_DRAGON(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_S_DRAGON */
3526         case RF6_SPELL_START + 28: spell_RF6_S_HI_UNDEAD(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_HI_UNDEAD */
3527         case RF6_SPELL_START + 29: spell_RF6_S_HI_DRAGON(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_HI_DRAGON */
3528         case RF6_SPELL_START + 30: spell_RF6_S_AMBERITES(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;   /* RF6_S_AMBERITES */
3529         case RF6_SPELL_START + 31: spell_RF6_S_UNIQUE(y, x, m_idx, 0, MONSTER_TO_PLAYER); break;  /* RF6_S_UNIQUE */
3530         }
3531         return 0;
3532 }
3533
3534 /*!
3535 * @brief モンスターからモンスターへの呪文の振り分け関数。 /
3536 * @param SPELL_NUM モンスター魔法ID
3537 * @param y 対象の地点のy座標
3538 * @param x 対象の地点のx座標
3539 * @param m_idx 呪文を唱えるモンスターID
3540 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
3541 * @return 攻撃呪文のダメージ、または召喚したモンスターの数を返す。その他の場合0。以降の処理を中断するなら-1を返す。
3542 */
3543 HIT_POINT monspell_to_monster(int SPELL_NUM, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
3544 {
3545         switch (SPELL_NUM)
3546         {
3547         case RF4_SPELL_START + 0:   spell_RF4_SHRIEK(m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF4_SHRIEK */
3548         case RF4_SPELL_START + 1:   return -1;   /* RF4_XXX1 */
3549         case RF4_SPELL_START + 2:   spell_RF4_DISPEL(m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF4_DISPEL */
3550         case RF4_SPELL_START + 3:   return spell_RF4_ROCKET(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); /* RF4_ROCKET */
3551         case RF4_SPELL_START + 4:   return spell_RF4_SHOOT(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);  /* RF4_SHOOT */
3552         case RF4_SPELL_START + 5:   return -1;   /* RF4_XXX2 */
3553         case RF4_SPELL_START + 6:   return -1;   /* RF4_XXX3 */
3554         case RF4_SPELL_START + 7:   return -1;   /* RF4_XXX4 */
3555         case RF4_SPELL_START + 8:   return spell_RF4_BREATH(GF_ACID, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_ACID */
3556         case RF4_SPELL_START + 9:   return spell_RF4_BREATH(GF_ELEC, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_ELEC */
3557         case RF4_SPELL_START + 10:  return spell_RF4_BREATH(GF_FIRE, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_FIRE */
3558         case RF4_SPELL_START + 11:  return spell_RF4_BREATH(GF_COLD, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_COLD */
3559         case RF4_SPELL_START + 12:  return spell_RF4_BREATH(GF_POIS, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_POIS */
3560         case RF4_SPELL_START + 13:  return spell_RF4_BREATH(GF_NETHER, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);  /* RF4_BR_NETH */
3561         case RF4_SPELL_START + 14:  return spell_RF4_BREATH(GF_LITE, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_LITE */
3562         case RF4_SPELL_START + 15:  return spell_RF4_BREATH(GF_DARK, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_DARK */
3563         case RF4_SPELL_START + 16:  return spell_RF4_BREATH(GF_CONFUSION, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_CONF */
3564         case RF4_SPELL_START + 17:  return spell_RF4_BREATH(GF_SOUND, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_SOUN */
3565         case RF4_SPELL_START + 18:  return spell_RF4_BREATH(GF_CHAOS, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_CHAO */
3566         case RF4_SPELL_START + 19:  return spell_RF4_BREATH(GF_DISENCHANT, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);  /* RF4_BR_DISE */
3567         case RF4_SPELL_START + 20:  return spell_RF4_BREATH(GF_NEXUS, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_NEXU */
3568         case RF4_SPELL_START + 21:  return spell_RF4_BREATH(GF_TIME, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_TIME */
3569         case RF4_SPELL_START + 22:  return spell_RF4_BREATH(GF_INERTIAL, y, x, m_idx, t_idx, MONSTER_TO_MONSTER); /* RF4_BR_INER */
3570         case RF4_SPELL_START + 23:  return spell_RF4_BREATH(GF_GRAVITY, y, x, m_idx, t_idx, MONSTER_TO_MONSTER); /* RF4_BR_GRAV */
3571         case RF4_SPELL_START + 24:  return spell_RF4_BREATH(GF_SHARDS, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);  /* RF4_BR_SHAR */
3572         case RF4_SPELL_START + 25:  return spell_RF4_BREATH(GF_PLASMA, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);  /* RF4_BR_PLAS */
3573         case RF4_SPELL_START + 26:  return spell_RF4_BREATH(GF_FORCE, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_WALL */
3574         case RF4_SPELL_START + 27:  return spell_RF4_BREATH(GF_MANA, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_MANA */
3575         case RF4_SPELL_START + 28:  return spell_RF4_BA_NUKE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BA_NUKE */
3576         case RF4_SPELL_START + 29:  return spell_RF4_BREATH(GF_NUKE, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_NUKE */
3577         case RF4_SPELL_START + 30:  return spell_RF4_BA_CHAO(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BA_CHAO */
3578         case RF4_SPELL_START + 31:  return spell_RF4_BREATH(GF_DISINTEGRATE, y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF4_BR_DISI */
3579         case RF5_SPELL_START + 0:  return spell_RF5_BA_ACID(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_ACID */
3580         case RF5_SPELL_START + 1:  return spell_RF5_BA_ELEC(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_ELEC */
3581         case RF5_SPELL_START + 2:  return spell_RF5_BA_FIRE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_FIRE */
3582         case RF5_SPELL_START + 3:  return spell_RF5_BA_COLD(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_COLD */
3583         case RF5_SPELL_START + 4:  return spell_RF5_BA_POIS(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_POIS */
3584         case RF5_SPELL_START + 5:  return spell_RF5_BA_NETH(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_NETH */
3585         case RF5_SPELL_START + 6:  return spell_RF5_BA_WATE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_WATE */
3586         case RF5_SPELL_START + 7:  return spell_RF5_BA_MANA(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_MANA */
3587         case RF5_SPELL_START + 8:  return spell_RF5_BA_DARK(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_DARK */
3588         case RF5_SPELL_START + 9:  return spell_RF5_DRAIN_MANA(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); /* RF5_DRAIN_MANA */
3589         case RF5_SPELL_START + 10: return spell_RF5_MIND_BLAST(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); /* RF5_MIND_BLAST */
3590         case RF5_SPELL_START + 11: return spell_RF5_BRAIN_SMASH(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);        /* RF5_BRAIN_SMASH */
3591         case RF5_SPELL_START + 12: return spell_RF5_CAUSE_1(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_CAUSE_1 */
3592         case RF5_SPELL_START + 13: return spell_RF5_CAUSE_2(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_CAUSE_2 */
3593         case RF5_SPELL_START + 14: return spell_RF5_CAUSE_3(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_CAUSE_3 */
3594         case RF5_SPELL_START + 15: return spell_RF5_CAUSE_4(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_CAUSE_4 */
3595         case RF5_SPELL_START + 16: return spell_RF5_BO_ACID(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_ACID */
3596         case RF5_SPELL_START + 17: return spell_RF5_BO_ELEC(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_ELEC */
3597         case RF5_SPELL_START + 18: return spell_RF5_BO_FIRE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_FIRE */
3598         case RF5_SPELL_START + 19: return spell_RF5_BO_COLD(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_COLD */
3599         case RF5_SPELL_START + 20: return spell_RF5_BA_LITE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BA_LITE */
3600         case RF5_SPELL_START + 21: return spell_RF5_BO_NETH(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_NETH */
3601         case RF5_SPELL_START + 22: return spell_RF5_BO_WATE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_WATE */
3602         case RF5_SPELL_START + 23: return spell_RF5_BO_MANA(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_MANA */
3603         case RF5_SPELL_START + 24: return spell_RF5_BO_PLAS(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_PLAS */
3604         case RF5_SPELL_START + 25: return spell_RF5_BO_ICEE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_BO_ICEE */
3605         case RF5_SPELL_START + 26: return spell_RF5_MISSILE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);    /* RF5_MISSILE */
3606         case RF5_SPELL_START + 27: spell_RF5_SCARE(m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF5_SCARE */
3607         case RF5_SPELL_START + 28: spell_RF5_BLIND(m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF5_BLIND */
3608         case RF5_SPELL_START + 29: spell_RF5_CONF(m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF5_CONF */
3609         case RF5_SPELL_START + 30: spell_RF5_SLOW(m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF5_SLOW */
3610         case RF5_SPELL_START + 31: spell_RF5_HOLD(m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF5_HOLD */
3611         case RF6_SPELL_START + 0:  spell_RF6_HASTE(m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_HASTE */
3612         case RF6_SPELL_START + 1:  return spell_RF6_HAND_DOOM(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); /* RF6_HAND_DOOM */
3613         case RF6_SPELL_START + 2:  spell_RF6_HEAL(m_idx, t_idx, MONSTER_TO_MONSTER); break;     /* RF6_HEAL */
3614         case RF6_SPELL_START + 3:  spell_RF6_INVULNER(m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_INVULNER */
3615         case RF6_SPELL_START + 4:  spell_RF6_BLINK(m_idx, MONSTER_TO_MONSTER); break;   /* RF6_BLINK */
3616         case RF6_SPELL_START + 5:  spell_RF6_TPORT(m_idx, MONSTER_TO_MONSTER); break;   /* RF6_TPORT */
3617         case RF6_SPELL_START + 6:  return -1; break;    /* RF6_WORLD */
3618         case RF6_SPELL_START + 7:  return spell_RF6_SPECIAL(y, x, m_idx, t_idx, MONSTER_TO_MONSTER);   /* RF6_SPECIAL */
3619         case RF6_SPELL_START + 8:  spell_RF6_TELE_TO(m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_TELE_TO */
3620         case RF6_SPELL_START + 9:  spell_RF6_TELE_AWAY(m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_TELE_AWAY */
3621         case RF6_SPELL_START + 10: spell_RF6_TELE_LEVEL(m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF6_TELE_LEVEL */
3622         case RF6_SPELL_START + 11: return spell_RF6_PSY_SPEAR(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_PSY_SPEAR */
3623         case RF6_SPELL_START + 12: spell_RF6_DARKNESS(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_DARKNESS */
3624         case RF6_SPELL_START + 13: return -1; /* RF6_TRAPS */
3625         case RF6_SPELL_START + 14: return -1;  /* RF6_FORGET */
3626         case RF6_SPELL_START + 15: spell_RF6_RAISE_DEAD(m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF6_RAISE_DEAD */
3627         case RF6_SPELL_START + 16: spell_RF6_S_KIN(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_KIN */
3628         case RF6_SPELL_START + 17: spell_RF6_S_CYBER(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_CYBER */
3629         case RF6_SPELL_START + 18: spell_RF6_S_MONSTER(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_MONSTER */
3630         case RF6_SPELL_START + 19: spell_RF6_S_MONSTERS(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_MONSTER */
3631         case RF6_SPELL_START + 20: spell_RF6_S_ANT(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break; /* RF6_S_ANT */
3632         case RF6_SPELL_START + 21: spell_RF6_S_SPIDER(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF6_S_SPIDER */
3633         case RF6_SPELL_START + 22: spell_RF6_S_HOUND(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_HOUND */
3634         case RF6_SPELL_START + 23: spell_RF6_S_HYDRA(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_HYDRA */
3635         case RF6_SPELL_START + 24: spell_RF6_S_ANGEL(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_ANGEL */
3636         case RF6_SPELL_START + 25: spell_RF6_S_DEMON(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_DEMON */
3637         case RF6_SPELL_START + 26: spell_RF6_S_UNDEAD(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF6_S_UNDEAD */
3638         case RF6_SPELL_START + 27: spell_RF6_S_DRAGON(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF6_S_DRAGON */
3639         case RF6_SPELL_START + 28: spell_RF6_S_HI_UNDEAD(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_HI_UNDEAD */
3640         case RF6_SPELL_START + 29: spell_RF6_S_HI_DRAGON(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_HI_DRAGON */
3641         case RF6_SPELL_START + 30: spell_RF6_S_AMBERITES(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;   /* RF6_S_AMBERITES */
3642         case RF6_SPELL_START + 31: spell_RF6_S_UNIQUE(y, x, m_idx, t_idx, MONSTER_TO_MONSTER); break;  /* RF6_S_UNIQUE */
3643         }
3644         return 0;
3645 }
3646
3647 /*!
3648 * @brief モンスターの使う呪文の威力を決定する /
3649 * @param dam 定数値
3650 * @param dice_num ダイス数
3651 * @param dice_side ダイス面
3652 * @param mult ダイス倍率
3653 * @param div ダイス倍率
3654 * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
3655 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
3656 */
3657 HIT_POINT monspell_damage_roll(HIT_POINT dam, int dice_num, int dice_side, int mult, int div, int TYPE)
3658 {
3659         switch (TYPE)
3660         {
3661                 case DAM_MAX: dam += maxroll(dice_num, dice_side) * mult / div; break;
3662                 case DAM_MIN: dam += dice_num * 1 * mult / div; break;
3663                 case DAM_ROLL: dam += damroll(dice_num, dice_side) * mult / div; break;
3664                 case DICE_NUM: return dice_num;
3665                 case DICE_SIDE: return dice_side;
3666                 case DICE_MULT: return mult;
3667                 case DICE_DIV: return div;
3668                 case BASE_DAM: return dam;
3669         }
3670         if (dam < 1) dam = 1;
3671         return dam;
3672 }
3673
3674 /*!
3675 * @brief モンスターの使う呪文の威力を返す /
3676 * @param SPELL_NUM 呪文番号
3677 * @param hp 呪文を唱えるモンスターの体力
3678 * @param rlev 呪文を唱えるモンスターのレベル
3679 * @param powerful 呪文を唱えるモンスターのpowerfulフラグ
3680 * @param shoot_dd 射撃のダイス数
3681 * @param shoot_ds 射撃のダイス面
3682 * @param shoot_base 射撃の固定威力値
3683 * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
3684 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
3685 */
3686 HIT_POINT monspell_damage_base(int SPELL_NUM, int hp, int rlev, bool powerful, int shoot_dd, int shoot_ds, int shoot_base, int TYPE)
3687 {
3688         HIT_POINT dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
3689
3690         switch (SPELL_NUM)
3691         {
3692         case MS_SHRIEK:   return -1;   /* RF4_SHRIEK */
3693         case MS_XXX1:   return -1;   /* RF4_XXX1 */
3694         case MS_DISPEL:   return -1;   /* RF4_DISPEL */
3695
3696                 /* RF4_ROCKET */
3697         case MS_ROCKET:
3698                 dam = (hp / 4) > 800 ? 800 : (hp / 4);
3699                 break;
3700
3701                 /* RF4_SHOOT */
3702         case MS_SHOOT:
3703                 dice_num = shoot_dd;
3704                 dice_side = shoot_ds;
3705                 dam = shoot_base;
3706                 break;
3707         case MS_XXX2:   return -1;   /* RF4_XXX2 */
3708         case MS_XXX3:   return -1;   /* RF4_XXX3 */
3709         case MS_XXX4:   return -1;   /* RF4_XXX4 */
3710
3711                 /* RF4_BR_ACID */
3712                 /* RF4_BR_ELEC */
3713                 /* RF4_BR_FIRE */
3714                 /* RF4_BR_COLD */
3715         case MS_BR_ACID:
3716         case MS_BR_ELEC:
3717         case MS_BR_FIRE:
3718         case MS_BR_COLD:
3719                 dam = ((hp / 3) > 1600 ? 1600 : (hp / 3));
3720                 break;
3721
3722                 /* RF4_BR_POIS */
3723         case MS_BR_POIS:
3724                 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
3725                 break;
3726
3727                 /* RF4_BR_NETH */
3728         case MS_BR_NETHER:
3729                 dam = ((hp / 6) > 550 ? 550 : (hp / 6));
3730                 break;
3731
3732                 /* RF4_BR_LITE */
3733                 /* RF4_BR_DARK */
3734         case MS_BR_LITE:
3735         case MS_BR_DARK:
3736                 dam = ((hp / 6) > 400 ? 400 : (hp / 6));
3737                 break;
3738
3739                 /* RF4_BR_CONF */
3740                 /* RF4_BR_SOUN */
3741         case MS_BR_CONF:
3742         case MS_BR_SOUND:
3743                 dam = ((hp / 6) > 450 ? 450 : (hp / 6));
3744                 break;
3745
3746                 /* RF4_BR_CHAO */
3747         case MS_BR_CHAOS:
3748                 dam = ((hp / 6) > 600 ? 600 : (hp / 6));
3749                 break;
3750
3751                 /* RF4_BR_DISE */
3752         case MS_BR_DISEN:
3753                 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
3754                 break;
3755
3756                 /* RF4_BR_NEXU */
3757         case MS_BR_NEXUS:
3758                 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
3759                 break;
3760
3761                 /* RF4_BR_TIME */
3762         case MS_BR_TIME:
3763                 dam = ((hp / 3) > 150 ? 150 : (hp / 3));
3764                 break;
3765
3766                 /* RF4_BR_INER */
3767                 /* RF4_BR_GRAV */
3768         case MS_BR_INERTIA:
3769         case MS_BR_GRAVITY:
3770                 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
3771                 break;
3772
3773                 /* RF4_BR_SHAR */
3774         case MS_BR_SHARDS:
3775                 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
3776                 break;
3777
3778                 /* RF4_BR_PLAS */
3779         case MS_BR_PLASMA:
3780                 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
3781                 break;
3782
3783                 /* RF4_BR_WALL */
3784         case MS_BR_FORCE:
3785                 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
3786                 break;
3787
3788                 /* RF4_BR_MANA */
3789         case MS_BR_MANA:
3790                 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
3791                 break;
3792
3793                 /* RF4_BA_NUKE */
3794         case MS_BALL_NUKE:
3795                 mult = powerful ? 2 : 1;
3796                 dam = rlev * (mult / div);
3797                 dice_num = 10;
3798                 dice_side = 6;
3799                 break;
3800
3801                 /* RF4_BR_NUKE */
3802         case MS_BR_NUKE:
3803                 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
3804                 break;
3805
3806                 /* RF4_BA_CHAO */
3807         case MS_BALL_CHAOS:
3808                 dam = (powerful ? (rlev * 3) : (rlev * 2));
3809                 dice_num = 10;
3810                 dice_side = 10;
3811                 break;
3812
3813                 /* RF4_BR_DISI */
3814         case MS_BR_DISI:
3815                 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
3816                 break;
3817
3818                 /* RF5_BA_ACID */
3819         case MS_BALL_ACID:
3820                 if (powerful)
3821                 {
3822                         dam = (rlev * 4) + 50;
3823                         dice_num = 10;
3824                         dice_side = 10;
3825                 }
3826                 else
3827                 {
3828                         dam = 15;
3829                         dice_num = 1;
3830                         dice_side = rlev * 3;
3831                 }
3832                 break;
3833
3834                 /* RF5_BA_ELEC */
3835         case MS_BALL_ELEC:
3836                 if (powerful)
3837                 {
3838                         dam = (rlev * 4) + 50;
3839                         dice_num = 10;
3840                         dice_side = 10;
3841                 }
3842                 else
3843                 {
3844                         dam = 8;
3845                         dice_num = 1;
3846                         dice_side = rlev * 3 / 2;
3847                 }
3848                 break;
3849
3850                 /* RF5_BA_FIRE */
3851         case MS_BALL_FIRE:
3852                 if (powerful)
3853                 {
3854                         dam = (rlev * 4) + 50;
3855                         dice_num = 10;
3856                         dice_side = 10;
3857                 }
3858                 else
3859                 {
3860                         dam = 10;
3861                         dice_num = 1;
3862                         dice_side = rlev * 7 / 2;
3863                 }
3864                 break;
3865
3866                 /* RF5_BA_COLD */
3867         case MS_BALL_COLD:
3868                 if (powerful)
3869                 {
3870                         dam = (rlev * 4) + 50;
3871                         dice_num = 10;
3872                         dice_side = 10;
3873                 }
3874                 else
3875                 {
3876                         dam = 10;
3877                         dice_num = 1;
3878                         dice_side = rlev * 3 / 2;
3879                 }
3880                 break;
3881
3882                 /* RF5_BA_POIS */
3883         case MS_BALL_POIS:
3884                 mult = powerful ? 2 : 1;
3885                 dice_num = 12;
3886                 dice_side = 2;
3887                 break;
3888
3889                 /* RF5_BA_NETH */
3890         case MS_BALL_NETHER:
3891                 dam = 50 + rlev * (powerful ? 2 : 1);
3892                 dice_num = 10;
3893                 dice_side = 10;
3894                 break;
3895
3896                 /* RF5_BA_WATE */
3897         case MS_BALL_WATER:
3898                 dam = 50;
3899                 dice_num = 1;
3900                 dice_side = powerful ? (rlev * 3) : (rlev * 2);
3901                 break;
3902
3903                 /* RF5_BA_MANA */
3904                 /* RF5_BA_DARK */
3905         case MS_BALL_MANA:
3906         case MS_BALL_DARK:
3907                 dam = (rlev * 4) + 50;
3908                 dice_num = 10;
3909                 dice_side = 10;
3910                 break;
3911
3912                 /* RF5_DRAIN_MANA */
3913         case MS_DRAIN_MANA:
3914                 dam = rlev;
3915                 div = 1;
3916                 dice_num = 1;
3917                 dice_side = rlev;
3918                 break;
3919
3920                 /* RF5_MIND_BLAST */
3921         case MS_MIND_BLAST:
3922                 dice_num = 7;
3923                 dice_side = 7;
3924                 break;
3925
3926                 /* RF5_BRAIN_SMASH */
3927         case MS_BRAIN_SMASH:
3928                 dice_num = 12;
3929                 dice_side = 12;
3930                 break;
3931
3932                 /* RF5_CAUSE_1 */
3933         case MS_CAUSE_1:
3934                 dice_num = 3;
3935                 dice_side = 8;
3936                 break;
3937
3938                 /* RF5_CAUSE_2 */
3939         case MS_CAUSE_2:
3940                 dice_num = 8;
3941                 dice_side = 8;
3942                 break;
3943
3944                 /* RF5_CAUSE_3 */
3945         case MS_CAUSE_3:
3946                 dice_num = 10;
3947                 dice_side = 15;
3948                 break;
3949
3950                 /* RF5_CAUSE_4 */
3951         case MS_CAUSE_4:
3952                 dice_num = 15;
3953                 dice_side = 15;
3954                 break;
3955
3956                 /* RF5_BO_ACID */
3957         case MS_BOLT_ACID:
3958                 mult = powerful ? 2 : 1;
3959                 dam = rlev / 3 * (mult / div);
3960                 dice_num = 7;
3961                 dice_side = 8;
3962                 break;
3963
3964                 /* RF5_BO_ELEC */
3965         case MS_BOLT_ELEC:
3966                 mult = powerful ? 2 : 1;
3967                 dam = rlev / 3 * (mult / div);
3968                 dice_num = 4;
3969                 dice_side = 8;
3970                 break;
3971
3972                 /* RF5_BO_FIRE */
3973         case MS_BOLT_FIRE:
3974                 mult = powerful ? 2 : 1;
3975                 dam = rlev / 3 * (mult / div);
3976                 dice_num = 9;
3977                 dice_side = 8;
3978                 break;
3979
3980                 /* RF5_BO_COLD */
3981         case MS_BOLT_COLD:
3982                 mult = powerful ? 2 : 1;
3983                 dam = rlev / 3 * (mult / div);
3984                 dice_num = 6;
3985                 dice_side = 8;
3986                 break;
3987
3988                 /* RF5_BA_LITE */
3989         case MS_STARBURST:
3990                 dam = (rlev * 4) + 50;
3991                 dice_num = 10;
3992                 dice_side = 10;
3993                 break;
3994
3995                 /* RF5_BO_NETH */
3996         case MS_BOLT_NETHER:
3997                 dam = 30 + (rlev * 4) / (powerful ? 2 : 3);
3998                 dice_num = 5;
3999                 dice_side = 5;
4000                 break;
4001
4002                 /* RF5_BO_WATE */
4003         case MS_BOLT_WATER:
4004                 dam = (rlev * 3 / (powerful ? 2 : 3));
4005                 dice_num = 10;
4006                 dice_side = 10;
4007                 break;
4008
4009                 /* RF5_BO_MANA */
4010         case MS_BOLT_MANA:
4011                 dam = 50;
4012                 dice_num = 1;
4013                 dice_side = rlev * 7 / 2;
4014                 break;
4015
4016                 /* RF5_BO_PLAS */
4017         case MS_BOLT_PLASMA:
4018                 dam = 10 + (rlev * 3 / (powerful ? 2 : 3));
4019                 dice_num = 8;
4020                 dice_side = 7;
4021                 break;
4022
4023                 /* RF5_BO_ICEE */
4024         case MS_BOLT_ICE:
4025                 dam = (rlev * 3 / (powerful ? 2 : 3));
4026                 dice_num = 6;
4027                 dice_side = 6;
4028                 break;
4029
4030                 /* RF5_MISSILE */
4031         case MS_MAGIC_MISSILE:
4032                 dam = (rlev / 3);
4033                 dice_num = 2;
4034                 dice_side = 6;
4035                 break;
4036
4037         case MS_SCARE: return -1;   /* RF5_SCARE */
4038         case MS_BLIND: return -1;   /* RF5_BLIND */
4039         case MS_CONF: return -1;   /* RF5_CONF */
4040         case MS_SLOW: return -1;   /* RF5_SLOW */
4041         case MS_SLEEP: return -1;   /* RF5_HOLD */
4042         case MS_SPEED:  return -1;   /* RF6_HASTE */
4043
4044                 /* RF6_HAND_DOOM */
4045         case MS_HAND_DOOM:
4046                 mult = p_ptr->chp;
4047                 div = 100;
4048                 dam = 40 * (mult / div);
4049                 dice_num = 1;
4050                 dice_side = 20;
4051                 break;
4052
4053         case MS_HEAL:  return -1;   /* RF6_HEAL */
4054         case MS_INVULNER:  return -1;   /* RF6_INVULNER */
4055         case MS_BLINK:  return -1;   /* RF6_BLINK */
4056         case MS_TELEPORT:  return -1;   /* RF6_TPORT */
4057         case MS_WORLD:  return -1;   /* RF6_WORLD */
4058         case MS_SPECIAL:  return -1;   /* RF6_SPECIAL */
4059         case MS_TELE_TO:  return -1;   /* RF6_TELE_TO */
4060         case MS_TELE_AWAY:  return -1;   /* RF6_TELE_AWAY */
4061         case MS_TELE_LEVEL: return -1;   /* RF6_TELE_LEVEL */
4062
4063                 /* RF6_PSY_SPEAR */
4064         case MS_PSY_SPEAR:
4065                 dam = powerful ? 150 : 100;
4066                 dice_num = 1;
4067                 dice_side = powerful ? (rlev * 2) : (rlev * 3 / 2);
4068                 break;
4069
4070         case MS_DARKNESS: return -1;   /* RF6_DARKNESS */
4071         case MS_MAKE_TRAP: return -1;   /* RF6_TRAPS */
4072         case MS_FORGET: return -1;   /* RF6_FORGET */
4073         case MS_RAISE_DEAD: return -1;   /* RF6_RAISE_DEAD */
4074         case MS_S_KIN: return -1;   /* RF6_S_KIN */
4075         case MS_S_CYBER: return -1;   /* RF6_S_CYBER */
4076         case MS_S_MONSTER: return -1;   /* RF6_S_MONSTER */
4077         case MS_S_MONSTERS: return -1;   /* RF6_S_MONSTER */
4078         case MS_S_ANT: return -1;   /* RF6_S_ANT */
4079         case MS_S_SPIDER: return -1;   /* RF6_S_SPIDER */
4080         case MS_S_HOUND: return -1;   /* RF6_S_HOUND */
4081         case MS_S_HYDRA: return -1;   /* RF6_S_HYDRA */
4082         case MS_S_ANGEL: return -1;   /* RF6_S_ANGEL */
4083         case MS_S_DEMON: return -1;   /* RF6_S_DEMON */
4084         case MS_S_UNDEAD: return -1;   /* RF6_S_UNDEAD */
4085         case MS_S_DRAGON: return -1;   /* RF6_S_DRAGON */
4086         case MS_S_HI_UNDEAD: return -1;   /* RF6_S_HI_UNDEAD */
4087         case MS_S_HI_DRAGON: return -1;   /* RF6_S_HI_DRAGON */
4088         case MS_S_AMBERITE: return -1;   /* RF6_S_AMBERITES */
4089         case MS_S_UNIQUE: return -1;   /* RF6_S_UNIQUE */
4090         }
4091
4092         return monspell_damage_roll(dam, dice_num, dice_side, mult, div, TYPE);
4093 }
4094
4095
4096 /*!
4097 * @brief モンスターの使う呪文の威力を返す /
4098 * @param SPELL_NUM 呪文番号
4099 * @param m_idx 呪文を唱えるモンスターID
4100 * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
4101 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
4102 */
4103 HIT_POINT monspell_damage(int SPELL_NUM, MONSTER_IDX m_idx, int TYPE)
4104 {
4105         monster_type    *m_ptr = &m_list[m_idx];
4106         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
4107         int hp;
4108         int rlev = monster_level_idx(m_idx);
4109         int shoot_dd = r_ptr->blow[0].d_dice;
4110         int shoot_ds = r_ptr->blow[0].d_side;
4111
4112         if (TYPE == DAM_ROLL)
4113         {
4114                 hp = m_ptr->hp;
4115         }
4116         else
4117         {
4118                 hp = m_ptr->max_maxhp;
4119         } 
4120         return monspell_damage_base(SPELL_NUM, hp, rlev, monster_is_powerful(m_idx), shoot_dd, shoot_ds, 0, TYPE);
4121 }
4122
4123 /*!
4124 * @brief モンスターの使う呪文の威力を返す /
4125 * @param SPELL_NUM 呪文番号
4126 * @param r_idx 呪文を唱えるモンスターの種族ID
4127 * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
4128 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
4129 */
4130 HIT_POINT monspell_race_damage(int SPELL_NUM, MONRACE_IDX r_idx, int TYPE)
4131 {
4132         monster_race    *r_ptr = &r_info[r_idx];
4133         int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4134         bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
4135         u32b hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
4136         int shoot_dd = r_ptr->blow[0].d_dice;
4137         int shoot_ds = r_ptr->blow[0].d_side;
4138
4139         return monspell_damage_base(SPELL_NUM, MIN(30000, hp), rlev, powerful, shoot_dd, shoot_ds, 0, TYPE);
4140 }
4141
4142 /*!
4143 * @brief 青魔導師の使う呪文の威力を返す /
4144 * @param SPELL_NUM 呪文番号
4145 * @param plev 使用するレベル。2倍して扱う。
4146 * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
4147 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
4148 */
4149 HIT_POINT monspell_bluemage_damage(int SPELL_NUM, PLAYER_LEVEL plev, int TYPE)
4150 {
4151         int hp = p_ptr->chp;
4152         int shoot_dd = 1, shoot_ds = 1, shoot_base = 0;
4153         object_type *o_ptr = NULL;
4154
4155         if (buki_motteruka(INVEN_RARM)) o_ptr = &inventory[INVEN_RARM];
4156         else if (buki_motteruka(INVEN_LARM)) o_ptr = &inventory[INVEN_LARM];
4157
4158         if (o_ptr)
4159         {
4160                 shoot_dd = o_ptr->dd;
4161                 shoot_ds = o_ptr->ds;
4162                 shoot_base = o_ptr->to_d;
4163         }
4164         return monspell_damage_base(SPELL_NUM, hp, plev * 2, FALSE, shoot_dd, shoot_ds, shoot_base, TYPE);
4165 }